From 2448362b46c44fc43a406487c75a879ad2636c5e Mon Sep 17 00:00:00 2001 From: red Date: Wed, 27 Sep 2023 19:54:09 +0100 Subject: [PATCH] greetings all --- .gitignore | 5 + annotations/annotations.w3c.json | 72 + annotations/initial.w3c.json | 18 + favicon/android-chrome-192x192.png | Bin 0 -> 22829 bytes favicon/android-chrome-512x512.png | Bin 0 -> 47045 bytes favicon/apple-touch-icon.png | Bin 0 -> 20596 bytes favicon/favicon-16x16.png | Bin 0 -> 803 bytes favicon/favicon-32x32.png | Bin 0 -> 2078 bytes favicon/favicon.ico | Bin 0 -> 15406 bytes favicon/site.webmanifest | 1 + image/banner.png | Bin 0 -> 589016 bytes image/magick-slicer.sh | 958 + image/run_batch.py | 67 + image/su.png | Bin 0 -> 15304 bytes index.html | 109 + script/annotations.js | 28 + script/caman/caman.full.min.js | 206 + script/image_load.js | 110 + script/live.js | 11 + script/modal.js | 31 + script/openseadragon/LICENSE.txt | 28 + .../annotorious-openseadragon.umd.js.map | 1 + script/openseadragon/annotorious.min.css | 1 + script/openseadragon/changelog.txt | 656 + .../images/button_grouphover.png | Bin 0 -> 1506 bytes script/openseadragon/images/button_hover.png | Bin 0 -> 1827 bytes .../openseadragon/images/button_pressed.png | Bin 0 -> 1895 bytes script/openseadragon/images/button_rest.png | Bin 0 -> 1066 bytes .../openseadragon/images/flip_grouphover.png | Bin 0 -> 4920 bytes script/openseadragon/images/flip_hover.png | Bin 0 -> 4920 bytes script/openseadragon/images/flip_pressed.png | Bin 0 -> 4920 bytes script/openseadragon/images/flip_rest.png | Bin 0 -> 4920 bytes .../images/fullpage_grouphover.png | Bin 0 -> 1085 bytes .../openseadragon/images/fullpage_hover.png | Bin 0 -> 2184 bytes .../openseadragon/images/fullpage_pressed.png | Bin 0 -> 2225 bytes script/openseadragon/images/fullpage_rest.png | Bin 0 -> 1309 bytes .../openseadragon/images/home_grouphover.png | Bin 0 -> 1062 bytes script/openseadragon/images/home_hover.png | Bin 0 -> 2091 bytes script/openseadragon/images/home_pressed.png | Bin 0 -> 2138 bytes script/openseadragon/images/home_rest.png | Bin 0 -> 1258 bytes .../openseadragon/images/next_grouphover.png | Bin 0 -> 1918 bytes script/openseadragon/images/next_hover.png | Bin 0 -> 2358 bytes script/openseadragon/images/next_pressed.png | Bin 0 -> 2411 bytes script/openseadragon/images/next_rest.png | Bin 0 -> 2027 bytes .../images/previous_grouphover.png | Bin 0 -> 1933 bytes .../openseadragon/images/previous_hover.png | Bin 0 -> 2361 bytes .../openseadragon/images/previous_pressed.png | Bin 0 -> 2413 bytes script/openseadragon/images/previous_rest.png | Bin 0 -> 2029 bytes .../images/rotateleft_grouphover.png | Bin 0 -> 1731 bytes .../openseadragon/images/rotateleft_hover.png | Bin 0 -> 2094 bytes .../images/rotateleft_pressed.png | Bin 0 -> 2036 bytes .../openseadragon/images/rotateleft_rest.png | Bin 0 -> 1779 bytes .../images/rotateright_grouphover.png | Bin 0 -> 1800 bytes .../images/rotateright_hover.png | Bin 0 -> 2158 bytes .../images/rotateright_pressed.png | Bin 0 -> 2039 bytes .../openseadragon/images/rotateright_rest.png | Bin 0 -> 1812 bytes .../images/zoomin_grouphover.png | Bin 0 -> 1060 bytes script/openseadragon/images/zoomin_hover.png | Bin 0 -> 2116 bytes .../openseadragon/images/zoomin_pressed.png | Bin 0 -> 2159 bytes script/openseadragon/images/zoomin_rest.png | Bin 0 -> 1262 bytes .../images/zoomout_grouphover.png | Bin 0 -> 977 bytes script/openseadragon/images/zoomout_hover.png | Bin 0 -> 1926 bytes .../openseadragon/images/zoomout_pressed.png | Bin 0 -> 1997 bytes script/openseadragon/images/zoomout_rest.png | Bin 0 -> 1153 bytes .../openseadragon-annotorious.min.js | 29 + .../openseadragon/openseadragon-filtering.js | 493 + .../openseadragon-smartScrollZoom.js | 147 + script/openseadragon/openseadragon.js | 24826 ++++++++++++++++ script/openseadragon/openseadragon.js.map | 1 + script/openseadragon/openseadragon.min.js | 9 + script/openseadragon/openseadragon.min.js.map | 1 + script/openseadragon/recogito-polyfills.js | 1 + script/viewer.js | 23 + style.css | 181 + websocket/requirements.txt | 1 + websocket/websocket.py | 32 + 76 files changed, 28046 insertions(+) create mode 100644 .gitignore create mode 100644 annotations/annotations.w3c.json create mode 100644 annotations/initial.w3c.json create mode 100644 favicon/android-chrome-192x192.png create mode 100644 favicon/android-chrome-512x512.png create mode 100644 favicon/apple-touch-icon.png create mode 100644 favicon/favicon-16x16.png create mode 100644 favicon/favicon-32x32.png create mode 100644 favicon/favicon.ico create mode 100644 favicon/site.webmanifest create mode 100644 image/banner.png create mode 100644 image/magick-slicer.sh create mode 100644 image/run_batch.py create mode 100644 image/su.png create mode 100644 index.html create mode 100644 script/annotations.js create mode 100644 script/caman/caman.full.min.js create mode 100644 script/image_load.js create mode 100644 script/live.js create mode 100644 script/modal.js create mode 100644 script/openseadragon/LICENSE.txt create mode 100644 script/openseadragon/annotorious-openseadragon.umd.js.map create mode 100644 script/openseadragon/annotorious.min.css create mode 100644 script/openseadragon/changelog.txt create mode 100644 script/openseadragon/images/button_grouphover.png create mode 100644 script/openseadragon/images/button_hover.png create mode 100644 script/openseadragon/images/button_pressed.png create mode 100644 script/openseadragon/images/button_rest.png create mode 100644 script/openseadragon/images/flip_grouphover.png create mode 100644 script/openseadragon/images/flip_hover.png create mode 100644 script/openseadragon/images/flip_pressed.png create mode 100644 script/openseadragon/images/flip_rest.png create mode 100644 script/openseadragon/images/fullpage_grouphover.png create mode 100644 script/openseadragon/images/fullpage_hover.png create mode 100644 script/openseadragon/images/fullpage_pressed.png create mode 100644 script/openseadragon/images/fullpage_rest.png create mode 100644 script/openseadragon/images/home_grouphover.png create mode 100644 script/openseadragon/images/home_hover.png create mode 100644 script/openseadragon/images/home_pressed.png create mode 100644 script/openseadragon/images/home_rest.png create mode 100644 script/openseadragon/images/next_grouphover.png create mode 100644 script/openseadragon/images/next_hover.png create mode 100644 script/openseadragon/images/next_pressed.png create mode 100644 script/openseadragon/images/next_rest.png create mode 100644 script/openseadragon/images/previous_grouphover.png create mode 100644 script/openseadragon/images/previous_hover.png create mode 100644 script/openseadragon/images/previous_pressed.png create mode 100644 script/openseadragon/images/previous_rest.png create mode 100644 script/openseadragon/images/rotateleft_grouphover.png create mode 100644 script/openseadragon/images/rotateleft_hover.png create mode 100644 script/openseadragon/images/rotateleft_pressed.png create mode 100644 script/openseadragon/images/rotateleft_rest.png create mode 100644 script/openseadragon/images/rotateright_grouphover.png create mode 100644 script/openseadragon/images/rotateright_hover.png create mode 100644 script/openseadragon/images/rotateright_pressed.png create mode 100644 script/openseadragon/images/rotateright_rest.png create mode 100644 script/openseadragon/images/zoomin_grouphover.png create mode 100644 script/openseadragon/images/zoomin_hover.png create mode 100644 script/openseadragon/images/zoomin_pressed.png create mode 100644 script/openseadragon/images/zoomin_rest.png create mode 100644 script/openseadragon/images/zoomout_grouphover.png create mode 100644 script/openseadragon/images/zoomout_hover.png create mode 100644 script/openseadragon/images/zoomout_pressed.png create mode 100644 script/openseadragon/images/zoomout_rest.png create mode 100644 script/openseadragon/openseadragon-annotorious.min.js create mode 100644 script/openseadragon/openseadragon-filtering.js create mode 100644 script/openseadragon/openseadragon-smartScrollZoom.js create mode 100644 script/openseadragon/openseadragon.js create mode 100644 script/openseadragon/openseadragon.js.map create mode 100644 script/openseadragon/openseadragon.min.js create mode 100644 script/openseadragon/openseadragon.min.js.map create mode 100644 script/openseadragon/recogito-polyfills.js create mode 100644 script/viewer.js create mode 100644 style.css create mode 100644 websocket/requirements.txt create mode 100644 websocket/websocket.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de3539e --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +image/dzi +image/original +image/script +image/image.txt diff --git a/annotations/annotations.w3c.json b/annotations/annotations.w3c.json new file mode 100644 index 0000000..d4e4fe9 --- /dev/null +++ b/annotations/annotations.w3c.json @@ -0,0 +1,72 @@ +[{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "#a88b22d0-6106-4872-9435-c78b5e890000", + "type": "Annotation", + "body": [{ + "type": "TextualBody", + "value": "ruler by @username", + "format" : "text/html", + "language" : "en" + }], + "target": { + "selector": { + "type": "FragmentSelector", + "conformsTo": "http://www.w3.org/TR/media-frags/", + "value": "xywh=pixel:0,0,1000,1000" + } + } +}, + { + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "#a88b22d0-6106-4872-9435-c78b5e890001", + "type": "Annotation", + "body": [{ + "type": "TextualBody", + "value": "screwdriver by @username", + "format" : "text/html", + "language" : "en" + }], + "target": { + "selector": { + "type": "FragmentSelector", + "conformsTo": "http://www.w3.org/TR/media-frags/", + "value": "xywh=pixel:0,1000,1000,1000" + } + } + }, + { + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "#a88b22d0-6106-4872-9435-c78b5e890002", + "type": "Annotation", + "body": [{ + "type": "TextualBody", + "value": "hammer by @username", + "format" : "text/html", + "language" : "en" + }], + "target": { + "selector": { + "type": "FragmentSelector", + "conformsTo": "http://www.w3.org/TR/media-frags/", + "value": "xywh=pixel:1000,0,1000,1000" + } + } + }, + { + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "#a88b22d0-6106-4872-9435-c78b5e890003", + "type": "Annotation", + "body": [{ + "type": "TextualBody", + "value": "drill by @username", + "format" : "text/html", + "language" : "en" + }], + "target": { + "selector": { + "type": "FragmentSelector", + "conformsTo": "http://www.w3.org/TR/media-frags/", + "value": "xywh=pixel:1000,1000,1000,1000" + } + } + }] diff --git a/annotations/initial.w3c.json b/annotations/initial.w3c.json new file mode 100644 index 0000000..30343c5 --- /dev/null +++ b/annotations/initial.w3c.json @@ -0,0 +1,18 @@ +[{ + "@context": "http://www.w3.org/ns/anno.jsonld", + "id": "#a88b22d0-6106-4872-9435-c78b5e890000", + "type": "Annotation", + "body": [{ + "type": "TextualBody", + "value": "Nothing here yet!", + "format" : "text/html", + "language" : "en" + }], + "target": { + "selector": { + "type": "FragmentSelector", + "conformsTo": "http://www.w3.org/TR/media-frags/", + "value": "xywh=pixel:0,0,1000,1000" + } + } +}] diff --git a/favicon/android-chrome-192x192.png b/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..13a93305fa36184bf62d1c37405c364ff2b3e6b4 GIT binary patch literal 22829 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 Q5&!@I07*qoM6N<$f_g`X(f|Me literal 0 HcmV?d00001 diff --git a/favicon/android-chrome-512x512.png b/favicon/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8a3f8ac4851ef21ac4bda98c5d227072d0bc67 GIT binary patch literal 47045 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ℜ7P;Qoowa-Od(yEWfY@%EV~C| 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
    `{Kkg zuHTrWm8yQIw^2c-#s#Jc-qGS6_#gCOQ2P-t-;)UIxXq7=fUim1sG8Y+P(hSm@rQ93Mlzh0r#|#!3n4VNYTGQW)sNUkz zqQA$a>tJRy9<=B~$JcB%nP?2ejEeXqOgt!4ht|%f%Q!B-d@dnBx+|_$c^MbfAh0(j zz5&bHNzB21jWeI*MNxss+TK7|9hHigZx!}Kj)>f_4fkJZS0|>S6&EA@x%EzMK1T8L z>$s*5DYt!h(p^JR4&gLGQXE#!Loch1rqM*1U$_bWvDXOw$~x|AN8S3+fBtQH*t5%>wN>_jL8R(fp9|w&a{t{J5M?TT<+sI@K;GeeqDy!*Rbn-{w6IlN4^31$kM~xJ0pQruCA53ya4-X*f2#@0X`( z{Tr}X8GdQ$|E%|?HSg>`uc8Fj^IXubrESQI8j4s<^fiAvQl3(s1ca>bcwrig3R3_+ zFN^4k4MTQ0IMSxC#=An13+J!G8|>rMp=BJUi8m#lh?cf%XaC<(8`34J_>=&|S)lU(FtpyqPOI-^t?;4h`sRw`MDv#Gv zW3VEE+|ni@S1G#BW?i7i*RVaw*BJMZ{uJ@)e2OCZY`}Ll!<0DoM0|$f8G}6HZ8CW~ z-+aNY!>FeAUMbpM<$V8aRUaL+WhRAK6l91vU$Z`>f6;!P%nnNG^kD)A6--=gNr!~) z<>7`>Z9T9XWr^kDC(9zCjX`l{5u?eYu{jNz_Oq zwg7{X6&le3VOXOEH?R|ywN7WA_vOAwVtHsiCkIh<@h@Y#Ob5J*Ws$2 zzEFv-$@m}LFuGbB$VQ=vE$tZ3DaOAO>?rEb9S_rm+>^>{0W4!jU_v6SG27TH@r5C^ pv`4D

    g9M-!XE7BEu0+D0?@=Y@1gn}~pg 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 TqKpyU00000NkvXXu0mjfR$~FY literal 0 HcmV?d00001 diff --git a/favicon/favicon-16x16.png b/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..f222963544eae2ada3f305cab868543ceef27ac5 GIT binary patch literal 803 zcmV+;1Kj+HP)LDw&gPOiGnS6HpqVWoQK^~v5G4u;Y55{nDsASd8PuD$JoHde zQGtR)4<&*TMMEJJ=u6OI*`_7q&XBV>cW&p7G$9hy2j}VgpWpfZ|MQWq?8b9V`IQGn z)a_MW9UjDg7O6=p%c*dDb8X)-tsyBsm*nuZsO+8>|H>h%1w8g>@?dp`DVF5_EKQ zAb&$XrbYlUY8rRCZ{ftT<6-kNBX}MG?9V@Q@ko`kQD;-ZS|mZKBnSioU|ALtweYqt z2yGk_&VjZd(Fw)}F&Y7srq`W4U3;lrznXj>uy8< zutV)k>;7C^SZY?VBJ_rsWjhcIi12!Xh>BGsxai09Cpo+fAd89|HAkz9nmf~TZK~P1S%_kA zX%ea=bTJrFfPxLVw@hBJkdCvV6#!YAYAVR6+}zM)x2@e4ql-xt1a6TRxDPzfJrm5z hyD5cah{^)8_80DC<8D(17={1<002ovPDHLkV1fb0b%Fo@ literal 0 HcmV?d00001 diff --git a/favicon/favicon-32x32.png b/favicon/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b451faf796f8c37654edf5fa24979020ac1cf4 GIT binary patch literal 2078 zcmV+(2;ujMP)kQ#ts4PlZo zoRyn#kuwMba`ijj34hBod8d2-pFpMo(4hs*>-nyqKE*>w6mVIl$HxjACS(eX2GVfB z^B{UA){Jo;%`ZHUl>Yutl|R{$V@}V3Uu2-GU}42}%fD9dC`0?e8(^bW)EpdxV<3n{ z{0Iyh0dAWWnhYJ3IvE)KQKa-fw=p@O(xR8+vE5n5{_xe6v-Ucc882nF{ViMY6rgVZ z7_z(*$X0nUV$eaHXMxGC1e1Mr+udLgBT9&BJ)Tcn&03>D%m&Y?U&wyr~NBWp>$Hqnx!;(wU)4I?k;JE>e-K6g(w74qR z&!<+$W3Q;RsJY{btVXQRx^dA!lsomXxK!ai3O!(33~0%DwE0GX8=nDzanb-SO}~$v zX%Lkn5#C{j{tgH-9#!e9Sh&H(P2ci_Z+Guo{cOgqWG6y43v79OSXgRu>MS8TXNU-6 zm`cDTIqx|F7_tcD{P?<<923!Zid{|9A)hT}fmr~m%q6eBQv75+?0M{(&4q+C74%68 za5{==H8G%!j%voq6o|p|)XmL+$u_qz$NH#zyRp@|lD#<#K((c$e_!#=q{|t_kXcPg zDNsWuXGmTFm{X$Tjqe~ZL3;22#$>?j_2S^cgV^@U2Cs; zZ^!2Mi_CU464I5BlaO2$6nzx+ot>R%XlOuFQxn#&UmtV$U^kGM2^{|DF!sE-2eq}e zsIRY&DOt~T66P1ki>raPc|YiRYU69^7MBtlGY3sN<$ehXCcHXAc4K2B+S}VvRaJ$y zwzg>iB0c`{1g$5=4juXnYS-7IWmgMYTc@gz7KjYvR5inw&=3!R=D}sn<3FlyAt9;2 zDP_=Q1C9j}fSG#Vy?Zxy?b?L{2M=If&AMp-k`TMwNrXkDgESEzeDEPEDk`AUk%*#9 zD$9``yb}*V`ePMsJsZon!M=#{PfbUYMgR&){jq6;+wF$cnix||H%HlF>Gi>=vaH>eyW@XrK!ix(wWM`$#u(XpE7P;fS@Mk3P^b5+H%va^H0~%n2r#ovOWY0puhuJ-TRrIen&X2;LO8{=)nhGu5 z5n~apiX?!496yEfbxQ?>2F|&TOWRo3)cxa{XXME_Dx5uc7WoA^;I(&A;cXP7173&% zqjnrwFR>uf_$1Nab>;#bP8%F~ruOu5RyAiliQ3fPz5MX;haD~(66Y!L>Bs-X@>NT~ zQ9HZ`63}yI7|sF{O-7N`N~)ypu3mUDeODtUP>4n{4ht`5$I?LJiu(WV0+WLj~R>$N7I>#<*u3IR*1zG?5bTFqB<8GX!%oPpP0?i z3ic^}@x`S+sq_w2JgKjaX8oQ3+}>a>OuhfPn!+uQl;&3} zOeuUgB}!gK6VmKsL@6}_{0c4mv#9p&$*I(QN$1d17;FCxfT^9f+@xh2R%UIgOigxu z%g86BoApUbrAiS}@tj+!QeEbt=;Q>|G2f)=NbQS^#*?}2KS#?|WDZ_9q5uE@07*qo IM6N<$f~Z&V&;S4c literal 0 HcmV?d00001 diff --git a/favicon/favicon.ico b/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f5a1e4b2cc5c8ff75f32ec7c4df3493c15c425bc GIT binary patch literal 15406 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

    @ zf)z>%ujrrF>(nNLs_>)I4?8OG+*Ff>RK@N?`IGk-4R%ko8jO`I?0$kb?-cQ ztjCNM;ZXtzisOy;UW%*N>&PRXmKEXuoWxASzz{*d^l#Q3Zc>6vSFo<`{;l1mkBBKb zif*4)6jP9zEu{(?zn*0PYZm?xJ7Bweu1ct^XKHYJs=kP>cO^IV@L&$|Q#rjDkNupO zL`(fjvG#;)YKmeH4oUm17sm1W|a?m_%IWH5AuO#EZ!7o8VLrfjFhX3N!z@a9OUxWi9;l*_{ zlh2t;vy7?uzs@AJh1l+=X0S3mk~~f?$fge*2?oC9zb`zL%!&SIkbQW@0-jP?<4)Vf zkY-RNld~kv8wYCUKzC;juJqum%~LWZJ2}ydjbEsl*(3_^oZ|Y4q@iYjO~5U>mEi-c zy)TsNJsfQ{><~LAZ#}W)MgrD2G3k}{aym&ednAiVW3SsFQx2>i%J-!FHMEQeXU;w2 zomeg&@Vob?i#vt(U_Nj2H%Lvf91$~Fv|CU$|Z0Lr=Anj&+H2^-6_7CVY1h*sq(A)G>M5E(_tFB_-Yq73bLTrXg$KJ93-CcBg$4=~7H9#2JXDxV~v z4l#F)Hj5ko8spUN9-ps1squdfU;UvU@QVmmW3_BSZQA;0p1(d0G|qK*>qmE;JH_E? zX06{Qjz+&HUdX-qk;7gnfH!~ByD7nBIalFer>Spwm;)Z0R6DIB{svs?xx9~aqDA#tL3@pey4W0@RaXU|6lGJ4745@$e?H4eYVRoqM7hzu#gCDwF zkfr)>gv5rd;m3t*Ht2|#4KWS;W#@DqRJjV@hg&rD>x@ilXv{sR(H!|p@y|(0@I})# zjnjtd?4oh0XA4V=Sim{yMF*|T60B&=Dzj})GDW9V?}d?VQL5NOMbnsA$ zuGisY)6B~@&&SNTxEfZlRJL@!z?xbm%$ktmb1eYvM7m0m3Q0zHw5E4!0{~Hr;Kz4J?seW6<#*-@XHGBi3 z;9zZ`vMp-ggR!XffV_m?lSkLAaX0aaI1#I2_p08c`t=CBa;Qr|*B-0pTpqUo2TbD4 zH`(@m`>&r!DVeITTWU7{@w&A;1p;$SZUKeWq`?s)aK1)X*&8&g^kRuLFQwvyakvi}UZj2|k5loqJWAnp+1Lb>8cZUJq-CaWY`(3=8MG{zw90|P&A=LE& z?z)$9QGyV3q(Fpf`h4Wa5f(9LxW-(}^h$uvPrInqdg@o)$H_TTN&%Q9KEJ%ml>>%8 zjyi6SA6VX)19;Qi(f5aa#^5C%mFHm(;@z@IvGE*-Ck=FLzc9|VUy6WIE^ zJo9L2AHLB1rZ2dj#*!UU{l!YS=bBAtruu{yLF6D!@6AHn-3~_i4#U%=JLch6E|}9s z44Z_ih-*tiGc2Z1{H+AyHMch=Ll_mYloeavjf0>BkH){ zgJMS?cp*{yj&Y@<)74V|0gkT8I@_)`%NVwe!qv1&th1k~1=~#tGB&4KlPyeG6|L-0IDv0i^7~)6#*Xe&KmOO$!kci2+0R+O508 z?Q%M?AuOUxmS@A`a+C)P&4vxieO$1op;ivE0y|P$UPnZzF_SkP1u1VememNhE(^rr z4hC>j{9PIF_ceO52K)P-{QEHb+wK*aGLzS!H5F8$)drNV6Q=ElZwR+f-(X`oHzRi) zZ8jD zT>0mD%HswWXp@tHG326E&cL$KKw2}o@7Sd7ouY4RN@-RUc}-9=Tnh77ADjV21x>91 zQAvY~wqN;A2qC(RH7LQ8F5n_qpVr7&{~ypfuaPWH;#R1|;Io6D>)|ugNGGaoGnb-S zH*7S9q#*U&t24Y&qxF)eE?5`5TU9S3M-NM@%O8~6cG}JndgH!`WdKcR6dZsp(AkH4 zU@e_?A5Q(Qx6AUn?1(|Z#CeAF4IsR1!SSwp)uk-P4^QKkpSCo2<~A7K`^x~5O$GEtSFm^(O-~8K*K<≷qs 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

    4&!=96G<-jFY+MFKxw}-+KeXkudh| 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 z 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

    ?yA=DYy`kHMmT?kcIEU*h>B1rI`efu~$dc)#oo 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 z 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%0Ajeu$XO^Dq71MGLGeWx z><}}b5)#6iICEq9UAxfNokL?~8Vwcc;|I2TbK;J!PIM1uFy+iqnEU>*C=6O!Ad`d& zx_X%>)bN3KDg_qgtbs6e7XfM#e*r^Kl-z+kMWa zrwxjteE?Ntj7T;J)ycR-1URUsxG^ok16TK#u7Y^zVhLt?q?s5g%c2j#`L^C*AMna^ zu-FGD%{>`aRn^Y#HgDd9?xP(r$4v&AeyUSMnqqir?RwBXF#3kvU&B{J4O`tHK)20u8ON6o=q3K6(D}pn-r8A0O6{mAw#E00vDet!{DNd!f z9~20>x(0OTZo&^9rMU5evcybzD{tlP9k(UfYm|`yvSUrhH!-A%-({k6hI*X6M$rL` z#DF6a!vXdH@=6|yV?m8~ZvTx@hTyev>m_BzLC@r1wdAxyk4vKTVc*7vrxcYUx zuzVx-?>gju-aF{1DR69!1Ls^-I-WH6x?Erv8e_iOMD{n%e!GZ&7>k=+*#b2qs?avM z1x=&sQP)s~*{4o%SnHKlac~ZYqhD_a&}}X|)O8X^!+z3q){FbIc;dG&@Z&9E?f5;` zrsY}T%>&#;sFsqz8MZv4nga+BAsv@cx2P&9lG!LJdbgC60J=-D&5dDz^6GDfl7<;> zfmC2P>8)V{pN4#JYFn9PU8`-xmN;Ohmj_NfS%rZ4#z6@WXraZHHzxK~jXJOK$mU-f zm9_N1p(FD$+3f8+JQW)?31&@$Gs;|QixGCfl%jfa!wW#H0GNyWNm95@s4Q@jX~>VI zo@Gu00FqLTMmL0-Rm7JF;O{t#yeCWW%a;pyY;yta-33%vCb9Ir=Q&#Kmm;eHXra*L}EmRRX89S!k-ZokAQmBy<2DSaLtH1+dLyheH&g5W9&e z1xicEju6NsC|f9f5t*6g*(6W?Vp!yFoO35dmgL z)8k6lOP0$o>WXZto`0DAN+pe_2ss-ONMe5m`Yl)%MVgJ9bXDbBvVc_A)#A1%L6 zemkCg=t1n-_8PK-gV?ikCl2l3kNSp2j2<@@qua*e9XC$yc7{fL4@kR4s?%7 zh>|tN!w@Y(0>xnnUc_`fdSX$MiUvTT1DGZW);-jYSD!k9R6K^M4Gj*6N{?HiR0I3_ zda%Ez7gaS$obmC=NTg#ZWNo206NxIRA0M_7fC#JQhl^*bnOJfzku3t~#HDSJq6D-c z9pl%RAT*c@s4Q`%3((0xy%uPhQ3y&~|cShV9H=#l-XtsjBOlczXNSU#7*tFLZwQO;A(2d%7i zJzj|^uDj!56n<4}iVp+04+WbAnS8a8e9#?`gzZBrb8?+k=R0OkweIP(mQERIepRSC zrYoc%s|itUL#Q2wN?iq-+VWJ0auWZTY5~@we!H$VuWZN#6Pg{8v7wS7rUT|}gbTaM z_d)zPJ|#NiPY8@a(eanev;d3`8kKkedhszARlsb4tK-Ij-I4}|H=S8-QNbTPN=X@X zFK^|oyuHIV4$Y*EY6FGw2C|%V$0oLd2eOaAAjVNwf4u=2N9R255l@Ts)BHP#y*}KH z%fKa>t$E`o`?2}e81pU3`OLNWOZL^b-j3JnvE4sR2)RFzjDKPO?!&Xb`!Dz5f-6qP z1y`Q#fYT>htDW04oCvdT$05A*?8a?dU)kAu=s;(h+jtx_hnHf;-#Zx)1u={Y&#kJ=t-0WAp0sbjBB6xe)aiDfY zRncc0<6*#s^0e?K0q#Y{7$HT$KijuuJrIrrtTKmF>6?8X+qw9?&I>m*pAE%2KUT1Q zsAK3pAF2X{PWEyr)e36RLN1rAS;X3;p1GwtHoEdwK3iGnIl_E?3zYYGwnwaXB#f#$ z354Kav=vV+h*j18Y=8Tac|HC8pJV$}#p;`p7˻@pDOCJA4*=p6ar0a3i55G+Il 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 EL_5bf;zn6FLtdmQSN(#=Hq4Xhmwd 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

    cjc9v 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 X*d#Rlyf{)4?dhniXen1HT1WgJLWjdp literal 0 HcmV?d00001 diff --git a/image/magick-slicer.sh b/image/magick-slicer.sh new file mode 100644 index 0000000..d1dd794 --- /dev/null +++ b/image/magick-slicer.sh @@ -0,0 +1,958 @@ +#!/bin/bash +version="0.004" +date="05/08/2015" + +# ####### Options ####### # +# resultExt='png' +resultExt='' +resizeFilter='' # http://www.imagemagick.org/Usage/filter/ +# resultDir='./sliceResult' +resultDir='' + +# Selector fo slicer: A or B +scaleFromImage=true # Type of scaling: if true - scale calculates from image size to down (slicer A), if false - image scale starts from tile size and grow up (slicer B) +gravity='NorthWest' # Image positioning (from this option depends, which tiles sides can be cropped, if it not full size). Choices include: 'NorthWest', 'North', 'NorthEast', 'West', 'Center', 'East', 'SouthWest', 'South', 'SouthEast'. Use -list gravity to get a complete list of -gravity settings available in your ImageMagick installation. +extent=false # Extent option (false - tiles be cropped, true - will be added transparent color to get all tiles of full size) +scale64=false +zoomReverse=false # false: maxZoom=100%; true: minZoom=100% + +# Options only for slicerB +scaleover=true # Maximum zoom: bigger or less then image. False - will not create upscaled image for maximum zoom; true - last zoom be equal or grater, then image. +horizontal=true # Type of positioning of image: horizontal or vertical. + +# ####### Options end ####### # + +# ——————————————————————————————————————————————————————————————————————————————————— +# ####### Variables ####### # +imageSource='' +tileW=256 +tileH=256 +step=200 +imageW='' +imageH='' +imOptions='' +dziFormat=true +verboseLevel=0 +overlap=0 # TODO: Overlap handling. +# ——————————————————————————————————————————————————————————————————————————————————— +# ####### Verbose functions ####### # +# (0=none, 1=warnings, 2=warnings+info, 3=warning+info+debug) + +warnMsg(){ + if [ $verboseLevel -ge 1 ] + then + echo $1 + fi +} + +infoMsg(){ + if [ $verboseLevel -ge 2 ] + then + echo $1 + fi +} + +debugMsg(){ + if [ $verboseLevel -ge 3 ] + then + echo $1 + fi +} + +# ——————————————————————————————————————————————————————————————————————————————————— +# ####### CLI ####### # + +qHelp(){ + echo " -?, --help [option]" + if [ "$1" = true ] + then + echo " Show basic help or show help for selected option." + echo + echo " Type: str" + echo + fi +} + +mHelp(){ + echo " -m, --man" + if [ "$1" = true ] + then + echo " Show full help for all options." + echo + echo " Type: str" + echo + fi +} + +iHelp(){ + echo " [ -i, --in ]" + if [ "$1" = true ] + then + echo " Input file to slice." + echo + echo " Type: str" + echo + fi +} + +oHelp(){ + echo " [ -o, --out ]" + if [ "$1" = true ] + then + echo " Output directory for result." + echo + echo " Default: same as source" + echo " Type: str" + echo + fi +# sliceResult///" +} + +eHelp(){ + echo " [ -e, --extension ]" + if [ "$1" = true ] + then + echo " Set result files extension." + echo + echo " Default: same as source" + echo " Type: str" + echo + fi +} + +wHelp(){ + echo " [ -w, --width ]" + if [ "$1" = true ] + then + echo " Set tile width." + echo + echo " Default: 256 pixels or same as height, if height is present." + echo " Type: int" + echo + fi +} + +hHelp(){ + echo " [ -h, --height ]" + if [ "$1" = true ] + then + echo " Set tile height" + echo + echo " Default: 256 pixels or same as width, if width is present." + echo " Type: int" + echo + fi +} + +sHelp(){ + echo " [ -s, --step ]" + if [ "$1" = true ] + then + echo " Zoom step value. Formula:" + echo " (1) image_size[i+1] = image_size[i] * 100 / step" + echo " 200 -> 200% or 2x -> 100% * 100 / 200 = 50%" + echo " 175 -> 175% or 1.75x -> 100% * 100 / 175 = 57.(142857)%" + echo " 120 -> 120% or 1.2x -> 100% * 100 / 120 = 83.(3)%" + echo " 300 -> 300% or 3x -> 100% * 100 / 300 = 33.(3)%" + echo " 100 -> 100% or 1x (no resize) -> infinity loop. Don't use it." + echo + echo " Default: 200" + echo " Type: int" + echo + fi +} + +pHelp(){ + echo " [ -p, --options 'imagemagick options string']" + if [ "$1" = true ] + then + echo " Specifies additional imagemagick options for 'convert'." + echo + echo " Type: str" + echo + fi +} + +gHelp(){ + echo " [ -g, --gravity ]" + if [ "$1" = true ] + then + echo " Types: NorthWest North NorthEast West Center East SouthWest South SouthEast" + echo " The direction you choose specifies where to position of cuts start on image. Use -list gravity to get a complete list of -gravity settings available in your ImageMagick installation." + echo " http://www.imagemagick.org/script/command-line-options.php#gravity" + echo + echo " Default: NorthWest" + echo " Type: str" + echo + fi +} + +xHelp(){ + echo " [ -x, --extent ]" + if [ "$1" = true ] + then + echo " Specifies the edge tiles size: cropped or extent them to full size and fill transparent color." + echo + echo " Default: false" + echo " Type: logic switch" + echo + fi +} + +dHelp(){ + echo " [ -d, --dzi ]" + if [ "$1" = true ] + then + echo " Specifies output format." + echo + echo " Default: true" + echo " Type: logic switch" + echo + fi +} + +aHelp(){ + echo " [ -a, --slicea ]" + if [ "$1" = true ] + then + echo " Type of slicing - slice A. Image scale starts from image size to down. Inverts option '--sliceb'." + echo + echo " Default: true" + echo " Type: logic switch" + echo + fi +} + +bHelp(){ + echo " [ -b, --sliceb ]" + if [ "$1" = true ] + then + echo " Type of slicing - slice B. Image scale starts from tile size and grow up. Inverts option '--slicea'." + echo + echo " Default: false" + echo " Type: logic switch" + echo + fi +} + +cHelp(){ + echo " [ -c, --scaleover ] " + if [ "$1" = true ] + then + echo " Create upscaled image for maximum zoom (last zoom be equal or grater, then image). zoom[i-1]_size < source_image_size < zoom[i]_size" + echo " Work only in slice B mode. In other cases ignored." + echo + echo " Default: false" + echo " Type: logic switch" + echo + fi +} + +rHelp(){ + echo " [ -r, --horizontal ] " + if [ "$1" = true ] + then + echo " Tiles divide image on horizontal side without remains. On this side tiles will not be croped." + echo " Work only in slice B mode. In other cases ignored." + echo + echo " ___ ___ ___ _ _" + echo " | | | | ^" + echo " |___|___|___| Image" + echo " |___|___|___| _v_ <- Not full tiles." + echo " |_._|_._|_._| <-- Transparent color (extent=true) or cropped (extent=false)" + echo + echo " Default: true" + echo " Type: logic switch" + echo + fi +} + +tHelp(){ + echo " [ -t, --vertical ] " + if [ "$1" = true ] + then + echo " Tiles divide image on vertical side without remains. On this side tiles will not be croped." + echo " Work only in slice B mode. In other cases ignored." + echo + echo " |<-image->|" + echo " ___ ___ _ _ _ _" + echo " | | | |.| ^" + echo " |___|___|_|_| _v_Tile" + echo " | | | |.|" + echo " |___|___|_|_|" + echo " ^-- Transparent color (extent=true) or cropped (extent=false)" + echo " ^--- Not full tiles" + echo + echo " Default: false" + echo " Type: logic switch" + echo + fi +} + +vHelp(){ + echo " [ -v, --verbose ]" + if [ "$1" = true ] + then + echo " User-selected verbosity levels:" + echo " - 0 = none" + echo " - 1 = warnings" + echo " - 2 = warnings + info" + echo " - 3 = warnings + info + debug" + echo + fi + echo " [ -v0, -v1, -v2, -v3 ]" + if [ "$1" = true ] + then + echo " Short commands for each verbosity level." + echo + echo " Default: 0" + echo " Type: logic switch" + echo + fi +} + +lHelp(){ + echo " [ -l, --overlap ] " + if [ "$1" = true ] + then + echo " Tiles overlap in pixels." + echo + echo " Default: 1" + echo " Type: int" + echo + fi +} + +uHelp(){ + echo " Usage:" + echo " magick-slicer.sh -u|--usage" + echo " magick-slicer.sh -?|--help|-m|--man [option_name]" + echo " magick-slicer.sh [options] [-i] /source/image [[-o] result/dir]" + echo " magick-slicer.sh /source/image [options] [result/dir]" + echo " magick-slicer.sh /source/image [result/dir] [options]" + echo + echo " Use quotes for path or options with spaces. First unknown string interpreting as source image, if it not defined. Second unknown string is interpreting as result path, if it not defined. Also, for source and result you can use options '-i' and '-o'." + echo +} + +cliHelp(){ + echo " Map tiles generator. License: MIT." + echo " Version: $version" + echo " Date: $date" + echo + + case $1 in + + -i|--in) iHelp true ;; + -o|--out) oHelp true ;; + -e|--extension) eHelp true ;; + -w|--width) wHelp true ;; + -h|--height) hHelp true ;; + -s|--step) sHelp true ;; + # -l|--overlap) lHelp true ;; + -p|--options) pHelp true ;; + -g|--gravity) gHelp true ;; + -x|--extent) xHelp true ;; + -d|--dzi) dHelp true ;; + -a|--slicea) aHelp true ;; + -b|--sliceb) bHelp true ;; + -c|--scaleover) cHelp true ;; + -r|--horizontal) rHelp true ;; + -t|--vertical) tHelp true ;; + -v|--verbose) vHelp true ;; + -u|--usage) uHelp true ;; + -\?|--help) qHelp true ;; + -m|--man) mHelp true ;; + + "") + uHelp $2 + echo " Options list: " + qHelp $2 + mHelp $2 + vHelp $2 + iHelp $2 + oHelp $2 + eHelp $2 + wHelp $2 + hHelp $2 + sHelp $2 + # lHelp $2 + pHelp $2 + gHelp $2 + xHelp $2 + dHelp $2 + aHelp $2 + bHelp $2 + cHelp $2 + rHelp $2 + tHelp $2 + ;; + + *) + echo " Unknown option: $1" + echo + ;; + esac + + echo + exit 0 +} + +# ### CLI parsing ### +debugMsg "CLI parsing" + +# Test number of arguments +if [ $# -eq 0 ] +then + cliHelp +fi + +# Temp variables for parser +WnotDefined=true +HnotDefined=true +SourceNotDefined=true +ResDirNotDefined=true +ExtNotDefined=true + +# Arguments parsing +while [[ $# > 0 ]] # cmd tools +do + debugMsg "Parsing key: $1" + key="$1" # Get current key + case $key in # Do key work + + -i|--in) + imageSource="$2" + SourceNotDefined=false + shift # past argument + ;; + + -o|--out) + resultDir="$2" + ResDirNotDefined=false + shift # past argument + ;; + + -e|--extension) + resultExt="$2" + ExtNotDefined=false + shift # past argument + ;; + + -w|--width) + tileW="$2" + if $HnotDefined + then + tileH="$2" # Set h=w by default, if it not defined yet + fi + WnotDefined=false + shift # past argument + ;; + + -h|--height) + tileH="$2" + if $WnotDefined + then + tileW="$2" # Set w=h by default, if it not defined yet + fi + HnotDefined=false + shift # past argument + ;; + + -s|--step) + step="$2" + shift # past argument + ;; + + -l|--overlap) + overlap="$2" + shift # past argument + ;; + + -p|--options) + imOptions="$2" + shift # past argument + ;; + + -g|--gravity) + gravity="$2" + shift # past argument + ;; + + -x|--extent) + extent=true + ;; + + -d|--dzi) + dziFormat=true + ;; + + -a|--slicea) + scaleFromImage=true + ;; + + -b|--sliceb) + scaleFromImage=false + ;; + + -c|--scaleover) + scaleover=false + ;; + + -r|--horizontal) + horizontal=true + ;; + + -t|--vertical) + horizontal=false + ;; + + -v|--verbose) + verboseLevel="$2" + shift # past argument + ;; + + -v0|--verbose0) + verboseLevel=0 + ;; + + -v1|--verbose1) + verboseLevel=1 + ;; + + -v2|--verbose1) + verboseLevel=2 + ;; + + -v3|--verbose1) + verboseLevel=3 + ;; + + -u|--usage) + uHelp + exit 0 + ;; + + -\?|--help) + cliHelp "$2" + shift # past argument + ;; + + -m|--man) + cliHelp "" true + ;; + + # --default) + # DEFAULT=YES + # ;; + + *) + if $SourceNotDefined # Interpreting first unknown command as source + then + imageSource="$1" + SourceNotDefined=false + else + if $ResDirNotDefined # Interpreting second unknown command as source + then + resultDir="$1" + ResDirNotDefined=false + else # Interpreting third unknown command as unknown command + echo "Unknown option: $1" + fi + fi + ;; + esac + + shift # Get next key +done + +# Cheking for installed applications +command -v convert >/dev/null 2>&1 || { echo >&2 "I require ImageMagick tool 'convert', but it's not installed. Aborting."; exit 1; } +command -v identify >/dev/null 2>&1 || { echo >&2 "I require ImageMagick tool 'identify', but it's not installed. Aborting."; exit 1; } + +# Checking if file was defined +if $SourceNotDefined +then + echo "No source file present. Canceled." + exit 1 +fi + +# Cheking if source file not exists +if [ ! -f "$imageSource" ] +then + echo "Error! Input file 'images source' not found! File path: $imageSource" + exit 1 +fi + +# Set extension +fullName=$(basename "$imageSource") +fileBase="${fullName%.*}" +fileExt="${fullName##*.}" + +if $ExtNotDefined +then + resultExt="$fileExt" +fi + +# Set out name +if $ResDirNotDefined +then + resultDir="$fileBase" +fi + +# ——————————————————————————————————————————————————————————————————————————————————— +# ####### Functions ####### # +debugMsg "Section: Functions" + +getImgW(){ # image_file + echo `identify -format "%[fx:w]" $1` +} + +getImgH(){ # image_file + echo `identify -format "%[fx:h]" $1` +} + +# ——————————————————————————————————————————————————————————————————————————————————— +# ######################## # +# ####### Slicer A ####### # +debugMsg "Section: Slicer A" + +# Constants +scaleBase=100 # Scale in percents - 100% (TODO: add option to use image sizes) +scaleMult=100000 # Scale multiplier (bash works only with int) +scaleMult64=100000000000000 # Scale multiplier for x64 bash and x64 convert (if you have very many zoom level and need more accuracy) +scaleStart=0 +# declare -a scaledW +# declare -a scaledH +# scaledW=() +# scaledH=() + +setScale(){ + if $scale64 + then + local arch=`uname -m` + if [ "${arch}" == "x86_64" ] + then + scaleMult=$scaleMult64 + else + echo "Your system (${arch}) isn't x86_64" + exit 1 + fi + fi + scaleStart=$(( $scaleBase * $scaleMult )) +} + +getZoomLevels(){ # imgLen(pixels) tileLen(pixels) step(int) # Calculate zoom levels for current step + local imgLen=$1 + local tileLen=$2 + local zoomStep=$3 + local r=(0) + local cnt=1 + + # Drop zooms less tile size + # while [ "$imgLen" -gt "$tileLen" ] + # do + # r[$cnt]=$imgLen + # let "cnt+=1" + # let "imgLen = imgLen * 100 / zoomStep" + # done + + # Do all zooms down to 1x1 px + while [ "$imgLen" -ge 1 ] + do + r[$cnt]=$imgLen + let "cnt+=1" + let "imgLen = imgLen * 100 / zoomStep" + done + + r[$cnt]=$imgLen + r[0]=$cnt + echo ${r[*]} +} + +nextScale(){ # oldScale -> newScale + # Calculate image zoom in percents - it need for imagemagick for image resize + echo $(( $1 * 100 / $step )) +} + +scaleToPercents(){ # scale + local s=$1 + local sInt=0 + local sFloat=0 + let "sInt = s / $scaleMult" + let "sFloat = s - sInt * $scaleMult" + echo "${sInt}.${sFloat}%" +} + +# scaleImage(){ # zoom scale -> file_path +# local zoom=$1 +# local s=$2 +# local dir="${resultDir}/${zoom}" +# local file="${dir}.${resultExt}" +# local size=`scaleToPercents $s` +# mkdir -p $dir # Imagemagick can't create directories +# convert $imageSource $resizeFilter -resize $size $file +# echo $file +# } + +zoomImage(){ # zoom size -> file_path + local zoom=$1 + local size=$2 + local dir="${resultDir}/${zoom}" + local file="${dir}.${resultExt}" + # local file="${dir}.png" + # local size=`scaleToPercents $s` + mkdir -p $dir # Imagemagick can't create directories + convert $imageSource $resizeFilter -resize $size $imOptions $file + echo $file +} + +sliceImage(){ # zoom image + local zoom=$1 + local src=$2 + local wxh="${tileW}x${tileH}" + + local xyDelim='/' + if $dziFormat + then + xyDelim='_' + fi + + local tilesFormat="%[fx:page.x/${tileW}]${xyDelim}%[fx:page.y/${tileH}]" # This very important magic! It allow imagemagick to generate tile names with it position and place it in corect folders (but folders need to generate manually) + local file="${resultDir}/${zoom}/%[filename:tile].${resultExt}" + + if [ ! $dziFormat ] + then + # Creating subdirectories for tiles (one vertical line of tiles is in one folder) + local srcSize=`getImgW $src` # Getting image width + local dirNum=$(( $srcSize / $tileW )) # Calculating number of tiles in line + local i=0 + for(( i=0; i<=$dirNum; i++ )) + do + mkdir -p "${resultDir}/${zoom}/$i" # Imagemagick can't create directories + done + sync + fi + + # extent option + local ext='' + if $extent + then + ext="-background none -extent ${wxh}" + fi + + # Slice image to tiles + # convert $src -crop $wxh -set filename:tile $tilesFormat +repage +adjoin -background none -gravity $gravity $ext $file + convert $src -gravity $gravity -crop $wxh -set filename:tile $tilesFormat +repage +adjoin -gravity $gravity $ext $file +} + +sliceA(){ + infoMsg " Slicer A is running..." + local scalesW=( `getZoomLevels $imageW $tileW $step` ) # Get width for each zoom level + local scalesH=( `getZoomLevels $imageH $tileH $step` ) # Get height for each zoom level + local zw=${scalesW[0]} # Get zoom level for width + local zh=${scalesH[0]} # Get zoom level for height + local scales=() # Creating empty array + local zoomMax=0 + local zoom=0 + local hMod='' + local s=0 + local file='' + + if [ "$zw" -ge "$zh" ] + then + zoomMax=$zw + scales=( ${scalesW[*]} ) + hMod='' + else + zoomMax=$zh + scales=( ${scalesH[*]} ) + hMod='x' + fi + + # local scale=$scaleStart + # local scalep='' + while [ "$s" -lt "$zoomMax" ] + do + if $zoomReverse + then + let "zoom = s" + else + let "zoom = zoomMax - s" + fi + + infoMsg "    Resizing next file..." + debugMsg "    zoomMax=$zoomMax, zoomLevel=$s, wxhInex=$zoom, wxh=${hMod}${scales[$zoom]}" + file=`zoomImage $s "${hMod}${scales[$zoom]}"` + infoMsg "    File resized: ${file}" + infoMsg "    Slicing file..." + sliceImage $s $file + rm -rf $file + + # scalep=`scaleToPercents $scale` + # s=${scales[zoom-1]} + # echo $zoom "$s" + # file=`scaleImage $zoom "${hMod}${scales[$zoom]}"` + # echo "zoom, scalep, scale: $zoom $scalep $scale $file" + # echo ${scaledW[$i]} + # echo ${scaledH[$i]} + # scale=`nextScale $scale` + + let "s+=1" + done + + infoMsg " Slicer A complete" + + # s=`nextScale $scaleStart` + # s=`nextScale $s` + # scaleToPercents $s +} + +# ——————————————————————————————————————————————————————————————————————————————————— +# ########################## +# ####### Slicer B ####### # +debugMsg "Section: Slicer B" + +zoomPixels(){ # zoom tileSize + local zoom=$1 + local pixels=$2 + if [ "$zoom" -ne 0 ] + then + let "pixels = pixels * 100" + for(( i=0; i file_path + local zoom=$1 + local dir="${resultDir}/${zoom}" + local file="${dir}.${resultExt}" + local size=`zoomPixels $zoom $tileW` + mkdir -p $dir # Imagemagick can't create directories + convert $imageSource $resizeFilter -resize $size $imOptions $file + echo $file +} + +resizeImageV(){ # zoom -> file_path + local zoom=$1 + local dir="${resultDir}/${zoom}" + local file="${dir}.${resultExt}" + local size=`zoomPixels $zoom $tileH` + mkdir -p $dir # Imagemagick can't create directories + convert $imageSource $resizeFilter -resize "x${size}" $imOptions $file + echo $file +} + +resizeImage(){ # zoom -> file_path + if $horizontal + then + echo `resizeImageH $1` + else + echo `resizeImageV $1` + fi +} + +sliceB(){ + echo "Slicer B is running..." + local size=0 + local sizeMax=0 + local zoom=0 + + if $horizontal + then + let "size = $tileW" + let "sizeMax = $imageW" + else + let "size = $tileH" + let "sizeMax = $imageH" + fi + + if $scaleover + then + let "sizeMax += $size" + fi + + local px=$size + while [ "$px" -lt "$sizeMax" ] + do + echo " Slicing zoom level \"${zoom}\"; image main size is \"${px}\"" + sliceImage $zoom `resizeImage $zoom` + let "zoom++" + px=`zoomPixels $zoom $size` + done + echo "Slicer B complete" +} + + +mainScale(){ # min zoom = tile width + if $scaleFromImage + then + sliceA + else + sliceB + fi + echo +} + +setDziFormat(){ + local dziFileName="${resultDir}.dzi" + resultDir="${resultDir}_files" + tileH=$tileW + + mkdir -p "$(dirname "${dziFileName}")" + touch ${dziFileName} + + echo '' > "$dziFileName" + echo "" >> "$dziFileName" + echo "" >> "$dziFileName" + echo '' >> "$dziFileName" + # + # + # + # +} + +setFormat(){ + if $dziFormat + then + setDziFormat + fi +} + +init(){ + if [ "$step" -le 100 ] + then + echo "You get infinity loop. Minimum step value = 101% (101)" + exit 1 + fi + # Getting image sizes + imageW=`getImgW $imageSource` + imageH=`getImgH $imageSource` + + # Set options for selected format + setFormat + + # Set scale + setScale + + rm -rf $resultDir # removing old results + mkdir -p $resultDir # creating new results folder + +} + +# ——————————————————————————————————————————————————————————————————————————————————— +# ###################### # +# ### Programm start ### # +debugMsg "Section: Programm" + +init +mainScale + +# ### Programm end ##### # +# ###################### # +# ——————————————————————————————————————————————————————————————————————————————————— diff --git a/image/run_batch.py b/image/run_batch.py new file mode 100644 index 0000000..48b0426 --- /dev/null +++ b/image/run_batch.py @@ -0,0 +1,67 @@ +# ensure to use my fork https://github.com/wattapik/MagickSlicer + +import os +import subprocess +import shutil + +def convert_to_jpg(input_file, output_dir): + try: + # Construct the output file path for the converted JPG + file_name_without_extension = os.path.splitext(os.path.basename(input_file))[0] + output_file = os.path.join("original", "jpg", f"{file_name_without_extension}.jpg") + + # Command to convert the image to JPG using ImageMagick's 'convert' command + convert_command = ["convert", input_file, "-quality", "100", output_file] + + # Run the conversion command + subprocess.run(convert_command) + print(f"Converted {input_file} to JPG") + + # Once converted, process the JPG image + process_image(output_file, output_dir) + except Exception as e: + print(f"Error converting {input_file} to JPG: {e}") + +def process_image(input_file, output_dir): + try: + # Construct the output file path + file_name_without_extension = os.path.splitext(os.path.basename(input_file))[0] + output_file = os.path.join(output_dir, file_name_without_extension, f"{file_name_without_extension}") + + # Command to invoke the "magick-slicer.sh" script + command = ["./magick-slicer.sh", input_file, output_file] + + print(command) + print(output_file) + print(os.getcwd()) + # Run the command + subprocess.run(command) + print(f"Processed {input_file}") + except Exception as e: + print(f"Error processing {input_file}: {e}") + +def main(): + # Define the input and output directories + input_dir = "original" + output_dir = "dzi" + + # Ensure the output directory exists + os.makedirs(output_dir, exist_ok=True) + os.makedirs(os.path.join(input_dir, "jpg"), exist_ok=True) # Create "original/jpg" folder + + # Gather a list of image files in the input directory + image_files = [] + for root, _, files in os.walk(input_dir): + for filename in files: + if filename.lower().endswith((".jpg", ".jpeg", ".png", ".gif")): + image_files.append(os.path.join(root, filename)) + + # Convert and process image files synchronously + for input_file in image_files: + convert_to_jpg(input_file, output_dir) + + # Delete the "original/jpg" folder once all conversions and processing are finished + # shutil.rmtree(os.path.join(input_dir, "jpg")) + +if __name__ == "__main__": + main() diff --git a/image/su.png b/image/su.png new file mode 100644 index 0000000000000000000000000000000000000000..484f431fde2b8cd23f1f6483ec13cb4d89cde30e GIT binary patch literal 15304 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 G0skMGP3len literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..ff13a8a --- /dev/null +++ b/index.html @@ -0,0 +1,109 @@ + + + + + + + Sketchers United Collaboration + + + + + + + + + + + + + + + + +
    + + + + +
    + + +
    + 🌈 Here now: 0 +
    + + + +
    + +
    +
    + + + + + + + + + diff --git a/script/annotations.js b/script/annotations.js new file mode 100644 index 0000000..d74f51e --- /dev/null +++ b/script/annotations.js @@ -0,0 +1,28 @@ +const anno = OpenSeadragon.Annotorious(viewer); +anno.readOnly = true +anno.loadAnnotations('annotations/initial.w3c.json'); +let annotationText = "" + +function renderHTML() +{ + const observer = new MutationObserver(() => { + const annotationTextElement = document.querySelector('.r6o-readonly-comment'); + if (annotationTextElement) { + annotationTextElement.innerHTML = annotationText + observer.disconnect(); + } + }); + + observer.observe(document.body, { childList: true, subtree: true }); +} + +anno.on('clickAnnotation', function(annotation, element) +{ + annotationText = annotation.body[0].value + renderHTML() +}); + +viewer.addHandler('update-viewport', function(event) +{ + renderHTML() +}); \ No newline at end of file diff --git a/script/caman/caman.full.min.js b/script/caman/caman.full.min.js new file mode 100644 index 0000000..91eb2f8 --- /dev/null +++ b/script/caman/caman.full.min.js @@ -0,0 +1,206 @@ + +(function(){var $,Analyze,Blender,Calculate,Caman,CamanInstance,CamanParser,Canvas,Convert,Event,Filter,IO,Image,Layer,Log,Logger,PixelInfo,Plugin,RenderJob,Root,Store,Util,fs,slice,vignetteFilters,__hasProp={}.hasOwnProperty,__indexOf=[].indexOf||function(item){for(var i=0,l=this.length;i255){return 255;} +return val;};return Util;})();if(typeof exports!=="undefined"&&exports!==null){Root=exports;Canvas=require('canvas');Image=Canvas.Image;fs=require('fs');}else{Root=window;} +Root.Caman=Caman=function(){if(arguments.length===0){throw"Invalid arguments given";} +if(typeof exports!=="undefined"&&exports!==null){return new CamanInstance(arguments,CamanInstance.Type.Node);} +switch(arguments.length){case 1:if(Store.has(arguments[0])){return Store.get(arguments[0]);} +return new CamanInstance(arguments,CamanInstance.Type.Unknown);case 2:if(Store.has(arguments[0])){return Store.execute(arguments[0],arguments[1]);} +if(typeof arguments[1]==='function'){return new CamanInstance(arguments,CamanInstance.Type.Unknown);}else{return new CamanInstance(arguments,CamanInstance.Type.Canvas);} +break;case 3:if(Store.has(arguments[0])){return Store.execute(arguments[1],arguments[2]);} +return new CamanInstance(arguments,CamanInstance.Type.Canvas);}};Caman.version={release:"3.3.0",date:"12/13/12"};Caman.DEBUG=false;Caman.autoload=!(typeof exports!=="undefined"&&exports!==null);Caman.crossOrigin="anonymous";Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.remoteProxy="";Caman.Util=Util;CamanInstance=(function(){CamanInstance.Type={Image:1,Canvas:2,Unknown:3,Node:4};CamanInstance.toString=Caman.toString;function CamanInstance(args,type){var listener,_this=this;if(type==null){type=CamanInstance.Type.Canvas;} +this.id=Util.uniqid.get();this.analyze=new Analyze(this);this.originalPixelData=[];this.pixelStack=[];this.layerStack=[];this.renderQueue=[];this.canvasQueue=[];this.currentLayer=null;if(type===CamanInstance.Type.Node){this.loadNode.apply(this,args);}else{if(document.readyState==="complete"){this.domLoaded(args,type);}else{listener=function(){if(document.readyState==="complete"){return _this.domLoaded(args,type);}};document.addEventListener("readystatechange",listener,false);}}} +CamanInstance.prototype.domLoaded=function(args,type){switch(type){case CamanInstance.Type.Image:return this.loadImage.apply(this,args);case CamanInstance.Type.Canvas:return this.loadCanvas.apply(this,args);case CamanInstance.Type.Unknown:return this.loadUnknown(args);}};CamanInstance.prototype.loadUnknown=function(args){var e;e=$(args[0]);switch(e.nodeName.toLowerCase()){case"img":return this.loadImage.apply(this,args);case"canvas":return this.loadCanvas(null,args[0],args[1]);}};CamanInstance.prototype.loadImage=function(id,callback){var image,proxyURL,_ref,_this=this;if(typeof id==="object"&&((_ref=id.nodeName)!=null?_ref.toLowerCase():void 0)==="img"){image=id;if(!image.id){image.id="caman-"+(Util.uniqid.get());}}else{if($(id)!=null){image=$(id);}else{throw"Could not find element "+id;}} +proxyURL=IO.remoteCheck(image.src);if(proxyURL){image.onload=function(){return _this.imageLoaded(id,image,callback);};return image.src=proxyURL;}else{if(image.complete){return this.imageLoaded(id,image,callback);}else{return image.onload=function(){return _this.imageLoaded(id,image,callback);};}}};CamanInstance.prototype.imageLoaded=function(id,image,callback){var attr,_i,_len,_ref;this.image=image;if(!image||image.nodeName.toLowerCase()!=="img"){throw"Given element ID isn't an image: "+id;} +this.canvas=document.createElement('canvas');this.canvas.id=image.id;_ref=['data-camanwidth','data-camanheight'];for(_i=0,_len=_ref.length;_i<_len;_i++){attr=_ref[_i];if(this.image.getAttribute(attr)){this.canvas.setAttribute(attr,this.image.getAttribute(attr));}} +if(image.parentNode!=null){image.parentNode.replaceChild(this.canvas,this.image);} +this.canvasID=id;this.options={canvas:id,image:this.image.src};if(this.image.crossOrigin){this.options.crossOrigin=this.image.crossOrigin;} +return this.finishInit(callback);};CamanInstance.prototype.loadCanvas=function(url,id,callback){var element,_ref;if(typeof id==="object"&&((_ref=id.nodeName)!=null?_ref.toLowerCase():void 0)==="canvas"){element=id;if(!element.id){element.id="caman-"+(Util.uniqid.get());}}else{if($(id)!=null){element=$(id);}else{throw"Could not find element "+id;}} +return this.canvasLoaded(url,element,callback);};CamanInstance.prototype.canvasLoaded=function(url,canvas,callback){var proxyURL,_this=this;this.canvas=canvas;if(!canvas||canvas.nodeName.toLowerCase()!=="canvas"){throw"Given element ID isn't a canvas: "+id;} +if(url!=null){this.image=document.createElement('img');this.image.onload=function(){return _this.finishInit(callback);};proxyURL=IO.remoteCheck(url);if(proxyURL){url=proxyURL;} +this.canvasID=this.canvas.id;this.options={canvas:canvas.id,image:url};if(IO.isRemote(url)){this.image.crossOrigin=Caman.crossOrigin;} +return this.image.src=url;}else{return this.finishInit(callback);}};CamanInstance.prototype.loadNode=function(file,callback){var img,_this=this;img=new Image();if(typeof file==="string"){file=fs.realpathSync(file);} +img.onload=function(){var context;_this.canvasID=Util.uniqid.get();_this.canvas=new Canvas(img.width,img.height);context=_this.canvas.getContext('2d');context.drawImage(img,0,0);return _this.finishInit(callback);};img.onerror=function(err){throw err;};return img.src=file;};CamanInstance.prototype.finishInit=function(callback){var newHeight,newWidth,oldHeight,oldWidth,pixel,_i,_len,_ref;if(callback==null){callback=function(){};} +this.context=this.canvas.getContext("2d");if(this.image!=null){oldWidth=this.image.width;oldHeight=this.image.height;newWidth=this.canvas.getAttribute('data-camanwidth');newHeight=this.canvas.getAttribute('data-camanheight');if(newWidth||newHeight){if(newWidth){this.image.width=parseInt(newWidth,10);if(newHeight){this.image.height=parseInt(newHeight,10);}else{this.image.height=this.image.width*oldHeight/oldWidth;}}else if(newHeight){this.image.height=parseInt(newHeight,10);this.image.width=this.image.height*oldWidth/oldHeight;}} +this.canvas.width=this.image.width;this.canvas.height=this.image.height;if(window.devicePixelRatio){this.canvas.style.width=""+this.image.width+"px";this.canvas.style.height=""+this.image.height+"px";this.canvas.width=this.image.width*window.devicePixelRatio;this.canvas.height=this.image.height*window.devicePixelRatio;this.context.scale(window.devicePixelRatio,window.devicePixelRatio);} +this.context.drawImage(this.image,0,0,this.image.width,this.image.height);} +this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;_ref=this.pixelData;for(_i=0,_len=_ref.length;_i<_len;_i++){pixel=_ref[_i];this.originalPixelData.push(pixel);} +this.dimensions={width:this.canvas.width,height:this.canvas.height};Store.put(this.canvasID,this);callback.call(this,this);return this;};CamanInstance.prototype.replaceCanvas=function(newCanvas){var oldCanvas;oldCanvas=this.canvas;this.canvas=newCanvas;if(oldCanvas.parentNode!=null){oldCanvas.parentNode.replaceChild(this.canvas,oldCanvas);} +this.context=this.canvas.getContext('2d');this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;return this.dimensions={width:this.canvas.width,height:this.canvas.height};};return CamanInstance;})();Analyze=(function(){function Analyze(c){this.c=c;} +Analyze.prototype.calculateLevels=function(){var i,levels,numPixels,_i,_j,_k,_ref;levels={r:{},g:{},b:{}};for(i=_i=0;_i<=255;i=++_i){levels.r[i]=0;levels.g[i]=0;levels.b[i]=0;} +for(i=_j=0,_ref=this.c.pixelData.length;_j<_ref;i=_j+=4){levels.r[this.c.pixelData[i]]++;levels.g[this.c.pixelData[i+1]]++;levels.b[this.c.pixelData[i+2]]++;} +numPixels=this.c.pixelData.length/4;for(i=_k=0;_k<=255;i=++_k){levels.r[i]/=numPixels;levels.g[i]/=numPixels;levels.b[i]/=numPixels;} +return levels;};return Analyze;})();Caman.DOMUpdated=function(){var img,imgs,parser,_i,_len,_results;imgs=document.querySelectorAll("img[data-caman]");if(!(imgs.length>0)){return;} +_results=[];for(_i=0,_len=imgs.length;_i<_len;_i++){img=imgs[_i];_results.push(parser=new CamanParser(img,function(){this.parse();return this.execute();}));} +return _results;};if(Caman.autoload){(function(){if(document.readyState==="complete"){return Caman.DOMUpdated();}else{return document.addEventListener("DOMContentLoaded",Caman.DOMUpdated,false);}})();} +CamanParser=(function(){var INST_REGEX;INST_REGEX="(\\w+)\\((.*?)\\)";function CamanParser(ele,ready){this.dataStr=ele.getAttribute('data-caman');this.caman=Caman(ele,ready.bind(this));} +CamanParser.prototype.parse=function(){var args,filter,func,inst,instFunc,m,r,unparsedInstructions,_i,_len,_ref,_results;this.ele=this.caman.canvas;r=new RegExp(INST_REGEX,'g');unparsedInstructions=this.dataStr.match(r);if(!(unparsedInstructions.length>0)){return;} +r=new RegExp(INST_REGEX);_results=[];for(_i=0,_len=unparsedInstructions.length;_i<_len;_i++){inst=unparsedInstructions[_i];_ref=inst.match(r),m=_ref[0],filter=_ref[1],args=_ref[2];instFunc=new Function("return function() { this."+filter+"("+args+"); };");try{func=instFunc();_results.push(func.call(this.caman));}catch(e){_results.push(Log.debug(e));}} +return _results;};CamanParser.prototype.execute=function(){var ele;ele=this.ele;return this.caman.render(function(){return ele.parentNode.replaceChild(this.toImage(),ele);});};return CamanParser;})();Blender=(function(){function Blender(){} +Blender.blenders={};Blender.register=function(name,func){return this.blenders[name]=func;};Blender.execute=function(name,rgbaLayer,rgbaParent){return this.blenders[name](rgbaLayer,rgbaParent);};return Blender;})();Caman.Blender=Blender;Calculate=(function(){function Calculate(){} +Calculate.distance=function(x1,y1,x2,y2){return Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));};Calculate.randomRange=function(min,max,getFloat){var rand;if(getFloat==null){getFloat=false;} +rand=min+(Math.random()*(max-min));if(getFloat){return rand.toFixed(getFloat);}else{return Math.round(rand);}};Calculate.luminance=function(rgba){return(0.27*rgba.r)+(0.67*rgba.g)+(0.06*rgba.b);};Calculate.bezier=function(start,ctrl1,ctrl2,end,lowBound,highBound){var Ax,Ay,Bx,By,Cx,Cy,bezier,curveX,curveY,i,j,leftCoord,rightCoord,t,x0,x1,x2,x3,y0,y1,y2,y3,_i,_j,_k,_ref,_ref1;x0=start[0];y0=start[1];x1=ctrl1[0];y1=ctrl1[1];x2=ctrl2[0];y2=ctrl2[1];x3=end[0];y3=end[1];bezier={};Cx=parseInt(3*(x1-x0),10);Bx=3*(x2-x1)-Cx;Ax=x3-x0-Cx-Bx;Cy=3*(y1-y0);By=3*(y2-y1)-Cy;Ay=y3-y0-Cy-By;for(i=_i=0;_i<1000;i=++_i){t=i/1000;curveX=Math.round((Ax*Math.pow(t,3))+(Bx*Math.pow(t,2))+(Cx*t)+x0);curveY=Math.round((Ay*Math.pow(t,3))+(By*Math.pow(t,2))+(Cy*t)+y0);if(lowBound&&curveYhighBound){curveY=highBound;} +bezier[curveX]=curveY;} +if(bezier.length=_ref;i=0<=_ref?++_j:--_j){if(!(bezier[i]!=null)){leftCoord=[i-1,bezier[i-1]];for(j=_k=i,_ref1=end[0];i<=_ref1?_k<=_ref1:_k>=_ref1;j=i<=_ref1?++_k:--_k){if(bezier[j]!=null){rightCoord=[j,bezier[j]];break;}} +bezier[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}}} +if(!(bezier[end[0]]!=null)){bezier[end[0]]=bezier[end[0]-1];} +return bezier;};return Calculate;})();Convert=(function(){function Convert(){} +Convert.hexToRGB=function(hex){var b,g,r;if(hex.charAt(0)==="#"){hex=hex.substr(1);} +r=parseInt(hex.substr(0,2),16);g=parseInt(hex.substr(2,2),16);b=parseInt(hex.substr(4,2),16);return{r:r,g:g,b:b};};Convert.rgbToHSL=function(r,g,b){var d,h,l,max,min,s;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} +r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);l=(max+min)/2;if(max===min){h=s=0;}else{d=max-min;s=l>0.5?d/(2-max-min):d/(max+min);h=(function(){switch(max){case r:return(g-b)/d+(g1){t-=1;} +if(t<1/6){return p+(q-p)*6*t;} +if(t<1/2){return q;} +if(t<2/3){return p+(q-p)*(2/3-t)*6;} +return p;};Convert.rgbToHSV=function(r,g,b){var d,h,max,min,s,v;r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);v=max;d=max-min;s=max===0?0:d/max;if(max===min){h=0;}else{h=(function(){switch(max){case r:return(g-b)/d+(g0.04045){r=Math.pow((r+0.055)/1.055,2.4);}else{r/=12.92;} +if(g>0.04045){g=Math.pow((g+0.055)/1.055,2.4);}else{g/=12.92;} +if(b>0.04045){b=Math.pow((b+0.055)/1.055,2.4);}else{b/=12.92;} +x=r*0.4124+g*0.3576+b*0.1805;y=r*0.2126+g*0.7152+b*0.0722;z=r*0.0193+g*0.1192+b*0.9505;return{x:x*100,y:y*100,z:z*100};};Convert.xyzToRGB=function(x,y,z){var b,g,r;x/=100;y/=100;z/=100;r=(3.2406*x)+(-1.5372*y)+(-0.4986*z);g=(-0.9689*x)+(1.8758*y)+(0.0415*z);b=(0.0557*x)+(-0.2040*y)+(1.0570*z);if(r>0.0031308){r=(1.055*Math.pow(r,0.4166666667))-0.055;}else{r*=12.92;} +if(g>0.0031308){g=(1.055*Math.pow(g,0.4166666667))-0.055;}else{g*=12.92;} +if(b>0.0031308){b=(1.055*Math.pow(b,0.4166666667))-0.055;}else{b*=12.92;} +return{r:r*255,g:g*255,b:b*255};};Convert.xyzToLab=function(x,y,z){var a,b,l,whiteX,whiteY,whiteZ;if(typeof x==="object"){y=x.y;z=x.z;x=x.x;} +whiteX=95.047;whiteY=100.0;whiteZ=108.883;x/=whiteX;y/=whiteY;z/=whiteZ;if(x>0.008856451679){x=Math.pow(x,0.3333333333);}else{x=(7.787037037*x)+0.1379310345;} +if(y>0.008856451679){y=Math.pow(y,0.3333333333);}else{y=(7.787037037*y)+0.1379310345;} +if(z>0.008856451679){z=Math.pow(z,0.3333333333);}else{z=(7.787037037*z)+0.1379310345;} +l=116*y-16;a=500*(x-y);b=200*(y-z);return{l:l,a:a,b:b};};Convert.labToXYZ=function(l,a,b){var x,y,z;if(typeof l==="object"){a=l.a;b=l.b;l=l.l;} +y=(l+16)/116;x=y+(a/500);z=y-(b/200);if(x>0.2068965517){x=x*x*x;}else{x=0.1284185493*(x-0.1379310345);} +if(y>0.2068965517){y=y*y*y;}else{y=0.1284185493*(y-0.1379310345);} +if(z>0.2068965517){z=z*z*z;}else{z=0.1284185493*(z-0.1379310345);} +return{x:x*95.047,y:y*100.0,z:z*108.883};};Convert.rgbToLab=function(r,g,b){var xyz;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} +xyz=this.rgbToXYZ(r,g,b);return this.xyzToLab(xyz);};Convert.labToRGB=function(l,a,b){};return Convert;})();Event=(function(){function Event(){} +Event.events={};Event.types=["processStart","processComplete","renderFinished","blockStarted","blockFinished"];Event.trigger=function(target,type,data){var event,_i,_len,_ref,_results;if(this.events[type]&&this.events[type].length){_ref=this.events[type];_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){event=_ref[_i];if(event.target===null||target.id===event.target.id){_results.push(event.fn.call(target,data));}else{_results.push(void 0);}} +return _results;}};Event.listen=function(target,type,fn){var _fn,_type;if(typeof target==="string"){_type=target;_fn=type;target=null;type=_type;fn=_fn;} +if(__indexOf.call(this.types,type)<0){return false;} +if(!this.events[type]){this.events[type]=[];} +this.events[type].push({target:target,fn:fn});return true;};return Event;})();Caman.Event=Event;Filter=(function(){function Filter(){} +Filter.Type={Single:1,Kernel:2,LayerDequeue:3,LayerFinished:4,LoadOverlay:5,Plugin:6};Filter.register=function(name,filterFunc){return CamanInstance.prototype[name]=filterFunc;};Filter.prototype.render=function(callback){var _this=this;if(callback==null){callback=function(){};} +return this.processNext(function(){_this.context.putImageData(_this.imageData,0,0);return callback.call(_this);});};Filter.prototype.revert=function(ready){var i,pixel,_i,_len,_ref;if(ready==null){ready=function(){};} +_ref=this.originalPixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.pixelData[i]=pixel;} +this.context.putImageData(this.imageData,0,0);return ready.call(this);};Filter.prototype.process=function(name,processFn){this.renderQueue.push({type:Filter.Type.Single,name:name,processFn:processFn});return this;};Filter.prototype.processKernel=function(name,adjust,divisor,bias){var i,_i,_ref;if(!divisor){divisor=0;for(i=_i=0,_ref=adjust.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){divisor+=adjust[i];}} +this.renderQueue.push({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias||0});return this;};Filter.prototype.processPlugin=function(plugin,args){this.renderQueue.push({type:Filter.Type.Plugin,plugin:plugin,args:args});return this;};Filter.prototype.processNext=function(finishedFn){var next,_this=this;if(typeof finishedFn==="function"){this.finishedFn=finishedFn;} +if(this.renderQueue.length===0){if(this.finishedFn!=null){Event.trigger(this,"renderFinished");this.finishedFn.call(this);} +return this;} +next=this.renderQueue.shift();return RenderJob.execute(this,next,function(){return _this.processNext();});};Filter.prototype.newLayer=function(callback){var layer;layer=new Layer(this);this.canvasQueue.push(layer);this.renderQueue.push({type:Filter.Type.LayerDequeue});callback.call(layer);this.renderQueue.push({type:Filter.Type.LayerFinished});return this;};Filter.prototype.executeLayer=function(layer){this.pushContext(layer);return this.processNext();};Filter.prototype.pushContext=function(layer){this.layerStack.push(this.currentLayer);this.pixelStack.push(this.pixelData);this.currentLayer=layer;return this.pixelData=layer.pixelData;};Filter.prototype.popContext=function(){this.pixelData=this.pixelStack.pop();return this.currentLayer=this.layerStack.pop();};Filter.prototype.applyCurrentLayer=function(){return this.currentLayer.applyToParent();};return Filter;})();Util.extend(CamanInstance.prototype,Filter.prototype);Caman.Filter=Filter;IO=(function(){function IO(){} +IO.domainRegex=/(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/;IO.isRemote=function(url){var matches;if(!url){return;} +matches=url.match(this.domainRegex);if(matches){return matches[1]!==document.domain;}else{return false;}};IO.remoteCheck=function(src){if(this.isRemote(src)){if(!Caman.remoteProxy.length){Log.info("Attempting to load a remote image without a configured proxy. URL: "+src);}else{if(this.isRemote(Caman.remoteProxy)){Log.info("Cannot use a remote proxy for loading images.");return;} +return""+Caman.remoteProxy+"?camanProxyUrl="+(encodeURIComponent(src));}}};IO.useProxy=function(lang){var langToExt;langToExt={ruby:'rb',python:'py',perl:'pl',javascript:'js'};lang=lang.toLowerCase();if(langToExt[lang]!=null){lang=langToExt[lang];} +return"proxies/caman_proxy."+lang;};IO.prototype.save=function(){if(typeof exports!=="undefined"&&exports!==null){return this.nodeSave.apply(this,arguments);}else{return this.browserSave.apply(this,arguments);}};IO.prototype.browserSave=function(type){var image;if(type==null){type="png";} +type=type.toLowerCase();image=this.toBase64(type).replace("image/"+type,"image/octet-stream");return document.location.href=image;};IO.prototype.nodeSave=function(file,overwrite){var stats;if(overwrite==null){overwrite=true;} +try{stats=fs.statSync(file);if(stats.isFile()&&!overwrite){return false;}}catch(e){Log.debug("Creating output file "+file);} +return fs.writeFile(file,this.canvas.toBuffer(),function(){return Log.debug("Finished writing to "+file);});};IO.prototype.toImage=function(type){var img;img=document.createElement('img');img.src=this.toBase64(type);img.width=this.dimensions.width;img.height=this.dimensions.height;if(window.devicePixelRatio){img.width/=window.devicePixelRatio;img.height/=window.devicePixelRatio;} +return img;};IO.prototype.toBase64=function(type){if(type==null){type="png";} +type=type.toLowerCase();return this.canvas.toDataURL("image/"+type);};return IO;})();Util.extend(CamanInstance.prototype,IO.prototype);Caman.IO=IO;Layer=(function(){function Layer(c){this.c=c;this.filter=this.c;this.options={blendingMode:'normal',opacity:1.0};this.layerID=Util.uniqid.get();this.canvas=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');this.canvas.width=this.c.dimensions.width;this.canvas.height=this.c.dimensions.height;this.context=this.canvas.getContext('2d');this.context.createImageData(this.canvas.width,this.canvas.height);this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;} +Layer.prototype.newLayer=function(cb){return this.c.newLayer.call(this.c,cb);};Layer.prototype.setBlendingMode=function(mode){this.options.blendingMode=mode;return this;};Layer.prototype.opacity=function(opacity){this.options.opacity=opacity/100;return this;};Layer.prototype.copyParent=function(){var i,parentData,_i,_ref;parentData=this.c.pixelData;for(i=_i=0,_ref=this.c.pixelData.length;_i<_ref;i=_i+=4){this.pixelData[i]=parentData[i];this.pixelData[i+1]=parentData[i+1];this.pixelData[i+2]=parentData[i+2];this.pixelData[i+3]=parentData[i+3];} +return this;};Layer.prototype.fillColor=function(){return this.c.fillColor.apply(this.c,arguments);};Layer.prototype.overlayImage=function(image){if(typeof image==="object"){image=image.src;}else if(typeof image==="string"&&image[0]==="#"){image=$(image).src;} +if(!image){return this;} +this.c.renderQueue.push({type:Filter.Type.LoadOverlay,src:image,layer:this});return this;};Layer.prototype.applyToParent=function(){var i,layerData,parentData,result,rgbaLayer,rgbaParent,_i,_ref,_results;parentData=this.c.pixelStack[this.c.pixelStack.length-1];layerData=this.c.pixelData;_results=[];for(i=_i=0,_ref=layerData.length;_i<_ref;i=_i+=4){rgbaParent={r:parentData[i],g:parentData[i+1],b:parentData[i+2],a:parentData[i+3]};rgbaLayer={r:layerData[i],g:layerData[i+1],b:layerData[i+2],a:layerData[i+3]};result=Blender.execute(this.options.blendingMode,rgbaLayer,rgbaParent);result.r=Util.clampRGB(result.r);result.g=Util.clampRGB(result.g);result.b=Util.clampRGB(result.b);if(!(result.a!=null)){result.a=rgbaLayer.a;} +parentData[i]=rgbaParent.r-((rgbaParent.r-result.r)*(this.options.opacity*(result.a/255)));parentData[i+1]=rgbaParent.g-((rgbaParent.g-result.g)*(this.options.opacity*(result.a/255)));_results.push(parentData[i+2]=rgbaParent.b-((rgbaParent.b-result.b)*(this.options.opacity*(result.a/255))));} +return _results;};return Layer;})();Logger=(function(){function Logger(){var name,_i,_len,_ref;_ref=['log','info','warn','error'];for(_i=0,_len=_ref.length;_i<_len;_i++){name=_ref[_i];this[name]=(function(name){return function(){if(!Caman.DEBUG){return;} +return console[name].apply(console,arguments);};})(name);} +this.debug=this.log;} +return Logger;})();Log=new Logger();PixelInfo=(function(){function PixelInfo(c){this.c=c;this.loc=0;} +PixelInfo.prototype.locationXY=function(){var x,y;y=this.c.dimensions.height-Math.floor(this.loc/(this.c.dimensions.width*4));x=(this.loc%(this.c.dimensions.width*4))/4;return{x:x,y:y};};PixelInfo.prototype.getPixelRelative=function(horiz,vert){var newLoc;newLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return{r:0,g:0,b:0,a:0};} +return{r:this.c.pixelData[newLoc],g:this.c.pixelData[newLoc+1],b:this.c.pixelData[newLoc+2],a:this.c.pixelData[newLoc+3]};};PixelInfo.prototype.putPixelRelative=function(horiz,vert,rgba){var nowLoc;nowLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return;} +this.c.pixelData[newLoc]=rgba.r;this.c.pixelData[newLoc+1]=rgba.g;this.c.pixelData[newLoc+2]=rgba.b;this.c.pixelData[newLoc+3]=rgba.a;return true;};PixelInfo.prototype.getPixel=function(x,y){var loc;loc=(y*this.c.dimensions.width+x)*4;return{r:this.c.pixelData[loc],g:this.c.pixelData[loc+1],b:this.c.pixelData[loc+2],a:this.c.pixelData[loc+3]};};PixelInfo.prototype.putPixel=function(x,y,rgba){var loc;loc=(y*this.c.dimensions.width+x)*4;this.c.pixelData[loc]=rgba.r;this.c.pixelData[loc+1]=rgba.g;this.c.pixelData[loc+2]=rgba.b;return this.c.pixelData[loc+3]=rgba.a;};return PixelInfo;})();Plugin=(function(){function Plugin(){} +Plugin.plugins={};Plugin.register=function(name,plugin){return this.plugins[name]=plugin;};Plugin.execute=function(context,name,args){return this.plugins[name].apply(context,args);};return Plugin;})();Caman.Plugin=Plugin;RenderJob=(function(){RenderJob.Blocks=4;RenderJob.execute=function(instance,job,callback){var layer,rj;rj=new RenderJob(instance,job,callback);switch(job.type){case Filter.Type.LayerDequeue:layer=instance.canvasQueue.shift();instance.executeLayer(layer);break;case Filter.Type.LayerFinished:instance.applyCurrentLayer();instance.popContext();callback();break;case Filter.Type.LoadOverlay:rj.loadOverlay(job.layer,job.src);break;case Filter.Type.Plugin:rj.executePlugin();break;default:rj.executeFilter();} +return instance;};function RenderJob(c,job,renderDone){this.c=c;this.job=job;this.renderDone=renderDone;} +RenderJob.prototype.executeFilter=function(){var blockN,blockPixelLength,end,j,lastBlockN,n,start,_i,_ref,_results,_this=this;this.blocksDone=0;n=this.c.pixelData.length;blockPixelLength=Math.floor((n/4)/RenderJob.Blocks);blockN=blockPixelLength*4;lastBlockN=blockN+((n/4)%RenderJob.Blocks)*4;Event.trigger(this.c,"processStart",this.job);if(this.job.type===Filter.Type.Single){_results=[];for(j=_i=0,_ref=RenderJob.Blocks;0<=_ref?_i<_ref:_i>_ref;j=0<=_ref?++_i:--_i){start=j*blockN;end=start+(j===RenderJob.Blocks-1?lastBlockN:blockN);_results.push(setTimeout((function(j,start,end){return function(){return _this.renderBlock(j,start,end);};})(j,start,end),0));} +return _results;}else{return this.renderKernel();}};RenderJob.prototype.executePlugin=function(){Log.debug("Executing plugin "+this.job.plugin);Plugin.execute(this.c,this.job.plugin,this.job.args);Log.debug("Plugin "+this.job.plugin+" finished!");return this.renderDone();};RenderJob.prototype.renderBlock=function(bnum,start,end){var data,i,pixelInfo,res,_i;Log.debug("BLOCK #"+bnum+" - Filter: "+this.job.name+", Start: "+start+", End: "+end);Event.trigger(this.c,"blockStarted",{blockNum:bnum,totalBlocks:RenderJob.Blocks,startPixel:start,endPixel:end});data={r:0,g:0,b:0,a:0};pixelInfo=new PixelInfo(this.c);for(i=_i=start;_i=builder;j=-builder<=builder?++_j:--_j){for(k=_k=builder;builder<=-builder?_k<=-builder:_k>=-builder;k=builder<=-builder?++_k:--_k){pixel=pixelInfo.getPixelRelative(j,k);kernel[builderIndex*3]=pixel.r;kernel[builderIndex*3+1]=pixel.g;kernel[builderIndex*3+2]=pixel.b;builderIndex++;}} +res=this.processKernel(adjust,kernel,divisor,bias);modPixelData[i]=Util.clampRGB(res.r);modPixelData[i+1]=Util.clampRGB(res.g);modPixelData[i+2]=Util.clampRGB(res.b);modPixelData[i+3]=this.c.pixelData[i+3];} +for(i=_l=start;start<=end?_lend;i=start<=end?++_l:--_l){this.c.pixelData[i]=modPixelData[i];} +return this.blockFinished(-1);};RenderJob.prototype.blockFinished=function(bnum){if(bnum>=0){Log.debug("Block #"+bnum+" finished! Filter: "+this.job.name);} +this.blocksDone++;Event.trigger(this.c,"blockFinished",{blockNum:bnum,blocksFinished:this.blocksDone,totalBlocks:RenderJob.Blocks});if(this.blocksDone===RenderJob.Blocks||bnum===-1){if(bnum>=0){Log.debug("Filter "+this.job.name+" finished!");} +if(bnum<0){Log.debug("Kernel filter "+this.job.name+" finished!");} +Event.trigger(this.c,"processComplete",this.job);return this.renderDone();}};RenderJob.prototype.processKernel=function(adjust,kernel,divisor,bias){var i,val,_i,_ref;val={r:0,g:0,b:0};for(i=_i=0,_ref=adjust.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){val.r+=adjust[i]*kernel[i*3];val.g+=adjust[i]*kernel[i*3+1];val.b+=adjust[i]*kernel[i*3+2];} +val.r=(val.r/divisor)+bias;val.g=(val.g/divisor)+bias;val.b=(val.b/divisor)+bias;return val;};RenderJob.prototype.loadOverlay=function(layer,src){var img,proxyUrl,_this=this;img=document.createElement('img');img.onload=function(){layer.context.drawImage(img,0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.imageData=layer.context.getImageData(0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.pixelData=layer.imageData.data;_this.c.pixelData=layer.pixelData;return _this.c.processNext();};proxyUrl=IO.remoteCheck(src);return img.src=proxyUrl!=null?proxyUrl:src;};return RenderJob;})();Store=(function(){function Store(){} +Store.items={};Store.has=function(search){return this.items[search]!=null;};Store.get=function(search){return this.items[search];};Store.put=function(name,obj){return this.items[name]=obj;};Store.execute=function(search,callback){return callback.call(this.get(search),this.get(search));};Store.flush=function(name){if(name==null){name=false;} +if(name){return delete this.items[name];}else{return this.items={};}};return Store;})();Caman.Store=Store;Blender.register("normal",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r,g:rgbaLayer.g,b:rgbaLayer.b};});Blender.register("multiply",function(rgbaLayer,rgbaParent){return{r:(rgbaLayer.r*rgbaParent.r)/255,g:(rgbaLayer.g*rgbaParent.g)/255,b:(rgbaLayer.b*rgbaParent.b)/255};});Blender.register("screen",function(rgbaLayer,rgbaParent){return{r:255-(((255-rgbaLayer.r)*(255-rgbaParent.r))/255),g:255-(((255-rgbaLayer.g)*(255-rgbaParent.g))/255),b:255-(((255-rgbaLayer.b)*(255-rgbaParent.b))/255)};});Blender.register("overlay",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-2*(255-rgbaLayer.r)*(255-rgbaParent.r)/255:(rgbaParent.r*rgbaLayer.r*2)/255;result.g=rgbaParent.g>128?255-2*(255-rgbaLayer.g)*(255-rgbaParent.g)/255:(rgbaParent.g*rgbaLayer.g*2)/255;result.b=rgbaParent.b>128?255-2*(255-rgbaLayer.b)*(255-rgbaParent.b)/255:(rgbaParent.b*rgbaLayer.b*2)/255;return result;});Blender.register("difference",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r-rgbaParent.r,g:rgbaLayer.g-rgbaParent.g,b:rgbaLayer.b-rgbaParent.b};});Blender.register("addition",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r+rgbaLayer.r,g:rgbaParent.g+rgbaLayer.g,b:rgbaParent.b+rgbaLayer.b};});Blender.register("exclusion",function(rgbaLayer,rgbaParent){return{r:128-2*(rgbaParent.r-128)*(rgbaLayer.r-128)/255,g:128-2*(rgbaParent.g-128)*(rgbaLayer.g-128)/255,b:128-2*(rgbaParent.b-128)*(rgbaLayer.b-128)/255};});Blender.register("softLight",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-((255-rgbaParent.r)*(255-(rgbaLayer.r-128)))/255:(rgbaParent.r*(rgbaLayer.r+128))/255;result.g=rgbaParent.g>128?255-((255-rgbaParent.g)*(255-(rgbaLayer.g-128)))/255:(rgbaParent.g*(rgbaLayer.g+128))/255;result.b=rgbaParent.b>128?255-((255-rgbaParent.b)*(255-(rgbaLayer.b-128)))/255:(rgbaParent.b*(rgbaLayer.b+128))/255;return result;});Blender.register("lighten",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaParent.r:rgbaLayer.r,g:rgbaParent.g>rgbaLayer.g?rgbaParent.g:rgbaLayer.g,b:rgbaParent.b>rgbaLayer.b?rgbaParent.b:rgbaLayer.b};});Blender.register("darken",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaLayer.r:rgbaParent.r,g:rgbaParent.g>rgbaLayer.g?rgbaLayer.g:rgbaParent.g,b:rgbaParent.b>rgbaLayer.b?rgbaLayer.b:rgbaParent.b};});Filter.register("fillColor",function(){var color;if(arguments.length===1){color=Convert.hexToRGB(arguments[0]);}else{color={r:arguments[0],g:arguments[1],b:arguments[2]};} +return this.process("fillColor",function(rgba){rgba.r=color.r;rgba.g=color.g;rgba.b=color.b;rgba.a=255;return rgba;});});Filter.register("brightness",function(adjust){adjust=Math.floor(255*(adjust/100));return this.process("brightness",function(rgba){rgba.r+=adjust;rgba.g+=adjust;rgba.b+=adjust;return rgba;});});Filter.register("saturation",function(adjust){adjust*=-0.01;return this.process("saturation",function(rgba){var max;max=Math.max(rgba.r,rgba.g,rgba.b);if(rgba.r!==max){rgba.r+=(max-rgba.r)*adjust;} +if(rgba.g!==max){rgba.g+=(max-rgba.g)*adjust;} +if(rgba.b!==max){rgba.b+=(max-rgba.b)*adjust;} +return rgba;});});Filter.register("vibrance",function(adjust){adjust*=-1;return this.process("vibrance",function(rgba){var amt,avg,max;max=Math.max(rgba.r,rgba.g,rgba.b);avg=(rgba.r+rgba.g+rgba.b)/3;amt=((Math.abs(max-avg)*2/255)*adjust)/100;if(rgba.r!==max){rgba.r+=(max-rgba.r)*amt;} +if(rgba.g!==max){rgba.g+=(max-rgba.g)*amt;} +if(rgba.b!==max){rgba.b+=(max-rgba.b)*amt;} +return rgba;});});Filter.register("greyscale",function(adjust){return this.process("greyscale",function(rgba){var avg;avg=0.3*rgba.r+0.59*rgba.g+0.11*rgba.b;rgba.r=avg;rgba.g=avg;rgba.b=avg;return rgba;});});Filter.register("contrast",function(adjust){adjust=Math.pow((adjust+100)/100,2);return this.process("contrast",function(rgba){rgba.r/=255;rgba.r-=0.5;rgba.r*=adjust;rgba.r+=0.5;rgba.r*=255;rgba.g/=255;rgba.g-=0.5;rgba.g*=adjust;rgba.g+=0.5;rgba.g*=255;rgba.b/=255;rgba.b-=0.5;rgba.b*=adjust;rgba.b+=0.5;rgba.b*=255;return rgba;});});Filter.register("hue",function(adjust){return this.process("hue",function(rgba){var h,hsv,rgb;hsv=Convert.rgbToHSV(rgba.r,rgba.g,rgba.b);h=hsv.h*100;h+=Math.abs(adjust);h=h%100;h/=100;hsv.h=h;rgb=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v);rgb.a=rgba.a;return rgb;});});Filter.register("colorize",function(){var level,rgb;if(arguments.length===2){rgb=Convert.hexToRGB(arguments[0]);level=arguments[1];}else if(arguments.length===4){rgb={r:arguments[0],g:arguments[1],b:arguments[2]};level=arguments[3];} +return this.process("colorize",function(rgba){rgba.r-=(rgba.r-rgb.r)*(level/100);rgba.g-=(rgba.g-rgb.g)*(level/100);rgba.b-=(rgba.b-rgb.b)*(level/100);return rgba;});});Filter.register("invert",function(){return this.process("invert",function(rgba){rgba.r=255-rgba.r;rgba.g=255-rgba.g;rgba.b=255-rgba.b;return rgba;});});Filter.register("sepia",function(adjust){if(adjust==null){adjust=100;} +adjust/=100;return this.process("sepia",function(rgba){rgba.r=Math.min(255,(rgba.r*(1-(0.607*adjust)))+(rgba.g*(0.769*adjust))+(rgba.b*(0.189*adjust)));rgba.g=Math.min(255,(rgba.r*(0.349*adjust))+(rgba.g*(1-(0.314*adjust)))+(rgba.b*(0.168*adjust)));rgba.b=Math.min(255,(rgba.r*(0.272*adjust))+(rgba.g*(0.534*adjust))+(rgba.b*(1-(0.869*adjust))));return rgba;});});Filter.register("gamma",function(adjust){return this.process("gamma",function(rgba){rgba.r=Math.pow(rgba.r/255,adjust)*255;rgba.g=Math.pow(rgba.g/255,adjust)*255;rgba.b=Math.pow(rgba.b/255,adjust)*255;return rgba;});});Filter.register("noise",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("noise",function(rgba){var rand;rand=Calculate.randomRange(adjust*-1,adjust);rgba.r+=rand;rgba.g+=rand;rgba.b+=rand;return rgba;});});Filter.register("clip",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("clip",function(rgba){if(rgba.r>255-adjust){rgba.r=255;}else if(rgba.r255-adjust){rgba.g=255;}else if(rgba.g255-adjust){rgba.b=255;}else if(rgba.b0){rgba.r+=(255-rgba.r)*options.red;}else{rgba.r-=rgba.r*Math.abs(options.red);}} +if(options.green!=null){if(options.green>0){rgba.g+=(255-rgba.g)*options.green;}else{rgba.g-=rgba.g*Math.abs(options.green);}} +if(options.blue!=null){if(options.blue>0){rgba.b+=(255-rgba.b)*options.blue;}else{rgba.b-=rgba.b*Math.abs(options.blue);}} +return rgba;});});Filter.register("curves",function(){var bezier,chans,cps,ctrl1,ctrl2,end,i,start,_i,_j,_ref,_ref1;chans=arguments[0],cps=2<=arguments.length?__slice.call(arguments,1):[];if(typeof chans==="string"){chans=chans.split("");} +if(chans[0]==="v"){chans=['r','g','b'];} +if(cps.length<3||cps.length>4){throw"Invalid number of arguments to curves filter";} +start=cps[0];ctrl1=cps[1];ctrl2=cps.length===4?cps[2]:cps[1];end=cps[cps.length-1];bezier=Calculate.bezier(start,ctrl1,ctrl2,end,0,255);if(start[0]>0){for(i=_i=0,_ref=start[0];0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){bezier[i]=start[1];}} +if(end[0]<255){for(i=_j=_ref1=end[0];_ref1<=255?_j<=255:_j>=255;i=_ref1<=255?++_j:--_j){bezier[i]=end[1];}} +return this.process("curves",function(rgba){var _k,_ref2;for(i=_k=0,_ref2=chans.length;0<=_ref2?_k<_ref2:_k>_ref2;i=0<=_ref2?++_k:--_k){rgba[chans[i]]=bezier[rgba[chans[i]]];} +return rgba;});});Filter.register("exposure",function(adjust){var ctrl1,ctrl2,p;p=Math.abs(adjust)/100;ctrl1=[0,255*p];ctrl2=[255-(255*p),255];if(adjust<0){ctrl1=ctrl1.reverse();ctrl2=ctrl2.reverse();} +return this.curves('rgb',[0,0],ctrl1,ctrl2,[255,255]);});Caman.Filter.register("boxBlur",function(){return this.processKernel("Box Blur",[1,1,1,1,1,1,1,1,1]);});Caman.Filter.register("radialBlur",function(){return this.processKernel("Radial Blur",[0,1,0,1,1,1,0,1,0]);});Caman.Filter.register("heavyRadialBlur",function(){return this.processKernel("Heavy Radial Blur",[0,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,0,0]);});Caman.Filter.register("gaussianBlur",function(){return this.processKernel("Gaussian Blur",[1,4,6,4,1,4,16,24,16,4,6,24,36,24,6,4,16,24,16,4,1,4,6,4,1]);});Caman.Filter.register("motionBlur",function(){var kernel;if(degrees===0||degrees===180){kernel=[0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0];}else if((degrees>0&°rees<90)||(degrees>180&°rees<270)){kernel=[0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0];}else if(degrees===90||degrees===270){kernel=[0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0];}else{kernel=[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1];} +return this.processKernel("Motion Blur",kernel);});Caman.Filter.register("sharpen",function(amt){if(amt==null){amt=100;} +amt/=100;return this.processKernel("Sharpen",[0,-amt,0,-amt,4*amt+1,-amt,0,-amt,0]);});vignetteFilters={brightness:function(rgba,amt,opts){rgba.r=rgba.r-(rgba.r*amt*opts.strength);rgba.g=rgba.g-(rgba.g*amt*opts.strength);rgba.b=rgba.b-(rgba.b*amt*opts.strength);return rgba;},gamma:function(rgba,amt,opts){rgba.r=Math.pow(rgba.r/255,Math.max(10*amt*opts.strength,1))*255;rgba.g=Math.pow(rgba.g/255,Math.max(10*amt*opts.strength,1))*255;rgba.b=Math.pow(rgba.b/255,Math.max(10*amt*opts.strength,1))*255;return rgba;},colorize:function(rgba,amt,opts){rgba.r-=(rgba.r-opts.color.r)*amt;rgba.g-=(rgba.g-opts.color.g)*amt;rgba.b-=(rgba.b-opts.color.b)*amt;return rgba;}};Filter.register("vignette",function(size,strength){var bezier,center,end,start;if(strength==null){strength=60;} +if(typeof size==="string"&&size.substr(-1)==="%"){if(this.dimensions.height>this.dimensions.width){size=this.dimensions.width*(parseInt(size.substr(0,size.length-1),10)/100);}else{size=this.dimensions.height*(parseInt(size.substr(0,size.length-1),10)/100);}} +strength/=100;center=[this.dimensions.width/2,this.dimensions.height/2];start=Math.sqrt(Math.pow(center[0],2)+Math.pow(center[1],2));end=start-size;bezier=Calculate.bezier([0,1],[30,30],[70,60],[100,80]);return this.process("vignette",function(rgba){var dist,div,loc;loc=this.locationXY();dist=Calculate.distance(loc.x,loc.y,center[0],center[1]);if(dist>end){div=Math.max(1,(bezier[Math.round(((dist-end)/size)*100)]/10)*strength);rgba.r=Math.pow(rgba.r/255,div)*255;rgba.g=Math.pow(rgba.g/255,div)*255;rgba.b=Math.pow(rgba.b/255,div)*255;} +return rgba;});});Filter.register("rectangularVignette",function(opts){var defaults,dim,percent,size,_i,_len,_ref;defaults={strength:50,cornerRadius:0,method:'brightness',color:{r:0,g:0,b:0}};opts=Util.extend(defaults,opts);if(!opts.size){return this;}else if(typeof opts.size==="string"){percent=parseInt(opts.size,10)/100;opts.size={width:this.dimensions.width*percent,height:this.dimensions.height*percent};}else if(typeof opts.size==="object"){_ref=["width","height"];for(_i=0,_len=_ref.length;_i<_len;_i++){dim=_ref[_i];if(typeof opts.size[dim]==="string"){opts.size[dim]=this.dimensions[dim]*(parseInt(opts.size[dim],10)/100);}}}else if(opts.size==="number"){size=opts.size;opts.size={width:size,height:size};} +if(typeof opts.cornerRadius==="string"){opts.cornerRadius=(opts.size.width/2)*(parseInt(opts.cornerRadius,10)/100);} +opts.strength/=100;opts.size.width=Math.floor(opts.size.width);opts.size.height=Math.floor(opts.size.height);opts.image={width:this.dimensions.width,height:this.dimensions.height};if(opts.method==="colorize"&&typeof opts.color==="string"){opts.color=Convert.hexToRGB(opts.color);} +opts.coords={left:(this.dimensions.width-opts.size.width)/2,right:this.dimensions.width-opts.coords.left,bottom:(this.dimensions.height-opts.size.height)/2,top:this.dimensions.height-opts.coords.bottom};opts.corners=[{x:opts.coords.left+opts.cornerRadius,y:opts.coords.top-opts.cornerRadius},{x:opts.coords.right-opts.cornerRadius,y:opts.coords.top-opts.cornerRadius},{x:opts.coords.right-opts.cornerRadius,y:opts.coords.bottom+opts.cornerRadius},{x:opts.coords.left+opts.cornerRadius,y:opts.coords.bottom+opts.cornerRadius}];opts.maxDist=Calculate.distance(0,0,opts.corners[3].x,opts.corners[3].y)-opts.cornerRadius;return this.process("rectangularVignette",function(rgba){var amt,loc,radialDist;loc=this.locationXY();if((loc.x>opts.corners[0].x&&loc.xopts.coords.bottom&&loc.yopts.coords.left&&loc.xopts.corners[3].y&&loc.yopts.corners[0].x&&loc.xopts.coords.top){amt=(loc.y-opts.coords.top)/opts.maxDist;}else if(loc.y>opts.corners[2].y&&loc.yopts.coords.right){amt=(loc.x-opts.coords.right)/opts.maxDist;}else if(loc.x>opts.corners[0].x&&loc.xopts.corners[2].y&&loc.y=opts.corners[0].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[0].x,opts.corners[0].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x>=opts.corners[1].x&&loc.y>=opts.corners[1].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[1].x,opts.corners[1].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x>=opts.corners[2].x&&loc.y<=opts.corners[2].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[2].x,opts.corners[2].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x<=opts.corners[3].x&&loc.y<=opts.corners[3].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[3].x,opts.corners[3].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;} +if(amt<0){return rgba;} +return vignetteFilters[opts.method](rgba,amt,opts);});});(function(){var BlurStack,getLinearGradientMap,getRadialGradientMap,mul_table,shg_table;mul_table=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];shg_table=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];getLinearGradientMap=function(width,height,centerX,centerY,angle,length,mirrored){var cnv,context,gradient,x1,x2,y1,y2;cnv=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');cnv.width=width;cnv.height=height;x1=centerX+Math.cos(angle)*length*0.5;y1=centerY+Math.sin(angle)*length*0.5;x2=centerX-Math.cos(angle)*length*0.5;y2=centerY-Math.sin(angle)*length*0.5;context=cnv.getContext("2d");gradient=context.createLinearGradient(x1,y1,x2,y2);if(!mirrored){gradient.addColorStop(0,"white");gradient.addColorStop(1,"black");}else{gradient.addColorStop(0,"white");gradient.addColorStop(0.5,"black");gradient.addColorStop(1,"white");} +context.fillStyle=gradient;context.fillRect(0,0,width,height);return context.getImageData(0,0,width,height);};getRadialGradientMap=function(width,height,centerX,centerY,radius1,radius2){var cnv,context,gradient;cnv=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');cnv.width=width;cnv.height=height;context=cnv.getContext("2d");gradient=context.createRadialGradient(centerX,centerY,radius1,centerX,centerY,radius2);gradient.addColorStop(1,"white");gradient.addColorStop(0,"black");context.fillStyle=gradient;context.fillRect(0,0,width,height);return context.getImageData(0,0,width,height);};BlurStack=function(){this.r=0;this.g=0;this.b=0;this.a=0;return this.next=null;};Caman.Plugin.register("compoundBlur",function(radiusData,radius,increaseFactor,blurLevels){var b_in_sum,b_out_sum,b_sum,blend,currentIndex,div,g_in_sum,g_out_sum,g_sum,height,heightMinus1,i,iblend,idx,imagePixels,index,iradius,lookupValue,mul_sum,p,pb,pg,pixels,pr,r_in_sum,r_out_sum,r_sum,radiusPixels,radiusPlus1,rbs,shg_sum,stack,stackEnd,stackIn,stackOut,stackStart,steps,sumFactor,w4,wh,wh4,width,widthMinus1,x,y,yi,yp,yw,_i,_j,_k,_l,_m,_n,_o,_p,_q,_r;width=this.dimensions.width;height=this.dimensions.height;imagePixels=this.pixelData;radiusPixels=radiusData.data;wh=width*height;wh4=wh<<2;pixels=[];for(i=_i=0;0<=wh4?_iwh4;i=0<=wh4?++_i:--_i){pixels[i]=imagePixels[i];} +currentIndex=0;steps=blurLevels;blurLevels-=1;while(steps-->=0){iradius=(radius+0.5)|0;if(iradius===0){continue;} +if(iradius>256){iradius=256;} +div=iradius+iradius+1;w4=width<<2;widthMinus1=width-1;heightMinus1=height-1;radiusPlus1=iradius+1;sumFactor=radiusPlus1*(radiusPlus1+1)/2;stackStart=new BlurStack();stackEnd=void 0;stack=stackStart;for(i=_j=1;1<=div?_jdiv;i=1<=div?++_j:--_j){stack=stack.next=new BlurStack();if(i===radiusPlus1){stackEnd=stack;}} +stack.next=stackStart;stackIn=null;stackOut=null;yw=yi=0;mul_sum=mul_table[iradius];shg_sum=shg_table[iradius];for(y=_k=0;0<=height?_kheight;y=0<=height?++_k:--_k){r_in_sum=g_in_sum=b_in_sum=r_sum=g_sum=b_sum=0;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_l=0;0<=radiusPlus1?_lradiusPlus1;i=0<=radiusPlus1?++_l:--_l){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +for(i=_m=1;1<=radiusPlus1?_mradiusPlus1;i=1<=radiusPlus1?++_m:--_m){p=yi+((widthMinus1width;x=0<=width?++_n:--_n){pixels[yi]=(r_sum*mul_sum)>>shg_sum;pixels[yi+1]=(g_sum*mul_sum)>>shg_sum;pixels[yi+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(yw+((p=x+radiusPlus1)width;x=0<=width?++_o:--_o){g_in_sum=b_in_sum=r_in_sum=g_sum=b_sum=r_sum=0;yi=x<<2;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_p=0;0<=radiusPlus1?_pradiusPlus1;i=0<=radiusPlus1?++_p:--_p){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +yp=width;for(i=_q=1;1<=radiusPlus1?_qradiusPlus1;i=1<=radiusPlus1?++_q:--_q){yi=(yp+x)<<2;r_sum+=(stack.r=(pr=pixels[yi]))*(rbs=radiusPlus1-i);g_sum+=(stack.g=(pg=pixels[yi+1]))*rbs;b_sum+=(stack.b=(pb=pixels[yi+2]))*rbs;r_in_sum+=pr;g_in_sum+=pg;b_in_sum+=pb;stack=stack.next;if(iheight;y=0<=height?++_r:--_r){p=yi<<2;pixels[p]=(r_sum*mul_sum)>>shg_sum;pixels[p+1]=(g_sum*mul_sum)>>shg_sum;pixels[p+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(x+(((p=y+radiusPlus1)-1){idx=i<<2;lookupValue=(radiusPixels[idx+2]&0xff)/255.0*blurLevels;index=lookupValue|0;if(index===currentIndex){blend=256.0*(lookupValue-(lookupValue|0));iblend=256-blend;imagePixels[idx]=(imagePixels[idx]*iblend+pixels[idx]*blend)>>8;imagePixels[idx+1]=(imagePixels[idx+1]*iblend+pixels[idx+1]*blend)>>8;imagePixels[idx+2]=(imagePixels[idx+2]*iblend+pixels[idx+2]*blend)>>8;}else if(index===currentIndex+1){imagePixels[idx]=pixels[idx];imagePixels[idx+1]=pixels[idx+1];imagePixels[idx+2]=pixels[idx+2];}} +currentIndex++;} +return this;});Caman.Filter.register("tiltShift",function(opts){var defaults,gradient;defaults={center:{x:this.dimensions.width/2,y:this.dimensions.height/2},angle:45,focusWidth:200,startRadius:3,radiusFactor:1.5,steps:3};opts=Caman.Util.extend(defaults,opts);opts.angle*=Math.PI/180;gradient=getLinearGradientMap(this.dimensions.width,this.dimensions.height,opts.center.x,opts.center.y,opts.angle,opts.focusWidth,true);return this.processPlugin("compoundBlur",[gradient,opts.startRadius,opts.radiusFactor,opts.steps]);});return Caman.Filter.register("radialBlur",function(opts){var defaults,gradient,radius1,radius2;defaults={size:50,center:{x:this.dimensions.width/2,y:this.dimensions.height/2},startRadius:3,radiusFactor:1.5,steps:3,radius:null};opts=Caman.Util.extend(defaults,opts);if(!opts.radius){opts.radius=this.dimensions.widthdiv;i=1<=div?++_i:--_i){stack=stack.next=new BlurStack();if(i===radiusPlus1){stackEnd=stack;}} +stack.next=stackStart;stackIn=null;stackOut=null;yw=yi=0;mul_sum=mul_table[radius];shg_sum=shg_table[radius];for(y=_j=0;0<=height?_jheight;y=0<=height?++_j:--_j){r_in_sum=g_in_sum=b_in_sum=r_sum=g_sum=b_sum=0;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_k=0;0<=radiusPlus1?_kradiusPlus1;i=0<=radiusPlus1?++_k:--_k){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +for(i=_l=1;1<=radiusPlus1?_lradiusPlus1;i=1<=radiusPlus1?++_l:--_l){p=yi+((widthMinus1width;x=0<=width?++_m:--_m){pixels[yi]=(r_sum*mul_sum)>>shg_sum;pixels[yi+1]=(g_sum*mul_sum)>>shg_sum;pixels[yi+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(yw+((p=x+radius+1)width;x=0<=width?++_n:--_n){g_in_sum=b_in_sum=r_in_sum=g_sum=b_sum=r_sum=0;yi=x<<2;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_o=0;0<=radiusPlus1?_oradiusPlus1;i=0<=radiusPlus1?++_o:--_o){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} +yp=width;for(i=_p=1;1<=radius?_p<=radius:_p>=radius;i=1<=radius?++_p:--_p){yi=(yp+x)<<2;r_sum+=(stack.r=(pr=pixels[yi]))*(rbs=radiusPlus1-i);g_sum+=(stack.g=(pg=pixels[yi+1]))*rbs;b_sum+=(stack.b=(pb=pixels[yi+2]))*rbs;r_in_sum+=pr;g_in_sum+=pg;b_in_sum+=pb;stack=stack.next;if(iheight;y=0<=height?++_q:--_q){p=yi<<2;pixels[p]=(r_sum*mul_sum)>>shg_sum;pixels[p+1]=(g_sum*mul_sum)>>shg_sum;pixels[p+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(x+(((p=y+radiusPlus1) { + viewer.addTiledImage({ + tileSource: image.tileSource, + x: image.x, + y: image.y, + success: () => { + resolve(); + }, + error: (err) => { + reject(err); + }, + }); + }); +} + +fetch('image/image.txt') + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.text(); + }) + .then(text => { + const lines = text.split('\n'); + lines.forEach(line => { + if (!line.startsWith('#')) { + const parts = line.split(' '); + + const dictionary = { + imageCount: image_count, + tileSource: 'image/dzi/' + parts[0] + '/' + parts[0] + '.dzi', + x: parseInt(parts[1]), + y: parseInt(parts[2]), + red: parseInt(parts[3]), + blue: parseInt(parts[4]), + green: parseInt(parts[5]) + }; + + const promise = load_image(dictionary); + + dictionaries.push(dictionary); + imagePromises.push(promise); + image_count++; + } + }); + return Promise.all(imagePromises); + }) + .then(() => { + let all_filters = [] + let all_nav_filters = [] + dictionaries.forEach(image => { + let filter = { + items: viewer.world.getItemAt(image.imageCount), + processors: [ + function (context, callback) { + Caman(context.canvas, function () { + this.colorize(image.red, image.green, image.blue, 50); + this.render(callback); + }); + } + // }, + // function (context, callback) { + // Caman(context.canvas, function () { + // this.contrast(10); + // this.render(callback); + // }); + // } + ] + } + + let nav_filter = { + items: viewer.navigator.world.getItemAt(image.imageCount), + processors: [ + function (context, callback) { + Caman(context.canvas, function () { + this.colorize(image.red, image.green, image.blue, 50); + this.render(callback); + }); + } + ] + } + + all_filters.push(filter) + all_nav_filters.push(nav_filter) + }); + + + viewer.navigator.setFilterOptions = viewer.setFilterOptions; + + viewer.setFilterOptions({ + filters: all_filters + }); + + viewer.navigator.setFilterOptions({ + filters: all_nav_filters + }); + + + + }) + .catch(error => { + console.error('Error:', error); + }); \ No newline at end of file diff --git a/script/live.js b/script/live.js new file mode 100644 index 0000000..3fac3db --- /dev/null +++ b/script/live.js @@ -0,0 +1,11 @@ +const clientCountElement = document.getElementById('clientCount'); +const socket = new WebSocket('wss://sketchersunitedcollab.com/funsocket'); + +socket.addEventListener('message', (event) => { + const clientCount = parseInt(event.data); + let append = " people" + if (clientCount === 1) { + append = " person" + } + clientCountElement.textContent = clientCount.toString() + append; +}); diff --git a/script/modal.js b/script/modal.js new file mode 100644 index 0000000..7186c13 --- /dev/null +++ b/script/modal.js @@ -0,0 +1,31 @@ +const modalOverlay = document.getElementById("modal-overlay"); +const modal = document.getElementById("modal"); +const openModalBtn = document.getElementById("open-button"); +const closeModalBtn = document.getElementById("close-button"); + +openModalBtn.addEventListener("click", function () { + modal.style.display = "block"; + modalOverlay.style.display = "block"; + + setTimeout(() => { + modal.style.opacity = "100"; + }, 10); +}); + +closeModalBtn.addEventListener("click", function () { + modal.style.display = "none"; + modalOverlay.style.display = "none"; + + setTimeout(() => { + modal.style.opacity = "100"; + }, 300); +}); + +modalOverlay.addEventListener("click", function () { + modal.style.display = "none"; + modalOverlay.style.display = "none"; + + setTimeout(() => { + modal.style.opacity = "0"; + }, 300); +}); diff --git a/script/openseadragon/LICENSE.txt b/script/openseadragon/LICENSE.txt new file mode 100644 index 0000000..4de9c76 --- /dev/null +++ b/script/openseadragon/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright (C) 2009 CodePlex Foundation +Copyright (C) 2010-2022 OpenSeadragon contributors + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +- Neither the name of CodePlex Foundation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/script/openseadragon/annotorious-openseadragon.umd.js.map b/script/openseadragon/annotorious-openseadragon.umd.js.map new file mode 100644 index 0000000..1ef8667 --- /dev/null +++ b/script/openseadragon/annotorious-openseadragon.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"annotorious-openseadragon.umd.js","sources":["../node_modules/preact/dist/preact.module.js","../node_modules/preact/hooks/dist/hooks.module.js","../node_modules/preact/compat/dist/compat.module.js","../node_modules/tiny-emitter/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/clsx/dist/clsx.m.js","../node_modules/react-draggable/build/cjs/utils/shims.js","../node_modules/react-draggable/build/cjs/utils/getPrefix.js","../node_modules/react-draggable/build/cjs/utils/domFns.js","../node_modules/react-draggable/build/cjs/utils/positionFns.js","../node_modules/react-draggable/build/cjs/utils/log.js","../node_modules/react-draggable/build/cjs/DraggableCore.js","../node_modules/react-draggable/build/cjs/Draggable.js","../node_modules/react-draggable/build/cjs/cjs.js","../node_modules/timeago.js/esm/lang/en_US.js","../node_modules/timeago.js/esm/lang/zh_CN.js","../node_modules/timeago.js/esm/register.js","../node_modules/timeago.js/esm/utils/date.js","../node_modules/timeago.js/esm/format.js","../node_modules/timeago.js/esm/utils/dom.js","../node_modules/timeago.js/esm/realtime.js","../node_modules/timeago.js/esm/index.js","../node_modules/timeago-react/esm/timeago-react.js","../node_modules/@recogito/recogito-client-core/src/editor/useClickOutside.js","../node_modules/object-keys/isArguments.js","../node_modules/object-keys/implementation.js","../node_modules/object-keys/index.js","../node_modules/has-symbols/shams.js","../node_modules/has-symbols/index.js","../node_modules/has-proto/index.js","../node_modules/function-bind/implementation.js","../node_modules/function-bind/index.js","../node_modules/has/src/index.js","../node_modules/get-intrinsic/index.js","../node_modules/has-property-descriptors/index.js","../node_modules/define-properties/index.js","../node_modules/call-bind/index.js","../node_modules/call-bind/callBound.js","../node_modules/es-abstract/5/CheckObjectCoercible.js","../node_modules/es-abstract/2022/RequireObjectCoercible.js","../node_modules/es-abstract/helpers/IsArray.js","../node_modules/es-abstract/2022/IsArray.js","../node_modules/es-abstract/2022/Call.js","../__vite-browser-external","../node_modules/object-inspect/index.js","../node_modules/es-abstract/2022/IsPropertyKey.js","../node_modules/es-abstract/5/Type.js","../node_modules/es-abstract/2022/Type.js","../node_modules/es-abstract/2022/Get.js","../node_modules/es-abstract/2022/HasProperty.js","../node_modules/is-callable/index.js","../node_modules/es-abstract/2022/IsCallable.js","../node_modules/es-abstract/helpers/maxSafeInteger.js","../node_modules/es-abstract/2022/abs.js","../node_modules/es-abstract/2022/floor.js","../node_modules/es-abstract/helpers/isPrimitive.js","../node_modules/es-to-primitive/helpers/isPrimitive.js","../node_modules/has-tostringtag/shams.js","../node_modules/is-date-object/index.js","../node_modules/is-symbol/index.js","../node_modules/es-to-primitive/es2015.js","../node_modules/es-abstract/2022/ToPrimitive.js","../node_modules/is-regex/index.js","../node_modules/safe-regex-test/index.js","../node_modules/es-abstract/2022/ToString.js","../node_modules/string.prototype.trim/implementation.js","../node_modules/string.prototype.trim/polyfill.js","../node_modules/string.prototype.trim/shim.js","../node_modules/string.prototype.trim/index.js","../node_modules/es-abstract/2022/StringToNumber.js","../node_modules/es-abstract/2022/ToNumber.js","../node_modules/es-abstract/helpers/isNaN.js","../node_modules/es-abstract/helpers/isFinite.js","../node_modules/es-abstract/helpers/sign.js","../node_modules/es-abstract/2022/ToIntegerOrInfinity.js","../node_modules/es-abstract/2022/ToLength.js","../node_modules/es-abstract/2022/LengthOfArrayLike.js","../node_modules/es-abstract/2022/ToObject.js","../node_modules/is-string/index.js","../node_modules/array.prototype.foreach/implementation.js","../node_modules/es-array-method-boxes-properly/index.js","../node_modules/array.prototype.foreach/polyfill.js","../node_modules/array.prototype.foreach/shim.js","../node_modules/array.prototype.foreach/index.js","../node_modules/object.entries/implementation.js","../node_modules/object.entries/polyfill.js","../node_modules/object.entries/shim.js","../node_modules/object.entries/index.js","../node_modules/node-polyglot/index.js","../node_modules/timeago.js/lib/lang/ar.js","../node_modules/timeago.js/lib/lang/cs.js","../node_modules/timeago.js/lib/lang/de.js","../node_modules/timeago.js/lib/lang/el.js","../node_modules/timeago.js/lib/lang/es.js","../node_modules/timeago.js/lib/lang/fi.js","../node_modules/timeago.js/lib/lang/fr.js","../node_modules/timeago.js/lib/lang/gl.js","../node_modules/timeago.js/lib/lang/hi_IN.js","../node_modules/timeago.js/lib/lang/it.js","../node_modules/timeago.js/lib/lang/ja.js","../node_modules/timeago.js/lib/lang/ko.js","../node_modules/timeago.js/lib/lang/nl.js","../node_modules/timeago.js/lib/lang/pt_BR.js","../node_modules/timeago.js/lib/lang/ru.js","../node_modules/timeago.js/lib/lang/sv.js","../node_modules/timeago.js/lib/lang/th.js","../node_modules/timeago.js/lib/lang/tr.js","../node_modules/timeago.js/lib/lang/zh_CN.js","../node_modules/timeago.js/lib/lang/zh_TW.js","../node_modules/@recogito/recogito-client-core/src/i18n/index.jsx","../node_modules/@recogito/recogito-client-core/src/editor/widgets/comment/DropdownMenu.jsx","../node_modules/autosize/dist/autosize.js","../node_modules/computed-style/dist/computedStyle.commonjs.js","../node_modules/line-height/lib/line-height.js","../node_modules/react-autosize-textarea/lib/TextareaAutosize.js","../node_modules/react-autosize-textarea/lib/index.js","../node_modules/@recogito/recogito-client-core/src/editor/widgets/comment/TextEntryField.jsx","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@emotion/sheet/dist/emotion-sheet.browser.esm.js","../node_modules/stylis/src/Enum.js","../node_modules/stylis/src/Utility.js","../node_modules/stylis/src/Tokenizer.js","../node_modules/stylis/src/Parser.js","../node_modules/stylis/src/Serializer.js","../node_modules/stylis/src/Middleware.js","../node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","../node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/index.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js","../node_modules/@emotion/hash/dist/emotion-hash.esm.js","../node_modules/@emotion/unitless/dist/emotion-unitless.esm.js","../node_modules/@emotion/serialize/dist/emotion-serialize.browser.esm.js","../node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js","../node_modules/@emotion/react/dist/emotion-element-c39617d8.browser.esm.js","../node_modules/@emotion/react/dist/emotion-react.browser.esm.js","../node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/react-input-autosize/lib/AutosizeInput.js","../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../node_modules/@babel/runtime/helpers/esm/createClass.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/inherits.js","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/react-select/dist/index-4bd03571.esm.js","../node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../node_modules/memoize-one/dist/memoize-one.esm.js","../node_modules/react-select/dist/Select-dbb12e54.esm.js","../node_modules/react-select/dist/stateManager-845a3300.esm.js","../node_modules/react-select/dist/react-select.esm.js","../node_modules/@recogito/recogito-client-core/src/editor/widgets/comment/PurposeSelect.jsx","../node_modules/@recogito/recogito-client-core/src/Icons.jsx","../node_modules/@recogito/recogito-client-core/src/editor/widgets/comment/Comment.jsx","../node_modules/@recogito/recogito-client-core/src/editor/widgets/comment/CommentWidget.jsx","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/dom-helpers/esm/hasClass.js","../node_modules/dom-helpers/esm/addClass.js","../node_modules/dom-helpers/esm/removeClass.js","../node_modules/react-transition-group/esm/config.js","../node_modules/react-transition-group/esm/TransitionGroupContext.js","../node_modules/react-transition-group/esm/utils/reflow.js","../node_modules/react-transition-group/esm/Transition.js","../node_modules/react-transition-group/esm/CSSTransition.js","../node_modules/@recogito/recogito-client-core/src/editor/widgets/Autocomplete.jsx","../node_modules/@recogito/recogito-client-core/src/editor/widgets/tag/TagWidget.jsx","../node_modules/@recogito/recogito-client-core/src/editor/widgets/WrappedWidget.jsx","../node_modules/@recogito/recogito-client-core/src/editor/widgets/index.jsx","../node_modules/@recogito/recogito-client-core/src/editor/setPosition.js","../node_modules/@recogito/recogito-client-core/src/editor/Editor.jsx","../node_modules/uuid/dist/esm-browser/rng.js","../node_modules/uuid/dist/esm-browser/regex.js","../node_modules/uuid/dist/esm-browser/validate.js","../node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/uuid/dist/esm-browser/v4.js","../node_modules/fast-deep-equal/index.js","../node_modules/@recogito/recogito-client-core/src/WebAnnotation.js","../node_modules/@recogito/recogito-client-core/src/Selection.js","../node_modules/@recogito/recogito-client-core/src/Environment.js","../node_modules/@recogito/recogito-client-core/src/utils/index.js","../node_modules/openseadragon/build/openseadragon/openseadragon.js","../node_modules/@recogito/annotorious/src/util/SVG.js","../node_modules/@recogito/annotorious/src/selectors/RectFragment.js","../node_modules/@recogito/annotorious/src/tools/rectangle/RubberbandRect.js","../node_modules/@recogito/annotorious/src/util/Touch.js","../node_modules/@recogito/annotorious/src/tools/Tool.js","../node_modules/@recogito/annotorious/src/tools/EditableShape.js","../node_modules/@recogito/annotorious/src/util/Formatting.js","../node_modules/@recogito/annotorious/src/tools/rectangle/EditableRect.js","../node_modules/@recogito/annotorious/src/tools/rectangle/RubberbandRectTool.js","../node_modules/@recogito/annotorious/src/util/Geom2D.js","../node_modules/@recogito/annotorious/src/selectors/EmbeddedSVG.js","../node_modules/@recogito/annotorious/src/tools/polygon/PolygonMask.js","../node_modules/@recogito/annotorious/src/tools/polygon/RubberbandPolygon.js","../node_modules/@recogito/annotorious/src/tools/polygon/EditablePolygon.js","../node_modules/@recogito/annotorious/src/tools/polygon/RubberbandPolygonTool.js","../node_modules/@recogito/annotorious/src/tools/ToolsRegistry.js","../node_modules/@recogito/annotorious/src/selectors/index.js","../src/OSDCrosshair.js","../node_modules/quickselect/index.js","../node_modules/rbush/index.js","../src/AnnotationStore.js","../src/util/ImageSnippet.js","../src/OSDAnnotationLayer.js","../src/gigapixel/index.js","../src/gigapixel/GigapixelAnnotationLayer.js","../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../src/OpenSeadragonAnnotator.jsx","../src/index.jsx"],"sourcesContent":["var n,l,u,i,t,r,o,f,e={},c=[],s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function a(n,l){for(var u in l)n[u]=l[u];return n}function h(n){var l=n.parentNode;l&&l.removeChild(n)}function v(l,u,i){var t,r,o,f={};for(o in u)\"key\"==o?t=u[o]:\"ref\"==o?r=u[o]:f[o]=u[o];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===f[o]&&(f[o]=l.defaultProps[o]);return y(l,f,t,r,null)}function y(n,i,t,r,o){var f={type:n,props:i,key:t,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++u:o};return null==o&&null!=l.vnode&&l.vnode(f),f}function p(){return{current:null}}function d(n){return n.children}function _(n,l){this.props=n,this.context=l}function k(n,l){if(null==l)return n.__?k(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l0?y(_.type,_.props,_.key,null,_.__v):_)){if(_.__=u,_.__b=u.__b+1,null===(p=w[h])||p&&_.key==p.key&&_.type===p.type)w[h]=void 0;else for(v=0;v2&&(f.children=arguments.length>3?n.call(arguments,2):i),y(l.type,f,t||l.key,r||l.ref,null)}function D(n,l){var u={__c:l=\"__cC\"+f++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(m)},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=c.slice,l={__e:function(n,l){for(var u,i,t;l=l.__;)if((u=l.__c)&&!u.__)try{if((i=u.constructor)&&null!=i.getDerivedStateFromError&&(u.setState(i.getDerivedStateFromError(n)),t=u.__d),null!=u.componentDidCatch&&(u.componentDidCatch(n),t=u.__d),t)return u.__E=u}catch(l){n=l}throw n}},u=0,i=function(n){return null!=n&&void 0===n.constructor},_.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=a({},this.state),\"function\"==typeof n&&(n=n(a({},u),this.props)),n&&a(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),m(this))},_.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),m(this))},_.prototype.render=d,t=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,g.__r=0,f=0;export{S as render,q as hydrate,v as createElement,v as h,d as Fragment,p as createRef,i as isValidElement,_ as Component,B as cloneElement,D as createContext,A as toChildArray,l as options};\n//# sourceMappingURL=preact.module.js.map\n","import{options as n}from\"preact\";var t,u,r,o=0,i=[],c=n.__b,f=n.__r,e=n.diffed,a=n.__c,v=n.unmount;function m(t,r){n.__h&&n.__h(u,t,o||r),o=0;var i=u.__H||(u.__H={__:[],__h:[]});return t>=i.__.length&&i.__.push({}),i.__[t]}function l(n){return o=1,p(w,n)}function p(n,r,o){var i=m(t++,2);return i.t=n,i.__c||(i.__=[o?o(r):w(void 0,r),function(n){var t=i.t(i.__[0],n);i.__[0]!==t&&(i.__=[t,i.__[1]],i.__c.setState({}))}],i.__c=u),i.__}function y(r,o){var i=m(t++,3);!n.__s&&k(i.__H,o)&&(i.__=r,i.__H=o,u.__H.__h.push(i))}function h(r,o){var i=m(t++,4);!n.__s&&k(i.__H,o)&&(i.__=r,i.__H=o,u.__h.push(i))}function s(n){return o=5,d(function(){return{current:n}},[])}function _(n,t,u){o=6,h(function(){\"function\"==typeof n?n(t()):n&&(n.current=t())},null==u?u:u.concat(n))}function d(n,u){var r=m(t++,7);return k(r.__H,u)&&(r.__=n(),r.__H=u,r.__h=n),r.__}function A(n,t){return o=8,d(function(){return n},t)}function F(n){var r=u.context[n.__c],o=m(t++,9);return o.c=n,r?(null==o.__&&(o.__=!0,r.sub(u)),r.props.value):n.__}function T(t,u){n.useDebugValue&&n.useDebugValue(u?u(t):t)}function q(n){var r=m(t++,10),o=l();return r.__=n,u.componentDidCatch||(u.componentDidCatch=function(n){r.__&&r.__(n),o[1](n)}),[o[0],function(){o[1](void 0)}]}function x(){var t;for(i.sort(function(n,t){return n.__v.__b-t.__v.__b});t=i.pop();)if(t.__P)try{t.__H.__h.forEach(g),t.__H.__h.forEach(j),t.__H.__h=[]}catch(u){t.__H.__h=[],n.__e(u,t.__v)}}n.__b=function(n){u=null,c&&c(n)},n.__r=function(n){f&&f(n),t=0;var r=(u=n.__c).__H;r&&(r.__h.forEach(g),r.__h.forEach(j),r.__h=[])},n.diffed=function(t){e&&e(t);var o=t.__c;o&&o.__H&&o.__H.__h.length&&(1!==i.push(o)&&r===n.requestAnimationFrame||((r=n.requestAnimationFrame)||function(n){var t,u=function(){clearTimeout(r),b&&cancelAnimationFrame(t),setTimeout(n)},r=setTimeout(u,100);b&&(t=requestAnimationFrame(u))})(x)),u=null},n.__c=function(t,u){u.some(function(t){try{t.__h.forEach(g),t.__h=t.__h.filter(function(n){return!n.__||j(n)})}catch(r){u.some(function(n){n.__h&&(n.__h=[])}),u=[],n.__e(r,t.__v)}}),a&&a(t,u)},n.unmount=function(t){v&&v(t);var u,r=t.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{g(n)}catch(n){u=n}}),u&&n.__e(u,r.__v))};var b=\"function\"==typeof requestAnimationFrame;function g(n){var t=u,r=n.__c;\"function\"==typeof r&&(n.__c=void 0,r()),u=t}function j(n){var t=u;n.__c=n.__(),u=t}function k(n,t){return!n||n.length!==t.length||t.some(function(t,u){return t!==n[u]})}function w(n,t){return\"function\"==typeof t?t(n):t}export{l as useState,p as useReducer,y as useEffect,h as useLayoutEffect,s as useRef,_ as useImperativeHandle,d as useMemo,A as useCallback,F as useContext,T as useDebugValue,q as useErrorBoundary};\n//# sourceMappingURL=hooks.module.js.map\n","import{useState as n,useReducer as t,useEffect as e,useLayoutEffect as r,useRef as u,useImperativeHandle as o,useMemo as i,useCallback as l,useContext as c,useDebugValue as f}from\"preact/hooks\";export*from\"preact/hooks\";import{Component as a,createElement as s,options as h,toChildArray as d,Fragment as v,render as p,hydrate as m,cloneElement as y,createRef as b,createContext as _}from\"preact\";export{createElement,createContext,createRef,Fragment,Component}from\"preact\";function S(n,t){for(var e in t)n[e]=t[e];return n}function C(n,t){for(var e in n)if(\"__source\"!==e&&!(e in t))return!0;for(var r in t)if(\"__source\"!==r&&n[r]!==t[r])return!0;return!1}function E(n){this.props=n}function g(n,t){function e(n){var e=this.props.ref,r=e==n.ref;return!r&&e&&(e.call?e(null):e.current=null),t?!t(this.props,n)||!r:C(this.props,n)}function r(t){return this.shouldComponentUpdate=e,s(n,t)}return r.displayName=\"Memo(\"+(n.displayName||n.name)+\")\",r.prototype.isReactComponent=!0,r.__f=!0,r}(E.prototype=new a).isPureReactComponent=!0,E.prototype.shouldComponentUpdate=function(n,t){return C(this.props,n)||C(this.state,t)};var w=h.__b;h.__b=function(n){n.type&&n.type.__f&&n.ref&&(n.props.ref=n.ref,n.ref=null),w&&w(n)};var R=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.forward_ref\")||3911;function x(n){function t(t,e){var r=S({},t);return delete r.ref,n(r,(e=t.ref||e)&&(\"object\"!=typeof e||\"current\"in e)?e:null)}return t.$$typeof=R,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName=\"ForwardRef(\"+(n.displayName||n.name)+\")\",t}var N=function(n,t){return null==n?null:d(d(n).map(t))},k={map:N,forEach:N,count:function(n){return n?d(n).length:0},only:function(n){var t=d(n);if(1!==t.length)throw\"Children.only\";return t[0]},toArray:d},A=h.__e;h.__e=function(n,t,e){if(n.then)for(var r,u=t;u=u.__;)if((r=u.__c)&&r.__c)return null==t.__e&&(t.__e=e.__e,t.__k=e.__k),r.__c(n,t);A(n,t,e)};var O=h.unmount;function L(){this.__u=0,this.t=null,this.__b=null}function U(n){var t=n.__.__c;return t&&t.__e&&t.__e(n)}function F(n){var t,e,r;function u(u){if(t||(t=n()).then(function(n){e=n.default||n},function(n){r=n}),r)throw r;if(!e)throw t;return s(e,u)}return u.displayName=\"Lazy\",u.__f=!0,u}function M(){this.u=null,this.o=null}h.unmount=function(n){var t=n.__c;t&&t.__R&&t.__R(),t&&!0===n.__h&&(n.type=null),O&&O(n)},(L.prototype=new a).__c=function(n,t){var e=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(e);var u=U(r.__v),o=!1,i=function(){o||(o=!0,e.__R=null,u?u(l):l())};e.__R=i;var l=function(){if(!--r.__u){if(r.state.__e){var n=r.state.__e;r.__v.__k[0]=function n(t,e,r){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map(function(t){return n(t,e,r)}),t.__c&&t.__c.__P===e&&(t.__e&&r.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=r)),t}(n,n.__c.__P,n.__c.__O)}var t;for(r.setState({__e:r.__b=null});t=r.t.pop();)t.forceUpdate()}},c=!0===t.__h;r.__u++||c||r.setState({__e:r.__b=r.__v.__k[0]}),n.then(i,i)},L.prototype.componentWillUnmount=function(){this.t=[]},L.prototype.render=function(n,t){if(this.__b){if(this.__v.__k){var e=document.createElement(\"div\"),r=this.__v.__k[0].__c;this.__v.__k[0]=function n(t,e,r){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach(function(n){\"function\"==typeof n.__c&&n.__c()}),t.__c.__H=null),null!=(t=S({},t)).__c&&(t.__c.__P===r&&(t.__c.__P=e),t.__c=null),t.__k=t.__k&&t.__k.map(function(t){return n(t,e,r)})),t}(this.__b,e,r.__O=r.__P)}this.__b=null}var u=t.__e&&s(v,null,n.fallback);return u&&(u.__h=null),[s(v,null,t.__e?null:n.children),u]};var T=function(n,t,e){if(++e[1]===e[0]&&n.o.delete(t),n.props.revealOrder&&(\"t\"!==n.props.revealOrder[0]||!n.o.size))for(e=n.u;e;){for(;e.length>3;)e.pop()();if(e[1]>>1,1),t.i.removeChild(n)}}),p(s(D,{context:t.context},n.__v),t.l)):t.l&&t.componentWillUnmount()}function W(n,t){return s(I,{__v:n,i:t})}(M.prototype=new a).__e=function(n){var t=this,e=U(t.__v),r=t.o.get(n);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),T(t,n,r)):u()};e?e(o):o()}},M.prototype.render=function(n){this.u=null,this.o=new Map;var t=d(n.children);n.revealOrder&&\"b\"===n.revealOrder[0]&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return n.children},M.prototype.componentDidUpdate=M.prototype.componentDidMount=function(){var n=this;this.o.forEach(function(t,e){T(n,e,t)})};var j=\"undefined\"!=typeof Symbol&&Symbol.for&&Symbol.for(\"react.element\")||60103,P=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,V=\"undefined\"!=typeof document,z=function(n){return(\"undefined\"!=typeof Symbol&&\"symbol\"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(n)};function B(n,t,e){return null==t.__k&&(t.textContent=\"\"),p(n,t),\"function\"==typeof e&&e(),n?n.__c:null}function $(n,t,e){return m(n,t),\"function\"==typeof e&&e(),n?n.__c:null}a.prototype.isReactComponent={},[\"componentWillMount\",\"componentWillReceiveProps\",\"componentWillUpdate\"].forEach(function(n){Object.defineProperty(a.prototype,n,{configurable:!0,get:function(){return this[\"UNSAFE_\"+n]},set:function(t){Object.defineProperty(this,n,{configurable:!0,writable:!0,value:t})}})});var H=h.event;function Z(){}function Y(){return this.cancelBubble}function q(){return this.defaultPrevented}h.event=function(n){return H&&(n=H(n)),n.persist=Z,n.isPropagationStopped=Y,n.isDefaultPrevented=q,n.nativeEvent=n};var G,J={configurable:!0,get:function(){return this.class}},K=h.vnode;h.vnode=function(n){var t=n.type,e=n.props,r=e;if(\"string\"==typeof t){var u=-1===t.indexOf(\"-\");for(var o in r={},e){var i=e[o];V&&\"children\"===o&&\"noscript\"===t||\"value\"===o&&\"defaultValue\"in e&&null==i||(\"defaultValue\"===o&&\"value\"in e&&null==e.value?o=\"value\":\"download\"===o&&!0===i?i=\"\":/ondoubleclick/i.test(o)?o=\"ondblclick\":/^onchange(textarea|input)/i.test(o+t)&&!z(e.type)?o=\"oninput\":/^onfocus$/i.test(o)?o=\"onfocusin\":/^onblur$/i.test(o)?o=\"onfocusout\":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():u&&P.test(o)?o=o.replace(/[A-Z0-9]/,\"-$&\").toLowerCase():null===i&&(i=void 0),r[o]=i)}\"select\"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=d(e.children).forEach(function(n){n.props.selected=-1!=r.value.indexOf(n.props.value)})),\"select\"==t&&null!=r.defaultValue&&(r.value=d(e.children).forEach(function(n){n.props.selected=r.multiple?-1!=r.defaultValue.indexOf(n.props.value):r.defaultValue==n.props.value})),n.props=r,e.class!=e.className&&(J.enumerable=\"className\"in e,null!=e.className&&(r.class=e.className),Object.defineProperty(r,\"className\",J))}n.$$typeof=j,K&&K(n)};var Q=h.__r;h.__r=function(n){Q&&Q(n),G=n.__c};var X={ReactCurrentDispatcher:{current:{readContext:function(n){return G.__n[n.__c].props.value}}}},nn=\"17.0.2\";function tn(n){return s.bind(null,n)}function en(n){return!!n&&n.$$typeof===j}function rn(n){return en(n)?y.apply(null,arguments):n}function un(n){return!!n.__k&&(p(null,n),!0)}function on(n){return n&&(n.base||1===n.nodeType&&n)||null}var ln=function(n,t){return n(t)},cn=function(n,t){return n(t)},fn=v;export default{useState:n,useReducer:t,useEffect:e,useLayoutEffect:r,useRef:u,useImperativeHandle:o,useMemo:i,useCallback:l,useContext:c,useDebugValue:f,version:\"17.0.2\",Children:k,render:B,hydrate:$,unmountComponentAtNode:un,createPortal:W,createElement:s,createContext:_,createFactory:tn,cloneElement:rn,createRef:b,Fragment:v,isValidElement:en,findDOMNode:on,Component:a,PureComponent:E,memo:g,forwardRef:x,flushSync:cn,unstable_batchedUpdates:ln,StrictMode:v,Suspense:L,SuspenseList:M,lazy:F,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:X};export{nn as version,k as Children,B as render,$ as hydrate,un as unmountComponentAtNode,W as createPortal,tn as createFactory,rn as cloneElement,en as isValidElement,on as findDOMNode,E as PureComponent,g as memo,x as forwardRef,cn as flushSync,ln as unstable_batchedUpdates,fn as StrictMode,L as Suspense,M as SuspenseList,F as lazy,X as __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED};\n//# sourceMappingURL=compat.module.js.map\n","function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t | TouchList*/\n, callback\n/*: Function*/\n)\n/*: any*/\n{\n for (var i = 0, length = array.length; i < length; i++) {\n if (callback.apply(callback, [array[i], i, array])) return array[i];\n }\n}\n\nfunction isFunction(func\n/*: any*/\n)\n/*: boolean %checks*/\n{\n // $FlowIgnore[method-unbinding]\n return typeof func === 'function' || Object.prototype.toString.call(func) === '[object Function]';\n}\n\nfunction isNum(num\n/*: any*/\n)\n/*: boolean %checks*/\n{\n return typeof num === 'number' && !isNaN(num);\n}\n\nfunction int(a\n/*: string*/\n)\n/*: number*/\n{\n return parseInt(a, 10);\n}\n\nfunction dontSetMe(props\n/*: Object*/\n, propName\n/*: string*/\n, componentName\n/*: string*/\n)\n/*: ?Error*/\n{\n if (props[propName]) {\n return new Error(\"Invalid prop \".concat(propName, \" passed to \").concat(componentName, \" - do not set this, set it on the child.\"));\n }\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.browserPrefixToKey = browserPrefixToKey;\nexports.browserPrefixToStyle = browserPrefixToStyle;\nexports.default = void 0;\nexports.getPrefix = getPrefix;\nvar prefixes = ['Moz', 'Webkit', 'O', 'ms'];\n\nfunction getPrefix()\n/*: string*/\n{\n var _window$document, _window$document$docu;\n\n var prop\n /*: string*/\n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'transform';\n // Ensure we're running in an environment where there is actually a global\n // `window` obj\n if (typeof window === 'undefined') return ''; // If we're in a pseudo-browser server-side environment, this access\n // path may not exist, so bail out if it doesn't.\n\n var style = (_window$document = window.document) === null || _window$document === void 0 ? void 0 : (_window$document$docu = _window$document.documentElement) === null || _window$document$docu === void 0 ? void 0 : _window$document$docu.style;\n if (!style) return '';\n if (prop in style) return '';\n\n for (var i = 0; i < prefixes.length; i++) {\n if (browserPrefixToKey(prop, prefixes[i]) in style) return prefixes[i];\n }\n\n return '';\n}\n\nfunction browserPrefixToKey(prop\n/*: string*/\n, prefix\n/*: string*/\n)\n/*: string*/\n{\n return prefix ? \"\".concat(prefix).concat(kebabToTitleCase(prop)) : prop;\n}\n\nfunction browserPrefixToStyle(prop\n/*: string*/\n, prefix\n/*: string*/\n)\n/*: string*/\n{\n return prefix ? \"-\".concat(prefix.toLowerCase(), \"-\").concat(prop) : prop;\n}\n\nfunction kebabToTitleCase(str\n/*: string*/\n)\n/*: string*/\n{\n var out = '';\n var shouldCapitalize = true;\n\n for (var i = 0; i < str.length; i++) {\n if (shouldCapitalize) {\n out += str[i].toUpperCase();\n shouldCapitalize = false;\n } else if (str[i] === '-') {\n shouldCapitalize = true;\n } else {\n out += str[i];\n }\n }\n\n return out;\n} // Default export is the prefix itself, like 'Moz', 'Webkit', etc\n// Note that you may have to re-test for certain things; for instance, Chrome 50\n// can handle unprefixed `transform`, but not unprefixed `user-select`\n\n\nvar _default = (getPrefix()\n/*: string*/\n);\n\nexports.default = _default;","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addClassName = addClassName;\nexports.addEvent = addEvent;\nexports.addUserSelectStyles = addUserSelectStyles;\nexports.createCSSTransform = createCSSTransform;\nexports.createSVGTransform = createSVGTransform;\nexports.getTouch = getTouch;\nexports.getTouchIdentifier = getTouchIdentifier;\nexports.getTranslation = getTranslation;\nexports.innerHeight = innerHeight;\nexports.innerWidth = innerWidth;\nexports.matchesSelector = matchesSelector;\nexports.matchesSelectorAndParentsTo = matchesSelectorAndParentsTo;\nexports.offsetXYFromParent = offsetXYFromParent;\nexports.outerHeight = outerHeight;\nexports.outerWidth = outerWidth;\nexports.removeClassName = removeClassName;\nexports.removeEvent = removeEvent;\nexports.removeUserSelectStyles = removeUserSelectStyles;\n\nvar _shims = require(\"./shims\");\n\nvar _getPrefix = _interopRequireWildcard(require(\"./getPrefix\"));\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar matchesSelectorFunc = '';\n\nfunction matchesSelector(el\n/*: Node*/\n, selector\n/*: string*/\n)\n/*: boolean*/\n{\n if (!matchesSelectorFunc) {\n matchesSelectorFunc = (0, _shims.findInArray)(['matches', 'webkitMatchesSelector', 'mozMatchesSelector', 'msMatchesSelector', 'oMatchesSelector'], function (method) {\n // $FlowIgnore: Doesn't think elements are indexable\n return (0, _shims.isFunction)(el[method]);\n });\n } // Might not be found entirely (not an Element?) - in that case, bail\n // $FlowIgnore: Doesn't think elements are indexable\n\n\n if (!(0, _shims.isFunction)(el[matchesSelectorFunc])) return false; // $FlowIgnore: Doesn't think elements are indexable\n\n return el[matchesSelectorFunc](selector);\n} // Works up the tree to the draggable itself attempting to match selector.\n\n\nfunction matchesSelectorAndParentsTo(el\n/*: Node*/\n, selector\n/*: string*/\n, baseNode\n/*: Node*/\n)\n/*: boolean*/\n{\n var node = el;\n\n do {\n if (matchesSelector(node, selector)) return true;\n if (node === baseNode) return false;\n node = node.parentNode;\n } while (node);\n\n return false;\n}\n\nfunction addEvent(el\n/*: ?Node*/\n, event\n/*: string*/\n, handler\n/*: Function*/\n, inputOptions\n/*: Object*/\n)\n/*: void*/\n{\n if (!el) return;\n\n var options = _objectSpread({\n capture: true\n }, inputOptions); // $FlowIgnore[method-unbinding]\n\n\n if (el.addEventListener) {\n el.addEventListener(event, handler, options);\n } else if (el.attachEvent) {\n el.attachEvent('on' + event, handler);\n } else {\n // $FlowIgnore: Doesn't think elements are indexable\n el['on' + event] = handler;\n }\n}\n\nfunction removeEvent(el\n/*: ?Node*/\n, event\n/*: string*/\n, handler\n/*: Function*/\n, inputOptions\n/*: Object*/\n)\n/*: void*/\n{\n if (!el) return;\n\n var options = _objectSpread({\n capture: true\n }, inputOptions); // $FlowIgnore[method-unbinding]\n\n\n if (el.removeEventListener) {\n el.removeEventListener(event, handler, options);\n } else if (el.detachEvent) {\n el.detachEvent('on' + event, handler);\n } else {\n // $FlowIgnore: Doesn't think elements are indexable\n el['on' + event] = null;\n }\n}\n\nfunction outerHeight(node\n/*: HTMLElement*/\n)\n/*: number*/\n{\n // This is deliberately excluding margin for our calculations, since we are using\n // offsetTop which is including margin. See getBoundPosition\n var height = node.clientHeight;\n var computedStyle = node.ownerDocument.defaultView.getComputedStyle(node);\n height += (0, _shims.int)(computedStyle.borderTopWidth);\n height += (0, _shims.int)(computedStyle.borderBottomWidth);\n return height;\n}\n\nfunction outerWidth(node\n/*: HTMLElement*/\n)\n/*: number*/\n{\n // This is deliberately excluding margin for our calculations, since we are using\n // offsetLeft which is including margin. See getBoundPosition\n var width = node.clientWidth;\n var computedStyle = node.ownerDocument.defaultView.getComputedStyle(node);\n width += (0, _shims.int)(computedStyle.borderLeftWidth);\n width += (0, _shims.int)(computedStyle.borderRightWidth);\n return width;\n}\n\nfunction innerHeight(node\n/*: HTMLElement*/\n)\n/*: number*/\n{\n var height = node.clientHeight;\n var computedStyle = node.ownerDocument.defaultView.getComputedStyle(node);\n height -= (0, _shims.int)(computedStyle.paddingTop);\n height -= (0, _shims.int)(computedStyle.paddingBottom);\n return height;\n}\n\nfunction innerWidth(node\n/*: HTMLElement*/\n)\n/*: number*/\n{\n var width = node.clientWidth;\n var computedStyle = node.ownerDocument.defaultView.getComputedStyle(node);\n width -= (0, _shims.int)(computedStyle.paddingLeft);\n width -= (0, _shims.int)(computedStyle.paddingRight);\n return width;\n}\n/*:: interface EventWithOffset {\n clientX: number, clientY: number\n}*/\n\n\n// Get from offsetParent\nfunction offsetXYFromParent(evt\n/*: EventWithOffset*/\n, offsetParent\n/*: HTMLElement*/\n, scale\n/*: number*/\n)\n/*: ControlPosition*/\n{\n var isBody = offsetParent === offsetParent.ownerDocument.body;\n var offsetParentRect = isBody ? {\n left: 0,\n top: 0\n } : offsetParent.getBoundingClientRect();\n var x = (evt.clientX + offsetParent.scrollLeft - offsetParentRect.left) / scale;\n var y = (evt.clientY + offsetParent.scrollTop - offsetParentRect.top) / scale;\n return {\n x: x,\n y: y\n };\n}\n\nfunction createCSSTransform(controlPos\n/*: ControlPosition*/\n, positionOffset\n/*: PositionOffsetControlPosition*/\n)\n/*: Object*/\n{\n var translation = getTranslation(controlPos, positionOffset, 'px');\n return _defineProperty({}, (0, _getPrefix.browserPrefixToKey)('transform', _getPrefix.default), translation);\n}\n\nfunction createSVGTransform(controlPos\n/*: ControlPosition*/\n, positionOffset\n/*: PositionOffsetControlPosition*/\n)\n/*: string*/\n{\n var translation = getTranslation(controlPos, positionOffset, '');\n return translation;\n}\n\nfunction getTranslation(_ref2, positionOffset\n/*: PositionOffsetControlPosition*/\n, unitSuffix\n/*: string*/\n)\n/*: string*/\n{\n var x = _ref2.x,\n y = _ref2.y;\n var translation = \"translate(\".concat(x).concat(unitSuffix, \",\").concat(y).concat(unitSuffix, \")\");\n\n if (positionOffset) {\n var defaultX = \"\".concat(typeof positionOffset.x === 'string' ? positionOffset.x : positionOffset.x + unitSuffix);\n var defaultY = \"\".concat(typeof positionOffset.y === 'string' ? positionOffset.y : positionOffset.y + unitSuffix);\n translation = \"translate(\".concat(defaultX, \", \").concat(defaultY, \")\") + translation;\n }\n\n return translation;\n}\n\nfunction getTouch(e\n/*: MouseTouchEvent*/\n, identifier\n/*: number*/\n)\n/*: ?{clientX: number, clientY: number}*/\n{\n return e.targetTouches && (0, _shims.findInArray)(e.targetTouches, function (t) {\n return identifier === t.identifier;\n }) || e.changedTouches && (0, _shims.findInArray)(e.changedTouches, function (t) {\n return identifier === t.identifier;\n });\n}\n\nfunction getTouchIdentifier(e\n/*: MouseTouchEvent*/\n)\n/*: ?number*/\n{\n if (e.targetTouches && e.targetTouches[0]) return e.targetTouches[0].identifier;\n if (e.changedTouches && e.changedTouches[0]) return e.changedTouches[0].identifier;\n} // User-select Hacks:\n//\n// Useful for preventing blue highlights all over everything when dragging.\n// Note we're passing `document` b/c we could be iframed\n\n\nfunction addUserSelectStyles(doc\n/*: ?Document*/\n) {\n if (!doc) return;\n var styleEl = doc.getElementById('react-draggable-style-el');\n\n if (!styleEl) {\n styleEl = doc.createElement('style');\n styleEl.type = 'text/css';\n styleEl.id = 'react-draggable-style-el';\n styleEl.innerHTML = '.react-draggable-transparent-selection *::-moz-selection {all: inherit;}\\n';\n styleEl.innerHTML += '.react-draggable-transparent-selection *::selection {all: inherit;}\\n';\n doc.getElementsByTagName('head')[0].appendChild(styleEl);\n }\n\n if (doc.body) addClassName(doc.body, 'react-draggable-transparent-selection');\n}\n\nfunction removeUserSelectStyles(doc\n/*: ?Document*/\n) {\n if (!doc) return;\n\n try {\n if (doc.body) removeClassName(doc.body, 'react-draggable-transparent-selection'); // $FlowIgnore: IE\n\n if (doc.selection) {\n // $FlowIgnore: IE\n doc.selection.empty();\n } else {\n // Remove selection caused by scroll, unless it's a focused input\n // (we use doc.defaultView in case we're in an iframe)\n var selection = (doc.defaultView || window).getSelection();\n\n if (selection && selection.type !== 'Caret') {\n selection.removeAllRanges();\n }\n }\n } catch (e) {// probably IE\n }\n}\n\nfunction addClassName(el\n/*: HTMLElement*/\n, className\n/*: string*/\n) {\n if (el.classList) {\n el.classList.add(className);\n } else {\n if (!el.className.match(new RegExp(\"(?:^|\\\\s)\".concat(className, \"(?!\\\\S)\")))) {\n el.className += \" \".concat(className);\n }\n }\n}\n\nfunction removeClassName(el\n/*: HTMLElement*/\n, className\n/*: string*/\n) {\n if (el.classList) {\n el.classList.remove(className);\n } else {\n el.className = el.className.replace(new RegExp(\"(?:^|\\\\s)\".concat(className, \"(?!\\\\S)\"), 'g'), '');\n }\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.canDragX = canDragX;\nexports.canDragY = canDragY;\nexports.createCoreData = createCoreData;\nexports.createDraggableData = createDraggableData;\nexports.getBoundPosition = getBoundPosition;\nexports.getControlPosition = getControlPosition;\nexports.snapToGrid = snapToGrid;\n\nvar _shims = require(\"./shims\");\n\nvar _domFns = require(\"./domFns\");\n\nfunction getBoundPosition(draggable\n/*: Draggable*/\n, x\n/*: number*/\n, y\n/*: number*/\n)\n/*: [number, number]*/\n{\n // If no bounds, short-circuit and move on\n if (!draggable.props.bounds) return [x, y]; // Clone new bounds\n\n var bounds = draggable.props.bounds;\n bounds = typeof bounds === 'string' ? bounds : cloneBounds(bounds);\n var node = findDOMNode(draggable);\n\n if (typeof bounds === 'string') {\n var ownerDocument = node.ownerDocument;\n var ownerWindow = ownerDocument.defaultView;\n var boundNode;\n\n if (bounds === 'parent') {\n boundNode = node.parentNode;\n } else {\n boundNode = ownerDocument.querySelector(bounds);\n }\n\n if (!(boundNode instanceof ownerWindow.HTMLElement)) {\n throw new Error('Bounds selector \"' + bounds + '\" could not find an element.');\n }\n\n var boundNodeEl\n /*: HTMLElement*/\n = boundNode; // for Flow, can't seem to refine correctly\n\n var nodeStyle = ownerWindow.getComputedStyle(node);\n var boundNodeStyle = ownerWindow.getComputedStyle(boundNodeEl); // Compute bounds. This is a pain with padding and offsets but this gets it exactly right.\n\n bounds = {\n left: -node.offsetLeft + (0, _shims.int)(boundNodeStyle.paddingLeft) + (0, _shims.int)(nodeStyle.marginLeft),\n top: -node.offsetTop + (0, _shims.int)(boundNodeStyle.paddingTop) + (0, _shims.int)(nodeStyle.marginTop),\n right: (0, _domFns.innerWidth)(boundNodeEl) - (0, _domFns.outerWidth)(node) - node.offsetLeft + (0, _shims.int)(boundNodeStyle.paddingRight) - (0, _shims.int)(nodeStyle.marginRight),\n bottom: (0, _domFns.innerHeight)(boundNodeEl) - (0, _domFns.outerHeight)(node) - node.offsetTop + (0, _shims.int)(boundNodeStyle.paddingBottom) - (0, _shims.int)(nodeStyle.marginBottom)\n };\n } // Keep x and y below right and bottom limits...\n\n\n if ((0, _shims.isNum)(bounds.right)) x = Math.min(x, bounds.right);\n if ((0, _shims.isNum)(bounds.bottom)) y = Math.min(y, bounds.bottom); // But above left and top limits.\n\n if ((0, _shims.isNum)(bounds.left)) x = Math.max(x, bounds.left);\n if ((0, _shims.isNum)(bounds.top)) y = Math.max(y, bounds.top);\n return [x, y];\n}\n\nfunction snapToGrid(grid\n/*: [number, number]*/\n, pendingX\n/*: number*/\n, pendingY\n/*: number*/\n)\n/*: [number, number]*/\n{\n var x = Math.round(pendingX / grid[0]) * grid[0];\n var y = Math.round(pendingY / grid[1]) * grid[1];\n return [x, y];\n}\n\nfunction canDragX(draggable\n/*: Draggable*/\n)\n/*: boolean*/\n{\n return draggable.props.axis === 'both' || draggable.props.axis === 'x';\n}\n\nfunction canDragY(draggable\n/*: Draggable*/\n)\n/*: boolean*/\n{\n return draggable.props.axis === 'both' || draggable.props.axis === 'y';\n} // Get {x, y} positions from event.\n\n\nfunction getControlPosition(e\n/*: MouseTouchEvent*/\n, touchIdentifier\n/*: ?number*/\n, draggableCore\n/*: DraggableCore*/\n)\n/*: ?ControlPosition*/\n{\n var touchObj = typeof touchIdentifier === 'number' ? (0, _domFns.getTouch)(e, touchIdentifier) : null;\n if (typeof touchIdentifier === 'number' && !touchObj) return null; // not the right touch\n\n var node = findDOMNode(draggableCore); // User can provide an offsetParent if desired.\n\n var offsetParent = draggableCore.props.offsetParent || node.offsetParent || node.ownerDocument.body;\n return (0, _domFns.offsetXYFromParent)(touchObj || e, offsetParent, draggableCore.props.scale);\n} // Create an data object exposed by 's events\n\n\nfunction createCoreData(draggable\n/*: DraggableCore*/\n, x\n/*: number*/\n, y\n/*: number*/\n)\n/*: DraggableData*/\n{\n var state = draggable.state;\n var isStart = !(0, _shims.isNum)(state.lastX);\n var node = findDOMNode(draggable);\n\n if (isStart) {\n // If this is our first move, use the x and y as last coords.\n return {\n node: node,\n deltaX: 0,\n deltaY: 0,\n lastX: x,\n lastY: y,\n x: x,\n y: y\n };\n } else {\n // Otherwise calculate proper values.\n return {\n node: node,\n deltaX: x - state.lastX,\n deltaY: y - state.lastY,\n lastX: state.lastX,\n lastY: state.lastY,\n x: x,\n y: y\n };\n }\n} // Create an data exposed by 's events\n\n\nfunction createDraggableData(draggable\n/*: Draggable*/\n, coreData\n/*: DraggableData*/\n)\n/*: DraggableData*/\n{\n var scale = draggable.props.scale;\n return {\n node: coreData.node,\n x: draggable.state.x + coreData.deltaX / scale,\n y: draggable.state.y + coreData.deltaY / scale,\n deltaX: coreData.deltaX / scale,\n deltaY: coreData.deltaY / scale,\n lastX: draggable.state.x,\n lastY: draggable.state.y\n };\n} // A lot faster than stringify/parse\n\n\nfunction cloneBounds(bounds\n/*: Bounds*/\n)\n/*: Bounds*/\n{\n return {\n left: bounds.left,\n top: bounds.top,\n right: bounds.right,\n bottom: bounds.bottom\n };\n}\n\nfunction findDOMNode(draggable\n/*: Draggable | DraggableCore*/\n)\n/*: HTMLElement*/\n{\n var node = draggable.findDOMNode();\n\n if (!node) {\n throw new Error(': Unmounted during event!');\n } // $FlowIgnore we can't assert on HTMLElement due to tests... FIXME\n\n\n return node;\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = log;\n\n/*eslint no-console:0*/\nfunction log() {\n var _console;\n\n if (undefined) (_console = console).log.apply(_console, arguments);\n}","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _domFns = require(\"./utils/domFns\");\n\nvar _positionFns = require(\"./utils/positionFns\");\n\nvar _shims = require(\"./utils/shims\");\n\nvar _log = _interopRequireDefault(require(\"./utils/log\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n// Simple abstraction for dragging events names.\nvar eventsFor = {\n touch: {\n start: 'touchstart',\n move: 'touchmove',\n stop: 'touchend'\n },\n mouse: {\n start: 'mousedown',\n move: 'mousemove',\n stop: 'mouseup'\n }\n}; // Default to mouse events.\n\nvar dragEventFor = eventsFor.mouse;\n/*:: type DraggableCoreState = {\n dragging: boolean,\n lastX: number,\n lastY: number,\n touchIdentifier: ?number\n};*/\n\n/*:: export type DraggableData = {\n node: HTMLElement,\n x: number, y: number,\n deltaX: number, deltaY: number,\n lastX: number, lastY: number,\n};*/\n\n/*:: export type DraggableEventHandler = (e: MouseEvent, data: DraggableData) => void | false;*/\n\n/*:: export type ControlPosition = {x: number, y: number};*/\n\n/*:: export type PositionOffsetControlPosition = {x: number|string, y: number|string};*/\n\n/*:: export type DraggableCoreDefaultProps = {\n allowAnyClick: boolean,\n disabled: boolean,\n enableUserSelectHack: boolean,\n onStart: DraggableEventHandler,\n onDrag: DraggableEventHandler,\n onStop: DraggableEventHandler,\n onMouseDown: (e: MouseEvent) => void,\n scale: number,\n};*/\n\n/*:: export type DraggableCoreProps = {\n ...DraggableCoreDefaultProps,\n cancel: string,\n children: ReactElement,\n offsetParent: HTMLElement,\n grid: [number, number],\n handle: string,\n nodeRef?: ?React.ElementRef,\n};*/\n\n//\n// Define .\n//\n// is for advanced usage of . It maintains minimal internal state so it can\n// work well with libraries that require more control over the element.\n//\nvar DraggableCore = /*#__PURE__*/function (_React$Component) {\n _inherits(DraggableCore, _React$Component);\n\n var _super = _createSuper(DraggableCore);\n\n function DraggableCore() {\n var _this;\n\n _classCallCheck(this, DraggableCore);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _super.call.apply(_super, [this].concat(args));\n\n _defineProperty(_assertThisInitialized(_this), \"state\", {\n dragging: false,\n // Used while dragging to determine deltas.\n lastX: NaN,\n lastY: NaN,\n touchIdentifier: null\n });\n\n _defineProperty(_assertThisInitialized(_this), \"mounted\", false);\n\n _defineProperty(_assertThisInitialized(_this), \"handleDragStart\", function (e) {\n // Make it possible to attach event handlers on top of this one.\n _this.props.onMouseDown(e); // Only accept left-clicks.\n\n\n if (!_this.props.allowAnyClick && typeof e.button === 'number' && e.button !== 0) return false; // Get nodes. Be sure to grab relative document (could be iframed)\n\n var thisNode = _this.findDOMNode();\n\n if (!thisNode || !thisNode.ownerDocument || !thisNode.ownerDocument.body) {\n throw new Error(' not mounted on DragStart!');\n }\n\n var ownerDocument = thisNode.ownerDocument; // Short circuit if handle or cancel prop was provided and selector doesn't match.\n\n if (_this.props.disabled || !(e.target instanceof ownerDocument.defaultView.Node) || _this.props.handle && !(0, _domFns.matchesSelectorAndParentsTo)(e.target, _this.props.handle, thisNode) || _this.props.cancel && (0, _domFns.matchesSelectorAndParentsTo)(e.target, _this.props.cancel, thisNode)) {\n return;\n } // Prevent scrolling on mobile devices, like ipad/iphone.\n // Important that this is after handle/cancel.\n\n\n if (e.type === 'touchstart') e.preventDefault(); // Set touch identifier in component state if this is a touch event. This allows us to\n // distinguish between individual touches on multitouch screens by identifying which\n // touchpoint was set to this element.\n\n var touchIdentifier = (0, _domFns.getTouchIdentifier)(e);\n\n _this.setState({\n touchIdentifier: touchIdentifier\n }); // Get the current drag point from the event. This is used as the offset.\n\n\n var position = (0, _positionFns.getControlPosition)(e, touchIdentifier, _assertThisInitialized(_this));\n if (position == null) return; // not possible but satisfies flow\n\n var x = position.x,\n y = position.y; // Create an event object with all the data parents need to make a decision here.\n\n var coreEvent = (0, _positionFns.createCoreData)(_assertThisInitialized(_this), x, y);\n (0, _log.default)('DraggableCore: handleDragStart: %j', coreEvent); // Call event handler. If it returns explicit false, cancel.\n\n (0, _log.default)('calling', _this.props.onStart);\n\n var shouldUpdate = _this.props.onStart(e, coreEvent);\n\n if (shouldUpdate === false || _this.mounted === false) return; // Add a style to the body to disable user-select. This prevents text from\n // being selected all over the page.\n\n if (_this.props.enableUserSelectHack) (0, _domFns.addUserSelectStyles)(ownerDocument); // Initiate dragging. Set the current x and y as offsets\n // so we know how much we've moved during the drag. This allows us\n // to drag elements around even if they have been moved, without issue.\n\n _this.setState({\n dragging: true,\n lastX: x,\n lastY: y\n }); // Add events to the document directly so we catch when the user's mouse/touch moves outside of\n // this element. We use different events depending on whether or not we have detected that this\n // is a touch-capable device.\n\n\n (0, _domFns.addEvent)(ownerDocument, dragEventFor.move, _this.handleDrag);\n (0, _domFns.addEvent)(ownerDocument, dragEventFor.stop, _this.handleDragStop);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"handleDrag\", function (e) {\n // Get the current drag point from the event. This is used as the offset.\n var position = (0, _positionFns.getControlPosition)(e, _this.state.touchIdentifier, _assertThisInitialized(_this));\n if (position == null) return;\n var x = position.x,\n y = position.y; // Snap to grid if prop has been provided\n\n if (Array.isArray(_this.props.grid)) {\n var deltaX = x - _this.state.lastX,\n deltaY = y - _this.state.lastY;\n\n var _snapToGrid = (0, _positionFns.snapToGrid)(_this.props.grid, deltaX, deltaY);\n\n var _snapToGrid2 = _slicedToArray(_snapToGrid, 2);\n\n deltaX = _snapToGrid2[0];\n deltaY = _snapToGrid2[1];\n if (!deltaX && !deltaY) return; // skip useless drag\n\n x = _this.state.lastX + deltaX, y = _this.state.lastY + deltaY;\n }\n\n var coreEvent = (0, _positionFns.createCoreData)(_assertThisInitialized(_this), x, y);\n (0, _log.default)('DraggableCore: handleDrag: %j', coreEvent); // Call event handler. If it returns explicit false, trigger end.\n\n var shouldUpdate = _this.props.onDrag(e, coreEvent);\n\n if (shouldUpdate === false || _this.mounted === false) {\n try {\n // $FlowIgnore\n _this.handleDragStop(new MouseEvent('mouseup'));\n } catch (err) {\n // Old browsers\n var event = ((document.createEvent('MouseEvents')\n /*: any*/\n )\n /*: MouseTouchEvent*/\n ); // I see why this insanity was deprecated\n // $FlowIgnore\n\n event.initMouseEvent('mouseup', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n _this.handleDragStop(event);\n }\n\n return;\n }\n\n _this.setState({\n lastX: x,\n lastY: y\n });\n });\n\n _defineProperty(_assertThisInitialized(_this), \"handleDragStop\", function (e) {\n if (!_this.state.dragging) return;\n var position = (0, _positionFns.getControlPosition)(e, _this.state.touchIdentifier, _assertThisInitialized(_this));\n if (position == null) return;\n var x = position.x,\n y = position.y; // Snap to grid if prop has been provided\n\n if (Array.isArray(_this.props.grid)) {\n var deltaX = x - _this.state.lastX || 0;\n var deltaY = y - _this.state.lastY || 0;\n\n var _snapToGrid3 = (0, _positionFns.snapToGrid)(_this.props.grid, deltaX, deltaY);\n\n var _snapToGrid4 = _slicedToArray(_snapToGrid3, 2);\n\n deltaX = _snapToGrid4[0];\n deltaY = _snapToGrid4[1];\n x = _this.state.lastX + deltaX, y = _this.state.lastY + deltaY;\n }\n\n var coreEvent = (0, _positionFns.createCoreData)(_assertThisInitialized(_this), x, y); // Call event handler\n\n var shouldContinue = _this.props.onStop(e, coreEvent);\n\n if (shouldContinue === false || _this.mounted === false) return false;\n\n var thisNode = _this.findDOMNode();\n\n if (thisNode) {\n // Remove user-select hack\n if (_this.props.enableUserSelectHack) (0, _domFns.removeUserSelectStyles)(thisNode.ownerDocument);\n }\n\n (0, _log.default)('DraggableCore: handleDragStop: %j', coreEvent); // Reset the el.\n\n _this.setState({\n dragging: false,\n lastX: NaN,\n lastY: NaN\n });\n\n if (thisNode) {\n // Remove event handlers\n (0, _log.default)('DraggableCore: Removing handlers');\n (0, _domFns.removeEvent)(thisNode.ownerDocument, dragEventFor.move, _this.handleDrag);\n (0, _domFns.removeEvent)(thisNode.ownerDocument, dragEventFor.stop, _this.handleDragStop);\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onMouseDown\", function (e) {\n dragEventFor = eventsFor.mouse; // on touchscreen laptops we could switch back to mouse\n\n return _this.handleDragStart(e);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onMouseUp\", function (e) {\n dragEventFor = eventsFor.mouse;\n return _this.handleDragStop(e);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onTouchStart\", function (e) {\n // We're on a touch device now, so change the event handlers\n dragEventFor = eventsFor.touch;\n return _this.handleDragStart(e);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onTouchEnd\", function (e) {\n // We're on a touch device now, so change the event handlers\n dragEventFor = eventsFor.touch;\n return _this.handleDragStop(e);\n });\n\n return _this;\n }\n\n _createClass(DraggableCore, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.mounted = true; // Touch handlers must be added with {passive: false} to be cancelable.\n // https://developers.google.com/web/updates/2017/01/scrolling-intervention\n\n var thisNode = this.findDOMNode();\n\n if (thisNode) {\n (0, _domFns.addEvent)(thisNode, eventsFor.touch.start, this.onTouchStart, {\n passive: false\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.mounted = false; // Remove any leftover event handlers. Remove both touch and mouse handlers in case\n // some browser quirk caused a touch event to fire during a mouse move, or vice versa.\n\n var thisNode = this.findDOMNode();\n\n if (thisNode) {\n var ownerDocument = thisNode.ownerDocument;\n (0, _domFns.removeEvent)(ownerDocument, eventsFor.mouse.move, this.handleDrag);\n (0, _domFns.removeEvent)(ownerDocument, eventsFor.touch.move, this.handleDrag);\n (0, _domFns.removeEvent)(ownerDocument, eventsFor.mouse.stop, this.handleDragStop);\n (0, _domFns.removeEvent)(ownerDocument, eventsFor.touch.stop, this.handleDragStop);\n (0, _domFns.removeEvent)(thisNode, eventsFor.touch.start, this.onTouchStart, {\n passive: false\n });\n if (this.props.enableUserSelectHack) (0, _domFns.removeUserSelectStyles)(ownerDocument);\n }\n } // React Strict Mode compatibility: if `nodeRef` is passed, we will use it instead of trying to find\n // the underlying DOM node ourselves. See the README for more information.\n\n }, {\n key: \"findDOMNode\",\n value: function findDOMNode()\n /*: ?HTMLElement*/\n {\n var _this$props, _this$props2, _this$props2$nodeRef;\n\n return (_this$props = this.props) !== null && _this$props !== void 0 && _this$props.nodeRef ? (_this$props2 = this.props) === null || _this$props2 === void 0 ? void 0 : (_this$props2$nodeRef = _this$props2.nodeRef) === null || _this$props2$nodeRef === void 0 ? void 0 : _this$props2$nodeRef.current : _reactDom.default.findDOMNode(this);\n }\n }, {\n key: \"render\",\n value: function render()\n /*: React.Element*/\n {\n // Reuse the child provided\n // This makes it flexible to use whatever element is wanted (div, ul, etc)\n return /*#__PURE__*/React.cloneElement(React.Children.only(this.props.children), {\n // Note: mouseMove handler is attached to document so it will still function\n // when the user drags quickly and leaves the bounds of the element.\n onMouseDown: this.onMouseDown,\n onMouseUp: this.onMouseUp,\n // onTouchStart is added on `componentDidMount` so they can be added with\n // {passive: false}, which allows it to cancel. See\n // https://developers.google.com/web/updates/2017/01/scrolling-intervention\n onTouchEnd: this.onTouchEnd\n });\n }\n }]);\n\n return DraggableCore;\n}(React.Component);\n\nexports.default = DraggableCore;\n\n_defineProperty(DraggableCore, \"displayName\", 'DraggableCore');\n\n_defineProperty(DraggableCore, \"propTypes\", {\n /**\n * `allowAnyClick` allows dragging using any mouse button.\n * By default, we only accept the left button.\n *\n * Defaults to `false`.\n */\n allowAnyClick: _propTypes.default.bool,\n\n /**\n * `disabled`, if true, stops the from dragging. All handlers,\n * with the exception of `onMouseDown`, will not fire.\n */\n disabled: _propTypes.default.bool,\n\n /**\n * By default, we add 'user-select:none' attributes to the document body\n * to prevent ugly text selection during drag. If this is causing problems\n * for your app, set this to `false`.\n */\n enableUserSelectHack: _propTypes.default.bool,\n\n /**\n * `offsetParent`, if set, uses the passed DOM node to compute drag offsets\n * instead of using the parent node.\n */\n offsetParent: function offsetParent(props\n /*: DraggableCoreProps*/\n , propName\n /*: $Keys*/\n ) {\n if (props[propName] && props[propName].nodeType !== 1) {\n throw new Error('Draggable\\'s offsetParent must be a DOM Node.');\n }\n },\n\n /**\n * `grid` specifies the x and y that dragging should snap to.\n */\n grid: _propTypes.default.arrayOf(_propTypes.default.number),\n\n /**\n * `handle` specifies a selector to be used as the handle that initiates drag.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
    \n *
    Click me to drag
    \n *
    This is some other content
    \n *
    \n *
    \n * );\n * }\n * });\n * ```\n */\n handle: _propTypes.default.string,\n\n /**\n * `cancel` specifies a selector to be used to prevent drag initialization.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return(\n * \n *
    \n *
    You can't drag from here
    \n *
    Dragging here works fine
    \n *
    \n *
    \n * );\n * }\n * });\n * ```\n */\n cancel: _propTypes.default.string,\n\n /* If running in React Strict mode, ReactDOM.findDOMNode() is deprecated.\n * Unfortunately, in order for to work properly, we need raw access\n * to the underlying DOM node. If you want to avoid the warning, pass a `nodeRef`\n * as in this example:\n *\n * function MyComponent() {\n * const nodeRef = React.useRef(null);\n * return (\n * \n *
    Example Target
    \n *
    \n * );\n * }\n *\n * This can be used for arbitrarily nested components, so long as the ref ends up\n * pointing to the actual child DOM node and not a custom component.\n */\n nodeRef: _propTypes.default.object,\n\n /**\n * Called when dragging starts.\n * If this function returns the boolean false, dragging will be canceled.\n */\n onStart: _propTypes.default.func,\n\n /**\n * Called while dragging.\n * If this function returns the boolean false, dragging will be canceled.\n */\n onDrag: _propTypes.default.func,\n\n /**\n * Called when dragging stops.\n * If this function returns the boolean false, the drag will remain active.\n */\n onStop: _propTypes.default.func,\n\n /**\n * A workaround option which can be passed if onMouseDown needs to be accessed,\n * since it'll always be blocked (as there is internal use of onMouseDown)\n */\n onMouseDown: _propTypes.default.func,\n\n /**\n * `scale`, if set, applies scaling while dragging an element\n */\n scale: _propTypes.default.number,\n\n /**\n * These properties should be defined on the child, not here.\n */\n className: _shims.dontSetMe,\n style: _shims.dontSetMe,\n transform: _shims.dontSetMe\n});\n\n_defineProperty(DraggableCore, \"defaultProps\", {\n allowAnyClick: false,\n // by default only accept left click\n disabled: false,\n enableUserSelectHack: true,\n onStart: function onStart() {},\n onDrag: function onDrag() {},\n onStop: function onStop() {},\n onMouseDown: function onMouseDown() {},\n scale: 1\n});","\"use strict\";\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"DraggableCore\", {\n enumerable: true,\n get: function get() {\n return _DraggableCore.default;\n }\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _clsx2 = _interopRequireDefault(require(\"clsx\"));\n\nvar _domFns = require(\"./utils/domFns\");\n\nvar _positionFns = require(\"./utils/positionFns\");\n\nvar _shims = require(\"./utils/shims\");\n\nvar _DraggableCore = _interopRequireDefault(require(\"./DraggableCore\"));\n\nvar _log = _interopRequireDefault(require(\"./utils/log\"));\n\nvar _excluded = [\"axis\", \"bounds\", \"children\", \"defaultPosition\", \"defaultClassName\", \"defaultClassNameDragging\", \"defaultClassNameDragged\", \"position\", \"positionOffset\", \"scale\"];\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\n\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n//\n// Define \n//\nvar Draggable = /*#__PURE__*/function (_React$Component) {\n _inherits(Draggable, _React$Component);\n\n var _super = _createSuper(Draggable);\n\n function Draggable(props\n /*: DraggableProps*/\n ) {\n var _this;\n\n _classCallCheck(this, Draggable);\n\n _this = _super.call(this, props);\n\n _defineProperty(_assertThisInitialized(_this), \"onDragStart\", function (e, coreData) {\n (0, _log.default)('Draggable: onDragStart: %j', coreData); // Short-circuit if user's callback killed it.\n\n var shouldStart = _this.props.onStart(e, (0, _positionFns.createDraggableData)(_assertThisInitialized(_this), coreData)); // Kills start event on core as well, so move handlers are never bound.\n\n\n if (shouldStart === false) return false;\n\n _this.setState({\n dragging: true,\n dragged: true\n });\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onDrag\", function (e, coreData) {\n if (!_this.state.dragging) return false;\n (0, _log.default)('Draggable: onDrag: %j', coreData);\n var uiData = (0, _positionFns.createDraggableData)(_assertThisInitialized(_this), coreData);\n var newState\n /*: $Shape*/\n = {\n x: uiData.x,\n y: uiData.y\n }; // Keep within bounds.\n\n if (_this.props.bounds) {\n // Save original x and y.\n var x = newState.x,\n y = newState.y; // Add slack to the values used to calculate bound position. This will ensure that if\n // we start removing slack, the element won't react to it right away until it's been\n // completely removed.\n\n newState.x += _this.state.slackX;\n newState.y += _this.state.slackY; // Get bound position. This will ceil/floor the x and y within the boundaries.\n\n var _getBoundPosition = (0, _positionFns.getBoundPosition)(_assertThisInitialized(_this), newState.x, newState.y),\n _getBoundPosition2 = _slicedToArray(_getBoundPosition, 2),\n newStateX = _getBoundPosition2[0],\n newStateY = _getBoundPosition2[1];\n\n newState.x = newStateX;\n newState.y = newStateY; // Recalculate slack by noting how much was shaved by the boundPosition handler.\n\n newState.slackX = _this.state.slackX + (x - newState.x);\n newState.slackY = _this.state.slackY + (y - newState.y); // Update the event we fire to reflect what really happened after bounds took effect.\n\n uiData.x = newState.x;\n uiData.y = newState.y;\n uiData.deltaX = newState.x - _this.state.x;\n uiData.deltaY = newState.y - _this.state.y;\n } // Short-circuit if user's callback killed it.\n\n\n var shouldUpdate = _this.props.onDrag(e, uiData);\n\n if (shouldUpdate === false) return false;\n\n _this.setState(newState);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onDragStop\", function (e, coreData) {\n if (!_this.state.dragging) return false; // Short-circuit if user's callback killed it.\n\n var shouldContinue = _this.props.onStop(e, (0, _positionFns.createDraggableData)(_assertThisInitialized(_this), coreData));\n\n if (shouldContinue === false) return false;\n (0, _log.default)('Draggable: onDragStop: %j', coreData);\n var newState\n /*: $Shape*/\n = {\n dragging: false,\n slackX: 0,\n slackY: 0\n }; // If this is a controlled component, the result of this operation will be to\n // revert back to the old position. We expect a handler on `onDragStop`, at the least.\n\n var controlled = Boolean(_this.props.position);\n\n if (controlled) {\n var _this$props$position = _this.props.position,\n x = _this$props$position.x,\n y = _this$props$position.y;\n newState.x = x;\n newState.y = y;\n }\n\n _this.setState(newState);\n });\n\n _this.state = {\n // Whether or not we are currently dragging.\n dragging: false,\n // Whether or not we have been dragged before.\n dragged: false,\n // Current transform x and y.\n x: props.position ? props.position.x : props.defaultPosition.x,\n y: props.position ? props.position.y : props.defaultPosition.y,\n prevPropsPosition: _objectSpread({}, props.position),\n // Used for compensating for out-of-bounds drags\n slackX: 0,\n slackY: 0,\n // Can only determine if SVG after mounting\n isElementSVG: false\n };\n\n if (props.position && !(props.onDrag || props.onStop)) {\n // eslint-disable-next-line no-console\n console.warn('A `position` was applied to this , without drag handlers. This will make this ' + 'component effectively undraggable. Please attach `onDrag` or `onStop` handlers so you can adjust the ' + '`position` of this element.');\n }\n\n return _this;\n }\n\n _createClass(Draggable, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n // Check to see if the element passed is an instanceof SVGElement\n if (typeof window.SVGElement !== 'undefined' && this.findDOMNode() instanceof window.SVGElement) {\n this.setState({\n isElementSVG: true\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.setState({\n dragging: false\n }); // prevents invariant if unmounted while dragging\n } // React Strict Mode compatibility: if `nodeRef` is passed, we will use it instead of trying to find\n // the underlying DOM node ourselves. See the README for more information.\n\n }, {\n key: \"findDOMNode\",\n value: function findDOMNode()\n /*: ?HTMLElement*/\n {\n var _this$props$nodeRef$c, _this$props, _this$props$nodeRef;\n\n return (_this$props$nodeRef$c = (_this$props = this.props) === null || _this$props === void 0 ? void 0 : (_this$props$nodeRef = _this$props.nodeRef) === null || _this$props$nodeRef === void 0 ? void 0 : _this$props$nodeRef.current) !== null && _this$props$nodeRef$c !== void 0 ? _this$props$nodeRef$c : _reactDom.default.findDOMNode(this);\n }\n }, {\n key: \"render\",\n value: function render()\n /*: ReactElement*/\n {\n var _clsx;\n\n var _this$props2 = this.props,\n axis = _this$props2.axis,\n bounds = _this$props2.bounds,\n children = _this$props2.children,\n defaultPosition = _this$props2.defaultPosition,\n defaultClassName = _this$props2.defaultClassName,\n defaultClassNameDragging = _this$props2.defaultClassNameDragging,\n defaultClassNameDragged = _this$props2.defaultClassNameDragged,\n position = _this$props2.position,\n positionOffset = _this$props2.positionOffset,\n scale = _this$props2.scale,\n draggableCoreProps = _objectWithoutProperties(_this$props2, _excluded);\n\n var style = {};\n var svgTransform = null; // If this is controlled, we don't want to move it - unless it's dragging.\n\n var controlled = Boolean(position);\n var draggable = !controlled || this.state.dragging;\n var validPosition = position || defaultPosition;\n var transformOpts = {\n // Set left if horizontal drag is enabled\n x: (0, _positionFns.canDragX)(this) && draggable ? this.state.x : validPosition.x,\n // Set top if vertical drag is enabled\n y: (0, _positionFns.canDragY)(this) && draggable ? this.state.y : validPosition.y\n }; // If this element was SVG, we use the `transform` attribute.\n\n if (this.state.isElementSVG) {\n svgTransform = (0, _domFns.createSVGTransform)(transformOpts, positionOffset);\n } else {\n // Add a CSS transform to move the element around. This allows us to move the element around\n // without worrying about whether or not it is relatively or absolutely positioned.\n // If the item you are dragging already has a transform set, wrap it in a so \n // has a clean slate.\n style = (0, _domFns.createCSSTransform)(transformOpts, positionOffset);\n } // Mark with class while dragging\n\n\n var className = (0, _clsx2.default)(children.props.className || '', defaultClassName, (_clsx = {}, _defineProperty(_clsx, defaultClassNameDragging, this.state.dragging), _defineProperty(_clsx, defaultClassNameDragged, this.state.dragged), _clsx)); // Reuse the child provided\n // This makes it flexible to use whatever element is wanted (div, ul, etc)\n\n return /*#__PURE__*/React.createElement(_DraggableCore.default, _extends({}, draggableCoreProps, {\n onStart: this.onDragStart,\n onDrag: this.onDrag,\n onStop: this.onDragStop\n }), /*#__PURE__*/React.cloneElement(React.Children.only(children), {\n className: className,\n style: _objectSpread(_objectSpread({}, children.props.style), style),\n transform: svgTransform\n }));\n }\n }], [{\n key: \"getDerivedStateFromProps\",\n value: // React 16.3+\n // Arity (props, state)\n function getDerivedStateFromProps(_ref, _ref2)\n /*: ?$Shape*/\n {\n var position = _ref.position;\n var prevPropsPosition = _ref2.prevPropsPosition;\n\n // Set x/y if a new position is provided in props that is different than the previous.\n if (position && (!prevPropsPosition || position.x !== prevPropsPosition.x || position.y !== prevPropsPosition.y)) {\n (0, _log.default)('Draggable: getDerivedStateFromProps %j', {\n position: position,\n prevPropsPosition: prevPropsPosition\n });\n return {\n x: position.x,\n y: position.y,\n prevPropsPosition: _objectSpread({}, position)\n };\n }\n\n return null;\n }\n }]);\n\n return Draggable;\n}(React.Component);\n\nexports.default = Draggable;\n\n_defineProperty(Draggable, \"displayName\", 'Draggable');\n\n_defineProperty(Draggable, \"propTypes\", _objectSpread(_objectSpread({}, _DraggableCore.default.propTypes), {}, {\n /**\n * `axis` determines which axis the draggable can move.\n *\n * Note that all callbacks will still return data as normal. This only\n * controls flushing to the DOM.\n *\n * 'both' allows movement horizontally and vertically.\n * 'x' limits movement to horizontal axis.\n * 'y' limits movement to vertical axis.\n * 'none' limits all movement.\n *\n * Defaults to 'both'.\n */\n axis: _propTypes.default.oneOf(['both', 'x', 'y', 'none']),\n\n /**\n * `bounds` determines the range of movement available to the element.\n * Available values are:\n *\n * 'parent' restricts movement within the Draggable's parent node.\n *\n * Alternatively, pass an object with the following properties, all of which are optional:\n *\n * {left: LEFT_BOUND, right: RIGHT_BOUND, bottom: BOTTOM_BOUND, top: TOP_BOUND}\n *\n * All values are in px.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
    Content
    \n *
    \n * );\n * }\n * });\n * ```\n */\n bounds: _propTypes.default.oneOfType([_propTypes.default.shape({\n left: _propTypes.default.number,\n right: _propTypes.default.number,\n top: _propTypes.default.number,\n bottom: _propTypes.default.number\n }), _propTypes.default.string, _propTypes.default.oneOf([false])]),\n defaultClassName: _propTypes.default.string,\n defaultClassNameDragging: _propTypes.default.string,\n defaultClassNameDragged: _propTypes.default.string,\n\n /**\n * `defaultPosition` specifies the x and y that the dragged item should start at\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
    I start with transformX: 25px and transformY: 25px;
    \n *
    \n * );\n * }\n * });\n * ```\n */\n defaultPosition: _propTypes.default.shape({\n x: _propTypes.default.number,\n y: _propTypes.default.number\n }),\n positionOffset: _propTypes.default.shape({\n x: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),\n y: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])\n }),\n\n /**\n * `position`, if present, defines the current position of the element.\n *\n * This is similar to how form elements in React work - if no `position` is supplied, the component\n * is uncontrolled.\n *\n * Example:\n *\n * ```jsx\n * let App = React.createClass({\n * render: function () {\n * return (\n * \n *
    I start with transformX: 25px and transformY: 25px;
    \n *
    \n * );\n * }\n * });\n * ```\n */\n position: _propTypes.default.shape({\n x: _propTypes.default.number,\n y: _propTypes.default.number\n }),\n\n /**\n * These properties should be defined on the child, not here.\n */\n className: _shims.dontSetMe,\n style: _shims.dontSetMe,\n transform: _shims.dontSetMe\n}));\n\n_defineProperty(Draggable, \"defaultProps\", _objectSpread(_objectSpread({}, _DraggableCore.default.defaultProps), {}, {\n axis: 'both',\n bounds: false,\n defaultClassName: 'react-draggable',\n defaultClassNameDragging: 'react-draggable-dragging',\n defaultClassNameDragged: 'react-draggable-dragged',\n defaultPosition: {\n x: 0,\n y: 0\n },\n scale: 1\n}));","\"use strict\";\n\nvar _require = require('./Draggable'),\n Draggable = _require.default,\n DraggableCore = _require.DraggableCore; // Previous versions of this lib exported as the root export. As to no-// them, or TypeScript, we export *both* as the root and as 'default'.\n// See https://github.com/mzabriskie/react-draggable/pull/254\n// and https://github.com/mzabriskie/react-draggable/issues/266\n\n\nmodule.exports = Draggable;\nmodule.exports.default = Draggable;\nmodule.exports.DraggableCore = DraggableCore;","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","var ATTR_TIMEAGO_TID = 'timeago-id';\n/**\n * get the datetime attribute, `datetime` are supported.\n * @param node\n * @returns {*}\n */\nexport function getDateAttribute(node) {\n return node.getAttribute('datetime');\n}\n/**\n * set the node attribute, native DOM\n * @param node\n * @param timerId\n * @returns {*}\n */\nexport function setTimerId(node, timerId) {\n // @ts-ignore\n node.setAttribute(ATTR_TIMEAGO_TID, timerId);\n}\n/**\n * get the timer id\n * @param node\n */\nexport function getTimerId(node) {\n return parseInt(node.getAttribute(ATTR_TIMEAGO_TID));\n}\n//# sourceMappingURL=dom.js.map","import { setTimerId, getTimerId, getDateAttribute } from './utils/dom';\nimport { formatDiff, diffSec, nextInterval } from './utils/date';\nimport { getLocale } from './register';\n// all realtime timer\nvar TIMER_POOL = {};\n/**\n * clear a timer from pool\n * @param tid\n */\nvar clear = function (tid) {\n clearTimeout(tid);\n delete TIMER_POOL[tid];\n};\n// run with timer(setTimeout)\nfunction run(node, date, localeFunc, opts) {\n // clear the node's exist timer\n clear(getTimerId(node));\n var relativeDate = opts.relativeDate, minInterval = opts.minInterval;\n // get diff seconds\n var diff = diffSec(date, relativeDate);\n // render\n node.innerText = formatDiff(diff, localeFunc);\n var tid = setTimeout(function () {\n run(node, date, localeFunc, opts);\n }, Math.min(Math.max(nextInterval(diff), minInterval || 1) * 1000, 0x7fffffff));\n // there is no need to save node in object. Just save the key\n TIMER_POOL[tid] = 0;\n setTimerId(node, tid);\n}\n/**\n * cancel a timer or all timers\n * @param node - node hosting the time string\n */\nexport function cancel(node) {\n // cancel one\n if (node)\n clear(getTimerId(node));\n // cancel all\n // @ts-ignore\n else\n Object.keys(TIMER_POOL).forEach(clear);\n}\n/**\n * render a dom realtime\n * @param nodes\n * @param locale\n * @param opts\n */\nexport function render(nodes, locale, opts) {\n // by .length\n // @ts-ignore\n var nodeList = nodes.length ? nodes : [nodes];\n nodeList.forEach(function (node) {\n run(node, getDateAttribute(node), getLocale(locale), opts || {});\n });\n return nodeList;\n}\n//# sourceMappingURL=realtime.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nimport * as React from 'react';\nimport { format, cancel, render } from 'timeago.js';\n/**\n * Convert input to a valid datetime string of \n )\n\n }\n\n}\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","import { v4 as uuid } from 'uuid';\nimport equals from 'fast-deep-equal';\n\nexport default class WebAnnotation {\n\n constructor(annotation, opts) {\n this.underlying = annotation;\n this.opts = opts;\n }\n\n /** For convenience - creates an empty web annotation **/\n static create = args => {\n const stub = {\n '@context': 'http://www.w3.org/ns/anno.jsonld',\n 'type': 'Annotation',\n 'id': `#${uuid()}`,\n 'body': []\n };\n\n return new WebAnnotation({ ...stub, ...args });\n }\n\n /** Creates a copy of this annotation **/\n clone = (opt_props, opt_opts) => {\n return new WebAnnotation({ ...this.underlying, ...opt_props}, { ...this.opts, ...opt_opts });\n }\n\n /** An equality check based on the underlying object **/\n isEqual(other) {\n if (other?.type !== 'Annotation') {\n return false;\n } else if (this.underlying === other.underlying) {\n return true;\n } else if (!this.underlying.id || !other.underlying.id) {\n return false;\n } else {\n return equals(this.underlying, other.underlying);\n }\n }\n\n get readOnly() {\n return this.opts?.readOnly;\n }\n\n /*************************************/\n /* Getters to forward properties of */\n /* the underlying annotation */\n /*************************************/\n\n get id() {\n return this.underlying.id;\n }\n\n get context() {\n return this.underlying['@context'];\n }\n\n get type() {\n return this.underlying.type;\n }\n\n get motivation() {\n return this.underlying.motivation;\n }\n\n get body() {\n return this.underlying.body;\n }\n\n get target() {\n return this.underlying.target;\n }\n\n /** Same as .body, but guaranteed to return an array **/\n get bodies() {\n return (Array.isArray(this.underlying.body)) ?\n this.underlying.body : [ this.underlying.body ];\n }\n\n /** Only bodies are meant to be mutated by the application **/\n set bodies(bodies) {\n this.underlying.body = bodies;\n }\n\n /** Same as .target, but guaranteed to return an array **/\n get targets() {\n return (Array.isArray(this.underlying.target)) ?\n this.underlying.target : [ this.underlying.target ];\n }\n\n /*****************************************/\n /* Various access helpers and shorthands */\n /*****************************************/\n\n /** Selector of the given type **/\n selector = type => {\n const { target } = this.underlying;\n\n if (target.selector) {\n // Normalize to array\n const selectors = Array.isArray(target.selector) ?\n target.selector : [ target.selector ];\n\n return selectors.find(s => s.type === type);\n }\n }\n\n /** Shorthand for the 'exact' field of the TextQuoteSelector **/\n get quote() {\n return this.selector('TextQuoteSelector')?.exact;\n }\n\n /** Shorthand for the 'start' field of the TextPositionSelector **/\n get start() {\n return this.selector('TextPositionSelector')?.start;\n }\n\n /** Shorthand for the 'end' field of the TextPositionSelector **/\n get end() {\n return this.selector('TextPositionSelector')?.end;\n }\n\n}\n","import WebAnnotation from './WebAnnotation';\nimport { v4 as uuid } from 'uuid';\nimport equals from 'fast-deep-equal';\n\n/**\n * An \"annotation in draft mode\". Really the same\n * data structure, but as a separate class so we can\n * tell things apart properly.\n */\nexport default class Selection {\n\n constructor(target, body) {\n this.underlying = {\n '@context': 'http://www.w3.org/ns/anno.jsonld',\n type: 'Selection',\n body: body || [],\n target\n }\n }\n\n /** Creates a copy of this selection **/\n clone = opt_props => {\n // Deep-clone\n const cloned = new Selection();\n cloned.underlying = JSON.parse(JSON.stringify(this.underlying));\n\n if (opt_props)\n cloned.underlying = { ...cloned.underlying, ...opt_props };\n\n return cloned;\n }\n\n get context() {\n return this.underlying['@context'];\n }\n\n get type() {\n return this.underlying.type;\n }\n\n get body() {\n return this.underlying.body;\n }\n\n get target() {\n return this.underlying.target;\n }\n\n get targets() {\n return (Array.isArray(this.underlying.target)) ?\n this.underlying.target : [ this.underlying.target ];\n }\n\n /** For consistency with WebAnnotation **/\n isEqual(other) {\n if (!other) {\n return false;\n } else {\n return equals(this.underlying, other.underlying);\n }\n }\n\n get bodies() {\n return (Array.isArray(this.underlying.body)) ?\n this.underlying.body : [ this.underlying.body ];\n }\n\n selector = type => {\n const { target } = this.underlying;\n\n if (target.selector) {\n // Normalize to array\n const selectors = Array.isArray(target.selector) ?\n target.selector : [ target.selector ];\n\n return selectors.find(s => s.type === type);\n }\n }\n\n /** Shorthand for the 'exact' field of the TextQuoteSelector **/\n get quote() {\n return this.selector('TextQuoteSelector')?.exact;\n }\n\n /*******************************************/\n /* Selection-specific properties & methods */\n /*******************************************/\n\n get isSelection() {\n return true;\n }\n\n toAnnotation = () => {\n const a = Object.assign({}, this.underlying, {\n 'type': 'Annotation',\n 'id': `#${uuid()}`\n });\n\n return new WebAnnotation(a);\n }\n\n}\n","/**\n * Difference between server time and client time, in milliseconds\n */\nlet serverTimeDifference = 0;\n\nexport default () => ({\n \n /**\n * A generic container for RecogitoJS/Annotorious \n * to store globally available environment info. The \n * most important piece of information is user auth \n * info. Example:\n *\n * user: { id, displayName, email, avatarURL }\n * \n * id ........... the host application user ID (should be a URI, but could be username) REQUIRED\n * displayName .. screen display or nickname OPTIONAL (id is used when empty)\n * email ........ OPTIONAL\n * avatarURL .... OPTIONAL + not supported at the moment\n */\n\n /**\n * Sets a server time, so we can correct browser time error. \n * Note for the super-picky: client-server latency will introduce\n * an error we don't account for.\n */\n setServerTime: serverNow => {\n const browserNow = Date.now()\n serverTimeDifference = serverNow - browserNow;\n },\n \n /** \n * Returns the current 'server time', i.e. browser time \n * adjusted by the serverTimeDifference value.\n */\n getCurrentTimeAdjusted: () =>\n (new Date(Date.now() + serverTimeDifference)).toISOString(),\n\n /** Re-adjusts the given server timestamp to browser time **/\n toClientTime: serverTime =>\n Date.parse(serverTime) - serverTimeDifference\n\n})","import I18n, { availableLocales } from '../i18n';\n\n/**\n * Helper to init the i18n class with a pre-defined or auto-detected locale.\n */\nexport const setLocale = (locale, opt_messages) => {\n if (locale) {\n const l = locale === 'auto' ?\n window.navigator.userLanguage || window.navigator.language : locale;\n\n const fallback = l.split('-')[0].toLowerCase();\n const foundLocale = [l, fallback].find(_l => availableLocales.includes(_l));\n\n if (!foundLocale) {\n console.warn(`Unsupported locale '${l}'. Falling back to default en.`);\n }\n\n I18n.init(foundLocale, opt_messages);\n } else {\n I18n.init(null, opt_messages);\n }\n}\n","//! openseadragon 3.0.0\n//! Built on 2021-12-15\n//! Git commit: v3.0.0-0-3eded36\n//! http://openseadragon.github.io\n//! License: http://openseadragon.github.io/license/\n\n/*\n * OpenSeadragon\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Portions of this source file taken from jQuery:\n *\n * Copyright 2011 John Resig\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/*\n * Portions of this source file taken from mattsnider.com:\n *\n * Copyright (c) 2006-2013 Matt Snider\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\n * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR\n * THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n\n/**\n * @namespace OpenSeadragon\n * @version openseadragon 3.0.0\n * @classdesc The root namespace for OpenSeadragon. All utility methods\n * and classes are defined on or below this namespace.\n *\n */\n\n\n// Typedefs\n\n /**\n * All required and optional settings for instantiating a new instance of an OpenSeadragon image viewer.\n *\n * @typedef {Object} Options\n * @memberof OpenSeadragon\n *\n * @property {String} id\n * Id of the element to append the viewer's container element to. If not provided, the 'element' property must be provided.\n * If both the element and id properties are specified, the viewer is appended to the element provided in the element property.\n *\n * @property {Element} element\n * The element to append the viewer's container element to. If not provided, the 'id' property must be provided.\n * If both the element and id properties are specified, the viewer is appended to the element provided in the element property.\n *\n * @property {Array|String|Function|Object} [tileSources=null]\n * Tile source(s) to open initially. This is a complex parameter; see\n * {@link OpenSeadragon.Viewer#open} for details.\n *\n * @property {Number} [tabIndex=0]\n * Tabbing order index to assign to the viewer element. Positive values are selected in increasing order. When tabIndex is 0\n * source order is used. A negative value omits the viewer from the tabbing order.\n *\n * @property {Array} overlays Array of objects defining permanent overlays of\n * the viewer. The overlays added via this option and later removed with\n * {@link OpenSeadragon.Viewer#removeOverlay} will be added back when a new\n * image is opened.\n * To add overlays which can be definitively removed, one must use\n * {@link OpenSeadragon.Viewer#addOverlay}\n * If displaying a sequence of images, the overlays can be associated\n * with a specific page by passing the overlays array to the page's\n * tile source configuration.\n * Expected properties:\n * * x, y, (or px, py for pixel coordinates) to define the location.\n * * width, height in point if using x,y or in pixels if using px,py. If width\n * and height are specified, the overlay size is adjusted when zooming,\n * otherwise the size stays the size of the content (or the size defined by CSS).\n * * className to associate a class to the overlay\n * * id to set the overlay element. If an element with this id already exists,\n * it is reused, otherwise it is created. If not specified, a new element is\n * created.\n * * placement a string to define the relative position to the viewport.\n * Only used if no width and height are specified. Default: 'TOP_LEFT'.\n * See {@link OpenSeadragon.Placement} for possible values.\n *\n * @property {String} [xmlPath=null]\n * DEPRECATED. A relative path to load a DZI file from the server.\n * Prefer the newer Options.tileSources.\n *\n * @property {String} [prefixUrl='/images/']\n * Prepends the prefixUrl to navImages paths, which is very useful\n * since the default paths are rarely useful for production\n * environments.\n *\n * @property {OpenSeadragon.NavImages} [navImages]\n * An object with a property for each button or other built-in navigation\n * control, eg the current 'zoomIn', 'zoomOut', 'home', and 'fullpage'.\n * Each of those in turn provides an image path for each state of the button\n * or navigation control, eg 'REST', 'GROUP', 'HOVER', 'PRESS'. Finally the\n * image paths, by default assume there is a folder on the servers root path\n * called '/images', eg '/images/zoomin_rest.png'. If you need to adjust\n * these paths, prefer setting the option.prefixUrl rather than overriding\n * every image path directly through this setting.\n *\n * @property {Boolean} [debugMode=false]\n * TODO: provide an in-screen panel providing event detail feedback.\n *\n * @property {String} [debugGridColor=['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']]\n * The colors of grids in debug mode. Each tiled image's grid uses a consecutive color.\n * If there are more tiled images than provided colors, the color vector is recycled.\n *\n * @property {Number} [blendTime=0]\n * Specifies the duration of animation as higher or lower level tiles are\n * replacing the existing tile.\n *\n * @property {Boolean} [alwaysBlend=false]\n * Forces the tile to always blend. By default the tiles skip blending\n * when the blendTime is surpassed and the current animation frame would\n * not complete the blend.\n *\n * @property {Boolean} [autoHideControls=true]\n * If the user stops interacting with the viewport, fade the navigation\n * controls. Useful for presentation since the controls are by default\n * floated on top of the image the user is viewing.\n *\n * @property {Boolean} [immediateRender=false]\n * Render the best closest level first, ignoring the lowering levels which\n * provide the effect of very blurry to sharp. It is recommended to change\n * setting to true for mobile devices.\n *\n * @property {Number} [defaultZoomLevel=0]\n * Zoom level to use when image is first opened or the home button is clicked.\n * If 0, adjusts to fit viewer.\n *\n * @property {Number} [opacity=1]\n * Default proportional opacity of the tiled images (1=opaque, 0=hidden)\n * Hidden images do not draw and only load when preloading is allowed.\n *\n * @property {Boolean} [preload=false]\n * Default switch for loading hidden images (true loads, false blocks)\n *\n * @property {String} [compositeOperation=null]\n * Valid values are 'source-over', 'source-atop', 'source-in', 'source-out',\n * 'destination-over', 'destination-atop', 'destination-in', 'destination-out',\n * 'lighter', 'difference', 'copy', 'xor', etc.\n * For complete list of modes, please @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation/ globalCompositeOperation}\n *\n * @property {Boolean} [imageSmoothingEnabled=true]\n * Image smoothing for canvas rendering (only if canvas is used). Note: Ignored\n * by some (especially older) browsers which do not support this canvas property.\n * This property can be changed in {@link Viewer.Drawer.setImageSmoothingEnabled}.\n *\n * @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null]\n * Draws a colored rectangle behind the tile if it is not loaded yet.\n * You can pass a CSS color value like \"#FF8800\".\n * When passing a function the tiledImage and canvas context are available as argument which is useful when you draw a gradient or pattern.\n *\n * @property {Number} [degrees=0]\n * Initial rotation.\n *\n * @property {Boolean} [flipped=false]\n * Initial flip state.\n *\n * @property {Number} [minZoomLevel=null]\n *\n * @property {Number} [maxZoomLevel=null]\n *\n * @property {Boolean} [homeFillsViewer=false]\n * Make the 'home' button fill the viewer and clip the image, instead\n * of fitting the image to the viewer and letterboxing.\n *\n * @property {Boolean} [panHorizontal=true]\n * Allow horizontal pan.\n *\n * @property {Boolean} [panVertical=true]\n * Allow vertical pan.\n *\n * @property {Boolean} [constrainDuringPan=false]\n *\n * @property {Boolean} [wrapHorizontal=false]\n * Set to true to force the image to wrap horizontally within the viewport.\n * Useful for maps or images representing the surface of a sphere or cylinder.\n *\n * @property {Boolean} [wrapVertical=false]\n * Set to true to force the image to wrap vertically within the viewport.\n * Useful for maps or images representing the surface of a sphere or cylinder.\n *\n * @property {Number} [minZoomImageRatio=0.9]\n * The minimum percentage ( expressed as a number between 0 and 1 ) of\n * the viewport height or width at which the zoom out will be constrained.\n * Setting it to 0, for example will allow you to zoom out infinity.\n *\n * @property {Number} [maxZoomPixelRatio=1.1]\n * The maximum ratio to allow a zoom-in to affect the highest level pixel\n * ratio. This can be set to Infinity to allow 'infinite' zooming into the\n * image though it is less effective visually if the HTML5 Canvas is not\n * available on the viewing device.\n *\n * @property {Number} [smoothTileEdgesMinZoom=1.1]\n * A zoom percentage ( where 1 is 100% ) of the highest resolution level.\n * When zoomed in beyond this value alternative compositing will be used to\n * smooth out the edges between tiles. This will have a performance impact.\n * Can be set to Infinity to turn it off.\n * Note: This setting is ignored on iOS devices due to a known bug (See {@link https://github.com/openseadragon/openseadragon/issues/952})\n *\n * @property {Boolean} [iOSDevice=?]\n * True if running on an iOS device, false otherwise.\n * Used to disable certain features that behave differently on iOS devices.\n *\n * @property {Boolean} [autoResize=true]\n * Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior.\n *\n * @property {Boolean} [preserveImageSizeOnResize=false]\n * Set to true to have the image size preserved when the viewer is resized. This requires autoResize=true (default).\n *\n * @property {Number} [minScrollDeltaTime=50]\n * Number of milliseconds between canvas-scroll events. This value helps normalize the rate of canvas-scroll\n * events between different devices, causing the faster devices to slow down enough to make the zoom control\n * more manageable.\n *\n * @property {Number} [rotationIncrement=90]\n * The number of degrees to rotate right or left when the rotate buttons or keyboard shortcuts are activated.\n *\n * @property {Number} [pixelsPerWheelLine=40]\n * For pixel-resolution scrolling devices, the number of pixels equal to one scroll line.\n *\n * @property {Number} [pixelsPerArrowPress=40]\n * The number of pixels viewport moves when an arrow key is pressed.\n *\n * @property {Number} [visibilityRatio=0.5]\n * The percentage ( as a number from 0 to 1 ) of the source image which\n * must be kept within the viewport. If the image is dragged beyond that\n * limit, it will 'bounce' back until the minimum visibility ratio is\n * achieved. Setting this to 0 and wrapHorizontal ( or wrapVertical ) to\n * true will provide the effect of an infinitely scrolling viewport.\n *\n * @property {Object} [viewportMargins={}]\n * Pushes the \"home\" region in from the sides by the specified amounts.\n * Possible subproperties (Numbers, in screen coordinates): left, top, right, bottom.\n *\n * @property {Number} [imageLoaderLimit=0]\n * The maximum number of image requests to make concurrently. By default\n * it is set to 0 allowing the browser to make the maximum number of\n * image requests in parallel as allowed by the browsers policy.\n *\n * @property {Number} [clickTimeThreshold=300]\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n *\n * @property {Number} [clickDistThreshold=5]\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n *\n * @property {Number} [dblClickTimeThreshold=300]\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n *\n * @property {Number} [dblClickDistThreshold=20]\n * The maximum distance allowed between two pointer click events\n * to be treated as a double-click gesture.\n *\n * @property {Number} [springStiffness=6.5]\n *\n * @property {Number} [animationTime=1.2]\n * Specifies the animation duration per each {@link OpenSeadragon.Spring}\n * which occur when the image is dragged or zoomed.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse]\n * Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsMouse.dragToPan=true] - Pan on drag gesture\n * @property {Boolean} [gestureSettingsMouse.scrollToZoom=true] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsMouse.clickToZoom=true] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsMouse.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsMouse.pinchToZoom=false] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsMouse.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n * the zoom is centered at the canvas center.\n * @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture\n * @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsMouse.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsTouch]\n * Settings for gestures generated by a touch pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsMouse.dragToPan=true] - Pan on drag gesture\n * @property {Boolean} [gestureSettingsTouch.scrollToZoom=false] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsTouch.clickToZoom=false] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsTouch.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsTouch.pinchToZoom=true] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsTouch.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n * the zoom is centered at the canvas center.\n * @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture\n * @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsTouch.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsPen]\n * Settings for gestures generated by a pen pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsMouse.dragToPan=true] - Pan on drag gesture\n * @property {Boolean} [gestureSettingsPen.scrollToZoom=false] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsPen.clickToZoom=true] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsPen.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n * the zoom is centered at the canvas center.\n * @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture\n * @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsPen.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsUnknown]\n * Settings for gestures generated by unknown pointer devices. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsMouse.dragToPan=true] - Pan on drag gesture\n * @property {Boolean} [gestureSettingsUnknown.scrollToZoom=true] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsUnknown.clickToZoom=false] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsUnknown.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsUnknown.pinchToZoom=true] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsUnknown.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n * the zoom is centered at the canvas center.\n * @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture\n * @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsUnknown.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {Number} [zoomPerClick=2.0]\n * The \"zoom distance\" per mouse click or touch tap. Note: Setting this to 1.0 effectively disables the click-to-zoom feature (also see gestureSettings[Mouse|Touch|Pen].clickToZoom/dblClickToZoom).\n *\n * @property {Number} [zoomPerScroll=1.2]\n * The \"zoom distance\" per mouse scroll or touch pinch. Note: Setting this to 1.0 effectively disables the mouse-wheel zoom feature (also see gestureSettings[Mouse|Touch|Pen].scrollToZoom}).\n *\n * @property {Number} [zoomPerSecond=1.0]\n * Sets the zoom amount per second when zoomIn/zoomOut buttons are pressed and held.\n * The value is a factor of the current zoom, so 1.0 (the default) disables zooming when the zoomIn/zoomOut buttons\n * are held. Higher values will increase the rate of zoom when the zoomIn/zoomOut buttons are held. Note that values\n * < 1.0 will reverse the operation of the zoomIn/zoomOut buttons (zoomIn button will decrease the zoom, zoomOut will\n * increase the zoom).\n *\n * @property {Boolean} [showNavigator=false]\n * Set to true to make the navigator minimap appear.\n *\n * @property {String} [navigatorId=navigator-GENERATED DATE]\n * The ID of a div to hold the navigator minimap.\n * If an ID is specified, the navigatorPosition, navigatorSizeRatio, navigatorMaintainSizeRatio, navigator[Top|Left|Height|Width] and navigatorAutoFade options will be ignored.\n * If an ID is not specified, a div element will be generated and placed on top of the main image.\n *\n * @property {String} [navigatorPosition='TOP_RIGHT']\n * Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', 'BOTTOM_RIGHT', or 'ABSOLUTE'.
    \n * If 'ABSOLUTE' is specified, then navigator[Top|Left|Height|Width] determines the size and position of the navigator minimap in the viewer, and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.
    \n * For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT', the navigatorSizeRatio or navigator[Height|Width] values determine the size of the navigator minimap.\n *\n * @property {Number} [navigatorSizeRatio=0.2]\n * Ratio of navigator size to viewer size. Ignored if navigator[Height|Width] are specified.\n *\n * @property {Boolean} [navigatorMaintainSizeRatio=false]\n * If true, the navigator minimap is resized (using navigatorSizeRatio) when the viewer size changes.\n *\n * @property {Number|String} [navigatorTop=null]\n * Specifies the location of the navigator minimap (see navigatorPosition).\n *\n * @property {Number|String} [navigatorLeft=null]\n * Specifies the location of the navigator minimap (see navigatorPosition).\n *\n * @property {Number|String} [navigatorHeight=null]\n * Specifies the size of the navigator minimap (see navigatorPosition).\n * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.\n *\n * @property {Number|String} [navigatorWidth=null]\n * Specifies the size of the navigator minimap (see navigatorPosition).\n * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.\n *\n * @property {Boolean} [navigatorAutoResize=true]\n * Set to false to prevent polling for navigator size changes. Useful for providing custom resize behavior.\n * Setting to false can also improve performance when the navigator is configured to a fixed size.\n *\n * @property {Boolean} [navigatorAutoFade=true]\n * If the user stops interacting with the viewport, fade the navigator minimap.\n * Setting to false will make the navigator minimap always visible.\n *\n * @property {Boolean} [navigatorRotate=true]\n * If true, the navigator will be rotated together with the viewer.\n *\n * @property {String} [navigatorBackground='#000']\n * Specifies the background color of the navigator minimap\n *\n * @property {Number} [navigatorOpacity=0.8]\n * Specifies the opacity of the navigator minimap.\n *\n * @property {String} [navigatorBorderColor='#555']\n * Specifies the border color of the navigator minimap\n *\n * @property {String} [navigatorDisplayRegionColor='#900']\n * Specifies the border color of the display region rectangle of the navigator minimap\n *\n * @property {Number} [controlsFadeDelay=2000]\n * The number of milliseconds to wait once the user has stopped interacting\n * with the interface before beginning to fade the controls. Assumes\n * showNavigationControl and autoHideControls are both true.\n *\n * @property {Number} [controlsFadeLength=1500]\n * The number of milliseconds to animate the controls fading out.\n *\n * @property {Number} [maxImageCacheCount=200]\n * The max number of images we should keep in memory (per drawer).\n *\n * @property {Number} [timeout=30000]\n * The max number of milliseconds that an image job may take to complete.\n *\n * @property {Boolean} [useCanvas=true]\n * Set to false to not use an HTML canvas element for image rendering even if canvas is supported.\n *\n * @property {Number} [minPixelRatio=0.5]\n * The higher the minPixelRatio, the lower the quality of the image that\n * is considered sufficient to stop rendering a given zoom level. For\n * example, if you are targeting mobile devices with less bandwidth you may\n * try setting this to 1.5 or higher.\n *\n * @property {Boolean} [mouseNavEnabled=true]\n * Is the user able to interact with the image via mouse or touch. Default\n * interactions include draging the image in a plane, and zooming in toward\n * and away from the image.\n *\n * @property {Boolean} [showNavigationControl=true]\n * Set to false to prevent the appearance of the default navigation controls.
    \n * Note that if set to false, the customs buttons set by the options\n * zoomInButton, zoomOutButton etc, are rendered inactive.\n *\n * @property {OpenSeadragon.ControlAnchor} [navigationControlAnchor=TOP_LEFT]\n * Placement of the default navigation controls.\n * To set the placement of the sequence controls, see the\n * sequenceControlAnchor option.\n *\n * @property {Boolean} [showZoomControl=true]\n * If true then + and - buttons to zoom in and out are displayed.
    \n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showHomeControl=true]\n * If true then the 'Go home' button is displayed to go back to the original\n * zoom and pan.
    \n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showFullPageControl=true]\n * If true then the 'Toggle full page' button is displayed to switch\n * between full page and normal mode.
    \n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showRotationControl=false]\n * If true then the rotate left/right controls will be displayed as part of the\n * standard controls. This is also subject to the browser support for rotate\n * (e.g. viewer.drawer.canRotate()).
    \n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showFlipControl=false]\n * If true then the flip controls will be displayed as part of the\n * standard controls.\n *\n * @property {Boolean} [showSequenceControl=true]\n * If sequenceMode is true, then provide buttons for navigating forward and\n * backward through the images.\n *\n * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT]\n * Placement of the default sequence controls.\n *\n * @property {Boolean} [navPrevNextWrap=false]\n * If true then the 'previous' button will wrap to the last image when\n * viewing the first image and the 'next' button will wrap to the first\n * image when viewing the last image.\n *\n * @property {String} zoomInButton\n * Set the id of the custom 'Zoom in' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} zoomOutButton\n * Set the id of the custom 'Zoom out' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} homeButton\n * Set the id of the custom 'Go home' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} fullPageButton\n * Set the id of the custom 'Toggle full page' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} rotateLeftButton\n * Set the id of the custom 'Rotate left' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} rotateRightButton\n * Set the id of the custom 'Rotate right' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} previousButton\n * Set the id of the custom 'Previous page' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} nextButton\n * Set the id of the custom 'Next page' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {Boolean} [sequenceMode=false]\n * Set to true to have the viewer treat your tilesources as a sequence of images to\n * be opened one at a time rather than all at once.\n *\n * @property {Number} [initialPage=0]\n * If sequenceMode is true, display this page initially.\n *\n * @property {Boolean} [preserveViewport=false]\n * If sequenceMode is true, then normally navigating through each image resets the\n * viewport to 'home' position. If preserveViewport is set to true, then the viewport\n * position is preserved when navigating between images in the sequence.\n *\n * @property {Boolean} [preserveOverlays=false]\n * If sequenceMode is true, then normally navigating through each image\n * resets the overlays.\n * If preserveOverlays is set to true, then the overlays added with {@link OpenSeadragon.Viewer#addOverlay}\n * are preserved when navigating between images in the sequence.\n * Note: setting preserveOverlays overrides any overlays specified in the global\n * \"overlays\" option for the Viewer. It's also not compatible with specifying\n * per-tileSource overlays via the options, as those overlays will persist\n * even after the tileSource is closed.\n *\n * @property {Boolean} [showReferenceStrip=false]\n * If sequenceMode is true, then display a scrolling strip of image thumbnails for\n * navigating through the images.\n *\n * @property {String} [referenceStripScroll='horizontal']\n *\n * @property {Element} [referenceStripElement=null]\n *\n * @property {Number} [referenceStripHeight=null]\n *\n * @property {Number} [referenceStripWidth=null]\n *\n * @property {String} [referenceStripPosition='BOTTOM_LEFT']\n *\n * @property {Number} [referenceStripSizeRatio=0.2]\n *\n * @property {Boolean} [collectionMode=false]\n * Set to true to have the viewer arrange your TiledImages in a grid or line.\n *\n * @property {Number} [collectionRows=3]\n * If collectionMode is true, specifies how many rows the grid should have. Use 1 to make a line.\n * If collectionLayout is 'vertical', specifies how many columns instead.\n *\n * @property {Number} [collectionColumns=0]\n * If collectionMode is true, specifies how many columns the grid should have. Use 1 to make a line.\n * If collectionLayout is 'vertical', specifies how many rows instead. Ignored if collectionRows is not set to a falsy value.\n *\n * @property {String} [collectionLayout='horizontal']\n * If collectionMode is true, specifies whether to arrange vertically or horizontally.\n *\n * @property {Number} [collectionTileSize=800]\n * If collectionMode is true, specifies the size, in viewport coordinates, for each TiledImage to fit into.\n * The TiledImage will be centered within a square of the specified size.\n *\n * @property {Number} [collectionTileMargin=80]\n * If collectionMode is true, specifies the margin, in viewport coordinates, between each TiledImage.\n *\n * @property {String|Boolean} [crossOriginPolicy=false]\n * Valid values are 'Anonymous', 'use-credentials', and false. If false, canvas requests will\n * not use CORS, and the canvas will be tainted.\n *\n * @property {Boolean} [ajaxWithCredentials=false]\n * Whether to set the withCredentials XHR flag for AJAX requests.\n * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.\n *\n * @property {Boolean} [loadTilesWithAjax=false]\n * Whether to load tile data using AJAX requests.\n * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.\n *\n * @property {Object} [ajaxHeaders={}]\n * A set of headers to include when making AJAX requests for tile sources or tiles.\n *\n */\n\n /**\n * Settings for gestures generated by a pointer device.\n *\n * @typedef {Object} GestureSettings\n * @memberof OpenSeadragon\n *\n * @property {Boolean} dragToPan\n * Set to false to disable panning on drag gestures.\n *\n * @property {Boolean} scrollToZoom\n * Set to false to disable zooming on scroll gestures.\n *\n * @property {Boolean} clickToZoom\n * Set to false to disable zooming on click gestures.\n *\n * @property {Boolean} dblClickToZoom\n * Set to false to disable zooming on double-click gestures. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n *\n * @property {Boolean} pinchToZoom\n * Set to false to disable zooming on pinch gestures.\n *\n * @property {Boolean} flickEnabled\n * Set to false to disable the kinetic panning effect (flick) at the end of a drag gesture.\n *\n * @property {Number} flickMinSpeed\n * If flickEnabled is true, the minimum speed (in pixels-per-second) required to cause the kinetic panning effect (flick) at the end of a drag gesture.\n *\n * @property {Number} flickMomentum\n * If flickEnabled is true, a constant multiplied by the velocity to determine the distance of the kinetic panning effect (flick) at the end of a drag gesture.\n * A larger value will make the flick feel \"lighter\", while a smaller value will make the flick feel \"heavier\".\n * Note: springStiffness and animationTime also affect the \"spring\" used to stop the flick animation.\n *\n */\n\n/**\n * The names for the image resources used for the image navigation buttons.\n *\n * @typedef {Object} NavImages\n * @memberof OpenSeadragon\n *\n * @property {Object} zoomIn - Images for the zoom-in button.\n * @property {String} zoomIn.REST\n * @property {String} zoomIn.GROUP\n * @property {String} zoomIn.HOVER\n * @property {String} zoomIn.DOWN\n *\n * @property {Object} zoomOut - Images for the zoom-out button.\n * @property {String} zoomOut.REST\n * @property {String} zoomOut.GROUP\n * @property {String} zoomOut.HOVER\n * @property {String} zoomOut.DOWN\n *\n * @property {Object} home - Images for the home button.\n * @property {String} home.REST\n * @property {String} home.GROUP\n * @property {String} home.HOVER\n * @property {String} home.DOWN\n *\n * @property {Object} fullpage - Images for the full-page button.\n * @property {String} fullpage.REST\n * @property {String} fullpage.GROUP\n * @property {String} fullpage.HOVER\n * @property {String} fullpage.DOWN\n *\n * @property {Object} rotateleft - Images for the rotate left button.\n * @property {String} rotateleft.REST\n * @property {String} rotateleft.GROUP\n * @property {String} rotateleft.HOVER\n * @property {String} rotateleft.DOWN\n *\n * @property {Object} rotateright - Images for the rotate right button.\n * @property {String} rotateright.REST\n * @property {String} rotateright.GROUP\n * @property {String} rotateright.HOVER\n * @property {String} rotateright.DOWN\n *\n * @property {Object} flip - Images for the flip button.\n * @property {String} flip.REST\n * @property {String} flip.GROUP\n * @property {String} flip.HOVER\n * @property {String} flip.DOWN\n *\n * @property {Object} previous - Images for the previous button.\n * @property {String} previous.REST\n * @property {String} previous.GROUP\n * @property {String} previous.HOVER\n * @property {String} previous.DOWN\n *\n * @property {Object} next - Images for the next button.\n * @property {String} next.REST\n * @property {String} next.GROUP\n * @property {String} next.HOVER\n * @property {String} next.DOWN\n *\n */\n\n/* eslint-disable no-redeclare */\nfunction OpenSeadragon( options ){\n return new OpenSeadragon.Viewer( options );\n}\n\n(function( $ ){\n\n\n /**\n * The OpenSeadragon version.\n *\n * @member {Object} OpenSeadragon.version\n * @property {String} versionStr - The version number as a string ('major.minor.revision').\n * @property {Number} major - The major version number.\n * @property {Number} minor - The minor version number.\n * @property {Number} revision - The revision number.\n * @since 1.0.0\n */\n $.version = {\n versionStr: '3.0.0',\n major: parseInt('3', 10),\n minor: parseInt('0', 10),\n revision: parseInt('0', 10)\n };\n\n\n /**\n * Taken from jquery 1.6.1\n * [[Class]] -> type pairs\n * @private\n */\n var class2type = {\n '[object Boolean]': 'boolean',\n '[object Number]': 'number',\n '[object String]': 'string',\n '[object Function]': 'function',\n '[object Array]': 'array',\n '[object Date]': 'date',\n '[object RegExp]': 'regexp',\n '[object Object]': 'object'\n },\n // Save a reference to some core methods\n toString = Object.prototype.toString,\n hasOwn = Object.prototype.hasOwnProperty;\n\n /**\n * Taken from jQuery 1.6.1\n * @function isFunction\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isFunction = function( obj ) {\n return $.type(obj) === \"function\";\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function isArray\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isArray = Array.isArray || function( obj ) {\n return $.type(obj) === \"array\";\n };\n\n\n /**\n * A crude way of determining if an object is a window.\n * Taken from jQuery 1.6.1\n * @function isWindow\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isWindow = function( obj ) {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function type\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.type = function( obj ) {\n return ( obj === null ) || ( obj === undefined ) ?\n String( obj ) :\n class2type[ toString.call(obj) ] || \"object\";\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function isPlainObject\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isPlainObject = function( obj ) {\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if ( !obj || OpenSeadragon.type(obj) !== \"object\" || obj.nodeType || $.isWindow( obj ) ) {\n return false;\n }\n\n // Not own constructor property must be Object\n if ( obj.constructor &&\n !hasOwn.call(obj, \"constructor\") &&\n !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n return false;\n }\n\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n\n var lastKey;\n for (var key in obj ) {\n lastKey = key;\n }\n\n return lastKey === undefined || hasOwn.call( obj, lastKey );\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function isEmptyObject\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isEmptyObject = function( obj ) {\n for ( var name in obj ) {\n return false;\n }\n return true;\n };\n\n /**\n * Shim around Object.freeze. Does nothing if Object.freeze is not supported.\n * @param {Object} obj The object to freeze.\n * @return {Object} obj The frozen object.\n */\n $.freezeObject = function(obj) {\n if (Object.freeze) {\n $.freezeObject = Object.freeze;\n } else {\n $.freezeObject = function(obj) {\n return obj;\n };\n }\n return $.freezeObject(obj);\n };\n\n /**\n * True if the browser supports the HTML5 canvas element\n * @member {Boolean} supportsCanvas\n * @memberof OpenSeadragon\n */\n $.supportsCanvas = (function () {\n var canvasElement = document.createElement( 'canvas' );\n return !!( $.isFunction( canvasElement.getContext ) &&\n canvasElement.getContext( '2d' ) );\n }());\n\n /**\n * Test whether the submitted canvas is tainted or not.\n * @argument {Canvas} canvas The canvas to test.\n * @returns {Boolean} True if the canvas is tainted.\n */\n $.isCanvasTainted = function(canvas) {\n var isTainted = false;\n try {\n // We test if the canvas is tainted by retrieving data from it.\n // An exception will be raised if the canvas is tainted.\n canvas.getContext('2d').getImageData(0, 0, 1, 1);\n } catch (e) {\n isTainted = true;\n }\n return isTainted;\n };\n\n /**\n * True if the browser supports the EventTarget.addEventListener() method\n * @member {Boolean} supportsAddEventListener\n * @memberof OpenSeadragon\n */\n $.supportsAddEventListener = (function () {\n return !!(document.documentElement.addEventListener && document.addEventListener);\n }());\n\n /**\n * True if the browser supports the EventTarget.removeEventListener() method\n * @member {Boolean} supportsRemoveEventListener\n * @memberof OpenSeadragon\n */\n $.supportsRemoveEventListener = (function () {\n return !!(document.documentElement.removeEventListener && document.removeEventListener);\n }());\n\n /**\n * True if the browser supports the newer EventTarget.addEventListener options argument\n * @member {Boolean} supportsEventListenerOptions\n * @memberof OpenSeadragon\n */\n $.supportsEventListenerOptions = (function () {\n var supported = 0;\n\n if ( $.supportsAddEventListener ) {\n try {\n var options = {\n get capture() {\n supported++;\n return false;\n },\n get once() {\n supported++;\n return false;\n },\n get passive() {\n supported++;\n return false;\n }\n };\n window.addEventListener(\"test\", null, options);\n window.removeEventListener(\"test\", null, options);\n } catch ( e ) {\n supported = 0;\n }\n }\n\n return supported >= 3;\n }());\n\n /**\n * A ratio comparing the device screen's pixel density to the canvas's backing store pixel density,\n * clamped to a minimum of 1. Defaults to 1 if canvas isn't supported by the browser.\n * @member {Number} pixelDensityRatio\n * @memberof OpenSeadragon\n */\n $.getCurrentPixelDensityRatio = function() {\n if ( $.supportsCanvas ) {\n var context = document.createElement('canvas').getContext('2d');\n var devicePixelRatio = window.devicePixelRatio || 1;\n var backingStoreRatio = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n return Math.max(devicePixelRatio, 1) / backingStoreRatio;\n } else {\n return 1;\n }\n };\n\n /**\n * @member {Number} pixelDensityRatio\n * @memberof OpenSeadragon\n */\n $.pixelDensityRatio = $.getCurrentPixelDensityRatio();\n\n}( OpenSeadragon ));\n\n/**\n * This closure defines all static methods available to the OpenSeadragon\n * namespace. Many, if not most, are taken directly from jQuery for use\n * to simplify and reduce common programming patterns. More static methods\n * from jQuery may eventually make their way into this though we are\n * attempting to avoid an explicit dependency on jQuery only because\n * OpenSeadragon is a broadly useful code base and would be made less broad\n * by requiring jQuery fully.\n *\n * Some static methods have also been refactored from the original OpenSeadragon\n * project.\n */\n(function( $ ){\n\n /**\n * Taken from jQuery 1.6.1\n * @function extend\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.extend = function() {\n var options,\n name,\n src,\n copy,\n copyIsArray,\n clone,\n target = arguments[ 0 ] || {},\n length = arguments.length,\n deep = false,\n i = 1;\n\n // Handle a deep copy situation\n if ( typeof target === \"boolean\" ) {\n deep = target;\n target = arguments[ 1 ] || {};\n // skip the boolean and the target\n i = 2;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if ( typeof target !== \"object\" && !OpenSeadragon.isFunction( target ) ) {\n target = {};\n }\n\n // extend jQuery itself if only one argument is passed\n if ( length === i ) {\n target = this;\n --i;\n }\n\n for ( ; i < length; i++ ) {\n // Only deal with non-null/undefined values\n options = arguments[ i ];\n if ( options !== null || options !== undefined ) {\n // Extend the base object\n for ( name in options ) {\n src = target[ name ];\n copy = options[ name ];\n\n // Prevent never-ending loop\n if ( target === copy ) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if ( deep && copy && ( OpenSeadragon.isPlainObject( copy ) || ( copyIsArray = OpenSeadragon.isArray( copy ) ) ) ) {\n if ( copyIsArray ) {\n copyIsArray = false;\n clone = src && OpenSeadragon.isArray( src ) ? src : [];\n\n } else {\n clone = src && OpenSeadragon.isPlainObject( src ) ? src : {};\n }\n\n // Never move original objects, clone them\n target[ name ] = OpenSeadragon.extend( deep, clone, copy );\n\n // Don't bring in undefined values\n } else if ( copy !== undefined ) {\n target[ name ] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n\n var isIOSDevice = function () {\n if (typeof navigator !== 'object') {\n return false;\n }\n var userAgent = navigator.userAgent;\n if (typeof userAgent !== 'string') {\n return false;\n }\n return userAgent.indexOf('iPhone') !== -1 ||\n userAgent.indexOf('iPad') !== -1 ||\n userAgent.indexOf('iPod') !== -1;\n };\n\n $.extend( $, /** @lends OpenSeadragon */{\n /**\n * The default values for the optional settings documented at {@link OpenSeadragon.Options}.\n * @static\n * @type {Object}\n */\n DEFAULT_SETTINGS: {\n //DATA SOURCE DETAILS\n xmlPath: null,\n tileSources: null,\n tileHost: null,\n initialPage: 0,\n crossOriginPolicy: false,\n ajaxWithCredentials: false,\n loadTilesWithAjax: false,\n ajaxHeaders: {},\n\n //PAN AND ZOOM SETTINGS AND CONSTRAINTS\n panHorizontal: true,\n panVertical: true,\n constrainDuringPan: false,\n wrapHorizontal: false,\n wrapVertical: false,\n visibilityRatio: 0.5, //-> how much of the viewer can be negative space\n minPixelRatio: 0.5, //->closer to 0 draws tiles meant for a higher zoom at this zoom\n defaultZoomLevel: 0,\n minZoomLevel: null,\n maxZoomLevel: null,\n homeFillsViewer: false,\n\n //UI RESPONSIVENESS AND FEEL\n clickTimeThreshold: 300,\n clickDistThreshold: 5,\n dblClickTimeThreshold: 300,\n dblClickDistThreshold: 20,\n springStiffness: 6.5,\n animationTime: 1.2,\n gestureSettingsMouse: {\n dragToPan: true,\n scrollToZoom: true,\n clickToZoom: true,\n dblClickToZoom: false,\n pinchToZoom: false,\n zoomToRefPoint: true,\n flickEnabled: false,\n flickMinSpeed: 120,\n flickMomentum: 0.25,\n pinchRotate: false\n },\n gestureSettingsTouch: {\n dragToPan: true,\n scrollToZoom: false,\n clickToZoom: false,\n dblClickToZoom: true,\n pinchToZoom: true,\n zoomToRefPoint: true,\n flickEnabled: true,\n flickMinSpeed: 120,\n flickMomentum: 0.25,\n pinchRotate: false\n },\n gestureSettingsPen: {\n dragToPan: true,\n scrollToZoom: false,\n clickToZoom: true,\n dblClickToZoom: false,\n pinchToZoom: false,\n zoomToRefPoint: true,\n flickEnabled: false,\n flickMinSpeed: 120,\n flickMomentum: 0.25,\n pinchRotate: false\n },\n gestureSettingsUnknown: {\n dragToPan: true,\n scrollToZoom: false,\n clickToZoom: false,\n dblClickToZoom: true,\n pinchToZoom: true,\n zoomToRefPoint: true,\n flickEnabled: true,\n flickMinSpeed: 120,\n flickMomentum: 0.25,\n pinchRotate: false\n },\n zoomPerClick: 2,\n zoomPerScroll: 1.2,\n zoomPerSecond: 1.0,\n blendTime: 0,\n alwaysBlend: false,\n autoHideControls: true,\n immediateRender: false,\n minZoomImageRatio: 0.9, //-> closer to 0 allows zoom out to infinity\n maxZoomPixelRatio: 1.1, //-> higher allows 'over zoom' into pixels\n smoothTileEdgesMinZoom: 1.1, //-> higher than maxZoomPixelRatio disables it\n iOSDevice: isIOSDevice(),\n pixelsPerWheelLine: 40,\n pixelsPerArrowPress: 40,\n autoResize: true,\n preserveImageSizeOnResize: false, // requires autoResize=true\n minScrollDeltaTime: 50,\n rotationIncrement: 90,\n\n //DEFAULT CONTROL SETTINGS\n showSequenceControl: true, //SEQUENCE\n sequenceControlAnchor: null, //SEQUENCE\n preserveViewport: false, //SEQUENCE\n preserveOverlays: false, //SEQUENCE\n navPrevNextWrap: false, //SEQUENCE\n showNavigationControl: true, //ZOOM/HOME/FULL/ROTATION\n navigationControlAnchor: null, //ZOOM/HOME/FULL/ROTATION\n showZoomControl: true, //ZOOM\n showHomeControl: true, //HOME\n showFullPageControl: true, //FULL\n showRotationControl: false, //ROTATION\n showFlipControl: false, //FLIP\n controlsFadeDelay: 2000, //ZOOM/HOME/FULL/SEQUENCE\n controlsFadeLength: 1500, //ZOOM/HOME/FULL/SEQUENCE\n mouseNavEnabled: true, //GENERAL MOUSE INTERACTIVITY\n\n //VIEWPORT NAVIGATOR SETTINGS\n showNavigator: false,\n navigatorId: null,\n navigatorPosition: null,\n navigatorSizeRatio: 0.2,\n navigatorMaintainSizeRatio: false,\n navigatorTop: null,\n navigatorLeft: null,\n navigatorHeight: null,\n navigatorWidth: null,\n navigatorAutoResize: true,\n navigatorAutoFade: true,\n navigatorRotate: true,\n navigatorBackground: '#000',\n navigatorOpacity: 0.8,\n navigatorBorderColor: '#555',\n navigatorDisplayRegionColor: '#900',\n\n // INITIAL ROTATION\n degrees: 0,\n\n // INITIAL FLIP STATE\n flipped: false,\n\n // APPEARANCE\n opacity: 1,\n preload: false,\n compositeOperation: null,\n imageSmoothingEnabled: true,\n placeholderFillStyle: null,\n\n //REFERENCE STRIP SETTINGS\n showReferenceStrip: false,\n referenceStripScroll: 'horizontal',\n referenceStripElement: null,\n referenceStripHeight: null,\n referenceStripWidth: null,\n referenceStripPosition: 'BOTTOM_LEFT',\n referenceStripSizeRatio: 0.2,\n\n //COLLECTION VISUALIZATION SETTINGS\n collectionRows: 3, //or columns depending on layout\n collectionColumns: 0, //columns in horizontal layout, rows in vertical layout\n collectionLayout: 'horizontal', //vertical\n collectionMode: false,\n collectionTileSize: 800,\n collectionTileMargin: 80,\n\n //PERFORMANCE SETTINGS\n imageLoaderLimit: 0,\n maxImageCacheCount: 200,\n timeout: 30000,\n useCanvas: true, // Use canvas element for drawing if available\n\n //INTERFACE RESOURCE SETTINGS\n prefixUrl: \"/images/\",\n navImages: {\n zoomIn: {\n REST: 'zoomin_rest.png',\n GROUP: 'zoomin_grouphover.png',\n HOVER: 'zoomin_hover.png',\n DOWN: 'zoomin_pressed.png'\n },\n zoomOut: {\n REST: 'zoomout_rest.png',\n GROUP: 'zoomout_grouphover.png',\n HOVER: 'zoomout_hover.png',\n DOWN: 'zoomout_pressed.png'\n },\n home: {\n REST: 'home_rest.png',\n GROUP: 'home_grouphover.png',\n HOVER: 'home_hover.png',\n DOWN: 'home_pressed.png'\n },\n fullpage: {\n REST: 'fullpage_rest.png',\n GROUP: 'fullpage_grouphover.png',\n HOVER: 'fullpage_hover.png',\n DOWN: 'fullpage_pressed.png'\n },\n rotateleft: {\n REST: 'rotateleft_rest.png',\n GROUP: 'rotateleft_grouphover.png',\n HOVER: 'rotateleft_hover.png',\n DOWN: 'rotateleft_pressed.png'\n },\n rotateright: {\n REST: 'rotateright_rest.png',\n GROUP: 'rotateright_grouphover.png',\n HOVER: 'rotateright_hover.png',\n DOWN: 'rotateright_pressed.png'\n },\n flip: { // Flip icon designed by Yaroslav Samoylov from the Noun Project and modified by Nelson Campos ncampos@criteriamarathon.com, https://thenounproject.com/term/flip/136289/\n REST: 'flip_rest.png',\n GROUP: 'flip_grouphover.png',\n HOVER: 'flip_hover.png',\n DOWN: 'flip_pressed.png'\n },\n previous: {\n REST: 'previous_rest.png',\n GROUP: 'previous_grouphover.png',\n HOVER: 'previous_hover.png',\n DOWN: 'previous_pressed.png'\n },\n next: {\n REST: 'next_rest.png',\n GROUP: 'next_grouphover.png',\n HOVER: 'next_hover.png',\n DOWN: 'next_pressed.png'\n }\n },\n\n //DEVELOPER SETTINGS\n debugMode: false,\n debugGridColor: ['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']\n },\n\n\n /**\n * TODO: get rid of this. I can't see how it's required at all. Looks\n * like an early legacy code artifact.\n * @static\n * @ignore\n */\n SIGNAL: \"----seadragon----\",\n\n\n /**\n * Returns a function which invokes the method as if it were a method belonging to the object.\n * @function\n * @param {Object} object\n * @param {Function} method\n * @returns {Function}\n */\n delegate: function( object, method ) {\n return function(){\n var args = arguments;\n if ( args === undefined ){\n args = [];\n }\n return method.apply( object, args );\n };\n },\n\n\n /**\n * An enumeration of Browser vendors.\n * @static\n * @type {Object}\n * @property {Number} UNKNOWN\n * @property {Number} IE\n * @property {Number} FIREFOX\n * @property {Number} SAFARI\n * @property {Number} CHROME\n * @property {Number} OPERA\n * @property {Number} EDGE\n * @property {Number} CHROMEEDGE\n */\n BROWSERS: {\n UNKNOWN: 0,\n IE: 1,\n FIREFOX: 2,\n SAFARI: 3,\n CHROME: 4,\n OPERA: 5,\n EDGE: 6,\n CHROMEEDGE: 7\n },\n\n /**\n * Keep track of which {@link Viewer}s have been created.\n * - Key: {@link Element} to which a Viewer is attached.\n * - Value: {@link Viewer} of the element defined by the key.\n * @private\n * @static\n * @type {Object}\n */\n _viewers: new Map(),\n\n /**\n * Returns the {@link Viewer} attached to a given DOM element. If there is\n * no viewer attached to the provided element, undefined is returned.\n * @function\n * @param {String|Element} element Accepts an id or element.\n * @returns {Viewer} The viewer attached to the given element, or undefined.\n */\n getViewer: function(element) {\n return $._viewers.get(this.getElement(element));\n },\n\n /**\n * Returns a DOM Element for the given id or element.\n * @function\n * @param {String|Element} element Accepts an id or element.\n * @returns {Element} The element with the given id, null, or the element itself.\n */\n getElement: function( element ) {\n if ( typeof ( element ) === \"string\" ) {\n element = document.getElementById( element );\n }\n return element;\n },\n\n\n /**\n * Determines the position of the upper-left corner of the element.\n * @function\n * @param {Element|String} element - the element we want the position for.\n * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element.\n */\n getElementPosition: function( element ) {\n var result = new $.Point(),\n isFixed,\n offsetParent;\n\n element = $.getElement( element );\n isFixed = $.getElementStyle( element ).position === \"fixed\";\n offsetParent = getOffsetParent( element, isFixed );\n\n while ( offsetParent ) {\n\n result.x += element.offsetLeft;\n result.y += element.offsetTop;\n\n if ( isFixed ) {\n result = result.plus( $.getPageScroll() );\n }\n\n element = offsetParent;\n isFixed = $.getElementStyle( element ).position === \"fixed\";\n offsetParent = getOffsetParent( element, isFixed );\n }\n\n return result;\n },\n\n\n /**\n * Determines the position of the upper-left corner of the element adjusted for current page and/or element scroll.\n * @function\n * @param {Element|String} element - the element we want the position for.\n * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element adjusted for current page and/or element scroll.\n */\n getElementOffset: function( element ) {\n element = $.getElement( element );\n\n var doc = element && element.ownerDocument,\n docElement,\n win,\n boundingRect = { top: 0, left: 0 };\n\n if ( !doc ) {\n return new $.Point();\n }\n\n docElement = doc.documentElement;\n\n if ( typeof element.getBoundingClientRect !== typeof undefined ) {\n boundingRect = element.getBoundingClientRect();\n }\n\n win = ( doc === doc.window ) ?\n doc :\n ( doc.nodeType === 9 ) ?\n doc.defaultView || doc.parentWindow :\n false;\n\n return new $.Point(\n boundingRect.left + ( win.pageXOffset || docElement.scrollLeft ) - ( docElement.clientLeft || 0 ),\n boundingRect.top + ( win.pageYOffset || docElement.scrollTop ) - ( docElement.clientTop || 0 )\n );\n },\n\n\n /**\n * Determines the height and width of the given element.\n * @function\n * @param {Element|String} element\n * @returns {OpenSeadragon.Point}\n */\n getElementSize: function( element ) {\n element = $.getElement( element );\n\n return new $.Point(\n element.clientWidth,\n element.clientHeight\n );\n },\n\n\n /**\n * Returns the CSSStyle object for the given element.\n * @function\n * @param {Element|String} element\n * @returns {CSSStyle}\n */\n getElementStyle:\n document.documentElement.currentStyle ?\n function( element ) {\n element = $.getElement( element );\n return element.currentStyle;\n } :\n function( element ) {\n element = $.getElement( element );\n return window.getComputedStyle( element, \"\" );\n },\n\n /**\n * Returns the property with the correct vendor prefix appended.\n * @param {String} property the property name\n * @returns {String} the property with the correct prefix or null if not\n * supported.\n */\n getCssPropertyWithVendorPrefix: function(property) {\n var memo = {};\n\n $.getCssPropertyWithVendorPrefix = function(property) {\n if (memo[property] !== undefined) {\n return memo[property];\n }\n var style = document.createElement('div').style;\n var result = null;\n if (style[property] !== undefined) {\n result = property;\n } else {\n var prefixes = ['Webkit', 'Moz', 'MS', 'O',\n 'webkit', 'moz', 'ms', 'o'];\n var suffix = $.capitalizeFirstLetter(property);\n for (var i = 0; i < prefixes.length; i++) {\n var prop = prefixes[i] + suffix;\n if (style[prop] !== undefined) {\n result = prop;\n break;\n }\n }\n }\n memo[property] = result;\n return result;\n };\n return $.getCssPropertyWithVendorPrefix(property);\n },\n\n /**\n * Capitalizes the first letter of a string\n * @param {String} string\n * @returns {String} The string with the first letter capitalized\n */\n capitalizeFirstLetter: function(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n },\n\n /**\n * Compute the modulo of a number but makes sure to always return\n * a positive value.\n * @param {Number} number the number to computes the modulo of\n * @param {Number} modulo the modulo\n * @returns {Number} the result of the modulo of number\n */\n positiveModulo: function(number, modulo) {\n var result = number % modulo;\n if (result < 0) {\n result += modulo;\n }\n return result;\n },\n\n /**\n * Determines if a point is within the bounding rectangle of the given element (hit-test).\n * @function\n * @param {Element|String} element\n * @param {OpenSeadragon.Point} point\n * @returns {Boolean}\n */\n pointInElement: function( element, point ) {\n element = $.getElement( element );\n var offset = $.getElementOffset( element ),\n size = $.getElementSize( element );\n return point.x >= offset.x && point.x < offset.x + size.x && point.y < offset.y + size.y && point.y >= offset.y;\n },\n\n\n /**\n * Gets the position of the mouse on the screen for a given event.\n * @function\n * @param {Event} [event]\n * @returns {OpenSeadragon.Point}\n */\n getMousePosition: function( event ) {\n\n if ( typeof ( event.pageX ) === \"number\" ) {\n $.getMousePosition = function( event ){\n var result = new $.Point();\n\n result.x = event.pageX;\n result.y = event.pageY;\n\n return result;\n };\n } else if ( typeof ( event.clientX ) === \"number\" ) {\n $.getMousePosition = function( event ){\n var result = new $.Point();\n\n result.x =\n event.clientX +\n document.body.scrollLeft +\n document.documentElement.scrollLeft;\n result.y =\n event.clientY +\n document.body.scrollTop +\n document.documentElement.scrollTop;\n\n return result;\n };\n } else {\n throw new Error(\n \"Unknown event mouse position, no known technique.\"\n );\n }\n\n return $.getMousePosition( event );\n },\n\n\n /**\n * Determines the page's current scroll position.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n getPageScroll: function() {\n var docElement = document.documentElement || {},\n body = document.body || {};\n\n if ( typeof ( window.pageXOffset ) === \"number\" ) {\n $.getPageScroll = function(){\n return new $.Point(\n window.pageXOffset,\n window.pageYOffset\n );\n };\n } else if ( body.scrollLeft || body.scrollTop ) {\n $.getPageScroll = function(){\n return new $.Point(\n document.body.scrollLeft,\n document.body.scrollTop\n );\n };\n } else if ( docElement.scrollLeft || docElement.scrollTop ) {\n $.getPageScroll = function(){\n return new $.Point(\n document.documentElement.scrollLeft,\n document.documentElement.scrollTop\n );\n };\n } else {\n // We can't reassign the function yet, as there was no scroll.\n return new $.Point(0, 0);\n }\n\n return $.getPageScroll();\n },\n\n /**\n * Set the page scroll position.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n setPageScroll: function( scroll ) {\n if ( typeof ( window.scrollTo ) !== \"undefined\" ) {\n $.setPageScroll = function( scroll ) {\n window.scrollTo( scroll.x, scroll.y );\n };\n } else {\n var originalScroll = $.getPageScroll();\n if ( originalScroll.x === scroll.x &&\n originalScroll.y === scroll.y ) {\n // We are already correctly positioned and there\n // is no way to detect the correct method.\n return;\n }\n\n document.body.scrollLeft = scroll.x;\n document.body.scrollTop = scroll.y;\n var currentScroll = $.getPageScroll();\n if ( currentScroll.x !== originalScroll.x &&\n currentScroll.y !== originalScroll.y ) {\n $.setPageScroll = function( scroll ) {\n document.body.scrollLeft = scroll.x;\n document.body.scrollTop = scroll.y;\n };\n return;\n }\n\n document.documentElement.scrollLeft = scroll.x;\n document.documentElement.scrollTop = scroll.y;\n currentScroll = $.getPageScroll();\n if ( currentScroll.x !== originalScroll.x &&\n currentScroll.y !== originalScroll.y ) {\n $.setPageScroll = function( scroll ) {\n document.documentElement.scrollLeft = scroll.x;\n document.documentElement.scrollTop = scroll.y;\n };\n return;\n }\n\n // We can't find anything working, so we do nothing.\n $.setPageScroll = function( scroll ) {\n };\n }\n\n $.setPageScroll( scroll );\n },\n\n /**\n * Determines the size of the browsers window.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n getWindowSize: function() {\n var docElement = document.documentElement || {},\n body = document.body || {};\n\n if ( typeof ( window.innerWidth ) === 'number' ) {\n $.getWindowSize = function(){\n return new $.Point(\n window.innerWidth,\n window.innerHeight\n );\n };\n } else if ( docElement.clientWidth || docElement.clientHeight ) {\n $.getWindowSize = function(){\n return new $.Point(\n document.documentElement.clientWidth,\n document.documentElement.clientHeight\n );\n };\n } else if ( body.clientWidth || body.clientHeight ) {\n $.getWindowSize = function(){\n return new $.Point(\n document.body.clientWidth,\n document.body.clientHeight\n );\n };\n } else {\n throw new Error(\"Unknown window size, no known technique.\");\n }\n\n return $.getWindowSize();\n },\n\n\n /**\n * Wraps the given element in a nest of divs so that the element can\n * be easily centered using CSS tables\n * @function\n * @param {Element|String} element\n * @returns {Element} outermost wrapper element\n */\n makeCenteredNode: function( element ) {\n // Convert a possible ID to an actual HTMLElement\n element = $.getElement( element );\n\n /*\n CSS tables require you to have a display:table/row/cell hierarchy so we need to create\n three nested wrapper divs:\n */\n\n var wrappers = [\n $.makeNeutralElement( 'div' ),\n $.makeNeutralElement( 'div' ),\n $.makeNeutralElement( 'div' )\n ];\n\n // It feels like we should be able to pass style dicts to makeNeutralElement:\n $.extend(wrappers[0].style, {\n display: \"table\",\n height: \"100%\",\n width: \"100%\"\n });\n\n $.extend(wrappers[1].style, {\n display: \"table-row\"\n });\n\n $.extend(wrappers[2].style, {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n textAlign: \"center\"\n });\n\n wrappers[0].appendChild(wrappers[1]);\n wrappers[1].appendChild(wrappers[2]);\n wrappers[2].appendChild(element);\n\n return wrappers[0];\n },\n\n\n /**\n * Creates an easily positionable element of the given type that therefor\n * serves as an excellent container element.\n * @function\n * @param {String} tagName\n * @returns {Element}\n */\n makeNeutralElement: function( tagName ) {\n var element = document.createElement( tagName ),\n style = element.style;\n\n style.background = \"transparent none\";\n style.border = \"none\";\n style.margin = \"0px\";\n style.padding = \"0px\";\n style.position = \"static\";\n\n return element;\n },\n\n\n /**\n * Returns the current milliseconds, using Date.now() if available\n * @function\n */\n now: function( ) {\n if (Date.now) {\n $.now = Date.now;\n } else {\n $.now = function() {\n return new Date().getTime();\n };\n }\n\n return $.now();\n },\n\n\n /**\n * Ensures an image is loaded correctly to support alpha transparency.\n * @function\n * @param {String} src\n * @returns {Element}\n */\n makeTransparentImage: function( src ) {\n var img = $.makeNeutralElement( \"img\" );\n\n img.src = src;\n\n return img;\n },\n\n\n /**\n * Sets the opacity of the specified element.\n * @function\n * @param {Element|String} element\n * @param {Number} opacity\n * @param {Boolean} [usesAlpha]\n */\n setElementOpacity: function( element, opacity, usesAlpha ) {\n\n var ieOpacity,\n ieFilter;\n\n element = $.getElement( element );\n\n if ( usesAlpha && !$.Browser.alpha ) {\n opacity = Math.round( opacity );\n }\n\n if ( $.Browser.opacity ) {\n element.style.opacity = opacity < 1 ? opacity : \"\";\n } else {\n if ( opacity < 1 ) {\n ieOpacity = Math.round( 100 * opacity );\n ieFilter = \"alpha(opacity=\" + ieOpacity + \")\";\n element.style.filter = ieFilter;\n } else {\n element.style.filter = \"\";\n }\n }\n },\n\n\n /**\n * Sets the specified element's touch-action style attribute to 'none'.\n * @function\n * @param {Element|String} element\n */\n setElementTouchActionNone: function( element ) {\n element = $.getElement( element );\n if ( typeof element.style.touchAction !== 'undefined' ) {\n element.style.touchAction = 'none';\n } else if ( typeof element.style.msTouchAction !== 'undefined' ) {\n element.style.msTouchAction = 'none';\n }\n },\n\n\n /**\n * Sets the specified element's pointer-events style attribute to the passed value.\n * @function\n * @param {Element|String} element\n * @param {String} value\n */\n setElementPointerEvents: function( element, value ) {\n element = $.getElement( element );\n if ( typeof element.style.pointerEvents !== 'undefined' ) {\n element.style.pointerEvents = value;\n }\n },\n\n\n /**\n * Sets the specified element's pointer-events style attribute to 'none'.\n * @function\n * @param {Element|String} element\n */\n setElementPointerEventsNone: function( element ) {\n $.setElementPointerEvents( element, 'none' );\n },\n\n\n /**\n * Add the specified CSS class to the element if not present.\n * @function\n * @param {Element|String} element\n * @param {String} className\n */\n addClass: function( element, className ) {\n element = $.getElement( element );\n\n if (!element.className) {\n element.className = className;\n } else if ( ( ' ' + element.className + ' ' ).\n indexOf( ' ' + className + ' ' ) === -1 ) {\n element.className += ' ' + className;\n }\n },\n\n /**\n * Find the first index at which an element is found in an array or -1\n * if not present.\n *\n * Code taken and adapted from\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility\n *\n * @function\n * @param {Array} array The array from which to find the element\n * @param {Object} searchElement The element to find\n * @param {Number} [fromIndex=0] Index to start research.\n * @returns {Number} The index of the element in the array.\n */\n indexOf: function( array, searchElement, fromIndex ) {\n if ( Array.prototype.indexOf ) {\n this.indexOf = function( array, searchElement, fromIndex ) {\n return array.indexOf( searchElement, fromIndex );\n };\n } else {\n this.indexOf = function( array, searchElement, fromIndex ) {\n var i,\n pivot = ( fromIndex ) ? fromIndex : 0,\n length;\n if ( !array ) {\n throw new TypeError( );\n }\n\n length = array.length;\n if ( length === 0 || pivot >= length ) {\n return -1;\n }\n\n if ( pivot < 0 ) {\n pivot = length - Math.abs( pivot );\n }\n\n for ( i = pivot; i < length; i++ ) {\n if ( array[i] === searchElement ) {\n return i;\n }\n }\n return -1;\n };\n }\n return this.indexOf( array, searchElement, fromIndex );\n },\n\n /**\n * Remove the specified CSS class from the element.\n * @function\n * @param {Element|String} element\n * @param {String} className\n */\n removeClass: function( element, className ) {\n var oldClasses,\n newClasses = [],\n i;\n\n element = $.getElement( element );\n oldClasses = element.className.split( /\\s+/ );\n for ( i = 0; i < oldClasses.length; i++ ) {\n if ( oldClasses[ i ] && oldClasses[ i ] !== className ) {\n newClasses.push( oldClasses[ i ] );\n }\n }\n element.className = newClasses.join(' ');\n },\n\n /**\n * Convert passed addEventListener() options to boolean or options object,\n * depending on browser support.\n * @function\n * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object\n * @param {Boolean} [options.capture]\n * @param {Boolean} [options.passive]\n * @param {Boolean} [options.once]\n * @return {String} The protocol (http:, https:, file:, ftp: ...)\n */\n normalizeEventListenerOptions: function (options) {\n var opts;\n if ( typeof options !== 'undefined' ) {\n if ( typeof options === 'boolean' ) {\n // Legacy Boolean useCapture\n opts = $.supportsEventListenerOptions ? { capture: options } : options;\n } else {\n // Options object\n opts = $.supportsEventListenerOptions ? options :\n ( ( typeof options.capture !== 'undefined' ) ? options.capture : false );\n }\n } else {\n // No options specified - Legacy optional useCapture argument\n // (for IE, first supported on version 9, so we'll pass a Boolean)\n opts = $.supportsEventListenerOptions ? { capture: false } : false;\n }\n return opts;\n },\n\n /**\n * Adds an event listener for the given element, eventName and handler.\n * @function\n * @param {Element|String} element\n * @param {String} eventName\n * @param {Function} handler\n * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object\n * @param {Boolean} [options.capture]\n * @param {Boolean} [options.passive]\n * @param {Boolean} [options.once]\n */\n addEvent: (function () {\n if ( $.supportsAddEventListener ) {\n return function ( element, eventName, handler, options ) {\n options = $.normalizeEventListenerOptions(options);\n element = $.getElement( element );\n element.addEventListener( eventName, handler, options );\n };\n } else if ( document.documentElement.attachEvent && document.attachEvent ) {\n return function ( element, eventName, handler ) {\n element = $.getElement( element );\n element.attachEvent( 'on' + eventName, handler );\n };\n } else {\n throw new Error( \"No known event model.\" );\n }\n }()),\n\n\n /**\n * Remove a given event listener for the given element, event type and\n * handler.\n * @function\n * @param {Element|String} element\n * @param {String} eventName\n * @param {Function} handler\n * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object\n * @param {Boolean} [options.capture]\n */\n removeEvent: (function () {\n if ( $.supportsRemoveEventListener ) {\n return function ( element, eventName, handler, options ) {\n options = $.normalizeEventListenerOptions(options);\n element = $.getElement( element );\n element.removeEventListener( eventName, handler, options );\n };\n } else if ( document.documentElement.detachEvent && document.detachEvent ) {\n return function( element, eventName, handler ) {\n element = $.getElement( element );\n element.detachEvent( 'on' + eventName, handler );\n };\n } else {\n throw new Error( \"No known event model.\" );\n }\n }()),\n\n\n /**\n * Cancels the default browser behavior had the event propagated all\n * the way up the DOM to the window object.\n * @function\n * @param {Event} [event]\n */\n cancelEvent: function( event ) {\n event.preventDefault();\n },\n\n\n /**\n * Returns true if {@link OpenSeadragon.cancelEvent|cancelEvent} has been called on\n * the event, otherwise returns false.\n * @function\n * @param {Event} [event]\n */\n eventIsCanceled: function( event ) {\n return event.defaultPrevented;\n },\n\n\n /**\n * Stops the propagation of the event through the DOM in the capturing and bubbling phases.\n * @function\n * @param {Event} [event]\n */\n stopEvent: function( event ) {\n event.stopPropagation();\n },\n\n\n /**\n * Similar to OpenSeadragon.delegate, but it does not immediately call\n * the method on the object, returning a function which can be called\n * repeatedly to delegate the method. It also allows additional arguments\n * to be passed during construction which will be added during each\n * invocation, and each invocation can add additional arguments as well.\n *\n * @function\n * @param {Object} object\n * @param {Function} method\n * @param [args] any additional arguments are passed as arguments to the\n * created callback\n * @returns {Function}\n */\n createCallback: function( object, method ) {\n //TODO: This pattern is painful to use and debug. It's much cleaner\n // to use pinning plus anonymous functions. Get rid of this\n // pattern!\n var initialArgs = [],\n i;\n for ( i = 2; i < arguments.length; i++ ) {\n initialArgs.push( arguments[ i ] );\n }\n\n return function() {\n var args = initialArgs.concat( [] ),\n i;\n for ( i = 0; i < arguments.length; i++ ) {\n args.push( arguments[ i ] );\n }\n\n return method.apply( object, args );\n };\n },\n\n\n /**\n * Retrieves the value of a url parameter from the window.location string.\n * @function\n * @param {String} key\n * @returns {String} The value of the url parameter or null if no param matches.\n */\n getUrlParameter: function( key ) {\n // eslint-disable-next-line no-use-before-define\n var value = URLPARAMS[ key ];\n return value ? value : null;\n },\n\n /**\n * Retrieves the protocol used by the url. The url can either be absolute\n * or relative.\n * @function\n * @private\n * @param {String} url The url to retrieve the protocol from.\n * @return {String} The protocol (http:, https:, file:, ftp: ...)\n */\n getUrlProtocol: function( url ) {\n var match = url.match(/^([a-z]+:)\\/\\//i);\n if ( match === null ) {\n // Relative URL, retrive the protocol from window.location\n return window.location.protocol;\n }\n return match[1].toLowerCase();\n },\n\n /**\n * Create an XHR object\n * @private\n * @param {type} [local] If set to true, the XHR will be file: protocol\n * compatible if possible (but may raise a warning in the browser).\n * @returns {XMLHttpRequest}\n */\n createAjaxRequest: function( local ) {\n // IE11 does not support window.ActiveXObject so we just try to\n // create one to see if it is supported.\n // See: http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx\n var supportActiveX;\n try {\n /* global ActiveXObject:true */\n supportActiveX = !!new ActiveXObject( \"Microsoft.XMLHTTP\" );\n } catch( e ) {\n supportActiveX = false;\n }\n\n if ( supportActiveX ) {\n if ( window.XMLHttpRequest ) {\n $.createAjaxRequest = function( local ) {\n if ( local ) {\n return new ActiveXObject( \"Microsoft.XMLHTTP\" );\n }\n return new XMLHttpRequest();\n };\n } else {\n $.createAjaxRequest = function() {\n return new ActiveXObject( \"Microsoft.XMLHTTP\" );\n };\n }\n } else if ( window.XMLHttpRequest ) {\n $.createAjaxRequest = function() {\n return new XMLHttpRequest();\n };\n } else {\n throw new Error( \"Browser doesn't support XMLHttpRequest.\" );\n }\n return $.createAjaxRequest( local );\n },\n\n /**\n * Makes an AJAX request.\n * @param {Object} options\n * @param {String} options.url - the url to request\n * @param {Function} options.success - a function to call on a successful response\n * @param {Function} options.error - a function to call on when an error occurs\n * @param {Object} options.headers - headers to add to the AJAX request\n * @param {String} options.responseType - the response type of the the AJAX request\n * @param {Boolean} [options.withCredentials=false] - whether to set the XHR's withCredentials\n * @throws {Error}\n * @returns {XMLHttpRequest}\n */\n makeAjaxRequest: function( url, onSuccess, onError ) {\n var withCredentials;\n var headers;\n var responseType;\n\n // Note that our preferred API is that you pass in a single object; the named\n // arguments are for legacy support.\n if( $.isPlainObject( url ) ){\n onSuccess = url.success;\n onError = url.error;\n withCredentials = url.withCredentials;\n headers = url.headers;\n responseType = url.responseType || null;\n url = url.url;\n }\n\n var protocol = $.getUrlProtocol( url );\n var request = $.createAjaxRequest( protocol === \"file:\" );\n\n if ( !$.isFunction( onSuccess ) ) {\n throw new Error( \"makeAjaxRequest requires a success callback\" );\n }\n\n request.onreadystatechange = function() {\n // 4 = DONE (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties)\n if ( request.readyState === 4 ) {\n request.onreadystatechange = function(){};\n\n // With protocols other than http/https, a successful request status is in\n // the 200's on Firefox and 0 on other browsers\n if ( (request.status >= 200 && request.status < 300) ||\n ( request.status === 0 &&\n protocol !== \"http:\" &&\n protocol !== \"https:\" )) {\n onSuccess( request );\n } else {\n $.console.log( \"AJAX request returned %d: %s\", request.status, url );\n\n if ( $.isFunction( onError ) ) {\n onError( request );\n }\n }\n }\n };\n\n try {\n request.open( \"GET\", url, true );\n\n if (responseType) {\n request.responseType = responseType;\n }\n\n if (headers) {\n for (var headerName in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, headerName) && headers[headerName]) {\n request.setRequestHeader(headerName, headers[headerName]);\n }\n }\n }\n\n if (withCredentials) {\n request.withCredentials = true;\n }\n\n request.send(null);\n } catch (e) {\n $.console.log( \"%s while making AJAX request: %s\", e.name, e.message );\n\n request.onreadystatechange = function(){};\n\n if ( $.isFunction( onError ) ) {\n onError( request, e );\n }\n }\n\n return request;\n },\n\n /**\n * Taken from jQuery 1.6.1\n * @function\n * @param {Object} options\n * @param {String} options.url\n * @param {Function} options.callback\n * @param {String} [options.param='callback'] The name of the url parameter\n * to request the jsonp provider with.\n * @param {String} [options.callbackName=] The name of the callback to\n * request the jsonp provider with.\n */\n jsonp: function( options ){\n var script,\n url = options.url,\n head = document.head ||\n document.getElementsByTagName( \"head\" )[ 0 ] ||\n document.documentElement,\n jsonpCallback = options.callbackName || 'openseadragon' + $.now(),\n previous = window[ jsonpCallback ],\n replace = \"$1\" + jsonpCallback + \"$2\",\n callbackParam = options.param || 'callback',\n callback = options.callback;\n\n url = url.replace( /(=)\\?(&|$)|\\?\\?/i, replace );\n // Add callback manually\n url += (/\\?/.test( url ) ? \"&\" : \"?\") + callbackParam + \"=\" + jsonpCallback;\n\n // Install callback\n window[ jsonpCallback ] = function( response ) {\n if ( !previous ){\n try{\n delete window[ jsonpCallback ];\n }catch(e){\n //swallow\n }\n } else {\n window[ jsonpCallback ] = previous;\n }\n if( callback && $.isFunction( callback ) ){\n callback( response );\n }\n };\n\n script = document.createElement( \"script\" );\n\n //TODO: having an issue with async info requests\n if( undefined !== options.async || false !== options.async ){\n script.async = \"async\";\n }\n\n if ( options.scriptCharset ) {\n script.charset = options.scriptCharset;\n }\n\n script.src = url;\n\n // Attach handlers for all browsers\n script.onload = script.onreadystatechange = function( _, isAbort ) {\n\n if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n\n // Remove the script\n if ( head && script.parentNode ) {\n head.removeChild( script );\n }\n\n // Dereference the script\n script = undefined;\n }\n };\n // Use insertBefore instead of appendChild to circumvent an IE6 bug.\n // This arises when a base node is used (#2709 and #4378).\n head.insertBefore( script, head.firstChild );\n\n },\n\n\n /**\n * Fully deprecated. Will throw an error.\n * @function\n * @deprecated use {@link OpenSeadragon.Viewer#open}\n */\n createFromDZI: function() {\n throw \"OpenSeadragon.createFromDZI is deprecated, use Viewer.open.\";\n },\n\n /**\n * Parses an XML string into a DOM Document.\n * @function\n * @param {String} string\n * @returns {Document}\n */\n parseXml: function( string ) {\n if ( window.DOMParser ) {\n\n $.parseXml = function( string ) {\n var xmlDoc = null,\n parser;\n\n parser = new DOMParser();\n xmlDoc = parser.parseFromString( string, \"text/xml\" );\n return xmlDoc;\n };\n\n } else if ( window.ActiveXObject ) {\n\n $.parseXml = function( string ) {\n var xmlDoc = null;\n\n xmlDoc = new ActiveXObject( \"Microsoft.XMLDOM\" );\n xmlDoc.async = false;\n xmlDoc.loadXML( string );\n return xmlDoc;\n };\n\n } else {\n throw new Error( \"Browser doesn't support XML DOM.\" );\n }\n\n return $.parseXml( string );\n },\n\n /**\n * Parses a JSON string into a Javascript object.\n * @function\n * @param {String} string\n * @returns {Object}\n */\n parseJSON: function(string) {\n $.parseJSON = window.JSON.parse;\n return $.parseJSON(string);\n },\n\n /**\n * Reports whether the image format is supported for tiling in this\n * version.\n * @function\n * @param {String} [extension]\n * @returns {Boolean}\n */\n imageFormatSupported: function( extension ) {\n extension = extension ? extension : \"\";\n // eslint-disable-next-line no-use-before-define\n return !!FILEFORMATS[ extension.toLowerCase() ];\n },\n\n /**\n * Updates supported image formats with user-specified values.\n * Preexisting formats that are not being updated are left unchanged.\n * By default, the defined formats are\n *
    {\n         *      bmp:  false,\n         *      jpeg: true,\n         *      jpg:  true,\n         *      png:  true,\n         *      tif:  false,\n         *      wdp:  false\n         * }\n         * 
    \n * @function\n * @example\n * // sets webp as supported and png as unsupported\n * setImageFormatsSupported({webp: true, png: false});\n * @param {Object} formats An object containing format extensions as\n * keys and booleans as values.\n */\n setImageFormatsSupported: function(formats) {\n // eslint-disable-next-line no-use-before-define\n $.extend(FILEFORMATS, formats);\n }\n\n });\n\n\n //TODO: $.console is often used inside a try/catch block which generally\n // prevents allowings errors to occur with detection until a debugger\n // is attached. Although I've been guilty of the same anti-pattern\n // I eventually was convinced that errors should naturally propagate in\n // all but the most special cases.\n /**\n * A convenient alias for console when available, and a simple null\n * function when console is unavailable.\n * @static\n * @private\n */\n var nullfunction = function( msg ){\n //document.location.hash = msg;\n };\n\n $.console = window.console || {\n log: nullfunction,\n debug: nullfunction,\n info: nullfunction,\n warn: nullfunction,\n error: nullfunction,\n assert: nullfunction\n };\n\n\n /**\n * The current browser vendor, version, and related information regarding detected features.\n * @member {Object} Browser\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {OpenSeadragon.BROWSERS} vendor - One of the {@link OpenSeadragon.BROWSERS} enumeration values.\n * @property {Number} version\n * @property {Boolean} alpha - Does the browser support image alpha transparency.\n */\n $.Browser = {\n vendor: $.BROWSERS.UNKNOWN,\n version: 0,\n alpha: true\n };\n\n\n var FILEFORMATS = {\n bmp: false,\n jpeg: true,\n jpg: true,\n png: true,\n tif: false,\n wdp: false\n },\n URLPARAMS = {};\n\n (function() {\n //A small auto-executing routine to determine the browser vendor,\n //version and supporting feature sets.\n var ver = navigator.appVersion,\n ua = navigator.userAgent,\n regex;\n\n //console.error( 'appName: ' + navigator.appName );\n //console.error( 'appVersion: ' + navigator.appVersion );\n //console.error( 'userAgent: ' + navigator.userAgent );\n\n switch( navigator.appName ){\n case \"Microsoft Internet Explorer\":\n if( !!window.attachEvent &&\n !!window.ActiveXObject ) {\n\n $.Browser.vendor = $.BROWSERS.IE;\n $.Browser.version = parseFloat(\n ua.substring(\n ua.indexOf( \"MSIE\" ) + 5,\n ua.indexOf( \";\", ua.indexOf( \"MSIE\" ) ) )\n );\n }\n break;\n case \"Netscape\":\n if (window.addEventListener) {\n if ( ua.indexOf( \"Edge\" ) >= 0 ) {\n $.Browser.vendor = $.BROWSERS.EDGE;\n $.Browser.version = parseFloat(\n ua.substring( ua.indexOf( \"Edge\" ) + 5 )\n );\n } else if ( ua.indexOf( \"Edg\" ) >= 0 ) {\n $.Browser.vendor = $.BROWSERS.CHROMEEDGE;\n $.Browser.version = parseFloat(\n ua.substring( ua.indexOf( \"Edg\" ) + 4 )\n );\n } else if ( ua.indexOf( \"Firefox\" ) >= 0 ) {\n $.Browser.vendor = $.BROWSERS.FIREFOX;\n $.Browser.version = parseFloat(\n ua.substring( ua.indexOf( \"Firefox\" ) + 8 )\n );\n } else if ( ua.indexOf( \"Safari\" ) >= 0 ) {\n $.Browser.vendor = ua.indexOf( \"Chrome\" ) >= 0 ?\n $.BROWSERS.CHROME :\n $.BROWSERS.SAFARI;\n $.Browser.version = parseFloat(\n ua.substring(\n ua.substring( 0, ua.indexOf( \"Safari\" ) ).lastIndexOf( \"/\" ) + 1,\n ua.indexOf( \"Safari\" )\n )\n );\n } else {\n regex = new RegExp( \"Trident/.*rv:([0-9]{1,}[.0-9]{0,})\");\n if ( regex.exec( ua ) !== null ) {\n $.Browser.vendor = $.BROWSERS.IE;\n $.Browser.version = parseFloat( RegExp.$1 );\n }\n }\n }\n break;\n case \"Opera\":\n $.Browser.vendor = $.BROWSERS.OPERA;\n $.Browser.version = parseFloat( ver );\n break;\n }\n\n // ignore '?' portion of query string\n var query = window.location.search.substring( 1 ),\n parts = query.split('&'),\n part,\n sep,\n i;\n\n for ( i = 0; i < parts.length; i++ ) {\n part = parts[ i ];\n sep = part.indexOf( '=' );\n\n if ( sep > 0 ) {\n var key = part.substring( 0, sep ),\n value = part.substring( sep + 1 );\n try {\n URLPARAMS[ key ] = decodeURIComponent( value );\n } catch (e) {\n $.console.error( \"Ignoring malformed URL parameter: %s=%s\", key, value );\n }\n }\n }\n\n //determine if this browser supports image alpha transparency\n $.Browser.alpha = !(\n $.Browser.vendor === $.BROWSERS.CHROME && $.Browser.version < 2\n );\n\n //determine if this browser supports element.style.opacity\n $.Browser.opacity = true;\n\n if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 11 ) {\n $.console.error('Internet Explorer versions < 11 are not supported by OpenSeadragon');\n }\n })();\n\n\n // Adding support for HTML5's requestAnimationFrame as suggested by acdha.\n // Implementation taken from matt synder's post here:\n // http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation/\n (function( w ) {\n\n // most browsers have an implementation\n var requestAnimationFrame = w.requestAnimationFrame ||\n w.mozRequestAnimationFrame ||\n w.webkitRequestAnimationFrame ||\n w.msRequestAnimationFrame;\n\n var cancelAnimationFrame = w.cancelAnimationFrame ||\n w.mozCancelAnimationFrame ||\n w.webkitCancelAnimationFrame ||\n w.msCancelAnimationFrame;\n\n // polyfill, when necessary\n if ( requestAnimationFrame && cancelAnimationFrame ) {\n // We can't assign these window methods directly to $ because they\n // expect their \"this\" to be \"window\", so we call them in wrappers.\n $.requestAnimationFrame = function(){\n return requestAnimationFrame.apply( w, arguments );\n };\n $.cancelAnimationFrame = function(){\n return cancelAnimationFrame.apply( w, arguments );\n };\n } else {\n var aAnimQueue = [],\n processing = [],\n iRequestId = 0,\n iIntervalId;\n\n // create a mock requestAnimationFrame function\n $.requestAnimationFrame = function( callback ) {\n aAnimQueue.push( [ ++iRequestId, callback ] );\n\n if ( !iIntervalId ) {\n iIntervalId = setInterval( function() {\n if ( aAnimQueue.length ) {\n var time = $.now();\n // Process all of the currently outstanding frame\n // requests, but none that get added during the\n // processing.\n // Swap the arrays so we don't have to create a new\n // array every frame.\n var temp = processing;\n processing = aAnimQueue;\n aAnimQueue = temp;\n while ( processing.length ) {\n processing.shift()[ 1 ]( time );\n }\n } else {\n // don't continue the interval, if unnecessary\n clearInterval( iIntervalId );\n iIntervalId = undefined;\n }\n }, 1000 / 50); // estimating support for 50 frames per second\n }\n\n return iRequestId;\n };\n\n // create a mock cancelAnimationFrame function\n $.cancelAnimationFrame = function( requestId ) {\n // find the request ID and remove it\n var i, j;\n for ( i = 0, j = aAnimQueue.length; i < j; i += 1 ) {\n if ( aAnimQueue[ i ][ 0 ] === requestId ) {\n aAnimQueue.splice( i, 1 );\n return;\n }\n }\n\n // If it's not in the queue, it may be in the set we're currently\n // processing (if cancelAnimationFrame is called from within a\n // requestAnimationFrame callback).\n for ( i = 0, j = processing.length; i < j; i += 1 ) {\n if ( processing[ i ][ 0 ] === requestId ) {\n processing.splice( i, 1 );\n return;\n }\n }\n };\n }\n })( window );\n\n /**\n * @private\n * @inner\n * @function\n * @param {Element} element\n * @param {Boolean} [isFixed]\n * @returns {Element}\n */\n function getOffsetParent( element, isFixed ) {\n if ( isFixed && element !== document.body ) {\n return document.body;\n } else {\n return element.offsetParent;\n }\n }\n\n}(OpenSeadragon));\n\n\n// Universal Module Definition, supports CommonJS, AMD and simple script tag\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // expose as amd module\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n // expose as commonjs module\n module.exports = factory();\n } else {\n // expose as window.OpenSeadragon\n root.OpenSeadragon = factory();\n }\n}(this, function () {\n return OpenSeadragon;\n}));\n\n/*\n * OpenSeadragon - full-screen support functions\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ) {\n /**\n * Determine native full screen support we can get from the browser.\n * @member fullScreenApi\n * @memberof OpenSeadragon\n * @type {object}\n * @property {Boolean} supportsFullScreen Return true if full screen API is supported.\n * @property {Function} isFullScreen Return true if currently in full screen mode.\n * @property {Function} getFullScreenElement Return the element currently in full screen mode.\n * @property {Function} requestFullScreen Make a request to go in full screen mode.\n * @property {Function} exitFullScreen Make a request to exit full screen mode.\n * @property {Function} cancelFullScreen Deprecated, use exitFullScreen instead.\n * @property {String} fullScreenEventName Event fired when the full screen mode change.\n * @property {String} fullScreenErrorEventName Event fired when a request to go\n * in full screen mode failed.\n */\n var fullScreenApi = {\n supportsFullScreen: false,\n isFullScreen: function() { return false; },\n getFullScreenElement: function() { return null; },\n requestFullScreen: function() {},\n exitFullScreen: function() {},\n cancelFullScreen: function() {},\n fullScreenEventName: '',\n fullScreenErrorEventName: ''\n };\n\n // check for native support\n if ( document.exitFullscreen ) {\n // W3C standard\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.fullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.requestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.exitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"fullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"fullscreenerror\";\n } else if ( document.msExitFullscreen ) {\n // IE 11\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.msFullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.msRequestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.msExitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"MSFullscreenChange\";\n fullScreenApi.fullScreenErrorEventName = \"MSFullscreenError\";\n } else if ( document.webkitExitFullscreen ) {\n // Recent webkit\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.webkitFullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.webkitRequestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.webkitExitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"webkitfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"webkitfullscreenerror\";\n } else if ( document.webkitCancelFullScreen ) {\n // Old webkit\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.webkitCurrentFullScreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.webkitRequestFullScreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.webkitCancelFullScreen();\n };\n fullScreenApi.fullScreenEventName = \"webkitfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"webkitfullscreenerror\";\n } else if ( document.mozCancelFullScreen ) {\n // Firefox\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.mozFullScreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.mozRequestFullScreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.mozCancelFullScreen();\n };\n fullScreenApi.fullScreenEventName = \"mozfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"mozfullscreenerror\";\n }\n fullScreenApi.isFullScreen = function() {\n return fullScreenApi.getFullScreenElement() !== null;\n };\n fullScreenApi.cancelFullScreen = function() {\n $.console.error(\"cancelFullScreen is deprecated. Use exitFullScreen instead.\");\n fullScreenApi.exitFullScreen();\n };\n\n // export api\n $.extend( $, fullScreenApi );\n\n})( OpenSeadragon );\n\n/*\n * OpenSeadragon - EventSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($){\n\n/**\n * Event handler method signature used by all OpenSeadragon events.\n *\n * @callback EventHandler\n * @memberof OpenSeadragon\n * @param {Object} event - See individual events for event-specific properties.\n */\n\n\n/**\n * @class EventSource\n * @classdesc For use by classes which want to support custom, non-browser events.\n *\n * @memberof OpenSeadragon\n */\n$.EventSource = function() {\n this.events = {};\n};\n\n/** @lends OpenSeadragon.EventSource.prototype */\n$.EventSource.prototype = {\n\n /**\n * Add an event handler to be triggered only once (or a given number of times)\n * for a given event.\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {OpenSeadragon.EventHandler} handler - Function to call when event\n * is triggered.\n * @param {Object} [userData=null] - Arbitrary object to be passed unchanged\n * to the handler.\n * @param {Number} [times=1] - The number of times to handle the event\n * before removing it.\n */\n addOnceHandler: function(eventName, handler, userData, times) {\n var self = this;\n times = times || 1;\n var count = 0;\n var onceHandler = function(event) {\n count++;\n if (count === times) {\n self.removeHandler(eventName, onceHandler);\n }\n handler(event);\n };\n this.addHandler(eventName, onceHandler, userData);\n },\n\n /**\n * Add an event handler for a given event.\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {OpenSeadragon.EventHandler} handler - Function to call when event is triggered.\n * @param {Object} [userData=null] - Arbitrary object to be passed unchanged to the handler.\n */\n addHandler: function ( eventName, handler, userData ) {\n var events = this.events[ eventName ];\n if ( !events ) {\n this.events[ eventName ] = events = [];\n }\n if ( handler && $.isFunction( handler ) ) {\n events[ events.length ] = { handler: handler, userData: userData || null };\n }\n },\n\n /**\n * Remove a specific event handler for a given event.\n * @function\n * @param {String} eventName - Name of event for which the handler is to be removed.\n * @param {OpenSeadragon.EventHandler} handler - Function to be removed.\n */\n removeHandler: function ( eventName, handler ) {\n var events = this.events[ eventName ],\n handlers = [],\n i;\n if ( !events ) {\n return;\n }\n if ( $.isArray( events ) ) {\n for ( i = 0; i < events.length; i++ ) {\n if ( events[i].handler !== handler ) {\n handlers.push( events[ i ] );\n }\n }\n this.events[ eventName ] = handlers;\n }\n },\n\n\n /**\n * Remove all event handlers for a given event type. If no type is given all\n * event handlers for every event type are removed.\n * @function\n * @param {String} eventName - Name of event for which all handlers are to be removed.\n */\n removeAllHandlers: function( eventName ) {\n if ( eventName ){\n this.events[ eventName ] = [];\n } else{\n for ( var eventType in this.events ) {\n this.events[ eventType ] = [];\n }\n }\n },\n\n /**\n * Get a function which iterates the list of all handlers registered for a given event, calling the handler for each.\n * @function\n * @param {String} eventName - Name of event to get handlers for.\n */\n getHandler: function ( eventName ) {\n var events = this.events[ eventName ];\n if ( !events || !events.length ) {\n return null;\n }\n events = events.length === 1 ?\n [ events[ 0 ] ] :\n Array.apply( null, events );\n return function ( source, args ) {\n var i,\n length = events.length;\n for ( i = 0; i < length; i++ ) {\n if ( events[ i ] ) {\n args.eventSource = source;\n args.userData = events[ i ].userData;\n events[ i ].handler( args );\n }\n }\n };\n },\n\n /**\n * Trigger an event, optionally passing additional information.\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {Object} eventArgs - Event-specific data.\n */\n raiseEvent: function( eventName, eventArgs ) {\n //uncomment if you want to get a log of all events\n //$.console.log( eventName );\n var handler = this.getHandler( eventName );\n\n if ( handler ) {\n if ( !eventArgs ) {\n eventArgs = {};\n }\n\n handler( this, eventArgs );\n }\n }\n};\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - MouseTracker\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ( $ ) {\n\n // All MouseTracker instances\n var MOUSETRACKERS = [];\n\n // dictionary from hash to private properties\n var THIS = {};\n\n\n /**\n * @class MouseTracker\n * @classdesc Provides simplified handling of common pointer device (mouse, touch, pen, etc.) gestures\n * and keyboard events on a specified element.\n * @memberof OpenSeadragon\n * @param {Object} options\n * Allows configurable properties to be entirely specified by passing\n * an options object to the constructor. The constructor also supports\n * the original positional arguments 'element', 'clickTimeThreshold',\n * and 'clickDistThreshold' in that order.\n * @param {Element|String} options.element\n * A reference to an element or an element id for which the pointer/key\n * events will be monitored.\n * @param {Boolean} [options.startDisabled=false]\n * If true, event tracking on the element will not start until\n * {@link OpenSeadragon.MouseTracker.setTracking|setTracking} is called.\n * @param {Number} options.clickTimeThreshold\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n * @param {Number} options.clickDistThreshold\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n * @param {Number} options.dblClickTimeThreshold\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n * @param {Number} options.dblClickDistThreshold\n * The maximum distance allowed between two pointer click events\n * to be treated as a click gesture.\n * @param {Number} [options.stopDelay=50]\n * The number of milliseconds without pointer move before the stop\n * event is fired.\n * @param {OpenSeadragon.EventHandler} [options.preProcessEventHandler=null]\n * An optional handler for controlling DOM event propagation and processing.\n * @param {OpenSeadragon.EventHandler} [options.contextMenuHandler=null]\n * An optional handler for contextmenu.\n * @param {OpenSeadragon.EventHandler} [options.enterHandler=null]\n * An optional handler for pointer enter.\n * @param {OpenSeadragon.EventHandler} [options.leaveHandler=null]\n * An optional handler for pointer leave.\n * @param {OpenSeadragon.EventHandler} [options.exitHandler=null]\n * An optional handler for pointer leave. Deprecated. Use leaveHandler instead.\n * @param {OpenSeadragon.EventHandler} [options.overHandler=null]\n * An optional handler for pointer over.\n * @param {OpenSeadragon.EventHandler} [options.outHandler=null]\n * An optional handler for pointer out.\n * @param {OpenSeadragon.EventHandler} [options.pressHandler=null]\n * An optional handler for pointer press.\n * @param {OpenSeadragon.EventHandler} [options.nonPrimaryPressHandler=null]\n * An optional handler for pointer non-primary button press.\n * @param {OpenSeadragon.EventHandler} [options.releaseHandler=null]\n * An optional handler for pointer release.\n * @param {OpenSeadragon.EventHandler} [options.nonPrimaryReleaseHandler=null]\n * An optional handler for pointer non-primary button release.\n * @param {OpenSeadragon.EventHandler} [options.moveHandler=null]\n * An optional handler for pointer move.\n * @param {OpenSeadragon.EventHandler} [options.scrollHandler=null]\n * An optional handler for mouse wheel scroll.\n * @param {OpenSeadragon.EventHandler} [options.clickHandler=null]\n * An optional handler for pointer click.\n * @param {OpenSeadragon.EventHandler} [options.dblClickHandler=null]\n * An optional handler for pointer double-click.\n * @param {OpenSeadragon.EventHandler} [options.dragHandler=null]\n * An optional handler for the drag gesture.\n * @param {OpenSeadragon.EventHandler} [options.dragEndHandler=null]\n * An optional handler for after a drag gesture.\n * @param {OpenSeadragon.EventHandler} [options.pinchHandler=null]\n * An optional handler for the pinch gesture.\n * @param {OpenSeadragon.EventHandler} [options.keyDownHandler=null]\n * An optional handler for keydown.\n * @param {OpenSeadragon.EventHandler} [options.keyUpHandler=null]\n * An optional handler for keyup.\n * @param {OpenSeadragon.EventHandler} [options.keyHandler=null]\n * An optional handler for keypress.\n * @param {OpenSeadragon.EventHandler} [options.focusHandler=null]\n * An optional handler for focus.\n * @param {OpenSeadragon.EventHandler} [options.blurHandler=null]\n * An optional handler for blur.\n * @param {Object} [options.userData=null]\n * Arbitrary object to be passed unchanged to any attached handler methods.\n */\n $.MouseTracker = function ( options ) {\n\n MOUSETRACKERS.push( this );\n\n var args = arguments;\n\n if ( !$.isPlainObject( options ) ) {\n options = {\n element: args[ 0 ],\n clickTimeThreshold: args[ 1 ],\n clickDistThreshold: args[ 2 ]\n };\n }\n\n this.hash = Math.random(); // An unique hash for this tracker.\n /**\n * The element for which pointer events are being monitored.\n * @member {Element} element\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.element = $.getElement( options.element );\n /**\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n * @member {Number} clickTimeThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.clickTimeThreshold = options.clickTimeThreshold || $.DEFAULT_SETTINGS.clickTimeThreshold;\n /**\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n * @member {Number} clickDistThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.clickDistThreshold = options.clickDistThreshold || $.DEFAULT_SETTINGS.clickDistThreshold;\n /**\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n * @member {Number} dblClickTimeThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.dblClickTimeThreshold = options.dblClickTimeThreshold || $.DEFAULT_SETTINGS.dblClickTimeThreshold;\n /**\n * The maximum distance allowed between two pointer click events\n * to be treated as a click gesture.\n * @member {Number} clickDistThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.dblClickDistThreshold = options.dblClickDistThreshold || $.DEFAULT_SETTINGS.dblClickDistThreshold;\n /*eslint-disable no-multi-spaces*/\n this.userData = options.userData || null;\n this.stopDelay = options.stopDelay || 50;\n\n this.preProcessEventHandler = options.preProcessEventHandler || null;\n this.contextMenuHandler = options.contextMenuHandler || null;\n this.enterHandler = options.enterHandler || null;\n this.leaveHandler = options.leaveHandler || null;\n this.exitHandler = options.exitHandler || null; // Deprecated v2.5.0\n this.overHandler = options.overHandler || null;\n this.outHandler = options.outHandler || null;\n this.pressHandler = options.pressHandler || null;\n this.nonPrimaryPressHandler = options.nonPrimaryPressHandler || null;\n this.releaseHandler = options.releaseHandler || null;\n this.nonPrimaryReleaseHandler = options.nonPrimaryReleaseHandler || null;\n this.moveHandler = options.moveHandler || null;\n this.scrollHandler = options.scrollHandler || null;\n this.clickHandler = options.clickHandler || null;\n this.dblClickHandler = options.dblClickHandler || null;\n this.dragHandler = options.dragHandler || null;\n this.dragEndHandler = options.dragEndHandler || null;\n this.pinchHandler = options.pinchHandler || null;\n this.stopHandler = options.stopHandler || null;\n this.keyDownHandler = options.keyDownHandler || null;\n this.keyUpHandler = options.keyUpHandler || null;\n this.keyHandler = options.keyHandler || null;\n this.focusHandler = options.focusHandler || null;\n this.blurHandler = options.blurHandler || null;\n /*eslint-enable no-multi-spaces*/\n\n //Store private properties in a scope sealed hash map\n var _this = this;\n\n /**\n * @private\n * @property {Boolean} tracking\n * Are we currently tracking pointer events for this element.\n */\n THIS[ this.hash ] = {\n click: function ( event ) { onClick( _this, event ); },\n dblclick: function ( event ) { onDblClick( _this, event ); },\n keydown: function ( event ) { onKeyDown( _this, event ); },\n keyup: function ( event ) { onKeyUp( _this, event ); },\n keypress: function ( event ) { onKeyPress( _this, event ); },\n focus: function ( event ) { onFocus( _this, event ); },\n blur: function ( event ) { onBlur( _this, event ); },\n contextmenu: function ( event ) { onContextMenu( _this, event ); },\n\n wheel: function ( event ) { onWheel( _this, event ); },\n mousewheel: function ( event ) { onMouseWheel( _this, event ); },\n DOMMouseScroll: function ( event ) { onMouseWheel( _this, event ); },\n MozMousePixelScroll: function ( event ) { onMouseWheel( _this, event ); },\n\n losecapture: function ( event ) { onLoseCapture( _this, event ); },\n\n mouseenter: function ( event ) { onPointerEnter( _this, event ); },\n mouseleave: function ( event ) { onPointerLeave( _this, event ); },\n mouseover: function ( event ) { onPointerOver( _this, event ); },\n mouseout: function ( event ) { onPointerOut( _this, event ); },\n mousedown: function ( event ) { onPointerDown( _this, event ); },\n mouseup: function ( event ) { onPointerUp( _this, event ); },\n mousemove: function ( event ) { onPointerMove( _this, event ); },\n\n touchstart: function ( event ) { onTouchStart( _this, event ); },\n touchend: function ( event ) { onTouchEnd( _this, event ); },\n touchmove: function ( event ) { onTouchMove( _this, event ); },\n touchcancel: function ( event ) { onTouchCancel( _this, event ); },\n\n gesturestart: function ( event ) { onGestureStart( _this, event ); }, // Safari/Safari iOS\n gesturechange: function ( event ) { onGestureChange( _this, event ); }, // Safari/Safari iOS\n\n gotpointercapture: function ( event ) { onGotPointerCapture( _this, event ); },\n lostpointercapture: function ( event ) { onLostPointerCapture( _this, event ); },\n pointerenter: function ( event ) { onPointerEnter( _this, event ); },\n pointerleave: function ( event ) { onPointerLeave( _this, event ); },\n pointerover: function ( event ) { onPointerOver( _this, event ); },\n pointerout: function ( event ) { onPointerOut( _this, event ); },\n pointerdown: function ( event ) { onPointerDown( _this, event ); },\n pointerup: function ( event ) { onPointerUp( _this, event ); },\n pointermove: function ( event ) { onPointerMove( _this, event ); },\n pointercancel: function ( event ) { onPointerCancel( _this, event ); },\n pointerupcaptured: function ( event ) { onPointerUpCaptured( _this, event ); },\n pointermovecaptured: function ( event ) { onPointerMoveCaptured( _this, event ); },\n\n tracking: false,\n\n // Active pointers lists. Array of GesturePointList objects, one for each pointer device type.\n // GesturePointList objects are added each time a pointer is tracked by a new pointer device type (see getActivePointersListByType()).\n // Active pointers are any pointer being tracked for this element which are in the hit-test area\n // of the element (for hover-capable devices) and/or have contact or a button press initiated in the element.\n activePointersLists: [],\n\n // Tracking for double-click gesture\n lastClickPos: null,\n dblClickTimeOut: null,\n\n // Tracking for pinch gesture\n pinchGPoints: [],\n lastPinchDist: 0,\n currentPinchDist: 0,\n lastPinchCenter: null,\n currentPinchCenter: null,\n\n // Tracking for drag\n sentDragEvent: false\n };\n\n this.hasGestureHandlers = !!( this.pressHandler || this.nonPrimaryPressHandler ||\n this.releaseHandler || this.nonPrimaryReleaseHandler ||\n this.clickHandler || this.dblClickHandler ||\n this.dragHandler || this.dragEndHandler ||\n this.pinchHandler );\n this.hasScrollHandler = !!this.scrollHandler;\n\n if ( $.MouseTracker.havePointerEvents ) {\n $.setElementPointerEvents( this.element, 'auto' );\n }\n\n if (this.exitHandler) {\n $.console.error(\"MouseTracker.exitHandler is deprecated. Use MouseTracker.leaveHandler instead.\");\n }\n\n if ( !options.startDisabled ) {\n this.setTracking( true );\n }\n };\n\n /** @lends OpenSeadragon.MouseTracker.prototype */\n $.MouseTracker.prototype = {\n\n /**\n * Clean up any events or objects created by the tracker.\n * @function\n */\n destroy: function () {\n var i;\n\n stopTracking( this );\n this.element = null;\n\n for ( i = 0; i < MOUSETRACKERS.length; i++ ) {\n if ( MOUSETRACKERS[ i ] === this ) {\n MOUSETRACKERS.splice( i, 1 );\n break;\n }\n }\n\n THIS[ this.hash ] = null;\n delete THIS[ this.hash ];\n },\n\n /**\n * Are we currently tracking events on this element.\n * @deprecated Just use this.tracking\n * @function\n * @returns {Boolean} Are we currently tracking events on this element.\n */\n isTracking: function () {\n return THIS[ this.hash ].tracking;\n },\n\n /**\n * Enable or disable whether or not we are tracking events on this element.\n * @function\n * @param {Boolean} track True to start tracking, false to stop tracking.\n * @returns {OpenSeadragon.MouseTracker} Chainable.\n */\n setTracking: function ( track ) {\n if ( track ) {\n startTracking( this );\n } else {\n stopTracking( this );\n }\n //chain\n return this;\n },\n\n /**\n * Returns the {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} for the given pointer device type,\n * creating and caching a new {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} if one doesn't already exist for the type.\n * @function\n * @param {String} type - The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @returns {OpenSeadragon.MouseTracker.GesturePointList}\n */\n getActivePointersListByType: function ( type ) {\n var delegate = THIS[ this.hash ],\n i,\n len = delegate.activePointersLists.length,\n list;\n\n for ( i = 0; i < len; i++ ) {\n if ( delegate.activePointersLists[ i ].type === type ) {\n return delegate.activePointersLists[ i ];\n }\n }\n\n list = new $.MouseTracker.GesturePointList( type );\n delegate.activePointersLists.push( list );\n return list;\n },\n\n /**\n * Returns the total number of pointers currently active on the tracked element.\n * @function\n * @returns {Number}\n */\n getActivePointerCount: function () {\n var delegate = THIS[ this.hash ],\n i,\n len = delegate.activePointersLists.length,\n count = 0;\n\n for ( i = 0; i < len; i++ ) {\n count += delegate.activePointersLists[ i ].getLength();\n }\n\n return count;\n },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n */\n preProcessEventHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the contextmenu event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n contextMenuHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n enterHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @since v2.5.0\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n leaveHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @deprecated v2.5.0 Use leaveHandler instead\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n exitHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @since v2.5.0\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n overHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @since v2.5.0\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n outHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n pressHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.button\n * Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n nonPrimaryPressHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.insideElementReleased\n * True if the cursor inside the tracked element when the button was released.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n releaseHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.button\n * Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n nonPrimaryReleaseHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n moveHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.scroll\n * The scroll delta for the event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. Touch devices no longer generate scroll event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the wheel event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n scrollHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Boolean} event.quick\n * True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for ignoring drag events.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Element} event.originalTarget\n * The DOM element clicked on.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n clickHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dblClickHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {OpenSeadragon.Point} event.delta\n * The x,y components of the difference between the current position and the last drag event position. Useful for ignoring or weighting the events.\n * @param {Number} event.speed\n * Current computed speed, in pixels per second.\n * @param {Number} event.direction\n * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dragHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.speed\n * Speed at the end of a drag gesture, in pixels per second.\n * @param {Number} event.direction\n * Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dragEndHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {Array.} event.gesturePoints\n * Gesture points associated with the gesture. Velocity data can be found here.\n * @param {OpenSeadragon.Point} event.lastCenter\n * The previous center point of the two pinch contact points relative to the tracked element.\n * @param {OpenSeadragon.Point} event.center\n * The center point of the two pinch contact points relative to the tracked element.\n * @param {Number} event.lastDistance\n * The previous distance between the two pinch contact points in CSS pixels.\n * @param {Number} event.distance\n * The distance between the two pinch contact points in CSS pixels.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n pinchHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n stopHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the keydown event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyDownHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the keyup event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyUpHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the keypress event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n focusHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n blurHandler: function () { }\n };\n\n // https://github.com/openseadragon/openseadragon/pull/790\n /**\n * True if inside an iframe, otherwise false.\n * @member {Boolean} isInIframe\n * @private\n * @inner\n */\n var isInIframe = (function() {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n })();\n\n // https://github.com/openseadragon/openseadragon/pull/790\n /**\n * @function\n * @private\n * @inner\n * @returns {Boolean} True if the target supports DOM Level 2 event subscription methods, otherwise false.\n */\n function canAccessEvents (target) {\n try {\n return target.addEventListener && target.removeEventListener;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Provides continuous computation of velocity (speed and direction) of active pointers.\n * This is a singleton, used by all MouseTracker instances, as it is unlikely there will ever be more than\n * two active gesture pointers at a time.\n *\n * @private\n * @member gesturePointVelocityTracker\n * @memberof OpenSeadragon.MouseTracker\n */\n $.MouseTracker.gesturePointVelocityTracker = (function () {\n var trackerPoints = [],\n intervalId = 0,\n lastTime = 0;\n\n // Generates a unique identifier for a tracked gesture point\n var _generateGuid = function ( tracker, gPoint ) {\n return tracker.hash.toString() + gPoint.type + gPoint.id.toString();\n };\n\n // Interval timer callback. Computes velocity for all tracked gesture points.\n var _doTracking = function () {\n var i,\n len = trackerPoints.length,\n trackPoint,\n gPoint,\n now = $.now(),\n elapsedTime,\n distance,\n speed;\n\n elapsedTime = now - lastTime;\n lastTime = now;\n\n for ( i = 0; i < len; i++ ) {\n trackPoint = trackerPoints[ i ];\n gPoint = trackPoint.gPoint;\n // Math.atan2 gives us just what we need for a velocity vector, as we can simply\n // use cos()/sin() to extract the x/y velocity components.\n gPoint.direction = Math.atan2( gPoint.currentPos.y - trackPoint.lastPos.y, gPoint.currentPos.x - trackPoint.lastPos.x );\n // speed = distance / elapsed time\n distance = trackPoint.lastPos.distanceTo( gPoint.currentPos );\n trackPoint.lastPos = gPoint.currentPos;\n speed = 1000 * distance / ( elapsedTime + 1 );\n // Simple biased average, favors the most recent speed computation. Smooths out erratic gestures a bit.\n gPoint.speed = 0.75 * speed + 0.25 * gPoint.speed;\n }\n };\n\n // Public. Add a gesture point to be tracked\n var addPoint = function ( tracker, gPoint ) {\n var guid = _generateGuid( tracker, gPoint );\n\n trackerPoints.push(\n {\n guid: guid,\n gPoint: gPoint,\n lastPos: gPoint.currentPos\n } );\n\n // Only fire up the interval timer when there's gesture pointers to track\n if ( trackerPoints.length === 1 ) {\n lastTime = $.now();\n intervalId = window.setInterval( _doTracking, 50 );\n }\n };\n\n // Public. Stop tracking a gesture point\n var removePoint = function ( tracker, gPoint ) {\n var guid = _generateGuid( tracker, gPoint ),\n i,\n len = trackerPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( trackerPoints[ i ].guid === guid ) {\n trackerPoints.splice( i, 1 );\n // Only run the interval timer if theres gesture pointers to track\n len--;\n if ( len === 0 ) {\n window.clearInterval( intervalId );\n }\n break;\n }\n }\n };\n\n return {\n addPoint: addPoint,\n removePoint: removePoint\n };\n } )();\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Pointer event model and feature detection\n///////////////////////////////////////////////////////////////////////////////\n\n $.MouseTracker.captureElement = document;\n\n /**\n * Detect available mouse wheel event name.\n */\n $.MouseTracker.wheelEventName = ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version > 8 ) ||\n ( 'onwheel' in document.createElement( 'div' ) ) ? 'wheel' : // Modern browsers support 'wheel'\n document.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least 'mousewheel'\n 'DOMMouseScroll'; // Assume old Firefox\n\n /**\n * Detect browser pointer device event model(s) and build appropriate list of events to subscribe to.\n */\n $.MouseTracker.subscribeEvents = [ \"click\", \"dblclick\", \"keydown\", \"keyup\", \"keypress\", \"focus\", \"blur\", \"contextmenu\", $.MouseTracker.wheelEventName ];\n\n if( $.MouseTracker.wheelEventName === \"DOMMouseScroll\" ) {\n // Older Firefox\n $.MouseTracker.subscribeEvents.push( \"MozMousePixelScroll\" );\n }\n\n if ( window.PointerEvent ) {\n // IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents)\n $.MouseTracker.havePointerEvents = true;\n $.MouseTracker.subscribeEvents.push( \"pointerenter\", \"pointerleave\", \"pointerover\", \"pointerout\", \"pointerdown\", \"pointerup\", \"pointermove\", \"pointercancel\" );\n // Pointer events capture support\n $.MouseTracker.havePointerCapture = (function () {\n var divElement = document.createElement( 'div' );\n return $.isFunction( divElement.setPointerCapture ) && $.isFunction( divElement.releasePointerCapture );\n }());\n if ( $.MouseTracker.havePointerCapture ) {\n $.MouseTracker.subscribeEvents.push( \"gotpointercapture\", \"lostpointercapture\" );\n }\n } else {\n // Legacy W3C mouse events\n $.MouseTracker.havePointerEvents = false;\n $.MouseTracker.subscribeEvents.push( \"mouseenter\", \"mouseleave\", \"mouseover\", \"mouseout\", \"mousedown\", \"mouseup\", \"mousemove\" );\n $.MouseTracker.mousePointerId = \"legacy-mouse\";\n // Legacy mouse events capture support (IE/Firefox only?)\n $.MouseTracker.havePointerCapture = (function () {\n var divElement = document.createElement( 'div' );\n return $.isFunction( divElement.setCapture ) && $.isFunction( divElement.releaseCapture );\n }());\n if ( $.MouseTracker.havePointerCapture ) {\n $.MouseTracker.subscribeEvents.push( \"losecapture\" );\n }\n // Legacy touch events\n if ( 'ontouchstart' in window ) {\n // iOS, Android, and other W3c Touch Event implementations\n // (see http://www.w3.org/TR/touch-events/)\n // (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n // (see https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n $.MouseTracker.subscribeEvents.push( \"touchstart\", \"touchend\", \"touchmove\", \"touchcancel\" );\n }\n if ( 'ongesturestart' in window ) {\n // iOS (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n // Subscribe to these to prevent default gesture handling\n $.MouseTracker.subscribeEvents.push( \"gesturestart\", \"gesturechange\" );\n }\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Classes and typedefs\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * Used for the processing/disposition of DOM events (propagation, default handling, capture, etc.)\n *\n * @typedef {Object} EventProcessInfo\n * @memberof OpenSeadragon.MouseTracker\n * @since v2.5.0\n *\n * @property {OpenSeadragon.MouseTracker} eventSource\n * A reference to the tracker instance.\n * @property {Object} originalEvent\n * The original DOM event object.\n * @property {Number} eventPhase\n * 0 == NONE, 1 == CAPTURING_PHASE, 2 == AT_TARGET, 3 == BUBBLING_PHASE.\n * @property {String} eventType\n * \"keydown\", \"keyup\", \"keypress\", \"focus\", \"blur\", \"contextmenu\", \"gotpointercapture\", \"lostpointercapture\", \"pointerenter\", \"pointerleave\", \"pointerover\", \"pointerout\", \"pointerdown\", \"pointerup\", \"pointermove\", \"pointercancel\", \"wheel\", \"click\", \"dblclick\".\n * @property {String} pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @property {Boolean} isEmulated\n * True if this is an emulated event. If true, originalEvent is either the event that caused\n * the emulated event, a synthetic event object created with values from the actual DOM event,\n * or null if no DOM event applies. Emulated events can occur on eventType \"wheel\" on legacy mouse-scroll\n * event emitting user agents.\n * @property {Boolean} isStoppable\n * True if propagation of the event (e.g. bubbling) can be stopped with stopPropagation/stopImmediatePropagation.\n * @property {Boolean} isCancelable\n * True if the event's default handling by the browser can be prevented with preventDefault.\n * @property {Boolean} defaultPrevented\n * True if the event's default handling has already been prevented by a descendent element.\n * @property {Boolean} preventDefault\n * Set to true to prevent the event's default handling by the browser.\n * @property {Boolean} preventGesture\n * Set to true to prevent this MouseTracker from generating a gesture from the event.\n * Valid on eventType \"pointerdown\".\n * @property {Boolean} stopPropagation\n * Set to true prevent the event from propagating to ancestor/descendent elements on capture/bubble phase.\n * @property {Boolean} shouldCapture\n * (Internal Use) Set to true if the pointer should be captured (events (re)targeted to tracker element).\n * @property {Boolean} shouldReleaseCapture\n * (Internal Use) Set to true if the captured pointer should be released.\n * @property {Object} userData\n * Arbitrary user-defined object.\n */\n\n\n /**\n * Represents a point of contact on the screen made by a mouse cursor, pen, touch, or other pointer device.\n *\n * @typedef {Object} GesturePoint\n * @memberof OpenSeadragon.MouseTracker\n *\n * @property {Number} id\n * Identifier unique from all other active GesturePoints for a given pointer device.\n * @property {String} type\n * The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @property {Boolean} captured\n * True if events for the gesture point are captured to the tracked element.\n * @property {Boolean} isPrimary\n * True if the gesture point is a master pointer amongst the set of active pointers for each pointer type. True for mouse and primary (first) touch/pen pointers.\n * @property {Boolean} insideElementPressed\n * True if button pressed or contact point initiated inside the screen area of the tracked element.\n * @property {Boolean} insideElement\n * True if pointer or contact point is currently inside the bounds of the tracked element.\n * @property {Number} speed\n * Current computed speed, in pixels per second.\n * @property {Number} direction\n * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {OpenSeadragon.Point} contactPos\n * The initial pointer contact position, relative to the page including any scrolling. Only valid if the pointer has contact (pressed, touch contact, pen contact).\n * @property {Number} contactTime\n * The initial pointer contact time, in milliseconds. Only valid if the pointer has contact (pressed, touch contact, pen contact).\n * @property {OpenSeadragon.Point} lastPos\n * The last pointer position, relative to the page including any scrolling.\n * @property {Number} lastTime\n * The last pointer contact time, in milliseconds.\n * @property {OpenSeadragon.Point} currentPos\n * The current pointer position, relative to the page including any scrolling.\n * @property {Number} currentTime\n * The current pointer contact time, in milliseconds.\n */\n\n\n /**\n * @class GesturePointList\n * @classdesc Provides an abstraction for a set of active {@link OpenSeadragon.MouseTracker.GesturePoint|GesturePoint} objects for a given pointer device type.\n * Active pointers are any pointer being tracked for this element which are in the hit-test area\n * of the element (for hover-capable devices) and/or have contact or a button press initiated in the element.\n * @memberof OpenSeadragon.MouseTracker\n * @param {String} type - The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n */\n $.MouseTracker.GesturePointList = function ( type ) {\n this._gPoints = [];\n /**\n * The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @member {String} type\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.type = type;\n /**\n * Current buttons pressed for the device.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @member {Number} buttons\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.buttons = 0;\n /**\n * Current number of contact points (touch points, mouse down, etc.) for the device.\n * @member {Number} contacts\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.contacts = 0;\n /**\n * Current number of clicks for the device. Used for multiple click gesture tracking.\n * @member {Number} clicks\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.clicks = 0;\n /**\n * Current number of captured pointers for the device.\n * @member {Number} captureCount\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.captureCount = 0;\n };\n\n /** @lends OpenSeadragon.MouseTracker.GesturePointList.prototype */\n $.MouseTracker.GesturePointList.prototype = {\n /**\n * @function\n * @returns {Number} Number of gesture points in the list.\n */\n getLength: function () {\n return this._gPoints.length;\n },\n /**\n * @function\n * @returns {Array.} The list of gesture points in the list as an array (read-only).\n */\n asArray: function () {\n return this._gPoints;\n },\n /**\n * @function\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gesturePoint - A gesture point to add to the list.\n * @returns {Number} Number of gesture points in the list.\n */\n add: function ( gp ) {\n return this._gPoints.push( gp );\n },\n /**\n * @function\n * @param {Number} id - The id of the gesture point to remove from the list.\n * @returns {Number} Number of gesture points in the list.\n */\n removeById: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].id === id ) {\n this._gPoints.splice( i, 1 );\n break;\n }\n }\n return this._gPoints.length;\n },\n /**\n * @function\n * @param {Number} index - The index of the gesture point to retrieve from the list.\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point at the given index, or null if not found.\n */\n getByIndex: function ( index ) {\n if ( index < this._gPoints.length) {\n return this._gPoints[ index ];\n }\n\n return null;\n },\n /**\n * @function\n * @param {Number} id - The id of the gesture point to retrieve from the list.\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point with the given id, or null if not found.\n */\n getById: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].id === id ) {\n return this._gPoints[ i ];\n }\n }\n return null;\n },\n /**\n * @function\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The primary gesture point in the list, or null if not found.\n */\n getPrimary: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].isPrimary ) {\n return this._gPoints[ i ];\n }\n }\n return null;\n },\n\n /**\n * Increment this pointer list's contact count.\n * It will evaluate whether this pointer type is allowed to have multiple contacts.\n * @function\n */\n addContact: function() {\n ++this.contacts;\n\n if (this.contacts > 1 && (this.type === \"mouse\" || this.type === \"pen\")) {\n $.console.warn('GesturePointList.addContact() Implausible contacts value');\n this.contacts = 1;\n }\n },\n\n /**\n * Decrement this pointer list's contact count.\n * It will make sure the count does not go below 0.\n * @function\n */\n removeContact: function() {\n --this.contacts;\n\n if (this.contacts < 0) {\n $.console.warn('GesturePointList.removeContact() Implausible contacts value');\n this.contacts = 0;\n }\n }\n };\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Utility functions\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * Removes all tracked pointers.\n * @private\n * @inner\n */\n function clearTrackedPointers( tracker ) {\n var delegate = THIS[ tracker.hash ],\n i, j,\n pointsList,\n gPoints,\n gPointsToRemove,\n pointerListCount = delegate.activePointersLists.length;\n\n for ( i = 0; i < pointerListCount; i++ ) {\n pointsList = delegate.activePointersLists[ i ];\n\n if ( pointsList.getLength() > 0 ) {\n // Make an array containing references to the gPoints in the pointer list\n // (because calls to stopTrackingPointer() are going to modify the pointer list)\n gPointsToRemove = [];\n gPoints = pointsList.asArray();\n for ( j = 0; j < gPoints.length; j++ ) {\n gPointsToRemove.push( gPoints[ j ] );\n }\n\n // Release and remove all gPoints from the pointer list\n for ( j = 0; j < gPointsToRemove.length; j++ ) {\n stopTrackingPointer( tracker, pointsList, gPointsToRemove[ j ] );\n }\n }\n }\n\n for ( i = 0; i < pointerListCount; i++ ) {\n delegate.activePointersLists.pop();\n }\n\n delegate.sentDragEvent = false;\n }\n\n /**\n * Starts tracking pointer events on the tracked element.\n * @private\n * @inner\n */\n function startTracking( tracker ) {\n var delegate = THIS[ tracker.hash ],\n event,\n i;\n\n if ( !delegate.tracking ) {\n for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) {\n event = $.MouseTracker.subscribeEvents[ i ];\n $.addEvent(\n tracker.element,\n event,\n delegate[ event ],\n event === $.MouseTracker.wheelEventName ? { passive: false, capture: false } : false\n );\n }\n\n clearTrackedPointers( tracker );\n\n delegate.tracking = true;\n }\n }\n\n /**\n * Stops tracking pointer events on the tracked element.\n * @private\n * @inner\n */\n function stopTracking( tracker ) {\n var delegate = THIS[ tracker.hash ],\n event,\n i;\n\n if ( delegate.tracking ) {\n for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) {\n event = $.MouseTracker.subscribeEvents[ i ];\n $.removeEvent(\n tracker.element,\n event,\n delegate[ event ],\n false\n );\n }\n\n clearTrackedPointers( tracker );\n\n delegate.tracking = false;\n }\n }\n\n /**\n * @private\n * @inner\n */\n function getCaptureEventParams( tracker, pointerType ) {\n var delegate = THIS[ tracker.hash ];\n\n if ( pointerType === 'pointerevent' ) {\n return {\n upName: 'pointerup',\n upHandler: delegate.pointerupcaptured,\n moveName: 'pointermove',\n moveHandler: delegate.pointermovecaptured\n };\n } else if ( pointerType === 'mouse' ) {\n return {\n upName: 'pointerup',\n upHandler: delegate.pointerupcaptured,\n moveName: 'pointermove',\n moveHandler: delegate.pointermovecaptured\n };\n } else if ( pointerType === 'touch' ) {\n return {\n upName: 'touchend',\n upHandler: delegate.touchendcaptured,\n moveName: 'touchmove',\n moveHandler: delegate.touchmovecaptured\n };\n } else {\n throw new Error( \"MouseTracker.getCaptureEventParams: Unknown pointer type.\" );\n }\n }\n\n /**\n * Begin capturing pointer events to the tracked element.\n * @private\n * @inner\n */\n function capturePointer( tracker, gPoint ) {\n var eventParams;\n\n if ( $.MouseTracker.havePointerCapture ) {\n if ( $.MouseTracker.havePointerEvents ) {\n // Can throw NotFoundError (InvalidPointerId Firefox < 82)\n // (should never happen so we'll log a warning)\n try {\n tracker.element.setPointerCapture( gPoint.id );\n //$.console.log('element.setPointerCapture() called');\n } catch ( e ) {\n $.console.warn('setPointerCapture() called on invalid pointer ID');\n return;\n }\n } else {\n tracker.element.setCapture( true );\n //$.console.log('element.setCapture() called');\n }\n } else {\n // Emulate mouse capture by hanging listeners on the document object.\n // (Note we listen on the capture phase so the captured handlers will get called first)\n // eslint-disable-next-line no-use-before-define\n //$.console.log('Emulated mouse capture set');\n eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : gPoint.type );\n // https://github.com/openseadragon/openseadragon/pull/790\n if (isInIframe && canAccessEvents(window.top)) {\n $.addEvent(\n window.top,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n $.addEvent(\n $.MouseTracker.captureElement,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n $.addEvent(\n $.MouseTracker.captureElement,\n eventParams.moveName,\n eventParams.moveHandler,\n true\n );\n }\n\n updatePointerCaptured( tracker, gPoint, true );\n }\n\n\n /**\n * Stop capturing pointer events to the tracked element.\n * @private\n * @inner\n */\n function releasePointer( tracker, gPoint ) {\n var eventParams;\n var pointsList;\n var cachedGPoint;\n\n if ( $.MouseTracker.havePointerCapture ) {\n if ( $.MouseTracker.havePointerEvents ) {\n pointsList = tracker.getActivePointersListByType( gPoint.type );\n cachedGPoint = pointsList.getById( gPoint.id );\n if ( !cachedGPoint || !cachedGPoint.captured ) {\n return;\n }\n // Can throw NotFoundError (InvalidPointerId Firefox < 82)\n // (should never happen, but it does on Firefox 79 touch so we won't log a warning)\n try {\n tracker.element.releasePointerCapture( gPoint.id );\n //$.console.log('element.releasePointerCapture() called');\n } catch ( e ) {\n //$.console.warn('releasePointerCapture() called on invalid pointer ID');\n }\n } else {\n tracker.element.releaseCapture();\n //$.console.log('element.releaseCapture() called');\n }\n } else {\n // Emulate mouse capture by hanging listeners on the document object.\n // (Note we listen on the capture phase so the captured handlers will get called first)\n //$.console.log('Emulated mouse capture release');\n eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : gPoint.type );\n // https://github.com/openseadragon/openseadragon/pull/790\n if (isInIframe && canAccessEvents(window.top)) {\n $.removeEvent(\n window.top,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n $.removeEvent(\n $.MouseTracker.captureElement,\n eventParams.moveName,\n eventParams.moveHandler,\n true\n );\n $.removeEvent(\n $.MouseTracker.captureElement,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n\n updatePointerCaptured( tracker, gPoint, false );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n * @private\n * @inner\n */\n function getPointerId( event ) {\n return ( $.MouseTracker.havePointerEvents ) ? event.pointerId : $.MouseTracker.mousePointerId;\n }\n\n\n /**\n * Gets a W3C Pointer Events model compatible pointer type string from a DOM pointer event.\n * IE10 used a long integer value, but the W3C specification (and IE11+) use a string \"mouse\", \"touch\", \"pen\", etc.\n *\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n * @private\n * @inner\n */\n function getPointerType( event ) {\n if ( $.MouseTracker.havePointerEvents ) {\n // Note: IE pointer events bug - sends invalid pointerType on lostpointercapture events\n // and possibly other events. We rely on sane, valid property values in DOM events, so for\n // IE, when the pointerType is missing, we'll default to 'mouse'...should be right most of the time\n return event.pointerType || (( $.Browser.vendor === $.BROWSERS.IE ) ? 'mouse' : '');\n } else {\n return 'mouse';\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n * @private\n * @inner\n */\n function getIsPrimary( event ) {\n return ( $.MouseTracker.havePointerEvents ) ? event.isPrimary : true;\n }\n\n\n /**\n * @private\n * @inner\n */\n function getMouseAbsolute( event ) {\n return $.getMousePosition( event );\n }\n\n /**\n * @private\n * @inner\n */\n function getMouseRelative( event, element ) {\n return getPointRelativeToAbsolute( getMouseAbsolute( event ), element );\n }\n\n /**\n * @private\n * @inner\n */\n function getPointRelativeToAbsolute( point, element ) {\n var offset = $.getElementOffset( element );\n return point.minus( offset );\n }\n\n /**\n * @private\n * @inner\n */\n function getCenterPoint( point1, point2 ) {\n return new $.Point( ( point1.x + point2.x ) / 2, ( point1.y + point2.y ) / 2 );\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Device-specific DOM event handlers\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * @private\n * @inner\n */\n function onClick( tracker, event ) {\n //$.console.log('click ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'click',\n pointerType: 'mouse',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onDblClick( tracker, event ) {\n //$.console.log('dblclick ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'dblclick',\n pointerType: 'mouse',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyDown( tracker, event ) {\n //$.console.log( \"keydown %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n var eventArgs = null;\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'keydown',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.keyDownHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n tracker.keyDownHandler( eventArgs );\n }\n\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyUp( tracker, event ) {\n //$.console.log( \"keyup %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n\n var eventArgs = null;\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'keyup',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.keyUpHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n tracker.keyUpHandler( eventArgs );\n }\n\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyPress( tracker, event ) {\n //$.console.log( \"keypress %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n\n var eventArgs = null;\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'keypress',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.keyHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n tracker.keyHandler( eventArgs );\n }\n\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onFocus( tracker, event ) {\n //$.console.log('focus ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n // focus doesn't bubble and is not cancelable, but we call\n // preProcessEvent() so it's dispatched to preProcessEventHandler\n // if necessary\n var eventInfo = {\n originalEvent: event,\n eventType: 'focus',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.focusHandler && !eventInfo.preventGesture ) {\n tracker.focusHandler(\n {\n eventSource: tracker,\n originalEvent: event,\n userData: tracker.userData\n }\n );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onBlur( tracker, event ) {\n //$.console.log('blur ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n // blur doesn't bubble and is not cancelable, but we call\n // preProcessEvent() so it's dispatched to preProcessEventHandler\n // if necessary\n var eventInfo = {\n originalEvent: event,\n eventType: 'blur',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.blurHandler && !eventInfo.preventGesture ) {\n tracker.blurHandler(\n {\n eventSource: tracker,\n originalEvent: event,\n userData: tracker.userData\n }\n );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onContextMenu( tracker, event ) {\n //$.console.log('contextmenu ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventArgs = null;\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'contextmenu',\n pointerType: 'mouse',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n // ContextMenu\n if ( tracker.contextMenuHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n position: getPointRelativeToAbsolute( getMouseAbsolute( event ), tracker.element ),\n originalEvent: eventInfo.originalEvent,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n tracker.contextMenuHandler( eventArgs );\n }\n\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * Handler for 'wheel' events\n *\n * @private\n * @inner\n */\n function onWheel( tracker, event ) {\n handleWheelEvent( tracker, event, event );\n }\n\n\n /**\n * Handler for 'mousewheel', 'DOMMouseScroll', and 'MozMousePixelScroll' events\n *\n * @private\n * @inner\n */\n function onMouseWheel( tracker, event ) {\n // Simulate a 'wheel' event\n var simulatedEvent = {\n target: event.target || event.srcElement,\n type: \"wheel\",\n shiftKey: event.shiftKey || false,\n clientX: event.clientX,\n clientY: event.clientY,\n pageX: event.pageX ? event.pageX : event.clientX,\n pageY: event.pageY ? event.pageY : event.clientY,\n deltaMode: event.type === \"MozMousePixelScroll\" ? 0 : 1, // 0=pixel, 1=line, 2=page\n deltaX: 0,\n deltaZ: 0\n };\n\n // Calculate deltaY\n if ( $.MouseTracker.wheelEventName === \"mousewheel\" ) {\n simulatedEvent.deltaY = -event.wheelDelta / $.DEFAULT_SETTINGS.pixelsPerWheelLine;\n } else {\n simulatedEvent.deltaY = event.detail;\n }\n\n handleWheelEvent( tracker, simulatedEvent, event );\n }\n\n\n /**\n * Handles 'wheel' events.\n * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()).\n *\n * @private\n * @inner\n */\n function handleWheelEvent( tracker, event, originalEvent ) {\n var nDelta = 0,\n eventInfo;\n\n var eventArgs = null;\n\n // The nDelta variable is gated to provide smooth z-index scrolling\n // since the mouse wheel allows for substantial deltas meant for rapid\n // y-index scrolling.\n // event.deltaMode: 0=pixel, 1=line, 2=page\n // TODO: Deltas in pixel mode should be accumulated then a scroll value computed after $.DEFAULT_SETTINGS.pixelsPerWheelLine threshold reached\n nDelta = event.deltaY < 0 ? 1 : -1;\n\n eventInfo = {\n originalEvent: event,\n eventType: 'wheel',\n pointerType: 'mouse',\n isEmulated: event !== originalEvent\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.scrollHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n pointerType: 'mouse',\n position: getMouseRelative( event, tracker.element ),\n scroll: nDelta,\n shift: event.shiftKey,\n isTouchEvent: false,\n originalEvent: originalEvent,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n\n tracker.scrollHandler( eventArgs );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( originalEvent );\n }\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( originalEvent );\n }\n}\n\n\n /**\n * TODO Never actually seen this event fired, and documentation is tough to find\n * @private\n * @inner\n */\n function onLoseCapture( tracker, event ) {\n //$.console.log('losecapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var gPoint = {\n id: $.MouseTracker.mousePointerId,\n type: 'mouse'\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'lostpointercapture',\n pointerType: 'mouse',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( event.target === tracker.element ) {\n updatePointerCaptured( tracker, gPoint, false );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchStart( tracker, event ) {\n var time,\n i,\n touchCount = event.changedTouches.length,\n gPoint,\n pointsList = tracker.getActivePointersListByType( 'touch' );\n\n time = $.now();\n\n //$.console.log('touchstart ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n if ( pointsList.getLength() > event.touches.length - touchCount ) {\n $.console.warn('Tracked touch contact count doesn\\'t match event.touches.length');\n }\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerdown',\n pointerType: 'touch',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoint = {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n // Simulate isPrimary\n isPrimary: pointsList.getLength() === 0,\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: time\n };\n\n // simulate touchenter on our tracked element\n updatePointerEnter( tracker, eventInfo, gPoint );\n\n updatePointerDown( tracker, eventInfo, gPoint, 0 );\n\n updatePointerCaptured( tracker, gPoint, true );\n }\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchEnd( tracker, event ) {\n var time,\n i,\n touchCount = event.changedTouches.length,\n gPoint;\n\n time = $.now();\n\n //$.console.log('touchend ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerup',\n pointerType: 'touch',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoint = {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: time\n };\n\n updatePointerUp( tracker, eventInfo, gPoint, 0 );\n\n updatePointerCaptured( tracker, gPoint, false );\n\n // simulate touchleave on our tracked element\n updatePointerLeave( tracker, eventInfo, gPoint );\n }\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchMove( tracker, event ) {\n var time,\n i,\n touchCount = event.changedTouches.length,\n gPoint;\n\n time = $.now();\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointermove',\n pointerType: 'touch',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoint = {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: time\n };\n\n updatePointerMove( tracker, eventInfo, gPoint );\n }\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchCancel( tracker, event ) {\n var touchCount = event.changedTouches.length,\n i,\n gPoint;\n\n //$.console.log('touchcancel ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointercancel',\n pointerType: 'touch',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoint = {\n id: event.changedTouches[ i ].identifier,\n type: 'touch'\n };\n\n //TODO need to only do this if our element is target?\n updatePointerCancel( tracker, eventInfo, gPoint );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onGestureStart( tracker, event ) {\n if ( !$.eventIsCanceled( event ) ) {\n event.preventDefault();\n }\n return false;\n }\n\n\n /**\n * @private\n * @inner\n */\n function onGestureChange( tracker, event ) {\n if ( !$.eventIsCanceled( event ) ) {\n event.preventDefault();\n }\n return false;\n }\n\n\n /**\n * @private\n * @inner\n */\n function onGotPointerCapture( tracker, event ) {\n //$.console.log('gotpointercapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'gotpointercapture',\n pointerType: getPointerType( event ),\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( event.target === tracker.element ) {\n //$.console.log('gotpointercapture ' + (tracker.userData ? tracker.userData.toString() : ''));\n updatePointerCaptured( tracker, {\n id: event.pointerId,\n type: getPointerType( event )\n }, true );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onLostPointerCapture( tracker, event ) {\n //$.console.log('lostpointercapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'lostpointercapture',\n pointerType: getPointerType( event ),\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( event.target === tracker.element ) {\n //$.console.log('lostpointercapture ' + (tracker.userData ? tracker.userData.toString() : ''));\n updatePointerCaptured( tracker, {\n id: event.pointerId,\n type: getPointerType( event )\n }, false );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerEnter( tracker, event ) {\n //$.console.log('pointerenter ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n // pointerenter doesn't bubble and is not cancelable, but we call\n // preProcessEvent() so it's dispatched to preProcessEventHandler\n // if necessary\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerenter',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerEnter( tracker, eventInfo, gPoint );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerLeave( tracker, event ) {\n //$.console.log('pointerleave ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n // pointerleave doesn't bubble and is not cancelable, but we call\n // preProcessEvent() so it's dispatched to preProcessEventHandler\n // if necessary\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerleave',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerLeave( tracker, eventInfo, gPoint );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerOver( tracker, event ) {\n //$.console.log('pointerover ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerover',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerOver( tracker, eventInfo, gPoint );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerOut( tracker, event ) {\n //$.console.log('pointerout ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerout',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerOut( tracker, eventInfo, gPoint );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerDown( tracker, event ) {\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n // Most browsers implicitly capture touch pointer events\n // Note no IE versions have element.hasPointerCapture() so no implicit\n // pointer capture possible\n // var implicitlyCaptured = ($.MouseTracker.havePointerEvents &&\n // event.target.hasPointerCapture &&\n // $.Browser.vendor !== $.BROWSERS.IE) ?\n // event.target.hasPointerCapture(event.pointerId) : false;\n var implicitlyCaptured = $.MouseTracker.havePointerEvents &&\n gPoint.type === 'touch' &&\n $.Browser.vendor !== $.BROWSERS.IE;\n\n //$.console.log('pointerdown ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerdown',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerDown( tracker, eventInfo, gPoint, event.button );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n if ( eventInfo.shouldCapture ) {\n if ( implicitlyCaptured ) {\n updatePointerCaptured( tracker, gPoint, true );\n } else {\n capturePointer( tracker, gPoint );\n }\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerUp( tracker, event ) {\n handlePointerUp( tracker, event );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * This handler is attached to the window object (on the capture phase) to emulate mouse capture.\n * onPointerUp is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onPointerUpCaptured( tracker, event ) {\n var pointsList = tracker.getActivePointersListByType( getPointerType( event ) );\n if ( pointsList.getById( event.pointerId ) ) {\n handlePointerUp( tracker, event );\n }\n $.stopEvent( event );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function handlePointerUp( tracker, event ) {\n var gPoint;\n\n //$.console.log('pointerup ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerup',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerUp( tracker, eventInfo, gPoint, event.button );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n\n // Per spec, pointerup events are supposed to release capture. Not all browser\n // versions have adhered to the spec, and there's no harm in releasing\n // explicitly\n if ( eventInfo.shouldReleaseCapture ) {\n if ( event.target === tracker.element ) {\n releasePointer( tracker, gPoint );\n } else {\n updatePointerCaptured( tracker, gPoint, false );\n }\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerMove( tracker, event ) {\n handlePointerMove( tracker, event );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * This handler is attached to the window object (on the capture phase) to emulate mouse capture.\n * onPointerMove is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onPointerMoveCaptured( tracker, event ) {\n var pointsList = tracker.getActivePointersListByType( getPointerType( event ) );\n if ( pointsList.getById( event.pointerId ) ) {\n handlePointerMove( tracker, event );\n }\n $.stopEvent( event );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function handlePointerMove( tracker, event ) {\n // Pointer changed coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height)\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointermove',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerMove( tracker, eventInfo, gPoint );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onPointerCancel( tracker, event ) {\n //$.console.log('pointercancel ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var gPoint = {\n id: event.pointerId,\n type: getPointerType( event )\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointercancel',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n //TODO need to only do this if our element is target?\n updatePointerCancel( tracker, eventInfo, gPoint );\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Device-agnostic DOM event handlers\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList\n * The GesturePointList to track the pointer in.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point to track.\n * @returns {Number} Number of gesture points in pointsList.\n */\n function startTrackingPointer( pointsList, gPoint ) {\n //$.console.log('startTrackingPointer *** ' + pointsList.type + ' ' + gPoint.id.toString());\n gPoint.speed = 0;\n gPoint.direction = 0;\n gPoint.contactPos = gPoint.currentPos;\n gPoint.contactTime = gPoint.currentTime;\n gPoint.lastPos = gPoint.currentPos;\n gPoint.lastTime = gPoint.currentTime;\n\n return pointsList.add( gPoint );\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList\n * The GesturePointList to stop tracking the pointer on.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point to stop tracking.\n * @returns {Number} Number of gesture points in pointsList.\n */\n function stopTrackingPointer( tracker, pointsList, gPoint ) {\n //$.console.log('stopTrackingPointer *** ' + pointsList.type + ' ' + gPoint.id.toString());\n var listLength;\n\n var trackedGPoint = pointsList.getById( gPoint.id );\n\n if ( trackedGPoint ) {\n if ( trackedGPoint.captured ) {\n $.console.warn('stopTrackingPointer() called on captured pointer');\n releasePointer( tracker, trackedGPoint );\n }\n\n // If child element relinquishes capture to a parent we may get here\n // from a pointerleave event while a pointerup event will never be received.\n // In that case, we'll clean up the contact count\n if ( (pointsList.type === 'mouse' || pointsList.type === 'pen') &&\n pointsList.contacts > 0 ) {\n pointsList.removeContact();\n }\n\n listLength = pointsList.removeById( gPoint.id );\n } else {\n listLength = pointsList.getLength();\n }\n\n return listLength;\n }\n\n\n /**\n * @function\n * @private\n * @inner\n */\n function getEventProcessDefaults( tracker, eventInfo ) {\n switch ( eventInfo.eventType ) {\n case 'pointermove':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false;\n eventInfo.preventGesture = !tracker.hasGestureHandlers;\n eventInfo.stopPropagation = false;\n break;\n case 'pointerover':\n case 'pointerout':\n case 'contextmenu':\n case 'keydown':\n case 'keyup':\n case 'keypress':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false; // onContextMenu(), onKeyDown(), onKeyUp(), onKeyPress() may set true\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n case 'pointerdown':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false; // updatePointerDown() may set true (tracker.hasGestureHandlers)\n eventInfo.preventGesture = !tracker.hasGestureHandlers;\n eventInfo.stopPropagation = false;\n break;\n case 'pointerup':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false;\n eventInfo.preventGesture = !tracker.hasGestureHandlers;\n eventInfo.stopPropagation = false;\n break;\n case 'wheel':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false; // handleWheelEvent() may set true\n eventInfo.preventGesture = !tracker.hasScrollHandler;\n eventInfo.stopPropagation = false;\n break;\n case 'gotpointercapture':\n case 'lostpointercapture':\n case 'pointercancel':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = false;\n eventInfo.preventDefault = false;\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n case 'click':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = !!tracker.clickHandler;\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n case 'dblclick':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = !!tracker.dblClickHandler;\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n case 'focus':\n case 'blur':\n case 'pointerenter':\n case 'pointerleave':\n default:\n eventInfo.isStoppable = false;\n eventInfo.isCancelable = false;\n eventInfo.preventDefault = false;\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n }\n }\n\n\n /**\n * Sets up for and calls preProcessEventHandler. Call with the following parameters -\n * this function will fill in the rest of the preProcessEventHandler event object\n * properties\n *\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * @param {Object} eventInfo.originalEvent\n * @param {String} eventInfo.eventType\n * @param {String} eventInfo.pointerType\n * @param {Boolean} eventInfo.isEmulated\n */\n function preProcessEvent( tracker, eventInfo ) {\n eventInfo.eventSource = tracker;\n eventInfo.eventPhase = eventInfo.originalEvent ?\n ((typeof eventInfo.originalEvent.eventPhase !== 'undefined') ?\n eventInfo.originalEvent.eventPhase : 0) : 0;\n eventInfo.defaultPrevented = $.eventIsCanceled( eventInfo.originalEvent );\n eventInfo.shouldCapture = false;\n eventInfo.shouldReleaseCapture = false;\n eventInfo.userData = tracker.userData;\n\n getEventProcessDefaults( tracker, eventInfo );\n\n if ( tracker.preProcessEventHandler ) {\n tracker.preProcessEventHandler( eventInfo );\n }\n }\n\n\n /**\n * Sets or resets the captured property on the tracked pointer matching the passed gPoint's id/type\n *\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {Object} gPoint\n * An object with id and type properties describing the pointer to update.\n * @param {Boolean} isCaptured\n * Value to set the captured property to.\n */\n function updatePointerCaptured( tracker, gPoint, isCaptured ) {\n var pointsList = tracker.getActivePointersListByType( gPoint.type );\n var updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n if ( isCaptured && !updateGPoint.captured ) {\n updateGPoint.captured = true;\n pointsList.captureCount++;\n } else if ( !isCaptured && updateGPoint.captured ) {\n updateGPoint.captured = false;\n pointsList.captureCount--;\n if ( pointsList.captureCount < 0 ) {\n pointsList.captureCount = 0;\n $.console.warn('updatePointerCaptured() - pointsList.captureCount went negative');\n }\n }\n } else {\n $.console.warn('updatePointerCaptured() called on untracked pointer');\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n */\n function updatePointerEnter( tracker, eventInfo, gPoint ) {\n var pointsList = tracker.getActivePointersListByType( gPoint.type ),\n updateGPoint;\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n updateGPoint.insideElement = true;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n\n gPoint = updateGPoint;\n } else {\n // Initialize for tracking and add to the tracking list\n gPoint.captured = false; // Handled by updatePointerCaptured()\n gPoint.insideElementPressed = false;\n gPoint.insideElement = true;\n startTrackingPointer( pointsList, gPoint );\n }\n\n // Enter (doesn't bubble and not cancelable)\n if ( tracker.enterHandler ) {\n tracker.enterHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: gPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n */\n function updatePointerLeave( tracker, eventInfo, gPoint ) {\n var pointsList = tracker.getActivePointersListByType(gPoint.type),\n updateGPoint,\n dispatchEventObj;\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer. If captured then update it, else stop tracking it\n if ( updateGPoint.captured ) {\n updateGPoint.insideElement = false;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n } else {\n stopTrackingPointer( tracker, pointsList, updateGPoint );\n }\n\n gPoint = updateGPoint;\n } else {\n gPoint.captured = false; // Handled by updatePointerCaptured()\n gPoint.insideElementPressed = false;\n }\n\n // Leave (doesn't bubble and not cancelable)\n // Note: exitHandler is deprecated (v2.5.0), replaced by leaveHandler\n if ( tracker.leaveHandler || tracker.exitHandler ) {\n dispatchEventObj = {\n eventSource: tracker,\n pointerType: gPoint.type,\n // GitHub PR: https://github.com/openseadragon/openseadragon/pull/1754 (gPoint.currentPos && )\n position: gPoint.currentPos && getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: gPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n };\n\n if ( tracker.leaveHandler ) {\n tracker.leaveHandler( dispatchEventObj );\n }\n // Deprecated\n if ( tracker.exitHandler ) {\n tracker.exitHandler( dispatchEventObj );\n }\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n */\n function updatePointerOver( tracker, eventInfo, gPoint ) {\n var pointsList,\n updateGPoint;\n\n pointsList = tracker.getActivePointersListByType( gPoint.type );\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n gPoint = updateGPoint;\n } else {\n gPoint.captured = false;\n gPoint.insideElementPressed = false;\n //gPoint.insideElement = true; // Tracked by updatePointerEnter\n }\n\n if ( tracker.overHandler ) {\n // Over\n tracker.overHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: gPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n }\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n */\n function updatePointerOut( tracker, eventInfo, gPoint ) {\n var pointsList,\n updateGPoint;\n\n pointsList = tracker.getActivePointersListByType(gPoint.type);\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n gPoint = updateGPoint;\n } else {\n gPoint.captured = false;\n gPoint.insideElementPressed = false;\n //gPoint.insideElement = true; // Tracked by updatePointerEnter\n }\n\n if ( tracker.outHandler ) {\n // Out\n tracker.outHandler( {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: gPoint.currentPos && getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: gPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n } );\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n * @param {Number} buttonChanged\n * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model,\n * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events.\n */\n function updatePointerDown( tracker, eventInfo, gPoint, buttonChanged ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoint.type ),\n updateGPoint;\n\n if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) {\n pointsList.buttons = eventInfo.originalEvent.buttons;\n } else {\n if ( buttonChanged === 0 ) {\n // Primary\n pointsList.buttons |= 1;\n } else if ( buttonChanged === 1 ) {\n // Aux\n pointsList.buttons |= 4;\n } else if ( buttonChanged === 2 ) {\n // Secondary\n pointsList.buttons |= 2;\n } else if ( buttonChanged === 3 ) {\n // X1 (Back)\n pointsList.buttons |= 8;\n } else if ( buttonChanged === 4 ) {\n // X2 (Forward)\n pointsList.buttons |= 16;\n } else if ( buttonChanged === 5 ) {\n // Pen Eraser\n pointsList.buttons |= 32;\n }\n }\n\n // Only capture and track primary button, pen, and touch contacts\n if ( buttonChanged !== 0 ) {\n eventInfo.shouldCapture = false;\n eventInfo.shouldReleaseCapture = false;\n\n // Aux Press\n if ( tracker.nonPrimaryPressHandler &&\n !eventInfo.preventGesture &&\n !eventInfo.defaultPrevented ) {\n eventInfo.preventDefault = true;\n\n tracker.nonPrimaryPressHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n button: buttonChanged,\n buttons: pointsList.buttons,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n return;\n }\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n //updateGPoint.captured = true; // Handled by updatePointerCaptured()\n updateGPoint.insideElementPressed = true;\n updateGPoint.insideElement = true;\n updateGPoint.originalTarget = eventInfo.originalEvent.target;\n updateGPoint.contactPos = gPoint.currentPos;\n updateGPoint.contactTime = gPoint.currentTime;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n\n gPoint = updateGPoint;\n } else {\n // Initialize for tracking and add to the tracking list (no pointerenter event occurred before this)\n $.console.warn('pointerdown event on untracked pointer');\n gPoint.captured = false; // Handled by updatePointerCaptured()\n gPoint.insideElementPressed = true;\n gPoint.insideElement = true;\n gPoint.originalTarget = eventInfo.originalEvent.target;\n startTrackingPointer( pointsList, gPoint );\n return;\n }\n\n pointsList.addContact();\n //$.console.log('contacts++ ', pointsList.contacts);\n\n if ( !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventInfo.shouldCapture = true;\n eventInfo.shouldReleaseCapture = false;\n eventInfo.preventDefault = true;\n\n if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {\n $.MouseTracker.gesturePointVelocityTracker.addPoint( tracker, gPoint );\n }\n\n if ( pointsList.contacts === 1 ) {\n // Press\n if ( tracker.pressHandler && !eventInfo.preventGesture ) {\n tracker.pressHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.contactPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n } else if ( pointsList.contacts === 2 ) {\n if ( tracker.pinchHandler && gPoint.type === 'touch' ) {\n // Initialize for pinch\n delegate.pinchGPoints = pointsList.asArray();\n delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n }\n }\n } else {\n eventInfo.shouldCapture = false;\n eventInfo.shouldReleaseCapture = false;\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture points associated with the event.\n * @param {Number} buttonChanged\n * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model,\n * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events.\n */\n function updatePointerUp( tracker, eventInfo, gPoint, buttonChanged ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoint.type ),\n releasePoint,\n releaseTime,\n updateGPoint,\n wasCaptured = false,\n quick;\n\n if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) {\n pointsList.buttons = eventInfo.originalEvent.buttons;\n } else {\n if ( buttonChanged === 0 ) {\n // Primary\n pointsList.buttons ^= ~1;\n } else if ( buttonChanged === 1 ) {\n // Aux\n pointsList.buttons ^= ~4;\n } else if ( buttonChanged === 2 ) {\n // Secondary\n pointsList.buttons ^= ~2;\n } else if ( buttonChanged === 3 ) {\n // X1 (Back)\n pointsList.buttons ^= ~8;\n } else if ( buttonChanged === 4 ) {\n // X2 (Forward)\n pointsList.buttons ^= ~16;\n } else if ( buttonChanged === 5 ) {\n // Pen Eraser\n pointsList.buttons ^= ~32;\n }\n }\n\n eventInfo.shouldCapture = false;\n\n // Only capture and track primary button, pen, and touch contacts\n if ( buttonChanged !== 0 ) {\n eventInfo.shouldReleaseCapture = false;\n\n // Aux Release\n if ( tracker.nonPrimaryReleaseHandler &&\n !eventInfo.preventGesture &&\n !eventInfo.defaultPrevented ) {\n eventInfo.preventDefault = true;\n\n tracker.nonPrimaryReleaseHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute(gPoint.currentPos, tracker.element),\n button: buttonChanged,\n buttons: pointsList.buttons,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n return;\n }\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n pointsList.removeContact();\n //$.console.log('contacts-- ', pointsList.contacts);\n\n // Update the pointer, stop tracking it if not still in this element\n if ( updateGPoint.captured ) {\n //updateGPoint.captured = false; // Handled by updatePointerCaptured()\n wasCaptured = true;\n }\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n if ( !updateGPoint.insideElement ) {\n stopTrackingPointer( tracker, pointsList, updateGPoint );\n }\n\n releasePoint = updateGPoint.currentPos;\n releaseTime = updateGPoint.currentTime;\n } else {\n // should never get here...we'll start to track pointer anyway\n $.console.warn('updatePointerUp(): pointerup on untracked gPoint');\n gPoint.captured = false; // Handled by updatePointerCaptured()\n gPoint.insideElementPressed = false;\n gPoint.insideElement = true;\n startTrackingPointer( pointsList, gPoint );\n\n updateGPoint = gPoint;\n }\n\n if ( !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n if ( wasCaptured ) {\n // Pointer was activated in our element but could have been removed in any element since events are captured to our element\n\n eventInfo.shouldReleaseCapture = true;\n eventInfo.preventDefault = true;\n\n if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {\n $.MouseTracker.gesturePointVelocityTracker.removePoint( tracker, updateGPoint );\n }\n\n if ( pointsList.contacts === 0 ) {\n\n // Release (pressed in our element)\n if ( tracker.releaseHandler ) {\n tracker.releaseHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( releasePoint, tracker.element ),\n buttons: pointsList.buttons,\n insideElementPressed: updateGPoint.insideElementPressed,\n insideElementReleased: updateGPoint.insideElement,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n // Drag End\n if ( tracker.dragEndHandler && delegate.sentDragEvent ) {\n tracker.dragEndHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n speed: updateGPoint.speed,\n direction: updateGPoint.direction,\n shift: eventInfo.originalEvent.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n // We want to clear this flag regardless of whether we fired the dragEndHandler\n delegate.sentDragEvent = false;\n\n // Click / Double-Click\n if ( ( tracker.clickHandler || tracker.dblClickHandler ) && updateGPoint.insideElement ) {\n quick = releaseTime - updateGPoint.contactTime <= tracker.clickTimeThreshold &&\n updateGPoint.contactPos.distanceTo( releasePoint ) <= tracker.clickDistThreshold;\n\n // Click\n if ( tracker.clickHandler ) {\n tracker.clickHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n quick: quick,\n shift: eventInfo.originalEvent.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n originalTarget: updateGPoint.originalTarget,\n userData: tracker.userData\n }\n );\n }\n\n // Double-Click\n if ( tracker.dblClickHandler && quick ) {\n pointsList.clicks++;\n if ( pointsList.clicks === 1 ) {\n delegate.lastClickPos = releasePoint;\n /*jshint loopfunc:true*/\n delegate.dblClickTimeOut = setTimeout( function() {\n pointsList.clicks = 0;\n }, tracker.dblClickTimeThreshold );\n /*jshint loopfunc:false*/\n } else if ( pointsList.clicks === 2 ) {\n clearTimeout( delegate.dblClickTimeOut );\n pointsList.clicks = 0;\n if ( delegate.lastClickPos.distanceTo( releasePoint ) <= tracker.dblClickDistThreshold ) {\n tracker.dblClickHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n shift: eventInfo.originalEvent.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n delegate.lastClickPos = null;\n }\n }\n }\n } else if ( pointsList.contacts === 2 ) {\n if ( tracker.pinchHandler && updateGPoint.type === 'touch' ) {\n // Reset for pinch\n delegate.pinchGPoints = pointsList.asArray();\n delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n }\n }\n } else {\n // Pointer was activated in another element but removed in our element\n\n eventInfo.shouldReleaseCapture = false;\n\n // Release (pressed in another element)\n if ( tracker.releaseHandler ) {\n tracker.releaseHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( releasePoint, tracker.element ),\n buttons: pointsList.buttons,\n insideElementPressed: updateGPoint.insideElementPressed,\n insideElementReleased: updateGPoint.insideElement,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n eventInfo.preventDefault = true;\n }\n }\n }\n }\n\n\n /**\n * Call when pointer(s) change coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height)\n *\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture points associated with the event.\n */\n function updatePointerMove( tracker, eventInfo, gPoint ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoint.type ),\n updateGPoint,\n gPointArray,\n delta;\n\n if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) {\n pointsList.buttons = eventInfo.originalEvent.buttons;\n }\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n } else {\n // Should never get here, but due to user agent bugs (e.g. legacy touch) it sometimes happens\n return;\n }\n\n eventInfo.shouldCapture = false;\n eventInfo.shouldReleaseCapture = false;\n\n // Stop (mouse only)\n if ( tracker.stopHandler && gPoint.type === 'mouse' ) {\n clearTimeout( tracker.stopTimeOut );\n tracker.stopTimeOut = setTimeout( function() {\n handlePointerStop( tracker, eventInfo.originalEvent, gPoint.type );\n }, tracker.stopDelay );\n }\n\n if ( pointsList.contacts === 0 ) {\n // Move (no contacts: hovering mouse or other hover-capable device)\n if ( tracker.moveHandler ) {\n tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n } else if ( pointsList.contacts === 1 ) {\n // Move (1 contact)\n if ( tracker.moveHandler ) {\n updateGPoint = pointsList.asArray()[ 0 ];\n tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n // Drag\n if ( tracker.dragHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n updateGPoint = pointsList.asArray()[ 0 ];\n delta = updateGPoint.currentPos.minus( updateGPoint.lastPos );\n tracker.dragHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n delta: delta,\n speed: updateGPoint.speed,\n direction: updateGPoint.direction,\n shift: eventInfo.originalEvent.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n eventInfo.preventDefault = true;\n delegate.sentDragEvent = true;\n }\n } else if ( pointsList.contacts === 2 ) {\n // Move (2 contacts, use center)\n if ( tracker.moveHandler ) {\n gPointArray = pointsList.asArray();\n tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: gPointArray[ 0 ].type,\n position: getPointRelativeToAbsolute( getCenterPoint( gPointArray[ 0 ].currentPos, gPointArray[ 1 ].currentPos ), tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: gPointArray[ 0 ].type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n // Pinch\n if ( tracker.pinchHandler && gPoint.type === 'touch' &&\n !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n delta = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n if ( delta !== delegate.currentPinchDist ) {\n delegate.lastPinchDist = delegate.currentPinchDist;\n delegate.currentPinchDist = delta;\n delegate.lastPinchCenter = delegate.currentPinchCenter;\n delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n tracker.pinchHandler(\n {\n eventSource: tracker,\n pointerType: 'touch',\n gesturePoints: delegate.pinchGPoints,\n lastCenter: getPointRelativeToAbsolute( delegate.lastPinchCenter, tracker.element ),\n center: getPointRelativeToAbsolute( delegate.currentPinchCenter, tracker.element ),\n lastDistance: delegate.lastPinchDist,\n distance: delegate.currentPinchDist,\n shift: eventInfo.originalEvent.shiftKey,\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n eventInfo.preventDefault = true;\n }\n }\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture points associated with the event.\n */\n function updatePointerCancel( tracker, eventInfo, gPoint ) {\n var pointsList = tracker.getActivePointersListByType( gPoint.type ),\n updateGPoint;\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n stopTrackingPointer( tracker, pointsList, updateGPoint );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function handlePointerStop( tracker, originalMoveEvent, pointerType ) {\n if ( tracker.stopHandler ) {\n tracker.stopHandler( {\n eventSource: tracker,\n pointerType: pointerType,\n position: getMouseRelative( originalMoveEvent, tracker.element ),\n buttons: tracker.getActivePointersListByType( pointerType ).buttons,\n isTouchEvent: pointerType === 'touch',\n originalEvent: originalMoveEvent,\n userData: tracker.userData\n } );\n }\n }\n\n}(OpenSeadragon));\n\n/*\n * OpenSeadragon - Control\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * An enumeration of supported locations where controls can be anchored.\n * The anchoring is always relative to the container.\n * @member ControlAnchor\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {Number} NONE\n * @property {Number} TOP_LEFT\n * @property {Number} TOP_RIGHT\n * @property {Number} BOTTOM_LEFT\n * @property {Number} BOTTOM_RIGHT\n * @property {Number} ABSOLUTE\n */\n$.ControlAnchor = {\n NONE: 0,\n TOP_LEFT: 1,\n TOP_RIGHT: 2,\n BOTTOM_RIGHT: 3,\n BOTTOM_LEFT: 4,\n ABSOLUTE: 5\n};\n\n/**\n * @class Control\n * @classdesc A Control represents any interface element which is meant to allow the user\n * to interact with the zoomable interface. Any control can be anchored to any\n * element.\n *\n * @memberof OpenSeadragon\n * @param {Element} element - the control element to be anchored in the container.\n * @param {Object } options - All required and optional settings for configuring a control element.\n * @param {OpenSeadragon.ControlAnchor} [options.anchor=OpenSeadragon.ControlAnchor.NONE] - the position of the control\n * relative to the container.\n * @param {Boolean} [options.attachToViewer=true] - Whether the control should be added directly to the viewer, or\n * directly to the container\n * @param {Boolean} [options.autoFade=true] - Whether the control should have the autofade behavior\n * @param {Element} container - the element to control will be anchored too.\n */\n$.Control = function ( element, options, container ) {\n var parent = element.parentNode;\n if (typeof options === 'number')\n {\n $.console.error(\"Passing an anchor directly into the OpenSeadragon.Control constructor is deprecated; \" +\n \"please use an options object instead. \" +\n \"Support for this deprecated variant is scheduled for removal in December 2013\");\n options = {anchor: options};\n }\n options.attachToViewer = (typeof options.attachToViewer === 'undefined') ? true : options.attachToViewer;\n /**\n * True if the control should have autofade behavior.\n * @member {Boolean} autoFade\n * @memberof OpenSeadragon.Control#\n */\n this.autoFade = (typeof options.autoFade === 'undefined') ? true : options.autoFade;\n /**\n * The element providing the user interface with some type of control (e.g. a zoom-in button).\n * @member {Element} element\n * @memberof OpenSeadragon.Control#\n */\n this.element = element;\n /**\n * The position of the Control relative to its container.\n * @member {OpenSeadragon.ControlAnchor} anchor\n * @memberof OpenSeadragon.Control#\n */\n this.anchor = options.anchor;\n /**\n * The Control's containing element.\n * @member {Element} container\n * @memberof OpenSeadragon.Control#\n */\n this.container = container;\n /**\n * A neutral element surrounding the control element.\n * @member {Element} wrapper\n * @memberof OpenSeadragon.Control#\n */\n if ( this.anchor === $.ControlAnchor.ABSOLUTE ) {\n this.wrapper = $.makeNeutralElement( \"div\" );\n this.wrapper.style.position = \"absolute\";\n this.wrapper.style.top = typeof (options.top) === \"number\" ? (options.top + 'px') : options.top;\n this.wrapper.style.left = typeof (options.left) === \"number\" ? (options.left + 'px') : options.left;\n this.wrapper.style.height = typeof (options.height) === \"number\" ? (options.height + 'px') : options.height;\n this.wrapper.style.width = typeof (options.width) === \"number\" ? (options.width + 'px') : options.width;\n this.wrapper.style.margin = \"0px\";\n this.wrapper.style.padding = \"0px\";\n\n this.element.style.position = \"relative\";\n this.element.style.top = \"0px\";\n this.element.style.left = \"0px\";\n this.element.style.height = \"100%\";\n this.element.style.width = \"100%\";\n } else {\n this.wrapper = $.makeNeutralElement( \"div\" );\n this.wrapper.style.display = \"inline-block\";\n if ( this.anchor === $.ControlAnchor.NONE ) {\n // IE6 fix\n this.wrapper.style.width = this.wrapper.style.height = \"100%\";\n }\n }\n this.wrapper.appendChild( this.element );\n\n if (options.attachToViewer ) {\n if ( this.anchor === $.ControlAnchor.TOP_RIGHT ||\n this.anchor === $.ControlAnchor.BOTTOM_RIGHT ) {\n this.container.insertBefore(\n this.wrapper,\n this.container.firstChild\n );\n } else {\n this.container.appendChild( this.wrapper );\n }\n } else {\n parent.appendChild( this.wrapper );\n }\n};\n\n/** @lends OpenSeadragon.Control.prototype */\n$.Control.prototype = {\n\n /**\n * Removes the control from the container.\n * @function\n */\n destroy: function() {\n this.wrapper.removeChild( this.element );\n if (this.anchor !== $.ControlAnchor.NONE) {\n this.container.removeChild(this.wrapper);\n }\n },\n\n /**\n * Determines if the control is currently visible.\n * @function\n * @return {Boolean} true if currently visible, false otherwise.\n */\n isVisible: function() {\n return this.wrapper.style.display !== \"none\";\n },\n\n /**\n * Toggles the visibility of the control.\n * @function\n * @param {Boolean} visible - true to make visible, false to hide.\n */\n setVisible: function( visible ) {\n this.wrapper.style.display = visible ?\n ( this.anchor === $.ControlAnchor.ABSOLUTE ? 'block' : 'inline-block' ) :\n \"none\";\n },\n\n /**\n * Sets the opacity level for the control.\n * @function\n * @param {Number} opactiy - a value between 1 and 0 inclusively.\n */\n setOpacity: function( opacity ) {\n if ( this.element[ $.SIGNAL ] && $.Browser.vendor === $.BROWSERS.IE ) {\n $.setElementOpacity( this.element, opacity, true );\n } else {\n $.setElementOpacity( this.wrapper, opacity, true );\n }\n }\n};\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - ControlDock\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n /**\n * @class ControlDock\n * @classdesc Provides a container element (a <form> element) with support for the layout of control elements.\n *\n * @memberof OpenSeadragon\n */\n $.ControlDock = function( options ){\n var layouts = [ 'topleft', 'topright', 'bottomright', 'bottomleft'],\n layout,\n i;\n\n $.extend( true, this, {\n id: 'controldock-' + $.now() + '-' + Math.floor(Math.random() * 1000000),\n container: $.makeNeutralElement( 'div' ),\n controls: []\n }, options );\n\n // Disable the form's submit; otherwise button clicks and return keys\n // can trigger it.\n this.container.onsubmit = function() {\n return false;\n };\n\n if( this.element ){\n this.element = $.getElement( this.element );\n this.element.appendChild( this.container );\n this.element.style.position = 'relative';\n this.container.style.width = '100%';\n this.container.style.height = '100%';\n }\n\n for( i = 0; i < layouts.length; i++ ){\n layout = layouts[ i ];\n this.controls[ layout ] = $.makeNeutralElement( \"div\" );\n this.controls[ layout ].style.position = 'absolute';\n if ( layout.match( 'left' ) ){\n this.controls[ layout ].style.left = '0px';\n }\n if ( layout.match( 'right' ) ){\n this.controls[ layout ].style.right = '0px';\n }\n if ( layout.match( 'top' ) ){\n this.controls[ layout ].style.top = '0px';\n }\n if ( layout.match( 'bottom' ) ){\n this.controls[ layout ].style.bottom = '0px';\n }\n }\n\n this.container.appendChild( this.controls.topleft );\n this.container.appendChild( this.controls.topright );\n this.container.appendChild( this.controls.bottomright );\n this.container.appendChild( this.controls.bottomleft );\n };\n\n /** @lends OpenSeadragon.ControlDock.prototype */\n $.ControlDock.prototype = {\n\n /**\n * @function\n */\n addControl: function ( element, controlOptions ) {\n element = $.getElement( element );\n var div = null;\n\n if ( getControlIndex( this, element ) >= 0 ) {\n return; // they're trying to add a duplicate control\n }\n\n switch ( controlOptions.anchor ) {\n case $.ControlAnchor.TOP_RIGHT:\n div = this.controls.topright;\n element.style.position = \"relative\";\n element.style.paddingRight = \"0px\";\n element.style.paddingTop = \"0px\";\n break;\n case $.ControlAnchor.BOTTOM_RIGHT:\n div = this.controls.bottomright;\n element.style.position = \"relative\";\n element.style.paddingRight = \"0px\";\n element.style.paddingBottom = \"0px\";\n break;\n case $.ControlAnchor.BOTTOM_LEFT:\n div = this.controls.bottomleft;\n element.style.position = \"relative\";\n element.style.paddingLeft = \"0px\";\n element.style.paddingBottom = \"0px\";\n break;\n case $.ControlAnchor.TOP_LEFT:\n div = this.controls.topleft;\n element.style.position = \"relative\";\n element.style.paddingLeft = \"0px\";\n element.style.paddingTop = \"0px\";\n break;\n case $.ControlAnchor.ABSOLUTE:\n div = this.container;\n element.style.margin = \"0px\";\n element.style.padding = \"0px\";\n break;\n default:\n case $.ControlAnchor.NONE:\n div = this.container;\n element.style.margin = \"0px\";\n element.style.padding = \"0px\";\n break;\n }\n\n this.controls.push(\n new $.Control( element, controlOptions, div )\n );\n element.style.display = \"inline-block\";\n },\n\n\n /**\n * @function\n * @return {OpenSeadragon.ControlDock} Chainable.\n */\n removeControl: function ( element ) {\n element = $.getElement( element );\n var i = getControlIndex( this, element );\n\n if ( i >= 0 ) {\n this.controls[ i ].destroy();\n this.controls.splice( i, 1 );\n }\n\n return this;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.ControlDock} Chainable.\n */\n clearControls: function () {\n while ( this.controls.length > 0 ) {\n this.controls.pop().destroy();\n }\n\n return this;\n },\n\n\n /**\n * @function\n * @return {Boolean}\n */\n areControlsEnabled: function () {\n var i;\n\n for ( i = this.controls.length - 1; i >= 0; i-- ) {\n if ( this.controls[ i ].isVisible() ) {\n return true;\n }\n }\n\n return false;\n },\n\n\n /**\n * @function\n * @return {OpenSeadragon.ControlDock} Chainable.\n */\n setControlsEnabled: function( enabled ) {\n var i;\n\n for ( i = this.controls.length - 1; i >= 0; i-- ) {\n this.controls[ i ].setVisible( enabled );\n }\n\n return this;\n }\n\n };\n\n\n ///////////////////////////////////////////////////////////////////////////////\n // Utility methods\n ///////////////////////////////////////////////////////////////////////////////\n function getControlIndex( dock, element ) {\n var controls = dock.controls,\n i;\n\n for ( i = controls.length - 1; i >= 0; i-- ) {\n if ( controls[ i ].element === element ) {\n return i;\n }\n }\n\n return -1;\n }\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - Placement\n *\n * Copyright (C) 2010-2016 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n /**\n * An enumeration of positions to anchor an element.\n * @member Placement\n * @memberOf OpenSeadragon\n * @static\n * @readonly\n * @property {OpenSeadragon.Placement} CENTER\n * @property {OpenSeadragon.Placement} TOP_LEFT\n * @property {OpenSeadragon.Placement} TOP\n * @property {OpenSeadragon.Placement} TOP_RIGHT\n * @property {OpenSeadragon.Placement} RIGHT\n * @property {OpenSeadragon.Placement} BOTTOM_RIGHT\n * @property {OpenSeadragon.Placement} BOTTOM\n * @property {OpenSeadragon.Placement} BOTTOM_LEFT\n * @property {OpenSeadragon.Placement} LEFT\n */\n $.Placement = $.freezeObject({\n CENTER: 0,\n TOP_LEFT: 1,\n TOP: 2,\n TOP_RIGHT: 3,\n RIGHT: 4,\n BOTTOM_RIGHT: 5,\n BOTTOM: 6,\n BOTTOM_LEFT: 7,\n LEFT: 8,\n properties: {\n 0: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n },\n 1: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 2: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 3: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 4: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n },\n 5: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 6: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 7: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 8: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n }\n }\n });\n\n}(OpenSeadragon));\n\n/*\n * OpenSeadragon - Viewer\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// dictionary from hash to private properties\nvar THIS = {};\nvar nextHash = 1;\n\n/**\n *\n * The main point of entry into creating a zoomable image on the page.
    \n *
    \n * We have provided an idiomatic javascript constructor which takes\n * a single object, but still support the legacy positional arguments.
    \n *
    \n * The options below are given in order that they appeared in the constructor\n * as arguments and we translate a positional call into an idiomatic call.
    \n *
    \n * To create a viewer, you can use either of this methods:
    \n *
      \n *
    • var viewer = new OpenSeadragon.Viewer(options);
    • \n *
    • var viewer = OpenSeadragon(options);
    • \n *
    \n * @class Viewer\n * @classdesc The main OpenSeadragon viewer class.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @extends OpenSeadragon.ControlDock\n * @param {OpenSeadragon.Options} options - Viewer options.\n *\n **/\n$.Viewer = function( options ) {\n\n var args = arguments,\n _this = this,\n i;\n\n\n //backward compatibility for positional args while preferring more\n //idiomatic javascript options object as the only argument\n if( !$.isPlainObject( options ) ){\n options = {\n id: args[ 0 ],\n xmlPath: args.length > 1 ? args[ 1 ] : undefined,\n prefixUrl: args.length > 2 ? args[ 2 ] : undefined,\n controls: args.length > 3 ? args[ 3 ] : undefined,\n overlays: args.length > 4 ? args[ 4 ] : undefined\n };\n }\n\n //options.config and the general config argument are deprecated\n //in favor of the more direct specification of optional settings\n //being pass directly on the options object\n if ( options.config ){\n $.extend( true, options, options.config );\n delete options.config;\n }\n\n //Public properties\n //Allow the options object to override global defaults\n $.extend( true, this, {\n\n //internal state and dom identifiers\n id: options.id,\n hash: options.hash || nextHash++,\n /**\n * Index for page to be shown first next time open() is called (only used in sequenceMode).\n * @member {Number} initialPage\n * @memberof OpenSeadragon.Viewer#\n */\n initialPage: 0,\n\n //dom nodes\n /**\n * The parent element of this Viewer instance, passed in when the Viewer was created.\n * @member {Element} element\n * @memberof OpenSeadragon.Viewer#\n */\n element: null,\n /**\n * A <div> element (provided by {@link OpenSeadragon.ControlDock}), the base element of this Viewer instance.

    \n * Child element of {@link OpenSeadragon.Viewer#element}.\n * @member {Element} container\n * @memberof OpenSeadragon.Viewer#\n */\n container: null,\n /**\n * A <div> element, the element where user-input events are handled for panning and zooming.

    \n * Child element of {@link OpenSeadragon.Viewer#container},\n * positioned on top of {@link OpenSeadragon.Viewer#keyboardCommandArea}.

    \n * The parent of {@link OpenSeadragon.Drawer#canvas} instances.\n * @member {Element} canvas\n * @memberof OpenSeadragon.Viewer#\n */\n canvas: null,\n\n // Overlays list. An overlay allows to add html on top of the viewer.\n overlays: [],\n // Container inside the canvas where overlays are drawn.\n overlaysContainer: null,\n\n //private state properties\n previousBody: [],\n\n //This was originally initialized in the constructor and so could never\n //have anything in it. now it can because we allow it to be specified\n //in the options and is only empty by default if not specified. Also\n //this array was returned from get_controls which I find confusing\n //since this object has a controls property which is treated in other\n //functions like clearControls. I'm removing the accessors.\n customControls: [],\n\n //These are originally not part options but declared as members\n //in initialize. It's still considered idiomatic to put them here\n //source is here for backwards compatibility. It is not an official\n //part of the API and should not be relied upon.\n source: null,\n /**\n * Handles rendering of tiles in the viewer. Created for each TileSource opened.\n * @member {OpenSeadragon.Drawer} drawer\n * @memberof OpenSeadragon.Viewer#\n */\n drawer: null,\n /**\n * Keeps track of all of the tiled images in the scene.\n * @member {OpenSeadragon.World} world\n * @memberof OpenSeadragon.Viewer#\n */\n world: null,\n /**\n * Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened.\n * @member {OpenSeadragon.Viewport} viewport\n * @memberof OpenSeadragon.Viewer#\n */\n viewport: null,\n /**\n * @member {OpenSeadragon.Navigator} navigator\n * @memberof OpenSeadragon.Viewer#\n */\n navigator: null,\n\n //A collection viewport is a separate viewport used to provide\n //simultaneous rendering of sets of tiles\n collectionViewport: null,\n collectionDrawer: null,\n\n //UI image resources\n //TODO: rename navImages to uiImages\n navImages: null,\n\n //interface button controls\n buttons: null,\n\n //TODO: this is defunct so safely remove it\n profiler: null\n\n }, $.DEFAULT_SETTINGS, options );\n\n if ( typeof ( this.hash) === \"undefined\" ) {\n throw new Error(\"A hash must be defined, either by specifying options.id or options.hash.\");\n }\n if ( typeof ( THIS[ this.hash ] ) !== \"undefined\" ) {\n // We don't want to throw an error here, as the user might have discarded\n // the previous viewer with the same hash and now want to recreate it.\n $.console.warn(\"Hash \" + this.hash + \" has already been used.\");\n }\n\n //Private state properties\n THIS[ this.hash ] = {\n fsBoundsDelta: new $.Point( 1, 1 ),\n prevContainerSize: null,\n animating: false,\n forceRedraw: false,\n mouseInside: false,\n group: null,\n // whether we should be continuously zooming\n zooming: false,\n // how much we should be continuously zooming by\n zoomFactor: null,\n lastZoomTime: null,\n fullPage: false,\n onfullscreenchange: null\n };\n\n this._sequenceIndex = 0;\n this._firstOpen = true;\n this._updateRequestId = null;\n this._loadQueue = [];\n this.currentOverlays = [];\n this._updatePixelDensityRatioBind = null;\n\n this._lastScrollTime = $.now(); // variable used to help normalize the scroll event speed of different devices\n\n //Inherit some behaviors and properties\n $.EventSource.call( this );\n\n this.addHandler( 'open-failed', function ( event ) {\n var msg = $.getString( \"Errors.OpenFailed\", event.eventSource, event.message);\n _this._showMessage( msg );\n });\n\n $.ControlDock.call( this, options );\n\n //Deal with tile sources\n if (this.xmlPath) {\n //Deprecated option. Now it is preferred to use the tileSources option\n this.tileSources = [ this.xmlPath ];\n }\n\n this.element = this.element || document.getElementById( this.id );\n this.canvas = $.makeNeutralElement( \"div\" );\n\n this.canvas.className = \"openseadragon-canvas\";\n (function( style ){\n style.width = \"100%\";\n style.height = \"100%\";\n style.overflow = \"hidden\";\n style.position = \"absolute\";\n style.top = \"0px\";\n style.left = \"0px\";\n }(this.canvas.style));\n $.setElementTouchActionNone( this.canvas );\n if (options.tabIndex !== \"\") {\n this.canvas.tabIndex = (options.tabIndex === undefined ? 0 : options.tabIndex);\n }\n\n //the container is created through applying the ControlDock constructor above\n this.container.className = \"openseadragon-container\";\n (function( style ){\n style.width = \"100%\";\n style.height = \"100%\";\n style.position = \"relative\";\n style.overflow = \"hidden\";\n style.left = \"0px\";\n style.top = \"0px\";\n style.textAlign = \"left\"; // needed to protect against\n }( this.container.style ));\n $.setElementTouchActionNone( this.container );\n\n this.container.insertBefore( this.canvas, this.container.firstChild );\n this.element.appendChild( this.container );\n\n //Used for toggling between fullscreen and default container size\n //TODO: these can be closure private and shared across Viewer\n // instances.\n this.bodyWidth = document.body.style.width;\n this.bodyHeight = document.body.style.height;\n this.bodyOverflow = document.body.style.overflow;\n this.docOverflow = document.documentElement.style.overflow;\n\n this.innerTracker = new $.MouseTracker({\n userData: 'Viewer.innerTracker',\n element: this.canvas,\n startDisabled: !this.mouseNavEnabled,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n dblClickTimeThreshold: this.dblClickTimeThreshold,\n dblClickDistThreshold: this.dblClickDistThreshold,\n contextMenuHandler: $.delegate( this, onCanvasContextMenu ),\n keyDownHandler: $.delegate( this, onCanvasKeyDown ),\n keyHandler: $.delegate( this, onCanvasKeyPress ),\n clickHandler: $.delegate( this, onCanvasClick ),\n dblClickHandler: $.delegate( this, onCanvasDblClick ),\n dragHandler: $.delegate( this, onCanvasDrag ),\n dragEndHandler: $.delegate( this, onCanvasDragEnd ),\n enterHandler: $.delegate( this, onCanvasEnter ),\n leaveHandler: $.delegate( this, onCanvasLeave ),\n pressHandler: $.delegate( this, onCanvasPress ),\n releaseHandler: $.delegate( this, onCanvasRelease ),\n nonPrimaryPressHandler: $.delegate( this, onCanvasNonPrimaryPress ),\n nonPrimaryReleaseHandler: $.delegate( this, onCanvasNonPrimaryRelease ),\n scrollHandler: $.delegate( this, onCanvasScroll ),\n pinchHandler: $.delegate( this, onCanvasPinch )\n });\n\n this.outerTracker = new $.MouseTracker({\n userData: 'Viewer.outerTracker',\n element: this.container,\n startDisabled: !this.mouseNavEnabled,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n dblClickTimeThreshold: this.dblClickTimeThreshold,\n dblClickDistThreshold: this.dblClickDistThreshold,\n enterHandler: $.delegate( this, onContainerEnter ),\n leaveHandler: $.delegate( this, onContainerLeave )\n });\n\n if( this.toolbar ){\n this.toolbar = new $.ControlDock({ element: this.toolbar });\n }\n\n this.bindStandardControls();\n\n THIS[ this.hash ].prevContainerSize = _getSafeElemSize( this.container );\n\n // Create the world\n this.world = new $.World({\n viewer: this\n });\n\n this.world.addHandler('add-item', function(event) {\n // For backwards compatibility, we maintain the source property\n _this.source = _this.world.getItemAt(0).source;\n\n THIS[ _this.hash ].forceRedraw = true;\n\n if (!_this._updateRequestId) {\n _this._updateRequestId = scheduleUpdate( _this, updateMulti );\n }\n });\n\n this.world.addHandler('remove-item', function(event) {\n // For backwards compatibility, we maintain the source property\n if (_this.world.getItemCount()) {\n _this.source = _this.world.getItemAt(0).source;\n } else {\n _this.source = null;\n }\n\n THIS[ _this.hash ].forceRedraw = true;\n });\n\n this.world.addHandler('metrics-change', function(event) {\n if (_this.viewport) {\n _this.viewport._setContentBounds(_this.world.getHomeBounds(), _this.world.getContentFactor());\n }\n });\n\n this.world.addHandler('item-index-change', function(event) {\n // For backwards compatibility, we maintain the source property\n _this.source = _this.world.getItemAt(0).source;\n });\n\n // Create the viewport\n this.viewport = new $.Viewport({\n containerSize: THIS[ this.hash ].prevContainerSize,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime,\n minZoomImageRatio: this.minZoomImageRatio,\n maxZoomPixelRatio: this.maxZoomPixelRatio,\n visibilityRatio: this.visibilityRatio,\n wrapHorizontal: this.wrapHorizontal,\n wrapVertical: this.wrapVertical,\n defaultZoomLevel: this.defaultZoomLevel,\n minZoomLevel: this.minZoomLevel,\n maxZoomLevel: this.maxZoomLevel,\n viewer: this,\n degrees: this.degrees,\n flipped: this.flipped,\n navigatorRotate: this.navigatorRotate,\n homeFillsViewer: this.homeFillsViewer,\n margins: this.viewportMargins\n });\n\n this.viewport._setContentBounds(this.world.getHomeBounds(), this.world.getContentFactor());\n\n // Create the image loader\n this.imageLoader = new $.ImageLoader({\n jobLimit: this.imageLoaderLimit,\n timeout: options.timeout\n });\n\n // Create the tile cache\n this.tileCache = new $.TileCache({\n maxImageCacheCount: this.maxImageCacheCount\n });\n\n // Create the drawer\n this.drawer = new $.Drawer({\n viewer: this,\n viewport: this.viewport,\n element: this.canvas,\n debugGridColor: this.debugGridColor\n });\n\n // Overlay container\n this.overlaysContainer = $.makeNeutralElement( \"div\" );\n this.canvas.appendChild( this.overlaysContainer );\n\n // Now that we have a drawer, see if it supports rotate. If not we need to remove the rotate buttons\n if (!this.drawer.canRotate()) {\n // Disable/remove the rotate left/right buttons since they aren't supported\n if (this.rotateLeft) {\n i = this.buttonGroup.buttons.indexOf(this.rotateLeft);\n this.buttonGroup.buttons.splice(i, 1);\n this.buttonGroup.element.removeChild(this.rotateLeft.element);\n }\n if (this.rotateRight) {\n i = this.buttonGroup.buttons.indexOf(this.rotateRight);\n this.buttonGroup.buttons.splice(i, 1);\n this.buttonGroup.element.removeChild(this.rotateRight.element);\n }\n }\n\n this._addUpdatePixelDensityRatioEvent();\n\n //Instantiate a navigator if configured\n if ( this.showNavigator){\n this.navigator = new $.Navigator({\n id: this.navigatorId,\n position: this.navigatorPosition,\n sizeRatio: this.navigatorSizeRatio,\n maintainSizeRatio: this.navigatorMaintainSizeRatio,\n top: this.navigatorTop,\n left: this.navigatorLeft,\n width: this.navigatorWidth,\n height: this.navigatorHeight,\n autoResize: this.navigatorAutoResize,\n autoFade: this.navigatorAutoFade,\n prefixUrl: this.prefixUrl,\n viewer: this,\n navigatorRotate: this.navigatorRotate,\n background: this.navigatorBackground,\n opacity: this.navigatorOpacity,\n borderColor: this.navigatorBorderColor,\n displayRegionColor: this.navigatorDisplayRegionColor,\n crossOriginPolicy: this.crossOriginPolicy\n });\n }\n\n // Sequence mode\n if (this.sequenceMode) {\n this.bindSequenceControls();\n }\n\n // Open initial tilesources\n if (this.tileSources) {\n this.open( this.tileSources );\n }\n\n // Add custom controls\n for ( i = 0; i < this.customControls.length; i++ ) {\n this.addControl(\n this.customControls[ i ].id,\n {anchor: this.customControls[ i ].anchor}\n );\n }\n\n // Initial fade out\n $.requestAnimationFrame( function(){\n beginControlsAutoHide( _this );\n } );\n\n // Initial canvas options\n if ( this.imageSmoothingEnabled !== undefined && !this.imageSmoothingEnabled){\n this.drawer.setImageSmoothingEnabled(this.imageSmoothingEnabled);\n }\n\n // Register the viewer\n $._viewers.set(this.element, this);\n};\n\n$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{\n\n\n /**\n * @function\n * @return {Boolean}\n */\n isOpen: function () {\n return !!this.world.getItemCount();\n },\n\n // deprecated\n openDzi: function ( dzi ) {\n $.console.error( \"[Viewer.openDzi] this function is deprecated; use Viewer.open() instead.\" );\n return this.open( dzi );\n },\n\n // deprecated\n openTileSource: function ( tileSource ) {\n $.console.error( \"[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead.\" );\n return this.open( tileSource );\n },\n\n /**\n * Open tiled images into the viewer, closing any others.\n * To get the TiledImage instance created by open, add an event listener for\n * {@link OpenSeadragon.Viewer.html#.event:open}, which when fired can be used to get access\n * to the instance, i.e., viewer.world.getItemAt(0).\n * @function\n * @param {Array|String|Object|Function} tileSources - This can be a TiledImage\n * specifier, a TileSource specifier, or an array of either. A TiledImage specifier\n * is the same as the options parameter for {@link OpenSeadragon.Viewer#addTiledImage},\n * except for the index property; images are added in sequence.\n * A TileSource specifier is anything you could pass as the tileSource property\n * of the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}.\n * @param {Number} initialPage - If sequenceMode is true, display this page initially\n * for the given tileSources. If specified, will overwrite the Viewer's existing initialPage property.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:open\n * @fires OpenSeadragon.Viewer.event:open-failed\n */\n open: function (tileSources, initialPage) {\n var _this = this;\n\n this.close();\n\n if (!tileSources) {\n return this;\n }\n\n if (this.sequenceMode && $.isArray(tileSources)) {\n if (this.referenceStrip) {\n this.referenceStrip.destroy();\n this.referenceStrip = null;\n }\n\n if (typeof initialPage !== 'undefined' && !isNaN(initialPage)) {\n this.initialPage = initialPage;\n }\n\n this.tileSources = tileSources;\n this._sequenceIndex = Math.max(0, Math.min(this.tileSources.length - 1, this.initialPage));\n if (this.tileSources.length) {\n this.open(this.tileSources[this._sequenceIndex]);\n\n if ( this.showReferenceStrip ){\n this.addReferenceStrip();\n }\n }\n\n this._updateSequenceButtons( this._sequenceIndex );\n return this;\n }\n\n if (!$.isArray(tileSources)) {\n tileSources = [tileSources];\n }\n\n if (!tileSources.length) {\n return this;\n }\n\n this._opening = true;\n\n var expected = tileSources.length;\n var successes = 0;\n var failures = 0;\n var failEvent;\n\n var checkCompletion = function() {\n if (successes + failures === expected) {\n if (successes) {\n if (_this._firstOpen || !_this.preserveViewport) {\n _this.viewport.goHome( true );\n _this.viewport.update();\n }\n\n _this._firstOpen = false;\n\n var source = tileSources[0];\n if (source.tileSource) {\n source = source.tileSource;\n }\n\n // Global overlays\n if( _this.overlays && !_this.preserveOverlays ){\n for ( var i = 0; i < _this.overlays.length; i++ ) {\n _this.currentOverlays[ i ] = getOverlayObject( _this, _this.overlays[ i ] );\n }\n }\n\n _this._drawOverlays();\n _this._opening = false;\n\n /**\n * Raised when the viewer has opened and loaded one or more TileSources.\n *\n * @event open\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TileSource} source - The tile source that was opened.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n // TODO: what if there are multiple sources?\n _this.raiseEvent( 'open', { source: source } );\n } else {\n _this._opening = false;\n\n /**\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {String} message - Information about what failed.\n * @property {String} source - The tile source that failed.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', failEvent );\n }\n }\n };\n\n var doOne = function(options) {\n if (!$.isPlainObject(options) || !options.tileSource) {\n options = {\n tileSource: options\n };\n }\n\n if (options.index !== undefined) {\n $.console.error('[Viewer.open] setting indexes here is not supported; use addTiledImage instead');\n delete options.index;\n }\n\n if (options.collectionImmediately === undefined) {\n options.collectionImmediately = true;\n }\n\n var originalSuccess = options.success;\n options.success = function(event) {\n successes++;\n\n // TODO: now that options has other things besides tileSource, the overlays\n // should probably be at the options level, not the tileSource level.\n if (options.tileSource.overlays) {\n for (var i = 0; i < options.tileSource.overlays.length; i++) {\n _this.addOverlay(options.tileSource.overlays[i]);\n }\n }\n\n if (originalSuccess) {\n originalSuccess(event);\n }\n\n checkCompletion();\n };\n\n var originalError = options.error;\n options.error = function(event) {\n failures++;\n\n if (!failEvent) {\n failEvent = event;\n }\n\n if (originalError) {\n originalError(event);\n }\n\n checkCompletion();\n };\n\n _this.addTiledImage(options);\n };\n\n // TileSources\n for (var i = 0; i < tileSources.length; i++) {\n doOne(tileSources[i]);\n }\n\n return this;\n },\n\n\n /**\n * @function\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:close\n */\n close: function ( ) {\n if ( !THIS[ this.hash ] ) {\n //this viewer has already been destroyed: returning immediately\n return this;\n }\n\n this._opening = false;\n\n if ( this.navigator ) {\n this.navigator.close();\n }\n\n if (!this.preserveOverlays) {\n this.clearOverlays();\n this.overlaysContainer.innerHTML = \"\";\n }\n\n THIS[ this.hash ].animating = false;\n this.world.removeAll();\n this.imageLoader.clear();\n\n /**\n * Raised when the viewer is closed (see {@link OpenSeadragon.Viewer#close}).\n *\n * @event close\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'close' );\n\n return this;\n },\n\n\n /**\n * Function to destroy the viewer and clean up everything created by OpenSeadragon.\n *\n * Example:\n * var viewer = OpenSeadragon({\n * [...]\n * });\n *\n * //when you are done with the viewer:\n * viewer.destroy();\n * viewer = null; //important\n *\n * @function\n */\n destroy: function( ) {\n if ( !THIS[ this.hash ] ) {\n //this viewer has already been destroyed: returning immediately\n return;\n }\n\n this._removeUpdatePixelDensityRatioEvent();\n\n this.close();\n\n this.clearOverlays();\n this.overlaysContainer.innerHTML = \"\";\n\n //TODO: implement this...\n //this.unbindSequenceControls()\n //this.unbindStandardControls()\n\n if (this.referenceStrip) {\n this.referenceStrip.destroy();\n this.referenceStrip = null;\n }\n\n if ( this._updateRequestId !== null ) {\n $.cancelAnimationFrame( this._updateRequestId );\n this._updateRequestId = null;\n }\n\n if ( this.drawer ) {\n this.drawer.destroy();\n }\n\n if ( this.navigator ) {\n this.navigator.destroy();\n THIS[ this.navigator.hash ] = null;\n delete THIS[ this.navigator.hash ];\n this.navigator = null;\n }\n\n this.removeAllHandlers();\n\n if (this.buttonGroup) {\n this.buttonGroup.destroy();\n } else if (this.customButtons) {\n while (this.customButtons.length) {\n this.customButtons.pop().destroy();\n }\n }\n\n if (this.paging) {\n this.paging.destroy();\n }\n\n // Go through top element (passed to us) and remove all children\n // Use removeChild to make sure it handles SVG or any non-html\n // also it performs better - http://jsperf.com/innerhtml-vs-removechild/15\n if (this.element){\n while (this.element.firstChild) {\n this.element.removeChild(this.element.firstChild);\n }\n }\n\n this.container.onsubmit = null;\n this.clearControls();\n\n // destroy the mouse trackers\n if (this.innerTracker){\n this.innerTracker.destroy();\n }\n if (this.outerTracker){\n this.outerTracker.destroy();\n }\n\n THIS[ this.hash ] = null;\n delete THIS[ this.hash ];\n\n // clear all our references to dom objects\n this.canvas = null;\n this.container = null;\n\n // Unregister the viewer\n $._viewers.delete(this.element);\n\n // clear our reference to the main element - they will need to pass it in again, creating a new viewer\n this.element = null;\n },\n\n /**\n * @function\n * @return {Boolean}\n */\n isMouseNavEnabled: function () {\n return this.innerTracker.isTracking();\n },\n\n /**\n * @function\n * @param {Boolean} enabled - true to enable, false to disable\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:mouse-enabled\n */\n setMouseNavEnabled: function( enabled ){\n this.innerTracker.setTracking( enabled );\n this.outerTracker.setTracking( enabled );\n /**\n * Raised when mouse/touch navigation is enabled or disabled (see {@link OpenSeadragon.Viewer#setMouseNavEnabled}).\n *\n * @event mouse-enabled\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} enabled\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'mouse-enabled', { enabled: enabled } );\n return this;\n },\n\n\n /**\n * @function\n * @return {Boolean}\n */\n areControlsEnabled: function () {\n var enabled = this.controls.length,\n i;\n for( i = 0; i < this.controls.length; i++ ){\n enabled = enabled && this.controls[ i ].isVisible();\n }\n return enabled;\n },\n\n\n /**\n * Shows or hides the controls (e.g. the default navigation buttons).\n *\n * @function\n * @param {Boolean} true to show, false to hide.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:controls-enabled\n */\n setControlsEnabled: function( enabled ) {\n if( enabled ){\n abortControlsAutoHide( this );\n } else {\n beginControlsAutoHide( this );\n }\n /**\n * Raised when the navigation controls are shown or hidden (see {@link OpenSeadragon.Viewer#setControlsEnabled}).\n *\n * @event controls-enabled\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} enabled\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'controls-enabled', { enabled: enabled } );\n return this;\n },\n\n /**\n * Turns debugging mode on or off for this viewer.\n *\n * @function\n * @param {Boolean} true to turn debug on, false to turn debug off.\n */\n setDebugMode: function(debugMode){\n\n for (var i = 0; i < this.world.getItemCount(); i++) {\n this.world.getItemAt(i).debugMode = debugMode;\n }\n\n this.debugMode = debugMode;\n this.forceRedraw();\n },\n\n /**\n * @function\n * @return {Boolean}\n */\n isFullPage: function () {\n return THIS[ this.hash ].fullPage;\n },\n\n\n /**\n * Toggle full page mode.\n * @function\n * @param {Boolean} fullPage\n * If true, enter full page mode. If false, exit full page mode.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:pre-full-page\n * @fires OpenSeadragon.Viewer.event:full-page\n */\n setFullPage: function( fullPage ) {\n\n var body = document.body,\n bodyStyle = body.style,\n docStyle = document.documentElement.style,\n _this = this,\n nodes,\n i;\n\n //don't bother modifying the DOM if we are already in full page mode.\n if ( fullPage === this.isFullPage() ) {\n return this;\n }\n\n var fullPageEventArgs = {\n fullPage: fullPage,\n preventDefaultAction: false\n };\n /**\n * Raised when the viewer is about to change to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}).\n *\n * @event pre-full-page\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullPage - True if entering full-page mode, false if exiting full-page mode.\n * @property {Boolean} preventDefaultAction - Set to true to prevent full-page mode change. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'pre-full-page', fullPageEventArgs );\n if ( fullPageEventArgs.preventDefaultAction ) {\n return this;\n }\n\n if ( fullPage ) {\n\n this.elementSize = $.getElementSize( this.element );\n this.pageScroll = $.getPageScroll();\n\n this.elementMargin = this.element.style.margin;\n this.element.style.margin = \"0\";\n this.elementPadding = this.element.style.padding;\n this.element.style.padding = \"0\";\n\n this.bodyMargin = bodyStyle.margin;\n this.docMargin = docStyle.margin;\n bodyStyle.margin = \"0\";\n docStyle.margin = \"0\";\n\n this.bodyPadding = bodyStyle.padding;\n this.docPadding = docStyle.padding;\n bodyStyle.padding = \"0\";\n docStyle.padding = \"0\";\n\n this.bodyWidth = bodyStyle.width;\n this.docWidth = docStyle.width;\n bodyStyle.width = \"100%\";\n docStyle.width = \"100%\";\n\n this.bodyHeight = bodyStyle.height;\n this.docHeight = docStyle.height;\n bodyStyle.height = \"100%\";\n docStyle.height = \"100%\";\n\n this.bodyDisplay = bodyStyle.display;\n bodyStyle.display = \"block\";\n\n //when entering full screen on the ipad it wasn't sufficient to leave\n //the body intact as only only the top half of the screen would\n //respond to touch events on the canvas, while the bottom half treated\n //them as touch events on the document body. Thus we remove and store\n //the bodies elements and replace them when we leave full screen.\n this.previousBody = [];\n THIS[ this.hash ].prevElementParent = this.element.parentNode;\n THIS[ this.hash ].prevNextSibling = this.element.nextSibling;\n THIS[ this.hash ].prevElementWidth = this.element.style.width;\n THIS[ this.hash ].prevElementHeight = this.element.style.height;\n nodes = body.childNodes.length;\n for ( i = 0; i < nodes; i++ ) {\n this.previousBody.push( body.childNodes[ 0 ] );\n body.removeChild( body.childNodes[ 0 ] );\n }\n\n //If we've got a toolbar, we need to enable the user to use css to\n //preserve it in fullpage mode\n if ( this.toolbar && this.toolbar.element ) {\n //save a reference to the parent so we can put it back\n //in the long run we need a better strategy\n this.toolbar.parentNode = this.toolbar.element.parentNode;\n this.toolbar.nextSibling = this.toolbar.element.nextSibling;\n body.appendChild( this.toolbar.element );\n\n //Make sure the user has some ability to style the toolbar based\n //on the mode\n $.addClass( this.toolbar.element, 'fullpage' );\n }\n\n $.addClass( this.element, 'fullpage' );\n body.appendChild( this.element );\n\n this.element.style.height = $.getWindowSize().y + 'px';\n this.element.style.width = $.getWindowSize().x + 'px';\n\n if ( this.toolbar && this.toolbar.element ) {\n this.element.style.height = (\n $.getElementSize( this.element ).y - $.getElementSize( this.toolbar.element ).y\n ) + 'px';\n }\n\n THIS[ this.hash ].fullPage = true;\n\n // mouse will be inside container now\n $.delegate( this, onContainerEnter )( {} );\n\n } else {\n\n this.element.style.margin = this.elementMargin;\n this.element.style.padding = this.elementPadding;\n\n bodyStyle.margin = this.bodyMargin;\n docStyle.margin = this.docMargin;\n\n bodyStyle.padding = this.bodyPadding;\n docStyle.padding = this.docPadding;\n\n bodyStyle.width = this.bodyWidth;\n docStyle.width = this.docWidth;\n\n bodyStyle.height = this.bodyHeight;\n docStyle.height = this.docHeight;\n\n bodyStyle.display = this.bodyDisplay;\n\n body.removeChild( this.element );\n nodes = this.previousBody.length;\n for ( i = 0; i < nodes; i++ ) {\n body.appendChild( this.previousBody.shift() );\n }\n\n $.removeClass( this.element, 'fullpage' );\n THIS[ this.hash ].prevElementParent.insertBefore(\n this.element,\n THIS[ this.hash ].prevNextSibling\n );\n\n //If we've got a toolbar, we need to enable the user to use css to\n //reset it to its original state\n if ( this.toolbar && this.toolbar.element ) {\n body.removeChild( this.toolbar.element );\n\n //Make sure the user has some ability to style the toolbar based\n //on the mode\n $.removeClass( this.toolbar.element, 'fullpage' );\n\n this.toolbar.parentNode.insertBefore(\n this.toolbar.element,\n this.toolbar.nextSibling\n );\n delete this.toolbar.parentNode;\n delete this.toolbar.nextSibling;\n }\n\n this.element.style.width = THIS[ this.hash ].prevElementWidth;\n this.element.style.height = THIS[ this.hash ].prevElementHeight;\n\n // After exiting fullPage or fullScreen, it can take some time\n // before the browser can actually set the scroll.\n var restoreScrollCounter = 0;\n var restoreScroll = function() {\n $.setPageScroll( _this.pageScroll );\n var pageScroll = $.getPageScroll();\n restoreScrollCounter++;\n if (restoreScrollCounter < 10 &&\n (pageScroll.x !== _this.pageScroll.x ||\n pageScroll.y !== _this.pageScroll.y)) {\n $.requestAnimationFrame( restoreScroll );\n }\n };\n $.requestAnimationFrame( restoreScroll );\n\n THIS[ this.hash ].fullPage = false;\n\n // mouse will likely be outside now\n $.delegate( this, onContainerLeave )( { } );\n\n }\n\n if ( this.navigator && this.viewport ) {\n this.navigator.update( this.viewport );\n }\n\n /**\n * Raised when the viewer has changed to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}).\n *\n * @event full-page\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullPage - True if changed to full-page mode, false if exited full-page mode.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'full-page', { fullPage: fullPage } );\n\n return this;\n },\n\n /**\n * Toggle full screen mode if supported. Toggle full page mode otherwise.\n * @function\n * @param {Boolean} fullScreen\n * If true, enter full screen mode. If false, exit full screen mode.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:pre-full-screen\n * @fires OpenSeadragon.Viewer.event:full-screen\n */\n setFullScreen: function( fullScreen ) {\n var _this = this;\n\n if ( !$.supportsFullScreen ) {\n return this.setFullPage( fullScreen );\n }\n\n if ( $.isFullScreen() === fullScreen ) {\n return this;\n }\n\n var fullScreeEventArgs = {\n fullScreen: fullScreen,\n preventDefaultAction: false\n };\n /**\n * Raised when the viewer is about to change to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).\n * Note: the pre-full-screen event is not raised when the user is exiting\n * full-screen mode by pressing the Esc key. In that case, consider using\n * the full-screen, pre-full-page or full-page events.\n *\n * @event pre-full-screen\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullScreen - True if entering full-screen mode, false if exiting full-screen mode.\n * @property {Boolean} preventDefaultAction - Set to true to prevent full-screen mode change. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'pre-full-screen', fullScreeEventArgs );\n if ( fullScreeEventArgs.preventDefaultAction ) {\n return this;\n }\n\n if ( fullScreen ) {\n\n this.setFullPage( true );\n // If the full page mode is not actually entered, we need to prevent\n // the full screen mode.\n if ( !this.isFullPage() ) {\n return this;\n }\n\n this.fullPageStyleWidth = this.element.style.width;\n this.fullPageStyleHeight = this.element.style.height;\n this.element.style.width = '100%';\n this.element.style.height = '100%';\n\n var onFullScreenChange = function() {\n var isFullScreen = $.isFullScreen();\n if ( !isFullScreen ) {\n $.removeEvent( document, $.fullScreenEventName, onFullScreenChange );\n $.removeEvent( document, $.fullScreenErrorEventName, onFullScreenChange );\n\n _this.setFullPage( false );\n if ( _this.isFullPage() ) {\n _this.element.style.width = _this.fullPageStyleWidth;\n _this.element.style.height = _this.fullPageStyleHeight;\n }\n }\n if ( _this.navigator && _this.viewport ) {\n //09/08/2018 - Fabroh : Fix issue #1504 : Ensure to get the navigator updated on fullscreen out with custom location with a timeout\n setTimeout(function(){\n _this.navigator.update( _this.viewport );\n });\n }\n /**\n * Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).\n *\n * @event full-screen\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullScreen - True if changed to full-screen mode, false if exited full-screen mode.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'full-screen', { fullScreen: isFullScreen } );\n };\n $.addEvent( document, $.fullScreenEventName, onFullScreenChange );\n $.addEvent( document, $.fullScreenErrorEventName, onFullScreenChange );\n\n $.requestFullScreen( document.body );\n\n } else {\n $.exitFullScreen();\n }\n return this;\n },\n\n /**\n * @function\n * @return {Boolean}\n */\n isVisible: function () {\n return this.container.style.visibility !== \"hidden\";\n },\n\n\n /**\n * @function\n * @param {Boolean} visible\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:visible\n */\n setVisible: function( visible ){\n this.container.style.visibility = visible ? \"\" : \"hidden\";\n /**\n * Raised when the viewer is shown or hidden (see {@link OpenSeadragon.Viewer#setVisible}).\n *\n * @event visible\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} visible\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'visible', { visible: visible } );\n return this;\n },\n\n /**\n * Add a tiled image to the viewer.\n * options.tileSource can be anything that {@link OpenSeadragon.Viewer#open}\n * supports except arrays of images.\n * Note that you can specify options.width or options.height, but not both.\n * The other dimension will be calculated according to the item's aspect ratio.\n * If collectionMode is on (see {@link OpenSeadragon.Options}), the new image is\n * automatically arranged with the others.\n * @function\n * @param {Object} options\n * @param {String|Object|Function} options.tileSource - The TileSource specifier.\n * A String implies a url used to determine the tileSource implementation\n * based on the file extension of url. JSONP is implied by *.js,\n * otherwise the url is retrieved as text and the resulting text is\n * introspected to determine if its json, xml, or text and parsed.\n * An Object implies an inline configuration which has a single\n * property sufficient for being able to determine tileSource\n * implementation. If the object has a property which is a function\n * named 'getTileUrl', it is treated as a custom TileSource.\n * @param {Number} [options.index] The index of the item. Added on top of\n * all other items if not specified.\n * @param {Boolean} [options.replace=false] If true, the item at options.index will be\n * removed and the new item is added in its place. options.tileSource will be\n * interpreted and fetched if necessary before the old item is removed to avoid leaving\n * a gap in the world.\n * @param {Number} [options.x=0] The X position for the image in viewport coordinates.\n * @param {Number} [options.y=0] The Y position for the image in viewport coordinates.\n * @param {Number} [options.width=1] The width for the image in viewport coordinates.\n * @param {Number} [options.height] The height for the image in viewport coordinates.\n * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates\n * to fit the image into. If specified, x, y, width and height get ignored.\n * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds if options.fitBounds is set.\n * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @param {Number} [options.opacity=1] Proportional opacity of the tiled images (1=opaque, 0=hidden)\n * @param {Boolean} [options.preload=false] Default switch for loading hidden images (true loads, false blocks)\n * @param {Number} [options.degrees=0] Initial rotation of the tiled image around\n * its top left corner in degrees.\n * @param {Boolean} [options.flipped=false] Whether to horizontally flip the image.\n * @param {String} [options.compositeOperation] How the image is composited onto other images.\n * @param {String} [options.crossOriginPolicy] The crossOriginPolicy for this specific image,\n * overriding viewer.crossOriginPolicy.\n * @param {Boolean} [options.ajaxWithCredentials] Whether to set withCredentials on tile AJAX\n * @param {Boolean} [options.loadTilesWithAjax]\n * Whether to load tile data using AJAX requests.\n * Defaults to the setting in {@link OpenSeadragon.Options}.\n * @param {Object} [options.ajaxHeaders]\n * A set of headers to include when making tile AJAX requests.\n * Note that these headers will be merged over any headers specified in {@link OpenSeadragon.Options}.\n * Specifying a falsy value for a header will clear its existing value set at the Viewer level (if any).\n * requests.\n * @param {Function} [options.success] A function that gets called when the image is\n * successfully added. It's passed the event object which contains a single property:\n * \"item\", which is the resulting instance of TiledImage.\n * @param {Function} [options.error] A function that gets called if the image is\n * unable to be added. It's passed the error event object, which contains \"message\"\n * and \"source\" properties.\n * @param {Boolean} [options.collectionImmediately=false] If collectionMode is on,\n * specifies whether to snap to the new arrangement immediately or to animate to it.\n * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.Viewer.event:add-item-failed\n */\n addTiledImage: function( options ) {\n $.console.assert(options, \"[Viewer.addTiledImage] options is required\");\n $.console.assert(options.tileSource, \"[Viewer.addTiledImage] options.tileSource is required\");\n $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()),\n \"[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world\");\n\n var _this = this;\n\n if (options.replace) {\n options.replaceItem = _this.world.getItemAt(options.index);\n }\n\n this._hideMessage();\n\n if (options.placeholderFillStyle === undefined) {\n options.placeholderFillStyle = this.placeholderFillStyle;\n }\n if (options.opacity === undefined) {\n options.opacity = this.opacity;\n }\n if (options.preload === undefined) {\n options.preload = this.preload;\n }\n if (options.compositeOperation === undefined) {\n options.compositeOperation = this.compositeOperation;\n }\n if (options.crossOriginPolicy === undefined) {\n options.crossOriginPolicy = options.tileSource.crossOriginPolicy !== undefined ? options.tileSource.crossOriginPolicy : this.crossOriginPolicy;\n }\n if (options.ajaxWithCredentials === undefined) {\n options.ajaxWithCredentials = this.ajaxWithCredentials;\n }\n if (options.loadTilesWithAjax === undefined) {\n options.loadTilesWithAjax = this.loadTilesWithAjax;\n }\n if (options.ajaxHeaders === undefined || options.ajaxHeaders === null) {\n options.ajaxHeaders = this.ajaxHeaders;\n } else if ($.isPlainObject(options.ajaxHeaders) && $.isPlainObject(this.ajaxHeaders)) {\n options.ajaxHeaders = $.extend({}, this.ajaxHeaders, options.ajaxHeaders);\n }\n\n var myQueueItem = {\n options: options\n };\n\n function raiseAddItemFailed( event ) {\n for (var i = 0; i < _this._loadQueue.length; i++) {\n if (_this._loadQueue[i] === myQueueItem) {\n _this._loadQueue.splice(i, 1);\n break;\n }\n }\n\n if (_this._loadQueue.length === 0) {\n refreshWorld(myQueueItem);\n }\n\n /**\n * Raised when an error occurs while adding a item.\n * @event add-item-failed\n * @memberOf OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {Object} options The options passed to the addTiledImage method.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'add-item-failed', event );\n\n if (options.error) {\n options.error(event);\n }\n }\n\n function refreshWorld(theItem) {\n if (_this.collectionMode) {\n _this.world.arrange({\n immediately: theItem.options.collectionImmediately,\n rows: _this.collectionRows,\n columns: _this.collectionColumns,\n layout: _this.collectionLayout,\n tileSize: _this.collectionTileSize,\n tileMargin: _this.collectionTileMargin\n });\n _this.world.setAutoRefigureSizes(true);\n }\n }\n\n if ($.isArray(options.tileSource)) {\n setTimeout(function() {\n raiseAddItemFailed({\n message: \"[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.\",\n source: options.tileSource,\n options: options\n });\n });\n return;\n }\n\n this._loadQueue.push(myQueueItem);\n\n function processReadyItems() {\n var queueItem, tiledImage, optionsClone;\n while (_this._loadQueue.length) {\n queueItem = _this._loadQueue[0];\n if (!queueItem.tileSource) {\n break;\n }\n\n _this._loadQueue.splice(0, 1);\n\n if (queueItem.options.replace) {\n var newIndex = _this.world.getIndexOfItem(queueItem.options.replaceItem);\n if (newIndex !== -1) {\n queueItem.options.index = newIndex;\n }\n _this.world.removeItem(queueItem.options.replaceItem);\n }\n\n tiledImage = new $.TiledImage({\n viewer: _this,\n source: queueItem.tileSource,\n viewport: _this.viewport,\n drawer: _this.drawer,\n tileCache: _this.tileCache,\n imageLoader: _this.imageLoader,\n x: queueItem.options.x,\n y: queueItem.options.y,\n width: queueItem.options.width,\n height: queueItem.options.height,\n fitBounds: queueItem.options.fitBounds,\n fitBoundsPlacement: queueItem.options.fitBoundsPlacement,\n clip: queueItem.options.clip,\n placeholderFillStyle: queueItem.options.placeholderFillStyle,\n opacity: queueItem.options.opacity,\n preload: queueItem.options.preload,\n degrees: queueItem.options.degrees,\n flipped: queueItem.options.flipped,\n compositeOperation: queueItem.options.compositeOperation,\n springStiffness: _this.springStiffness,\n animationTime: _this.animationTime,\n minZoomImageRatio: _this.minZoomImageRatio,\n wrapHorizontal: _this.wrapHorizontal,\n wrapVertical: _this.wrapVertical,\n immediateRender: _this.immediateRender,\n blendTime: _this.blendTime,\n alwaysBlend: _this.alwaysBlend,\n minPixelRatio: _this.minPixelRatio,\n smoothTileEdgesMinZoom: _this.smoothTileEdgesMinZoom,\n iOSDevice: _this.iOSDevice,\n crossOriginPolicy: queueItem.options.crossOriginPolicy,\n ajaxWithCredentials: queueItem.options.ajaxWithCredentials,\n loadTilesWithAjax: queueItem.options.loadTilesWithAjax,\n ajaxHeaders: queueItem.options.ajaxHeaders,\n debugMode: _this.debugMode\n });\n\n if (_this.collectionMode) {\n _this.world.setAutoRefigureSizes(false);\n }\n\n if (_this.navigator) {\n optionsClone = $.extend({}, queueItem.options, {\n replace: false, // navigator already removed the layer, nothing to replace\n originalTiledImage: tiledImage,\n tileSource: queueItem.tileSource\n });\n\n _this.navigator.addTiledImage(optionsClone);\n }\n\n _this.world.addItem( tiledImage, {\n index: queueItem.options.index\n });\n\n if (_this._loadQueue.length === 0) {\n //this restores the autoRefigureSizes flag to true.\n refreshWorld(queueItem);\n }\n\n if (_this.world.getItemCount() === 1 && !_this.preserveViewport) {\n _this.viewport.goHome(true);\n }\n\n if (queueItem.options.success) {\n queueItem.options.success({\n item: tiledImage\n });\n }\n }\n }\n\n getTileSourceImplementation( this, options.tileSource, options, function( tileSource ) {\n\n myQueueItem.tileSource = tileSource;\n\n // add everybody at the front of the queue that's ready to go\n processReadyItems();\n }, function( event ) {\n event.options = options;\n raiseAddItemFailed(event);\n\n // add everybody at the front of the queue that's ready to go\n processReadyItems();\n } );\n },\n\n /**\n * Add a simple image to the viewer.\n * The options are the same as the ones in {@link OpenSeadragon.Viewer#addTiledImage}\n * except for options.tileSource which is replaced by options.url.\n * @function\n * @param {Object} options - See {@link OpenSeadragon.Viewer#addTiledImage}\n * for all the options\n * @param {String} options.url - The URL of the image to add.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.Viewer.event:add-item-failed\n */\n addSimpleImage: function(options) {\n $.console.assert(options, \"[Viewer.addSimpleImage] options is required\");\n $.console.assert(options.url, \"[Viewer.addSimpleImage] options.url is required\");\n\n var opts = $.extend({}, options, {\n tileSource: {\n type: 'image',\n url: options.url\n }\n });\n delete opts.url;\n this.addTiledImage(opts);\n },\n\n // deprecated\n addLayer: function( options ) {\n var _this = this;\n\n $.console.error( \"[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead.\" );\n\n var optionsClone = $.extend({}, options, {\n success: function(event) {\n _this.raiseEvent(\"add-layer\", {\n options: options,\n drawer: event.item\n });\n },\n error: function(event) {\n _this.raiseEvent(\"add-layer-failed\", event);\n }\n });\n\n this.addTiledImage(optionsClone);\n return this;\n },\n\n // deprecated\n getLayerAtLevel: function( level ) {\n $.console.error( \"[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead.\" );\n return this.world.getItemAt(level);\n },\n\n // deprecated\n getLevelOfLayer: function( drawer ) {\n $.console.error( \"[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead.\" );\n return this.world.getIndexOfItem(drawer);\n },\n\n // deprecated\n getLayersCount: function() {\n $.console.error( \"[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead.\" );\n return this.world.getItemCount();\n },\n\n // deprecated\n setLayerLevel: function( drawer, level ) {\n $.console.error( \"[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead.\" );\n return this.world.setItemIndex(drawer, level);\n },\n\n // deprecated\n removeLayer: function( drawer ) {\n $.console.error( \"[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead.\" );\n return this.world.removeItem(drawer);\n },\n\n /**\n * Force the viewer to redraw its contents.\n * @returns {OpenSeadragon.Viewer} Chainable.\n */\n forceRedraw: function() {\n THIS[ this.hash ].forceRedraw = true;\n return this;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.Viewer} Chainable.\n */\n bindSequenceControls: function(){\n\n //////////////////////////////////////////////////////////////////////////\n // Image Sequence Controls\n //////////////////////////////////////////////////////////////////////////\n var onFocusHandler = $.delegate( this, onFocus ),\n onBlurHandler = $.delegate( this, onBlur ),\n onNextHandler = $.delegate( this, this.goToNextPage ),\n onPreviousHandler = $.delegate( this, this.goToPreviousPage ),\n navImages = this.navImages,\n useGroup = true;\n\n if( this.showSequenceControl ){\n\n if( this.previousButton || this.nextButton ){\n //if we are binding to custom buttons then layout and\n //grouping is the responsibility of the page author\n useGroup = false;\n }\n\n this.previousButton = new $.Button({\n element: this.previousButton ? $.getElement( this.previousButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.PreviousPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.previous.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.previous.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.previous.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.previous.DOWN ),\n onRelease: onPreviousHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n });\n\n this.nextButton = new $.Button({\n element: this.nextButton ? $.getElement( this.nextButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.NextPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.next.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.next.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.next.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.next.DOWN ),\n onRelease: onNextHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n });\n\n if( !this.navPrevNextWrap ){\n this.previousButton.disable();\n }\n\n if (!this.tileSources || !this.tileSources.length) {\n this.nextButton.disable();\n }\n\n if( useGroup ){\n this.paging = new $.ButtonGroup({\n buttons: [\n this.previousButton,\n this.nextButton\n ],\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold\n });\n\n this.pagingControl = this.paging.element;\n\n if( this.toolbar ){\n this.toolbar.addControl(\n this.pagingControl,\n {anchor: $.ControlAnchor.BOTTOM_RIGHT}\n );\n }else{\n this.addControl(\n this.pagingControl,\n {anchor: this.sequenceControlAnchor || $.ControlAnchor.TOP_LEFT}\n );\n }\n }\n }\n return this;\n },\n\n\n /**\n * @function\n * @return {OpenSeadragon.Viewer} Chainable.\n */\n bindStandardControls: function(){\n //////////////////////////////////////////////////////////////////////////\n // Navigation Controls\n //////////////////////////////////////////////////////////////////////////\n var beginZoomingInHandler = $.delegate( this, beginZoomingIn ),\n endZoomingHandler = $.delegate( this, endZooming ),\n doSingleZoomInHandler = $.delegate( this, doSingleZoomIn ),\n beginZoomingOutHandler = $.delegate( this, beginZoomingOut ),\n doSingleZoomOutHandler = $.delegate( this, doSingleZoomOut ),\n onHomeHandler = $.delegate( this, onHome ),\n onFullScreenHandler = $.delegate( this, onFullScreen ),\n onRotateLeftHandler = $.delegate( this, onRotateLeft ),\n onRotateRightHandler = $.delegate( this, onRotateRight ),\n onFlipHandler = $.delegate( this, onFlip),\n onFocusHandler = $.delegate( this, onFocus ),\n onBlurHandler = $.delegate( this, onBlur ),\n navImages = this.navImages,\n buttons = [],\n useGroup = true;\n\n\n if ( this.showNavigationControl ) {\n\n if( this.zoomInButton || this.zoomOutButton ||\n this.homeButton || this.fullPageButton ||\n this.rotateLeftButton || this.rotateRightButton ||\n this.flipButton ) {\n //if we are binding to custom buttons then layout and\n //grouping is the responsibility of the page author\n useGroup = false;\n }\n\n if ( this.showZoomControl ) {\n buttons.push( this.zoomInButton = new $.Button({\n element: this.zoomInButton ? $.getElement( this.zoomInButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.ZoomIn\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.zoomIn.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.zoomIn.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.zoomIn.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.zoomIn.DOWN ),\n onPress: beginZoomingInHandler,\n onRelease: endZoomingHandler,\n onClick: doSingleZoomInHandler,\n onEnter: beginZoomingInHandler,\n onExit: endZoomingHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n\n buttons.push( this.zoomOutButton = new $.Button({\n element: this.zoomOutButton ? $.getElement( this.zoomOutButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.ZoomOut\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.zoomOut.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.zoomOut.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.zoomOut.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.zoomOut.DOWN ),\n onPress: beginZoomingOutHandler,\n onRelease: endZoomingHandler,\n onClick: doSingleZoomOutHandler,\n onEnter: beginZoomingOutHandler,\n onExit: endZoomingHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showHomeControl ) {\n buttons.push( this.homeButton = new $.Button({\n element: this.homeButton ? $.getElement( this.homeButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.Home\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.home.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.home.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.home.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.home.DOWN ),\n onRelease: onHomeHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showFullPageControl ) {\n buttons.push( this.fullPageButton = new $.Button({\n element: this.fullPageButton ? $.getElement( this.fullPageButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.FullPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.fullpage.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.fullpage.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.fullpage.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.fullpage.DOWN ),\n onRelease: onFullScreenHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showRotationControl ) {\n buttons.push( this.rotateLeftButton = new $.Button({\n element: this.rotateLeftButton ? $.getElement( this.rotateLeftButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.RotateLeft\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.rotateleft.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.rotateleft.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.rotateleft.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.rotateleft.DOWN ),\n onRelease: onRotateLeftHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n\n buttons.push( this.rotateRightButton = new $.Button({\n element: this.rotateRightButton ? $.getElement( this.rotateRightButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.RotateRight\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.rotateright.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.rotateright.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.rotateright.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.rotateright.DOWN ),\n onRelease: onRotateRightHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showFlipControl ) {\n buttons.push( this.flipButton = new $.Button({\n element: this.flipButton ? $.getElement( this.flipButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.Flip\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.flip.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.flip.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.flip.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.flip.DOWN ),\n onRelease: onFlipHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( useGroup ) {\n this.buttonGroup = new $.ButtonGroup({\n buttons: buttons,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold\n });\n\n this.navControl = this.buttonGroup.element;\n this.addHandler( 'open', $.delegate( this, lightUp ) );\n\n if( this.toolbar ){\n this.toolbar.addControl(\n this.navControl,\n {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT}\n );\n } else {\n this.addControl(\n this.navControl,\n {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT}\n );\n }\n } else {\n this.customButtons = buttons;\n }\n\n }\n return this;\n },\n\n /**\n * Gets the active page of a sequence\n * @function\n * @return {Number}\n */\n currentPage: function() {\n return this._sequenceIndex;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:page\n */\n goToPage: function( page ){\n if( this.tileSources && page >= 0 && page < this.tileSources.length ){\n this._sequenceIndex = page;\n\n this._updateSequenceButtons( page );\n\n this.open( this.tileSources[ page ] );\n\n if( this.referenceStrip ){\n this.referenceStrip.setFocus( page );\n }\n\n /**\n * Raised when the page is changed on a viewer configured with multiple image sources (see {@link OpenSeadragon.Viewer#goToPage}).\n *\n * @event page\n * @memberof OpenSeadragon.Viewer\n * @type {Object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Number} page - The page index.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'page', { page: page } );\n }\n\n return this;\n },\n\n /**\n * Adds an html element as an overlay to the current viewport. Useful for\n * highlighting words or areas of interest on an image or other zoomable\n * interface. The overlays added via this method are removed when the viewport\n * is closed which include when changing page.\n * @method\n * @param {Element|String|Object} element - A reference to an element or an id for\n * the element which will be overlaid. Or an Object specifying the configuration for the overlay.\n * If using an object, see {@link OpenSeadragon.Overlay} for a list of\n * all available options.\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or\n * rectangle which will be overlaid. This is a viewport relative location.\n * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the\n * viewport which the location coordinates will be treated as relative\n * to.\n * @param {function} [onDraw] - If supplied the callback is called when the overlay\n * needs to be drawn. It it the responsibility of the callback to do any drawing/positioning.\n * It is passed position, size and element.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:add-overlay\n */\n addOverlay: function( element, location, placement, onDraw ) {\n var options;\n if( $.isPlainObject( element ) ){\n options = element;\n } else {\n options = {\n element: element,\n location: location,\n placement: placement,\n onDraw: onDraw\n };\n }\n\n element = $.getElement( options.element );\n\n if ( getOverlayIndex( this.currentOverlays, element ) >= 0 ) {\n // they're trying to add a duplicate overlay\n return this;\n }\n\n var overlay = getOverlayObject( this, options);\n this.currentOverlays.push(overlay);\n overlay.drawHTML( this.overlaysContainer, this.viewport );\n\n /**\n * Raised when an overlay is added to the viewer (see {@link OpenSeadragon.Viewer#addOverlay}).\n *\n * @event add-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Element} element - The overlay element.\n * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location\n * @property {OpenSeadragon.Placement} placement\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'add-overlay', {\n element: element,\n location: options.location,\n placement: options.placement\n });\n return this;\n },\n\n /**\n * Updates the overlay represented by the reference to the element or\n * element id moving it to the new location, relative to the new placement.\n * @method\n * @param {Element|String} element - A reference to an element or an id for\n * the element which is overlaid.\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or\n * rectangle which will be overlaid. This is a viewport relative location.\n * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the\n * viewport which the location coordinates will be treated as relative\n * to.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:update-overlay\n */\n updateOverlay: function( element, location, placement ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if ( i >= 0 ) {\n this.currentOverlays[ i ].update( location, placement );\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when an overlay's location or placement changes\n * (see {@link OpenSeadragon.Viewer#updateOverlay}).\n *\n * @event update-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the\n * Viewer which raised the event.\n * @property {Element} element\n * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location\n * @property {OpenSeadragon.Placement} placement\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'update-overlay', {\n element: element,\n location: location,\n placement: placement\n });\n }\n return this;\n },\n\n /**\n * Removes an overlay identified by the reference element or element id\n * and schedules an update.\n * @method\n * @param {Element|String} element - A reference to the element or an\n * element id which represent the ovelay content to be removed.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:remove-overlay\n */\n removeOverlay: function( element ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if ( i >= 0 ) {\n this.currentOverlays[ i ].destroy();\n this.currentOverlays.splice( i, 1 );\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when an overlay is removed from the viewer\n * (see {@link OpenSeadragon.Viewer#removeOverlay}).\n *\n * @event remove-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the\n * Viewer which raised the event.\n * @property {Element} element - The overlay element.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'remove-overlay', {\n element: element\n });\n }\n return this;\n },\n\n /**\n * Removes all currently configured Overlays from this Viewer and schedules\n * an update.\n * @method\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:clear-overlay\n */\n clearOverlays: function() {\n while ( this.currentOverlays.length > 0 ) {\n this.currentOverlays.pop().destroy();\n }\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when all overlays are removed from the viewer (see {@link OpenSeadragon.Drawer#clearOverlays}).\n *\n * @event clear-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'clear-overlay', {} );\n return this;\n },\n\n /**\n * Finds an overlay identified by the reference element or element id\n * and returns it as an object, return null if not found.\n * @method\n * @param {Element|String} element - A reference to the element or an\n * element id which represents the overlay content.\n * @return {OpenSeadragon.Overlay} the matching overlay or null if none found.\n */\n getOverlayById: function( element ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if (i >= 0) {\n return this.currentOverlays[i];\n } else {\n return null;\n }\n },\n\n /**\n * Updates the sequence buttons.\n * @function OpenSeadragon.Viewer.prototype._updateSequenceButtons\n * @private\n * @param {Number} Sequence Value\n */\n _updateSequenceButtons: function( page ) {\n\n if ( this.nextButton ) {\n if(!this.tileSources || this.tileSources.length - 1 === page) {\n //Disable next button\n if ( !this.navPrevNextWrap ) {\n this.nextButton.disable();\n }\n } else {\n this.nextButton.enable();\n }\n }\n if ( this.previousButton ) {\n if ( page > 0 ) {\n //Enable previous button\n this.previousButton.enable();\n } else {\n if ( !this.navPrevNextWrap ) {\n this.previousButton.disable();\n }\n }\n }\n },\n\n /**\n * Display a message in the viewport\n * @function OpenSeadragon.Viewer.prototype._showMessage\n * @private\n * @param {String} text message\n */\n _showMessage: function ( message ) {\n this._hideMessage();\n\n var div = $.makeNeutralElement( \"div\" );\n div.appendChild( document.createTextNode( message ) );\n\n this.messageDiv = $.makeCenteredNode( div );\n\n $.addClass(this.messageDiv, \"openseadragon-message\");\n\n this.container.appendChild( this.messageDiv );\n },\n\n /**\n * Hide any currently displayed viewport message\n * @function OpenSeadragon.Viewer.prototype._hideMessage\n * @private\n */\n _hideMessage: function () {\n var div = this.messageDiv;\n if (div) {\n div.parentNode.removeChild(div);\n delete this.messageDiv;\n }\n },\n\n /**\n * Gets this viewer's gesture settings for the given pointer device type.\n * @method\n * @param {String} type - The pointer device type to get the gesture settings for (\"mouse\", \"touch\", \"pen\", etc.).\n * @return {OpenSeadragon.GestureSettings}\n */\n gestureSettingsByDeviceType: function ( type ) {\n switch ( type ) {\n case 'mouse':\n return this.gestureSettingsMouse;\n case 'touch':\n return this.gestureSettingsTouch;\n case 'pen':\n return this.gestureSettingsPen;\n default:\n return this.gestureSettingsUnknown;\n }\n },\n\n // private\n _drawOverlays: function() {\n var i,\n length = this.currentOverlays.length;\n for ( i = 0; i < length; i++ ) {\n this.currentOverlays[ i ].drawHTML( this.overlaysContainer, this.viewport );\n }\n },\n\n /**\n * Cancel the \"in flight\" images.\n */\n _cancelPendingImages: function() {\n this._loadQueue = [];\n },\n\n /**\n * Removes the reference strip and disables displaying it.\n * @function\n */\n removeReferenceStrip: function() {\n this.showReferenceStrip = false;\n\n if (this.referenceStrip) {\n this.referenceStrip.destroy();\n this.referenceStrip = null;\n }\n },\n\n /**\n * Enables and displays the reference strip based on the currently set tileSources.\n * Works only when the Viewer has sequenceMode set to true.\n * @function\n */\n addReferenceStrip: function() {\n this.showReferenceStrip = true;\n\n if (this.sequenceMode) {\n if (this.referenceStrip) {\n return;\n }\n\n if (this.tileSources.length && this.tileSources.length > 1) {\n this.referenceStrip = new $.ReferenceStrip({\n id: this.referenceStripElement,\n position: this.referenceStripPosition,\n sizeRatio: this.referenceStripSizeRatio,\n scroll: this.referenceStripScroll,\n height: this.referenceStripHeight,\n width: this.referenceStripWidth,\n tileSources: this.tileSources,\n prefixUrl: this.prefixUrl,\n useCanvas: this.useCanvas,\n viewer: this\n });\n\n this.referenceStrip.setFocus( this._sequenceIndex );\n }\n } else {\n $.console.warn('Attempting to display a reference strip while \"sequenceMode\" is off.');\n }\n },\n\n /**\n * Adds _updatePixelDensityRatio to the window resize event.\n * @private\n */\n _addUpdatePixelDensityRatioEvent: function() {\n this._updatePixelDensityRatioBind = this._updatePixelDensityRatio.bind(this);\n $.addEvent( window, 'resize', this._updatePixelDensityRatioBind );\n },\n\n /**\n * Removes _updatePixelDensityRatio from the window resize event.\n * @private\n */\n _removeUpdatePixelDensityRatioEvent: function() {\n $.removeEvent( window, 'resize', this._updatePixelDensityRatioBind );\n },\n\n /**\n * Update pixel density ratio, clears all tiles and triggers updates for\n * all items if the ratio has changed.\n * @private\n */\n _updatePixelDensityRatio: function() {\n var previusPixelDensityRatio = $.pixelDensityRatio;\n var currentPixelDensityRatio = $.getCurrentPixelDensityRatio();\n if (previusPixelDensityRatio !== currentPixelDensityRatio) {\n $.pixelDensityRatio = currentPixelDensityRatio;\n this.world.resetItems();\n this.forceRedraw();\n }\n },\n\n /**\n * Sets the image source to the source with index equal to\n * currentIndex - 1. Changes current image in sequence mode.\n * If specified, wraps around (see navPrevNextWrap in\n * {@link OpenSeadragon.Options})\n *\n * @method\n */\n\n goToPreviousPage: function () {\n var previous = this._sequenceIndex - 1;\n if(this.navPrevNextWrap && previous < 0){\n previous += this.tileSources.length;\n }\n this.goToPage( previous );\n },\n\n /**\n * Sets the image source to the source with index equal to\n * currentIndex + 1. Changes current image in sequence mode.\n * If specified, wraps around (see navPrevNextWrap in\n * {@link OpenSeadragon.Options})\n *\n * @method\n */\n goToNextPage: function () {\n var next = this._sequenceIndex + 1;\n if(this.navPrevNextWrap && next >= this.tileSources.length){\n next = 0;\n }\n this.goToPage( next );\n },\n});\n\n\n/**\n * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y,\n * which was causing some calling operations to return NaN.\n * @returns {Point}\n * @private\n */\nfunction _getSafeElemSize (oElement) {\n oElement = $.getElement( oElement );\n\n return new $.Point(\n (oElement.clientWidth === 0 ? 1 : oElement.clientWidth),\n (oElement.clientHeight === 0 ? 1 : oElement.clientHeight)\n );\n}\n\n\n/**\n * @function\n * @private\n */\nfunction getTileSourceImplementation( viewer, tileSource, imgOptions, successCallback,\n failCallback ) {\n var _this = viewer;\n\n //allow plain xml strings or json strings to be parsed here\n if ( $.type( tileSource ) === 'string' ) {\n //xml should start with \"<\" and end with \">\"\n if ( tileSource.match( /^\\s*<.*>\\s*$/ ) ) {\n tileSource = $.parseXml( tileSource );\n //json should start with \"{\" or \"[\" and end with \"}\" or \"]\"\n } else if ( tileSource.match(/^\\s*[{[].*[}\\]]\\s*$/ ) ) {\n try {\n var tileSourceJ = $.parseJSON(tileSource);\n tileSource = tileSourceJ;\n } catch (e) {\n //tileSource = tileSource;\n }\n }\n }\n\n function waitUntilReady(tileSource, originalTileSource) {\n if (tileSource.ready) {\n successCallback(tileSource);\n } else {\n tileSource.addHandler('ready', function () {\n successCallback(tileSource);\n });\n tileSource.addHandler('open-failed', function (event) {\n failCallback({\n message: event.message,\n source: originalTileSource\n });\n });\n }\n }\n\n setTimeout( function() {\n if ( $.type( tileSource ) === 'string' ) {\n //If its still a string it means it must be a url at this point\n tileSource = new $.TileSource({\n url: tileSource,\n crossOriginPolicy: imgOptions.crossOriginPolicy !== undefined ?\n imgOptions.crossOriginPolicy : viewer.crossOriginPolicy,\n ajaxWithCredentials: viewer.ajaxWithCredentials,\n ajaxHeaders: imgOptions.ajaxHeaders ?\n imgOptions.ajaxHeaders : viewer.ajaxHeaders,\n useCanvas: viewer.useCanvas,\n success: function( event ) {\n successCallback( event.tileSource );\n }\n });\n tileSource.addHandler( 'open-failed', function( event ) {\n failCallback( event );\n } );\n\n } else if ($.isPlainObject(tileSource) || tileSource.nodeType) {\n if (tileSource.crossOriginPolicy === undefined &&\n (imgOptions.crossOriginPolicy !== undefined || viewer.crossOriginPolicy !== undefined)) {\n tileSource.crossOriginPolicy = imgOptions.crossOriginPolicy !== undefined ?\n imgOptions.crossOriginPolicy : viewer.crossOriginPolicy;\n }\n if (tileSource.ajaxWithCredentials === undefined) {\n tileSource.ajaxWithCredentials = viewer.ajaxWithCredentials;\n }\n if (tileSource.useCanvas === undefined) {\n tileSource.useCanvas = viewer.useCanvas;\n }\n\n if ( $.isFunction( tileSource.getTileUrl ) ) {\n //Custom tile source\n var customTileSource = new $.TileSource( tileSource );\n customTileSource.getTileUrl = tileSource.getTileUrl;\n successCallback( customTileSource );\n } else {\n //inline configuration\n var $TileSource = $.TileSource.determineType( _this, tileSource );\n if ( !$TileSource ) {\n failCallback( {\n message: \"Unable to load TileSource\",\n source: tileSource\n });\n return;\n }\n var options = $TileSource.prototype.configure.apply( _this, [ tileSource ] );\n waitUntilReady(new $TileSource(options), tileSource);\n }\n } else {\n //can assume it's already a tile source implementation\n waitUntilReady(tileSource, tileSource);\n }\n });\n}\n\nfunction getOverlayObject( viewer, overlay ) {\n if ( overlay instanceof $.Overlay ) {\n return overlay;\n }\n\n var element = null;\n if ( overlay.element ) {\n element = $.getElement( overlay.element );\n } else {\n var id = overlay.id ?\n overlay.id :\n \"openseadragon-overlay-\" + Math.floor( Math.random() * 10000000 );\n\n element = $.getElement( overlay.id );\n if ( !element ) {\n element = document.createElement( \"a\" );\n element.href = \"#/overlay/\" + id;\n }\n element.id = id;\n $.addClass( element, overlay.className ?\n overlay.className :\n \"openseadragon-overlay\"\n );\n }\n\n var location = overlay.location;\n var width = overlay.width;\n var height = overlay.height;\n if (!location) {\n var x = overlay.x;\n var y = overlay.y;\n if (overlay.px !== undefined) {\n var rect = viewer.viewport.imageToViewportRectangle(new $.Rect(\n overlay.px,\n overlay.py,\n width || 0,\n height || 0));\n x = rect.x;\n y = rect.y;\n width = width !== undefined ? rect.width : undefined;\n height = height !== undefined ? rect.height : undefined;\n }\n location = new $.Point(x, y);\n }\n\n var placement = overlay.placement;\n if (placement && $.type(placement) === \"string\") {\n placement = $.Placement[overlay.placement.toUpperCase()];\n }\n\n return new $.Overlay({\n element: element,\n location: location,\n placement: placement,\n onDraw: overlay.onDraw,\n checkResize: overlay.checkResize,\n width: width,\n height: height,\n rotationMode: overlay.rotationMode\n });\n}\n\n/**\n * @private\n * @inner\n * Determines the index of the given overlay in the given overlays array.\n */\nfunction getOverlayIndex( overlays, element ) {\n var i;\n for ( i = overlays.length - 1; i >= 0; i-- ) {\n if ( overlays[ i ].element === element ) {\n return i;\n }\n }\n\n return -1;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// Schedulers provide the general engine for animation\n///////////////////////////////////////////////////////////////////////////////\nfunction scheduleUpdate( viewer, updateFunc ){\n return $.requestAnimationFrame( function(){\n updateFunc( viewer );\n } );\n}\n\n\n//provides a sequence in the fade animation\nfunction scheduleControlsFade( viewer ) {\n $.requestAnimationFrame( function(){\n updateControlsFade( viewer );\n });\n}\n\n\n//initiates an animation to hide the controls\nfunction beginControlsAutoHide( viewer ) {\n if ( !viewer.autoHideControls ) {\n return;\n }\n viewer.controlsShouldFade = true;\n viewer.controlsFadeBeginTime =\n $.now() +\n viewer.controlsFadeDelay;\n\n window.setTimeout( function(){\n scheduleControlsFade( viewer );\n }, viewer.controlsFadeDelay );\n}\n\n\n//determines if fade animation is done or continues the animation\nfunction updateControlsFade( viewer ) {\n var currentTime,\n deltaTime,\n opacity,\n i;\n if ( viewer.controlsShouldFade ) {\n currentTime = $.now();\n deltaTime = currentTime - viewer.controlsFadeBeginTime;\n opacity = 1.0 - deltaTime / viewer.controlsFadeLength;\n\n opacity = Math.min( 1.0, opacity );\n opacity = Math.max( 0.0, opacity );\n\n for ( i = viewer.controls.length - 1; i >= 0; i--) {\n if (viewer.controls[ i ].autoFade) {\n viewer.controls[ i ].setOpacity( opacity );\n }\n }\n\n if ( opacity > 0 ) {\n // fade again\n scheduleControlsFade( viewer );\n }\n }\n}\n\n\n//stop the fade animation on the controls and show them\nfunction abortControlsAutoHide( viewer ) {\n var i;\n viewer.controlsShouldFade = false;\n for ( i = viewer.controls.length - 1; i >= 0; i-- ) {\n viewer.controls[ i ].setOpacity( 1.0 );\n }\n}\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Default view event handlers.\n///////////////////////////////////////////////////////////////////////////////\nfunction onFocus(){\n abortControlsAutoHide( this );\n}\n\nfunction onBlur(){\n beginControlsAutoHide( this );\n\n}\n\nfunction onCanvasContextMenu( event ) {\n var eventArgs = {\n tracker: event.eventSource,\n position: event.position,\n originalEvent: event.originalEvent,\n preventDefault: event.preventDefault\n };\n\n /**\n * Raised when a contextmenu event occurs in the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-contextmenu\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the contextmenu event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-contextmenu', eventArgs );\n\n event.preventDefault = eventArgs.preventDefault;\n}\n\nfunction onCanvasKeyDown( event ) {\n var canvasKeyDownEventArgs = {\n originalEvent: event.originalEvent,\n preventDefaultAction: false,\n preventVerticalPan: event.preventVerticalPan,\n preventHorizontalPan: event.preventHorizontalPan\n };\n\n /**\n * Raised when a keyboard key is pressed and the focus is on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-key\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default keyboard behaviour. Default: false.\n * @property {Boolean} preventVerticalPan - Set to true to prevent keyboard vertical panning. Default: false.\n * @property {Boolean} preventHorizontalPan - Set to true to prevent keyboard horizontal panning. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n\n this.raiseEvent('canvas-key', canvasKeyDownEventArgs);\n\n if ( !canvasKeyDownEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n switch( event.keyCode ){\n case 38://up arrow\n if (!canvasKeyDownEventArgs.preventVerticalPan) {\n if ( event.shift ) {\n this.viewport.zoomBy(1.1);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -this.pixelsPerArrowPress)));\n }\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 40://down arrow\n if (!canvasKeyDownEventArgs.preventVerticalPan) {\n if ( event.shift ) {\n this.viewport.zoomBy(0.9);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, this.pixelsPerArrowPress)));\n }\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 37://left arrow\n if (!canvasKeyDownEventArgs.preventHorizontalPan) {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-this.pixelsPerArrowPress, 0)));\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 39://right arrow\n if (!canvasKeyDownEventArgs.preventHorizontalPan) {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(this.pixelsPerArrowPress, 0)));\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n event.preventDefault = false;\n break;\n }\n } else {\n event.preventDefault = false;\n }\n}\nfunction onCanvasKeyPress( event ) {\n var canvasKeyPressEventArgs = {\n originalEvent: event.originalEvent,\n preventDefaultAction: false,\n preventVerticalPan: event.preventVerticalPan,\n preventHorizontalPan: event.preventHorizontalPan\n };\n\n // This event is documented in onCanvasKeyDown\n this.raiseEvent('canvas-key', canvasKeyPressEventArgs);\n\n if ( !canvasKeyPressEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n switch( event.keyCode ){\n case 43://=|+\n case 61://=|+\n this.viewport.zoomBy(1.1);\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 45://-|_\n this.viewport.zoomBy(0.9);\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 48://0|)\n this.viewport.goHome();\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 119://w\n case 87://W\n if (!canvasKeyPressEventArgs.preventVerticalPan) {\n if ( event.shift ) {\n this.viewport.zoomBy(1.1);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40)));\n }\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 115://s\n case 83://S\n if (!canvasKeyPressEventArgs.preventVerticalPan) {\n if ( event.shift ) {\n this.viewport.zoomBy(0.9);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40)));\n }\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 97://a\n if (!canvasKeyPressEventArgs.preventHorizontalPan) {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 100://d\n if (!canvasKeyPressEventArgs.preventHorizontalPan) {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 114: //r - clockwise rotation\n if(this.viewport.flipped){\n this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));\n } else{\n this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));\n }\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 82: //R - counterclockwise rotation\n if(this.viewport.flipped){\n this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));\n } else{\n this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));\n }\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 102: //f\n this.viewport.toggleFlip();\n event.preventDefault = true;\n break;\n case 106: //j - previous image source\n this.goToPreviousPage();\n break;\n case 107: //k - next image source\n this.goToNextPage();\n break;\n default:\n // console.log( 'navigator keycode %s', event.keyCode );\n event.preventDefault = false;\n break;\n }\n } else {\n event.preventDefault = false;\n }\n}\n\nfunction onCanvasClick( event ) {\n var gestureSettings;\n\n var haveKeyboardFocus = document.activeElement === this.canvas;\n\n // If we don't have keyboard focus, request it.\n if ( !haveKeyboardFocus ) {\n this.canvas.focus();\n }\n if(this.viewport.flipped){\n event.position.x = this.viewport.getContainerSize().x - event.position.x;\n }\n\n var canvasClickEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n quick: event.quick,\n shift: event.shift,\n originalEvent: event.originalEvent,\n originalTarget: event.originalTarget,\n preventDefaultAction: false\n };\n\n /**\n * Raised when a mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-click\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Element} originalTarget - The DOM element clicked on.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-click', canvasClickEventArgs);\n\n if ( !canvasClickEventArgs.preventDefaultAction && this.viewport && event.quick ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.clickToZoom ) {\n this.viewport.zoomBy(\n event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,\n gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\n );\n this.viewport.applyConstraints();\n }\n }\n}\n\nfunction onCanvasDblClick( event ) {\n var gestureSettings;\n\n var canvasDblClickEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n\n /**\n * Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-double-click\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default double tap to zoom behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-double-click', canvasDblClickEventArgs);\n\n if ( !canvasDblClickEventArgs.preventDefaultAction && this.viewport ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.dblClickToZoom ) {\n this.viewport.zoomBy(\n event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,\n gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\n );\n this.viewport.applyConstraints();\n }\n }\n}\n\nfunction onCanvasDrag( event ) {\n var gestureSettings;\n\n var canvasDragEventArgs = {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n delta: event.delta,\n speed: event.speed,\n direction: event.direction,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n\n /**\n * Raised when a mouse or touch drag operation occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-drag\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag.\n * @property {Number} speed - Current computed speed, in pixels per second.\n * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default drag to pan behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-drag', canvasDragEventArgs);\n\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n\n if ( gestureSettings.dragToPan && !canvasDragEventArgs.preventDefaultAction && this.viewport ) {\n if( !this.panHorizontal ){\n event.delta.x = 0;\n }\n if( !this.panVertical ){\n event.delta.y = 0;\n }\n if(this.viewport.flipped){\n event.delta.x = -event.delta.x;\n }\n\n if( this.constrainDuringPan ){\n var delta = this.viewport.deltaPointsFromPixels( event.delta.negate() );\n\n this.viewport.centerSpringX.target.value += delta.x;\n this.viewport.centerSpringY.target.value += delta.y;\n\n var bounds = this.viewport.getBounds();\n var constrainedBounds = this.viewport.getConstrainedBounds();\n\n this.viewport.centerSpringX.target.value -= delta.x;\n this.viewport.centerSpringY.target.value -= delta.y;\n\n if (bounds.x !== constrainedBounds.x) {\n event.delta.x = 0;\n }\n\n if (bounds.y !== constrainedBounds.y) {\n event.delta.y = 0;\n }\n }\n\n this.viewport.panBy( this.viewport.deltaPointsFromPixels( event.delta.negate() ), gestureSettings.flickEnabled && !this.constrainDuringPan);\n }\n}\n\nfunction onCanvasDragEnd( event ) {\n var canvasDragEndEventArgs = {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n speed: event.speed,\n direction: event.direction,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n\n /**\n * Raised when a mouse or touch drag operation ends on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-drag-end\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} speed - Speed at the end of a drag gesture, in pixels per second.\n * @property {Number} direction - Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default drag-end flick behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('canvas-drag-end', canvasDragEndEventArgs);\n\n if (!canvasDragEndEventArgs.preventDefaultAction && this.viewport) {\n var gestureSettings = this.gestureSettingsByDeviceType(event.pointerType);\n if (gestureSettings.flickEnabled &&\n event.speed >= gestureSettings.flickMinSpeed) {\n var amplitudeX = 0;\n if (this.panHorizontal) {\n amplitudeX = gestureSettings.flickMomentum * event.speed *\n Math.cos(event.direction);\n }\n var amplitudeY = 0;\n if (this.panVertical) {\n amplitudeY = gestureSettings.flickMomentum * event.speed *\n Math.sin(event.direction);\n }\n var center = this.viewport.pixelFromPoint(\n this.viewport.getCenter(true));\n var target = this.viewport.pointFromPixel(\n new $.Point(center.x - amplitudeX, center.y - amplitudeY));\n this.viewport.panTo(target, false);\n }\n this.viewport.applyConstraints();\n }\n}\n\nfunction onCanvasEnter( event ) {\n /**\n * Raised when a pointer enters the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-enter\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-enter', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasLeave( event ) {\n /**\n * Raised when a pointer leaves the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-exit\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-exit', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasPress( event ) {\n /**\n * Raised when the primary mouse button is pressed or touch starts on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-press\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-press', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n insideElementPressed: event.insideElementPressed,\n insideElementReleased: event.insideElementReleased,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasRelease( event ) {\n /**\n * Raised when the primary mouse button is released or touch ends on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-release\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-release', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n insideElementPressed: event.insideElementPressed,\n insideElementReleased: event.insideElementReleased,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasNonPrimaryPress( event ) {\n /**\n * Raised when any non-primary pointer button is pressed on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-nonprimary-press\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {Number} button - Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @property {Number} buttons - Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-nonprimary-press', {\n tracker: event.eventSource,\n position: event.position,\n pointerType: event.pointerType,\n button: event.button,\n buttons: event.buttons,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasNonPrimaryRelease( event ) {\n /**\n * Raised when any non-primary pointer button is released on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-nonprimary-release\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {Number} button - Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @property {Number} buttons - Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-nonprimary-release', {\n tracker: event.eventSource,\n position: event.position,\n pointerType: event.pointerType,\n button: event.button,\n buttons: event.buttons,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasPinch( event ) {\n var gestureSettings,\n centerPt,\n lastCenterPt,\n panByPt;\n\n var canvasPinchEventArgs = {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n gesturePoints: event.gesturePoints,\n lastCenter: event.lastCenter,\n center: event.center,\n lastDistance: event.lastDistance,\n distance: event.distance,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultPanAction: false,\n preventDefaultZoomAction: false,\n preventDefaultRotateAction: false\n };\n\n /**\n * Raised when a pinch event occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-pinch\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {Array.} gesturePoints - Gesture points associated with the gesture. Velocity data can be found here.\n * @property {OpenSeadragon.Point} lastCenter - The previous center point of the two pinch contact points relative to the tracked element.\n * @property {OpenSeadragon.Point} center - The center point of the two pinch contact points relative to the tracked element.\n * @property {Number} lastDistance - The previous distance between the two pinch contact points in CSS pixels.\n * @property {Number} distance - The distance between the two pinch contact points in CSS pixels.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultPanAction - Set to true to prevent default pinch to pan behaviour. Default: false.\n * @property {Boolean} preventDefaultZoomAction - Set to true to prevent default pinch to zoom behaviour. Default: false.\n * @property {Boolean} preventDefaultRotateAction - Set to true to prevent default pinch to rotate behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('canvas-pinch', canvasPinchEventArgs);\n\n if ( this.viewport ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.pinchToZoom &&\n (!canvasPinchEventArgs.preventDefaultPanAction || !canvasPinchEventArgs.preventDefaultZoomAction) ) {\n centerPt = this.viewport.pointFromPixel( event.center, true );\n if ( !canvasPinchEventArgs.preventDefaultZoomAction ) {\n this.viewport.zoomBy( event.distance / event.lastDistance, centerPt, true );\n }\n if ( gestureSettings.zoomToRefPoint && !canvasPinchEventArgs.preventDefaultPanAction ) {\n lastCenterPt = this.viewport.pointFromPixel( event.lastCenter, true );\n panByPt = lastCenterPt.minus( centerPt );\n if( !this.panHorizontal ) {\n panByPt.x = 0;\n }\n if( !this.panVertical ) {\n panByPt.y = 0;\n }\n this.viewport.panBy(panByPt, true);\n }\n this.viewport.applyConstraints();\n }\n if ( gestureSettings.pinchRotate && !canvasPinchEventArgs.preventDefaultRotateAction ) {\n // Pinch rotate\n var angle1 = Math.atan2(event.gesturePoints[0].currentPos.y - event.gesturePoints[1].currentPos.y,\n event.gesturePoints[0].currentPos.x - event.gesturePoints[1].currentPos.x);\n var angle2 = Math.atan2(event.gesturePoints[0].lastPos.y - event.gesturePoints[1].lastPos.y,\n event.gesturePoints[0].lastPos.x - event.gesturePoints[1].lastPos.x);\n this.viewport.setRotation(this.viewport.getRotation() + ((angle1 - angle2) * (180 / Math.PI)));\n }\n }\n}\n\nfunction onCanvasScroll( event ) {\n var canvasScrollEventArgs,\n gestureSettings,\n factor,\n thisScrollTime,\n deltaScrollTime;\n\n /* Certain scroll devices fire the scroll event way too fast so we are injecting a simple adjustment to keep things\n * partially normalized. If we have already fired an event within the last 'minScrollDelta' milliseconds we skip\n * this one and wait for the next event. */\n thisScrollTime = $.now();\n deltaScrollTime = thisScrollTime - this._lastScrollTime;\n if (deltaScrollTime > this.minScrollDeltaTime) {\n this._lastScrollTime = thisScrollTime;\n\n canvasScrollEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n scroll: event.scroll,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false,\n preventDefault: true\n };\n\n /**\n * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#canvas} element (mouse wheel).\n *\n * @event canvas-scroll\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} scroll - The scroll delta for the event.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default scroll to zoom behaviour. Default: false.\n * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the wheel event. Default: true.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('canvas-scroll', canvasScrollEventArgs );\n\n if ( !canvasScrollEventArgs.preventDefaultAction && this.viewport ) {\n if(this.viewport.flipped){\n event.position.x = this.viewport.getContainerSize().x - event.position.x;\n }\n\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.scrollToZoom ) {\n factor = Math.pow( this.zoomPerScroll, event.scroll );\n this.viewport.zoomBy(\n factor,\n gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\n );\n this.viewport.applyConstraints();\n }\n }\n\n event.preventDefault = canvasScrollEventArgs.preventDefault;\n } else {\n event.preventDefault = true;\n }\n}\n\nfunction onContainerEnter( event ) {\n THIS[ this.hash ].mouseInside = true;\n abortControlsAutoHide( this );\n /**\n * Raised when the cursor enters the {@link OpenSeadragon.Viewer#container} element.\n *\n * @event container-enter\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'container-enter', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onContainerLeave( event ) {\n if ( event.pointers < 1 ) {\n THIS[ this.hash ].mouseInside = false;\n if ( !THIS[ this.hash ].animating ) {\n beginControlsAutoHide( this );\n }\n }\n /**\n * Raised when the cursor leaves the {@link OpenSeadragon.Viewer#container} element.\n *\n * @event container-exit\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'container-exit', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Page update routines ( aka Views - for future reference )\n///////////////////////////////////////////////////////////////////////////////\n\nfunction updateMulti( viewer ) {\n updateOnce( viewer );\n\n // Request the next frame, unless we've been closed\n if ( viewer.isOpen() ) {\n viewer._updateRequestId = scheduleUpdate( viewer, updateMulti );\n } else {\n viewer._updateRequestId = false;\n }\n}\n\nfunction updateOnce( viewer ) {\n\n //viewer.profiler.beginUpdate();\n\n if (viewer._opening || !THIS[viewer.hash]) {\n return;\n }\n\n if (viewer.autoResize) {\n var containerSize = _getSafeElemSize(viewer.container);\n var prevContainerSize = THIS[viewer.hash].prevContainerSize;\n if (!containerSize.equals(prevContainerSize)) {\n var viewport = viewer.viewport;\n if (viewer.preserveImageSizeOnResize) {\n var resizeRatio = prevContainerSize.x / containerSize.x;\n var zoom = viewport.getZoom() * resizeRatio;\n var center = viewport.getCenter();\n viewport.resize(containerSize, false);\n viewport.zoomTo(zoom, null, true);\n viewport.panTo(center, true);\n } else {\n // maintain image position\n var oldBounds = viewport.getBounds();\n viewport.resize(containerSize, true);\n viewport.fitBoundsWithConstraints(oldBounds, true);\n }\n THIS[viewer.hash].prevContainerSize = containerSize;\n THIS[viewer.hash].forceRedraw = true;\n }\n }\n\n var viewportChange = viewer.viewport.update();\n var animated = viewer.world.update() || viewportChange;\n\n if (viewportChange) {\n /**\n * Raised when any spring animation update occurs (zoom, pan, etc.),\n * before the viewer has drawn the new location.\n *\n * @event viewport-change\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent('viewport-change');\n }\n\n if( viewer.referenceStrip ){\n animated = viewer.referenceStrip.update( viewer.viewport ) || animated;\n }\n\n if ( !THIS[ viewer.hash ].animating && animated ) {\n /**\n * Raised when any spring animation starts (zoom, pan, etc.).\n *\n * @event animation-start\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation-start\" );\n abortControlsAutoHide( viewer );\n }\n\n if ( animated || THIS[ viewer.hash ].forceRedraw || viewer.world.needsDraw() ) {\n drawWorld( viewer );\n viewer._drawOverlays();\n if( viewer.navigator ){\n viewer.navigator.update( viewer.viewport );\n }\n\n THIS[ viewer.hash ].forceRedraw = false;\n\n if (animated) {\n /**\n * Raised when any spring animation update occurs (zoom, pan, etc.),\n * after the viewer has drawn the new location.\n *\n * @event animation\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation\" );\n }\n }\n\n if ( THIS[ viewer.hash ].animating && !animated ) {\n /**\n * Raised when any spring animation ends (zoom, pan, etc.).\n *\n * @event animation-finish\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation-finish\" );\n\n if ( !THIS[ viewer.hash ].mouseInside ) {\n beginControlsAutoHide( viewer );\n }\n }\n\n THIS[ viewer.hash ].animating = animated;\n\n //viewer.profiler.endUpdate();\n}\n\nfunction drawWorld( viewer ) {\n viewer.imageLoader.clear();\n viewer.drawer.clear();\n viewer.world.draw();\n\n /**\n * - Needs documentation -\n *\n * @event update-viewport\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( 'update-viewport', {} );\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// Navigation Controls\n///////////////////////////////////////////////////////////////////////////////\nfunction resolveUrl( prefix, url ) {\n return prefix ? prefix + url : url;\n}\n\n\n\nfunction beginZoomingIn() {\n THIS[ this.hash ].lastZoomTime = $.now();\n THIS[ this.hash ].zoomFactor = this.zoomPerSecond;\n THIS[ this.hash ].zooming = true;\n scheduleZoom( this );\n}\n\n\nfunction beginZoomingOut() {\n THIS[ this.hash ].lastZoomTime = $.now();\n THIS[ this.hash ].zoomFactor = 1.0 / this.zoomPerSecond;\n THIS[ this.hash ].zooming = true;\n scheduleZoom( this );\n}\n\n\nfunction endZooming() {\n THIS[ this.hash ].zooming = false;\n}\n\n\nfunction scheduleZoom( viewer ) {\n $.requestAnimationFrame( $.delegate( viewer, doZoom ) );\n}\n\n\nfunction doZoom() {\n var currentTime,\n deltaTime,\n adjustedFactor;\n\n if ( THIS[ this.hash ].zooming && this.viewport) {\n currentTime = $.now();\n deltaTime = currentTime - THIS[ this.hash ].lastZoomTime;\n adjustedFactor = Math.pow( THIS[ this.hash ].zoomFactor, deltaTime / 1000 );\n\n this.viewport.zoomBy( adjustedFactor );\n this.viewport.applyConstraints();\n THIS[ this.hash ].lastZoomTime = currentTime;\n scheduleZoom( this );\n }\n}\n\n\nfunction doSingleZoomIn() {\n if ( this.viewport ) {\n THIS[ this.hash ].zooming = false;\n this.viewport.zoomBy(\n this.zoomPerClick / 1.0\n );\n this.viewport.applyConstraints();\n }\n}\n\n\nfunction doSingleZoomOut() {\n if ( this.viewport ) {\n THIS[ this.hash ].zooming = false;\n this.viewport.zoomBy(\n 1.0 / this.zoomPerClick\n );\n this.viewport.applyConstraints();\n }\n}\n\n\nfunction lightUp() {\n if (this.buttonGroup) {\n this.buttonGroup.emulateEnter();\n this.buttonGroup.emulateLeave();\n }\n}\n\n\nfunction onHome() {\n if ( this.viewport ) {\n this.viewport.goHome();\n }\n}\n\n\nfunction onFullScreen() {\n if ( this.isFullPage() && !$.isFullScreen() ) {\n // Is fullPage but not fullScreen\n this.setFullPage( false );\n } else {\n this.setFullScreen( !this.isFullPage() );\n }\n // correct for no mouseout event on change\n if ( this.buttonGroup ) {\n this.buttonGroup.emulateLeave();\n }\n this.fullPageButton.element.focus();\n if ( this.viewport ) {\n this.viewport.applyConstraints();\n }\n}\n\nfunction onRotateLeft() {\n if ( this.viewport ) {\n var currRotation = this.viewport.getRotation();\n\n if ( this.viewport.flipped ){\n currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);\n } else {\n currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);\n }\n this.viewport.setRotation(currRotation);\n }\n}\n\nfunction onRotateRight() {\n if ( this.viewport ) {\n var currRotation = this.viewport.getRotation();\n\n if ( this.viewport.flipped ){\n currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);\n } else {\n currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);\n }\n this.viewport.setRotation(currRotation);\n }\n}\n/**\n * Note: When pressed flip control button\n */\nfunction onFlip() {\n this.viewport.toggleFlip();\n}\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - Navigator\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Navigator\n * @classdesc The Navigator provides a small view of the current image as fixed\n * while representing the viewport as a moving box serving as a frame\n * of reference in the larger viewport as to which portion of the image\n * is currently being examined. The navigator's viewport can be interacted\n * with using the keyboard or the mouse.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.Viewer\n * @extends OpenSeadragon.EventSource\n * @param {Object} options\n */\n$.Navigator = function( options ){\n\n var viewer = options.viewer,\n _this = this,\n viewerSize,\n navigatorSize;\n\n //We may need to create a new element and id if they did not\n //provide the id for the existing element\n if( !options.id ){\n options.id = 'navigator-' + $.now();\n this.element = $.makeNeutralElement( \"div\" );\n options.controlOptions = {\n anchor: $.ControlAnchor.TOP_RIGHT,\n attachToViewer: true,\n autoFade: options.autoFade\n };\n\n if( options.position ){\n if( 'BOTTOM_RIGHT' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.BOTTOM_RIGHT;\n } else if( 'BOTTOM_LEFT' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.BOTTOM_LEFT;\n } else if( 'TOP_RIGHT' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.TOP_RIGHT;\n } else if( 'TOP_LEFT' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.TOP_LEFT;\n } else if( 'ABSOLUTE' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.ABSOLUTE;\n options.controlOptions.top = options.top;\n options.controlOptions.left = options.left;\n options.controlOptions.height = options.height;\n options.controlOptions.width = options.width;\n }\n }\n\n } else {\n this.element = document.getElementById( options.id );\n options.controlOptions = {\n anchor: $.ControlAnchor.NONE,\n attachToViewer: false,\n autoFade: false\n };\n }\n this.element.id = options.id;\n this.element.className += ' navigator';\n\n options = $.extend( true, {\n sizeRatio: $.DEFAULT_SETTINGS.navigatorSizeRatio\n }, options, {\n element: this.element,\n tabIndex: -1, // No keyboard navigation, omit from tab order\n //These need to be overridden to prevent recursion since\n //the navigator is a viewer and a viewer has a navigator\n showNavigator: false,\n mouseNavEnabled: false,\n showNavigationControl: false,\n showSequenceControl: false,\n immediateRender: true,\n blendTime: 0,\n animationTime: 0,\n autoResize: options.autoResize,\n // prevent resizing the navigator from adding unwanted space around the image\n minZoomImageRatio: 1.0,\n background: options.background,\n opacity: options.opacity,\n borderColor: options.borderColor,\n displayRegionColor: options.displayRegionColor\n });\n\n options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;\n\n $.setElementTouchActionNone( this.element );\n\n this.borderWidth = 2;\n //At some browser magnification levels the display regions lines up correctly, but at some there appears to\n //be a one pixel gap.\n this.fudge = new $.Point(1, 1);\n this.totalBorderWidths = new $.Point(this.borderWidth * 2, this.borderWidth * 2).minus(this.fudge);\n\n\n if ( options.controlOptions.anchor !== $.ControlAnchor.NONE ) {\n (function( style, borderWidth ){\n style.margin = '0px';\n style.border = borderWidth + 'px solid ' + options.borderColor;\n style.padding = '0px';\n style.background = options.background;\n style.opacity = options.opacity;\n style.overflow = 'hidden';\n }( this.element.style, this.borderWidth));\n }\n\n this.displayRegion = $.makeNeutralElement( \"div\" );\n this.displayRegion.id = this.element.id + '-displayregion';\n this.displayRegion.className = 'displayregion';\n\n (function( style, borderWidth ){\n style.position = 'relative';\n style.top = '0px';\n style.left = '0px';\n style.fontSize = '0px';\n style.overflow = 'hidden';\n style.border = borderWidth + 'px solid ' + options.displayRegionColor;\n style.margin = '0px';\n style.padding = '0px';\n //TODO: IE doesn't like this property being set\n //try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/}\n\n style.background = 'transparent';\n\n // We use square bracket notation on the statement below, because float is a keyword.\n // This is important for the Google Closure compiler, if nothing else.\n /*jshint sub:true */\n style['float'] = 'left'; //Webkit\n\n style.cssFloat = 'left'; //Firefox\n style.styleFloat = 'left'; //IE\n style.zIndex = 999999999;\n style.cursor = 'default';\n }( this.displayRegion.style, this.borderWidth ));\n $.setElementPointerEventsNone( this.displayRegion );\n $.setElementTouchActionNone( this.displayRegion );\n\n this.displayRegionContainer = $.makeNeutralElement(\"div\");\n this.displayRegionContainer.id = this.element.id + '-displayregioncontainer';\n this.displayRegionContainer.className = \"displayregioncontainer\";\n this.displayRegionContainer.style.width = \"100%\";\n this.displayRegionContainer.style.height = \"100%\";\n $.setElementPointerEventsNone( this.displayRegionContainer );\n $.setElementTouchActionNone( this.displayRegionContainer );\n\n viewer.addControl(\n this.element,\n options.controlOptions\n );\n\n this._resizeWithViewer = options.controlOptions.anchor !== $.ControlAnchor.ABSOLUTE &&\n options.controlOptions.anchor !== $.ControlAnchor.NONE;\n\n if (options.width && options.height) {\n this.setWidth(options.width);\n this.setHeight(options.height);\n } else if ( this._resizeWithViewer ) {\n viewerSize = $.getElementSize( viewer.element );\n this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px';\n this.element.style.width = Math.round( viewerSize.x * options.sizeRatio ) + 'px';\n this.oldViewerSize = viewerSize;\n navigatorSize = $.getElementSize( this.element );\n this.elementArea = navigatorSize.x * navigatorSize.y;\n }\n\n this.oldContainerSize = new $.Point( 0, 0 );\n\n $.Viewer.apply( this, [ options ] );\n\n this.displayRegionContainer.appendChild(this.displayRegion);\n this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer);\n\n function rotate(degrees) {\n _setTransformRotate(_this.displayRegionContainer, degrees);\n _setTransformRotate(_this.displayRegion, -degrees);\n _this.viewport.setRotation(degrees);\n }\n if (options.navigatorRotate) {\n var degrees = options.viewer.viewport ?\n options.viewer.viewport.getRotation() :\n options.viewer.degrees || 0;\n\n rotate(degrees);\n options.viewer.addHandler(\"rotate\", function (args) {\n rotate(args.degrees);\n });\n }\n\n\n // Remove the base class' (Viewer's) innerTracker and replace it with our own\n this.innerTracker.destroy();\n this.innerTracker = new $.MouseTracker({\n userData: 'Navigator.innerTracker',\n element: this.element, //this.canvas,\n dragHandler: $.delegate( this, onCanvasDrag ),\n clickHandler: $.delegate( this, onCanvasClick ),\n releaseHandler: $.delegate( this, onCanvasRelease ),\n scrollHandler: $.delegate( this, onCanvasScroll ),\n preProcessEventHandler: function (eventInfo) {\n if (eventInfo.eventType === 'wheel') {\n //don't scroll the page up and down if the user is scrolling\n //in the navigator\n eventInfo.preventDefault = true;\n }\n }\n });\n this.outerTracker.userData = 'Navigator.outerTracker';\n\n // this.innerTracker is attached to this.element...we need to allow pointer\n // events to pass through this Viewer's canvas/container elements so implicit\n // pointer capture works on touch devices\n //TODO an alternative is to attach the new MouseTracker to this.canvas...not\n // sure why it isn't already (see MouseTracker constructor call above)\n $.setElementPointerEventsNone( this.canvas );\n $.setElementPointerEventsNone( this.container );\n\n this.addHandler(\"reset-size\", function() {\n if (_this.viewport) {\n _this.viewport.goHome(true);\n }\n });\n\n viewer.world.addHandler(\"item-index-change\", function(event) {\n window.setTimeout(function(){\n var item = _this.world.getItemAt(event.previousIndex);\n _this.world.setItemIndex(item, event.newIndex);\n }, 1);\n });\n\n viewer.world.addHandler(\"remove-item\", function(event) {\n var theirItem = event.item;\n var myItem = _this._getMatchingItem(theirItem);\n if (myItem) {\n _this.world.removeItem(myItem);\n }\n });\n\n this.update(viewer.viewport);\n};\n\n$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{\n\n /**\n * Used to notify the navigator when its size has changed.\n * Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable.\n * @function\n */\n updateSize: function () {\n if ( this.viewport ) {\n var containerSize = new $.Point(\n (this.container.clientWidth === 0 ? 1 : this.container.clientWidth),\n (this.container.clientHeight === 0 ? 1 : this.container.clientHeight)\n );\n\n if ( !containerSize.equals( this.oldContainerSize ) ) {\n this.viewport.resize( containerSize, true );\n this.viewport.goHome(true);\n this.oldContainerSize = containerSize;\n this.drawer.clear();\n this.world.draw();\n }\n }\n },\n\n /**\n * Explicitly sets the width of the navigator, in web coordinates. Disables automatic resizing.\n * @param {Number|String} width - the new width, either a number of pixels or a CSS string, such as \"100%\"\n */\n setWidth: function(width) {\n this.width = width;\n this.element.style.width = typeof (width) === \"number\" ? (width + 'px') : width;\n this._resizeWithViewer = false;\n },\n\n /**\n * Explicitly sets the height of the navigator, in web coordinates. Disables automatic resizing.\n * @param {Number|String} height - the new height, either a number of pixels or a CSS string, such as \"100%\"\n */\n setHeight: function(height) {\n this.height = height;\n this.element.style.height = typeof (height) === \"number\" ? (height + 'px') : height;\n this._resizeWithViewer = false;\n },\n\n /**\n * Flip navigator element\n * @param {Boolean} state - Flip state to set.\n */\n setFlip: function(state) {\n this.viewport.setFlip(state);\n\n this.setDisplayTransform(this.viewer.viewport.getFlip() ? \"scale(-1,1)\" : \"scale(1,1)\");\n return this;\n },\n\n setDisplayTransform: function(rule) {\n setElementTransform(this.displayRegion, rule);\n setElementTransform(this.canvas, rule);\n setElementTransform(this.element, rule);\n },\n\n /**\n * Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs.\n * @function\n * @param {OpenSeadragon.Viewport} The viewport this navigator is tracking.\n */\n update: function( viewport ) {\n\n var viewerSize,\n newWidth,\n newHeight,\n bounds,\n topleft,\n bottomright;\n\n viewerSize = $.getElementSize( this.viewer.element );\n if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) {\n this.oldViewerSize = viewerSize;\n\n if ( this.maintainSizeRatio || !this.elementArea) {\n newWidth = viewerSize.x * this.sizeRatio;\n newHeight = viewerSize.y * this.sizeRatio;\n } else {\n newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y));\n newHeight = this.elementArea / newWidth;\n }\n\n this.element.style.width = Math.round( newWidth ) + 'px';\n this.element.style.height = Math.round( newHeight ) + 'px';\n\n if (!this.elementArea) {\n this.elementArea = newWidth * newHeight;\n }\n\n this.updateSize();\n }\n\n if (viewport && this.viewport) {\n bounds = viewport.getBoundsNoRotate(true);\n topleft = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false);\n bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false)\n .minus( this.totalBorderWidths );\n\n //update style for navigator-box\n var style = this.displayRegion.style;\n style.display = this.world.getItemCount() ? 'block' : 'none';\n\n style.top = Math.round( topleft.y ) + 'px';\n style.left = Math.round( topleft.x ) + 'px';\n\n var width = Math.abs( topleft.x - bottomright.x );\n var height = Math.abs( topleft.y - bottomright.y );\n // make sure width and height are non-negative so IE doesn't throw\n style.width = Math.round( Math.max( width, 0 ) ) + 'px';\n style.height = Math.round( Math.max( height, 0 ) ) + 'px';\n }\n\n },\n\n // overrides Viewer.addTiledImage\n addTiledImage: function(options) {\n var _this = this;\n\n var original = options.originalTiledImage;\n delete options.original;\n\n var optionsClone = $.extend({}, options, {\n success: function(event) {\n var myItem = event.item;\n myItem._originalForNavigator = original;\n _this._matchBounds(myItem, original, true);\n _this._matchOpacity(myItem, original);\n _this._matchCompositeOperation(myItem, original);\n\n function matchBounds() {\n _this._matchBounds(myItem, original);\n }\n\n function matchOpacity() {\n _this._matchOpacity(myItem, original);\n }\n\n function matchCompositeOperation() {\n _this._matchCompositeOperation(myItem, original);\n }\n\n original.addHandler('bounds-change', matchBounds);\n original.addHandler('clip-change', matchBounds);\n original.addHandler('opacity-change', matchOpacity);\n original.addHandler('composite-operation-change', matchCompositeOperation);\n }\n });\n\n return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]);\n },\n\n destroy: function() {\n return $.Viewer.prototype.destroy.apply(this);\n },\n\n // private\n _getMatchingItem: function(theirItem) {\n var count = this.world.getItemCount();\n var item;\n for (var i = 0; i < count; i++) {\n item = this.world.getItemAt(i);\n if (item._originalForNavigator === theirItem) {\n return item;\n }\n }\n\n return null;\n },\n\n // private\n _matchBounds: function(myItem, theirItem, immediately) {\n var bounds = theirItem.getBoundsNoRotate();\n myItem.setPosition(bounds.getTopLeft(), immediately);\n myItem.setWidth(bounds.width, immediately);\n myItem.setRotation(theirItem.getRotation(), immediately);\n myItem.setClip(theirItem.getClip());\n myItem.setFlip(theirItem.getFlip());\n },\n\n // private\n _matchOpacity: function(myItem, theirItem) {\n myItem.setOpacity(theirItem.opacity);\n },\n\n // private\n _matchCompositeOperation: function(myItem, theirItem) {\n myItem.setCompositeOperation(theirItem.compositeOperation);\n }\n});\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasClick( event ) {\n var canvasClickEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n quick: event.quick,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n /**\n * Raised when a click event occurs on the {@link OpenSeadragon.Viewer#navigator} element.\n *\n * @event navigator-click\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.\n */\n\n this.viewer.raiseEvent('navigator-click', canvasClickEventArgs);\n\n if ( !canvasClickEventArgs.preventDefaultAction && event.quick && this.viewer.viewport && (this.panVertical || this.panHorizontal)) {\n if(this.viewer.viewport.flipped) {\n event.position.x = this.viewport.getContainerSize().x - event.position.x;\n }\n var target = this.viewport.pointFromPixel(event.position);\n if (!this.panVertical) {\n // perform only horizonal pan\n target.y = this.viewer.viewport.getCenter(true).y;\n } else if (!this.panHorizontal) {\n // perform only vertical pan\n target.x = this.viewer.viewport.getCenter(true).x;\n }\n this.viewer.viewport.panTo(target);\n this.viewer.viewport.applyConstraints();\n }\n\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasDrag( event ) {\n var canvasDragEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n delta: event.delta,\n speed: event.speed,\n direction: event.direction,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n /**\n * Raised when a drag event occurs on the {@link OpenSeadragon.Viewer#navigator} element.\n *\n * @event navigator-drag\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag.\n * @property {Number} speed - Current computed speed, in pixels per second.\n * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default drag to pan behaviour. Default: false.\n */\n this.viewer.raiseEvent('navigator-drag', canvasDragEventArgs);\n\n if ( !canvasDragEventArgs.preventDefaultAction && this.viewer.viewport ) {\n if( !this.panHorizontal ){\n event.delta.x = 0;\n }\n if( !this.panVertical ){\n event.delta.y = 0;\n }\n\n if(this.viewer.viewport.flipped){\n event.delta.x = -event.delta.x;\n }\n\n this.viewer.viewport.panBy(\n this.viewport.deltaPointsFromPixels(\n event.delta\n )\n );\n if( this.viewer.constrainDuringPan ){\n this.viewer.viewport.applyConstraints();\n }\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasRelease( event ) {\n if ( event.insideElementPressed && this.viewer.viewport ) {\n this.viewer.viewport.applyConstraints();\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasScroll( event ) {\n var eventArgs = {\n tracker: event.eventSource,\n position: event.position,\n scroll: event.scroll,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefault: event.preventDefault\n };\n\n /**\n * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#navigator} element (mouse wheel, touch pinch, etc.).\n *\n * @event navigator-scroll\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} scroll - The scroll delta for the event.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the wheel event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'navigator-scroll', eventArgs );\n\n event.preventDefault = eventArgs.preventDefault;\n}\n\n/**\n * @function\n * @private\n * @param {Object} element\n * @param {Number} degrees\n */\nfunction _setTransformRotate( element, degrees ) {\n setElementTransform(element, \"rotate(\" + degrees + \"deg)\");\n}\n\nfunction setElementTransform( element, rule ) {\n element.style.webkitTransform = rule;\n element.style.mozTransform = rule;\n element.style.msTransform = rule;\n element.style.oTransform = rule;\n element.style.transform = rule;\n}\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - getString/setString\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n//TODO: I guess this is where the i18n needs to be reimplemented. I'll look\n// into existing patterns for i18n in javascript but i think that mimicking\n// pythons gettext might be a reasonable approach.\nvar I18N = {\n Errors: {\n Dzc: \"Sorry, we don't support Deep Zoom Collections!\",\n Dzi: \"Hmm, this doesn't appear to be a valid Deep Zoom Image.\",\n Xml: \"Hmm, this doesn't appear to be a valid Deep Zoom Image.\",\n ImageFormat: \"Sorry, we don't support {0}-based Deep Zoom Images.\",\n Security: \"It looks like a security restriction stopped us from \" +\n \"loading this Deep Zoom Image.\",\n Status: \"This space unintentionally left blank ({0} {1}).\",\n OpenFailed: \"Unable to open {0}: {1}\"\n },\n\n Tooltips: {\n FullPage: \"Toggle full page\",\n Home: \"Go home\",\n ZoomIn: \"Zoom in\",\n ZoomOut: \"Zoom out\",\n NextPage: \"Next page\",\n PreviousPage: \"Previous page\",\n RotateLeft: \"Rotate left\",\n RotateRight: \"Rotate right\",\n Flip: \"Flip Horizontally\"\n }\n};\n\n$.extend( $, /** @lends OpenSeadragon */{\n\n /**\n * @function\n * @param {String} property\n */\n getString: function( prop ) {\n\n var props = prop.split('.'),\n string = null,\n args = arguments,\n container = I18N,\n i;\n\n for (i = 0; i < props.length - 1; i++) {\n // in case not a subproperty\n container = container[ props[ i ] ] || {};\n }\n string = container[ props[ i ] ];\n\n if ( typeof ( string ) !== \"string\" ) {\n $.console.log( \"Untranslated source string:\", prop );\n string = \"\"; // FIXME: this breaks gettext()-style convention, which would return source\n }\n\n return string.replace(/\\{\\d+\\}/g, function(capture) {\n var i = parseInt( capture.match( /\\d+/ ), 10 ) + 1;\n return i < args.length ?\n args[ i ] :\n \"\";\n });\n },\n\n /**\n * @function\n * @param {String} property\n * @param {*} value\n */\n setString: function( prop, value ) {\n\n var props = prop.split('.'),\n container = I18N,\n i;\n\n for ( i = 0; i < props.length - 1; i++ ) {\n if ( !container[ props[ i ] ] ) {\n container[ props[ i ] ] = {};\n }\n container = container[ props[ i ] ];\n }\n\n container[ props[ i ] ] = value;\n }\n\n});\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - Point\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Point\n * @classdesc A Point is really used as a 2-dimensional vector, equally useful for\n * representing a point on a plane, or the height and width of a plane\n * not requiring any other frame of reference.\n *\n * @memberof OpenSeadragon\n * @param {Number} [x] The vector component 'x'. Defaults to the origin at 0.\n * @param {Number} [y] The vector component 'y'. Defaults to the origin at 0.\n */\n$.Point = function( x, y ) {\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Point#\n */\n this.x = typeof ( x ) === \"number\" ? x : 0;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Point#\n */\n this.y = typeof ( y ) === \"number\" ? y : 0;\n};\n\n/** @lends OpenSeadragon.Point.prototype */\n$.Point.prototype = {\n /**\n * @function\n * @returns {OpenSeadragon.Point} a duplicate of this Point\n */\n clone: function() {\n return new $.Point(this.x, this.y);\n },\n\n /**\n * Add another Point to this point and return a new Point.\n * @function\n * @param {OpenSeadragon.Point} point The point to add vector components.\n * @returns {OpenSeadragon.Point} A new point representing the sum of the\n * vector components\n */\n plus: function( point ) {\n return new $.Point(\n this.x + point.x,\n this.y + point.y\n );\n },\n\n /**\n * Subtract another Point to this point and return a new Point.\n * @function\n * @param {OpenSeadragon.Point} point The point to subtract vector components.\n * @returns {OpenSeadragon.Point} A new point representing the subtraction of the\n * vector components\n */\n minus: function( point ) {\n return new $.Point(\n this.x - point.x,\n this.y - point.y\n );\n },\n\n /**\n * Multiply this point by a factor and return a new Point.\n * @function\n * @param {Number} factor The factor to multiply vector components.\n * @returns {OpenSeadragon.Point} A new point representing the multiplication\n * of the vector components by the factor\n */\n times: function( factor ) {\n return new $.Point(\n this.x * factor,\n this.y * factor\n );\n },\n\n /**\n * Divide this point by a factor and return a new Point.\n * @function\n * @param {Number} factor The factor to divide vector components.\n * @returns {OpenSeadragon.Point} A new point representing the division of the\n * vector components by the factor\n */\n divide: function( factor ) {\n return new $.Point(\n this.x / factor,\n this.y / factor\n );\n },\n\n /**\n * Compute the opposite of this point and return a new Point.\n * @function\n * @returns {OpenSeadragon.Point} A new point representing the opposite of the\n * vector components\n */\n negate: function() {\n return new $.Point( -this.x, -this.y );\n },\n\n /**\n * Compute the distance between this point and another point.\n * @function\n * @param {OpenSeadragon.Point} point The point to compute the distance with.\n * @returns {Number} The distance between the 2 points\n */\n distanceTo: function( point ) {\n return Math.sqrt(\n Math.pow( this.x - point.x, 2 ) +\n Math.pow( this.y - point.y, 2 )\n );\n },\n\n /**\n * Compute the squared distance between this point and another point.\n * Useful for optimizing things like comparing distances.\n * @function\n * @param {OpenSeadragon.Point} point The point to compute the squared distance with.\n * @returns {Number} The squared distance between the 2 points\n */\n squaredDistanceTo: function( point ) {\n return Math.pow( this.x - point.x, 2 ) +\n Math.pow( this.y - point.y, 2 );\n },\n\n /**\n * Apply a function to each coordinate of this point and return a new point.\n * @function\n * @param {function} func The function to apply to each coordinate.\n * @returns {OpenSeadragon.Point} A new point with the coordinates computed\n * by the specified function\n */\n apply: function( func ) {\n return new $.Point( func( this.x ), func( this.y ) );\n },\n\n /**\n * Check if this point is equal to another one.\n * @function\n * @param {OpenSeadragon.Point} point The point to compare this point with.\n * @returns {Boolean} true if they are equal, false otherwise.\n */\n equals: function( point ) {\n return (\n point instanceof $.Point\n ) && (\n this.x === point.x\n ) && (\n this.y === point.y\n );\n },\n\n /**\n * Rotates the point around the specified pivot\n * From http://stackoverflow.com/questions/4465931/rotate-rectangle-around-a-point\n * @function\n * @param {Number} degress to rotate around the pivot.\n * @param {OpenSeadragon.Point} [pivot=(0,0)] Point around which to rotate.\n * Defaults to the origin.\n * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot\n */\n rotate: function (degrees, pivot) {\n pivot = pivot || new $.Point(0, 0);\n var cos;\n var sin;\n // Avoid float computations when possible\n if (degrees % 90 === 0) {\n var d = $.positiveModulo(degrees, 360);\n switch (d) {\n case 0:\n cos = 1;\n sin = 0;\n break;\n case 90:\n cos = 0;\n sin = 1;\n break;\n case 180:\n cos = -1;\n sin = 0;\n break;\n case 270:\n cos = 0;\n sin = -1;\n break;\n }\n } else {\n var angle = degrees * Math.PI / 180.0;\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n }\n var x = cos * (this.x - pivot.x) - sin * (this.y - pivot.y) + pivot.x;\n var y = sin * (this.x - pivot.x) + cos * (this.y - pivot.y) + pivot.y;\n return new $.Point(x, y);\n },\n\n /**\n * Convert this point to a string in the format (x,y) where x and y are\n * rounded to the nearest integer.\n * @function\n * @returns {String} A string representation of this point.\n */\n toString: function() {\n return \"(\" + (Math.round(this.x * 100) / 100) + \",\" + (Math.round(this.y * 100) / 100) + \")\";\n }\n};\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - TileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n\n/**\n * @class TileSource\n * @classdesc The TileSource contains the most basic implementation required to create a\n * smooth transition between layers in an image pyramid. It has only a single key\n * interface that must be implemented to complete its key functionality:\n * 'getTileUrl'. It also has several optional interfaces that can be\n * implemented if a new TileSource wishes to support configuration via a simple\n * object or array ('configure') and if the tile source supports or requires\n * configuration via retrieval of a document on the network ala AJAX or JSONP,\n * ('getImageInfo').\n *
    \n * By default the image pyramid is split into N layers where the image's longest\n * side in M (in pixels), where N is the smallest integer which satisfies\n * 2^(N+1) >= M.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @param {Object} options\n * You can either specify a URL, or literally define the TileSource (by specifying\n * width, height, tileSize, tileOverlap, minLevel, and maxLevel). For the former,\n * the extending class is expected to implement 'getImageInfo' and 'configure'.\n * For the latter, the construction is assumed to occur through\n * the extending classes implementation of 'configure'.\n * @param {String} [options.url]\n * The URL for the data necessary for this TileSource.\n * @param {String} [options.referenceStripThumbnailUrl]\n * The URL for a thumbnail image to be used by the reference strip\n * @param {Function} [options.success]\n * A function to be called upon successful creation.\n * @param {Boolean} [options.ajaxWithCredentials]\n * If this TileSource needs to make an AJAX call, this specifies whether to set\n * the XHR's withCredentials (for accessing secure data).\n * @param {Object} [options.ajaxHeaders]\n * A set of headers to include in AJAX requests.\n * @param {Number} [options.width]\n * Width of the source image at max resolution in pixels.\n * @param {Number} [options.height]\n * Height of the source image at max resolution in pixels.\n * @param {Number} [options.tileSize]\n * The size of the tiles to assumed to make up each pyramid layer in pixels.\n * Tile size determines the point at which the image pyramid must be\n * divided into a matrix of smaller images.\n * Use options.tileWidth and options.tileHeight to support non-square tiles.\n * @param {Number} [options.tileWidth]\n * The width of the tiles to assumed to make up each pyramid layer in pixels.\n * @param {Number} [options.tileHeight]\n * The height of the tiles to assumed to make up each pyramid layer in pixels.\n * @param {Number} [options.tileOverlap]\n * The number of pixels each tile is expected to overlap touching tiles.\n * @param {Number} [options.minLevel]\n * The minimum level to attempt to load.\n * @param {Number} [options.maxLevel]\n * The maximum level to attempt to load.\n */\n$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) {\n var _this = this;\n\n var args = arguments,\n options,\n i;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: args[0],\n height: args[1],\n tileSize: args[2],\n tileOverlap: args[3],\n minLevel: args[4],\n maxLevel: args[5]\n };\n }\n\n //Tile sources supply some events, namely 'ready' when they must be configured\n //by asynchronously fetching their configuration data.\n $.EventSource.call( this );\n\n //we allow options to override anything we don't treat as\n //required via idiomatic options or which is functionally\n //set depending on the state of the readiness of this tile\n //source\n $.extend( true, this, options );\n\n if (!this.success) {\n //Any functions that are passed as arguments are bound to the ready callback\n for ( i = 0; i < arguments.length; i++ ) {\n if ( $.isFunction( arguments[ i ] ) ) {\n this.success = arguments[ i ];\n //only one callback per constructor\n break;\n }\n }\n }\n\n if (this.success) {\n this.addHandler( 'ready', function ( event ) {\n _this.success( event );\n } );\n }\n\n /**\n * Ratio of width to height\n * @member {Number} aspectRatio\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * Vector storing x and y dimensions ( width and height respectively ).\n * @member {OpenSeadragon.Point} dimensions\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The overlap in pixels each tile shares with its adjacent neighbors.\n * @member {Number} tileOverlap\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The minimum pyramid level this tile source supports or should attempt to load.\n * @member {Number} minLevel\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The maximum pyramid level this tile source supports or should attempt to load.\n * @member {Number} maxLevel\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n *\n * @member {Boolean} ready\n * @memberof OpenSeadragon.TileSource#\n */\n\n if( 'string' === $.type( arguments[ 0 ] ) ){\n this.url = arguments[0];\n }\n\n if (this.url) {\n //in case the getImageInfo method is overridden and/or implies an\n //async mechanism set some safe defaults first\n this.aspectRatio = 1;\n this.dimensions = new $.Point( 10, 10 );\n this._tileWidth = 0;\n this._tileHeight = 0;\n this.tileOverlap = 0;\n this.minLevel = 0;\n this.maxLevel = 0;\n this.ready = false;\n //configuration via url implies the extending class\n //implements and 'configure'\n this.getImageInfo( this.url );\n\n } else {\n\n //explicit configuration via positional args in constructor\n //or the more idiomatic 'options' object\n this.ready = true;\n this.aspectRatio = (options.width && options.height) ?\n (options.width / options.height) : 1;\n this.dimensions = new $.Point( options.width, options.height );\n\n if ( this.tileSize ){\n this._tileWidth = this._tileHeight = this.tileSize;\n delete this.tileSize;\n } else {\n if( this.tileWidth ){\n // We were passed tileWidth in options, but we want to rename it\n // with a leading underscore to make clear that it is not safe to directly modify it\n this._tileWidth = this.tileWidth;\n delete this.tileWidth;\n } else {\n this._tileWidth = 0;\n }\n\n if( this.tileHeight ){\n // See note above about renaming this.tileWidth\n this._tileHeight = this.tileHeight;\n delete this.tileHeight;\n } else {\n this._tileHeight = 0;\n }\n }\n\n this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0;\n this.minLevel = options.minLevel ? options.minLevel : 0;\n this.maxLevel = ( undefined !== options.maxLevel && null !== options.maxLevel ) ?\n options.maxLevel : (\n ( options.width && options.height ) ? Math.ceil(\n Math.log( Math.max( options.width, options.height ) ) /\n Math.log( 2 )\n ) : 0\n );\n if( this.success && $.isFunction( this.success ) ){\n this.success( this );\n }\n }\n\n\n};\n\n/** @lends OpenSeadragon.TileSource.prototype */\n$.TileSource.prototype = {\n\n getTileSize: function( level ) {\n $.console.error(\n \"[TileSource.getTileSize] is deprecated. \" +\n \"Use TileSource.getTileWidth() and TileSource.getTileHeight() instead\"\n );\n return this._tileWidth;\n },\n\n /**\n * Return the tileWidth for a given level.\n * Subclasses should override this if tileWidth can be different at different levels\n * such as in IIIFTileSource. Code should use this function rather than reading\n * from ._tileWidth directly.\n * @function\n * @param {Number} level\n */\n getTileWidth: function( level ) {\n if (!this._tileWidth) {\n return this.getTileSize(level);\n }\n return this._tileWidth;\n },\n\n /**\n * Return the tileHeight for a given level.\n * Subclasses should override this if tileHeight can be different at different levels\n * such as in IIIFTileSource. Code should use this function rather than reading\n * from ._tileHeight directly.\n * @function\n * @param {Number} level\n */\n getTileHeight: function( level ) {\n if (!this._tileHeight) {\n return this.getTileSize(level);\n }\n return this._tileHeight;\n },\n\n /**\n * Set the maxLevel to the given level, and perform the memoization of\n * getLevelScale with the new maxLevel. This function can be useful if the\n * memoization is required before the first call of getLevelScale, or both\n * memoized getLevelScale and maxLevel should be changed accordingly.\n * @function\n * @param {Number} level\n */\n setMaxLevel: function( level ) {\n this.maxLevel = level;\n this._memoizeLevelScale();\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function( level ) {\n // if getLevelScale is not memoized, we generate the memoized version\n // at the first call and return the result\n this._memoizeLevelScale();\n return this.getLevelScale( level );\n },\n\n // private\n _memoizeLevelScale: function() {\n // see https://github.com/openseadragon/openseadragon/issues/22\n // we use the tilesources implementation of getLevelScale to generate\n // a memoized re-implementation\n var levelScaleCache = {},\n i;\n for( i = 0; i <= this.maxLevel; i++ ){\n levelScaleCache[ i ] = 1 / Math.pow(2, this.maxLevel - i);\n }\n this.getLevelScale = function( _level ){\n return levelScaleCache[ _level ];\n };\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n var scale = this.getLevelScale( level ),\n x = Math.ceil( scale * this.dimensions.x / this.getTileWidth(level) ),\n y = Math.ceil( scale * this.dimensions.y / this.getTileHeight(level) );\n\n return new $.Point( x, y );\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getPixelRatio: function( level ) {\n var imageSizeScaled = this.dimensions.times( this.getLevelScale( level ) ),\n rx = 1.0 / imageSizeScaled.x * $.pixelDensityRatio,\n ry = 1.0 / imageSizeScaled.y * $.pixelDensityRatio;\n\n return new $.Point(rx, ry);\n },\n\n\n /**\n * @function\n * @returns {Number} The highest level in this tile source that can be contained in a single tile.\n */\n getClosestLevel: function() {\n var i,\n tiles;\n\n for (i = this.minLevel + 1; i <= this.maxLevel; i++){\n tiles = this.getNumTiles(i);\n if (tiles.x > 1 || tiles.y > 1) {\n break;\n }\n }\n\n return i - 1;\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {OpenSeadragon.Point} point\n */\n getTileAtPoint: function(level, point) {\n var validPoint = point.x >= 0 && point.x <= 1 &&\n point.y >= 0 && point.y <= 1 / this.aspectRatio;\n $.console.assert(validPoint, \"[TileSource.getTileAtPoint] must be called with a valid point.\");\n\n var widthScaled = this.dimensions.x * this.getLevelScale(level);\n var pixelX = point.x * widthScaled;\n var pixelY = point.y * widthScaled;\n\n var x = Math.floor(pixelX / this.getTileWidth(level));\n var y = Math.floor(pixelY / this.getTileHeight(level));\n\n // When point.x == 1 or point.y == 1 / this.aspectRatio we want to\n // return the last tile of the row/column\n if (point.x >= 1) {\n x = this.getNumTiles(level).x - 1;\n }\n var EPSILON = 1e-15;\n if (point.y >= 1 / this.aspectRatio - EPSILON) {\n y = this.getNumTiles(level).y - 1;\n }\n\n return new $.Point(x, y);\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @param {Boolean} [isSource=false] Whether to return the source bounds of the tile.\n * @returns {OpenSeadragon.Rect} Either where this tile fits (in normalized coordinates) or the\n * portion of the tile to use as the source of the drawing operation (in pixels), depending on\n * the isSource parameter.\n */\n getTileBounds: function( level, x, y, isSource ) {\n var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ),\n tileWidth = this.getTileWidth(level),\n tileHeight = this.getTileHeight(level),\n px = ( x === 0 ) ? 0 : tileWidth * x - this.tileOverlap,\n py = ( y === 0 ) ? 0 : tileHeight * y - this.tileOverlap,\n sx = tileWidth + ( x === 0 ? 1 : 2 ) * this.tileOverlap,\n sy = tileHeight + ( y === 0 ? 1 : 2 ) * this.tileOverlap,\n scale = 1.0 / dimensionsScaled.x;\n\n sx = Math.min( sx, dimensionsScaled.x - px );\n sy = Math.min( sy, dimensionsScaled.y - py );\n\n if (isSource) {\n return new $.Rect(0, 0, sx, sy);\n }\n\n return new $.Rect( px * scale, py * scale, sx * scale, sy * scale );\n },\n\n\n /**\n * Responsible for retrieving, and caching the\n * image metadata pertinent to this TileSources implementation.\n * @function\n * @param {String} url\n * @throws {Error}\n */\n getImageInfo: function( url ) {\n var _this = this,\n callbackName,\n callback,\n readySource,\n options,\n urlParts,\n filename,\n lastDot;\n\n\n if( url ) {\n urlParts = url.split( '/' );\n filename = urlParts[ urlParts.length - 1 ];\n lastDot = filename.lastIndexOf( '.' );\n if ( lastDot > -1 ) {\n urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot );\n }\n }\n\n callback = function( data ){\n if( typeof (data) === \"string\" ) {\n data = $.parseXml( data );\n }\n var $TileSource = $.TileSource.determineType( _this, data, url );\n if ( !$TileSource ) {\n /**\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', { message: \"Unable to load TileSource\", source: url } );\n return;\n }\n\n options = $TileSource.prototype.configure.apply( _this, [ data, url ]);\n if (options.ajaxWithCredentials === undefined) {\n options.ajaxWithCredentials = _this.ajaxWithCredentials;\n }\n\n readySource = new $TileSource( options );\n _this.ready = true;\n /**\n * Raised when a TileSource is opened and initialized.\n *\n * @event ready\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {Object} tileSource\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'ready', { tileSource: readySource } );\n };\n\n if( url.match(/\\.js$/) ){\n //TODO: Its not very flexible to require tile sources to end jsonp\n // request for info with a url that ends with '.js' but for\n // now it's the only way I see to distinguish uniformly.\n callbackName = url.split('/').pop().replace('.js', '');\n $.jsonp({\n url: url,\n async: false,\n callbackName: callbackName,\n callback: callback\n });\n } else {\n // request info via xhr asynchronously.\n $.makeAjaxRequest( {\n url: url,\n withCredentials: this.ajaxWithCredentials,\n headers: this.ajaxHeaders,\n success: function( xhr ) {\n var data = processResponse( xhr );\n callback( data );\n },\n error: function ( xhr, exc ) {\n var msg;\n\n /*\n IE < 10 will block XHR requests to different origins. Any property access on the request\n object will raise an exception which we'll attempt to handle by formatting the original\n exception rather than the second one raised when we try to access xhr.status\n */\n try {\n msg = \"HTTP \" + xhr.status + \" attempting to load TileSource\";\n } catch ( e ) {\n var formattedExc;\n if ( typeof ( exc ) === \"undefined\" || !exc.toString ) {\n formattedExc = \"Unknown error\";\n } else {\n formattedExc = exc.toString();\n }\n\n msg = formattedExc + \" attempting to load TileSource\";\n }\n\n /***\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', {\n message: msg,\n source: url\n });\n }\n });\n }\n\n },\n\n /**\n * Responsible determining if a the particular TileSource supports the\n * data format ( and allowed to apply logic against the url the data was\n * loaded from, if any ). Overriding implementations are expected to do\n * something smart with data and / or url to determine support. Also\n * understand that iteration order of TileSources is not guarunteed so\n * please make sure your data or url is expressive enough to ensure a simple\n * and sufficient mechanisim for clear determination.\n * @function\n * @param {String|Object|Array|Document} data\n * @param {String} url - the url the data was loaded\n * from if any.\n * @return {Boolean}\n */\n supports: function( data, url ) {\n return false;\n },\n\n /**\n * Responsible for parsing and configuring the\n * image metadata pertinent to this TileSources implementation.\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {String|Object|Array|Document} data\n * @param {String} url - the url the data was loaded\n * from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n * @throws {Error}\n */\n configure: function( data, url ) {\n throw new Error( \"Method not implemented.\" );\n },\n\n /**\n * Responsible for retrieving the url which will return an image for the\n * region specified by the given x, y, and level components.\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @throws {Error}\n */\n getTileUrl: function( level, x, y ) {\n throw new Error( \"Method not implemented.\" );\n },\n\n /**\n * Responsible for retrieving the headers which will be attached to the image request for the\n * region specified by the given x, y, and level components.\n * This option is only relevant if {@link OpenSeadragon.Options}.loadTilesWithAjax is set to true.\n * The headers returned here will override headers specified at the Viewer or TiledImage level.\n * Specifying a falsy value for a header will clear its existing value set at the Viewer or\n * TiledImage level (if any).\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @returns {Object}\n */\n getTileAjaxHeaders: function( level, x, y ) {\n return {};\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n tileExists: function( level, x, y ) {\n var numTiles = this.getNumTiles( level );\n return level >= this.minLevel &&\n level <= this.maxLevel &&\n x >= 0 &&\n y >= 0 &&\n x < numTiles.x &&\n y < numTiles.y;\n }\n};\n\n\n$.extend( true, $.TileSource.prototype, $.EventSource.prototype );\n\n\n/**\n * Decides whether to try to process the response as xml, json, or hand back\n * the text\n * @private\n * @inner\n * @function\n * @param {XMLHttpRequest} xhr - the completed network request\n */\nfunction processResponse( xhr ){\n var responseText = xhr.responseText,\n status = xhr.status,\n statusText,\n data;\n\n if ( !xhr ) {\n throw new Error( $.getString( \"Errors.Security\" ) );\n } else if ( xhr.status !== 200 && xhr.status !== 0 ) {\n status = xhr.status;\n statusText = ( status === 404 ) ?\n \"Not Found\" :\n xhr.statusText;\n throw new Error( $.getString( \"Errors.Status\", status, statusText ) );\n }\n\n if( responseText.match(/\\s*<.*/) ){\n try{\n data = ( xhr.responseXML && xhr.responseXML.documentElement ) ?\n xhr.responseXML :\n $.parseXml( responseText );\n } catch (e){\n data = xhr.responseText;\n }\n }else if( responseText.match(/\\s*[{[].*/) ){\n try{\n data = $.parseJSON(responseText);\n } catch(e){\n data = responseText;\n }\n }else{\n data = responseText;\n }\n return data;\n}\n\n\n/**\n * Determines the TileSource Implementation by introspection of OpenSeadragon\n * namespace, calling each TileSource implementation of 'isType'\n * @private\n * @inner\n * @function\n * @param {Object|Array|Document} data - the tile source configuration object\n * @param {String} url - the url where the tile source configuration object was\n * loaded from, if any.\n */\n$.TileSource.determineType = function( tileSource, data, url ){\n var property;\n for( property in OpenSeadragon ){\n if( property.match(/.+TileSource$/) &&\n $.isFunction( OpenSeadragon[ property ] ) &&\n $.isFunction( OpenSeadragon[ property ].prototype.supports ) &&\n OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url )\n ){\n return OpenSeadragon[ property ];\n }\n }\n\n $.console.error( \"No TileSource was able to open %s %s\", url, data );\n\n return null;\n};\n\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - DziTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class DziTileSource\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n * @param {String} fileFormat\n * @param {OpenSeadragon.DisplayRect[]} displayRects\n * @property {String} tilesUrl\n * @property {String} fileFormat\n * @property {OpenSeadragon.DisplayRect[]} displayRects\n */\n$.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, fileFormat, displayRects, minLevel, maxLevel ) {\n var i,\n rect,\n level,\n options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[ 0 ],\n height: arguments[ 1 ],\n tileSize: arguments[ 2 ],\n tileOverlap: arguments[ 3 ],\n tilesUrl: arguments[ 4 ],\n fileFormat: arguments[ 5 ],\n displayRects: arguments[ 6 ],\n minLevel: arguments[ 7 ],\n maxLevel: arguments[ 8 ]\n };\n }\n\n this._levelRects = {};\n this.tilesUrl = options.tilesUrl;\n this.fileFormat = options.fileFormat;\n this.displayRects = options.displayRects;\n\n if ( this.displayRects ) {\n for ( i = this.displayRects.length - 1; i >= 0; i-- ) {\n rect = this.displayRects[ i ];\n for ( level = rect.minLevel; level <= rect.maxLevel; level++ ) {\n if ( !this._levelRects[ level ] ) {\n this._levelRects[ level ] = [];\n }\n this._levelRects[ level ].push( rect );\n }\n }\n }\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.DziTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.DziTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n var ns;\n if ( data.Image ) {\n ns = data.Image.xmlns;\n } else if ( data.documentElement) {\n if (\"Image\" === data.documentElement.localName || \"Image\" === data.documentElement.tagName) {\n ns = data.documentElement.namespaceURI;\n }\n }\n\n ns = (ns || '').toLowerCase();\n\n return (ns.indexOf('schemas.microsoft.com/deepzoom/2008') !== -1 ||\n ns.indexOf('schemas.microsoft.com/deepzoom/2009') !== -1);\n },\n\n /**\n *\n * @function\n * @param {Object|XMLDocument} data - the raw configuration\n * @param {String} url - the url the data was retrieved from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url ){\n\n var options;\n\n if( !$.isPlainObject(data) ){\n\n options = configureFromXML( this, data );\n\n }else{\n\n options = configureFromObject( this, data );\n }\n\n if (url && !options.tilesUrl) {\n options.tilesUrl = url.replace(\n /([^/]+?)(\\.(dzi|xml|js)?(\\?[^/]*)?)?\\/?$/, '$1_files/');\n\n if (url.search(/\\.(dzi|xml|js)\\?/) !== -1) {\n options.queryParams = url.match(/\\?.*/);\n }else{\n options.queryParams = '';\n }\n }\n\n return options;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat, this.queryParams ].join( '' );\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n tileExists: function( level, x, y ) {\n var rects = this._levelRects[ level ],\n rect,\n scale,\n xMin,\n yMin,\n xMax,\n yMax,\n i;\n\n if ((this.minLevel && level < this.minLevel) || (this.maxLevel && level > this.maxLevel)) {\n return false;\n }\n\n if ( !rects || !rects.length ) {\n return true;\n }\n\n for ( i = rects.length - 1; i >= 0; i-- ) {\n rect = rects[ i ];\n\n if ( level < rect.minLevel || level > rect.maxLevel ) {\n continue;\n }\n\n scale = this.getLevelScale( level );\n xMin = rect.x * scale;\n yMin = rect.y * scale;\n xMax = xMin + rect.width * scale;\n yMax = yMin + rect.height * scale;\n\n xMin = Math.floor( xMin / this._tileWidth );\n yMin = Math.floor( yMin / this._tileWidth ); // DZI tiles are square, so we just use _tileWidth\n xMax = Math.ceil( xMax / this._tileWidth );\n yMax = Math.ceil( yMax / this._tileWidth );\n\n if ( xMin <= x && x < xMax && yMin <= y && y < yMax ) {\n return true;\n }\n }\n\n return false;\n }\n});\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromXML( tileSource, xmlDoc ){\n\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.localName || root.tagName,\n ns = xmlDoc.documentElement.namespaceURI,\n configuration = null,\n displayRects = [],\n dispRectNodes,\n dispRectNode,\n rectNode,\n sizeNode,\n i;\n\n if ( rootName === \"Image\" ) {\n\n try {\n sizeNode = root.getElementsByTagName(\"Size\" )[ 0 ];\n if (sizeNode === undefined) {\n sizeNode = root.getElementsByTagNameNS(ns, \"Size\" )[ 0 ];\n }\n\n configuration = {\n Image: {\n xmlns: \"http://schemas.microsoft.com/deepzoom/2008\",\n Url: root.getAttribute( \"Url\" ),\n Format: root.getAttribute( \"Format\" ),\n DisplayRect: null,\n Overlap: parseInt( root.getAttribute( \"Overlap\" ), 10 ),\n TileSize: parseInt( root.getAttribute( \"TileSize\" ), 10 ),\n Size: {\n Height: parseInt( sizeNode.getAttribute( \"Height\" ), 10 ),\n Width: parseInt( sizeNode.getAttribute( \"Width\" ), 10 )\n }\n }\n };\n\n if ( !$.imageFormatSupported( configuration.Image.Format ) ) {\n throw new Error(\n $.getString( \"Errors.ImageFormat\", configuration.Image.Format.toUpperCase() )\n );\n }\n\n dispRectNodes = root.getElementsByTagName(\"DisplayRect\" );\n if (dispRectNodes === undefined) {\n dispRectNodes = root.getElementsByTagNameNS(ns, \"DisplayRect\" )[ 0 ];\n }\n\n for ( i = 0; i < dispRectNodes.length; i++ ) {\n dispRectNode = dispRectNodes[ i ];\n rectNode = dispRectNode.getElementsByTagName(\"Rect\" )[ 0 ];\n if (rectNode === undefined) {\n rectNode = dispRectNode.getElementsByTagNameNS(ns, \"Rect\" )[ 0 ];\n }\n\n displayRects.push({\n Rect: {\n X: parseInt( rectNode.getAttribute( \"X\" ), 10 ),\n Y: parseInt( rectNode.getAttribute( \"Y\" ), 10 ),\n Width: parseInt( rectNode.getAttribute( \"Width\" ), 10 ),\n Height: parseInt( rectNode.getAttribute( \"Height\" ), 10 ),\n MinLevel: parseInt( dispRectNode.getAttribute( \"MinLevel\" ), 10 ),\n MaxLevel: parseInt( dispRectNode.getAttribute( \"MaxLevel\" ), 10 )\n }\n });\n }\n\n if( displayRects.length ){\n configuration.Image.DisplayRect = displayRects;\n }\n\n return configureFromObject( tileSource, configuration );\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( $.getString(\"Errors.Dzi\") );\n }\n } else if ( rootName === \"Collection\" ) {\n throw new Error( $.getString( \"Errors.Dzc\" ) );\n } else if ( rootName === \"Error\" ) {\n var messageNode = root.getElementsByTagName(\"Message\")[0];\n var message = messageNode.firstChild.nodeValue;\n throw new Error(message);\n }\n\n throw new Error( $.getString( \"Errors.Dzi\" ) );\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromObject( tileSource, configuration ){\n var imageData = configuration.Image,\n tilesUrl = imageData.Url,\n fileFormat = imageData.Format,\n sizeData = imageData.Size,\n dispRectData = imageData.DisplayRect || [],\n width = parseInt( sizeData.Width, 10 ),\n height = parseInt( sizeData.Height, 10 ),\n tileSize = parseInt( imageData.TileSize, 10 ),\n tileOverlap = parseInt( imageData.Overlap, 10 ),\n displayRects = [],\n rectData,\n i;\n\n //TODO: need to figure out out to better handle image format compatibility\n // which actually includes additional file formats like xml and pdf\n // and plain text for various tilesource implementations to avoid low\n // level errors.\n //\n // For now, just don't perform the check.\n //\n /*if ( !imageFormatSupported( fileFormat ) ) {\n throw new Error(\n $.getString( \"Errors.ImageFormat\", fileFormat.toUpperCase() )\n );\n }*/\n\n for ( i = 0; i < dispRectData.length; i++ ) {\n rectData = dispRectData[ i ].Rect;\n\n displayRects.push( new $.DisplayRect(\n parseInt( rectData.X, 10 ),\n parseInt( rectData.Y, 10 ),\n parseInt( rectData.Width, 10 ),\n parseInt( rectData.Height, 10 ),\n parseInt( rectData.MinLevel, 10 ),\n parseInt( rectData.MaxLevel, 10 )\n ));\n }\n\n return $.extend(true, {\n width: width, /* width *required */\n height: height, /* height *required */\n tileSize: tileSize, /* tileSize *required */\n tileOverlap: tileOverlap, /* tileOverlap *required */\n minLevel: null, /* minLevel */\n maxLevel: null, /* maxLevel */\n tilesUrl: tilesUrl, /* tilesUrl */\n fileFormat: fileFormat, /* fileFormat */\n displayRects: displayRects /* displayRects */\n }, configuration );\n\n}\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - IIIFTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class IIIFTileSource\n * @classdesc A client implementation of the International Image Interoperability Framework\n * Format: Image API 1.0 - 2.1\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @see http://iiif.io/api/image/\n * @param {String} [options.tileFormat='jpg']\n * The extension that will be used when requiring tiles.\n */\n$.IIIFTileSource = function( options ){\n\n /* eslint-disable camelcase */\n\n $.extend( true, this, options );\n\n if ( !( this.height && this.width && this['@id'] ) ) {\n throw new Error( 'IIIF required parameters not provided.' );\n }\n\n options.tileSizePerScaleFactor = {};\n\n this.tileFormat = this.tileFormat || 'jpg';\n\n this.version = options.version;\n\n // N.B. 2.0 renamed scale_factors to scaleFactors\n if ( this.tile_width && this.tile_height ) {\n options.tileWidth = this.tile_width;\n options.tileHeight = this.tile_height;\n } else if ( this.tile_width ) {\n options.tileSize = this.tile_width;\n } else if ( this.tile_height ) {\n options.tileSize = this.tile_height;\n } else if ( this.tiles ) {\n // Version 2.0 forwards\n if ( this.tiles.length === 1 ) {\n options.tileWidth = this.tiles[0].width;\n // Use height if provided, otherwise assume square tiles and use width.\n options.tileHeight = this.tiles[0].height || this.tiles[0].width;\n this.scale_factors = this.tiles[0].scaleFactors;\n } else {\n // Multiple tile sizes at different levels\n this.scale_factors = [];\n for (var t = 0; t < this.tiles.length; t++ ) {\n for (var sf = 0; sf < this.tiles[t].scaleFactors.length; sf++) {\n var scaleFactor = this.tiles[t].scaleFactors[sf];\n this.scale_factors.push(scaleFactor);\n options.tileSizePerScaleFactor[scaleFactor] = {\n width: this.tiles[t].width,\n height: this.tiles[t].height || this.tiles[t].width\n };\n }\n }\n }\n } else if ( canBeTiled(options) ) {\n // use the largest of tileOptions that is smaller than the short dimension\n var shortDim = Math.min( this.height, this.width ),\n tileOptions = [256, 512, 1024],\n smallerTiles = [];\n\n for ( var c = 0; c < tileOptions.length; c++ ) {\n if ( tileOptions[c] <= shortDim ) {\n smallerTiles.push( tileOptions[c] );\n }\n }\n\n if ( smallerTiles.length > 0 ) {\n options.tileSize = Math.max.apply( null, smallerTiles );\n } else {\n // If we're smaller than 256, just use the short side.\n options.tileSize = shortDim;\n }\n } else if (this.sizes && this.sizes.length > 0) {\n // This info.json can't be tiled, but we can still construct a legacy pyramid from the sizes array.\n // In this mode, IIIFTileSource will call functions from the abstract baseTileSource or the\n // LegacyTileSource instead of performing IIIF tiling.\n this.emulateLegacyImagePyramid = true;\n\n options.levels = constructLevels( this );\n // use the largest available size to define tiles\n $.extend( true, options, {\n width: options.levels[ options.levels.length - 1 ].width,\n height: options.levels[ options.levels.length - 1 ].height,\n tileSize: Math.max( options.height, options.width ),\n tileOverlap: 0,\n minLevel: 0,\n maxLevel: options.levels.length - 1\n });\n this.levels = options.levels;\n } else {\n $.console.error(\"Nothing in the info.json to construct image pyramids from\");\n }\n\n if (!options.maxLevel && !this.emulateLegacyImagePyramid) {\n if (!this.scale_factors) {\n options.maxLevel = Number(Math.ceil(Math.log(Math.max(this.width, this.height), 2)));\n } else {\n var maxScaleFactor = Math.max.apply(null, this.scale_factors);\n options.maxLevel = Math.round(Math.log(maxScaleFactor) * Math.LOG2E);\n }\n }\n\n $.TileSource.apply( this, [ options ] );\n};\n\n$.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.IIIFTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n\n supports: function( data, url ) {\n // Version 2.0 and forwards\n if (data.protocol && data.protocol === 'http://iiif.io/api/image') {\n return true;\n // Version 1.1\n } else if ( data['@context'] && (\n data['@context'] === \"http://library.stanford.edu/iiif/image-api/1.1/context.json\" ||\n data['@context'] === \"http://iiif.io/api/image/1/context.json\") ) {\n // N.B. the iiif.io context is wrong, but where the representation lives so likely to be used\n return true;\n\n // Version 1.0\n } else if ( data.profile &&\n data.profile.indexOf(\"http://library.stanford.edu/iiif/image-api/compliance.html\") === 0) {\n return true;\n } else if ( data.identifier && data.width && data.height ) {\n return true;\n } else if ( data.documentElement &&\n \"info\" === data.documentElement.tagName &&\n \"http://library.stanford.edu/iiif/image-api/ns/\" ===\n data.documentElement.namespaceURI) {\n return true;\n\n // Not IIIF\n } else {\n return false;\n }\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @example IIIF 1.1 Info Looks like this\n * {\n * \"@context\" : \"http://library.stanford.edu/iiif/image-api/1.1/context.json\",\n * \"@id\" : \"http://iiif.example.com/prefix/1E34750D-38DB-4825-A38A-B60A345E591C\",\n * \"width\" : 6000,\n * \"height\" : 4000,\n * \"scale_factors\" : [ 1, 2, 4 ],\n * \"tile_width\" : 1024,\n * \"tile_height\" : 1024,\n * \"formats\" : [ \"jpg\", \"png\" ],\n * \"qualities\" : [ \"native\", \"grey\" ],\n * \"profile\" : \"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0\"\n * }\n */\n configure: function( data, url ){\n // Try to deduce our version and fake it upwards if needed\n if ( !$.isPlainObject(data) ) {\n var options = configureFromXml10( data );\n options['@context'] = \"http://iiif.io/api/image/1.0/context.json\";\n options['@id'] = url.replace('/info.xml', '');\n options.version = 1;\n return options;\n } else {\n if ( !data['@context'] ) {\n data['@context'] = 'http://iiif.io/api/image/1.0/context.json';\n data['@id'] = url.replace('/info.json', '');\n data.version = 1;\n } else {\n var context = data['@context'];\n if (Array.isArray(context)) {\n for (var i = 0; i < context.length; i++) {\n if (typeof context[i] === 'string' &&\n ( /^http:\\/\\/iiif\\.io\\/api\\/image\\/[1-3]\\/context\\.json$/.test(context[i]) ||\n context[i] === 'http://library.stanford.edu/iiif/image-api/1.1/context.json' ) ) {\n context = context[i];\n break;\n }\n }\n }\n switch (context) {\n case 'http://iiif.io/api/image/1/context.json':\n case 'http://library.stanford.edu/iiif/image-api/1.1/context.json':\n data.version = 1;\n break;\n case 'http://iiif.io/api/image/2/context.json':\n data.version = 2;\n break;\n case 'http://iiif.io/api/image/3/context.json':\n data.version = 3;\n break;\n default:\n $.console.error('Data has a @context property which contains no known IIIF context URI.');\n }\n }\n if ( !data['@id'] && data['id'] ) {\n data['@id'] = data['id'];\n }\n if(data.preferredFormats) {\n for (var f = 0; f < data.preferredFormats.length; f++ ) {\n if ( OpenSeadragon.imageFormatSupported(data.preferredFormats[f]) ) {\n data.tileFormat = data.preferredFormats[f];\n break;\n }\n }\n }\n return data;\n }\n },\n\n /**\n * Return the tileWidth for the given level.\n * @function\n * @param {Number} level\n */\n getTileWidth: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n return $.TileSource.prototype.getTileWidth.call(this, level);\n }\n\n var scaleFactor = Math.pow(2, this.maxLevel - level);\n\n if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {\n return this.tileSizePerScaleFactor[scaleFactor].width;\n }\n return this._tileWidth;\n },\n\n /**\n * Return the tileHeight for the given level.\n * @function\n * @param {Number} level\n */\n getTileHeight: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n return $.TileSource.prototype.getTileHeight.call(this, level);\n }\n\n var scaleFactor = Math.pow(2, this.maxLevel - level);\n\n if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {\n return this.tileSizePerScaleFactor[scaleFactor].height;\n }\n return this._tileHeight;\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function ( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n var levelScale = NaN;\n if (this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel) {\n levelScale =\n this.levels[level].width /\n this.levels[this.maxLevel].width;\n }\n return levelScale;\n }\n\n return $.TileSource.prototype.getLevelScale.call(this, level);\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n var scale = this.getLevelScale(level);\n if (scale) {\n return new $.Point(1, 1);\n } else {\n return new $.Point(0, 0);\n }\n }\n\n return $.TileSource.prototype.getNumTiles.call(this, level);\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {OpenSeadragon.Point} point\n */\n getTileAtPoint: function( level, point ) {\n\n if(this.emulateLegacyImagePyramid) {\n return new $.Point(0, 0);\n }\n\n return $.TileSource.prototype.getTileAtPoint.call(this, level, point);\n },\n\n\n /**\n * Responsible for retrieving the url which will return an image for the\n * region specified by the given x, y, and level components.\n * @function\n * @param {Number} level - z index\n * @param {Number} x\n * @param {Number} y\n * @throws {Error}\n */\n getTileUrl: function( level, x, y ){\n\n if(this.emulateLegacyImagePyramid) {\n var url = null;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n url = this.levels[ level ].url;\n }\n return url;\n }\n\n //# constants\n var IIIF_ROTATION = '0',\n //## get the scale (level as a decimal)\n scale = Math.pow( 0.5, this.maxLevel - level ),\n\n //# image dimensions at this level\n levelWidth = Math.ceil( this.width * scale ),\n levelHeight = Math.ceil( this.height * scale ),\n\n //## iiif region\n tileWidth,\n tileHeight,\n iiifTileSizeWidth,\n iiifTileSizeHeight,\n iiifRegion,\n iiifTileX,\n iiifTileY,\n iiifTileW,\n iiifTileH,\n iiifSize,\n iiifSizeW,\n iiifSizeH,\n iiifQuality,\n uri;\n\n tileWidth = this.getTileWidth(level);\n tileHeight = this.getTileHeight(level);\n iiifTileSizeWidth = Math.ceil( tileWidth / scale );\n iiifTileSizeHeight = Math.ceil( tileHeight / scale );\n if (this.version === 1) {\n iiifQuality = \"native.\" + this.tileFormat;\n } else {\n iiifQuality = \"default.\" + this.tileFormat;\n }\n if ( levelWidth < tileWidth && levelHeight < tileHeight ){\n if ( this.version === 2 && levelWidth === this.width ) {\n iiifSize = \"full\";\n } else if ( this.version === 3 && levelWidth === this.width && levelHeight === this.height ) {\n iiifSize = \"max\";\n } else if ( this.version === 3 ) {\n iiifSize = levelWidth + \",\" + levelHeight;\n } else {\n iiifSize = levelWidth + \",\";\n }\n iiifRegion = 'full';\n } else {\n iiifTileX = x * iiifTileSizeWidth;\n iiifTileY = y * iiifTileSizeHeight;\n iiifTileW = Math.min( iiifTileSizeWidth, this.width - iiifTileX );\n iiifTileH = Math.min( iiifTileSizeHeight, this.height - iiifTileY );\n if ( x === 0 && y === 0 && iiifTileW === this.width && iiifTileH === this.height ) {\n iiifRegion = \"full\";\n } else {\n iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' );\n }\n iiifSizeW = Math.ceil( iiifTileW * scale );\n iiifSizeH = Math.ceil( iiifTileH * scale );\n if ( this.version === 2 && iiifSizeW === this.width ) {\n iiifSize = \"full\";\n } else if ( this.version === 3 && iiifSizeW === this.width && iiifSizeH === this.height ) {\n iiifSize = \"max\";\n } else if (this.version === 3) {\n iiifSize = iiifSizeW + \",\" + iiifSizeH;\n } else {\n iiifSize = iiifSizeW + \",\";\n }\n }\n uri = [ this['@id'], iiifRegion, iiifSize, IIIF_ROTATION, iiifQuality ].join( '/' );\n\n return uri;\n },\n\n __testonly__: {\n canBeTiled: canBeTiled,\n constructLevels: constructLevels\n }\n\n });\n\n /**\n * Determine whether arbitrary tile requests can be made against a service with the given profile\n * @function\n * @param {array} profile - IIIF profile array\n * @throws {Error}\n */\n function canBeTiled ( options ) {\n var level0Profiles = [\n \"http://library.stanford.edu/iiif/image-api/compliance.html#level0\",\n \"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0\",\n \"http://iiif.io/api/image/2/level0.json\",\n \"level0\",\n \"https://iiif.io/api/image/3/level0.json\"\n ];\n var profileLevel = Array.isArray(options.profile) ? options.profile[0] : options.profile;\n var isLevel0 = (level0Profiles.indexOf(profileLevel) !== -1);\n var hasCanoncicalSizeFeature = false;\n if ( options.version === 2 && options.profile.length > 1 && options.profile[1].supports ) {\n hasCanoncicalSizeFeature = options.profile[1].supports.indexOf( \"sizeByW\" ) !== -1;\n }\n if ( options.version === 3 && options.extraFeatures ) {\n hasCanoncicalSizeFeature = options.extraFeatures.indexOf( \"sizeByWh\" ) !== -1;\n }\n return !isLevel0 || hasCanoncicalSizeFeature;\n }\n\n /**\n * Build the legacy pyramid URLs (one tile per level)\n * @function\n * @param {object} options - infoJson\n * @throws {Error}\n */\n function constructLevels(options) {\n var levels = [];\n for(var i = 0; i < options.sizes.length; i++) {\n levels.push({\n url: options['@id'] + '/full/' + options.sizes[i].width + ',' +\n (options.version === 3 ? options.sizes[i].height : '') +\n '/0/default.' + options.tileFormat,\n width: options.sizes[i].width,\n height: options.sizes[i].height\n });\n }\n return levels.sort(function(a, b) {\n return a.width - b.width;\n });\n }\n\n\n function configureFromXml10(xmlDoc) {\n //parse the xml\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.tagName,\n configuration = null;\n\n if ( rootName === \"info\" ) {\n try {\n configuration = {};\n parseXML10( root, configuration );\n return configuration;\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( $.getString(\"Errors.IIIF\") );\n }\n }\n throw new Error( $.getString( \"Errors.IIIF\" ) );\n }\n\n function parseXML10( node, configuration, property ) {\n var i,\n value;\n if ( node.nodeType === 3 && property ) {//text node\n value = node.nodeValue.trim();\n if( value.match(/^\\d*$/)){\n value = Number( value );\n }\n if( !configuration[ property ] ){\n configuration[ property ] = value;\n }else{\n if( !$.isArray( configuration[ property ] ) ){\n configuration[ property ] = [ configuration[ property ] ];\n }\n configuration[ property ].push( value );\n }\n } else if( node.nodeType === 1 ){\n for( i = 0; i < node.childNodes.length; i++ ){\n parseXML10( node.childNodes[ i ], configuration, node.nodeName );\n }\n }\n }\n\n\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - OsmTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Derived from the OSM tile source in Rainer Simon's seajax-utils project\n * . Rainer Simon has contributed\n * the included code to the OpenSeadragon project under the New BSD license;\n * see .\n */\n\n\n(function( $ ){\n\n/**\n * @class OsmTileSource\n * @classdesc A tilesource implementation for OpenStreetMap.

    \n *\n * Note 1. Zoomlevels. Deep Zoom and OSM define zoom levels differently. In Deep\n * Zoom, level 0 equals an image of 1x1 pixels. In OSM, level 0 equals an image of\n * 256x256 levels (see http://gasi.ch/blog/inside-deep-zoom-2). I.e. there is a\n * difference of log2(256)=8 levels.

    \n *\n * Note 2. Image dimension. According to the OSM Wiki\n * (http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Zoom_levels)\n * the highest Mapnik zoom level has 256.144x256.144 tiles, with a 256x256\n * pixel size. I.e. the Deep Zoom image dimension is 65.572.864x65.572.864\n * pixels.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n */\n$.OsmTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) {\n var options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[0],\n height: arguments[1],\n tileSize: arguments[2],\n tileOverlap: arguments[3],\n tilesUrl: arguments[4]\n };\n }\n //apply default setting for standard public OpenStreatMaps service\n //but allow them to be specified so fliks can host there own instance\n //or apply against other services supportting the same standard\n if( !options.width || !options.height ){\n options.width = 65572864;\n options.height = 65572864;\n }\n if( !options.tileSize ){\n options.tileSize = 256;\n options.tileOverlap = 0;\n }\n if( !options.tilesUrl ){\n options.tilesUrl = \"http://tile.openstreetmap.org/\";\n }\n options.minLevel = 8;\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.OsmTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.OsmTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return (\n data.type &&\n \"openstreetmaps\" === data.type\n );\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @param {String} url - the url the data was retrieved from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url ){\n return data;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n return this.tilesUrl + (level - 8) + \"/\" + x + \"/\" + y + \".png\";\n }\n});\n\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - TmsTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Derived from the TMS tile source in Rainer Simon's seajax-utils project\n * . Rainer Simon has contributed\n * the included code to the OpenSeadragon project under the New BSD license;\n * see .\n */\n\n\n(function( $ ){\n\n/**\n * @class TmsTileSource\n * @classdesc A tilesource implementation for Tiled Map Services (TMS).\n * TMS tile scheme ( [ as supported by OpenLayers ] is described here\n * ( http://openlayers.org/dev/examples/tms.html ).\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n */\n$.TmsTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) {\n var options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[0],\n height: arguments[1],\n tileSize: arguments[2],\n tileOverlap: arguments[3],\n tilesUrl: arguments[4]\n };\n }\n // TMS has integer multiples of 256 for width/height and adds buffer\n // if necessary -> account for this!\n var bufferedWidth = Math.ceil(options.width / 256) * 256,\n bufferedHeight = Math.ceil(options.height / 256) * 256,\n max;\n\n // Compute number of zoomlevels in this tileset\n if (bufferedWidth > bufferedHeight) {\n max = bufferedWidth / 256;\n } else {\n max = bufferedHeight / 256;\n }\n options.maxLevel = Math.ceil(Math.log(max) / Math.log(2)) - 1;\n options.tileSize = 256;\n options.width = bufferedWidth;\n options.height = bufferedHeight;\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.TmsTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.TmsTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return ( data.type && \"tiledmapservice\" === data.type );\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @param {String} url - the url the data was retrieved from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url ){\n return data;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n // Convert from Deep Zoom definition to TMS zoom definition\n var yTiles = this.getNumTiles( level ).y - 1;\n\n return this.tilesUrl + level + \"/\" + x + \"/\" + (yTiles - y) + \".png\";\n }\n});\n\n\n}( OpenSeadragon ));\n\n(function($) {\n\n /**\n * @class ZoomifyTileSource\n * @classdesc A tilesource implementation for the zoomify format.\n *\n * A description of the format can be found here:\n * https://ecommons.cornell.edu/bitstream/handle/1813/5410/Introducing_Zoomify_Image.pdf\n *\n * There are two ways of creating a zoomify tilesource for openseadragon\n *\n * 1) Supplying all necessary information in the tilesource object. A minimal example object for this method looks like this:\n *\n * {\n * type: \"zoomifytileservice\",\n * width: 1000,\n * height: 1000,\n * tilesUrl: \"/test/data/zoomify/\"\n * }\n *\n * The tileSize is set to 256 (the usual Zoomify default) when it is not defined. The tileUrl must the path to the image _directory_.\n *\n * 2) Loading image metadata from xml file: (CURRENTLY NOT SUPPORTED)\n *\n * When creating zoomify formatted images one \"xml\" like file with name ImageProperties.xml\n * will be created as well. Here is an example of such a file:\n *\n * \n *\n * To use this xml file as metadata source you must supply the path to the ImageProperties.xml file and leave out all other parameters:\n * As stated above, this method of loading a zoomify tilesource is currently not supported\n *\n * {\n * type: \"zoomifytileservice\",\n * tilesUrl: \"/test/data/zoomify/ImageProperties.xml\"\n * }\n\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number} width - the pixel width of the image.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {String} tilesUrl\n */\n $.ZoomifyTileSource = function(options) {\n if(typeof options.tileSize === 'undefined'){\n options.tileSize = 256;\n }\n\n if(typeof options.fileFormat === 'undefined'){\n options.fileFormat = 'jpg';\n this.fileFormat = options.fileFormat;\n }\n\n var currentImageSize = {\n x: options.width,\n y: options.height\n };\n options.imageSizes = [{\n x: options.width,\n y: options.height\n }];\n options.gridSize = [this._getGridSize(options.width, options.height, options.tileSize)];\n\n while (parseInt(currentImageSize.x, 10) > options.tileSize || parseInt(currentImageSize.y, 10) > options.tileSize) {\n currentImageSize.x = Math.floor(currentImageSize.x / 2);\n currentImageSize.y = Math.floor(currentImageSize.y / 2);\n options.imageSizes.push({\n x: currentImageSize.x,\n y: currentImageSize.y\n });\n options.gridSize.push(this._getGridSize(currentImageSize.x, currentImageSize.y, options.tileSize));\n }\n options.imageSizes.reverse();\n options.gridSize.reverse();\n options.minLevel = 0;\n options.maxLevel = options.gridSize.length - 1;\n\n OpenSeadragon.TileSource.apply(this, [options]);\n };\n\n $.extend($.ZoomifyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ZoomifyTileSource.prototype */ {\n\n //private\n _getGridSize: function(width, height, tileSize) {\n return {\n x: Math.ceil(width / tileSize),\n y: Math.ceil(height / tileSize)\n };\n },\n\n //private\n _calculateAbsoluteTileNumber: function(level, x, y) {\n var num = 0;\n var size = {};\n\n //Sum up all tiles below the level we want the number of tiles\n for (var z = 0; z < level; z++) {\n size = this.gridSize[z];\n num += size.x * size.y;\n }\n //Add the tiles of the level\n size = this.gridSize[level];\n num += size.x * y + x;\n return num;\n },\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function(data, url) {\n return (data.type && \"zoomifytileservice\" === data.type);\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @param {String} url - the url the data was retrieved from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function(data, url) {\n return data;\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function(level, x, y) {\n //console.log(level);\n var result = 0;\n var num = this._calculateAbsoluteTileNumber(level, x, y);\n result = Math.floor(num / 256);\n return this.tilesUrl + 'TileGroup' + result + '/' + level + '-' + x + '-' + y + '.' + this.fileFormat;\n\n }\n });\n\n}(OpenSeadragon));\n\n\n/*\n * OpenSeadragon - LegacyTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class LegacyTileSource\n * @classdesc The LegacyTileSource allows simple, traditional image pyramids to be loaded\n * into an OpenSeadragon Viewer. Basically, this translates to the historically\n * common practice of starting with a 'master' image, maybe a tiff for example,\n * and generating a set of 'service' images like one or more thumbnails, a medium\n * resolution image and a high resolution image in standard web formats like\n * png or jpg.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Array} levels An array of file descriptions, each is an object with\n * a 'url', a 'width', and a 'height'. Overriding classes can expect more\n * properties but these properties are sufficient for this implementation.\n * Additionally, the levels are required to be listed in order from\n * smallest to largest.\n * @property {Number} aspectRatio\n * @property {Number} dimensions\n * @property {Number} tileSize\n * @property {Number} tileOverlap\n * @property {Number} minLevel\n * @property {Number} maxLevel\n * @property {Array} levels\n */\n$.LegacyTileSource = function( levels ) {\n\n var options,\n width,\n height;\n\n if( $.isArray( levels ) ){\n options = {\n type: 'legacy-image-pyramid',\n levels: levels\n };\n }\n\n //clean up the levels to make sure we support all formats\n options.levels = filterFiles( options.levels );\n\n if ( options.levels.length > 0 ) {\n width = options.levels[ options.levels.length - 1 ].width;\n height = options.levels[ options.levels.length - 1 ].height;\n }\n else {\n width = 0;\n height = 0;\n $.console.error( \"No supported image formats found\" );\n }\n\n $.extend( true, options, {\n width: width,\n height: height,\n tileSize: Math.max( height, width ),\n tileOverlap: 0,\n minLevel: 0,\n maxLevel: options.levels.length > 0 ? options.levels.length - 1 : 0\n } );\n\n $.TileSource.apply( this, [ options ] );\n\n this.levels = options.levels;\n};\n\n$.extend( $.LegacyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.LegacyTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return (\n data.type &&\n \"legacy-image-pyramid\" === data.type\n ) || (\n data.documentElement &&\n \"legacy-image-pyramid\" === data.documentElement.getAttribute('type')\n );\n },\n\n\n /**\n *\n * @function\n * @param {Object|XMLDocument} configuration - the raw configuration\n * @param {String} dataUrl - the url the data was retrieved from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( configuration, dataUrl ){\n\n var options;\n\n if( !$.isPlainObject(configuration) ){\n\n options = configureFromXML( this, configuration );\n\n }else{\n\n options = configureFromObject( this, configuration );\n }\n\n return options;\n\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function ( level ) {\n var levelScale = NaN;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n levelScale =\n this.levels[ level ].width /\n this.levels[ this.maxLevel ].width;\n }\n return levelScale;\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n var scale = this.getLevelScale( level );\n if ( scale ){\n return new $.Point( 1, 1 );\n } else {\n return new $.Point( 0, 0 );\n }\n },\n\n /**\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @throws {Error}\n */\n getTileUrl: function ( level, x, y ) {\n var url = null;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n url = this.levels[ level ].url;\n }\n return url;\n }\n} );\n\n/**\n * This method removes any files from the Array which don't conform to our\n * basic requirements for a 'level' in the LegacyTileSource.\n * @private\n * @inner\n * @function\n */\nfunction filterFiles( files ){\n var filtered = [],\n file,\n i;\n for( i = 0; i < files.length; i++ ){\n file = files[ i ];\n if( file.height &&\n file.width &&\n file.url ){\n //This is sufficient to serve as a level\n filtered.push({\n url: file.url,\n width: Number( file.width ),\n height: Number( file.height )\n });\n }\n else {\n $.console.error( 'Unsupported image format: %s', file.url ? file.url : '' );\n }\n }\n\n return filtered.sort(function(a, b) {\n return a.height - b.height;\n });\n\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromXML( tileSource, xmlDoc ){\n\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.tagName,\n conf = null,\n levels = [],\n level,\n i;\n\n if ( rootName === \"image\" ) {\n\n try {\n conf = {\n type: root.getAttribute( \"type\" ),\n levels: []\n };\n\n levels = root.getElementsByTagName( \"level\" );\n for ( i = 0; i < levels.length; i++ ) {\n level = levels[ i ];\n\n conf.levels.push({\n url: level.getAttribute( \"url\" ),\n width: parseInt( level.getAttribute( \"width\" ), 10 ),\n height: parseInt( level.getAttribute( \"height\" ), 10 )\n });\n }\n\n return configureFromObject( tileSource, conf );\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( 'Unknown error parsing Legacy Image Pyramid XML.' );\n }\n } else if ( rootName === \"collection\" ) {\n throw new Error( 'Legacy Image Pyramid Collections not yet supported.' );\n } else if ( rootName === \"error\" ) {\n throw new Error( 'Error: ' + xmlDoc );\n }\n\n throw new Error( 'Unknown element ' + rootName );\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromObject( tileSource, configuration ){\n\n return configuration.levels;\n\n}\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - ImageTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ($) {\n\n /**\n * @class ImageTileSource\n * @classdesc The ImageTileSource allows a simple image to be loaded\n * into an OpenSeadragon Viewer.\n * There are 2 ways to open an ImageTileSource:\n * 1. viewer.open({type: 'image', url: fooUrl});\n * 2. viewer.open(new OpenSeadragon.ImageTileSource({url: fooUrl}));\n *\n * With the first syntax, the crossOriginPolicy, ajaxWithCredentials and\n * useCanvas options are inherited from the viewer if they are not\n * specified directly in the options object.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Object} options Options object.\n * @param {String} options.url URL of the image\n * @param {Boolean} [options.buildPyramid=true] If set to true (default), a\n * pyramid will be built internally to provide a better downsampling.\n * @param {String|Boolean} [options.crossOriginPolicy=false] Valid values are\n * 'Anonymous', 'use-credentials', and false. If false, image requests will\n * not use CORS preventing internal pyramid building for images from other\n * domains.\n * @param {String|Boolean} [options.ajaxWithCredentials=false] Whether to set\n * the withCredentials XHR flag for AJAX requests (when loading tile sources).\n * @param {Boolean} [options.useCanvas=true] Set to false to prevent any use\n * of the canvas API.\n */\n $.ImageTileSource = function (options) {\n\n options = $.extend({\n buildPyramid: true,\n crossOriginPolicy: false,\n ajaxWithCredentials: false,\n useCanvas: true\n }, options);\n $.TileSource.apply(this, [options]);\n\n };\n\n $.extend($.ImageTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ImageTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function (data, url) {\n return data.type && data.type === \"image\";\n },\n /**\n *\n * @function\n * @param {Object} options - the options\n * @param {String} dataUrl - the url the image was retrieved from, if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function (options, dataUrl) {\n return options;\n },\n /**\n * Responsible for retrieving, and caching the\n * image metadata pertinent to this TileSources implementation.\n * @function\n * @param {String} url\n * @throws {Error}\n */\n getImageInfo: function (url) {\n var image = this._image = new Image();\n var _this = this;\n\n if (this.crossOriginPolicy) {\n image.crossOrigin = this.crossOriginPolicy;\n }\n if (this.ajaxWithCredentials) {\n image.useCredentials = this.ajaxWithCredentials;\n }\n\n $.addEvent(image, 'load', function () {\n _this.width = image.naturalWidth;\n _this.height = image.naturalHeight;\n _this.aspectRatio = _this.width / _this.height;\n _this.dimensions = new $.Point(_this.width, _this.height);\n _this._tileWidth = _this.width;\n _this._tileHeight = _this.height;\n _this.tileOverlap = 0;\n _this.minLevel = 0;\n _this.levels = _this._buildLevels();\n _this.maxLevel = _this.levels.length - 1;\n\n _this.ready = true;\n\n // Note: this event is documented elsewhere, in TileSource\n _this.raiseEvent('ready', {tileSource: _this});\n });\n\n $.addEvent(image, 'error', function () {\n // Note: this event is documented elsewhere, in TileSource\n _this.raiseEvent('open-failed', {\n message: \"Error loading image at \" + url,\n source: url\n });\n });\n\n image.src = url;\n },\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function (level) {\n var levelScale = NaN;\n if (level >= this.minLevel && level <= this.maxLevel) {\n levelScale =\n this.levels[level].width /\n this.levels[this.maxLevel].width;\n }\n return levelScale;\n },\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function (level) {\n var scale = this.getLevelScale(level);\n if (scale) {\n return new $.Point(1, 1);\n } else {\n return new $.Point(0, 0);\n }\n },\n /**\n * Retrieves a tile url\n * @function\n * @param {Number} level Level of the tile\n * @param {Number} x x coordinate of the tile\n * @param {Number} y y coordinate of the tile\n */\n getTileUrl: function (level, x, y) {\n var url = null;\n if (level >= this.minLevel && level <= this.maxLevel) {\n url = this.levels[level].url;\n }\n return url;\n },\n /**\n * Retrieves a tile context 2D\n * @function\n * @param {Number} level Level of the tile\n * @param {Number} x x coordinate of the tile\n * @param {Number} y y coordinate of the tile\n */\n getContext2D: function (level, x, y) {\n var context = null;\n if (level >= this.minLevel && level <= this.maxLevel) {\n context = this.levels[level].context2D;\n }\n return context;\n },\n /**\n * Destroys ImageTileSource\n * @function\n */\n destroy: function () {\n this._freeupCanvasMemory();\n },\n\n // private\n //\n // Builds the different levels of the pyramid if possible\n // (i.e. if canvas API enabled and no canvas tainting issue).\n _buildLevels: function () {\n var levels = [{\n url: this._image.src,\n width: this._image.naturalWidth,\n height: this._image.naturalHeight\n }];\n\n if (!this.buildPyramid || !$.supportsCanvas || !this.useCanvas) {\n // We don't need the image anymore. Allows it to be GC.\n delete this._image;\n return levels;\n }\n\n var currentWidth = this._image.naturalWidth;\n var currentHeight = this._image.naturalHeight;\n\n\n var bigCanvas = document.createElement(\"canvas\");\n var bigContext = bigCanvas.getContext(\"2d\");\n\n bigCanvas.width = currentWidth;\n bigCanvas.height = currentHeight;\n bigContext.drawImage(this._image, 0, 0, currentWidth, currentHeight);\n // We cache the context of the highest level because the browser\n // is a lot faster at downsampling something it already has\n // downsampled before.\n levels[0].context2D = bigContext;\n // We don't need the image anymore. Allows it to be GC.\n delete this._image;\n\n if ($.isCanvasTainted(bigCanvas)) {\n // If the canvas is tainted, we can't compute the pyramid.\n return levels;\n }\n\n // We build smaller levels until either width or height becomes\n // 1 pixel wide.\n while (currentWidth >= 2 && currentHeight >= 2) {\n currentWidth = Math.floor(currentWidth / 2);\n currentHeight = Math.floor(currentHeight / 2);\n var smallCanvas = document.createElement(\"canvas\");\n var smallContext = smallCanvas.getContext(\"2d\");\n smallCanvas.width = currentWidth;\n smallCanvas.height = currentHeight;\n smallContext.drawImage(bigCanvas, 0, 0, currentWidth, currentHeight);\n\n levels.splice(0, 0, {\n context2D: smallContext,\n width: currentWidth,\n height: currentHeight\n });\n\n bigCanvas = smallCanvas;\n bigContext = smallContext;\n }\n return levels;\n },\n /**\n * Free up canvas memory\n * (iOS 12 or higher on 2GB RAM device has only 224MB canvas memory,\n * and Safari keeps canvas until its height and width will be set to 0).\n * @function\n */\n _freeupCanvasMemory: function () {\n for (var i = 0; i < this.levels.length; i++) {\n this.levels[i].context2D.canvas.height = 0;\n this.levels[i].context2D.canvas.width = 0;\n }\n },\n });\n\n}(OpenSeadragon));\n\n/*\n * OpenSeadragon - TileSourceCollection\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n// deprecated\n$.TileSourceCollection = function(tileSize, tileSources, rows, layout) {\n $.console.error('TileSourceCollection is deprecated; use World instead');\n};\n\n}(OpenSeadragon));\n\n/*\n * OpenSeadragon - Button\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * An enumeration of button states\n * @member ButtonState\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {Number} REST\n * @property {Number} GROUP\n * @property {Number} HOVER\n * @property {Number} DOWN\n */\n$.ButtonState = {\n REST: 0,\n GROUP: 1,\n HOVER: 2,\n DOWN: 3\n};\n\n/**\n * @class Button\n * @classdesc Manages events, hover states for individual buttons, tool-tips, as well\n * as fading the buttons out when the user has not interacted with them\n * for a specified period.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @param {Object} options\n * @param {Element} [options.element=null] Element to use as the button. If not specified, an HTML <div> element is created.\n * @param {String} [options.tooltip=null] Provides context help for the button when the\n * user hovers over it.\n * @param {String} [options.srcRest=null] URL of image to use in 'rest' state.\n * @param {String} [options.srcGroup=null] URL of image to use in 'up' state.\n * @param {String} [options.srcHover=null] URL of image to use in 'hover' state.\n * @param {String} [options.srcDown=null] URL of image to use in 'down' state.\n * @param {Number} [options.fadeDelay=0] How long to wait before fading.\n * @param {Number} [options.fadeLength=2000] How long should it take to fade the button.\n * @param {OpenSeadragon.EventHandler} [options.onPress=null] Event handler callback for {@link OpenSeadragon.Button.event:press}.\n * @param {OpenSeadragon.EventHandler} [options.onRelease=null] Event handler callback for {@link OpenSeadragon.Button.event:release}.\n * @param {OpenSeadragon.EventHandler} [options.onClick=null] Event handler callback for {@link OpenSeadragon.Button.event:click}.\n * @param {OpenSeadragon.EventHandler} [options.onEnter=null] Event handler callback for {@link OpenSeadragon.Button.event:enter}.\n * @param {OpenSeadragon.EventHandler} [options.onExit=null] Event handler callback for {@link OpenSeadragon.Button.event:exit}.\n * @param {OpenSeadragon.EventHandler} [options.onFocus=null] Event handler callback for {@link OpenSeadragon.Button.event:focus}.\n * @param {OpenSeadragon.EventHandler} [options.onBlur=null] Event handler callback for {@link OpenSeadragon.Button.event:blur}.\n * @param {Object} [options.userData=null] Arbitrary object to be passed unchanged to any attached handler methods.\n */\n$.Button = function( options ) {\n\n var _this = this;\n\n $.EventSource.call( this );\n\n $.extend( true, this, {\n\n tooltip: null,\n srcRest: null,\n srcGroup: null,\n srcHover: null,\n srcDown: null,\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold,\n clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold,\n /**\n * How long to wait before fading.\n * @member {Number} fadeDelay\n * @memberof OpenSeadragon.Button#\n */\n fadeDelay: 0,\n /**\n * How long should it take to fade the button.\n * @member {Number} fadeLength\n * @memberof OpenSeadragon.Button#\n */\n fadeLength: 2000,\n onPress: null,\n onRelease: null,\n onClick: null,\n onEnter: null,\n onExit: null,\n onFocus: null,\n onBlur: null,\n userData: null\n\n }, options );\n\n /**\n * The button element.\n * @member {Element} element\n * @memberof OpenSeadragon.Button#\n */\n this.element = options.element || $.makeNeutralElement(\"div\");\n\n //if the user has specified the element to bind the control to explicitly\n //then do not add the default control images\n if ( !options.element ) {\n this.imgRest = $.makeTransparentImage( this.srcRest );\n this.imgGroup = $.makeTransparentImage( this.srcGroup );\n this.imgHover = $.makeTransparentImage( this.srcHover );\n this.imgDown = $.makeTransparentImage( this.srcDown );\n\n this.imgRest.alt =\n this.imgGroup.alt =\n this.imgHover.alt =\n this.imgDown.alt =\n this.tooltip;\n\n // Allow pointer events to pass through the img elements so implicit\n // pointer capture works on touch devices\n $.setElementPointerEventsNone( this.imgRest );\n $.setElementPointerEventsNone( this.imgGroup );\n $.setElementPointerEventsNone( this.imgHover );\n $.setElementPointerEventsNone( this.imgDown );\n\n this.element.style.position = \"relative\";\n $.setElementTouchActionNone( this.element );\n\n this.imgGroup.style.position =\n this.imgHover.style.position =\n this.imgDown.style.position =\n \"absolute\";\n\n this.imgGroup.style.top =\n this.imgHover.style.top =\n this.imgDown.style.top =\n \"0px\";\n\n this.imgGroup.style.left =\n this.imgHover.style.left =\n this.imgDown.style.left =\n \"0px\";\n\n this.imgHover.style.visibility =\n this.imgDown.style.visibility =\n \"hidden\";\n\n if ($.Browser.vendor === $.BROWSERS.FIREFOX && $.Browser.version < 3) {\n this.imgGroup.style.top =\n this.imgHover.style.top =\n this.imgDown.style.top =\n \"\";\n }\n\n this.element.appendChild( this.imgRest );\n this.element.appendChild( this.imgGroup );\n this.element.appendChild( this.imgHover );\n this.element.appendChild( this.imgDown );\n }\n\n\n this.addHandler(\"press\", this.onPress);\n this.addHandler(\"release\", this.onRelease);\n this.addHandler(\"click\", this.onClick);\n this.addHandler(\"enter\", this.onEnter);\n this.addHandler(\"exit\", this.onExit);\n this.addHandler(\"focus\", this.onFocus);\n this.addHandler(\"blur\", this.onBlur);\n\n /**\n * The button's current state.\n * @member {OpenSeadragon.ButtonState} currentState\n * @memberof OpenSeadragon.Button#\n */\n this.currentState = $.ButtonState.GROUP;\n\n // When the button last began to fade.\n this.fadeBeginTime = null;\n // Whether this button should fade after user stops interacting with the viewport.\n this.shouldFade = false;\n\n this.element.style.display = \"inline-block\";\n this.element.style.position = \"relative\";\n this.element.title = this.tooltip;\n\n /**\n * Tracks mouse/touch/key events on the button.\n * @member {OpenSeadragon.MouseTracker} tracker\n * @memberof OpenSeadragon.Button#\n */\n this.tracker = new $.MouseTracker({\n\n userData: 'Button.tracker',\n element: this.element,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n\n enterHandler: function( event ) {\n if ( event.insideElementPressed ) {\n inTo( _this, $.ButtonState.DOWN );\n /**\n * Raised when the cursor enters the Button element.\n *\n * @event enter\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"enter\", { originalEvent: event.originalEvent } );\n } else if ( !event.buttonDownAny ) {\n inTo( _this, $.ButtonState.HOVER );\n }\n },\n\n focusHandler: function ( event ) {\n _this.tracker.enterHandler( event );\n /**\n * Raised when the Button element receives focus.\n *\n * @event focus\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"focus\", { originalEvent: event.originalEvent } );\n },\n\n leaveHandler: function( event ) {\n outTo( _this, $.ButtonState.GROUP );\n if ( event.insideElementPressed ) {\n /**\n * Raised when the cursor leaves the Button element.\n *\n * @event exit\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"exit\", { originalEvent: event.originalEvent } );\n }\n },\n\n blurHandler: function ( event ) {\n _this.tracker.leaveHandler( event );\n /**\n * Raised when the Button element loses focus.\n *\n * @event blur\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"blur\", { originalEvent: event.originalEvent } );\n },\n\n pressHandler: function ( event ) {\n inTo( _this, $.ButtonState.DOWN );\n /**\n * Raised when a mouse button is pressed or touch occurs in the Button element.\n *\n * @event press\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"press\", { originalEvent: event.originalEvent } );\n },\n\n releaseHandler: function( event ) {\n if ( event.insideElementPressed && event.insideElementReleased ) {\n outTo( _this, $.ButtonState.HOVER );\n /**\n * Raised when the mouse button is released or touch ends in the Button element.\n *\n * @event release\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"release\", { originalEvent: event.originalEvent } );\n } else if ( event.insideElementPressed ) {\n outTo( _this, $.ButtonState.GROUP );\n } else {\n inTo( _this, $.ButtonState.HOVER );\n }\n },\n\n clickHandler: function( event ) {\n if ( event.quick ) {\n /**\n * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold.\n *\n * @event click\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent(\"click\", { originalEvent: event.originalEvent });\n }\n },\n\n keyHandler: function( event ){\n //console.log( \"%s : handling key %s!\", _this.tooltip, event.keyCode);\n if( 13 === event.keyCode ){\n /***\n * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold.\n *\n * @event click\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"click\", { originalEvent: event.originalEvent } );\n /***\n * Raised when the mouse button is released or touch ends in the Button element.\n *\n * @event release\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"release\", { originalEvent: event.originalEvent } );\n\n event.preventDefault = true;\n } else{\n event.preventDefault = false;\n }\n }\n\n });\n\n outTo( this, $.ButtonState.REST );\n};\n\n$.extend( $.Button.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.Button.prototype */{\n\n /**\n * Used by a button container element (e.g. a ButtonGroup) to transition the button state\n * to ButtonState.GROUP.\n * @function\n */\n notifyGroupEnter: function() {\n inTo( this, $.ButtonState.GROUP );\n },\n\n /**\n * Used by a button container element (e.g. a ButtonGroup) to transition the button state\n * to ButtonState.REST.\n * @function\n */\n notifyGroupExit: function() {\n outTo( this, $.ButtonState.REST );\n },\n\n /**\n * @function\n */\n disable: function(){\n this.notifyGroupExit();\n this.element.disabled = true;\n $.setElementOpacity( this.element, 0.2, true );\n },\n\n /**\n * @function\n */\n enable: function(){\n this.element.disabled = false;\n $.setElementOpacity( this.element, 1.0, true );\n this.notifyGroupEnter();\n },\n\n destroy: function() {\n if (this.imgRest) {\n this.element.removeChild(this.imgRest);\n this.imgRest = null;\n }\n if (this.imgGroup) {\n this.element.removeChild(this.imgGroup);\n this.imgGroup = null;\n }\n if (this.imgHover) {\n this.element.removeChild(this.imgHover);\n this.imgHover = null;\n }\n if (this.imgDown) {\n this.element.removeChild(this.imgDown);\n this.imgDown = null;\n }\n this.removeAllHandlers();\n this.tracker.destroy();\n this.element = null;\n }\n\n});\n\n\nfunction scheduleFade( button ) {\n $.requestAnimationFrame(function(){\n updateFade( button );\n });\n}\n\nfunction updateFade( button ) {\n var currentTime,\n deltaTime,\n opacity;\n\n if ( button.shouldFade ) {\n currentTime = $.now();\n deltaTime = currentTime - button.fadeBeginTime;\n opacity = 1.0 - deltaTime / button.fadeLength;\n opacity = Math.min( 1.0, opacity );\n opacity = Math.max( 0.0, opacity );\n\n if( button.imgGroup ){\n $.setElementOpacity( button.imgGroup, opacity, true );\n }\n if ( opacity > 0 ) {\n // fade again\n scheduleFade( button );\n }\n }\n}\n\nfunction beginFading( button ) {\n button.shouldFade = true;\n button.fadeBeginTime = $.now() + button.fadeDelay;\n window.setTimeout( function(){\n scheduleFade( button );\n }, button.fadeDelay );\n}\n\nfunction stopFading( button ) {\n button.shouldFade = false;\n if( button.imgGroup ){\n $.setElementOpacity( button.imgGroup, 1.0, true );\n }\n}\n\nfunction inTo( button, newState ) {\n\n if( button.element.disabled ){\n return;\n }\n\n if ( newState >= $.ButtonState.GROUP &&\n button.currentState === $.ButtonState.REST ) {\n stopFading( button );\n button.currentState = $.ButtonState.GROUP;\n }\n\n if ( newState >= $.ButtonState.HOVER &&\n button.currentState === $.ButtonState.GROUP ) {\n if( button.imgHover ){\n button.imgHover.style.visibility = \"\";\n }\n button.currentState = $.ButtonState.HOVER;\n }\n\n if ( newState >= $.ButtonState.DOWN &&\n button.currentState === $.ButtonState.HOVER ) {\n if( button.imgDown ){\n button.imgDown.style.visibility = \"\";\n }\n button.currentState = $.ButtonState.DOWN;\n }\n}\n\n\nfunction outTo( button, newState ) {\n\n if( button.element.disabled ){\n return;\n }\n\n if ( newState <= $.ButtonState.HOVER &&\n button.currentState === $.ButtonState.DOWN ) {\n if( button.imgDown ){\n button.imgDown.style.visibility = \"hidden\";\n }\n button.currentState = $.ButtonState.HOVER;\n }\n\n if ( newState <= $.ButtonState.GROUP &&\n button.currentState === $.ButtonState.HOVER ) {\n if( button.imgHover ){\n button.imgHover.style.visibility = \"hidden\";\n }\n button.currentState = $.ButtonState.GROUP;\n }\n\n if ( newState <= $.ButtonState.REST &&\n button.currentState === $.ButtonState.GROUP ) {\n beginFading( button );\n button.currentState = $.ButtonState.REST;\n }\n}\n\n\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - ButtonGroup\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n/**\n * @class ButtonGroup\n * @classdesc Manages events on groups of buttons.\n *\n * @memberof OpenSeadragon\n * @param {Object} options - A dictionary of settings applied against the entire group of buttons.\n * @param {Array} options.buttons Array of buttons\n * @param {Element} [options.element] Element to use as the container\n **/\n$.ButtonGroup = function( options ) {\n\n $.extend( true, this, {\n /**\n * An array containing the buttons themselves.\n * @member {Array} buttons\n * @memberof OpenSeadragon.ButtonGroup#\n */\n buttons: [],\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold,\n clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold,\n labelText: \"\"\n }, options );\n\n // copy the button elements TODO: Why?\n var buttons = this.buttons.concat([]),\n _this = this,\n i;\n\n /**\n * The shared container for the buttons.\n * @member {Element} element\n * @memberof OpenSeadragon.ButtonGroup#\n */\n this.element = options.element || $.makeNeutralElement( \"div\" );\n\n // TODO What if there IS an options.group specified?\n if( !options.group ){\n this.element.style.display = \"inline-block\";\n //this.label = $.makeNeutralElement( \"label\" );\n //TODO: support labels for ButtonGroups\n //this.label.innerHTML = this.labelText;\n //this.element.appendChild( this.label );\n for ( i = 0; i < buttons.length; i++ ) {\n this.element.appendChild( buttons[ i ].element );\n }\n }\n\n $.setElementTouchActionNone( this.element );\n\n /**\n * Tracks mouse/touch/key events across the group of buttons.\n * @member {OpenSeadragon.MouseTracker} tracker\n * @memberof OpenSeadragon.ButtonGroup#\n */\n this.tracker = new $.MouseTracker({\n userData: 'ButtonGroup.tracker',\n element: this.element,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n enterHandler: function ( event ) {\n var i;\n for ( i = 0; i < _this.buttons.length; i++ ) {\n _this.buttons[ i ].notifyGroupEnter();\n }\n },\n leaveHandler: function ( event ) {\n var i;\n if ( !event.insideElementPressed ) {\n for ( i = 0; i < _this.buttons.length; i++ ) {\n _this.buttons[ i ].notifyGroupExit();\n }\n }\n },\n });\n};\n\n/** @lends OpenSeadragon.ButtonGroup.prototype */\n$.ButtonGroup.prototype = {\n\n /**\n * TODO: Figure out why this is used on the public API and if a more useful\n * api can be created.\n * @function\n * @private\n */\n emulateEnter: function() {\n this.tracker.enterHandler( { eventSource: this.tracker } );\n },\n\n /**\n * TODO: Figure out why this is used on the public API and if a more useful\n * api can be created.\n * @function\n * @private\n */\n emulateLeave: function() {\n this.tracker.leaveHandler( { eventSource: this.tracker } );\n },\n\n destroy: function() {\n while (this.buttons.length) {\n var button = this.buttons.pop();\n this.element.removeChild(button.element);\n button.destroy();\n }\n this.tracker.destroy();\n this.element = null;\n }\n};\n\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - Rect\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n/**\n * @class Rect\n * @classdesc A Rectangle is described by it top left coordinates (x, y), width,\n * height and degrees of rotation around (x, y).\n * Note that the coordinate system used is the one commonly used with images:\n * x increases when going to the right\n * y increases when going to the bottom\n * degrees increases clockwise with 0 being the horizontal\n *\n * The constructor normalizes the rectangle to always have 0 <= degrees < 90\n *\n * @memberof OpenSeadragon\n * @param {Number} [x=0] The vector component 'x'.\n * @param {Number} [y=0] The vector component 'y'.\n * @param {Number} [width=0] The vector component 'width'.\n * @param {Number} [height=0] The vector component 'height'.\n * @param {Number} [degrees=0] Rotation of the rectangle around (x,y) in degrees.\n */\n$.Rect = function(x, y, width, height, degrees) {\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Rect#\n */\n this.x = typeof (x) === \"number\" ? x : 0;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Rect#\n */\n this.y = typeof (y) === \"number\" ? y : 0;\n /**\n * The vector component 'width'.\n * @member {Number} width\n * @memberof OpenSeadragon.Rect#\n */\n this.width = typeof (width) === \"number\" ? width : 0;\n /**\n * The vector component 'height'.\n * @member {Number} height\n * @memberof OpenSeadragon.Rect#\n */\n this.height = typeof (height) === \"number\" ? height : 0;\n\n /**\n * The rotation of the rectangle, in degrees.\n * @member {Number} degrees\n * @memberof OpenSeadragon.Rect#\n */\n this.degrees = typeof (degrees) === \"number\" ? degrees : 0;\n\n // Normalizes the rectangle.\n this.degrees = $.positiveModulo(this.degrees, 360);\n var newTopLeft, newWidth;\n if (this.degrees >= 270) {\n newTopLeft = this.getTopRight();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n newWidth = this.height;\n this.height = this.width;\n this.width = newWidth;\n this.degrees -= 270;\n } else if (this.degrees >= 180) {\n newTopLeft = this.getBottomRight();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n this.degrees -= 180;\n } else if (this.degrees >= 90) {\n newTopLeft = this.getBottomLeft();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n newWidth = this.height;\n this.height = this.width;\n this.width = newWidth;\n this.degrees -= 90;\n }\n};\n\n/**\n * Builds a rectangle having the 3 specified points as summits.\n * @static\n * @memberof OpenSeadragon.Rect\n * @param {OpenSeadragon.Point} topLeft\n * @param {OpenSeadragon.Point} topRight\n * @param {OpenSeadragon.Point} bottomLeft\n * @returns {OpenSeadragon.Rect}\n */\n$.Rect.fromSummits = function(topLeft, topRight, bottomLeft) {\n var width = topLeft.distanceTo(topRight);\n var height = topLeft.distanceTo(bottomLeft);\n var diff = topRight.minus(topLeft);\n var radians = Math.atan(diff.y / diff.x);\n if (diff.x < 0) {\n radians += Math.PI;\n } else if (diff.y < 0) {\n radians += 2 * Math.PI;\n }\n return new $.Rect(\n topLeft.x,\n topLeft.y,\n width,\n height,\n radians / Math.PI * 180);\n};\n\n/** @lends OpenSeadragon.Rect.prototype */\n$.Rect.prototype = {\n /**\n * @function\n * @returns {OpenSeadragon.Rect} a duplicate of this Rect\n */\n clone: function() {\n return new $.Rect(\n this.x,\n this.y,\n this.width,\n this.height,\n this.degrees);\n },\n\n /**\n * The aspect ratio is simply the ratio of width to height.\n * @function\n * @returns {Number} The ratio of width to height.\n */\n getAspectRatio: function() {\n return this.width / this.height;\n },\n\n /**\n * Provides the coordinates of the upper-left corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the upper-left corner of\n * the rectangle.\n */\n getTopLeft: function() {\n return new $.Point(\n this.x,\n this.y\n );\n },\n\n /**\n * Provides the coordinates of the bottom-right corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the bottom-right corner of\n * the rectangle.\n */\n getBottomRight: function() {\n return new $.Point(this.x + this.width, this.y + this.height)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Provides the coordinates of the top-right corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the top-right corner of\n * the rectangle.\n */\n getTopRight: function() {\n return new $.Point(this.x + this.width, this.y)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Provides the coordinates of the bottom-left corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the bottom-left corner of\n * the rectangle.\n */\n getBottomLeft: function() {\n return new $.Point(this.x, this.y + this.height)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Computes the center of the rectangle.\n * @function\n * @returns {OpenSeadragon.Point} The center of the rectangle as represented\n * as represented by a 2-dimensional vector (x,y)\n */\n getCenter: function() {\n return new $.Point(\n this.x + this.width / 2.0,\n this.y + this.height / 2.0\n ).rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Returns the width and height component as a vector OpenSeadragon.Point\n * @function\n * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the\n * the width and height of the rectangle.\n */\n getSize: function() {\n return new $.Point(this.width, this.height);\n },\n\n /**\n * Determines if two Rectangles have equivalent components.\n * @function\n * @param {OpenSeadragon.Rect} rectangle The Rectangle to compare to.\n * @return {Boolean} 'true' if all components are equal, otherwise 'false'.\n */\n equals: function(other) {\n return (other instanceof $.Rect) &&\n this.x === other.x &&\n this.y === other.y &&\n this.width === other.width &&\n this.height === other.height &&\n this.degrees === other.degrees;\n },\n\n /**\n * Multiply all dimensions (except degrees) in this Rect by a factor and\n * return a new Rect.\n * @function\n * @param {Number} factor The factor to multiply vector components.\n * @returns {OpenSeadragon.Rect} A new rect representing the multiplication\n * of the vector components by the factor\n */\n times: function(factor) {\n return new $.Rect(\n this.x * factor,\n this.y * factor,\n this.width * factor,\n this.height * factor,\n this.degrees);\n },\n\n /**\n * Translate/move this Rect by a vector and return new Rect.\n * @function\n * @param {OpenSeadragon.Point} delta The translation vector.\n * @returns {OpenSeadragon.Rect} A new rect with altered position\n */\n translate: function(delta) {\n return new $.Rect(\n this.x + delta.x,\n this.y + delta.y,\n this.width,\n this.height,\n this.degrees);\n },\n\n /**\n * Returns the smallest rectangle that will contain this and the given\n * rectangle bounding boxes.\n * @param {OpenSeadragon.Rect} rect\n * @return {OpenSeadragon.Rect} The new rectangle.\n */\n union: function(rect) {\n var thisBoundingBox = this.getBoundingBox();\n var otherBoundingBox = rect.getBoundingBox();\n\n var left = Math.min(thisBoundingBox.x, otherBoundingBox.x);\n var top = Math.min(thisBoundingBox.y, otherBoundingBox.y);\n var right = Math.max(\n thisBoundingBox.x + thisBoundingBox.width,\n otherBoundingBox.x + otherBoundingBox.width);\n var bottom = Math.max(\n thisBoundingBox.y + thisBoundingBox.height,\n otherBoundingBox.y + otherBoundingBox.height);\n\n return new $.Rect(\n left,\n top,\n right - left,\n bottom - top);\n },\n\n /**\n * Returns the bounding box of the intersection of this rectangle with the\n * given rectangle.\n * @param {OpenSeadragon.Rect} rect\n * @return {OpenSeadragon.Rect} the bounding box of the intersection\n * or null if the rectangles don't intersect.\n */\n intersection: function(rect) {\n // Simplified version of Weiler Atherton clipping algorithm\n // https://en.wikipedia.org/wiki/Weiler%E2%80%93Atherton_clipping_algorithm\n // Because we just want the bounding box of the intersection,\n // we can just compute the bounding box of:\n // 1. all the summits of this which are inside rect\n // 2. all the summits of rect which are inside this\n // 3. all the intersections of rect and this\n var EPSILON = 0.0000000001;\n\n var intersectionPoints = [];\n\n var thisTopLeft = this.getTopLeft();\n if (rect.containsPoint(thisTopLeft, EPSILON)) {\n intersectionPoints.push(thisTopLeft);\n }\n var thisTopRight = this.getTopRight();\n if (rect.containsPoint(thisTopRight, EPSILON)) {\n intersectionPoints.push(thisTopRight);\n }\n var thisBottomLeft = this.getBottomLeft();\n if (rect.containsPoint(thisBottomLeft, EPSILON)) {\n intersectionPoints.push(thisBottomLeft);\n }\n var thisBottomRight = this.getBottomRight();\n if (rect.containsPoint(thisBottomRight, EPSILON)) {\n intersectionPoints.push(thisBottomRight);\n }\n\n var rectTopLeft = rect.getTopLeft();\n if (this.containsPoint(rectTopLeft, EPSILON)) {\n intersectionPoints.push(rectTopLeft);\n }\n var rectTopRight = rect.getTopRight();\n if (this.containsPoint(rectTopRight, EPSILON)) {\n intersectionPoints.push(rectTopRight);\n }\n var rectBottomLeft = rect.getBottomLeft();\n if (this.containsPoint(rectBottomLeft, EPSILON)) {\n intersectionPoints.push(rectBottomLeft);\n }\n var rectBottomRight = rect.getBottomRight();\n if (this.containsPoint(rectBottomRight, EPSILON)) {\n intersectionPoints.push(rectBottomRight);\n }\n\n var thisSegments = this._getSegments();\n var rectSegments = rect._getSegments();\n for (var i = 0; i < thisSegments.length; i++) {\n var thisSegment = thisSegments[i];\n for (var j = 0; j < rectSegments.length; j++) {\n var rectSegment = rectSegments[j];\n var intersect = getIntersection(thisSegment[0], thisSegment[1],\n rectSegment[0], rectSegment[1]);\n if (intersect) {\n intersectionPoints.push(intersect);\n }\n }\n }\n\n // Get intersection point of segments [a,b] and [c,d]\n function getIntersection(a, b, c, d) {\n // http://stackoverflow.com/a/1968345/1440403\n var abVector = b.minus(a);\n var cdVector = d.minus(c);\n\n var denom = -cdVector.x * abVector.y + abVector.x * cdVector.y;\n if (denom === 0) {\n return null;\n }\n\n var s = (abVector.x * (a.y - c.y) - abVector.y * (a.x - c.x)) / denom;\n var t = (cdVector.x * (a.y - c.y) - cdVector.y * (a.x - c.x)) / denom;\n\n if (-EPSILON <= s && s <= 1 - EPSILON &&\n -EPSILON <= t && t <= 1 - EPSILON) {\n return new $.Point(a.x + t * abVector.x, a.y + t * abVector.y);\n }\n return null;\n }\n\n if (intersectionPoints.length === 0) {\n return null;\n }\n\n var minX = intersectionPoints[0].x;\n var maxX = intersectionPoints[0].x;\n var minY = intersectionPoints[0].y;\n var maxY = intersectionPoints[0].y;\n for (var k = 1; k < intersectionPoints.length; k++) {\n var point = intersectionPoints[k];\n if (point.x < minX) {\n minX = point.x;\n }\n if (point.x > maxX) {\n maxX = point.x;\n }\n if (point.y < minY) {\n minY = point.y;\n }\n if (point.y > maxY) {\n maxY = point.y;\n }\n }\n return new $.Rect(minX, minY, maxX - minX, maxY - minY);\n },\n\n // private\n _getSegments: function() {\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var bottomRight = this.getBottomRight();\n return [[topLeft, topRight],\n [topRight, bottomRight],\n [bottomRight, bottomLeft],\n [bottomLeft, topLeft]];\n },\n\n /**\n * Rotates a rectangle around a point.\n * @function\n * @param {Number} degrees The angle in degrees to rotate.\n * @param {OpenSeadragon.Point} [pivot] The point about which to rotate.\n * Defaults to the center of the rectangle.\n * @return {OpenSeadragon.Rect}\n */\n rotate: function(degrees, pivot) {\n degrees = $.positiveModulo(degrees, 360);\n if (degrees === 0) {\n return this.clone();\n }\n\n pivot = pivot || this.getCenter();\n var newTopLeft = this.getTopLeft().rotate(degrees, pivot);\n var newTopRight = this.getTopRight().rotate(degrees, pivot);\n\n var diff = newTopRight.minus(newTopLeft);\n // Handle floating point error\n diff = diff.apply(function(x) {\n var EPSILON = 1e-15;\n return Math.abs(x) < EPSILON ? 0 : x;\n });\n var radians = Math.atan(diff.y / diff.x);\n if (diff.x < 0) {\n radians += Math.PI;\n } else if (diff.y < 0) {\n radians += 2 * Math.PI;\n }\n return new $.Rect(\n newTopLeft.x,\n newTopLeft.y,\n this.width,\n this.height,\n radians / Math.PI * 180);\n },\n\n /**\n * Retrieves the smallest horizontal (degrees=0) rectangle which contains\n * this rectangle.\n * @returns {OpenSeadragon.Rect}\n */\n getBoundingBox: function() {\n if (this.degrees === 0) {\n return this.clone();\n }\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var bottomRight = this.getBottomRight();\n var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n return new $.Rect(\n minX,\n minY,\n maxX - minX,\n maxY - minY);\n },\n\n /**\n * Retrieves the smallest horizontal (degrees=0) rectangle which contains\n * this rectangle and has integers x, y, width and height\n * @returns {OpenSeadragon.Rect}\n */\n getIntegerBoundingBox: function() {\n var boundingBox = this.getBoundingBox();\n var x = Math.floor(boundingBox.x);\n var y = Math.floor(boundingBox.y);\n var width = Math.ceil(boundingBox.width + boundingBox.x - x);\n var height = Math.ceil(boundingBox.height + boundingBox.y - y);\n return new $.Rect(x, y, width, height);\n },\n\n /**\n * Determines whether a point is inside this rectangle (edge included).\n * @function\n * @param {OpenSeadragon.Point} point\n * @param {Number} [epsilon=0] the margin of error allowed\n * @returns {Boolean} true if the point is inside this rectangle, false\n * otherwise.\n */\n containsPoint: function(point, epsilon) {\n epsilon = epsilon || 0;\n\n // See http://stackoverflow.com/a/2752754/1440403 for explanation\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var topDiff = topRight.minus(topLeft);\n var leftDiff = bottomLeft.minus(topLeft);\n\n return ((point.x - topLeft.x) * topDiff.x +\n (point.y - topLeft.y) * topDiff.y >= -epsilon) &&\n\n ((point.x - topRight.x) * topDiff.x +\n (point.y - topRight.y) * topDiff.y <= epsilon) &&\n\n ((point.x - topLeft.x) * leftDiff.x +\n (point.y - topLeft.y) * leftDiff.y >= -epsilon) &&\n\n ((point.x - bottomLeft.x) * leftDiff.x +\n (point.y - bottomLeft.y) * leftDiff.y <= epsilon);\n },\n\n /**\n * Provides a string representation of the rectangle which is useful for\n * debugging.\n * @function\n * @returns {String} A string representation of the rectangle.\n */\n toString: function() {\n return \"[\" +\n (Math.round(this.x * 100) / 100) + \", \" +\n (Math.round(this.y * 100) / 100) + \", \" +\n (Math.round(this.width * 100) / 100) + \"x\" +\n (Math.round(this.height * 100) / 100) + \", \" +\n (Math.round(this.degrees * 100) / 100) + \"deg\" +\n \"]\";\n }\n};\n\n\n}(OpenSeadragon));\n\n/*\n * OpenSeadragon - ReferenceStrip\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ( $ ) {\n\n// dictionary from id to private properties\nvar THIS = {};\n\n/**\n * The CollectionDrawer is a reimplementation if the Drawer API that\n * focuses on allowing a viewport to be redefined as a collection\n * of smaller viewports, defined by a clear number of rows and / or\n * columns of which each item in the matrix of viewports has its own\n * source.\n *\n * This idea is a reexpression of the idea of dzi collections\n * which allows a clearer algorithm to reuse the tile sources already\n * supported by OpenSeadragon, in heterogenious or homogenious\n * sequences just like mixed groups already supported by the viewer\n * for the purpose of image sequnces.\n *\n * TODO: The difficult part of this feature is figuring out how to express\n * this functionality as a combination of the functionality already\n * provided by Drawer, Viewport, TileSource, and Navigator. It may\n * require better abstraction at those points in order to efficiently\n * reuse those paradigms.\n */\n/**\n * @class ReferenceStrip\n * @memberof OpenSeadragon\n * @param {Object} options\n */\n$.ReferenceStrip = function ( options ) {\n\n var _this = this,\n viewer = options.viewer,\n viewerSize = $.getElementSize( viewer.element ),\n element,\n style,\n i;\n\n //We may need to create a new element and id if they did not\n //provide the id for the existing element\n if ( !options.id ) {\n options.id = 'referencestrip-' + $.now();\n this.element = $.makeNeutralElement( \"div\" );\n this.element.id = options.id;\n this.element.className = 'referencestrip';\n }\n\n options = $.extend( true, {\n sizeRatio: $.DEFAULT_SETTINGS.referenceStripSizeRatio,\n position: $.DEFAULT_SETTINGS.referenceStripPosition,\n scroll: $.DEFAULT_SETTINGS.referenceStripScroll,\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold\n }, options, {\n element: this.element\n } );\n\n $.extend( this, options );\n //Private state properties\n THIS[this.id] = {\n animating: false\n };\n\n this.minPixelRatio = this.viewer.minPixelRatio;\n\n this.element.tabIndex = 0;\n\n style = this.element.style;\n style.marginTop = '0px';\n style.marginRight = '0px';\n style.marginBottom = '0px';\n style.marginLeft = '0px';\n style.left = '0px';\n style.bottom = '0px';\n style.border = '0px';\n style.background = '#000';\n style.position = 'relative';\n\n $.setElementTouchActionNone( this.element );\n\n $.setElementOpacity( this.element, 0.8 );\n\n this.viewer = viewer;\n this.tracker = new $.MouseTracker( {\n userData: 'ReferenceStrip.tracker',\n element: this.element,\n clickHandler: $.delegate( this, onStripClick ),\n dragHandler: $.delegate( this, onStripDrag ),\n scrollHandler: $.delegate( this, onStripScroll ),\n enterHandler: $.delegate( this, onStripEnter ),\n leaveHandler: $.delegate( this, onStripLeave ),\n keyDownHandler: $.delegate( this, onKeyDown ),\n keyHandler: $.delegate( this, onKeyPress ),\n preProcessEventHandler: function (eventInfo) {\n if (eventInfo.eventType === 'wheel') {\n eventInfo.preventDefault = true;\n }\n }\n } );\n\n //Controls the position and orientation of the reference strip and sets the\n //appropriate width and height\n if ( options.width && options.height ) {\n this.element.style.width = options.width + 'px';\n this.element.style.height = options.height + 'px';\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.BOTTOM_LEFT }\n );\n } else {\n if ( \"horizontal\" === options.scroll ) {\n this.element.style.width = (\n viewerSize.x *\n options.sizeRatio *\n viewer.tileSources.length\n ) + ( 12 * viewer.tileSources.length ) + 'px';\n\n this.element.style.height = (\n viewerSize.y *\n options.sizeRatio\n ) + 'px';\n\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.BOTTOM_LEFT }\n );\n } else {\n this.element.style.height = (\n viewerSize.y *\n options.sizeRatio *\n viewer.tileSources.length\n ) + ( 12 * viewer.tileSources.length ) + 'px';\n\n this.element.style.width = (\n viewerSize.x *\n options.sizeRatio\n ) + 'px';\n\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.TOP_LEFT }\n );\n\n }\n }\n\n this.panelWidth = ( viewerSize.x * this.sizeRatio ) + 8;\n this.panelHeight = ( viewerSize.y * this.sizeRatio ) + 8;\n this.panels = [];\n this.miniViewers = {};\n\n /*jshint loopfunc:true*/\n for ( i = 0; i < viewer.tileSources.length; i++ ) {\n\n element = $.makeNeutralElement( 'div' );\n element.id = this.element.id + \"-\" + i;\n\n element.style.width = _this.panelWidth + 'px';\n element.style.height = _this.panelHeight + 'px';\n element.style.display = 'inline';\n element.style['float'] = 'left'; //Webkit\n element.style.cssFloat = 'left'; //Firefox\n element.style.styleFloat = 'left'; //IE\n element.style.padding = '2px';\n $.setElementTouchActionNone( element );\n $.setElementPointerEventsNone( element );\n\n this.element.appendChild( element );\n\n element.activePanel = false;\n\n this.panels.push( element );\n\n }\n loadPanels( this, this.scroll === 'vertical' ? viewerSize.y : viewerSize.x, 0 );\n this.setFocus( 0 );\n\n};\n\n/** @lends OpenSeadragon.ReferenceStrip.prototype */\n$.ReferenceStrip.prototype = {\n\n /**\n * @function\n */\n setFocus: function ( page ) {\n var element = this.element.querySelector('#' + this.element.id + '-' + page ),\n viewerSize = $.getElementSize( this.viewer.canvas ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n offsetLeft = -Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = -Number( this.element.style.marginTop.replace( 'px', '' ) ),\n offset;\n\n if ( this.currentSelected !== element ) {\n if ( this.currentSelected ) {\n this.currentSelected.style.background = '#000';\n }\n this.currentSelected = element;\n this.currentSelected.style.background = '#999';\n\n if ( 'horizontal' === this.scroll ) {\n //right left\n offset = ( Number( page ) ) * ( this.panelWidth + 3 );\n if ( offset > offsetLeft + viewerSize.x - this.panelWidth ) {\n offset = Math.min( offset, ( scrollWidth - viewerSize.x ) );\n this.element.style.marginLeft = -offset + 'px';\n loadPanels( this, viewerSize.x, -offset );\n } else if ( offset < offsetLeft ) {\n offset = Math.max( 0, offset - viewerSize.x / 2 );\n this.element.style.marginLeft = -offset + 'px';\n loadPanels( this, viewerSize.x, -offset );\n }\n } else {\n offset = ( Number( page ) ) * ( this.panelHeight + 3 );\n if ( offset > offsetTop + viewerSize.y - this.panelHeight ) {\n offset = Math.min( offset, ( scrollHeight - viewerSize.y ) );\n this.element.style.marginTop = -offset + 'px';\n loadPanels( this, viewerSize.y, -offset );\n } else if ( offset < offsetTop ) {\n offset = Math.max( 0, offset - viewerSize.y / 2 );\n this.element.style.marginTop = -offset + 'px';\n loadPanels( this, viewerSize.y, -offset );\n }\n }\n\n this.currentPage = page;\n onStripEnter.call( this, { eventSource: this.tracker } );\n }\n },\n\n /**\n * @function\n */\n update: function () {\n if ( THIS[this.id].animating ) {\n $.console.log( 'image reference strip update' );\n return true;\n }\n return false;\n },\n\n destroy: function() {\n if (this.miniViewers) {\n for (var key in this.miniViewers) {\n this.miniViewers[key].destroy();\n }\n }\n\n this.tracker.destroy();\n\n if (this.element) {\n this.viewer.removeControl( this.element );\n }\n }\n\n};\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripClick( event ) {\n if ( event.quick ) {\n var page;\n\n if ( 'horizontal' === this.scroll ) {\n page = Math.floor(event.position.x / this.panelWidth);\n } else {\n page = Math.floor(event.position.y / this.panelHeight);\n }\n\n this.viewer.goToPage( page );\n }\n\n this.element.focus();\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripDrag( event ) {\n\n this.dragging = true;\n if ( this.element ) {\n var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n viewerSize = $.getElementSize( this.viewer.canvas );\n\n if ( 'horizontal' === this.scroll ) {\n if ( -event.delta.x > 0 ) {\n //forward\n if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) {\n this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) );\n }\n } else if ( -event.delta.x < 0 ) {\n //reverse\n if ( offsetLeft < 0 ) {\n this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) );\n }\n }\n } else {\n if ( -event.delta.y > 0 ) {\n //forward\n if ( offsetTop > -( scrollHeight - viewerSize.y ) ) {\n this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) );\n }\n } else if ( -event.delta.y < 0 ) {\n //reverse\n if ( offsetTop < 0 ) {\n this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) );\n }\n }\n }\n }\n\n}\n\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripScroll( event ) {\n if ( this.element ) {\n var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n viewerSize = $.getElementSize( this.viewer.canvas );\n\n if ( 'horizontal' === this.scroll ) {\n if ( event.scroll > 0 ) {\n //forward\n if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) {\n this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) );\n }\n } else if ( event.scroll < 0 ) {\n //reverse\n if ( offsetLeft < 0 ) {\n this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) );\n }\n }\n } else {\n if ( event.scroll < 0 ) {\n //scroll up\n if ( offsetTop > viewerSize.y - scrollHeight ) {\n this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) );\n }\n } else if ( event.scroll > 0 ) {\n //scroll dowm\n if ( offsetTop < 0 ) {\n this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) );\n }\n }\n }\n\n event.preventDefault = true;\n }\n}\n\n\nfunction loadPanels( strip, viewerSize, scroll ) {\n var panelSize,\n activePanelsStart,\n activePanelsEnd,\n miniViewer,\n i,\n element;\n if ( 'horizontal' === strip.scroll ) {\n panelSize = strip.panelWidth;\n } else {\n panelSize = strip.panelHeight;\n }\n activePanelsStart = Math.ceil( viewerSize / panelSize ) + 5;\n activePanelsEnd = Math.ceil( ( Math.abs( scroll ) + viewerSize ) / panelSize ) + 1;\n activePanelsStart = activePanelsEnd - activePanelsStart;\n activePanelsStart = activePanelsStart < 0 ? 0 : activePanelsStart;\n\n for ( i = activePanelsStart; i < activePanelsEnd && i < strip.panels.length; i++ ) {\n element = strip.panels[i];\n if ( !element.activePanel ) {\n var miniTileSource;\n var originalTileSource = strip.viewer.tileSources[i];\n if (originalTileSource.referenceStripThumbnailUrl) {\n miniTileSource = {\n type: 'image',\n url: originalTileSource.referenceStripThumbnailUrl\n };\n } else {\n miniTileSource = originalTileSource;\n }\n miniViewer = new $.Viewer( {\n id: element.id,\n tileSources: [miniTileSource],\n element: element,\n navigatorSizeRatio: strip.sizeRatio,\n showNavigator: false,\n mouseNavEnabled: false,\n showNavigationControl: false,\n showSequenceControl: false,\n immediateRender: true,\n blendTime: 0,\n animationTime: 0,\n loadTilesWithAjax: strip.viewer.loadTilesWithAjax,\n ajaxHeaders: strip.viewer.ajaxHeaders,\n useCanvas: strip.useCanvas\n } );\n // Allow pointer events to pass through miniViewer's canvas/container\n // elements so implicit pointer capture works on touch devices\n $.setElementPointerEventsNone( miniViewer.canvas );\n $.setElementPointerEventsNone( miniViewer.container );\n // We'll use event delegation from the reference strip element instead of\n // handling events on every miniViewer\n miniViewer.innerTracker.setTracking( false );\n miniViewer.outerTracker.setTracking( false );\n\n strip.miniViewers[element.id] = miniViewer;\n\n element.activePanel = true;\n }\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripEnter( event ) {\n var element = event.eventSource.element;\n\n //$.setElementOpacity(element, 0.8);\n\n //element.style.border = '1px solid #555';\n //element.style.background = '#000';\n\n if ( 'horizontal' === this.scroll ) {\n\n //element.style.paddingTop = \"0px\";\n element.style.marginBottom = \"0px\";\n\n } else {\n\n //element.style.paddingRight = \"0px\";\n element.style.marginLeft = \"0px\";\n\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripLeave( event ) {\n var element = event.eventSource.element;\n\n if ( 'horizontal' === this.scroll ) {\n\n //element.style.paddingTop = \"10px\";\n element.style.marginBottom = \"-\" + ( $.getElementSize( element ).y / 2 ) + \"px\";\n\n } else {\n\n //element.style.paddingRight = \"10px\";\n element.style.marginLeft = \"-\" + ( $.getElementSize( element ).x / 2 ) + \"px\";\n\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onKeyDown( event ) {\n //console.log( event.keyCode );\n\n if ( !event.ctrl && !event.alt && !event.meta ) {\n switch ( event.keyCode ) {\n case 38: //up arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n case 40: //down arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 37: //left arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 39: //right arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n event.preventDefault = false;\n break;\n }\n } else {\n event.preventDefault = false;\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onKeyPress( event ) {\n //console.log( event.keyCode );\n\n if ( !event.ctrl && !event.alt && !event.meta ) {\n switch ( event.keyCode ) {\n case 61: //=|+\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n case 45: //-|_\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 48: //0|)\n case 119: //w\n case 87: //W\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n case 115: //s\n case 83: //S\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 97: //a\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 100: //d\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n event.preventDefault = false;\n break;\n }\n } else {\n event.preventDefault = false;\n }\n}\n\n}(OpenSeadragon));\n\n/*\n * OpenSeadragon - DisplayRect\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class DisplayRect\n * @classdesc A display rectangle is very similar to {@link OpenSeadragon.Rect} but adds two\n * fields, 'minLevel' and 'maxLevel' which denote the supported zoom levels\n * for this rectangle.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.Rect\n * @param {Number} x The vector component 'x'.\n * @param {Number} y The vector component 'y'.\n * @param {Number} width The vector component 'height'.\n * @param {Number} height The vector component 'width'.\n * @param {Number} minLevel The lowest zoom level supported.\n * @param {Number} maxLevel The highest zoom level supported.\n */\n$.DisplayRect = function( x, y, width, height, minLevel, maxLevel ) {\n $.Rect.apply( this, [ x, y, width, height ] );\n\n /**\n * The lowest zoom level supported.\n * @member {Number} minLevel\n * @memberof OpenSeadragon.DisplayRect#\n */\n this.minLevel = minLevel;\n /**\n * The highest zoom level supported.\n * @member {Number} maxLevel\n * @memberof OpenSeadragon.DisplayRect#\n */\n this.maxLevel = maxLevel;\n};\n\n$.extend( $.DisplayRect.prototype, $.Rect.prototype );\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - Spring\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Spring\n * @memberof OpenSeadragon\n * @param {Object} options - Spring configuration settings.\n * @param {Number} options.springStiffness - Spring stiffness. Must be greater than zero.\n * The closer to zero, the closer to linear animation.\n * @param {Number} options.animationTime - Animation duration per spring, in seconds.\n * Must be zero or greater.\n * @param {Number} [options.initial=0] - Initial value of spring.\n * @param {Boolean} [options.exponential=false] - Whether this spring represents\n * an exponential scale (such as zoom) and should be animated accordingly. Note that\n * exponential springs must have non-zero values.\n */\n$.Spring = function( options ) {\n var args = arguments;\n\n if( typeof ( options ) !== 'object' ){\n //allows backward compatible use of ( initialValue, config ) as\n //constructor parameters\n options = {\n initial: args.length && typeof ( args[ 0 ] ) === \"number\" ?\n args[ 0 ] :\n undefined,\n /**\n * Spring stiffness.\n * @member {Number} springStiffness\n * @memberof OpenSeadragon.Spring#\n */\n springStiffness: args.length > 1 ?\n args[ 1 ].springStiffness :\n 5.0,\n /**\n * Animation duration per spring.\n * @member {Number} animationTime\n * @memberof OpenSeadragon.Spring#\n */\n animationTime: args.length > 1 ?\n args[ 1 ].animationTime :\n 1.5\n };\n }\n\n $.console.assert(typeof options.springStiffness === \"number\" && options.springStiffness !== 0,\n \"[OpenSeadragon.Spring] options.springStiffness must be a non-zero number\");\n\n $.console.assert(typeof options.animationTime === \"number\" && options.animationTime >= 0,\n \"[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0\");\n\n if (options.exponential) {\n this._exponential = true;\n delete options.exponential;\n }\n\n $.extend( true, this, options);\n\n /**\n * @member {Object} current\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.current = {\n value: typeof ( this.initial ) === \"number\" ?\n this.initial :\n (this._exponential ? 0 : 1),\n time: $.now() // always work in milliseconds\n };\n\n $.console.assert(!this._exponential || this.current.value !== 0,\n \"[OpenSeadragon.Spring] value must be non-zero for exponential springs\");\n\n /**\n * @member {Object} start\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.start = {\n value: this.current.value,\n time: this.current.time\n };\n\n /**\n * @member {Object} target\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.target = {\n value: this.current.value,\n time: this.current.time\n };\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n};\n\n/** @lends OpenSeadragon.Spring.prototype */\n$.Spring.prototype = {\n\n /**\n * @function\n * @param {Number} target\n */\n resetTo: function( target ) {\n $.console.assert(!this._exponential || target !== 0,\n \"[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs\");\n\n this.start.value = this.target.value = this.current.value = target;\n this.start.time = this.target.time = this.current.time = $.now();\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n },\n\n /**\n * @function\n * @param {Number} target\n */\n springTo: function( target ) {\n $.console.assert(!this._exponential || target !== 0,\n \"[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs\");\n\n this.start.value = this.current.value;\n this.start.time = this.current.time;\n this.target.value = target;\n this.target.time = this.start.time + 1000 * this.animationTime;\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n }\n },\n\n /**\n * @function\n * @param {Number} delta\n */\n shiftBy: function( delta ) {\n this.start.value += delta;\n this.target.value += delta;\n\n if (this._exponential) {\n $.console.assert(this.target.value !== 0 && this.start.value !== 0,\n \"[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs\");\n\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n }\n },\n\n setExponential: function(value) {\n this._exponential = value;\n\n if (this._exponential) {\n $.console.assert(this.current.value !== 0 && this.target.value !== 0 && this.start.value !== 0,\n \"[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs\");\n\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n },\n\n /**\n * @function\n * @returns true if the value got updated, false otherwise\n */\n update: function() {\n this.current.time = $.now();\n\n var startValue, targetValue;\n if (this._exponential) {\n startValue = this.start._logValue;\n targetValue = this.target._logValue;\n } else {\n startValue = this.start.value;\n targetValue = this.target.value;\n }\n\n var currentValue = (this.current.time >= this.target.time) ?\n targetValue :\n startValue +\n ( targetValue - startValue ) *\n transform(\n this.springStiffness,\n ( this.current.time - this.start.time ) /\n ( this.target.time - this.start.time )\n );\n\n var oldValue = this.current.value;\n if (this._exponential) {\n this.current.value = Math.exp(currentValue);\n } else {\n this.current.value = currentValue;\n }\n\n return oldValue !== this.current.value;\n },\n\n /**\n * Returns whether the spring is at the target value\n * @function\n * @returns {Boolean} True if at target value, false otherwise\n */\n isAtTargetValue: function() {\n return this.current.value === this.target.value;\n }\n};\n\n/**\n * @private\n */\nfunction transform( stiffness, x ) {\n return ( 1.0 - Math.exp( stiffness * -x ) ) /\n ( 1.0 - Math.exp( -stiffness ) );\n}\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - ImageLoader\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($){\n\n/**\n * @private\n * @class ImageJob\n * @classdesc Handles downloading of a single image.\n * @param {Object} options - Options for this ImageJob.\n * @param {String} [options.src] - URL of image to download.\n * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX.\n * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX.\n * @param {String} [options.crossOriginPolicy] - CORS policy to use for downloads\n * @param {Function} [options.callback] - Called once image has been downloaded.\n * @param {Function} [options.abort] - Called when this image job is aborted.\n * @param {Number} [options.timeout] - The max number of milliseconds that this image job may take to complete.\n */\nfunction ImageJob (options) {\n\n $.extend(true, this, {\n timeout: $.DEFAULT_SETTINGS.timeout,\n jobId: null\n }, options);\n\n /**\n * Image object which will contain downloaded image.\n * @member {Image} image\n * @memberof OpenSeadragon.ImageJob#\n */\n this.image = null;\n}\n\nImageJob.prototype = {\n errorMsg: null,\n\n /**\n * Starts the image job.\n * @method\n */\n start: function(){\n var self = this;\n var selfAbort = this.abort;\n\n this.image = new Image();\n\n this.image.onload = function(){\n self.finish(true);\n };\n this.image.onabort = this.image.onerror = function() {\n self.errorMsg = \"Image load aborted\";\n self.finish(false);\n };\n\n this.jobId = window.setTimeout(function(){\n self.errorMsg = \"Image load exceeded timeout (\" + self.timeout + \" ms)\";\n self.finish(false);\n }, this.timeout);\n\n // Load the tile with an AJAX request if the loadWithAjax option is\n // set. Otherwise load the image by setting the source proprety of the image object.\n if (this.loadWithAjax) {\n this.request = $.makeAjaxRequest({\n url: this.src,\n withCredentials: this.ajaxWithCredentials,\n headers: this.ajaxHeaders,\n responseType: \"arraybuffer\",\n success: function(request) {\n var blb;\n // Make the raw data into a blob.\n // BlobBuilder fallback adapted from\n // http://stackoverflow.com/questions/15293694/blob-constructor-browser-compatibility\n try {\n blb = new window.Blob([request.response]);\n } catch (e) {\n var BlobBuilder = (\n window.BlobBuilder ||\n window.WebKitBlobBuilder ||\n window.MozBlobBuilder ||\n window.MSBlobBuilder\n );\n if (e.name === 'TypeError' && BlobBuilder) {\n var bb = new BlobBuilder();\n bb.append(request.response);\n blb = bb.getBlob();\n }\n }\n // If the blob is empty for some reason consider the image load a failure.\n if (blb.size === 0) {\n self.errorMsg = \"Empty image response.\";\n self.finish(false);\n }\n // Create a URL for the blob data and make it the source of the image object.\n // This will still trigger Image.onload to indicate a successful tile load.\n var url = (window.URL || window.webkitURL).createObjectURL(blb);\n self.image.src = url;\n },\n error: function(request) {\n self.errorMsg = \"Image load aborted - XHR error\";\n self.finish(false);\n }\n });\n\n // Provide a function to properly abort the request.\n this.abort = function() {\n self.request.abort();\n\n // Call the existing abort function if available\n if (typeof selfAbort === \"function\") {\n selfAbort();\n }\n };\n } else {\n if (this.crossOriginPolicy !== false) {\n this.image.crossOrigin = this.crossOriginPolicy;\n }\n\n this.image.src = this.src;\n }\n },\n\n finish: function(successful) {\n this.image.onload = this.image.onerror = this.image.onabort = null;\n if (!successful) {\n this.image = null;\n }\n\n if (this.jobId) {\n window.clearTimeout(this.jobId);\n }\n\n this.callback(this);\n }\n\n};\n\n/**\n * @class ImageLoader\n * @memberof OpenSeadragon\n * @classdesc Handles downloading of a set of images using asynchronous queue pattern.\n * You generally won't have to interact with the ImageLoader directly.\n * @param {Object} options - Options for this ImageLoader.\n * @param {Number} [options.jobLimit] - The number of concurrent image requests. See imageLoaderLimit in {@link OpenSeadragon.Options} for details.\n * @param {Number} [options.timeout] - The max number of milliseconds that an image job may take to complete.\n */\n$.ImageLoader = function(options) {\n\n $.extend(true, this, {\n jobLimit: $.DEFAULT_SETTINGS.imageLoaderLimit,\n timeout: $.DEFAULT_SETTINGS.timeout,\n jobQueue: [],\n jobsInProgress: 0\n }, options);\n\n};\n\n/** @lends OpenSeadragon.ImageLoader.prototype */\n$.ImageLoader.prototype = {\n\n /**\n * Add an unloaded image to the loader queue.\n * @method\n * @param {Object} options - Options for this job.\n * @param {String} [options.src] - URL of image to download.\n * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX.\n * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX.\n * @param {String|Boolean} [options.crossOriginPolicy] - CORS policy to use for downloads\n * @param {Boolean} [options.ajaxWithCredentials] - Whether to set withCredentials on AJAX\n * requests.\n * @param {Function} [options.callback] - Called once image has been downloaded.\n * @param {Function} [options.abort] - Called when this image job is aborted.\n */\n addJob: function(options) {\n var _this = this,\n complete = function(job) {\n completeJob(_this, job, options.callback);\n },\n jobOptions = {\n src: options.src,\n loadWithAjax: options.loadWithAjax,\n ajaxHeaders: options.loadWithAjax ? options.ajaxHeaders : null,\n crossOriginPolicy: options.crossOriginPolicy,\n ajaxWithCredentials: options.ajaxWithCredentials,\n callback: complete,\n abort: options.abort,\n timeout: this.timeout\n },\n newJob = new ImageJob(jobOptions);\n\n if ( !this.jobLimit || this.jobsInProgress < this.jobLimit ) {\n newJob.start();\n this.jobsInProgress++;\n }\n else {\n this.jobQueue.push( newJob );\n }\n },\n\n /**\n * Clear any unstarted image loading jobs from the queue.\n * @method\n */\n clear: function() {\n for( var i = 0; i < this.jobQueue.length; i++ ) {\n var job = this.jobQueue[i];\n if ( typeof job.abort === \"function\" ) {\n job.abort();\n }\n }\n\n this.jobQueue = [];\n }\n};\n\n/**\n * Cleans up ImageJob once completed.\n * @method\n * @private\n * @param loader - ImageLoader used to start job.\n * @param job - The ImageJob that has completed.\n * @param callback - Called once cleanup is finished.\n */\nfunction completeJob(loader, job, callback) {\n var nextJob;\n\n loader.jobsInProgress--;\n\n if ((!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.jobQueue.length > 0) {\n nextJob = loader.jobQueue.shift();\n nextJob.start();\n loader.jobsInProgress++;\n }\n\n callback(job.image, job.errorMsg, job.request);\n}\n\n}(OpenSeadragon));\n\n/*\n * OpenSeadragon - Tile\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Tile\n * @memberof OpenSeadragon\n * @param {Number} level The zoom level this tile belongs to.\n * @param {Number} x The vector component 'x'.\n * @param {Number} y The vector component 'y'.\n * @param {OpenSeadragon.Rect} bounds Where this tile fits, in normalized\n * coordinates.\n * @param {Boolean} exists Is this tile a part of a sparse image? ( Also has\n * this tile failed to load? )\n * @param {String} url The URL of this tile's image.\n * @param {CanvasRenderingContext2D} context2D The context2D of this tile if it\n * is provided directly by the tile source.\n * @param {Boolean} loadWithAjax Whether this tile image should be loaded with an AJAX request .\n * @param {Object} ajaxHeaders The headers to send with this tile's AJAX request (if applicable).\n * @param {OpenSeadragon.Rect} sourceBounds The portion of the tile to use as the source of the\n * drawing operation, in pixels. Note that this only works when drawing with canvas; when drawing\n * with HTML the entire tile is always used.\n */\n$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders, sourceBounds) {\n /**\n * The zoom level this tile belongs to.\n * @member {Number} level\n * @memberof OpenSeadragon.Tile#\n */\n this.level = level;\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Tile#\n */\n this.x = x;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Tile#\n */\n this.y = y;\n /**\n * Where this tile fits, in normalized coordinates\n * @member {OpenSeadragon.Rect} bounds\n * @memberof OpenSeadragon.Tile#\n */\n this.bounds = bounds;\n /**\n * The portion of the tile to use as the source of the drawing operation, in pixels. Note that\n * this only works when drawing with canvas; when drawing with HTML the entire tile is always used.\n * @member {OpenSeadragon.Rect} sourceBounds\n * @memberof OpenSeadragon.Tile#\n */\n this.sourceBounds = sourceBounds;\n /**\n * Is this tile a part of a sparse image? Also has this tile failed to load?\n * @member {Boolean} exists\n * @memberof OpenSeadragon.Tile#\n */\n this.exists = exists;\n /**\n * The URL of this tile's image.\n * @member {String} url\n * @memberof OpenSeadragon.Tile#\n */\n this.url = url;\n /**\n * The context2D of this tile if it is provided directly by the tile source.\n * @member {CanvasRenderingContext2D} context2D\n * @memberOf OpenSeadragon.Tile#\n */\n this.context2D = context2D;\n /**\n * Whether to load this tile's image with an AJAX request.\n * @member {Boolean} loadWithAjax\n * @memberof OpenSeadragon.Tile#\n */\n this.loadWithAjax = loadWithAjax;\n /**\n * The headers to be used in requesting this tile's image.\n * Only used if loadWithAjax is set to true.\n * @member {Object} ajaxHeaders\n * @memberof OpenSeadragon.Tile#\n */\n this.ajaxHeaders = ajaxHeaders;\n /**\n * The unique cache key for this tile.\n * @member {String} cacheKey\n * @memberof OpenSeadragon.Tile#\n */\n if (this.ajaxHeaders) {\n this.cacheKey = this.url + \"+\" + JSON.stringify(this.ajaxHeaders);\n } else {\n this.cacheKey = this.url;\n }\n /**\n * Is this tile loaded?\n * @member {Boolean} loaded\n * @memberof OpenSeadragon.Tile#\n */\n this.loaded = false;\n /**\n * Is this tile loading?\n * @member {Boolean} loading\n * @memberof OpenSeadragon.Tile#\n */\n this.loading = false;\n\n /**\n * The HTML div element for this tile\n * @member {Element} element\n * @memberof OpenSeadragon.Tile#\n */\n this.element = null;\n /**\n * The HTML img element for this tile.\n * @member {Element} imgElement\n * @memberof OpenSeadragon.Tile#\n */\n this.imgElement = null;\n /**\n * The Image object for this tile.\n * @member {Object} image\n * @memberof OpenSeadragon.Tile#\n */\n this.image = null;\n\n /**\n * The alias of this.element.style.\n * @member {String} style\n * @memberof OpenSeadragon.Tile#\n */\n this.style = null;\n /**\n * This tile's position on screen, in pixels.\n * @member {OpenSeadragon.Point} position\n * @memberof OpenSeadragon.Tile#\n */\n this.position = null;\n /**\n * This tile's size on screen, in pixels.\n * @member {OpenSeadragon.Point} size\n * @memberof OpenSeadragon.Tile#\n */\n this.size = null;\n /**\n * Whether to flip the tile when rendering.\n * @member {Boolean} flipped\n * @memberof OpenSeadragon.Tile#\n */\n this.flipped = false;\n /**\n * The start time of this tile's blending.\n * @member {Number} blendStart\n * @memberof OpenSeadragon.Tile#\n */\n this.blendStart = null;\n /**\n * The current opacity this tile should be.\n * @member {Number} opacity\n * @memberof OpenSeadragon.Tile#\n */\n this.opacity = null;\n /**\n * The squared distance of this tile to the viewport center.\n * Use for comparing tiles.\n * @private\n * @member {Number} squaredDistance\n * @memberof OpenSeadragon.Tile#\n */\n this.squaredDistance = null;\n /**\n * The visibility score of this tile.\n * @member {Number} visibility\n * @memberof OpenSeadragon.Tile#\n */\n this.visibility = null;\n\n /**\n * Whether this tile is currently being drawn.\n * @member {Boolean} beingDrawn\n * @memberof OpenSeadragon.Tile#\n */\n this.beingDrawn = false;\n\n /**\n * Timestamp the tile was last touched.\n * @member {Number} lastTouchTime\n * @memberof OpenSeadragon.Tile#\n */\n this.lastTouchTime = 0;\n\n /**\n * Whether this tile is in the right-most column for its level.\n * @member {Boolean} isRightMost\n * @memberof OpenSeadragon.Tile#\n */\n this.isRightMost = false;\n\n /**\n * Whether this tile is in the bottom-most row for its level.\n * @member {Boolean} isBottomMost\n * @memberof OpenSeadragon.Tile#\n */\n this.isBottomMost = false;\n};\n\n/** @lends OpenSeadragon.Tile.prototype */\n$.Tile.prototype = {\n\n /**\n * Provides a string representation of this tiles level and (x,y)\n * components.\n * @function\n * @returns {String}\n */\n toString: function() {\n return this.level + \"/\" + this.x + \"_\" + this.y;\n },\n\n // private\n _hasTransparencyChannel: function() {\n return !!this.context2D || this.url.match('.png');\n },\n\n /**\n * Renders the tile in an html container.\n * @function\n * @param {Element} container\n */\n drawHTML: function( container ) {\n if (!this.cacheImageRecord) {\n $.console.warn(\n '[Tile.drawHTML] attempting to draw tile %s when it\\'s not cached',\n this.toString());\n return;\n }\n\n if ( !this.loaded ) {\n $.console.warn(\n \"Attempting to draw tile %s when it's not yet loaded.\",\n this.toString()\n );\n return;\n }\n\n //EXPERIMENTAL - trying to figure out how to scale the container\n // content during animation of the container size.\n\n if ( !this.element ) {\n this.element = $.makeNeutralElement( \"div\" );\n this.imgElement = this.cacheImageRecord.getImage().cloneNode();\n this.imgElement.style.msInterpolationMode = \"nearest-neighbor\";\n this.imgElement.style.width = \"100%\";\n this.imgElement.style.height = \"100%\";\n\n this.style = this.element.style;\n this.style.position = \"absolute\";\n }\n if ( this.element.parentNode !== container ) {\n container.appendChild( this.element );\n }\n if ( this.imgElement.parentNode !== this.element ) {\n this.element.appendChild( this.imgElement );\n }\n\n this.style.top = this.position.y + \"px\";\n this.style.left = this.position.x + \"px\";\n this.style.height = this.size.y + \"px\";\n this.style.width = this.size.x + \"px\";\n\n if (this.flipped) {\n this.style.transform = \"scaleX(-1)\";\n }\n\n $.setElementOpacity( this.element, this.opacity );\n },\n\n /**\n * Renders the tile in a canvas-based context.\n * @function\n * @param {Canvas} context\n * @param {Function} drawingHandler - Method for firing the drawing event.\n * drawingHandler({context, tile, rendered})\n * where rendered is the context with the pre-drawn image.\n * @param {Number} [scale=1] - Apply a scale to position and size\n * @param {OpenSeadragon.Point} [translate] - A translation vector\n */\n drawCanvas: function( context, drawingHandler, scale, translate ) {\n\n var position = this.position.times($.pixelDensityRatio),\n size = this.size.times($.pixelDensityRatio),\n rendered;\n\n if (!this.context2D && !this.cacheImageRecord) {\n $.console.warn(\n '[Tile.drawCanvas] attempting to draw tile %s when it\\'s not cached',\n this.toString());\n return;\n }\n\n rendered = this.context2D || this.cacheImageRecord.getRenderedContext();\n\n if ( !this.loaded || !rendered ){\n $.console.warn(\n \"Attempting to draw tile %s when it's not yet loaded.\",\n this.toString()\n );\n\n return;\n }\n\n context.save();\n\n context.globalAlpha = this.opacity;\n\n if (typeof scale === 'number' && scale !== 1) {\n // draw tile at a different scale\n position = position.times(scale);\n size = size.times(scale);\n }\n\n if (translate instanceof $.Point) {\n // shift tile position slightly\n position = position.plus(translate);\n }\n\n //if we are supposed to be rendering fully opaque rectangle,\n //ie its done fading or fading is turned off, and if we are drawing\n //an image with an alpha channel, then the only way\n //to avoid seeing the tile underneath is to clear the rectangle\n if (context.globalAlpha === 1 && this._hasTransparencyChannel()) {\n //clearing only the inside of the rectangle occupied\n //by the png prevents edge flikering\n context.clearRect(\n position.x,\n position.y,\n size.x,\n size.y\n );\n }\n\n // This gives the application a chance to make image manipulation\n // changes as we are rendering the image\n drawingHandler({context: context, tile: this, rendered: rendered});\n\n var sourceWidth, sourceHeight;\n if (this.sourceBounds) {\n sourceWidth = Math.min(this.sourceBounds.width, rendered.canvas.width);\n sourceHeight = Math.min(this.sourceBounds.height, rendered.canvas.height);\n } else {\n sourceWidth = rendered.canvas.width;\n sourceHeight = rendered.canvas.height;\n }\n\n context.translate(position.x + size.x / 2, 0);\n if (this.flipped) {\n context.scale(-1, 1);\n }\n context.drawImage(\n rendered.canvas,\n 0,\n 0,\n sourceWidth,\n sourceHeight,\n -size.x / 2,\n position.y,\n size.x,\n size.y\n );\n\n context.restore();\n },\n\n /**\n * Get the ratio between current and original size.\n * @function\n * @return {Float}\n */\n getScaleForEdgeSmoothing: function() {\n var context;\n if (this.cacheImageRecord) {\n context = this.cacheImageRecord.getRenderedContext();\n } else if (this.context2D) {\n context = this.context2D;\n } else {\n $.console.warn(\n '[Tile.drawCanvas] attempting to get tile scale %s when tile\\'s not cached',\n this.toString());\n return 1;\n }\n return context.canvas.width / (this.size.x * $.pixelDensityRatio);\n },\n\n /**\n * Get a translation vector that when applied to the tile position produces integer coordinates.\n * Needed to avoid swimming and twitching.\n * @function\n * @param {Number} [scale=1] - Scale to be applied to position.\n * @return {OpenSeadragon.Point}\n */\n getTranslationForEdgeSmoothing: function(scale, canvasSize, sketchCanvasSize) {\n // The translation vector must have positive values, otherwise the image goes a bit off\n // the sketch canvas to the top and left and we must use negative coordinates to repaint it\n // to the main canvas. In that case, some browsers throw:\n // INDEX_SIZE_ERR: DOM Exception 1: Index or size was negative, or greater than the allowed value.\n var x = Math.max(1, Math.ceil((sketchCanvasSize.x - canvasSize.x) / 2));\n var y = Math.max(1, Math.ceil((sketchCanvasSize.y - canvasSize.y) / 2));\n return new $.Point(x, y).minus(\n this.position\n .times($.pixelDensityRatio)\n .times(scale || 1)\n .apply(function(x) {\n return x % 1;\n })\n );\n },\n\n /**\n * Removes tile from its container.\n * @function\n */\n unload: function() {\n if ( this.imgElement && this.imgElement.parentNode ) {\n this.imgElement.parentNode.removeChild( this.imgElement );\n }\n if ( this.element && this.element.parentNode ) {\n this.element.parentNode.removeChild( this.element );\n }\n\n this.element = null;\n this.imgElement = null;\n this.loaded = false;\n this.loading = false;\n }\n};\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - Overlay\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n /**\n * An enumeration of positions that an overlay may be assigned relative to\n * the viewport.\n * It is identical to OpenSeadragon.Placement but is kept for backward\n * compatibility.\n * @member OverlayPlacement\n * @memberof OpenSeadragon\n * @see OpenSeadragon.Placement\n * @static\n * @readonly\n * @type {Object}\n * @property {Number} CENTER\n * @property {Number} TOP_LEFT\n * @property {Number} TOP\n * @property {Number} TOP_RIGHT\n * @property {Number} RIGHT\n * @property {Number} BOTTOM_RIGHT\n * @property {Number} BOTTOM\n * @property {Number} BOTTOM_LEFT\n * @property {Number} LEFT\n */\n $.OverlayPlacement = $.Placement;\n\n /**\n * An enumeration of possible ways to handle overlays rotation\n * @member OverlayRotationMode\n * @memberOf OpenSeadragon\n * @static\n * @readonly\n * @property {Number} NO_ROTATION The overlay ignore the viewport rotation.\n * @property {Number} EXACT The overlay use CSS 3 transforms to rotate with\n * the viewport. If the overlay contains text, it will get rotated as well.\n * @property {Number} BOUNDING_BOX The overlay adjusts for rotation by\n * taking the size of the bounding box of the rotated bounds.\n * Only valid for overlays with Rect location and scalable in both directions.\n */\n $.OverlayRotationMode = $.freezeObject({\n NO_ROTATION: 1,\n EXACT: 2,\n BOUNDING_BOX: 3\n });\n\n /**\n * @class Overlay\n * @classdesc Provides a way to float an HTML element on top of the viewer element.\n *\n * @memberof OpenSeadragon\n * @param {Object} options\n * @param {Element} options.element\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} options.location - The\n * location of the overlay on the image. If a {@link OpenSeadragon.Point}\n * is specified, the overlay will be located at this location with respect\n * to the placement option. If a {@link OpenSeadragon.Rect} is specified,\n * the overlay will be placed at this location with the corresponding width\n * and height and placement TOP_LEFT.\n * @param {OpenSeadragon.Placement} [options.placement=OpenSeadragon.Placement.TOP_LEFT]\n * Defines what part of the overlay should be at the specified options.location\n * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw]\n * @param {Boolean} [options.checkResize=true] Set to false to avoid to\n * check the size of the overlay every time it is drawn in the directions\n * which are not scaled. It will improve performances but will cause a\n * misalignment if the overlay size changes.\n * @param {Number} [options.width] The width of the overlay in viewport\n * coordinates. If specified, the width of the overlay will be adjusted when\n * the zoom changes.\n * @param {Number} [options.height] The height of the overlay in viewport\n * coordinates. If specified, the height of the overlay will be adjusted when\n * the zoom changes.\n * @param {Boolean} [options.rotationMode=OpenSeadragon.OverlayRotationMode.EXACT]\n * How to handle the rotation of the viewport.\n */\n $.Overlay = function(element, location, placement) {\n\n /**\n * onDraw callback signature used by {@link OpenSeadragon.Overlay}.\n *\n * @callback OnDrawCallback\n * @memberof OpenSeadragon.Overlay\n * @param {OpenSeadragon.Point} position\n * @param {OpenSeadragon.Point} size\n * @param {Element} element\n */\n\n var options;\n if ($.isPlainObject(element)) {\n options = element;\n } else {\n options = {\n element: element,\n location: location,\n placement: placement\n };\n }\n\n this.element = options.element;\n this.style = options.element.style;\n this._init(options);\n };\n\n /** @lends OpenSeadragon.Overlay.prototype */\n $.Overlay.prototype = {\n\n // private\n _init: function(options) {\n this.location = options.location;\n this.placement = options.placement === undefined ?\n $.Placement.TOP_LEFT : options.placement;\n this.onDraw = options.onDraw;\n this.checkResize = options.checkResize === undefined ?\n true : options.checkResize;\n\n // When this.width is not null, the overlay get scaled horizontally\n this.width = options.width === undefined ? null : options.width;\n\n // When this.height is not null, the overlay get scaled vertically\n this.height = options.height === undefined ? null : options.height;\n\n this.rotationMode = options.rotationMode || $.OverlayRotationMode.EXACT;\n\n // Having a rect as location is a syntactic sugar\n if (this.location instanceof $.Rect) {\n this.width = this.location.width;\n this.height = this.location.height;\n this.location = this.location.getTopLeft();\n this.placement = $.Placement.TOP_LEFT;\n }\n\n // Deprecated properties kept for backward compatibility.\n this.scales = this.width !== null && this.height !== null;\n this.bounds = new $.Rect(\n this.location.x, this.location.y, this.width, this.height);\n this.position = this.location;\n },\n\n /**\n * Internal function to adjust the position of an overlay\n * depending on it size and placement.\n * @function\n * @param {OpenSeadragon.Point} position\n * @param {OpenSeadragon.Point} size\n */\n adjust: function(position, size) {\n var properties = $.Placement.properties[this.placement];\n if (!properties) {\n return;\n }\n if (properties.isHorizontallyCentered) {\n position.x -= size.x / 2;\n } else if (properties.isRight) {\n position.x -= size.x;\n }\n if (properties.isVerticallyCentered) {\n position.y -= size.y / 2;\n } else if (properties.isBottom) {\n position.y -= size.y;\n }\n },\n\n /**\n * @function\n */\n destroy: function() {\n var element = this.element;\n var style = this.style;\n\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n //this should allow us to preserve overlays when required between\n //pages\n if (element.prevElementParent) {\n style.display = 'none';\n //element.prevElementParent.insertBefore(\n // element,\n // element.prevNextSibling\n //);\n document.body.appendChild(element);\n }\n }\n\n // clear the onDraw callback\n this.onDraw = null;\n\n style.top = \"\";\n style.left = \"\";\n style.position = \"\";\n\n if (this.width !== null) {\n style.width = \"\";\n }\n if (this.height !== null) {\n style.height = \"\";\n }\n var transformOriginProp = $.getCssPropertyWithVendorPrefix(\n 'transformOrigin');\n var transformProp = $.getCssPropertyWithVendorPrefix(\n 'transform');\n if (transformOriginProp && transformProp) {\n style[transformOriginProp] = \"\";\n style[transformProp] = \"\";\n }\n },\n\n /**\n * @function\n * @param {Element} container\n */\n drawHTML: function(container, viewport) {\n var element = this.element;\n if (element.parentNode !== container) {\n //save the source parent for later if we need it\n element.prevElementParent = element.parentNode;\n element.prevNextSibling = element.nextSibling;\n container.appendChild(element);\n\n // have to set position before calculating size, fix #1116\n this.style.position = \"absolute\";\n // this.size is used by overlays which don't get scaled in at\n // least one direction when this.checkResize is set to false.\n this.size = $.getElementSize(element);\n }\n\n var positionAndSize = this._getOverlayPositionAndSize(viewport);\n\n var position = positionAndSize.position;\n var size = this.size = positionAndSize.size;\n var rotate = positionAndSize.rotate;\n\n // call the onDraw callback if it exists to allow one to overwrite\n // the drawing/positioning/sizing of the overlay\n if (this.onDraw) {\n this.onDraw(position, size, this.element);\n } else {\n var style = this.style;\n style.left = position.x + \"px\";\n style.top = position.y + \"px\";\n if (this.width !== null) {\n style.width = size.x + \"px\";\n }\n if (this.height !== null) {\n style.height = size.y + \"px\";\n }\n var transformOriginProp = $.getCssPropertyWithVendorPrefix(\n 'transformOrigin');\n var transformProp = $.getCssPropertyWithVendorPrefix(\n 'transform');\n if (transformOriginProp && transformProp) {\n if (rotate) {\n style[transformOriginProp] = this._getTransformOrigin();\n style[transformProp] = \"rotate(\" + rotate + \"deg)\";\n } else {\n style[transformOriginProp] = \"\";\n style[transformProp] = \"\";\n }\n }\n style.display = 'block';\n }\n },\n\n // private\n _getOverlayPositionAndSize: function(viewport) {\n var position = viewport.pixelFromPoint(this.location, true);\n var size = this._getSizeInPixels(viewport);\n this.adjust(position, size);\n\n var rotate = 0;\n if (viewport.degrees &&\n this.rotationMode !== $.OverlayRotationMode.NO_ROTATION) {\n // BOUNDING_BOX is only valid if both directions get scaled.\n // Get replaced by EXACT otherwise.\n if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX &&\n this.width !== null && this.height !== null) {\n var rect = new $.Rect(position.x, position.y, size.x, size.y);\n var boundingBox = this._getBoundingBox(rect, viewport.degrees);\n position = boundingBox.getTopLeft();\n size = boundingBox.getSize();\n } else {\n rotate = viewport.degrees;\n }\n }\n\n return {\n position: position,\n size: size,\n rotate: rotate\n };\n },\n\n // private\n _getSizeInPixels: function(viewport) {\n var width = this.size.x;\n var height = this.size.y;\n if (this.width !== null || this.height !== null) {\n var scaledSize = viewport.deltaPixelsFromPointsNoRotate(\n new $.Point(this.width || 0, this.height || 0), true);\n if (this.width !== null) {\n width = scaledSize.x;\n }\n if (this.height !== null) {\n height = scaledSize.y;\n }\n }\n if (this.checkResize &&\n (this.width === null || this.height === null)) {\n var eltSize = this.size = $.getElementSize(this.element);\n if (this.width === null) {\n width = eltSize.x;\n }\n if (this.height === null) {\n height = eltSize.y;\n }\n }\n return new $.Point(width, height);\n },\n\n // private\n _getBoundingBox: function(rect, degrees) {\n var refPoint = this._getPlacementPoint(rect);\n return rect.rotate(degrees, refPoint).getBoundingBox();\n },\n\n // private\n _getPlacementPoint: function(rect) {\n var result = new $.Point(rect.x, rect.y);\n var properties = $.Placement.properties[this.placement];\n if (properties) {\n if (properties.isHorizontallyCentered) {\n result.x += rect.width / 2;\n } else if (properties.isRight) {\n result.x += rect.width;\n }\n if (properties.isVerticallyCentered) {\n result.y += rect.height / 2;\n } else if (properties.isBottom) {\n result.y += rect.height;\n }\n }\n return result;\n },\n\n // private\n _getTransformOrigin: function() {\n var result = \"\";\n var properties = $.Placement.properties[this.placement];\n if (!properties) {\n return result;\n }\n if (properties.isLeft) {\n result = \"left\";\n } else if (properties.isRight) {\n result = \"right\";\n }\n if (properties.isTop) {\n result += \" top\";\n } else if (properties.isBottom) {\n result += \" bottom\";\n }\n return result;\n },\n\n /**\n * Changes the overlay settings.\n * @function\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect|Object} location\n * If an object is specified, the options are the same than the constructor\n * except for the element which can not be changed.\n * @param {OpenSeadragon.Placement} placement\n */\n update: function(location, placement) {\n var options = $.isPlainObject(location) ? location : {\n location: location,\n placement: placement\n };\n this._init({\n location: options.location || this.location,\n placement: options.placement !== undefined ?\n options.placement : this.placement,\n onDraw: options.onDraw || this.onDraw,\n checkResize: options.checkResize || this.checkResize,\n width: options.width !== undefined ? options.width : this.width,\n height: options.height !== undefined ? options.height : this.height,\n rotationMode: options.rotationMode || this.rotationMode\n });\n },\n\n /**\n * Returns the current bounds of the overlay in viewport coordinates\n * @function\n * @param {OpenSeadragon.Viewport} viewport the viewport\n * @returns {OpenSeadragon.Rect} overlay bounds\n */\n getBounds: function(viewport) {\n $.console.assert(viewport,\n 'A viewport must now be passed to Overlay.getBounds.');\n var width = this.width;\n var height = this.height;\n if (width === null || height === null) {\n var size = viewport.deltaPointsFromPixelsNoRotate(this.size, true);\n if (width === null) {\n width = size.x;\n }\n if (height === null) {\n height = size.y;\n }\n }\n var location = this.location.clone();\n this.adjust(location, new $.Point(width, height));\n return this._adjustBoundsForRotation(\n viewport, new $.Rect(location.x, location.y, width, height));\n },\n\n // private\n _adjustBoundsForRotation: function(viewport, bounds) {\n if (!viewport ||\n viewport.degrees === 0 ||\n this.rotationMode === $.OverlayRotationMode.EXACT) {\n return bounds;\n }\n if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX) {\n // If overlay not fully scalable, BOUNDING_BOX falls back to EXACT\n if (this.width === null || this.height === null) {\n return bounds;\n }\n // It is easier to just compute the position and size and\n // convert to viewport coordinates.\n var positionAndSize = this._getOverlayPositionAndSize(viewport);\n return viewport.viewerElementToViewportRectangle(new $.Rect(\n positionAndSize.position.x,\n positionAndSize.position.y,\n positionAndSize.size.x,\n positionAndSize.size.y));\n }\n\n // NO_ROTATION case\n return bounds.rotate(-viewport.degrees,\n this._getPlacementPoint(bounds));\n }\n };\n\n}(OpenSeadragon));\n\n/*\n * OpenSeadragon - Drawer\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Drawer\n * @memberof OpenSeadragon\n * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.\n * @param {Object} options - Options for this Drawer.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this Drawer.\n * @param {OpenSeadragon.Viewport} options.viewport - Reference to Viewer viewport.\n * @param {Element} options.element - Parent element.\n * @param {Number} [options.debugGridColor] - See debugGridColor in {@link OpenSeadragon.Options} for details.\n */\n$.Drawer = function( options ) {\n\n $.console.assert( options.viewer, \"[Drawer] options.viewer is required\" );\n\n //backward compatibility for positional args while preferring more\n //idiomatic javascript options object as the only argument\n var args = arguments;\n\n if( !$.isPlainObject( options ) ){\n options = {\n source: args[ 0 ], // Reference to Viewer tile source.\n viewport: args[ 1 ], // Reference to Viewer viewport.\n element: args[ 2 ] // Parent element.\n };\n }\n\n $.console.assert( options.viewport, \"[Drawer] options.viewport is required\" );\n $.console.assert( options.element, \"[Drawer] options.element is required\" );\n\n if ( options.source ) {\n $.console.error( \"[Drawer] options.source is no longer accepted; use TiledImage instead\" );\n }\n\n this.viewer = options.viewer;\n this.viewport = options.viewport;\n this.debugGridColor = typeof options.debugGridColor === 'string' ? [options.debugGridColor] : options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;\n if (options.opacity) {\n $.console.error( \"[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead\" );\n }\n\n this.useCanvas = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true );\n /**\n * The parent element of this Drawer instance, passed in when the Drawer was created.\n * The parent of {@link OpenSeadragon.Drawer#canvas}.\n * @member {Element} container\n * @memberof OpenSeadragon.Drawer#\n */\n this.container = $.getElement( options.element );\n /**\n * A <canvas> element if the browser supports them, otherwise a <div> element.\n * Child element of {@link OpenSeadragon.Drawer#container}.\n * @member {Element} canvas\n * @memberof OpenSeadragon.Drawer#\n */\n this.canvas = $.makeNeutralElement( this.useCanvas ? \"canvas\" : \"div\" );\n /**\n * 2d drawing context for {@link OpenSeadragon.Drawer#canvas} if it's a <canvas> element, otherwise null.\n * @member {Object} context\n * @memberof OpenSeadragon.Drawer#\n */\n this.context = this.useCanvas ? this.canvas.getContext( \"2d\" ) : null;\n\n /**\n * Sketch canvas used to temporarily draw tiles which cannot be drawn directly\n * to the main canvas due to opacity. Lazily initialized.\n */\n this.sketchCanvas = null;\n this.sketchContext = null;\n\n /**\n * @member {Element} element\n * @memberof OpenSeadragon.Drawer#\n * @deprecated Alias for {@link OpenSeadragon.Drawer#container}.\n */\n this.element = this.container;\n\n // We force our container to ltr because our drawing math doesn't work in rtl.\n // This issue only affects our canvas renderer, but we do it always for consistency.\n // Note that this means overlays you want to be rtl need to be explicitly set to rtl.\n this.container.dir = 'ltr';\n\n // check canvas available width and height, set canvas width and height such that the canvas backing store is set to the proper pixel density\n if (this.useCanvas) {\n var viewportSize = this._calculateCanvasSize();\n this.canvas.width = viewportSize.x;\n this.canvas.height = viewportSize.y;\n }\n\n this.canvas.style.width = \"100%\";\n this.canvas.style.height = \"100%\";\n this.canvas.style.position = \"absolute\";\n $.setElementOpacity( this.canvas, this.opacity, true );\n // Allow pointer events to pass through the canvas element so implicit\n // pointer capture works on touch devices\n $.setElementPointerEventsNone( this.canvas );\n $.setElementTouchActionNone( this.canvas );\n\n // explicit left-align\n this.container.style.textAlign = \"left\";\n this.container.appendChild( this.canvas );\n\n // Image smoothing for canvas rendering (only if canvas is used).\n // Canvas default is \"true\", so this will only be changed if user specified \"false\".\n this._imageSmoothingEnabled = true;\n};\n\n/** @lends OpenSeadragon.Drawer.prototype */\n$.Drawer.prototype = {\n // deprecated\n addOverlay: function( element, location, placement, onDraw ) {\n $.console.error(\"drawer.addOverlay is deprecated. Use viewer.addOverlay instead.\");\n this.viewer.addOverlay( element, location, placement, onDraw );\n return this;\n },\n\n // deprecated\n updateOverlay: function( element, location, placement ) {\n $.console.error(\"drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.\");\n this.viewer.updateOverlay( element, location, placement );\n return this;\n },\n\n // deprecated\n removeOverlay: function( element ) {\n $.console.error(\"drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.\");\n this.viewer.removeOverlay( element );\n return this;\n },\n\n // deprecated\n clearOverlays: function() {\n $.console.error(\"drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.\");\n this.viewer.clearOverlays();\n return this;\n },\n\n /**\n * This function converts the given point from to the drawer coordinate by\n * multiplying it with the pixel density.\n * This function does not take rotation into account, thus assuming provided\n * point is at 0 degree.\n * @param {OpenSeadragon.Point} point - the pixel point to convert\n */\n viewportCoordToDrawerCoord: function(point) {\n var vpPoint = this.viewport.pixelFromPointNoRotate(point, true);\n return new $.Point(\n vpPoint.x * $.pixelDensityRatio,\n vpPoint.y * $.pixelDensityRatio\n );\n },\n\n /**\n * This function will create multiple polygon paths on the drawing context by provided polygons,\n * then clip the context to the paths.\n * @param {OpenSeadragon.Point[][]} polygons - an array of polygons. A polygon is an array of OpenSeadragon.Point\n * @param {Boolean} useSketch - Whether to use the sketch canvas or not.\n */\n clipWithPolygons: function (polygons, useSketch) {\n if (!this.useCanvas) {\n return;\n }\n var context = this._getContext(useSketch);\n context.beginPath();\n polygons.forEach(function (polygon) {\n polygon.forEach(function (coord, i) {\n context[i === 0 ? 'moveTo' : 'lineTo'](coord.x, coord.y);\n });\n });\n context.clip();\n },\n\n /**\n * Set the opacity of the drawer.\n * @param {Number} opacity\n * @return {OpenSeadragon.Drawer} Chainable.\n */\n setOpacity: function( opacity ) {\n $.console.error(\"drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.\");\n var world = this.viewer.world;\n for (var i = 0; i < world.getItemCount(); i++) {\n world.getItemAt( i ).setOpacity( opacity );\n }\n return this;\n },\n\n /**\n * Get the opacity of the drawer.\n * @returns {Number}\n */\n getOpacity: function() {\n $.console.error(\"drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead.\");\n var world = this.viewer.world;\n var maxOpacity = 0;\n for (var i = 0; i < world.getItemCount(); i++) {\n var opacity = world.getItemAt( i ).getOpacity();\n if ( opacity > maxOpacity ) {\n maxOpacity = opacity;\n }\n }\n return maxOpacity;\n },\n\n // deprecated\n needsUpdate: function() {\n $.console.error( \"[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead.\" );\n return this.viewer.world.needsDraw();\n },\n\n // deprecated\n numTilesLoaded: function() {\n $.console.error( \"[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead.\" );\n return this.viewer.tileCache.numTilesLoaded();\n },\n\n // deprecated\n reset: function() {\n $.console.error( \"[Drawer.reset] this function is deprecated. Use World.resetItems instead.\" );\n this.viewer.world.resetItems();\n return this;\n },\n\n // deprecated\n update: function() {\n $.console.error( \"[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead.\" );\n this.clear();\n this.viewer.world.draw();\n return this;\n },\n\n /**\n * @return {Boolean} True if rotation is supported.\n */\n canRotate: function() {\n return this.useCanvas;\n },\n\n /**\n * Destroy the drawer (unload current loaded tiles)\n */\n destroy: function() {\n //force unloading of current canvas (1x1 will be gc later, trick not necessarily needed)\n this.canvas.width = 1;\n this.canvas.height = 1;\n this.sketchCanvas = null;\n this.sketchContext = null;\n },\n\n /**\n * Clears the Drawer so it's ready to draw another frame.\n */\n clear: function() {\n this.canvas.innerHTML = \"\";\n if ( this.useCanvas ) {\n var viewportSize = this._calculateCanvasSize();\n if( this.canvas.width !== viewportSize.x ||\n this.canvas.height !== viewportSize.y ) {\n this.canvas.width = viewportSize.x;\n this.canvas.height = viewportSize.y;\n this._updateImageSmoothingEnabled(this.context);\n if ( this.sketchCanvas !== null ) {\n var sketchCanvasSize = this._calculateSketchCanvasSize();\n this.sketchCanvas.width = sketchCanvasSize.x;\n this.sketchCanvas.height = sketchCanvasSize.y;\n this._updateImageSmoothingEnabled(this.sketchContext);\n }\n }\n this._clear();\n }\n },\n\n _clear: function (useSketch, bounds) {\n if (!this.useCanvas) {\n return;\n }\n var context = this._getContext(useSketch);\n if (bounds) {\n context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height);\n } else {\n var canvas = context.canvas;\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n },\n\n /**\n * Scale from OpenSeadragon viewer rectangle to drawer rectangle\n * (ignoring rotation)\n * @param {OpenSeadragon.Rect} rectangle - The rectangle in viewport coordinate system.\n * @return {OpenSeadragon.Rect} Rectangle in drawer coordinate system.\n */\n viewportToDrawerRectangle: function(rectangle) {\n var topLeft = this.viewport.pixelFromPointNoRotate(rectangle.getTopLeft(), true);\n var size = this.viewport.deltaPixelsFromPointsNoRotate(rectangle.getSize(), true);\n\n return new $.Rect(\n topLeft.x * $.pixelDensityRatio,\n topLeft.y * $.pixelDensityRatio,\n size.x * $.pixelDensityRatio,\n size.y * $.pixelDensityRatio\n );\n },\n\n /**\n * Draws the given tile.\n * @param {OpenSeadragon.Tile} tile - The tile to draw.\n * @param {Function} drawingHandler - Method for firing the drawing event if using canvas.\n * drawingHandler({context, tile, rendered})\n * @param {Boolean} useSketch - Whether to use the sketch canvas or not.\n * where rendered is the context with the pre-drawn image.\n * @param {Float} [scale=1] - Apply a scale to tile position and size. Defaults to 1.\n * @param {OpenSeadragon.Point} [translate] A translation vector to offset tile position\n */\n drawTile: function(tile, drawingHandler, useSketch, scale, translate) {\n $.console.assert(tile, '[Drawer.drawTile] tile is required');\n $.console.assert(drawingHandler, '[Drawer.drawTile] drawingHandler is required');\n\n if (this.useCanvas) {\n var context = this._getContext(useSketch);\n scale = scale || 1;\n tile.drawCanvas(context, drawingHandler, scale, translate);\n } else {\n tile.drawHTML( this.canvas );\n }\n },\n\n _getContext: function( useSketch ) {\n var context = this.context;\n if ( useSketch ) {\n if (this.sketchCanvas === null) {\n this.sketchCanvas = document.createElement( \"canvas\" );\n var sketchCanvasSize = this._calculateSketchCanvasSize();\n this.sketchCanvas.width = sketchCanvasSize.x;\n this.sketchCanvas.height = sketchCanvasSize.y;\n this.sketchContext = this.sketchCanvas.getContext( \"2d\" );\n\n // If the viewport is not currently rotated, the sketchCanvas\n // will have the same size as the main canvas. However, if\n // the viewport get rotated later on, we will need to resize it.\n if (this.viewport.getRotation() === 0) {\n var self = this;\n this.viewer.addHandler('rotate', function resizeSketchCanvas() {\n if (self.viewport.getRotation() === 0) {\n return;\n }\n self.viewer.removeHandler('rotate', resizeSketchCanvas);\n var sketchCanvasSize = self._calculateSketchCanvasSize();\n self.sketchCanvas.width = sketchCanvasSize.x;\n self.sketchCanvas.height = sketchCanvasSize.y;\n });\n }\n this._updateImageSmoothingEnabled(this.sketchContext);\n }\n context = this.sketchContext;\n }\n return context;\n },\n\n // private\n saveContext: function( useSketch ) {\n if (!this.useCanvas) {\n return;\n }\n\n this._getContext( useSketch ).save();\n },\n\n // private\n restoreContext: function( useSketch ) {\n if (!this.useCanvas) {\n return;\n }\n\n this._getContext( useSketch ).restore();\n },\n\n // private\n setClip: function(rect, useSketch) {\n if (!this.useCanvas) {\n return;\n }\n\n var context = this._getContext( useSketch );\n context.beginPath();\n context.rect(rect.x, rect.y, rect.width, rect.height);\n context.clip();\n },\n\n // private\n drawRectangle: function(rect, fillStyle, useSketch) {\n if (!this.useCanvas) {\n return;\n }\n\n var context = this._getContext( useSketch );\n context.save();\n context.fillStyle = fillStyle;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n context.restore();\n },\n\n /**\n * Blends the sketch canvas in the main canvas.\n * @param {Object} options The options\n * @param {Float} options.opacity The opacity of the blending.\n * @param {Float} [options.scale=1] The scale at which tiles were drawn on\n * the sketch. Default is 1.\n * Use scale to draw at a lower scale and then enlarge onto the main canvas.\n * @param {OpenSeadragon.Point} [options.translate] A translation vector\n * that was used to draw the tiles\n * @param {String} [options.compositeOperation] - How the image is\n * composited onto other images; see compositeOperation in\n * {@link OpenSeadragon.Options} for possible values.\n * @param {OpenSeadragon.Rect} [options.bounds] The part of the sketch\n * canvas to blend in the main canvas. If specified, options.scale and\n * options.translate get ignored.\n */\n blendSketch: function(opacity, scale, translate, compositeOperation) {\n var options = opacity;\n if (!$.isPlainObject(options)) {\n options = {\n opacity: opacity,\n scale: scale,\n translate: translate,\n compositeOperation: compositeOperation\n };\n }\n if (!this.useCanvas || !this.sketchCanvas) {\n return;\n }\n opacity = options.opacity;\n compositeOperation = options.compositeOperation;\n var bounds = options.bounds;\n\n this.context.save();\n this.context.globalAlpha = opacity;\n if (compositeOperation) {\n this.context.globalCompositeOperation = compositeOperation;\n }\n if (bounds) {\n // Internet Explorer, Microsoft Edge, and Safari have problems\n // when you call context.drawImage with negative x or y\n // or x + width or y + height greater than the canvas width or height respectively.\n if (bounds.x < 0) {\n bounds.width += bounds.x;\n bounds.x = 0;\n }\n if (bounds.x + bounds.width > this.canvas.width) {\n bounds.width = this.canvas.width - bounds.x;\n }\n if (bounds.y < 0) {\n bounds.height += bounds.y;\n bounds.y = 0;\n }\n if (bounds.y + bounds.height > this.canvas.height) {\n bounds.height = this.canvas.height - bounds.y;\n }\n\n this.context.drawImage(\n this.sketchCanvas,\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height,\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height\n );\n } else {\n scale = options.scale || 1;\n translate = options.translate;\n var position = translate instanceof $.Point ?\n translate : new $.Point(0, 0);\n\n var widthExt = 0;\n var heightExt = 0;\n if (translate) {\n var widthDiff = this.sketchCanvas.width - this.canvas.width;\n var heightDiff = this.sketchCanvas.height - this.canvas.height;\n widthExt = Math.round(widthDiff / 2);\n heightExt = Math.round(heightDiff / 2);\n }\n this.context.drawImage(\n this.sketchCanvas,\n position.x - widthExt * scale,\n position.y - heightExt * scale,\n (this.canvas.width + 2 * widthExt) * scale,\n (this.canvas.height + 2 * heightExt) * scale,\n -widthExt,\n -heightExt,\n this.canvas.width + 2 * widthExt,\n this.canvas.height + 2 * heightExt\n );\n }\n this.context.restore();\n },\n\n // private\n drawDebugInfo: function(tile, count, i, tiledImage) {\n if ( !this.useCanvas ) {\n return;\n }\n\n var colorIndex = this.viewer.world.getIndexOfItem(tiledImage) % this.debugGridColor.length;\n var context = this.context;\n context.save();\n context.lineWidth = 2 * $.pixelDensityRatio;\n context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial';\n context.strokeStyle = this.debugGridColor[colorIndex];\n context.fillStyle = this.debugGridColor[colorIndex];\n\n if ( this.viewport.degrees !== 0 ) {\n this._offsetForRotation({degrees: this.viewport.degrees});\n }\n if (tiledImage.getRotation(true) % 360 !== 0) {\n this._offsetForRotation({\n degrees: tiledImage.getRotation(true),\n point: tiledImage.viewport.pixelFromPointNoRotate(\n tiledImage._getRotationPoint(true), true)\n });\n }\n if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){\n if(tiledImage._drawer.viewer.viewport.getFlip()) {\n tiledImage._drawer._flip();\n }\n }\n\n context.strokeRect(\n tile.position.x * $.pixelDensityRatio,\n tile.position.y * $.pixelDensityRatio,\n tile.size.x * $.pixelDensityRatio,\n tile.size.y * $.pixelDensityRatio\n );\n\n var tileCenterX = (tile.position.x + (tile.size.x / 2)) * $.pixelDensityRatio;\n var tileCenterY = (tile.position.y + (tile.size.y / 2)) * $.pixelDensityRatio;\n\n // Rotate the text the right way around.\n context.translate( tileCenterX, tileCenterY );\n context.rotate( Math.PI / 180 * -this.viewport.degrees );\n context.translate( -tileCenterX, -tileCenterY );\n\n if( tile.x === 0 && tile.y === 0 ){\n context.fillText(\n \"Zoom: \" + this.viewport.getZoom(),\n tile.position.x * $.pixelDensityRatio,\n (tile.position.y - 30) * $.pixelDensityRatio\n );\n context.fillText(\n \"Pan: \" + this.viewport.getBounds().toString(),\n tile.position.x * $.pixelDensityRatio,\n (tile.position.y - 20) * $.pixelDensityRatio\n );\n }\n context.fillText(\n \"Level: \" + tile.level,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 20) * $.pixelDensityRatio\n );\n context.fillText(\n \"Column: \" + tile.x,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 30) * $.pixelDensityRatio\n );\n context.fillText(\n \"Row: \" + tile.y,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 40) * $.pixelDensityRatio\n );\n context.fillText(\n \"Order: \" + i + \" of \" + count,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 50) * $.pixelDensityRatio\n );\n context.fillText(\n \"Size: \" + tile.size.toString(),\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 60) * $.pixelDensityRatio\n );\n context.fillText(\n \"Position: \" + tile.position.toString(),\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 70) * $.pixelDensityRatio\n );\n\n if ( this.viewport.degrees !== 0 ) {\n this._restoreRotationChanges();\n }\n if (tiledImage.getRotation(true) % 360 !== 0) {\n this._restoreRotationChanges();\n }\n\n if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){\n if(tiledImage._drawer.viewer.viewport.getFlip()) {\n tiledImage._drawer._flip();\n }\n }\n\n context.restore();\n },\n\n // private\n debugRect: function(rect) {\n if ( this.useCanvas ) {\n var context = this.context;\n context.save();\n context.lineWidth = 2 * $.pixelDensityRatio;\n context.strokeStyle = this.debugGridColor[0];\n context.fillStyle = this.debugGridColor[0];\n\n context.strokeRect(\n rect.x * $.pixelDensityRatio,\n rect.y * $.pixelDensityRatio,\n rect.width * $.pixelDensityRatio,\n rect.height * $.pixelDensityRatio\n );\n\n context.restore();\n }\n },\n\n /**\n * Turns image smoothing on or off for this viewer. Note: Ignored in some (especially older) browsers that do not support this property.\n *\n * @function\n * @param {Boolean} [imageSmoothingEnabled] - Whether or not the image is\n * drawn smoothly on the canvas; see imageSmoothingEnabled in\n * {@link OpenSeadragon.Options} for more explanation.\n */\n setImageSmoothingEnabled: function(imageSmoothingEnabled){\n if ( this.useCanvas ) {\n this._imageSmoothingEnabled = imageSmoothingEnabled;\n this._updateImageSmoothingEnabled(this.context);\n this.viewer.forceRedraw();\n }\n },\n\n // private\n _updateImageSmoothingEnabled: function(context){\n context.msImageSmoothingEnabled = this._imageSmoothingEnabled;\n context.imageSmoothingEnabled = this._imageSmoothingEnabled;\n },\n\n /**\n * Get the canvas size\n * @param {Boolean} sketch If set to true return the size of the sketch canvas\n * @returns {OpenSeadragon.Point} The size of the canvas\n */\n getCanvasSize: function(sketch) {\n var canvas = this._getContext(sketch).canvas;\n return new $.Point(canvas.width, canvas.height);\n },\n\n getCanvasCenter: function() {\n return new $.Point(this.canvas.width / 2, this.canvas.height / 2);\n },\n\n // private\n _offsetForRotation: function(options) {\n var point = options.point ?\n options.point.times($.pixelDensityRatio) :\n this.getCanvasCenter();\n\n var context = this._getContext(options.useSketch);\n context.save();\n\n context.translate(point.x, point.y);\n if(this.viewer.viewport.flipped){\n context.rotate(Math.PI / 180 * -options.degrees);\n context.scale(-1, 1);\n } else{\n context.rotate(Math.PI / 180 * options.degrees);\n }\n context.translate(-point.x, -point.y);\n },\n\n // private\n _flip: function(options) {\n options = options || {};\n var point = options.point ?\n options.point.times($.pixelDensityRatio) :\n this.getCanvasCenter();\n var context = this._getContext(options.useSketch);\n\n context.translate(point.x, 0);\n context.scale(-1, 1);\n context.translate(-point.x, 0);\n },\n\n // private\n _restoreRotationChanges: function(useSketch) {\n var context = this._getContext(useSketch);\n context.restore();\n },\n\n // private\n _calculateCanvasSize: function() {\n var pixelDensityRatio = $.pixelDensityRatio;\n var viewportSize = this.viewport.getContainerSize();\n return {\n // canvas width and height are integers\n x: Math.round(viewportSize.x * pixelDensityRatio),\n y: Math.round(viewportSize.y * pixelDensityRatio)\n };\n },\n\n // private\n _calculateSketchCanvasSize: function() {\n var canvasSize = this._calculateCanvasSize();\n if (this.viewport.getRotation() === 0) {\n return canvasSize;\n }\n // If the viewport is rotated, we need a larger sketch canvas in order\n // to support edge smoothing.\n var sketchCanvasSize = Math.ceil(Math.sqrt(\n canvasSize.x * canvasSize.x +\n canvasSize.y * canvasSize.y));\n return {\n x: sketchCanvasSize,\n y: sketchCanvasSize\n };\n }\n};\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - Viewport\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n\n/**\n * @class Viewport\n * @memberof OpenSeadragon\n * @classdesc Handles coordinate-related functionality (zoom, pan, rotation, etc.)\n * for an {@link OpenSeadragon.Viewer}.\n * @param {Object} options - Options for this Viewport.\n * @param {Object} [options.margins] - See viewportMargins in {@link OpenSeadragon.Options}.\n * @param {Number} [options.springStiffness] - See springStiffness in {@link OpenSeadragon.Options}.\n * @param {Number} [options.animationTime] - See animationTime in {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomImageRatio] - See minZoomImageRatio in {@link OpenSeadragon.Options}.\n * @param {Number} [options.maxZoomPixelRatio] - See maxZoomPixelRatio in {@link OpenSeadragon.Options}.\n * @param {Number} [options.visibilityRatio] - See visibilityRatio in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapHorizontal] - See wrapHorizontal in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapVertical] - See wrapVertical in {@link OpenSeadragon.Options}.\n * @param {Number} [options.defaultZoomLevel] - See defaultZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomLevel] - See minZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.maxZoomLevel] - See maxZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.degrees] - See degrees in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.homeFillsViewer] - See homeFillsViewer in {@link OpenSeadragon.Options}.\n */\n$.Viewport = function( options ) {\n\n //backward compatibility for positional args while preferring more\n //idiomatic javascript options object as the only argument\n var args = arguments;\n if (args.length && args[0] instanceof $.Point) {\n options = {\n containerSize: args[0],\n contentSize: args[1],\n config: args[2]\n };\n }\n\n //options.config and the general config argument are deprecated\n //in favor of the more direct specification of optional settings\n //being passed directly on the options object\n if ( options.config ){\n $.extend( true, options, options.config );\n delete options.config;\n }\n\n this._margins = $.extend({\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n }, options.margins || {});\n\n delete options.margins;\n\n $.extend( true, this, {\n\n //required settings\n containerSize: null,\n contentSize: null,\n\n //internal state properties\n zoomPoint: null,\n viewer: null,\n\n //configurable options\n springStiffness: $.DEFAULT_SETTINGS.springStiffness,\n animationTime: $.DEFAULT_SETTINGS.animationTime,\n minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio,\n maxZoomPixelRatio: $.DEFAULT_SETTINGS.maxZoomPixelRatio,\n visibilityRatio: $.DEFAULT_SETTINGS.visibilityRatio,\n wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal,\n wrapVertical: $.DEFAULT_SETTINGS.wrapVertical,\n defaultZoomLevel: $.DEFAULT_SETTINGS.defaultZoomLevel,\n minZoomLevel: $.DEFAULT_SETTINGS.minZoomLevel,\n maxZoomLevel: $.DEFAULT_SETTINGS.maxZoomLevel,\n degrees: $.DEFAULT_SETTINGS.degrees,\n flipped: $.DEFAULT_SETTINGS.flipped,\n homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer\n\n }, options );\n\n this._updateContainerInnerSize();\n\n this.centerSpringX = new $.Spring({\n initial: 0,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n this.centerSpringY = new $.Spring({\n initial: 0,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n this.zoomSpring = new $.Spring({\n exponential: true,\n initial: 1,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._oldCenterX = this.centerSpringX.current.value;\n this._oldCenterY = this.centerSpringY.current.value;\n this._oldZoom = this.zoomSpring.current.value;\n\n this._setContentBounds(new $.Rect(0, 0, 1, 1), 1);\n\n this.goHome(true);\n this.update();\n};\n\n/** @lends OpenSeadragon.Viewport.prototype */\n$.Viewport.prototype = {\n /**\n * Updates the viewport's home bounds and constraints for the given content size.\n * @function\n * @param {OpenSeadragon.Point} contentSize - size of the content in content units\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:reset-size\n */\n resetContentSize: function(contentSize) {\n $.console.assert(contentSize, \"[Viewport.resetContentSize] contentSize is required\");\n $.console.assert(contentSize instanceof $.Point, \"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point\");\n $.console.assert(contentSize.x > 0, \"[Viewport.resetContentSize] contentSize.x must be greater than 0\");\n $.console.assert(contentSize.y > 0, \"[Viewport.resetContentSize] contentSize.y must be greater than 0\");\n\n this._setContentBounds(new $.Rect(0, 0, 1, contentSize.y / contentSize.x), contentSize.x);\n return this;\n },\n\n // deprecated\n setHomeBounds: function(bounds, contentFactor) {\n $.console.error(\"[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually.\");\n this._setContentBounds(bounds, contentFactor);\n },\n\n // Set the viewport's content bounds\n // @param {OpenSeadragon.Rect} bounds - the new bounds in viewport coordinates\n // without rotation\n // @param {Number} contentFactor - how many content units per viewport unit\n // @fires OpenSeadragon.Viewer.event:reset-size\n // @private\n _setContentBounds: function(bounds, contentFactor) {\n $.console.assert(bounds, \"[Viewport._setContentBounds] bounds is required\");\n $.console.assert(bounds instanceof $.Rect, \"[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect\");\n $.console.assert(bounds.width > 0, \"[Viewport._setContentBounds] bounds.width must be greater than 0\");\n $.console.assert(bounds.height > 0, \"[Viewport._setContentBounds] bounds.height must be greater than 0\");\n\n this._contentBoundsNoRotate = bounds.clone();\n this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times(\n contentFactor);\n\n this._contentBounds = bounds.rotate(this.degrees).getBoundingBox();\n this._contentSize = this._contentBounds.getSize().times(contentFactor);\n this._contentAspectRatio = this._contentSize.x / this._contentSize.y;\n\n if (this.viewer) {\n /**\n * Raised when the viewer's content size or home bounds are reset\n * (see {@link OpenSeadragon.Viewport#resetContentSize}).\n *\n * @event reset-size\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} contentSize\n * @property {OpenSeadragon.Rect} contentBounds - Content bounds.\n * @property {OpenSeadragon.Rect} homeBounds - Content bounds.\n * Deprecated use contentBounds instead.\n * @property {Number} contentFactor\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('reset-size', {\n contentSize: this._contentSizeNoRotate.clone(),\n contentFactor: contentFactor,\n homeBounds: this._contentBoundsNoRotate.clone(),\n contentBounds: this._contentBounds.clone()\n });\n }\n },\n\n /**\n * Returns the home zoom in \"viewport zoom\" value.\n * @function\n * @returns {Number} The home zoom in \"viewport zoom\".\n */\n getHomeZoom: function() {\n if (this.defaultZoomLevel) {\n return this.defaultZoomLevel;\n }\n\n var aspectFactor = this._contentAspectRatio / this.getAspectRatio();\n var output;\n if (this.homeFillsViewer) { // fill the viewer and clip the image\n output = aspectFactor >= 1 ? aspectFactor : 1;\n } else {\n output = aspectFactor >= 1 ? 1 : aspectFactor;\n }\n\n return output / this._contentBounds.width;\n },\n\n /**\n * Returns the home bounds in viewport coordinates.\n * @function\n * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.\n */\n getHomeBounds: function() {\n return this.getHomeBoundsNoRotate().rotate(-this.getRotation());\n },\n\n /**\n * Returns the home bounds in viewport coordinates.\n * This method ignores the viewport rotation. Use\n * {@link OpenSeadragon.Viewport#getHomeBounds} to take it into account.\n * @function\n * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.\n */\n getHomeBoundsNoRotate: function() {\n var center = this._contentBounds.getCenter();\n var width = 1.0 / this.getHomeZoom();\n var height = width / this.getAspectRatio();\n\n return new $.Rect(\n center.x - (width / 2.0),\n center.y - (height / 2.0),\n width,\n height\n );\n },\n\n /**\n * @function\n * @param {Boolean} immediately\n * @fires OpenSeadragon.Viewer.event:home\n */\n goHome: function(immediately) {\n if (this.viewer) {\n /**\n * Raised when the \"home\" operation occurs (see {@link OpenSeadragon.Viewport#goHome}).\n *\n * @event home\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('home', {\n immediately: immediately\n });\n }\n return this.fitBounds(this.getHomeBounds(), immediately);\n },\n\n /**\n * @function\n */\n getMinZoom: function() {\n var homeZoom = this.getHomeZoom(),\n zoom = this.minZoomLevel ?\n this.minZoomLevel :\n this.minZoomImageRatio * homeZoom;\n\n return zoom;\n },\n\n /**\n * @function\n */\n getMaxZoom: function() {\n var zoom = this.maxZoomLevel;\n if (!zoom) {\n zoom = this._contentSize.x * this.maxZoomPixelRatio / this._containerInnerSize.x;\n zoom /= this._contentBounds.width;\n }\n\n return Math.max( zoom, this.getHomeZoom() );\n },\n\n /**\n * @function\n */\n getAspectRatio: function() {\n return this._containerInnerSize.x / this._containerInnerSize.y;\n },\n\n /**\n * @function\n * @returns {OpenSeadragon.Point} The size of the container, in screen coordinates.\n */\n getContainerSize: function() {\n return new $.Point(\n this.containerSize.x,\n this.containerSize.y\n );\n },\n\n /**\n * The margins push the \"home\" region in from the sides by the specified amounts.\n * @function\n * @returns {Object} Properties (Numbers, in screen coordinates): left, top, right, bottom.\n */\n getMargins: function() {\n return $.extend({}, this._margins); // Make a copy so we are not returning our original\n },\n\n /**\n * The margins push the \"home\" region in from the sides by the specified amounts.\n * @function\n * @param {Object} margins - Properties (Numbers, in screen coordinates): left, top, right, bottom.\n */\n setMargins: function(margins) {\n $.console.assert($.type(margins) === 'object', '[Viewport.setMargins] margins must be an object');\n\n this._margins = $.extend({\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n }, margins);\n\n this._updateContainerInnerSize();\n if (this.viewer) {\n this.viewer.forceRedraw();\n }\n },\n\n /**\n * Returns the bounds of the visible area in viewport coordinates.\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.\n */\n getBounds: function(current) {\n return this.getBoundsNoRotate(current).rotate(-this.getRotation());\n },\n\n /**\n * Returns the bounds of the visible area in viewport coordinates.\n * This method ignores the viewport rotation. Use\n * {@link OpenSeadragon.Viewport#getBounds} to take it into account.\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.\n */\n getBoundsNoRotate: function(current) {\n var center = this.getCenter(current);\n var width = 1.0 / this.getZoom(current);\n var height = width / this.getAspectRatio();\n\n return new $.Rect(\n center.x - (width / 2.0),\n center.y - (height / 2.0),\n width,\n height\n );\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,\n * including the space taken by margins, in viewport coordinates.\n */\n getBoundsWithMargins: function(current) {\n return this.getBoundsNoRotateWithMargins(current).rotate(\n -this.getRotation(), this.getCenter(current));\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,\n * including the space taken by margins, in viewport coordinates.\n */\n getBoundsNoRotateWithMargins: function(current) {\n var bounds = this.getBoundsNoRotate(current);\n var factor = this._containerInnerSize.x * this.getZoom(current);\n bounds.x -= this._margins.left / factor;\n bounds.y -= this._margins.top / factor;\n bounds.width += (this._margins.left + this._margins.right) / factor;\n bounds.height += (this._margins.top + this._margins.bottom) / factor;\n return bounds;\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n */\n getCenter: function( current ) {\n var centerCurrent = new $.Point(\n this.centerSpringX.current.value,\n this.centerSpringY.current.value\n ),\n centerTarget = new $.Point(\n this.centerSpringX.target.value,\n this.centerSpringY.target.value\n ),\n oldZoomPixel,\n zoom,\n width,\n height,\n bounds,\n newZoomPixel,\n deltaZoomPixels,\n deltaZoomPoints;\n\n if ( current ) {\n return centerCurrent;\n } else if ( !this.zoomPoint ) {\n return centerTarget;\n }\n\n oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n\n zoom = this.getZoom();\n width = 1.0 / zoom;\n height = width / this.getAspectRatio();\n bounds = new $.Rect(\n centerCurrent.x - width / 2.0,\n centerCurrent.y - height / 2.0,\n width,\n height\n );\n\n newZoomPixel = this._pixelFromPoint(this.zoomPoint, bounds);\n deltaZoomPixels = newZoomPixel.minus( oldZoomPixel );\n deltaZoomPoints = deltaZoomPixels.divide( this._containerInnerSize.x * zoom );\n\n return centerTarget.plus( deltaZoomPoints );\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n */\n getZoom: function( current ) {\n if ( current ) {\n return this.zoomSpring.current.value;\n } else {\n return this.zoomSpring.target.value;\n }\n },\n\n // private\n _applyZoomConstraints: function(zoom) {\n return Math.max(\n Math.min(zoom, this.getMaxZoom()),\n this.getMinZoom());\n },\n\n /**\n * @function\n * @private\n * @param {OpenSeadragon.Rect} bounds\n * @return {OpenSeadragon.Rect} constrained bounds.\n */\n _applyBoundaryConstraints: function(bounds) {\n var newBounds = new $.Rect(\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height);\n\n if (this.wrapHorizontal) {\n //do nothing\n } else {\n var horizontalThreshold = this.visibilityRatio * newBounds.width;\n var boundsRight = newBounds.x + newBounds.width;\n var contentRight = this._contentBoundsNoRotate.x + this._contentBoundsNoRotate.width;\n var leftDx = this._contentBoundsNoRotate.x - boundsRight + horizontalThreshold;\n var rightDx = contentRight - newBounds.x - horizontalThreshold;\n\n if (horizontalThreshold > this._contentBoundsNoRotate.width) {\n newBounds.x += (leftDx + rightDx) / 2;\n } else if (rightDx < 0) {\n newBounds.x += rightDx;\n } else if (leftDx > 0) {\n newBounds.x += leftDx;\n }\n }\n\n if (this.wrapVertical) {\n //do nothing\n } else {\n var verticalThreshold = this.visibilityRatio * newBounds.height;\n var boundsBottom = newBounds.y + newBounds.height;\n var contentBottom = this._contentBoundsNoRotate.y + this._contentBoundsNoRotate.height;\n var topDy = this._contentBoundsNoRotate.y - boundsBottom + verticalThreshold;\n var bottomDy = contentBottom - newBounds.y - verticalThreshold;\n\n if (verticalThreshold > this._contentBoundsNoRotate.height) {\n newBounds.y += (topDy + bottomDy) / 2;\n } else if (bottomDy < 0) {\n newBounds.y += bottomDy;\n } else if (topDy > 0) {\n newBounds.y += topDy;\n }\n }\n\n return newBounds;\n },\n\n /**\n * @function\n * @private\n * @param {Boolean} [immediately=false] - whether the function that triggered this event was\n * called with the \"immediately\" flag\n */\n _raiseConstraintsEvent: function(immediately) {\n if (this.viewer) {\n /**\n * Raised when the viewport constraints are applied (see {@link OpenSeadragon.Viewport#applyConstraints}).\n *\n * @event constrain\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Boolean} immediately - whether the function that triggered this event was\n * called with the \"immediately\" flag\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'constrain', {\n immediately: immediately\n });\n }\n },\n\n /**\n * Enforces the minZoom, maxZoom and visibilityRatio constraints by\n * zooming and panning to the closest acceptable zoom and location.\n * @function\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:constrain\n */\n applyConstraints: function(immediately) {\n var actualZoom = this.getZoom();\n var constrainedZoom = this._applyZoomConstraints(actualZoom);\n\n if (actualZoom !== constrainedZoom) {\n this.zoomTo(constrainedZoom, this.zoomPoint, immediately);\n }\n\n var bounds = this.getBoundsNoRotate();\n var constrainedBounds = this._applyBoundaryConstraints(bounds);\n this._raiseConstraintsEvent(immediately);\n\n if (bounds.x !== constrainedBounds.x ||\n bounds.y !== constrainedBounds.y ||\n immediately) {\n this.fitBounds(\n constrainedBounds.rotate(-this.getRotation()),\n immediately);\n }\n return this;\n },\n\n /**\n * Equivalent to {@link OpenSeadragon.Viewport#applyConstraints}\n * @function\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:constrain\n */\n ensureVisible: function(immediately) {\n return this.applyConstraints(immediately);\n },\n\n /**\n * @function\n * @private\n * @param {OpenSeadragon.Rect} bounds\n * @param {Object} options (immediately=false, constraints=false)\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n _fitBounds: function(bounds, options) {\n options = options || {};\n var immediately = options.immediately || false;\n var constraints = options.constraints || false;\n\n var aspect = this.getAspectRatio();\n var center = bounds.getCenter();\n\n // Compute width and height of bounding box.\n var newBounds = new $.Rect(\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height,\n bounds.degrees + this.getRotation())\n .getBoundingBox();\n\n if (newBounds.getAspectRatio() >= aspect) {\n newBounds.height = newBounds.width / aspect;\n } else {\n newBounds.width = newBounds.height * aspect;\n }\n\n // Compute x and y from width, height and center position\n newBounds.x = center.x - newBounds.width / 2;\n newBounds.y = center.y - newBounds.height / 2;\n var newZoom = 1.0 / newBounds.width;\n\n if (constraints) {\n var newBoundsAspectRatio = newBounds.getAspectRatio();\n var newConstrainedZoom = this._applyZoomConstraints(newZoom);\n\n if (newZoom !== newConstrainedZoom) {\n newZoom = newConstrainedZoom;\n newBounds.width = 1.0 / newZoom;\n newBounds.x = center.x - newBounds.width / 2;\n newBounds.height = newBounds.width / newBoundsAspectRatio;\n newBounds.y = center.y - newBounds.height / 2;\n }\n\n newBounds = this._applyBoundaryConstraints(newBounds);\n center = newBounds.getCenter();\n this._raiseConstraintsEvent(immediately);\n }\n\n if (immediately) {\n this.panTo(center, true);\n return this.zoomTo(newZoom, null, true);\n }\n\n this.panTo(this.getCenter(true), true);\n this.zoomTo(this.getZoom(true), null, true);\n\n var oldBounds = this.getBounds();\n var oldZoom = this.getZoom();\n\n if (oldZoom === 0 || Math.abs(newZoom / oldZoom - 1) < 0.00000001) {\n this.zoomTo(newZoom, true);\n return this.panTo(center, immediately);\n }\n\n newBounds = newBounds.rotate(-this.getRotation());\n var referencePoint = newBounds.getTopLeft().times(newZoom)\n .minus(oldBounds.getTopLeft().times(oldZoom))\n .divide(newZoom - oldZoom);\n\n return this.zoomTo(newZoom, referencePoint, immediately);\n },\n\n /**\n * Makes the viewport zoom and pan so that the specified bounds take\n * as much space as possible in the viewport.\n * Note: this method ignores the constraints (minZoom, maxZoom and\n * visibilityRatio).\n * Use {@link OpenSeadragon.Viewport#fitBoundsWithConstraints} to enforce\n * them.\n * @function\n * @param {OpenSeadragon.Rect} bounds\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n fitBounds: function(bounds, immediately) {\n return this._fitBounds(bounds, {\n immediately: immediately,\n constraints: false\n });\n },\n\n /**\n * Makes the viewport zoom and pan so that the specified bounds take\n * as much space as possible in the viewport while enforcing the constraints\n * (minZoom, maxZoom and visibilityRatio).\n * Note: because this method enforces the constraints, part of the\n * provided bounds may end up outside of the viewport.\n * Use {@link OpenSeadragon.Viewport#fitBounds} to ignore them.\n * @function\n * @param {OpenSeadragon.Rect} bounds\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n fitBoundsWithConstraints: function(bounds, immediately) {\n return this._fitBounds(bounds, {\n immediately: immediately,\n constraints: true\n });\n },\n\n /**\n * Zooms so the image just fills the viewer vertically.\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n fitVertically: function(immediately) {\n var box = new $.Rect(\n this._contentBounds.x + (this._contentBounds.width / 2),\n this._contentBounds.y,\n 0,\n this._contentBounds.height);\n return this.fitBounds(box, immediately);\n },\n\n /**\n * Zooms so the image just fills the viewer horizontally.\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n fitHorizontally: function(immediately) {\n var box = new $.Rect(\n this._contentBounds.x,\n this._contentBounds.y + (this._contentBounds.height / 2),\n this._contentBounds.width,\n 0);\n return this.fitBounds(box, immediately);\n },\n\n\n /**\n * Returns bounds taking constraints into account\n * Added to improve constrained panning\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n getConstrainedBounds: function(current) {\n var bounds,\n constrainedBounds;\n\n bounds = this.getBounds(current);\n\n constrainedBounds = this._applyBoundaryConstraints(bounds);\n\n return constrainedBounds;\n },\n\n /**\n * @function\n * @param {OpenSeadragon.Point} delta\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:pan\n */\n panBy: function( delta, immediately ) {\n var center = new $.Point(\n this.centerSpringX.target.value,\n this.centerSpringY.target.value\n );\n return this.panTo( center.plus( delta ), immediately );\n },\n\n /**\n * @function\n * @param {OpenSeadragon.Point} center\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:pan\n */\n panTo: function( center, immediately ) {\n if ( immediately ) {\n this.centerSpringX.resetTo( center.x );\n this.centerSpringY.resetTo( center.y );\n } else {\n this.centerSpringX.springTo( center.x );\n this.centerSpringY.springTo( center.y );\n }\n\n if( this.viewer ){\n /**\n * Raised when the viewport is panned (see {@link OpenSeadragon.Viewport#panBy} and {@link OpenSeadragon.Viewport#panTo}).\n *\n * @event pan\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} center\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'pan', {\n center: center,\n immediately: immediately\n });\n }\n\n return this;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:zoom\n */\n zoomBy: function(factor, refPoint, immediately) {\n return this.zoomTo(\n this.zoomSpring.target.value * factor, refPoint, immediately);\n },\n\n /**\n * Zooms to the specified zoom level\n * @function\n * @param {Number} zoom The zoom level to zoom to.\n * @param {OpenSeadragon.Point} [refPoint] The point which will stay at\n * the same screen location. Defaults to the viewport center.\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:zoom\n */\n zoomTo: function(zoom, refPoint, immediately) {\n var _this = this;\n\n this.zoomPoint = refPoint instanceof $.Point &&\n !isNaN(refPoint.x) &&\n !isNaN(refPoint.y) ?\n refPoint :\n null;\n\n if (immediately) {\n this._adjustCenterSpringsForZoomPoint(function() {\n _this.zoomSpring.resetTo(zoom);\n });\n } else {\n this.zoomSpring.springTo(zoom);\n }\n\n if (this.viewer) {\n /**\n * Raised when the viewport zoom level changes (see {@link OpenSeadragon.Viewport#zoomBy} and {@link OpenSeadragon.Viewport#zoomTo}).\n *\n * @event zoom\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Number} zoom\n * @property {OpenSeadragon.Point} refPoint\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('zoom', {\n zoom: zoom,\n refPoint: refPoint,\n immediately: immediately\n });\n }\n\n return this;\n },\n\n /**\n * Rotates this viewport to the angle specified.\n * @function\n * @param {Number} degrees The degrees to set the rotation to.\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n setRotation: function(degrees) {\n if (!this.viewer || !this.viewer.drawer.canRotate()) {\n return this;\n }\n this.degrees = $.positiveModulo(degrees, 360);\n this._setContentBounds(\n this.viewer.world.getHomeBounds(),\n this.viewer.world.getContentFactor());\n this.viewer.forceRedraw();\n\n /**\n * Raised when rotation has been changed.\n *\n * @event rotate\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Number} degrees - The number of degrees the rotation was set to.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('rotate', {degrees: degrees});\n return this;\n },\n\n /**\n * Gets the current rotation in degrees.\n * @function\n * @return {Number} The current rotation in degrees.\n */\n getRotation: function() {\n return this.degrees;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:resize\n */\n resize: function( newContainerSize, maintain ) {\n var oldBounds = this.getBoundsNoRotate(),\n newBounds = oldBounds,\n widthDeltaFactor;\n\n this.containerSize.x = newContainerSize.x;\n this.containerSize.y = newContainerSize.y;\n\n this._updateContainerInnerSize();\n\n if ( maintain ) {\n // TODO: widthDeltaFactor will always be 1; probably not what's intended\n widthDeltaFactor = newContainerSize.x / this.containerSize.x;\n newBounds.width = oldBounds.width * widthDeltaFactor;\n newBounds.height = newBounds.width / this.getAspectRatio();\n }\n\n if( this.viewer ){\n /**\n * Raised when the viewer is resized (see {@link OpenSeadragon.Viewport#resize}).\n *\n * @event resize\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} newContainerSize\n * @property {Boolean} maintain\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'resize', {\n newContainerSize: newContainerSize,\n maintain: maintain\n });\n }\n\n return this.fitBounds( newBounds, true );\n },\n\n // private\n _updateContainerInnerSize: function() {\n this._containerInnerSize = new $.Point(\n Math.max(1, this.containerSize.x - (this._margins.left + this._margins.right)),\n Math.max(1, this.containerSize.y - (this._margins.top + this._margins.bottom))\n );\n },\n\n /**\n * Update the zoom and center (X and Y) springs.\n * @function\n * @returns {Boolean} True if any change has been made, false otherwise.\n */\n update: function() {\n var _this = this;\n this._adjustCenterSpringsForZoomPoint(function() {\n _this.zoomSpring.update();\n });\n\n this.centerSpringX.update();\n this.centerSpringY.update();\n\n var changed = this.centerSpringX.current.value !== this._oldCenterX ||\n this.centerSpringY.current.value !== this._oldCenterY ||\n this.zoomSpring.current.value !== this._oldZoom;\n\n this._oldCenterX = this.centerSpringX.current.value;\n this._oldCenterY = this.centerSpringY.current.value;\n this._oldZoom = this.zoomSpring.current.value;\n\n return changed;\n },\n\n _adjustCenterSpringsForZoomPoint: function(zoomSpringHandler) {\n if (this.zoomPoint) {\n var oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n zoomSpringHandler();\n var newZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n\n var deltaZoomPixels = newZoomPixel.minus(oldZoomPixel);\n var deltaZoomPoints = this.deltaPointsFromPixels(\n deltaZoomPixels, true);\n\n this.centerSpringX.shiftBy(deltaZoomPoints.x);\n this.centerSpringY.shiftBy(deltaZoomPoints.y);\n\n if (this.zoomSpring.isAtTargetValue()) {\n this.zoomPoint = null;\n }\n } else {\n zoomSpringHandler();\n }\n },\n\n /**\n * Convert a delta (translation vector) from viewport coordinates to pixels\n * coordinates. This method does not take rotation into account.\n * Consider using deltaPixelsFromPoints if you need to account for rotation.\n * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPixelsFromPointsNoRotate: function(deltaPoints, current) {\n return deltaPoints.times(\n this._containerInnerSize.x * this.getZoom(current)\n );\n },\n\n /**\n * Convert a delta (translation vector) from viewport coordinates to pixels\n * coordinates.\n * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPixelsFromPoints: function(deltaPoints, current) {\n return this.deltaPixelsFromPointsNoRotate(\n deltaPoints.rotate(this.getRotation()),\n current);\n },\n\n /**\n * Convert a delta (translation vector) from pixels coordinates to viewport\n * coordinates. This method does not take rotation into account.\n * Consider using deltaPointsFromPixels if you need to account for rotation.\n * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPointsFromPixelsNoRotate: function(deltaPixels, current) {\n return deltaPixels.divide(\n this._containerInnerSize.x * this.getZoom(current)\n );\n },\n\n /**\n * Convert a delta (translation vector) from pixels coordinates to viewport\n * coordinates.\n * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPointsFromPixels: function(deltaPixels, current) {\n return this.deltaPointsFromPixelsNoRotate(deltaPixels, current)\n .rotate(-this.getRotation());\n },\n\n /**\n * Convert viewport coordinates to pixels coordinates.\n * This method does not take rotation into account.\n * Consider using pixelFromPoint if you need to account for rotation.\n * @param {OpenSeadragon.Point} point the viewport coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pixelFromPointNoRotate: function(point, current) {\n return this._pixelFromPointNoRotate(\n point, this.getBoundsNoRotate(current));\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates.\n * @param {OpenSeadragon.Point} point the viewport coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pixelFromPoint: function(point, current) {\n return this._pixelFromPoint(point, this.getBoundsNoRotate(current));\n },\n\n // private\n _pixelFromPointNoRotate: function(point, bounds) {\n return point.minus(\n bounds.getTopLeft()\n ).times(\n this._containerInnerSize.x / bounds.width\n ).plus(\n new $.Point(this._margins.left, this._margins.top)\n );\n },\n\n // private\n _pixelFromPoint: function(point, bounds) {\n return this._pixelFromPointNoRotate(\n point.rotate(this.getRotation(), this.getCenter(true)),\n bounds);\n },\n\n /**\n * Convert pixel coordinates to viewport coordinates.\n * This method does not take rotation into account.\n * Consider using pointFromPixel if you need to account for rotation.\n * @param {OpenSeadragon.Point} pixel Pixel coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pointFromPixelNoRotate: function(pixel, current) {\n var bounds = this.getBoundsNoRotate(current);\n return pixel.minus(\n new $.Point(this._margins.left, this._margins.top)\n ).divide(\n this._containerInnerSize.x / bounds.width\n ).plus(\n bounds.getTopLeft()\n );\n },\n\n /**\n * Convert pixel coordinates to viewport coordinates.\n * @param {OpenSeadragon.Point} pixel Pixel coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pointFromPixel: function(pixel, current) {\n return this.pointFromPixelNoRotate(pixel, current).rotate(\n -this.getRotation(),\n this.getCenter(true)\n );\n },\n\n // private\n _viewportToImageDelta: function( viewerX, viewerY ) {\n var scale = this._contentBoundsNoRotate.width;\n return new $.Point(\n viewerX * this._contentSizeNoRotate.x / scale,\n viewerY * this._contentSizeNoRotate.x / scale);\n },\n\n /**\n * Translates from OpenSeadragon viewer coordinate system to image coordinate system.\n * This method can be called either by passing X,Y coordinates or an\n * OpenSeadragon.Point\n * Note: not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.\n * @function\n * @param {(OpenSeadragon.Point|Number)} viewerX either a point or the X\n * coordinate in viewport coordinate system.\n * @param {Number} [viewerY] Y coordinate in viewport coordinate system.\n * @return {OpenSeadragon.Point} a point representing the coordinates in the image.\n */\n viewportToImageCoordinates: function(viewerX, viewerY) {\n if (viewerX instanceof $.Point) {\n //they passed a point instead of individual components\n return this.viewportToImageCoordinates(viewerX.x, viewerX.y);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.viewportToImageCoordinates] is not accurate ' +\n 'with multi-image; use TiledImage.viewportToImageCoordinates instead.');\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageCoordinates(viewerX, viewerY, true);\n }\n }\n\n return this._viewportToImageDelta(\n viewerX - this._contentBoundsNoRotate.x,\n viewerY - this._contentBoundsNoRotate.y);\n },\n\n // private\n _imageToViewportDelta: function( imageX, imageY ) {\n var scale = this._contentBoundsNoRotate.width;\n return new $.Point(\n imageX / this._contentSizeNoRotate.x * scale,\n imageY / this._contentSizeNoRotate.x * scale);\n },\n\n /**\n * Translates from image coordinate system to OpenSeadragon viewer coordinate system\n * This method can be called either by passing X,Y coordinates or an\n * OpenSeadragon.Point\n * Note: not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.\n * @function\n * @param {(OpenSeadragon.Point | Number)} imageX the point or the\n * X coordinate in image coordinate system.\n * @param {Number} [imageY] Y coordinate in image coordinate system.\n * @return {OpenSeadragon.Point} a point representing the coordinates in the viewport.\n */\n imageToViewportCoordinates: function(imageX, imageY) {\n if (imageX instanceof $.Point) {\n //they passed a point instead of individual components\n return this.imageToViewportCoordinates(imageX.x, imageX.y);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.imageToViewportCoordinates] is not accurate ' +\n 'with multi-image; use TiledImage.imageToViewportCoordinates instead.');\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportCoordinates(imageX, imageY, true);\n }\n }\n\n var point = this._imageToViewportDelta(imageX, imageY);\n point.x += this._contentBoundsNoRotate.x;\n point.y += this._contentBoundsNoRotate.y;\n return point;\n },\n\n /**\n * Translates from a rectangle which describes a portion of the image in\n * pixel coordinates to OpenSeadragon viewport rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an\n * OpenSeadragon.Rect\n * Note: not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.\n * @function\n * @param {(OpenSeadragon.Rect | Number)} imageX the rectangle or the X\n * coordinate of the top left corner of the rectangle in image coordinate system.\n * @param {Number} [imageY] the Y coordinate of the top left corner of the rectangle\n * in image coordinate system.\n * @param {Number} [pixelWidth] the width in pixel of the rectangle.\n * @param {Number} [pixelHeight] the height in pixel of the rectangle.\n * @returns {OpenSeadragon.Rect} This image's bounds in viewport coordinates\n */\n imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight) {\n var rect = imageX;\n if (!(rect instanceof $.Rect)) {\n //they passed individual components instead of a rectangle\n rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.imageToViewportRectangle] is not accurate ' +\n 'with multi-image; use TiledImage.imageToViewportRectangle instead.');\n } else if (count === 1) {\n // It is better to use TiledImage.imageToViewportRectangle\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportRectangle(\n imageX, imageY, pixelWidth, pixelHeight, true);\n }\n }\n\n var coordA = this.imageToViewportCoordinates(rect.x, rect.y);\n var coordB = this._imageToViewportDelta(rect.width, rect.height);\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees\n );\n },\n\n /**\n * Translates from a rectangle which describes a portion of\n * the viewport in point coordinates to image rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an\n * OpenSeadragon.Rect\n * Note: not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.\n * @function\n * @param {(OpenSeadragon.Rect | Number)} viewerX either a rectangle or\n * the X coordinate of the top left corner of the rectangle in viewport\n * coordinate system.\n * @param {Number} [viewerY] the Y coordinate of the top left corner of the rectangle\n * in viewport coordinate system.\n * @param {Number} [pointWidth] the width of the rectangle in viewport coordinate system.\n * @param {Number} [pointHeight] the height of the rectangle in viewport coordinate system.\n */\n viewportToImageRectangle: function(viewerX, viewerY, pointWidth, pointHeight) {\n var rect = viewerX;\n if (!(rect instanceof $.Rect)) {\n //they passed individual components instead of a rectangle\n rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.viewportToImageRectangle] is not accurate ' +\n 'with multi-image; use TiledImage.viewportToImageRectangle instead.');\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageRectangle(\n viewerX, viewerY, pointWidth, pointHeight, true);\n }\n }\n\n var coordA = this.viewportToImageCoordinates(rect.x, rect.y);\n var coordB = this._viewportToImageDelta(rect.width, rect.height);\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees\n );\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to image\n * coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToImageCoordinates: function( pixel ) {\n var point = this.pointFromPixel( pixel, true );\n return this.viewportToImageCoordinates( point );\n },\n\n /**\n * Convert pixel coordinates relative to the image to\n * viewer element coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToViewerElementCoordinates: function( pixel ) {\n var point = this.imageToViewportCoordinates( pixel );\n return this.pixelFromPoint( point, true );\n },\n\n /**\n * Convert pixel coordinates relative to the window to image coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToImageCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.windowToImageCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = pixel.minus(\n $.getElementPosition(this.viewer.element));\n return this.viewerElementToImageCoordinates(viewerCoordinates);\n },\n\n /**\n * Convert image coordinates to pixel coordinates relative to the window.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToWindowCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.imageToWindowCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = this.imageToViewerElementCoordinates(pixel);\n return viewerCoordinates.plus(\n $.getElementPosition(this.viewer.element));\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to viewport\n * coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToViewportCoordinates: function( pixel ) {\n return this.pointFromPixel( pixel, true );\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates relative to the\n * viewer element.\n * @param {OpenSeadragon.Point} point\n * @returns {OpenSeadragon.Point}\n */\n viewportToViewerElementCoordinates: function( point ) {\n return this.pixelFromPoint( point, true );\n },\n\n /**\n * Convert a rectangle in pixel coordinates relative to the viewer element\n * to viewport coordinates.\n * @param {OpenSeadragon.Rect} rectangle the rectangle to convert\n * @returns {OpenSeadragon.Rect} the converted rectangle\n */\n viewerElementToViewportRectangle: function(rectangle) {\n return $.Rect.fromSummits(\n this.pointFromPixel(rectangle.getTopLeft(), true),\n this.pointFromPixel(rectangle.getTopRight(), true),\n this.pointFromPixel(rectangle.getBottomLeft(), true)\n );\n },\n\n /**\n * Convert a rectangle in viewport coordinates to pixel coordinates relative\n * to the viewer element.\n * @param {OpenSeadragon.Rect} rectangle the rectangle to convert\n * @returns {OpenSeadragon.Rect} the converted rectangle\n */\n viewportToViewerElementRectangle: function(rectangle) {\n return $.Rect.fromSummits(\n this.pixelFromPoint(rectangle.getTopLeft(), true),\n this.pixelFromPoint(rectangle.getTopRight(), true),\n this.pixelFromPoint(rectangle.getBottomLeft(), true)\n );\n },\n\n /**\n * Convert pixel coordinates relative to the window to viewport coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToViewportCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.windowToViewportCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = pixel.minus(\n $.getElementPosition(this.viewer.element));\n return this.viewerElementToViewportCoordinates(viewerCoordinates);\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates relative to the window.\n * @param {OpenSeadragon.Point} point\n * @returns {OpenSeadragon.Point}\n */\n viewportToWindowCoordinates: function(point) {\n $.console.assert(this.viewer,\n \"[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = this.viewportToViewerElementCoordinates(point);\n return viewerCoordinates.plus(\n $.getElementPosition(this.viewer.element));\n },\n\n /**\n * Convert a viewport zoom to an image zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} viewportZoom The viewport zoom\n * target zoom.\n * @returns {Number} imageZoom The image zoom\n */\n viewportToImageZoom: function(viewportZoom) {\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.viewportToImageZoom] is not ' +\n 'accurate with multi-image.');\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageZoom\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageZoom(viewportZoom);\n }\n }\n\n var imageWidth = this._contentSizeNoRotate.x;\n var containerWidth = this._containerInnerSize.x;\n var scale = this._contentBoundsNoRotate.width;\n var viewportToImageZoomRatio = (containerWidth / imageWidth) * scale;\n return viewportZoom * viewportToImageZoomRatio;\n },\n\n /**\n * Convert an image zoom to a viewport zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} imageZoom The image zoom\n * target zoom.\n * @returns {Number} viewportZoom The viewport zoom\n */\n imageToViewportZoom: function(imageZoom) {\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.imageToViewportZoom] is not accurate ' +\n 'with multi-image.');\n } else if (count === 1) {\n // It is better to use TiledImage.imageToViewportZoom\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportZoom(imageZoom);\n }\n }\n\n var imageWidth = this._contentSizeNoRotate.x;\n var containerWidth = this._containerInnerSize.x;\n var scale = this._contentBoundsNoRotate.width;\n var viewportToImageZoomRatio = (imageWidth / containerWidth) / scale;\n return imageZoom * viewportToImageZoomRatio;\n },\n\n /**\n * Toggles flip state and demands a new drawing on navigator and viewer objects.\n * @function\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n toggleFlip: function() {\n this.setFlip(!this.getFlip());\n return this;\n },\n\n /**\n * Get flip state stored on viewport.\n * @function\n * @return {Boolean} Flip state.\n */\n getFlip: function() {\n return this.flipped;\n },\n\n /**\n * Sets flip state according to the state input argument.\n * @function\n * @param {Boolean} state - Flip state to set.\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n setFlip: function( state ) {\n if ( this.flipped === state ) {\n return this;\n }\n\n this.flipped = state;\n if(this.viewer.navigator){\n this.viewer.navigator.setFlip(this.getFlip());\n }\n this.viewer.forceRedraw();\n\n /**\n * Raised when flip state has been changed.\n *\n * @event flip\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Number} flipped - The flip state after this change.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('flip', {flipped: state});\n return this;\n }\n\n};\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - TiledImage\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * You shouldn't have to create a TiledImage instance directly; get it asynchronously by\n * using {@link OpenSeadragon.Viewer#open} or {@link OpenSeadragon.Viewer#addTiledImage} instead.\n * @class TiledImage\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.\n * A new instance is created for each TileSource opened.\n * @param {Object} options - Configuration for this TiledImage.\n * @param {OpenSeadragon.TileSource} options.source - The TileSource that defines this TiledImage.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this TiledImage.\n * @param {OpenSeadragon.TileCache} options.tileCache - The TileCache for this TiledImage to use.\n * @param {OpenSeadragon.Drawer} options.drawer - The Drawer for this TiledImage to draw onto.\n * @param {OpenSeadragon.ImageLoader} options.imageLoader - The ImageLoader for this TiledImage to use.\n * @param {Number} [options.x=0] - Left position, in viewport coordinates.\n * @param {Number} [options.y=0] - Top position, in viewport coordinates.\n * @param {Number} [options.width=1] - Width, in viewport coordinates.\n * @param {Number} [options.height] - Height, in viewport coordinates.\n * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates\n * to fit the image into. If specified, x, y, width and height get ignored.\n * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds if options.fitBounds is set.\n * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @param {Number} [options.springStiffness] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.animationTime] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomImageRatio] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapHorizontal] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapVertical] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.immediateRender] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.blendTime] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.alwaysBlend] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.minPixelRatio] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.smoothTileEdgesMinZoom] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.iOSDevice] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.opacity=1] - Set to draw at proportional opacity. If zero, images will not draw.\n * @param {Boolean} [options.preload=false] - Set true to load even when the image is hidden by zero opacity.\n * @param {String} [options.compositeOperation] - How the image is composited onto other images; see compositeOperation in {@link OpenSeadragon.Options} for possible values.\n * @param {Boolean} [options.debugMode] - See {@link OpenSeadragon.Options}.\n * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.\n * @param {String|Boolean} [options.crossOriginPolicy] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.ajaxWithCredentials] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.loadTilesWithAjax]\n * Whether to load tile data using AJAX requests.\n * Defaults to the setting in {@link OpenSeadragon.Options}.\n * @param {Object} [options.ajaxHeaders={}]\n * A set of headers to include when making tile AJAX requests.\n */\n$.TiledImage = function( options ) {\n var _this = this;\n /**\n * The {@link OpenSeadragon.TileSource} that defines this TiledImage.\n * @member {OpenSeadragon.TileSource} source\n * @memberof OpenSeadragon.TiledImage#\n */\n $.console.assert( options.tileCache, \"[TiledImage] options.tileCache is required\" );\n $.console.assert( options.drawer, \"[TiledImage] options.drawer is required\" );\n $.console.assert( options.viewer, \"[TiledImage] options.viewer is required\" );\n $.console.assert( options.imageLoader, \"[TiledImage] options.imageLoader is required\" );\n $.console.assert( options.source, \"[TiledImage] options.source is required\" );\n $.console.assert(!options.clip || options.clip instanceof $.Rect,\n \"[TiledImage] options.clip must be an OpenSeadragon.Rect if present\");\n\n $.EventSource.call( this );\n\n this._tileCache = options.tileCache;\n delete options.tileCache;\n\n this._drawer = options.drawer;\n delete options.drawer;\n\n this._imageLoader = options.imageLoader;\n delete options.imageLoader;\n\n if (options.clip instanceof $.Rect) {\n this._clip = options.clip.clone();\n }\n\n delete options.clip;\n\n var x = options.x || 0;\n delete options.x;\n var y = options.y || 0;\n delete options.y;\n\n // Ratio of zoomable image height to width.\n this.normHeight = options.source.dimensions.y / options.source.dimensions.x;\n this.contentAspectX = options.source.dimensions.x / options.source.dimensions.y;\n\n var scale = 1;\n if ( options.width ) {\n scale = options.width;\n delete options.width;\n\n if ( options.height ) {\n $.console.error( \"specifying both width and height to a tiledImage is not supported\" );\n delete options.height;\n }\n } else if ( options.height ) {\n scale = options.height / this.normHeight;\n delete options.height;\n }\n\n var fitBounds = options.fitBounds;\n delete options.fitBounds;\n var fitBoundsPlacement = options.fitBoundsPlacement || OpenSeadragon.Placement.CENTER;\n delete options.fitBoundsPlacement;\n\n var degrees = options.degrees || 0;\n delete options.degrees;\n\n $.extend( true, this, {\n\n //internal state properties\n viewer: null,\n tilesMatrix: {}, // A '3d' dictionary [level][x][y] --> Tile.\n coverage: {}, // A '3d' dictionary [level][x][y] --> Boolean; shows what areas have been drawn.\n loadingCoverage: {}, // A '3d' dictionary [level][x][y] --> Boolean; shows what areas are loaded or are being loaded/blended.\n lastDrawn: [], // An unordered list of Tiles drawn last frame.\n lastResetTime: 0, // Last time for which the tiledImage was reset.\n _midDraw: false, // Is the tiledImage currently updating the viewport?\n _needsDraw: true, // Does the tiledImage need to update the viewport again?\n _hasOpaqueTile: false, // Do we have even one fully opaque tile?\n _tilesLoading: 0, // The number of pending tile requests.\n //configurable settings\n springStiffness: $.DEFAULT_SETTINGS.springStiffness,\n animationTime: $.DEFAULT_SETTINGS.animationTime,\n minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio,\n wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal,\n wrapVertical: $.DEFAULT_SETTINGS.wrapVertical,\n immediateRender: $.DEFAULT_SETTINGS.immediateRender,\n blendTime: $.DEFAULT_SETTINGS.blendTime,\n alwaysBlend: $.DEFAULT_SETTINGS.alwaysBlend,\n minPixelRatio: $.DEFAULT_SETTINGS.minPixelRatio,\n smoothTileEdgesMinZoom: $.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,\n iOSDevice: $.DEFAULT_SETTINGS.iOSDevice,\n debugMode: $.DEFAULT_SETTINGS.debugMode,\n crossOriginPolicy: $.DEFAULT_SETTINGS.crossOriginPolicy,\n ajaxWithCredentials: $.DEFAULT_SETTINGS.ajaxWithCredentials,\n placeholderFillStyle: $.DEFAULT_SETTINGS.placeholderFillStyle,\n opacity: $.DEFAULT_SETTINGS.opacity,\n preload: $.DEFAULT_SETTINGS.preload,\n compositeOperation: $.DEFAULT_SETTINGS.compositeOperation\n }, options );\n\n this._preload = this.preload;\n delete this.preload;\n\n this._fullyLoaded = false;\n\n this._xSpring = new $.Spring({\n initial: x,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._ySpring = new $.Spring({\n initial: y,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._scaleSpring = new $.Spring({\n initial: scale,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._degreesSpring = new $.Spring({\n initial: degrees,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._updateForScale();\n\n if (fitBounds) {\n this.fitBounds(fitBounds, fitBoundsPlacement, true);\n }\n\n // We need a callback to give image manipulation a chance to happen\n this._drawingHandler = function(args) {\n /**\n * This event is fired just before the tile is drawn giving the application a chance to alter the image.\n *\n * NOTE: This event is only fired when the drawer is using a <canvas>.\n *\n * @event tile-drawing\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.Tile} tile - The Tile being drawn.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} context - The HTML canvas context being drawn into.\n * @property {OpenSeadragon.Tile} rendered - The HTML canvas context containing the tile imagery.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.viewer.raiseEvent('tile-drawing', $.extend({\n tiledImage: _this\n }, args));\n };\n};\n\n$.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.TiledImage.prototype */{\n /**\n * @returns {Boolean} Whether the TiledImage needs to be drawn.\n */\n needsDraw: function() {\n return this._needsDraw;\n },\n\n /**\n * @returns {Boolean} Whether all tiles necessary for this TiledImage to draw at the current view have been loaded.\n */\n getFullyLoaded: function() {\n return this._fullyLoaded;\n },\n\n // private\n _setFullyLoaded: function(flag) {\n if (flag === this._fullyLoaded) {\n return;\n }\n\n this._fullyLoaded = flag;\n\n /**\n * Fired when the TiledImage's \"fully loaded\" flag (whether all tiles necessary for this TiledImage\n * to draw at the current view have been loaded) changes.\n *\n * @event fully-loaded-change\n * @memberof OpenSeadragon.TiledImage\n * @type {object}\n * @property {Boolean} fullyLoaded - The new \"fully loaded\" value.\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('fully-loaded-change', {\n fullyLoaded: this._fullyLoaded\n });\n },\n\n /**\n * Clears all tiles and triggers an update on the next call to\n * {@link OpenSeadragon.TiledImage#update}.\n */\n reset: function() {\n this._tileCache.clearTilesFor(this);\n this.lastResetTime = $.now();\n this._needsDraw = true;\n },\n\n /**\n * Updates the TiledImage's bounds, animating if needed.\n * @returns {Boolean} Whether the TiledImage animated.\n */\n update: function() {\n var xUpdated = this._xSpring.update();\n var yUpdated = this._ySpring.update();\n var scaleUpdated = this._scaleSpring.update();\n var degreesUpdated = this._degreesSpring.update();\n\n if (xUpdated || yUpdated || scaleUpdated || degreesUpdated) {\n this._updateForScale();\n this._needsDraw = true;\n return true;\n }\n\n return false;\n },\n\n /**\n * Draws the TiledImage to its Drawer.\n */\n draw: function() {\n if (this.opacity !== 0 || this._preload) {\n this._midDraw = true;\n this._updateViewport();\n this._midDraw = false;\n }\n // Images with opacity 0 should not need to be drawn in future. this._needsDraw = false is set in this._updateViewport() for other images.\n else {\n this._needsDraw = false;\n }\n },\n\n /**\n * Destroy the TiledImage (unload current loaded tiles).\n */\n destroy: function() {\n this.reset();\n\n if (this.source.destroy) {\n this.source.destroy();\n }\n },\n\n /**\n * Get this TiledImage's bounds in viewport coordinates.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * false for target location.\n * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.\n */\n getBounds: function(current) {\n return this.getBoundsNoRotate(current)\n .rotate(this.getRotation(current), this._getRotationPoint(current));\n },\n\n /**\n * Get this TiledImage's bounds in viewport coordinates without taking\n * rotation into account.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * false for target location.\n * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.\n */\n getBoundsNoRotate: function(current) {\n return current ?\n new $.Rect(\n this._xSpring.current.value,\n this._ySpring.current.value,\n this._worldWidthCurrent,\n this._worldHeightCurrent) :\n new $.Rect(\n this._xSpring.target.value,\n this._ySpring.target.value,\n this._worldWidthTarget,\n this._worldHeightTarget);\n },\n\n // deprecated\n getWorldBounds: function() {\n $.console.error('[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead');\n return this.getBounds();\n },\n\n /**\n * Get the bounds of the displayed part of the tiled image.\n * @param {Boolean} [current=false] Pass true for the current location,\n * false for the target location.\n * @returns {$.Rect} The clipped bounds in viewport coordinates.\n */\n getClippedBounds: function(current) {\n var bounds = this.getBoundsNoRotate(current);\n if (this._clip) {\n var worldWidth = current ?\n this._worldWidthCurrent : this._worldWidthTarget;\n var ratio = worldWidth / this.source.dimensions.x;\n var clip = this._clip.times(ratio);\n bounds = new $.Rect(\n bounds.x + clip.x,\n bounds.y + clip.y,\n clip.width,\n clip.height);\n }\n return bounds.rotate(this.getRotation(current), this._getRotationPoint(current));\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @returns {OpenSeadragon.Rect} Where this tile fits (in normalized coordinates).\n */\n getTileBounds: function( level, x, y ) {\n var numTiles = this.source.getNumTiles(level);\n var xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x;\n var yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y;\n var bounds = this.source.getTileBounds(level, xMod, yMod);\n if (this.getFlip()) {\n bounds.x = 1 - bounds.x - bounds.width;\n }\n bounds.x += (x - xMod) / numTiles.x;\n bounds.y += (this._worldHeightCurrent / this._worldWidthCurrent) * ((y - yMod) / numTiles.y);\n return bounds;\n },\n\n /**\n * @returns {OpenSeadragon.Point} This TiledImage's content size, in original pixels.\n */\n getContentSize: function() {\n return new $.Point(this.source.dimensions.x, this.source.dimensions.y);\n },\n\n /**\n * @returns {OpenSeadragon.Point} The TiledImage's content size, in window coordinates.\n */\n getSizeInWindowCoordinates: function() {\n var topLeft = this.imageToWindowCoordinates(new $.Point(0, 0));\n var bottomRight = this.imageToWindowCoordinates(this.getContentSize());\n return new $.Point(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);\n },\n\n // private\n _viewportToImageDelta: function( viewerX, viewerY, current ) {\n var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);\n return new $.Point(viewerX * (this.source.dimensions.x / scale),\n viewerY * ((this.source.dimensions.y * this.contentAspectX) / scale));\n },\n\n /**\n * Translates from OpenSeadragon viewer coordinate system to image coordinate system.\n * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.\n * @param {Number|OpenSeadragon.Point} viewerX - The X coordinate or point in viewport coordinate system.\n * @param {Number} [viewerY] - The Y coordinate in viewport coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @return {OpenSeadragon.Point} A point representing the coordinates in the image.\n */\n viewportToImageCoordinates: function(viewerX, viewerY, current) {\n var point;\n if (viewerX instanceof $.Point) {\n //they passed a point instead of individual components\n current = viewerY;\n point = viewerX;\n } else {\n point = new $.Point(viewerX, viewerY);\n }\n\n point = point.rotate(-this.getRotation(current), this._getRotationPoint(current));\n return current ?\n this._viewportToImageDelta(\n point.x - this._xSpring.current.value,\n point.y - this._ySpring.current.value) :\n this._viewportToImageDelta(\n point.x - this._xSpring.target.value,\n point.y - this._ySpring.target.value);\n },\n\n // private\n _imageToViewportDelta: function( imageX, imageY, current ) {\n var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);\n return new $.Point((imageX / this.source.dimensions.x) * scale,\n (imageY / this.source.dimensions.y / this.contentAspectX) * scale);\n },\n\n /**\n * Translates from image coordinate system to OpenSeadragon viewer coordinate system\n * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.\n * @param {Number|OpenSeadragon.Point} imageX - The X coordinate or point in image coordinate system.\n * @param {Number} [imageY] - The Y coordinate in image coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @return {OpenSeadragon.Point} A point representing the coordinates in the viewport.\n */\n imageToViewportCoordinates: function(imageX, imageY, current) {\n if (imageX instanceof $.Point) {\n //they passed a point instead of individual components\n current = imageY;\n imageY = imageX.y;\n imageX = imageX.x;\n }\n\n var point = this._imageToViewportDelta(imageX, imageY);\n if (current) {\n point.x += this._xSpring.current.value;\n point.y += this._ySpring.current.value;\n } else {\n point.x += this._xSpring.target.value;\n point.y += this._ySpring.target.value;\n }\n\n return point.rotate(this.getRotation(current), this._getRotationPoint(current));\n },\n\n /**\n * Translates from a rectangle which describes a portion of the image in\n * pixel coordinates to OpenSeadragon viewport rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.\n * @param {Number|OpenSeadragon.Rect} imageX - The left coordinate or rectangle in image coordinate system.\n * @param {Number} [imageY] - The top coordinate in image coordinate system.\n * @param {Number} [pixelWidth] - The width in pixel of the rectangle.\n * @param {Number} [pixelHeight] - The height in pixel of the rectangle.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @return {OpenSeadragon.Rect} A rect representing the coordinates in the viewport.\n */\n imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight, current) {\n var rect = imageX;\n if (rect instanceof $.Rect) {\n //they passed a rect instead of individual components\n current = imageY;\n } else {\n rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);\n }\n\n var coordA = this.imageToViewportCoordinates(rect.getTopLeft(), current);\n var coordB = this._imageToViewportDelta(rect.width, rect.height, current);\n\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees + this.getRotation(current)\n );\n },\n\n /**\n * Translates from a rectangle which describes a portion of\n * the viewport in point coordinates to image rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.\n * @param {Number|OpenSeadragon.Rect} viewerX - The left coordinate or rectangle in viewport coordinate system.\n * @param {Number} [viewerY] - The top coordinate in viewport coordinate system.\n * @param {Number} [pointWidth] - The width in viewport coordinate system.\n * @param {Number} [pointHeight] - The height in viewport coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @return {OpenSeadragon.Rect} A rect representing the coordinates in the image.\n */\n viewportToImageRectangle: function( viewerX, viewerY, pointWidth, pointHeight, current ) {\n var rect = viewerX;\n if (viewerX instanceof $.Rect) {\n //they passed a rect instead of individual components\n current = viewerY;\n } else {\n rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);\n }\n\n var coordA = this.viewportToImageCoordinates(rect.getTopLeft(), current);\n var coordB = this._viewportToImageDelta(rect.width, rect.height, current);\n\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees - this.getRotation(current)\n );\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to image\n * coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToImageCoordinates: function( pixel ) {\n var point = this.viewport.pointFromPixel( pixel, true );\n return this.viewportToImageCoordinates( point );\n },\n\n /**\n * Convert pixel coordinates relative to the image to\n * viewer element coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToViewerElementCoordinates: function( pixel ) {\n var point = this.imageToViewportCoordinates( pixel );\n return this.viewport.pixelFromPoint( point, true );\n },\n\n /**\n * Convert pixel coordinates relative to the window to image coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToImageCoordinates: function( pixel ) {\n var viewerCoordinates = pixel.minus(\n OpenSeadragon.getElementPosition( this.viewer.element ));\n return this.viewerElementToImageCoordinates( viewerCoordinates );\n },\n\n /**\n * Convert image coordinates to pixel coordinates relative to the window.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToWindowCoordinates: function( pixel ) {\n var viewerCoordinates = this.imageToViewerElementCoordinates( pixel );\n return viewerCoordinates.plus(\n OpenSeadragon.getElementPosition( this.viewer.element ));\n },\n\n // private\n // Convert rectangle in viewport coordinates to this tiled image point\n // coordinates (x in [0, 1] and y in [0, aspectRatio])\n _viewportToTiledImageRectangle: function(rect) {\n var scale = this._scaleSpring.current.value;\n rect = rect.rotate(-this.getRotation(true), this._getRotationPoint(true));\n return new $.Rect(\n (rect.x - this._xSpring.current.value) / scale,\n (rect.y - this._ySpring.current.value) / scale,\n rect.width / scale,\n rect.height / scale,\n rect.degrees);\n },\n\n /**\n * Convert a viewport zoom to an image zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * @function\n * @param {Number} viewportZoom The viewport zoom\n * @returns {Number} imageZoom The image zoom\n */\n viewportToImageZoom: function( viewportZoom ) {\n var ratio = this._scaleSpring.current.value *\n this.viewport._containerInnerSize.x / this.source.dimensions.x;\n return ratio * viewportZoom;\n },\n\n /**\n * Convert an image zoom to a viewport zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} imageZoom The image zoom\n * @returns {Number} viewportZoom The viewport zoom\n */\n imageToViewportZoom: function( imageZoom ) {\n var ratio = this._scaleSpring.current.value *\n this.viewport._containerInnerSize.x / this.source.dimensions.x;\n return imageZoom / ratio;\n },\n\n /**\n * Sets the TiledImage's position in the world.\n * @param {OpenSeadragon.Point} position - The new position, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new position or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setPosition: function(position, immediately) {\n var sameTarget = (this._xSpring.target.value === position.x &&\n this._ySpring.target.value === position.y);\n\n if (immediately) {\n if (sameTarget && this._xSpring.current.value === position.x &&\n this._ySpring.current.value === position.y) {\n return;\n }\n\n this._xSpring.resetTo(position.x);\n this._ySpring.resetTo(position.y);\n this._needsDraw = true;\n } else {\n if (sameTarget) {\n return;\n }\n\n this._xSpring.springTo(position.x);\n this._ySpring.springTo(position.y);\n this._needsDraw = true;\n }\n\n if (!sameTarget) {\n this._raiseBoundsChange();\n }\n },\n\n /**\n * Sets the TiledImage's width in the world, adjusting the height to match based on aspect ratio.\n * @param {Number} width - The new width, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setWidth: function(width, immediately) {\n this._setScale(width, immediately);\n },\n\n /**\n * Sets the TiledImage's height in the world, adjusting the width to match based on aspect ratio.\n * @param {Number} height - The new height, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setHeight: function(height, immediately) {\n this._setScale(height / this.normHeight, immediately);\n },\n\n /**\n * Sets an array of polygons to crop the TiledImage during draw tiles.\n * The render function will use the default non-zero winding rule.\n * @param {OpenSeadragon.Point[][]} polygons - represented in an array of point object in image coordinates.\n * Example format: [\n * [{x: 197, y:172}, {x: 226, y:172}, {x: 226, y:198}, {x: 197, y:198}], // First polygon\n * [{x: 328, y:200}, {x: 330, y:199}, {x: 332, y:201}, {x: 329, y:202}] // Second polygon\n * [{x: 321, y:201}, {x: 356, y:205}, {x: 341, y:250}] // Third polygon\n * ]\n */\n setCroppingPolygons: function( polygons ) {\n\n var isXYObject = function(obj) {\n return obj instanceof $.Point || (typeof obj.x === 'number' && typeof obj.y === 'number');\n };\n\n var objectToSimpleXYObject = function(objs) {\n return objs.map(function(obj) {\n try {\n if (isXYObject(obj)) {\n return { x: obj.x, y: obj.y };\n } else {\n throw new Error();\n }\n } catch(e) {\n throw new Error('A Provided cropping polygon point is not supported');\n }\n });\n };\n\n try {\n if (!$.isArray(polygons)) {\n throw new Error('Provided cropping polygon is not an array');\n }\n this._croppingPolygons = polygons.map(function(polygon){\n return objectToSimpleXYObject(polygon);\n });\n } catch (e) {\n $.console.error('[TiledImage.setCroppingPolygons] Cropping polygon format not supported');\n $.console.error(e);\n this._croppingPolygons = null;\n }\n },\n\n /**\n * Resets the cropping polygons, thus next render will remove all cropping\n * polygon effects.\n */\n resetCroppingPolygons: function() {\n this._croppingPolygons = null;\n },\n\n /**\n * Positions and scales the TiledImage to fit in the specified bounds.\n * Note: this method fires OpenSeadragon.TiledImage.event:bounds-change\n * twice\n * @param {OpenSeadragon.Rect} bounds The bounds to fit the image into.\n * @param {OpenSeadragon.Placement} [anchor=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds.\n * @param {Boolean} [immediately=false] Whether to animate to the new size\n * or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n fitBounds: function(bounds, anchor, immediately) {\n anchor = anchor || $.Placement.CENTER;\n var anchorProperties = $.Placement.properties[anchor];\n var aspectRatio = this.contentAspectX;\n var xOffset = 0;\n var yOffset = 0;\n var displayedWidthRatio = 1;\n var displayedHeightRatio = 1;\n if (this._clip) {\n aspectRatio = this._clip.getAspectRatio();\n displayedWidthRatio = this._clip.width / this.source.dimensions.x;\n displayedHeightRatio = this._clip.height / this.source.dimensions.y;\n if (bounds.getAspectRatio() > aspectRatio) {\n xOffset = this._clip.x / this._clip.height * bounds.height;\n yOffset = this._clip.y / this._clip.height * bounds.height;\n } else {\n xOffset = this._clip.x / this._clip.width * bounds.width;\n yOffset = this._clip.y / this._clip.width * bounds.width;\n }\n }\n\n if (bounds.getAspectRatio() > aspectRatio) {\n // We will have margins on the X axis\n var height = bounds.height / displayedHeightRatio;\n var marginLeft = 0;\n if (anchorProperties.isHorizontallyCentered) {\n marginLeft = (bounds.width - bounds.height * aspectRatio) / 2;\n } else if (anchorProperties.isRight) {\n marginLeft = bounds.width - bounds.height * aspectRatio;\n }\n this.setPosition(\n new $.Point(bounds.x - xOffset + marginLeft, bounds.y - yOffset),\n immediately);\n this.setHeight(height, immediately);\n } else {\n // We will have margins on the Y axis\n var width = bounds.width / displayedWidthRatio;\n var marginTop = 0;\n if (anchorProperties.isVerticallyCentered) {\n marginTop = (bounds.height - bounds.width / aspectRatio) / 2;\n } else if (anchorProperties.isBottom) {\n marginTop = bounds.height - bounds.width / aspectRatio;\n }\n this.setPosition(\n new $.Point(bounds.x - xOffset, bounds.y - yOffset + marginTop),\n immediately);\n this.setWidth(width, immediately);\n }\n },\n\n /**\n * @returns {OpenSeadragon.Rect|null} The TiledImage's current clip rectangle,\n * in image pixels, or null if none.\n */\n getClip: function() {\n if (this._clip) {\n return this._clip.clone();\n }\n\n return null;\n },\n\n /**\n * @param {OpenSeadragon.Rect|null} newClip - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @fires OpenSeadragon.TiledImage.event:clip-change\n */\n setClip: function(newClip) {\n $.console.assert(!newClip || newClip instanceof $.Rect,\n \"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null\");\n\n if (newClip instanceof $.Rect) {\n this._clip = newClip.clone();\n } else {\n this._clip = null;\n }\n\n this._needsDraw = true;\n /**\n * Raised when the TiledImage's clip is changed.\n * @event clip-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n * TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('clip-change');\n },\n\n /**\n * @returns {Boolean} Whether the TiledImage should be flipped before rendering.\n */\n getFlip: function() {\n return !!this.flipped;\n },\n\n /**\n * @param {Boolean} flip Whether the TiledImage should be flipped before rendering.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setFlip: function(flip) {\n this.flipped = !!flip;\n this._needsDraw = true;\n this._raiseBoundsChange();\n },\n\n /**\n * @returns {Number} The TiledImage's current opacity.\n */\n getOpacity: function() {\n return this.opacity;\n },\n\n /**\n * @param {Number} opacity Opacity the tiled image should be drawn at.\n * @fires OpenSeadragon.TiledImage.event:opacity-change\n */\n setOpacity: function(opacity) {\n if (opacity === this.opacity) {\n return;\n }\n\n this.opacity = opacity;\n this._needsDraw = true;\n /**\n * Raised when the TiledImage's opacity is changed.\n * @event opacity-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {Number} opacity - The new opacity value.\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n * TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('opacity-change', {\n opacity: this.opacity\n });\n },\n\n /**\n * @returns {Boolean} whether the tiledImage can load its tiles even when it has zero opacity.\n */\n getPreload: function() {\n return this._preload;\n },\n\n /**\n * Set true to load even when hidden. Set false to block loading when hidden.\n */\n setPreload: function(preload) {\n this._preload = !!preload;\n this._needsDraw = true;\n },\n\n /**\n * Get the rotation of this tiled image in degrees.\n * @param {Boolean} [current=false] True for current rotation, false for target.\n * @returns {Number} the rotation of this tiled image in degrees.\n */\n getRotation: function(current) {\n return current ?\n this._degreesSpring.current.value :\n this._degreesSpring.target.value;\n },\n\n /**\n * Set the current rotation of this tiled image in degrees.\n * @param {Number} degrees the rotation in degrees.\n * @param {Boolean} [immediately=false] Whether to animate to the new angle\n * or rotate immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setRotation: function(degrees, immediately) {\n if (this._degreesSpring.target.value === degrees &&\n this._degreesSpring.isAtTargetValue()) {\n return;\n }\n if (immediately) {\n this._degreesSpring.resetTo(degrees);\n } else {\n this._degreesSpring.springTo(degrees);\n }\n this._needsDraw = true;\n this._raiseBoundsChange();\n },\n\n /**\n * Get the point around which this tiled image is rotated\n * @private\n * @param {Boolean} current True for current rotation point, false for target.\n * @returns {OpenSeadragon.Point}\n */\n _getRotationPoint: function(current) {\n return this.getBoundsNoRotate(current).getCenter();\n },\n\n /**\n * @returns {String} The TiledImage's current compositeOperation.\n */\n getCompositeOperation: function() {\n return this.compositeOperation;\n },\n\n /**\n * @param {String} compositeOperation the tiled image should be drawn with this globalCompositeOperation.\n * @fires OpenSeadragon.TiledImage.event:composite-operation-change\n */\n setCompositeOperation: function(compositeOperation) {\n if (compositeOperation === this.compositeOperation) {\n return;\n }\n\n this.compositeOperation = compositeOperation;\n this._needsDraw = true;\n /**\n * Raised when the TiledImage's opacity is changed.\n * @event composite-operation-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {String} compositeOperation - The new compositeOperation value.\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n * TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('composite-operation-change', {\n compositeOperation: this.compositeOperation\n });\n },\n\n // private\n _setScale: function(scale, immediately) {\n var sameTarget = (this._scaleSpring.target.value === scale);\n if (immediately) {\n if (sameTarget && this._scaleSpring.current.value === scale) {\n return;\n }\n\n this._scaleSpring.resetTo(scale);\n this._updateForScale();\n this._needsDraw = true;\n } else {\n if (sameTarget) {\n return;\n }\n\n this._scaleSpring.springTo(scale);\n this._updateForScale();\n this._needsDraw = true;\n }\n\n if (!sameTarget) {\n this._raiseBoundsChange();\n }\n },\n\n // private\n _updateForScale: function() {\n this._worldWidthTarget = this._scaleSpring.target.value;\n this._worldHeightTarget = this.normHeight * this._scaleSpring.target.value;\n this._worldWidthCurrent = this._scaleSpring.current.value;\n this._worldHeightCurrent = this.normHeight * this._scaleSpring.current.value;\n },\n\n // private\n _raiseBoundsChange: function() {\n /**\n * Raised when the TiledImage's bounds are changed.\n * Note that this event is triggered only when the animation target is changed;\n * not for every frame of animation.\n * @event bounds-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n * TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('bounds-change');\n },\n\n // private\n _isBottomItem: function() {\n return this.viewer.world.getItemAt(0) === this;\n },\n\n // private\n _getLevelsInterval: function() {\n var lowestLevel = Math.max(\n this.source.minLevel,\n Math.floor(Math.log(this.minZoomImageRatio) / Math.log(2))\n );\n var currentZeroRatio = this.viewport.deltaPixelsFromPointsNoRotate(\n this.source.getPixelRatio(0), true).x *\n this._scaleSpring.current.value;\n var highestLevel = Math.min(\n Math.abs(this.source.maxLevel),\n Math.abs(Math.floor(\n Math.log(currentZeroRatio / this.minPixelRatio) / Math.log(2)\n ))\n );\n\n // Calculations for the interval of levels to draw\n // can return invalid intervals; fix that here if necessary\n highestLevel = Math.max(highestLevel, this.source.minLevel || 0);\n lowestLevel = Math.min(lowestLevel, highestLevel);\n return {\n lowestLevel: lowestLevel,\n highestLevel: highestLevel\n };\n },\n\n /**\n * @private\n * @inner\n * Pretty much every other line in this needs to be documented so it's clear\n * how each piece of this routine contributes to the drawing process. That's\n * why there are so many TODO's inside this function.\n */\n _updateViewport: function() {\n this._needsDraw = false;\n this._tilesLoading = 0;\n this.loadingCoverage = {};\n\n // Reset tile's internal drawn state\n while (this.lastDrawn.length > 0) {\n var tile = this.lastDrawn.pop();\n tile.beingDrawn = false;\n }\n\n var viewport = this.viewport;\n var drawArea = this._viewportToTiledImageRectangle(\n viewport.getBoundsWithMargins(true));\n\n if (!this.wrapHorizontal && !this.wrapVertical) {\n var tiledImageBounds = this._viewportToTiledImageRectangle(\n this.getClippedBounds(true));\n drawArea = drawArea.intersection(tiledImageBounds);\n if (drawArea === null) {\n return;\n }\n }\n\n var levelsInterval = this._getLevelsInterval();\n var lowestLevel = levelsInterval.lowestLevel;\n var highestLevel = levelsInterval.highestLevel;\n var bestTile = null;\n var haveDrawn = false;\n var currentTime = $.now();\n\n // Update any level that will be drawn\n for (var level = highestLevel; level >= lowestLevel; level--) {\n var drawLevel = false;\n\n //Avoid calculations for draw if we have already drawn this\n var currentRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate(\n this.source.getPixelRatio(level),\n true\n ).x * this._scaleSpring.current.value;\n\n if (level === lowestLevel ||\n (!haveDrawn && currentRenderPixelRatio >= this.minPixelRatio)) {\n drawLevel = true;\n haveDrawn = true;\n } else if (!haveDrawn) {\n continue;\n }\n\n //Perform calculations for draw if we haven't drawn this\n var targetRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate(\n this.source.getPixelRatio(level),\n false\n ).x * this._scaleSpring.current.value;\n\n var targetZeroRatio = viewport.deltaPixelsFromPointsNoRotate(\n this.source.getPixelRatio(\n Math.max(\n this.source.getClosestLevel(),\n 0\n )\n ),\n false\n ).x * this._scaleSpring.current.value;\n\n var optimalRatio = this.immediateRender ? 1 : targetZeroRatio;\n var levelOpacity = Math.min(1, (currentRenderPixelRatio - 0.5) / 0.5);\n var levelVisibility = optimalRatio / Math.abs(\n optimalRatio - targetRenderPixelRatio\n );\n\n // Update the level and keep track of 'best' tile to load\n bestTile = updateLevel(\n this,\n haveDrawn,\n drawLevel,\n level,\n levelOpacity,\n levelVisibility,\n drawArea,\n currentTime,\n bestTile\n );\n\n // Stop the loop if lower-res tiles would all be covered by\n // already drawn tiles\n if (providesCoverage(this.coverage, level)) {\n break;\n }\n }\n\n // Perform the actual drawing\n drawTiles(this, this.lastDrawn);\n\n // Load the new 'best' tile\n if (bestTile && !bestTile.context2D) {\n loadTile(this, bestTile, currentTime);\n this._needsDraw = true;\n this._setFullyLoaded(false);\n } else {\n this._setFullyLoaded(this._tilesLoading === 0);\n }\n },\n\n // private\n _getCornerTiles: function(level, topLeftBound, bottomRightBound) {\n var leftX;\n var rightX;\n if (this.wrapHorizontal) {\n leftX = $.positiveModulo(topLeftBound.x, 1);\n rightX = $.positiveModulo(bottomRightBound.x, 1);\n } else {\n leftX = Math.max(0, topLeftBound.x);\n rightX = Math.min(1, bottomRightBound.x);\n }\n var topY;\n var bottomY;\n var aspectRatio = 1 / this.source.aspectRatio;\n if (this.wrapVertical) {\n topY = $.positiveModulo(topLeftBound.y, aspectRatio);\n bottomY = $.positiveModulo(bottomRightBound.y, aspectRatio);\n } else {\n topY = Math.max(0, topLeftBound.y);\n bottomY = Math.min(aspectRatio, bottomRightBound.y);\n }\n\n var topLeftTile = this.source.getTileAtPoint(level, new $.Point(leftX, topY));\n var bottomRightTile = this.source.getTileAtPoint(level, new $.Point(rightX, bottomY));\n var numTiles = this.source.getNumTiles(level);\n\n if (this.wrapHorizontal) {\n topLeftTile.x += numTiles.x * Math.floor(topLeftBound.x);\n bottomRightTile.x += numTiles.x * Math.floor(bottomRightBound.x);\n }\n if (this.wrapVertical) {\n topLeftTile.y += numTiles.y * Math.floor(topLeftBound.y / aspectRatio);\n bottomRightTile.y += numTiles.y * Math.floor(bottomRightBound.y / aspectRatio);\n }\n\n return {\n topLeft: topLeftTile,\n bottomRight: bottomRightTile,\n };\n }\n});\n\n/**\n * @private\n * @inner\n * Updates all tiles at a given resolution level.\n * @param {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @param {Boolean} haveDrawn\n * @param {Boolean} drawLevel\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} levelVisibility\n * @param {OpenSeadragon.Point} viewportTL - The index of the most top-left visible tile.\n * @param {OpenSeadragon.Point} viewportBR - The index of the most bottom-right visible tile.\n * @param {Number} currentTime\n * @param {OpenSeadragon.Tile} best - The current \"best\" tile to draw.\n */\nfunction updateLevel(tiledImage, haveDrawn, drawLevel, level, levelOpacity,\n levelVisibility, drawArea, currentTime, best) {\n\n var topLeftBound = drawArea.getBoundingBox().getTopLeft();\n var bottomRightBound = drawArea.getBoundingBox().getBottomRight();\n\n if (tiledImage.viewer) {\n /**\n * - Needs documentation -\n *\n * @event update-level\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {Object} havedrawn\n * @property {Object} level\n * @property {Object} opacity\n * @property {Object} visibility\n * @property {OpenSeadragon.Rect} drawArea\n * @property {Object} topleft deprecated, use drawArea instead\n * @property {Object} bottomright deprecated, use drawArea instead\n * @property {Object} currenttime\n * @property {Object} best\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n tiledImage.viewer.raiseEvent('update-level', {\n tiledImage: tiledImage,\n havedrawn: haveDrawn,\n level: level,\n opacity: levelOpacity,\n visibility: levelVisibility,\n drawArea: drawArea,\n topleft: topLeftBound,\n bottomright: bottomRightBound,\n currenttime: currentTime,\n best: best\n });\n }\n\n resetCoverage(tiledImage.coverage, level);\n resetCoverage(tiledImage.loadingCoverage, level);\n\n //OK, a new drawing so do your calculations\n var cornerTiles = tiledImage._getCornerTiles(level, topLeftBound, bottomRightBound);\n var topLeftTile = cornerTiles.topLeft;\n var bottomRightTile = cornerTiles.bottomRight;\n var numberOfTiles = tiledImage.source.getNumTiles(level);\n\n var viewportCenter = tiledImage.viewport.pixelFromPoint(\n tiledImage.viewport.getCenter());\n\n if (tiledImage.getFlip()) {\n // The right-most tile can be narrower than the others. When flipped,\n // this tile is now on the left. Because it is narrower than the normal\n // left-most tile, the subsequent tiles may not be wide enough to completely\n // fill the viewport. Fix this by rendering an extra column of tiles. If we\n // are not wrapping, make sure we never render more than the number of tiles\n // in the image.\n bottomRightTile.x += 1;\n if (!tiledImage.wrapHorizontal) {\n bottomRightTile.x = Math.min(bottomRightTile.x, numberOfTiles.x - 1);\n }\n }\n\n for (var x = topLeftTile.x; x <= bottomRightTile.x; x++) {\n for (var y = topLeftTile.y; y <= bottomRightTile.y; y++) {\n\n var flippedX;\n if (tiledImage.getFlip()) {\n var xMod = ( numberOfTiles.x + ( x % numberOfTiles.x ) ) % numberOfTiles.x;\n flippedX = x + numberOfTiles.x - xMod - xMod - 1;\n } else {\n flippedX = x;\n }\n\n if (drawArea.intersection(tiledImage.getTileBounds(level, flippedX, y)) === null) {\n // This tile is outside of the viewport, no need to draw it\n continue;\n }\n\n best = updateTile(\n tiledImage,\n drawLevel,\n haveDrawn,\n flippedX, y,\n level,\n levelOpacity,\n levelVisibility,\n viewportCenter,\n numberOfTiles,\n currentTime,\n best\n );\n\n }\n }\n\n return best;\n}\n\n/**\n * @private\n * @inner\n * Update a single tile at a particular resolution level.\n * @param {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @param {Boolean} haveDrawn\n * @param {Boolean} drawLevel\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} levelVisibility\n * @param {OpenSeadragon.Point} viewportCenter\n * @param {Number} numberOfTiles\n * @param {Number} currentTime\n * @param {OpenSeadragon.Tile} best - The current \"best\" tile to draw.\n */\nfunction updateTile( tiledImage, haveDrawn, drawLevel, x, y, level, levelOpacity, levelVisibility, viewportCenter, numberOfTiles, currentTime, best){\n\n var tile = getTile(\n x, y,\n level,\n tiledImage,\n tiledImage.source,\n tiledImage.tilesMatrix,\n currentTime,\n numberOfTiles,\n tiledImage._worldWidthCurrent,\n tiledImage._worldHeightCurrent\n ),\n drawTile = drawLevel;\n\n if( tiledImage.viewer ){\n /**\n * - Needs documentation -\n *\n * @event update-tile\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} tile\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n tiledImage.viewer.raiseEvent( 'update-tile', {\n tiledImage: tiledImage,\n tile: tile\n });\n }\n\n setCoverage( tiledImage.coverage, level, x, y, false );\n\n var loadingCoverage = tile.loaded || tile.loading || isCovered(tiledImage.loadingCoverage, level, x, y);\n setCoverage(tiledImage.loadingCoverage, level, x, y, loadingCoverage);\n\n if ( !tile.exists ) {\n return best;\n }\n\n if ( haveDrawn && !drawTile ) {\n if ( isCovered( tiledImage.coverage, level, x, y ) ) {\n setCoverage( tiledImage.coverage, level, x, y, true );\n } else {\n drawTile = true;\n }\n }\n\n if ( !drawTile ) {\n return best;\n }\n\n positionTile(\n tile,\n tiledImage.source.tileOverlap,\n tiledImage.viewport,\n viewportCenter,\n levelVisibility,\n tiledImage\n );\n\n if (!tile.loaded) {\n if (tile.context2D) {\n setTileLoaded(tiledImage, tile);\n } else {\n var imageRecord = tiledImage._tileCache.getImageRecord(tile.cacheKey);\n if (imageRecord) {\n var image = imageRecord.getImage();\n setTileLoaded(tiledImage, tile, image);\n }\n }\n }\n\n if ( tile.loaded ) {\n var needsDraw = blendTile(\n tiledImage,\n tile,\n x, y,\n level,\n levelOpacity,\n currentTime\n );\n\n if ( needsDraw ) {\n tiledImage._needsDraw = true;\n }\n } else if ( tile.loading ) {\n // the tile is already in the download queue\n tiledImage._tilesLoading++;\n } else if (!loadingCoverage) {\n best = compareTiles( best, tile );\n }\n\n return best;\n}\n\n/**\n * @private\n * @inner\n * Obtains a tile at the given location.\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.TileSource} tileSource\n * @param {Object} tilesMatrix - A '3d' dictionary [level][x][y] --> Tile.\n * @param {Number} time\n * @param {Number} numTiles\n * @param {Number} worldWidth\n * @param {Number} worldHeight\n * @returns {OpenSeadragon.Tile}\n */\nfunction getTile(\n x, y,\n level,\n tiledImage,\n tileSource,\n tilesMatrix,\n time,\n numTiles,\n worldWidth,\n worldHeight\n) {\n var xMod,\n yMod,\n bounds,\n sourceBounds,\n exists,\n url,\n ajaxHeaders,\n context2D,\n tile;\n\n if ( !tilesMatrix[ level ] ) {\n tilesMatrix[ level ] = {};\n }\n if ( !tilesMatrix[ level ][ x ] ) {\n tilesMatrix[ level ][ x ] = {};\n }\n\n if ( !tilesMatrix[ level ][ x ][ y ] || !tilesMatrix[ level ][ x ][ y ].flipped !== !tiledImage.flipped ) {\n xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x;\n yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y;\n bounds = tiledImage.getTileBounds( level, x, y );\n sourceBounds = tileSource.getTileBounds( level, xMod, yMod, true );\n exists = tileSource.tileExists( level, xMod, yMod );\n url = tileSource.getTileUrl( level, xMod, yMod );\n\n // Headers are only applicable if loadTilesWithAjax is set\n if (tiledImage.loadTilesWithAjax) {\n ajaxHeaders = tileSource.getTileAjaxHeaders( level, xMod, yMod );\n // Combine tile AJAX headers with tiled image AJAX headers (if applicable)\n if ($.isPlainObject(tiledImage.ajaxHeaders)) {\n ajaxHeaders = $.extend({}, tiledImage.ajaxHeaders, ajaxHeaders);\n }\n } else {\n ajaxHeaders = null;\n }\n\n context2D = tileSource.getContext2D ?\n tileSource.getContext2D(level, xMod, yMod) : undefined;\n\n tile = new $.Tile(\n level,\n x,\n y,\n bounds,\n exists,\n url,\n context2D,\n tiledImage.loadTilesWithAjax,\n ajaxHeaders,\n sourceBounds\n );\n\n if (tiledImage.getFlip()) {\n if (xMod === 0) {\n tile.isRightMost = true;\n }\n } else {\n if (xMod === numTiles.x - 1) {\n tile.isRightMost = true;\n }\n }\n\n if (yMod === numTiles.y - 1) {\n tile.isBottomMost = true;\n }\n\n tile.flipped = tiledImage.flipped;\n\n tilesMatrix[ level ][ x ][ y ] = tile;\n }\n\n tile = tilesMatrix[ level ][ x ][ y ];\n tile.lastTouchTime = time;\n\n return tile;\n}\n\n/**\n * @private\n * @inner\n * Dispatch a job to the ImageLoader to load the Image for a Tile.\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} time\n */\nfunction loadTile( tiledImage, tile, time ) {\n tile.loading = true;\n tiledImage._imageLoader.addJob({\n src: tile.url,\n loadWithAjax: tile.loadWithAjax,\n ajaxHeaders: tile.ajaxHeaders,\n crossOriginPolicy: tiledImage.crossOriginPolicy,\n ajaxWithCredentials: tiledImage.ajaxWithCredentials,\n callback: function( image, errorMsg, tileRequest ){\n onTileLoad( tiledImage, tile, time, image, errorMsg, tileRequest );\n },\n abort: function() {\n tile.loading = false;\n }\n });\n}\n\n/**\n * @private\n * @inner\n * Callback fired when a Tile's Image finished downloading.\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} time\n * @param {Image} image\n * @param {String} errorMsg\n * @param {XMLHttpRequest} tileRequest\n */\nfunction onTileLoad( tiledImage, tile, time, image, errorMsg, tileRequest ) {\n if ( !image ) {\n $.console.log( \"Tile %s failed to load: %s - error: %s\", tile, tile.url, errorMsg );\n /**\n * Triggered when a tile fails to load.\n *\n * @event tile-load-failed\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Tile} tile - The tile that failed to load.\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image the tile belongs to.\n * @property {number} time - The time in milliseconds when the tile load began.\n * @property {string} message - The error message.\n * @property {XMLHttpRequest} tileRequest - The XMLHttpRequest used to load the tile if available.\n */\n tiledImage.viewer.raiseEvent(\"tile-load-failed\", {\n tile: tile,\n tiledImage: tiledImage,\n time: time,\n message: errorMsg,\n tileRequest: tileRequest\n });\n tile.loading = false;\n tile.exists = false;\n return;\n }\n\n if ( time < tiledImage.lastResetTime ) {\n $.console.log( \"Ignoring tile %s loaded before reset: %s\", tile, tile.url );\n tile.loading = false;\n return;\n }\n\n var finish = function() {\n var cutoff = tiledImage.source.getClosestLevel();\n setTileLoaded(tiledImage, tile, image, cutoff, tileRequest);\n };\n\n // Check if we're mid-update; this can happen on IE8 because image load events for\n // cached images happen immediately there\n if ( !tiledImage._midDraw ) {\n finish();\n } else {\n // Wait until after the update, in case caching unloads any tiles\n window.setTimeout( finish, 1);\n }\n}\n\n/**\n * @private\n * @inner\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile} tile\n * @param {Image} image\n * @param {Number} cutoff\n */\nfunction setTileLoaded(tiledImage, tile, image, cutoff, tileRequest) {\n var increment = 0;\n\n function getCompletionCallback() {\n increment++;\n return completionCallback;\n }\n\n function completionCallback() {\n increment--;\n if (increment === 0) {\n tile.loading = false;\n tile.loaded = true;\n if (!tile.context2D) {\n tiledImage._tileCache.cacheTile({\n image: image,\n tile: tile,\n cutoff: cutoff,\n tiledImage: tiledImage\n });\n }\n tiledImage._needsDraw = true;\n }\n }\n\n /**\n * Triggered when a tile has just been loaded in memory. That means that the\n * image has been downloaded and can be modified before being drawn to the canvas.\n *\n * @event tile-loaded\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {Image} image - The image of the tile.\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the loaded tile.\n * @property {OpenSeadragon.Tile} tile - The tile which has been loaded.\n * @property {XMLHttpRequest} tileRequest - The AJAX request that loaded this tile (if applicable).\n * @property {function} getCompletionCallback - A function giving a callback to call\n * when the asynchronous processing of the image is done. The image will be\n * marked as entirely loaded when the callback has been called once for each\n * call to getCompletionCallback.\n */\n tiledImage.viewer.raiseEvent(\"tile-loaded\", {\n tile: tile,\n tiledImage: tiledImage,\n tileRequest: tileRequest,\n image: image,\n getCompletionCallback: getCompletionCallback\n });\n // In case the completion callback is never called, we at least force it once.\n getCompletionCallback()();\n}\n\n/**\n * @private\n * @inner\n * @param {OpenSeadragon.Tile} tile\n * @param {Boolean} overlap\n * @param {OpenSeadragon.Viewport} viewport\n * @param {OpenSeadragon.Point} viewportCenter\n * @param {Number} levelVisibility\n * @param {OpenSeadragon.TiledImage} tiledImage\n */\nfunction positionTile( tile, overlap, viewport, viewportCenter, levelVisibility, tiledImage ){\n var boundsTL = tile.bounds.getTopLeft();\n\n boundsTL.x *= tiledImage._scaleSpring.current.value;\n boundsTL.y *= tiledImage._scaleSpring.current.value;\n boundsTL.x += tiledImage._xSpring.current.value;\n boundsTL.y += tiledImage._ySpring.current.value;\n\n var boundsSize = tile.bounds.getSize();\n\n boundsSize.x *= tiledImage._scaleSpring.current.value;\n boundsSize.y *= tiledImage._scaleSpring.current.value;\n\n var positionC = viewport.pixelFromPointNoRotate(boundsTL, true),\n positionT = viewport.pixelFromPointNoRotate(boundsTL, false),\n sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true),\n sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false),\n tileCenter = positionT.plus( sizeT.divide( 2 ) ),\n tileSquaredDistance = viewportCenter.squaredDistanceTo( tileCenter );\n\n if ( !overlap ) {\n sizeC = sizeC.plus( new $.Point( 1, 1 ) );\n }\n\n if (tile.isRightMost && tiledImage.wrapHorizontal) {\n sizeC.x += 0.75; // Otherwise Firefox and Safari show seams\n }\n\n if (tile.isBottomMost && tiledImage.wrapVertical) {\n sizeC.y += 0.75; // Otherwise Firefox and Safari show seams\n }\n\n tile.position = positionC;\n tile.size = sizeC;\n tile.squaredDistance = tileSquaredDistance;\n tile.visibility = levelVisibility;\n}\n\n/**\n * @private\n * @inner\n * Updates the opacity of a tile according to the time it has been on screen\n * to perform a fade-in.\n * Updates coverage once a tile is fully opaque.\n * Returns whether the fade-in has completed.\n *\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} currentTime\n * @returns {Boolean}\n */\nfunction blendTile( tiledImage, tile, x, y, level, levelOpacity, currentTime ){\n var blendTimeMillis = 1000 * tiledImage.blendTime,\n deltaTime,\n opacity;\n\n if ( !tile.blendStart ) {\n tile.blendStart = currentTime;\n }\n\n deltaTime = currentTime - tile.blendStart;\n opacity = blendTimeMillis ? Math.min( 1, deltaTime / ( blendTimeMillis ) ) : 1;\n\n if ( tiledImage.alwaysBlend ) {\n opacity *= levelOpacity;\n }\n\n tile.opacity = opacity;\n\n tiledImage.lastDrawn.push( tile );\n\n if ( opacity === 1 ) {\n setCoverage( tiledImage.coverage, level, x, y, true );\n tiledImage._hasOpaqueTile = true;\n } else if ( deltaTime < blendTimeMillis ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * @private\n * @inner\n * Returns true if the given tile provides coverage to lower-level tiles of\n * lower resolution representing the same content. If neither x nor y is\n * given, returns true if the entire visible level provides coverage.\n *\n * Note that out-of-bounds tiles provide coverage in this sense, since\n * there's no content that they would need to cover. Tiles at non-existent\n * levels that are within the image bounds, however, do not.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @returns {Boolean}\n */\nfunction providesCoverage( coverage, level, x, y ) {\n var rows,\n cols,\n i, j;\n\n if ( !coverage[ level ] ) {\n return false;\n }\n\n if ( x === undefined || y === undefined ) {\n rows = coverage[ level ];\n for ( i in rows ) {\n if ( Object.prototype.hasOwnProperty.call( rows, i ) ) {\n cols = rows[ i ];\n for ( j in cols ) {\n if ( Object.prototype.hasOwnProperty.call( cols, j ) && !cols[ j ] ) {\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n return (\n coverage[ level ][ x] === undefined ||\n coverage[ level ][ x ][ y ] === undefined ||\n coverage[ level ][ x ][ y ] === true\n );\n}\n\n/**\n * @private\n * @inner\n * Returns true if the given tile is completely covered by higher-level\n * tiles of higher resolution representing the same content. If neither x\n * nor y is given, returns true if the entire visible level is covered.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @returns {Boolean}\n */\nfunction isCovered( coverage, level, x, y ) {\n if ( x === undefined || y === undefined ) {\n return providesCoverage( coverage, level + 1 );\n } else {\n return (\n providesCoverage( coverage, level + 1, 2 * x, 2 * y ) &&\n providesCoverage( coverage, level + 1, 2 * x, 2 * y + 1 ) &&\n providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y ) &&\n providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y + 1 )\n );\n }\n}\n\n/**\n * @private\n * @inner\n * Sets whether the given tile provides coverage or not.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @param {Boolean} covers - Whether the tile provides coverage.\n */\nfunction setCoverage( coverage, level, x, y, covers ) {\n if ( !coverage[ level ] ) {\n $.console.warn(\n \"Setting coverage for a tile before its level's coverage has been reset: %s\",\n level\n );\n return;\n }\n\n if ( !coverage[ level ][ x ] ) {\n coverage[ level ][ x ] = {};\n }\n\n coverage[ level ][ x ][ y ] = covers;\n}\n\n/**\n * @private\n * @inner\n * Resets coverage information for the given level. This should be called\n * after every draw routine. Note that at the beginning of the next draw\n * routine, coverage for every visible tile should be explicitly set.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of tiles to completely reset.\n */\nfunction resetCoverage( coverage, level ) {\n coverage[ level ] = {};\n}\n\n/**\n * @private\n * @inner\n * Determines whether the 'last best' tile for the area is better than the\n * tile in question.\n *\n * @param {OpenSeadragon.Tile} previousBest\n * @param {OpenSeadragon.Tile} tile\n * @returns {OpenSeadragon.Tile} The new best tile.\n */\nfunction compareTiles( previousBest, tile ) {\n if ( !previousBest ) {\n return tile;\n }\n\n if ( tile.visibility > previousBest.visibility ) {\n return tile;\n } else if ( tile.visibility === previousBest.visibility ) {\n if ( tile.squaredDistance < previousBest.squaredDistance ) {\n return tile;\n }\n }\n\n return previousBest;\n}\n\n/**\n * @private\n * @inner\n * Draws a TiledImage.\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.\n */\nfunction drawTiles( tiledImage, lastDrawn ) {\n if (tiledImage.opacity === 0 || (lastDrawn.length === 0 && !tiledImage.placeholderFillStyle)) {\n return;\n }\n\n var tile = lastDrawn[0];\n var useSketch;\n\n if (tile) {\n useSketch = tiledImage.opacity < 1 ||\n (tiledImage.compositeOperation &&\n tiledImage.compositeOperation !== 'source-over') ||\n (!tiledImage._isBottomItem() && tile._hasTransparencyChannel());\n }\n\n var sketchScale;\n var sketchTranslate;\n\n var zoom = tiledImage.viewport.getZoom(true);\n var imageZoom = tiledImage.viewportToImageZoom(zoom);\n\n if (lastDrawn.length > 1 &&\n imageZoom > tiledImage.smoothTileEdgesMinZoom &&\n !tiledImage.iOSDevice &&\n tiledImage.getRotation(true) % 360 === 0 && // TODO: support tile edge smoothing with tiled image rotation.\n $.supportsCanvas) {\n // When zoomed in a lot (>100%) the tile edges are visible.\n // So we have to composite them at ~100% and scale them up together.\n // Note: Disabled on iOS devices per default as it causes a native crash\n useSketch = true;\n sketchScale = tile.getScaleForEdgeSmoothing();\n sketchTranslate = tile.getTranslationForEdgeSmoothing(sketchScale,\n tiledImage._drawer.getCanvasSize(false),\n tiledImage._drawer.getCanvasSize(true));\n }\n\n var bounds;\n if (useSketch) {\n if (!sketchScale) {\n // Except when edge smoothing, we only clean the part of the\n // sketch canvas we are going to use for performance reasons.\n bounds = tiledImage.viewport.viewportToViewerElementRectangle(\n tiledImage.getClippedBounds(true))\n .getIntegerBoundingBox();\n\n if(tiledImage._drawer.viewer.viewport.getFlip()) {\n if (tiledImage.viewport.degrees !== 0 || tiledImage.getRotation(true) % 360 !== 0){\n bounds.x = tiledImage._drawer.viewer.container.clientWidth - (bounds.x + bounds.width);\n }\n }\n\n bounds = bounds.times($.pixelDensityRatio);\n }\n tiledImage._drawer._clear(true, bounds);\n }\n\n // When scaling, we must rotate only when blending the sketch canvas to\n // avoid interpolation\n if (!sketchScale) {\n if (tiledImage.viewport.degrees !== 0) {\n tiledImage._drawer._offsetForRotation({\n degrees: tiledImage.viewport.degrees,\n useSketch: useSketch\n });\n }\n if (tiledImage.getRotation(true) % 360 !== 0) {\n tiledImage._drawer._offsetForRotation({\n degrees: tiledImage.getRotation(true),\n point: tiledImage.viewport.pixelFromPointNoRotate(\n tiledImage._getRotationPoint(true), true),\n useSketch: useSketch\n });\n }\n\n if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){\n if(tiledImage._drawer.viewer.viewport.getFlip()) {\n tiledImage._drawer._flip();\n }\n }\n }\n\n var usedClip = false;\n if ( tiledImage._clip ) {\n tiledImage._drawer.saveContext(useSketch);\n\n var box = tiledImage.imageToViewportRectangle(tiledImage._clip, true);\n box = box.rotate(-tiledImage.getRotation(true), tiledImage._getRotationPoint(true));\n var clipRect = tiledImage._drawer.viewportToDrawerRectangle(box);\n if (sketchScale) {\n clipRect = clipRect.times(sketchScale);\n }\n if (sketchTranslate) {\n clipRect = clipRect.translate(sketchTranslate);\n }\n tiledImage._drawer.setClip(clipRect, useSketch);\n\n usedClip = true;\n }\n\n if (tiledImage._croppingPolygons) {\n tiledImage._drawer.saveContext(useSketch);\n try {\n var polygons = tiledImage._croppingPolygons.map(function (polygon) {\n return polygon.map(function (coord) {\n var point = tiledImage\n .imageToViewportCoordinates(coord.x, coord.y, true)\n .rotate(-tiledImage.getRotation(true), tiledImage._getRotationPoint(true));\n var clipPoint = tiledImage._drawer.viewportCoordToDrawerCoord(point);\n if (sketchScale) {\n clipPoint = clipPoint.times(sketchScale);\n }\n return clipPoint;\n });\n });\n tiledImage._drawer.clipWithPolygons(polygons, useSketch);\n } catch (e) {\n $.console.error(e);\n }\n usedClip = true;\n }\n\n if ( tiledImage.placeholderFillStyle && tiledImage._hasOpaqueTile === false ) {\n var placeholderRect = tiledImage._drawer.viewportToDrawerRectangle(tiledImage.getBounds(true));\n if (sketchScale) {\n placeholderRect = placeholderRect.times(sketchScale);\n }\n if (sketchTranslate) {\n placeholderRect = placeholderRect.translate(sketchTranslate);\n }\n\n var fillStyle = null;\n if ( typeof tiledImage.placeholderFillStyle === \"function\" ) {\n fillStyle = tiledImage.placeholderFillStyle(tiledImage, tiledImage._drawer.context);\n }\n else {\n fillStyle = tiledImage.placeholderFillStyle;\n }\n\n tiledImage._drawer.drawRectangle(placeholderRect, fillStyle, useSketch);\n }\n\n for (var i = lastDrawn.length - 1; i >= 0; i--) {\n tile = lastDrawn[ i ];\n tiledImage._drawer.drawTile( tile, tiledImage._drawingHandler, useSketch, sketchScale, sketchTranslate );\n tile.beingDrawn = true;\n\n if( tiledImage.viewer ){\n /**\n * - Needs documentation -\n *\n * @event tile-drawn\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} tile\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n tiledImage.viewer.raiseEvent( 'tile-drawn', {\n tiledImage: tiledImage,\n tile: tile\n });\n }\n }\n\n if ( usedClip ) {\n tiledImage._drawer.restoreContext( useSketch );\n }\n\n if (!sketchScale) {\n if (tiledImage.getRotation(true) % 360 !== 0) {\n tiledImage._drawer._restoreRotationChanges(useSketch);\n }\n if (tiledImage.viewport.degrees !== 0) {\n tiledImage._drawer._restoreRotationChanges(useSketch);\n }\n }\n\n if (useSketch) {\n if (sketchScale) {\n if (tiledImage.viewport.degrees !== 0) {\n tiledImage._drawer._offsetForRotation({\n degrees: tiledImage.viewport.degrees,\n useSketch: false\n });\n }\n if (tiledImage.getRotation(true) % 360 !== 0) {\n tiledImage._drawer._offsetForRotation({\n degrees: tiledImage.getRotation(true),\n point: tiledImage.viewport.pixelFromPointNoRotate(\n tiledImage._getRotationPoint(true), true),\n useSketch: false\n });\n }\n }\n tiledImage._drawer.blendSketch({\n opacity: tiledImage.opacity,\n scale: sketchScale,\n translate: sketchTranslate,\n compositeOperation: tiledImage.compositeOperation,\n bounds: bounds\n });\n if (sketchScale) {\n if (tiledImage.getRotation(true) % 360 !== 0) {\n tiledImage._drawer._restoreRotationChanges(false);\n }\n if (tiledImage.viewport.degrees !== 0) {\n tiledImage._drawer._restoreRotationChanges(false);\n }\n }\n }\n\n if (!sketchScale) {\n if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){\n if(tiledImage._drawer.viewer.viewport.getFlip()) {\n tiledImage._drawer._flip();\n }\n }\n }\n\n drawDebugInfo( tiledImage, lastDrawn );\n}\n\n/**\n * @private\n * @inner\n * Draws special debug information for a TiledImage if in debug mode.\n * @param {OpenSeadragon.TiledImage} tiledImage\n * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.\n */\nfunction drawDebugInfo( tiledImage, lastDrawn ) {\n if( tiledImage.debugMode ) {\n for ( var i = lastDrawn.length - 1; i >= 0; i-- ) {\n var tile = lastDrawn[ i ];\n try {\n tiledImage._drawer.drawDebugInfo(\n tile, lastDrawn.length, i, tiledImage);\n } catch(e) {\n $.console.error(e);\n }\n }\n }\n}\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - TileCache\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// private class\nvar TileRecord = function( options ) {\n $.console.assert( options, \"[TileCache.cacheTile] options is required\" );\n $.console.assert( options.tile, \"[TileCache.cacheTile] options.tile is required\" );\n $.console.assert( options.tiledImage, \"[TileCache.cacheTile] options.tiledImage is required\" );\n this.tile = options.tile;\n this.tiledImage = options.tiledImage;\n};\n\n// private class\nvar ImageRecord = function(options) {\n $.console.assert( options, \"[ImageRecord] options is required\" );\n $.console.assert( options.image, \"[ImageRecord] options.image is required\" );\n this._image = options.image;\n this._tiles = [];\n};\n\nImageRecord.prototype = {\n destroy: function() {\n this._image = null;\n this._renderedContext = null;\n this._tiles = null;\n },\n\n getImage: function() {\n return this._image;\n },\n\n getRenderedContext: function() {\n if (!this._renderedContext) {\n var canvas = document.createElement( 'canvas' );\n canvas.width = this._image.width;\n canvas.height = this._image.height;\n this._renderedContext = canvas.getContext('2d');\n this._renderedContext.drawImage( this._image, 0, 0 );\n //since we are caching the prerendered image on a canvas\n //allow the image to not be held in memory\n this._image = null;\n }\n return this._renderedContext;\n },\n\n setRenderedContext: function(renderedContext) {\n $.console.error(\"ImageRecord.setRenderedContext is deprecated. \" +\n \"The rendered context should be created by the ImageRecord \" +\n \"itself when calling ImageRecord.getRenderedContext.\");\n this._renderedContext = renderedContext;\n },\n\n addTile: function(tile) {\n $.console.assert(tile, '[ImageRecord.addTile] tile is required');\n this._tiles.push(tile);\n },\n\n removeTile: function(tile) {\n for (var i = 0; i < this._tiles.length; i++) {\n if (this._tiles[i] === tile) {\n this._tiles.splice(i, 1);\n return;\n }\n }\n\n $.console.warn('[ImageRecord.removeTile] trying to remove unknown tile', tile);\n },\n\n getTileCount: function() {\n return this._tiles.length;\n }\n};\n\n/**\n * @class TileCache\n * @memberof OpenSeadragon\n * @classdesc Stores all the tiles displayed in a {@link OpenSeadragon.Viewer}.\n * You generally won't have to interact with the TileCache directly.\n * @param {Object} options - Configuration for this TileCache.\n * @param {Number} [options.maxImageCacheCount] - See maxImageCacheCount in\n * {@link OpenSeadragon.Options} for details.\n */\n$.TileCache = function( options ) {\n options = options || {};\n\n this._maxImageCacheCount = options.maxImageCacheCount || $.DEFAULT_SETTINGS.maxImageCacheCount;\n this._tilesLoaded = [];\n this._imagesLoaded = [];\n this._imagesLoadedCount = 0;\n};\n\n/** @lends OpenSeadragon.TileCache.prototype */\n$.TileCache.prototype = {\n /**\n * @returns {Number} The total number of tiles that have been loaded by\n * this TileCache.\n */\n numTilesLoaded: function() {\n return this._tilesLoaded.length;\n },\n\n /**\n * Caches the specified tile, removing an old tile if necessary to stay under the\n * maxImageCacheCount specified on construction. Note that if multiple tiles reference\n * the same image, there may be more tiles than maxImageCacheCount; the goal is to keep\n * the number of images below that number. Note, as well, that even the number of images\n * may temporarily surpass that number, but should eventually come back down to the max specified.\n * @param {Object} options - Tile info.\n * @param {OpenSeadragon.Tile} options.tile - The tile to cache.\n * @param {String} options.tile.cacheKey - The unique key used to identify this tile in the cache.\n * @param {Image} options.image - The image of the tile to cache.\n * @param {OpenSeadragon.TiledImage} options.tiledImage - The TiledImage that owns that tile.\n * @param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this\n * function will release an old tile. The cutoff option specifies a tile level at or below which\n * tiles will not be released.\n */\n cacheTile: function( options ) {\n $.console.assert( options, \"[TileCache.cacheTile] options is required\" );\n $.console.assert( options.tile, \"[TileCache.cacheTile] options.tile is required\" );\n $.console.assert( options.tile.cacheKey, \"[TileCache.cacheTile] options.tile.cacheKey is required\" );\n $.console.assert( options.tiledImage, \"[TileCache.cacheTile] options.tiledImage is required\" );\n\n var cutoff = options.cutoff || 0;\n var insertionIndex = this._tilesLoaded.length;\n\n var imageRecord = this._imagesLoaded[options.tile.cacheKey];\n if (!imageRecord) {\n $.console.assert( options.image, \"[TileCache.cacheTile] options.image is required to create an ImageRecord\" );\n imageRecord = this._imagesLoaded[options.tile.cacheKey] = new ImageRecord({\n image: options.image\n });\n\n this._imagesLoadedCount++;\n }\n\n imageRecord.addTile(options.tile);\n options.tile.cacheImageRecord = imageRecord;\n\n // Note that just because we're unloading a tile doesn't necessarily mean\n // we're unloading an image. With repeated calls it should sort itself out, though.\n if ( this._imagesLoadedCount > this._maxImageCacheCount ) {\n var worstTile = null;\n var worstTileIndex = -1;\n var worstTileRecord = null;\n var prevTile, worstTime, worstLevel, prevTime, prevLevel, prevTileRecord;\n\n for ( var i = this._tilesLoaded.length - 1; i >= 0; i-- ) {\n prevTileRecord = this._tilesLoaded[ i ];\n prevTile = prevTileRecord.tile;\n\n if ( prevTile.level <= cutoff || prevTile.beingDrawn ) {\n continue;\n } else if ( !worstTile ) {\n worstTile = prevTile;\n worstTileIndex = i;\n worstTileRecord = prevTileRecord;\n continue;\n }\n\n prevTime = prevTile.lastTouchTime;\n worstTime = worstTile.lastTouchTime;\n prevLevel = prevTile.level;\n worstLevel = worstTile.level;\n\n if ( prevTime < worstTime ||\n ( prevTime === worstTime && prevLevel > worstLevel ) ) {\n worstTile = prevTile;\n worstTileIndex = i;\n worstTileRecord = prevTileRecord;\n }\n }\n\n if ( worstTile && worstTileIndex >= 0 ) {\n this._unloadTile(worstTileRecord);\n insertionIndex = worstTileIndex;\n }\n }\n\n this._tilesLoaded[ insertionIndex ] = new TileRecord({\n tile: options.tile,\n tiledImage: options.tiledImage\n });\n },\n\n /**\n * Clears all tiles associated with the specified tiledImage.\n * @param {OpenSeadragon.TiledImage} tiledImage\n */\n clearTilesFor: function( tiledImage ) {\n $.console.assert(tiledImage, '[TileCache.clearTilesFor] tiledImage is required');\n var tileRecord;\n for ( var i = 0; i < this._tilesLoaded.length; ++i ) {\n tileRecord = this._tilesLoaded[ i ];\n if ( tileRecord.tiledImage === tiledImage ) {\n this._unloadTile(tileRecord);\n this._tilesLoaded.splice( i, 1 );\n i--;\n }\n }\n },\n\n // private\n getImageRecord: function(cacheKey) {\n $.console.assert(cacheKey, '[TileCache.getImageRecord] cacheKey is required');\n return this._imagesLoaded[cacheKey];\n },\n\n // private\n _unloadTile: function(tileRecord) {\n $.console.assert(tileRecord, '[TileCache._unloadTile] tileRecord is required');\n var tile = tileRecord.tile;\n var tiledImage = tileRecord.tiledImage;\n\n tile.unload();\n tile.cacheImageRecord = null;\n\n var imageRecord = this._imagesLoaded[tile.cacheKey];\n imageRecord.removeTile(tile);\n if (!imageRecord.getTileCount()) {\n imageRecord.destroy();\n delete this._imagesLoaded[tile.cacheKey];\n this._imagesLoadedCount--;\n }\n\n /**\n * Triggered when a tile has just been unloaded from memory.\n *\n * @event tile-unloaded\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the unloaded tile.\n * @property {OpenSeadragon.Tile} tile - The tile which has been unloaded.\n */\n tiledImage.viewer.raiseEvent(\"tile-unloaded\", {\n tile: tile,\n tiledImage: tiledImage\n });\n }\n};\n\n}( OpenSeadragon ));\n\n/*\n * OpenSeadragon - World\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class World\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @classdesc Keeps track of all of the tiled images in the scene.\n * @param {Object} options - World options.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this World.\n **/\n$.World = function( options ) {\n var _this = this;\n\n $.console.assert( options.viewer, \"[World] options.viewer is required\" );\n\n $.EventSource.call( this );\n\n this.viewer = options.viewer;\n this._items = [];\n this._needsDraw = false;\n this._autoRefigureSizes = true;\n this._needsSizesFigured = false;\n this._delegatedFigureSizes = function(event) {\n if (_this._autoRefigureSizes) {\n _this._figureSizes();\n } else {\n _this._needsSizesFigured = true;\n }\n };\n\n this._figureSizes();\n};\n\n$.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.World.prototype */{\n /**\n * Add the specified item.\n * @param {OpenSeadragon.TiledImage} item - The item to add.\n * @param {Number} [options.index] - Index for the item. If not specified, goes at the top.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n addItem: function( item, options ) {\n $.console.assert(item, \"[World.addItem] item is required\");\n $.console.assert(item instanceof $.TiledImage, \"[World.addItem] only TiledImages supported at this time\");\n\n options = options || {};\n if (options.index !== undefined) {\n var index = Math.max(0, Math.min(this._items.length, options.index));\n this._items.splice(index, 0, item);\n } else {\n this._items.push( item );\n }\n\n if (this._autoRefigureSizes) {\n this._figureSizes();\n } else {\n this._needsSizesFigured = true;\n }\n\n this._needsDraw = true;\n\n item.addHandler('bounds-change', this._delegatedFigureSizes);\n item.addHandler('clip-change', this._delegatedFigureSizes);\n\n /**\n * Raised when an item is added to the World.\n * @event add-item\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item that has been added.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'add-item', {\n item: item\n } );\n },\n\n /**\n * Get the item at the specified index.\n * @param {Number} index - The item's index.\n * @returns {OpenSeadragon.TiledImage} The item at the specified index.\n */\n getItemAt: function( index ) {\n $.console.assert(index !== undefined, \"[World.getItemAt] index is required\");\n return this._items[ index ];\n },\n\n /**\n * Get the index of the given item or -1 if not present.\n * @param {OpenSeadragon.TiledImage} item - The item.\n * @returns {Number} The index of the item or -1 if not present.\n */\n getIndexOfItem: function( item ) {\n $.console.assert(item, \"[World.getIndexOfItem] item is required\");\n return $.indexOf( this._items, item );\n },\n\n /**\n * @returns {Number} The number of items used.\n */\n getItemCount: function() {\n return this._items.length;\n },\n\n /**\n * Change the index of a item so that it appears over or under others.\n * @param {OpenSeadragon.TiledImage} item - The item to move.\n * @param {Number} index - The new index.\n * @fires OpenSeadragon.World.event:item-index-change\n */\n setItemIndex: function( item, index ) {\n $.console.assert(item, \"[World.setItemIndex] item is required\");\n $.console.assert(index !== undefined, \"[World.setItemIndex] index is required\");\n\n var oldIndex = this.getIndexOfItem( item );\n\n if ( index >= this._items.length ) {\n throw new Error( \"Index bigger than number of layers.\" );\n }\n\n if ( index === oldIndex || oldIndex === -1 ) {\n return;\n }\n\n this._items.splice( oldIndex, 1 );\n this._items.splice( index, 0, item );\n this._needsDraw = true;\n\n /**\n * Raised when the order of the indexes has been changed.\n * @event item-index-change\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item whose index has\n * been changed\n * @property {Number} previousIndex - The previous index of the item\n * @property {Number} newIndex - The new index of the item\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'item-index-change', {\n item: item,\n previousIndex: oldIndex,\n newIndex: index\n } );\n },\n\n /**\n * Remove an item.\n * @param {OpenSeadragon.TiledImage} item - The item to remove.\n * @fires OpenSeadragon.World.event:remove-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n removeItem: function( item ) {\n $.console.assert(item, \"[World.removeItem] item is required\");\n\n var index = $.indexOf(this._items, item );\n if ( index === -1 ) {\n return;\n }\n\n item.removeHandler('bounds-change', this._delegatedFigureSizes);\n item.removeHandler('clip-change', this._delegatedFigureSizes);\n item.destroy();\n this._items.splice( index, 1 );\n this._figureSizes();\n this._needsDraw = true;\n this._raiseRemoveItem(item);\n },\n\n /**\n * Remove all items.\n * @fires OpenSeadragon.World.event:remove-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n removeAll: function() {\n // We need to make sure any pending images are canceled so the world items don't get messed up\n this.viewer._cancelPendingImages();\n var item;\n var i;\n for (i = 0; i < this._items.length; i++) {\n item = this._items[i];\n item.removeHandler('bounds-change', this._delegatedFigureSizes);\n item.removeHandler('clip-change', this._delegatedFigureSizes);\n item.destroy();\n }\n\n var removedItems = this._items;\n this._items = [];\n this._figureSizes();\n this._needsDraw = true;\n\n for (i = 0; i < removedItems.length; i++) {\n item = removedItems[i];\n this._raiseRemoveItem(item);\n }\n },\n\n /**\n * Clears all tiles and triggers updates for all items.\n */\n resetItems: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n this._items[i].reset();\n }\n },\n\n /**\n * Updates (i.e. animates bounds of) all items.\n */\n update: function() {\n var animated = false;\n for ( var i = 0; i < this._items.length; i++ ) {\n animated = this._items[i].update() || animated;\n }\n\n return animated;\n },\n\n /**\n * Draws all items.\n */\n draw: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n this._items[i].draw();\n }\n\n this._needsDraw = false;\n },\n\n /**\n * @returns {Boolean} true if any items need updating.\n */\n needsDraw: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n if ( this._items[i].needsDraw() ) {\n return true;\n }\n }\n return this._needsDraw;\n },\n\n /**\n * @returns {OpenSeadragon.Rect} The smallest rectangle that encloses all items, in viewport coordinates.\n */\n getHomeBounds: function() {\n return this._homeBounds.clone();\n },\n\n /**\n * To facilitate zoom constraints, we keep track of the pixel density of the\n * densest item in the World (i.e. the item whose content size to viewport size\n * ratio is the highest) and save it as this \"content factor\".\n * @returns {Number} the number of content units per viewport unit.\n */\n getContentFactor: function() {\n return this._contentFactor;\n },\n\n /**\n * As a performance optimization, setting this flag to false allows the bounds-change event handler\n * on tiledImages to skip calculations on the world bounds. If a lot of images are going to be positioned in\n * rapid succession, this is a good idea. When finished, setAutoRefigureSizes should be called with true\n * or the system may behave oddly.\n * @param {Boolean} [value] The value to which to set the flag.\n */\n setAutoRefigureSizes: function(value) {\n this._autoRefigureSizes = value;\n if (value & this._needsSizesFigured) {\n this._figureSizes();\n this._needsSizesFigured = false;\n }\n },\n\n /**\n * Arranges all of the TiledImages with the specified settings.\n * @param {Object} options - Specifies how to arrange.\n * @param {Boolean} [options.immediately=false] - Whether to animate to the new arrangement.\n * @param {String} [options.layout] - See collectionLayout in {@link OpenSeadragon.Options}.\n * @param {Number} [options.rows] - See collectionRows in {@link OpenSeadragon.Options}.\n * @param {Number} [options.columns] - See collectionColumns in {@link OpenSeadragon.Options}.\n * @param {Number} [options.tileSize] - See collectionTileSize in {@link OpenSeadragon.Options}.\n * @param {Number} [options.tileMargin] - See collectionTileMargin in {@link OpenSeadragon.Options}.\n * @fires OpenSeadragon.World.event:metrics-change\n */\n arrange: function(options) {\n options = options || {};\n var immediately = options.immediately || false;\n var layout = options.layout || $.DEFAULT_SETTINGS.collectionLayout;\n var rows = options.rows || $.DEFAULT_SETTINGS.collectionRows;\n var columns = options.columns || $.DEFAULT_SETTINGS.collectionColumns;\n var tileSize = options.tileSize || $.DEFAULT_SETTINGS.collectionTileSize;\n var tileMargin = options.tileMargin || $.DEFAULT_SETTINGS.collectionTileMargin;\n var increment = tileSize + tileMargin;\n var wrap;\n if (!options.rows && columns) {\n wrap = columns;\n } else {\n wrap = Math.ceil(this._items.length / rows);\n }\n var x = 0;\n var y = 0;\n var item, box, width, height, position;\n\n this.setAutoRefigureSizes(false);\n for (var i = 0; i < this._items.length; i++) {\n if (i && (i % wrap) === 0) {\n if (layout === 'horizontal') {\n y += increment;\n x = 0;\n } else {\n x += increment;\n y = 0;\n }\n }\n\n item = this._items[i];\n box = item.getBounds();\n if (box.width > box.height) {\n width = tileSize;\n } else {\n width = tileSize * (box.width / box.height);\n }\n\n height = width * (box.height / box.width);\n position = new $.Point(x + ((tileSize - width) / 2),\n y + ((tileSize - height) / 2));\n\n item.setPosition(position, immediately);\n item.setWidth(width, immediately);\n\n if (layout === 'horizontal') {\n x += increment;\n } else {\n y += increment;\n }\n }\n this.setAutoRefigureSizes(true);\n },\n\n // private\n _figureSizes: function() {\n var oldHomeBounds = this._homeBounds ? this._homeBounds.clone() : null;\n var oldContentSize = this._contentSize ? this._contentSize.clone() : null;\n var oldContentFactor = this._contentFactor || 0;\n\n if (!this._items.length) {\n this._homeBounds = new $.Rect(0, 0, 1, 1);\n this._contentSize = new $.Point(1, 1);\n this._contentFactor = 1;\n } else {\n var item = this._items[0];\n var bounds = item.getBounds();\n this._contentFactor = item.getContentSize().x / bounds.width;\n var clippedBounds = item.getClippedBounds().getBoundingBox();\n var left = clippedBounds.x;\n var top = clippedBounds.y;\n var right = clippedBounds.x + clippedBounds.width;\n var bottom = clippedBounds.y + clippedBounds.height;\n for (var i = 1; i < this._items.length; i++) {\n item = this._items[i];\n bounds = item.getBounds();\n this._contentFactor = Math.max(this._contentFactor,\n item.getContentSize().x / bounds.width);\n clippedBounds = item.getClippedBounds().getBoundingBox();\n left = Math.min(left, clippedBounds.x);\n top = Math.min(top, clippedBounds.y);\n right = Math.max(right, clippedBounds.x + clippedBounds.width);\n bottom = Math.max(bottom, clippedBounds.y + clippedBounds.height);\n }\n\n this._homeBounds = new $.Rect(left, top, right - left, bottom - top);\n this._contentSize = new $.Point(\n this._homeBounds.width * this._contentFactor,\n this._homeBounds.height * this._contentFactor);\n }\n\n if (this._contentFactor !== oldContentFactor ||\n !this._homeBounds.equals(oldHomeBounds) ||\n !this._contentSize.equals(oldContentSize)) {\n /**\n * Raised when the home bounds or content factor change.\n * @event metrics-change\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('metrics-change', {});\n }\n },\n\n // private\n _raiseRemoveItem: function(item) {\n /**\n * Raised when an item is removed.\n * @event remove-item\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item's underlying item.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'remove-item', { item: item } );\n }\n});\n\n}( OpenSeadragon ));\n\n//# sourceMappingURL=openseadragon.js.map","export const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\nconst getClassNames = el => {\n const attr = el.getAttribute('class');\n return attr ? new Set(attr.split(' ')) : new Set();\n}\n\n// IE11 doesn't support adding/removing classes to SVG elements except \n// via .setAttribute\nexport const addClass = (el, className) => {\n const classNames = getClassNames(el);\n classNames.add(className);\n el.setAttribute('class', Array.from(classNames).join(' '));\n}\n\nexport const removeClass = (el, className) => {\n const classNames = getClassNames(el);\n classNames.delete(className);\n\n if (classNames.size === 0)\n el.removeAttribute('class');\n else\n el.setAttribute('class', Array.from(classNames).join(' '));\n}\n\nexport const hasClass = (el, className) =>\n getClassNames(el).has(className);","import { SVG_NAMESPACE, addClass } from '../util/SVG';\n\n/** \n * Parses a W3C Web Annotation FragmentSelector conforming\n * to the Media Fragments spec. Supports (well-formed) xywh=pixel\n * and xywh=percent fragments. \n */\nexport const parseRectFragment = (annotation, image) => {\n const selector = annotation.selector('FragmentSelector');\n\n if (selector?.conformsTo.startsWith('http://www.w3.org/TR/media-frags')) {\n const { value } = selector;\n \n const format = value.includes(':') ? value.substring(value.indexOf('=') + 1, value.indexOf(':')) : 'pixel';\n const coords = value.includes(':') ? value.substring(value.indexOf(':') + 1) : value.substring(value.indexOf('=') + 1);\n\n let [ x, y, w, h ] = coords.split(',').map(parseFloat);\n\n if (format.toLowerCase() === 'percent') {\n x = x * image.naturalWidth / 100;\n y = y * image.naturalHeight / 100;\n w = w * image.naturalWidth / 100;\n h = h * image.naturalHeight / 100;\n }\n\n return { x, y, w, h };\n }\n}\n\n/** \n * Serializes a (x, y, w, h)-tuple as Media Fragment selector\n * using pixel coordinates.\n */\nconst toPixelRectFragment = (x, y, w, h, image) => ({\n source: image?.src,\n selector: {\n type: \"FragmentSelector\",\n conformsTo: \"http://www.w3.org/TR/media-frags/\",\n value: `xywh=pixel:${x},${y},${w},${h}`\n }\n});\n\n/** \n * Serializes a (x, y, w, h)-tuple as Media Fragment selector \n * using percent coordinates.\n */\nconst toPercentRectFragment = (x, y, w, h, image) => {\n const px = x / image.naturalWidth * 100;\n const py = y / image.naturalHeight * 100;\n const pw = w / image.naturalWidth * 100;\n const ph = h / image.naturalHeight * 100;\n\n return {\n source: image.src,\n selector: {\n type: \"FragmentSelector\",\n conformsTo: \"http://www.w3.org/TR/media-frags/\",\n value: `xywh=percent:${px},${py},${pw},${ph}`\n }\n }\n}\n\nexport const toRectFragment = (x, y, w, h, image, fragmentUnit) =>\n fragmentUnit?.toLowerCase() === 'percent' ?\n toPercentRectFragment(x, y, w, h, image) :\n toPixelRectFragment(x, y, w, h, image);\n\n/** Shorthand to apply the given (x, y, w, h) to the SVG shape **/\nconst setXYWH = (shape, x, y, w, h) => {\n shape.setAttribute('x', x);\n shape.setAttribute('y', y);\n shape.setAttribute('width', w);\n shape.setAttribute('height', h);\n}\n\n\nconst setPointXY = (shape, x, y) => {\n shape.setAttribute('cx', x);\n shape.setAttribute('cy', y);\n shape.setAttribute('r', 7); // TODO make configurable\n}\n\nexport const drawRectMask = (imageDimensions, x, y, w, h) => {\n const mask = document.createElementNS(SVG_NAMESPACE, 'path');\n mask.setAttribute('fill-rule', 'evenodd');\n\n const { naturalWidth, naturalHeight } = imageDimensions;\n mask.setAttribute('d', `M0 0 h${naturalWidth} v${naturalHeight} h-${naturalWidth} z M${x} ${y} h${w} v${h} h-${w} z`);\n\n return mask;\n}\n\nexport const setRectMaskSize = (mask, imageDimensions, x, y, w, h) => {\n const { naturalWidth, naturalHeight } = imageDimensions;\n mask.setAttribute('d', `M0 0 h${naturalWidth} v${naturalHeight} h-${naturalWidth} z M${x} ${y} h${w} v${h} h-${w} z`);\n}\n\n/** \n * Draws an SVG rectangle, either from an annotation, or an\n * (x, y, w, h)-tuple.\n */\nexport const drawRect = (arg1, arg2, arg3, arg4) => {\n const { x, y, w, h } = arg1.type === 'Annotation' || arg1.type === 'Selection' ?\n parseRectFragment(arg1, arg2) : { x: arg1, y: arg2, w: arg3, h: arg4 };\n\n const g = document.createElementNS(SVG_NAMESPACE, 'g');\n\n if (w === 0 && h === 0) {\n // Edge case: rect is actually a point\n addClass(g, 'a9s-point');\n addClass(g, 'a9s-non-scaling');\n g.setAttribute('transform-origin', `${x} ${y}`);\n\n const outerPoint = document.createElementNS(SVG_NAMESPACE, 'circle');\n const innerPoint = document.createElementNS(SVG_NAMESPACE, 'circle');\n\n innerPoint.setAttribute('class', 'a9s-inner');\n setPointXY(innerPoint, x, y);\n\n outerPoint.setAttribute('class', 'a9s-outer');\n setPointXY(outerPoint, x, y);\n\n g.appendChild(outerPoint);\n g.appendChild(innerPoint); \n } else {\n const outerRect = document.createElementNS(SVG_NAMESPACE, 'rect');\n const innerRect = document.createElementNS(SVG_NAMESPACE, 'rect');\n\n innerRect.setAttribute('class', 'a9s-inner');\n setXYWH(innerRect, x, y, w, h);\n\n outerRect.setAttribute('class', 'a9s-outer');\n setXYWH(outerRect, x, y, w, h);\n\n g.appendChild(outerRect);\n g.appendChild(innerRect);\n }\n\n return g;\n}\n\n/** Gets the (x, y, w, h)-values from the attributes of the SVG group **/\nexport const getRectSize = g => {\n const outer = g.querySelector('.a9s-outer');\n\n if (outer.nodeName === 'rect') {\n const x = parseFloat(outer.getAttribute('x'));\n const y = parseFloat(outer.getAttribute('y'));\n const w = parseFloat(outer.getAttribute('width'));\n const h = parseFloat(outer.getAttribute('height'));\n\n return { x, y, w, h };\n } else {\n const x = parseFloat(outer.getAttribute('cx'));\n const y = parseFloat(outer.getAttribute('cy'));\n\n return { x, y, w: 0, h: 0 };\n }\n}\n\n/** Applies the (x, y, w, h)-values to the rects in the SVG group **/\nexport const setRectSize = (g, x, y, w, h) => {\n const inner = g.querySelector('.a9s-inner');\n const outer = g.querySelector('.a9s-outer');\n\n if (outer.nodeName === 'rect') {\n setXYWH(inner, x, y, w, h);\n setXYWH(outer, x, y, w, h); \n } else {\n setPointXY(inner, x, y);\n setPointXY(outer, x, y);\n }\n}\n\n/** \n * Shorthand to get the area (rectangle w x h) from the \n * annotation's fragment selector. \n */\nexport const rectArea = (annotation, image) => {\n const { w, h } = parseRectFragment(annotation, image);\n return w * h;\n}\n\n","import { Selection } from '@recogito/recogito-client-core';\nimport { SVG_NAMESPACE } from '../../util/SVG';\nimport {\n drawRect,\n drawRectMask,\n setRectSize,\n setRectMaskSize,\n toRectFragment\n} from '../../selectors/RectFragment';\n\n/**\n * A 'rubberband' selection tool for creating a rectangle by\n * clicking and dragging.\n */\nexport default class RubberbandRect {\n\n constructor(anchorX, anchorY, g, config, env) {\n this.anchor = [anchorX, anchorY];\n this.opposite = [anchorX, anchorY];\n\n this.config = config;\n this.env = env;\n\n this.group = document.createElementNS(SVG_NAMESPACE, 'g');\n\n this.mask = drawRectMask(env.image, anchorX, anchorY, 2, 2);\n this.mask.setAttribute('class', 'a9s-selection-mask');\n\n this.rect = drawRect(anchorX, anchorY, 2, 2);\n this.rect.setAttribute('class', 'a9s-selection');\n\n // We make the selection transparent to \n // pointer events because it would interfere with the \n // rendered annotations' mouseleave/enter events\n this.group.style.pointerEvents = 'none';\n\n // Additionally, selection remains hidden until \n // the user actually moves the mouse\n this.group.style.display = 'none';\n\n this.group.appendChild(this.mask);\n this.group.appendChild(this.rect);\n\n g.appendChild(this.group);\n }\n\n get bbox() {\n const w = this.opposite[0] - this.anchor[0];\n const h = this.opposite[1] - this.anchor[1];\n\n return {\n x: w > 0 ? this.anchor[0] : this.opposite[0],\n y: h > 0 ? this.anchor[1] : this.opposite[1],\n w: Math.max(1, Math.abs(w)), // Negative values\n h: Math.max(1, Math.abs(h))\n };\n }\n\n get element() {\n return this.rect;\n }\n\n dragTo = (oppositeX, oppositeY) => {\n // Make visible\n this.group.style.display = null;\n\n this.opposite = [oppositeX, oppositeY];\n const { x, y, w, h } = this.bbox;\n\n setRectMaskSize(this.mask, this.env.image, x, y, w, h);\n setRectSize(this.rect, x, y, w, h);\n }\n\n getBoundingClientRect = () =>\n this.rect.getBoundingClientRect();\n\n toSelection = () => {\n const { x, y, w, h } = this.bbox;\n return new Selection(toRectFragment(x, y, w, h, this.env.image, this.config.fragmentUnit));\n }\n\n destroy = () => {\n this.group.parentNode.removeChild(this.group);\n\n this.mask = null;\n this.rect = null;\n this.group = null;\n }\n\n}","const SIM_EVENTS = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup'\n}\n\nexport const isTouchDevice = () =>\n 'ontouchstart' in window ||\n navigator.maxTouchPoints > 0 ||\n navigator.msMaxTouchPoints > 0;\n\nexport const enableTouchTranslation = el => {\n\n let pressAndHoldTrigger = null;\n\n const simulateEvent = (type, e) => new MouseEvent(type, {\n screenX: e.screenX,\n screenY: e.screenY,\n clientX: e.clientX,\n clientY: e.clientY,\n pageX: e.pageX,\n pageY: e.pageY,\n bubbles: true\n });\n\n const touchHandler = evt => {\n const touch = evt.changedTouches[0];\n const simulatedEvent = simulateEvent(SIM_EVENTS[evt.type], touch);\n\n touch.target.dispatchEvent(simulatedEvent);\n evt.preventDefault();\n\n if (evt.type === 'touchstart' || evt.type === 'touchmove') {\n pressAndHoldTrigger && clearTimeout(pressAndHoldTrigger);\n\n pressAndHoldTrigger = setTimeout(() => {\n const simulatedEvent = simulateEvent('dblclick', touch);\n touch.target.dispatchEvent(simulatedEvent);\n }, 800);\n }\n\n if (evt.type === 'touchend')\n pressAndHoldTrigger && clearTimeout(pressAndHoldTrigger);\n }\n\n el.addEventListener('touchstart', touchHandler, true);\n el.addEventListener('touchmove', touchHandler, true);\n el.addEventListener('touchend', touchHandler, true);\n el.addEventListener('touchcancel', touchHandler, true);\n\n}","import EventEmitter from 'tiny-emitter';\nimport { isTouchDevice } from '../util/Touch';\nimport { SVG_NAMESPACE } from '../util/SVG';\n\nconst IMPLEMENTATION_MISSING = \"An implementation is missing\";\n\nconst isTouch = isTouchDevice();\n\n/**\n * A commmon base class for Tools and EditableShapes\n */\nexport class ToolLike extends EventEmitter {\n\n constructor(g, config, env) {\n super();\n\n this.svg = g.closest('svg');\n\n this.g = g;\n this.config = config;\n this.env = env;\n\n // Default image scale\n this.scale = 1;\n\n // Bit of a hack. If we are dealing with a 'real' image, we enable\n // reponsive mode. OpenSeadragon handles scaling in a different way,\n // so we don't need responsive mode.\n const { image } = env;\n if (image instanceof Element || image instanceof HTMLDocument)\n this.enableResponsive();\n }\n\n /**\n * Implementations MAY extend this (calling super),\n * to destroy SVG elements, mask, etc.\n */\n destroy() {\n if (this.resizeObserver)\n this.resizeObserver.disconnect();\n\n this.resizeObserver = null;\n }\n\n enableResponsive = () => {\n if (window.ResizeObserver) {\n this.resizeObserver = new ResizeObserver(() => {\n const svgBounds = this.svg.getBoundingClientRect();\n const { width, height } = this.svg.viewBox.baseVal;\n\n this.scale = Math.max(\n width / svgBounds.width,\n height / svgBounds.height\n );\n\n if (this.onScaleChanged)\n this.onScaleChanged(this.scale);\n });\n\n this.resizeObserver.observe(this.svg.parentNode);\n }\n }\n\n getSVGPoint = evt => {\n const pt = this.svg.createSVGPoint();\n\n if (isTouch) {\n const bbox = this.svg.getBoundingClientRect();\n\n const x = evt.clientX - bbox.x;\n const y = evt.clientY - bbox.y;\n\n const { left, top } = this.svg.getBoundingClientRect();\n pt.x = x + left;\n pt.y = y + top;\n\n return pt.matrixTransform(this.g.getScreenCTM().inverse());\n } else {\n pt.x = evt.offsetX;\n pt.y = evt.offsetY;\n\n return pt.matrixTransform(this.g.getCTM().inverse());\n }\n }\n\n /*********************************/\n /* Helpers for drawing handles */\n /*********************************/\n\n drawHandle = (x, y) => {\n const containerGroup = document.createElementNS(SVG_NAMESPACE, 'g');\n containerGroup.setAttribute('class', 'a9s-handle');\n\n const group = document.createElementNS(SVG_NAMESPACE, 'g');\n\n const drawCircle = r => {\n const c = document.createElementNS(SVG_NAMESPACE, 'circle');\n c.setAttribute('cx', x);\n c.setAttribute('cy', y);\n c.setAttribute('r', r);\n c.setAttribute('transform-origin', `${x} ${y}`);\n return c;\n }\n\n const radius = this.config.handleRadius || 6;\n\n const inner = drawCircle(radius);\n inner.setAttribute('class', 'a9s-handle-inner')\n\n const outer = drawCircle(radius + 1);\n outer.setAttribute('class', 'a9s-handle-outer')\n\n group.appendChild(outer);\n group.appendChild(inner);\n\n containerGroup.appendChild(group);\n return containerGroup;\n }\n\n setHandleXY = (handle, x, y) => {\n const inner = handle.querySelector('.a9s-handle-inner');\n inner.setAttribute('cx', x);\n inner.setAttribute('cy', y);\n inner.setAttribute('transform-origin', `${x} ${y}`);\n\n const outer = handle.querySelector('.a9s-handle-outer');\n outer.setAttribute('cx', x);\n outer.setAttribute('cy', y);\n outer.setAttribute('transform-origin', `${x} ${y}`);\n }\n\n getHandleXY = handle => {\n const outer = handle.querySelector('.a9s-handle-outer');\n return {\n x: parseFloat(outer.getAttribute('cx')),\n y: parseFloat(outer.getAttribute('cy'))\n }\n }\n\n scaleHandle = handle => {\n const inner = handle.querySelector('.a9s-handle-inner');\n const outer = handle.querySelector('.a9s-handle-outer');\n\n const radius = this.scale * (this.config.handleRadius || 6);\n\n inner.setAttribute('r', radius);\n outer.setAttribute('r', radius);\n }\n\n}\n\n/**\n * Base class that adds some convenience stuff for tool plugins.\n */\nexport default class Tool extends ToolLike {\n\n constructor(g, config, env) {\n super(g, config, env);\n\n // We'll keep a flag set to false until\n // the user has started moving, so we can\n // fire the startSelection event\n this.started = false;\n }\n\n attachListeners = ({ mouseMove, mouseUp, dblClick }) => {\n // Handle SVG conversion on behalf of tool implementations\n if (mouseMove) {\n this.mouseMove = evt => {\n const { x , y } = this.getSVGPoint(evt);\n\n if (!this.started) {\n this.emit('startSelection', { x, y });\n this.started = true;\n }\n\n mouseMove(x, y, evt);\n }\n\n // Mouse move goes on SVG element\n this.svg.addEventListener('mousemove', this.mouseMove);\n }\n\n if (mouseUp) {\n this.mouseUp = evt => {\n if (evt.button !== 0) return; // left click\n const { x , y } = this.getSVGPoint(evt);\n mouseUp(x, y, evt);\n }\n\n // Mouse up goes on doc, so we capture events outside, too\n document.addEventListener('mouseup', this.mouseUp);\n }\n\n if (dblClick) {\n this.dblClick = evt => {\n const { x , y } = this.getSVGPoint(evt);\n dblClick(x, y, evt);\n }\n\n document.addEventListener('dblclick', this.dblClick);\n }\n\n }\n\n detachListeners = () => {\n if (this.mouseMove)\n this.svg.removeEventListener('mousemove', this.mouseMove);\n\n if (this.mouseUp)\n document.removeEventListener('mouseup', this.mouseUp);\n\n if (this.dblClick)\n document.removeEventListener('dblclick', this.dblClick);\n }\n\n /**\n * If startOnSingleClick is true, the tool starts on single click\n * as well as drag. If false, starting strictly requires drag!\n */\n start = (evt, startOnSingleClick) => {\n // Handle SVG conversion on behalf of tool implementations\n const { x, y } = this.getSVGPoint(evt);\n \n // Constrain the initial coordinates (x, y) to be within the image bounds\n const { naturalWidth, naturalHeight } = this.env.image;\n const startX = x < 0 ? 0 : (x > naturalWidth ? naturalWidth : x);\n const startY = y < 0 ? 0 : (y > naturalHeight ? naturalHeight : y);\n \n this.startDrawing(startX, startY, startOnSingleClick, evt);\n }\n\n /**\n * Tool implementations MUST override these\n */\n\n get isDrawing() {\n throw new Error(IMPLEMENTATION_MISSING);\n }\n\n startDrawing = evt => {\n throw new Error(IMPLEMENTATION_MISSING);\n }\n\n createEditableShape = (annotation, formatters) => {\n throw new Error(IMPLEMENTATION_MISSING);\n }\n\n}\n\n// In addition, Tool implementations need to implement the following static methods\n\n// Tool.identifier = '...'\n\nTool.supports = annotation => {\n throw new Error(IMPLEMENTATION_MISSING);\n}\n\n// Just some convenience shortcuts to client-core, for quicker\n// importing in plugins. (In a way, the intention is to make the\n// Tool class serve as a kind of mini-SDK).\nexport { default as Selection } from '@recogito/recogito-client-core/src/Selection';\nexport { default as WebAnnotation } from '@recogito/recogito-client-core/src/WebAnnotation';\n","import { ToolLike } from './Tool';\n\nconst IMPLEMENTATION_MISSING = \"An implementation is missing\";\n\nexport default class EditableShape extends ToolLike {\n\n constructor(annotation, g, config, env) {\n super(g, config, env);\n\n this.annotation = annotation;\n }\n \n /**\n * Implementations MUST override this method!\n * \n * Must return the 'g' element with the a9s-annotation class.\n */\n get element() {\n throw new Error(IMPLEMENTATION_MISSING);\n }\n\n /**\n * Implementations MUST override this method!\n * \n * The annotation argument MUST be used to update\n * the current state of the shape. It MUST NOT\n * be stored as 'this.annotation'! 'this.annotation'\n * MUST remain the original annotation at the time\n * this EditableShape was created, because we will\n * need it again in case the user cancels editing.\n * \n * Thinking of it in React terms, 'this.annotation'\n * has the same purpose as props.annotation, whereas\n * this method affects state.\n */\n updateState = annotation => {\n throw new Error(IMPLEMENTATION_MISSING);\n }\n\n}\n","import { addClass, SVG_NAMESPACE } from './SVG';\n\nconst isFirefox = /firefox/i.test(navigator.userAgent);\n\nconst formatSvgEl = (svgEl, x, y, w, h) => {\n svgEl.setAttribute('width', w);\n svgEl.setAttribute('height', h);\n\n // Argh - Firefox produces broken SVG bounds for nested SVG\n if (isFirefox) {\n svgEl.setAttribute('x', 0);\n svgEl.setAttribute('y', 0);\n svgEl.setAttribute('transform', `translate(${x}, ${y})`); \n } else {\n svgEl.setAttribute('x', x);\n svgEl.setAttribute('y', y);\n }\n}\n\nconst appendFormatterEl = (formatterEl, shape) => {\n const { x, y, width, height } = shape.getBBox();\n\n const svgEl = document.createElementNS(SVG_NAMESPACE, 'svg');\n svgEl.setAttribute('class', 'a9s-formatter-el');\n\n formatSvgEl(svgEl, x, y, width, height);\n\n const g = document.createElementNS(SVG_NAMESPACE, 'g');\n g.appendChild(formatterEl);y\n\n svgEl.appendChild(g);\n \n shape.append(svgEl);\n}\n\n/**\n * A formatter is a user-defined function that takes an annotation as input,\n * and returns either a string, or an object. If a string is returned, this\n * will be appended to the annotation element CSS class list. Otherwise, the\n * object can have the following properties: \n * \n * - 'className' added to the CSS class list\n * - 'data-*' added as data attributes\n * - 'style' a list of CSS styles (in the form of a string) \n */\nexport const format = (shape, annotation, formatters) => {\n // The formatter can be undefined\n if (!formatters)\n return shape;\n\n // Merge outputs from all formatter functions into one object\n const format = formatters.reduce((merged, fn) => {\n const format = fn(annotation);\n\n if (!format)\n return merged;\n\n if (typeof format === 'string' || format instanceof String) {\n merged.className = merged.className ? `${merged.className} ${format}` : format; \n } else if (format.nodeType === Node.ELEMENT_NODE) {\n merged.elements = merged.elements ? [...merged.elements, format] : [format];\n } else {\n const { className, style, element } = format;\n\n if (className)\n merged.className = merged.className ? `${merged.className} ${className}` : className;\n\n if (style)\n merged.style = merged.style ? `${merged.style} ${style}` : style;\n\n if (element)\n merged.elements = merged.elements ? [...merged.elements, element] : [element];\n }\n\n // Copy data attributes\n for (const key in format) {\n if (format.hasOwnProperty(key) && key.startsWith('data-')) {\n merged[key] = format[key];\n }\n }\n\n return merged;\n }, {});\n\n const { className, style, elements } = format;\n\n if (className)\n addClass(shape, className);\n\n if (style) {\n const outer = shape.querySelector('.a9s-outer');\n const inner = shape.querySelector('.a9s-inner');\n\n if (outer && inner) {\n outer.setAttribute('style', 'display:none');\n inner.setAttribute('style', style);\n } else {\n shape.setAttribute('style', style);\n }\n }\n\n if (elements)\n elements.forEach(el => appendFormatterEl(el, shape));\n\n for (const key in format) {\n if (format.hasOwnProperty(key) && key.startsWith('data-')) {\n shape.setAttribute(key, format[key]);\n }\n }\n}\n\nexport const setFormatterElSize = (group, x, y, w, h) => {\n const formatterEl = group.querySelector('.a9s-formatter-el');\n if (formatterEl)\n formatSvgEl(formatterEl, x, y, w, h);\n}","import EditableShape from '../EditableShape';\nimport { SVG_NAMESPACE } from '../../util/SVG';\nimport { format, setFormatterElSize } from '../../util/Formatting';\nimport {\n drawRect,\n drawRectMask,\n parseRectFragment,\n getRectSize,\n setRectSize,\n toRectFragment,\n setRectMaskSize\n} from '../../selectors/RectFragment';\n\nconst CORNER = 'corner';\nconst EDGE = 'edge';\n\n/**\n * An editable rectangle shape.\n */\nexport default class EditableRect extends EditableShape {\n\n constructor(annotation, g, config, env) {\n super(annotation, g, config, env);\n\n this.svg.addEventListener('mousemove', this.onMouseMove);\n this.svg.addEventListener('mouseup', this.onMouseUp);\n\n const { x, y, w, h } = parseRectFragment(annotation, env.image);\n\n // SVG markup for this class looks like this:\n //\n // \n // \n // <-- return this node as .element\n // \n // \n // ... \n // ... \n // ... \n // ... \n // \n // \n\n // 'g' for the editable rect compound shape\n this.containerGroup = document.createElementNS(SVG_NAMESPACE, 'g');\n\n this.mask = drawRectMask(env.image, x, y, w, h);\n this.mask.setAttribute('class', 'a9s-selection-mask');\n this.containerGroup.appendChild(this.mask);\n\n // The 'element' = rectangles + handles\n this.elementGroup = document.createElementNS(SVG_NAMESPACE, 'g');\n this.elementGroup.setAttribute('class', 'a9s-annotation editable selected');\n this.elementGroup.setAttribute('data-id', annotation.id);\n\n this.rectangle = drawRect(x, y, w, h);\n this.rectangle.querySelector('.a9s-inner')\n .addEventListener('mousedown', this.onGrab(this.rectangle));\n\n this.elementGroup.appendChild(this.rectangle);\n\n this.enableEdgeControls = config.enableEdgeControls;\n\n const edgeHandles = this.enableEdgeControls\n ? [\n [x + w / 2, y, EDGE],\n [x + w, y + h / 2, EDGE],\n [x + w / 2, y + h, EDGE],\n [x, y + h / 2, EDGE],\n ]\n : [];\n\n this.handles = [\n [x, y, CORNER],\n [x + w, y, CORNER],\n [x + w, y + h, CORNER],\n [x, y + h, CORNER],\n ...edgeHandles,\n ].map(t => {\n const [x, y, type] = t;\n const handle = this.drawHandle(x, y);\n\n handle.addEventListener('mousedown', this.onGrab(handle, type));\n this.elementGroup.appendChild(handle);\n\n return handle;\n });\n\n this.containerGroup.appendChild(this.elementGroup);\n\n g.appendChild(this.containerGroup);\n\n format(this.rectangle, annotation, config.formatters);\n\n // The grabbed element (handle or entire group), if any\n this.grabbedElem = null;\n \n // Type of the grabbed element, either 'corner' or 'edge'\n this.grabbedType = null;\n\n // Mouse xy offset inside the shape, if mouse pressed\n this.mouseOffset = null;\n }\n\n onScaleChanged = () => \n this.handles.map(this.scaleHandle);\n\n setSize = (x, y, w, h) => {\n setRectSize(this.rectangle, x, y, w, h);\n setRectMaskSize(this.mask, this.env.image, x, y, w, h);\n setFormatterElSize(this.elementGroup, x, y, w, h);\n\n const [\n topleft,\n topright,\n bottomright,\n bottomleft,\n topEdge,\n rightEdge,\n bottomEdge,\n leftEdge\n ] = this.handles;\n\n this.setHandleXY(topleft, x, y);\n this.setHandleXY(topright, x + w, y);\n this.setHandleXY(bottomright, x + w, y + h);\n this.setHandleXY(bottomleft, x, y + h);\n\n if (this.enableEdgeControls) {\n this.setHandleXY(topEdge, x + w / 2, y);\n this.setHandleXY(rightEdge, x + w, y + h / 2);\n this.setHandleXY(bottomEdge, x + w / 2, y + h);\n this.setHandleXY(leftEdge, x, y + h / 2);\n }\n }\n\n stretchCorners = (draggedHandleIdx, anchorHandle, mousePos) => {\n const anchor = this.getHandleXY(anchorHandle);\n\n const width = mousePos.x - anchor.x;\n const height = mousePos.y - anchor.y;\n\n const x = width > 0 ? anchor.x : mousePos.x;\n const y = height > 0 ? anchor.y : mousePos.y;\n const w = Math.abs(width);\n const h = Math.abs(height);\n\n this.setSize(x, y, w, h);\n\n return { x, y, w, h };\n }\n\n stretchEdge = (handleIdx, oppositeHandle, mousePos) => {\n const anchor = this.getHandleXY(oppositeHandle);\n const currentRectDims = getRectSize(this.rectangle);\n const isHeightAdjustment = handleIdx % 2 === 0;\n\n const width = isHeightAdjustment ? currentRectDims.w : mousePos.x - anchor.x;\n const height = isHeightAdjustment ? mousePos.y - anchor.y : currentRectDims.h;\n\n const x = isHeightAdjustment ? currentRectDims.x : (width > 0 ? anchor.x : mousePos.x);\n const y = isHeightAdjustment ? (height > 0 ? anchor.y : mousePos.y) : currentRectDims.y;\n const w = Math.abs(width);\n const h = Math.abs(height);\n\n this.setSize(x, y, w, h);\n\n return { x, y, w, h };\n };\n\n onGrab = (grabbedElem, type) => evt => {\n if (evt.button !== 0) return; // left click\n this.grabbedElem = grabbedElem;\n this.grabbedType = type;\n const pos = this.getSVGPoint(evt);\n const { x, y } = getRectSize(this.rectangle);\n this.mouseOffset = { x: pos.x - x, y: pos.y - y };\n }\n\n onMouseMove = evt => {\n if (evt.button !== 0) return; // left click\n const constrain = (coord, max) =>\n coord < 0 ? 0 : (coord > max ? max : coord);\n\n if (this.grabbedElem) {\n const pos = this.getSVGPoint(evt);\n\n if (this.grabbedElem === this.rectangle) {\n // x/y changes by mouse offset, w/h remains unchanged\n const { w, h } = getRectSize(this.rectangle);\n\n const { naturalWidth, naturalHeight } = this.env.image;\n\n const x = constrain(pos.x - this.mouseOffset.x, naturalWidth - w);\n const y = constrain(pos.y - this.mouseOffset.y, naturalHeight - h);\n\n this.setSize(x, y, w, h);\n this.emit('update', toRectFragment(x, y, w, h, this.env.image, this.config.fragmentUnit));\n } else {\n // Mouse position replaces one of the corner coords, depending\n // on which handle is the grabbed element\n const handleIdx = this.handles.indexOf(this.grabbedElem);\n const oppositeHandle = this.handles[handleIdx ^ 2];\n\n const { x, y, w, h } = \n this.grabbedType === CORNER\n ? this.stretchCorners(handleIdx, oppositeHandle, pos)\n : this.stretchEdge(handleIdx, oppositeHandle, pos);\n\n this.emit('update', toRectFragment(x, y, w, h, this.env.image, this.config.fragmentUnit));\n }\n }\n }\n\n onMouseUp = evt => {\n this.grabbedElem = null;\n this.grabbedType = null;\n this.mouseOffset = null;\n }\n\n get element() {\n return this.elementGroup;\n }\n\n updateState = annotation => {\n const { x, y, w, h } = parseRectFragment(annotation, this.env.image);\n this.setSize(x, y, w, h);\n }\n\n destroy() {\n this.containerGroup.parentNode.removeChild(this.containerGroup);\n super.destroy();\n }\n\n}\n","import RubberbandRect from './RubberbandRect';\nimport EditableRect from './EditableRect';\nimport Tool from '../Tool';\n\n/**\n * A rubberband selector for rectangle fragments.\n */\nexport default class RubberbandRectTool extends Tool {\n\n constructor(g, config, env) {\n // Most of the basics are handled in the Tool base class\n super(g, config, env);\n\n this.rubberband = null;\n }\n\n startDrawing = (x, y) => {\n this.attachListeners({\n mouseMove: this.onMouseMove,\n mouseUp: this.onMouseUp\n });\n\n this.rubberband = new RubberbandRect(x, y, this.g, this.config, this.env);\n }\n\n stop = () => {\n if (this.rubberband) {\n this.rubberband.destroy();\n this.rubberband = null;\n }\n }\n\n onMouseMove = (x, y) => {\n // Constrain the initial coordinates (x, y) to be within the image bounds\n const { naturalWidth, naturalHeight } = this.env.image;\n const constrainX = Math.min(Math.max(x, 0), naturalWidth);\n const constrainY = Math.min(Math.max(y, 0), naturalHeight);\n\n this.rubberband.dragTo(constrainX, constrainY);\n }\n \n onMouseUp = () => {\n this.detachListeners();\n this.started = false;\n\n const { width, height } = this.rubberband.getBoundingClientRect();\n\n const minWidth = this.config.minSelectionWidth || 4;\n const minHeight = this.config.minSelectionHeight || 4;\n\n if (width >= minWidth && height >= minHeight) {\n // Emit the SVG shape with selection attached \n const { element } = this.rubberband;\n element.annotation = this.rubberband.toSelection();\n\n // Emit the completed shape...\n this.emit('complete', element);\n } else {\n this.emit('cancel');\n }\n\n this.stop();\n }\n\n get isDrawing() {\n return this.rubberband != null;\n }\n \n createEditableShape = (annotation, formatters) =>\n new EditableRect(annotation, this.g, {...this.config, formatters}, this.env);\n\n}\n\nRubberbandRectTool.identifier = 'rect';\n\nRubberbandRectTool.supports = annotation => {\n const fragmentSelector = annotation.selector('FragmentSelector');\n return fragmentSelector?.conformsTo.startsWith('http://www.w3.org/TR/media-frags');\n}","/**\n * Computes the area of the polygon defined by\n * the given conrner points.\n * @param {Array} points \n * @returns {number} the area\n */\nexport const polygonArea = points => {\n let area = 0;\n let j = points.length - 1;\n\n for (let i=0; i < points.length; i++) {\n area += (points[j][0] + points[i][0]) * (points[j][1] - points[i][1]);\n j = i;\n }\n\n return Math.abs(0.5 * area);\n}\n\n/**\n * Hit test: checks if this point is inside the circle.\n * @param {Array} point the point [x, y]\n * @param {number} cx circle center x\n * @param {number} cy circle center y\n * @param {number} r circle radius\n * @returns {boolean} \n */\nexport const pointInCircle = (point, cx, cy, r) => {\n const dx = point[0] - cx;\n const dy = point[1] - cy;\n\n const d = Math.sqrt(dx * dx + dy * dy);\n return d <= r;\n}\n\n/**\n * Hit test: checks if this point is inside the ellipse.\n * Cf. https://github.com/w8r/point-in-ellipse\n * @param {Array} point the point [x, y] \n * @param {number} cx ellipse center x \n * @param {number} cy ellipse center y\n * @param {number} rx ellipse x radius\n * @param {number} ry ellipse y radius\n * @param {number=} rotation ellipse rotation \n * @returns {boolean}\n */\nexport const pointInEllipse = (point, cx, cy, rx, ry, rotation) => {\n const rot = rotation || 0;\n\n const cos = Math.cos(rot);\n const sin = Math.sin(rot);\n\n const dx = point[0] - cx;\n const dy = point[1] - cy;\n\n const tdx = cos * dx + sin * dy;\n const tdy = sin * dx - cos * dy;\n\n return (tdx * tdx) / (rx * rx) + (tdy * tdy) / (ry * ry) <= 1;\n}\n\n/**\n * Hit test: checks if this point is inside the polygon.\n * @param {Array} xy the point [x, y]\n * @param {Array} points polygon corner points \n * @returns {boolean}\n */\nexport const pointInPolygon = (xy, points) => {\n // Algorithm checks, if xy is in Polygon\n // algorithm based on\n // https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html/pnpoly.html\n const x = xy[0];\n const y = xy[1];\n \n let inside = false;\n\n for (let i=0, j=points.length-1; i < points.length; j=i++) {\n const xi = points[i][0], yi = points[i][1];\n const xj = points[j][0], yj = points[j][1];\n \n const intersect = ((yi > y) != (yj > y))\n && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n \n if (intersect)\n inside = !inside;\n }\n \n return inside;\n}\n\n/**\n * Checks if polygon A is contained fully inside polygon B.\n * @param {Array>} polygonA array of points [x, y] \n * @param {Array>} polygonB array of points [x, y]\n * @returns {boolean}\n */\nexport const polygonInPolygon = (polygonA, polygonB) => {\n for (let point of polygonA) {\n if (!pointInPolygon(point, polygonB)) \n return false\n }\n\n return true;\n}\n\n/** \n * Hit test: checks if this point is inside the line.\n * @param {Array} xy the point [x, y]\n * @param number x1 line start x\n * @param number y1 line start y\n * @param number x2 line end x\n * @param number y2 line end y\n * @param number buffer around the line\n * @returns {boolean}\n */\nexport const pointInLine = (xy, x1, y1, x2, y2, buffer) => {\n const x = xy[0];\n const y = xy[1];\n\n const dx = x2 - x1;\n const dy = y2 - y1;\n const d = Math.sqrt(dx * dx + dy * dy);\n const cross = Math.abs((x - x1) * dy - (y - y1) * dx);\n const dist = cross / d;\n\n return dist <= buffer;\n}\n\n/**\n * A utility helper that parses an SVG path into \n * a list of polygons.\n * @param {SVGElement} path the SVG path\n * @returns {Array>>} list of polygons \n */\nexport const svgPathToPolygons = path => {\n const commands = path.getAttribute('d')\n .split(/(?=M|m|L|l|H|h|V|v|Z|z)/g)\n .map(str => str.trim());\n\n const polygons = [];\n\n let points = [];\n\n for (let cmd of commands) {\n const op = cmd.substring(0, 1);\n\n if (op.toLowerCase() === 'z') {\n polygons.push([...points]);\n points = [];\n } else {\n const xy = cmd.substring(1).split(' ')\n .map(str => parseFloat(str.trim()));\n \n // Uppercase ops are absolute coords -> transform\n const isUppercase = op === op.toUpperCase();\n\n const x = isUppercase ? xy[0] : xy[0] + points[points.length - 1][0];\n const y = isUppercase ? xy[1] : xy[1] + points[points.length - 1][1];\n\n points.push([x, y]);\n }\n }\n\n if (points.length > 0) // Unclosed path - close for area computation\n polygons.push([...points]); \n\n return polygons;\n}","import { SVG_NAMESPACE } from '../util/SVG';\nimport { polygonArea, polygonInPolygon, svgPathToPolygons } from '../util/Geom2D';\n\n/** Helper that forces an un-namespaced node to SVG **/\nconst insertSVGNamespace = originalDoc => {\n // Serialize and parse for the namespace to take effect on every node\n const serializer = new XMLSerializer();\n const str = serializer.serializeToString(originalDoc.documentElement);\n\n // Doesn't seem that there's a clean cross-browser way for this...\n const namespaced = str.replace('', ``);\n\n const parser = new DOMParser();\n const namespacedDoc = parser.parseFromString(namespaced, \"image/svg+xml\");\n return namespacedDoc.documentElement;\n}\n\nconst sanitize = doc => {\n // Cf. https://github.com/mattkrick/sanitize-svg#readme \n // for the basic approach\n const cleanEl = el => {\n Array.from(el.attributes).forEach(attr => {\n if (attr.name.startsWith('on'))\n el.removeAttribute(attr.name)\n });\n }\n\n // Remove script tags\n const scripts = doc.getElementsByTagName('script');\n Array.from(scripts).reverse().forEach(el =>\n el.parentNode.removeChild(el));\n\n // Remove on... attributes\n cleanEl(doc);\n Array.from(doc.querySelectorAll('*')).forEach(cleanEl);\n\n return doc;\n}\n\nexport const svgFragmentToShape = annotation => {\n const selector = annotation.selector('SvgSelector');\n if (selector) {\n const parser = new DOMParser();\n\n // Parse the XML document, assuming SVG\n const { value } = selector;\n const doc = parser.parseFromString(value, \"image/svg+xml\");\n\n // SVG needs a namespace declaration - check if it's set or insert if not\n const isPrefixDeclared = doc.lookupPrefix(SVG_NAMESPACE); // SVG declared via prefix\n const isDefaultNamespaceSVG = doc.lookupNamespaceURI(null); // SVG declared as default namespace\n\n if (isPrefixDeclared || isDefaultNamespaceSVG) {\n return sanitize(doc).firstChild;\n } else {\n return sanitize(insertSVGNamespace(doc)).firstChild;\n }\n }\n}\n\nexport const drawEmbeddedSVG = annotation => {\n const shape = svgFragmentToShape(annotation);\n\n // Because we're nitpicky, we don't just draw the shape,\n // but duplicate it, so we can have inner and an outer lines\n const g = document.createElementNS(SVG_NAMESPACE, 'g');\n\n const inner = shape.cloneNode(true);\n inner.setAttribute('class', 'a9s-inner');\n\n const outer = shape.cloneNode(true);\n outer.setAttribute('class', 'a9s-outer');\n\n g.appendChild(outer);\n g.appendChild(inner);\n\n return g;\n}\n\nexport const toSVGTarget = (shape, image) => {\n const inner = shape.querySelector('.a9s-inner').cloneNode(true);\n inner.removeAttribute('class');\n inner.removeAttribute('xmlns');\n\n let serialized = inner.outerHTML || new XMLSerializer().serializeToString(inner);\n serialized = serialized.replace(` xmlns=\"${SVG_NAMESPACE}\"`, '');\n\n return {\n source: image?.src,\n selector: {\n type: \"SvgSelector\",\n value: `${serialized}`\n }\n }\n}\n\nexport const svgArea = annotation => {\n const shape = svgFragmentToShape(annotation);\n const nodeName = shape.nodeName.toLowerCase();\n\n if (nodeName === 'polygon') \n return svgPolygonArea(shape);\n else if (nodeName === 'circle')\n return svgCircleArea(shape);\n else if (nodeName === 'ellipse')\n return svgEllipseArea(shape);\n else if (nodeName == 'path')\n return svgPathArea(shape);\n else if (nodeName == 'line')\n return 0;\n else\n throw `Unsupported SVG shape type: ${nodeName}`;\n}\n\nconst svgPolygonArea = polygon => {\n const points = polygon.getAttribute('points')\n .trim()\n .split(' ') // Split x/y tuples\n .map(xy => xy.split(',').map(str => parseFloat(str.trim())));\n\n return polygonArea(points)\n}\n\nconst svgCircleArea = circle => {\n const r = circle.getAttribute('r');\n return r * r * Math.PI;\n}\n\nconst svgEllipseArea = ellipse => {\n const rx = ellipse.getAttribute('rx');\n const ry = ellipse.getAttribute('ry');\n return rx * ry * Math.PI;\n}\n\nconst svgPathArea = path => {\n const polygons = svgPathToPolygons(path);\n\n if (polygons.length == 1) {\n return polygonArea(polygons[0]);\n } else {\n // Helper to check if a polygon is a hole\n const isHole = p => polygons.find(other => {\n if (p !== other)\n return polygonInPolygon(p, other); \n })\n\n let area = 0\n\n for (let poly of polygons) {\n if (isHole(poly))\n area -= polygonArea(poly);\n else \n area += polygonArea(poly);\n }\n\n return area;\n }\n}","import { SVG_NAMESPACE } from '../../util/SVG';\n\nexport default class PolygonMask {\n\n constructor(imageDimensions, polygon) {\n this.w = imageDimensions.naturalWidth;\n this.h = imageDimensions.naturalHeight;\n\n this.polygon = polygon;\n\n this.mask = document.createElementNS(SVG_NAMESPACE, 'path');\n this.mask.setAttribute('fill-rule', 'evenodd'); \n this.mask.setAttribute('class', 'a9s-selection-mask');\n\n this.mask.setAttribute('d', `M0 0 h${this.w} v${this.h} h-${this.w} z M${this.polygon.getAttribute('points')} z`);\n }\n\n redraw = () => {\n this.mask.setAttribute('d', `M0 0 h${this.w} v${this.h} h-${this.w} z M${this.polygon.getAttribute('points')} z`);\n }\n\n get element() {\n return this.mask;\n }\n\n destroy = () =>\n this.mask.parentNode.removeChild(this.mask)\n\n}","import { Selection } from '@recogito/recogito-client-core';\nimport { toSVGTarget } from '../../selectors/EmbeddedSVG';\nimport { SVG_NAMESPACE } from '../../util/SVG';\nimport Mask from './PolygonMask';\n\nexport default class RubberbandPolygon {\n\n constructor(anchor, g, env) {\n this.points = [ anchor ];\n this.env = env;\n\n this.mousepos = anchor;\n\n this.group = document.createElementNS(SVG_NAMESPACE, 'g');\n \n this.polygon = document.createElementNS(SVG_NAMESPACE, 'g');\n this.polygon.setAttribute('class', 'a9s-selection');\n\n this.outer = document.createElementNS(SVG_NAMESPACE, 'polygon');\n this.outer.setAttribute('class', 'a9s-outer');\n\n this.inner = document.createElementNS(SVG_NAMESPACE, 'polygon');\n this.inner.setAttribute('class', 'a9s-inner');\n\n this.setPoints(this.points);\n\n this.mask = new Mask(env.image, this.inner);\n\n this.polygon.appendChild(this.outer);\n this.polygon.appendChild(this.inner);\n\n // Additionally, selection remains hidden until \n // the user actually moves the mouse\n this.group.style.display = 'none';\n\n this.group.appendChild(this.mask.element);\n this.group.appendChild(this.polygon);\n\n g.appendChild(this.group);\n }\n\n setPoints = points => {\n const attr = points.map(t => `${t[0]},${t[1]}`).join(' ');\n this.outer.setAttribute('points', attr);\n this.inner.setAttribute('points', attr);\n }\n\n getBoundingClientRect = () =>\n this.outer.getBoundingClientRect();\n\n dragTo = xy => {\n // Make visible\n this.group.style.display = null;\n\n this.mousepos = xy;\n\n const rubberband = [ ...this.points, xy ];\n \n this.setPoints(rubberband);\n this.mask.redraw();\n }\n\n addPoint = () => {\n // Don't add a new point if distance < 2 pixels\n const [x, y] = this.mousepos;\n const lastCorner = this.points[this.points.length - 1];\n const dist = Math.pow(x - lastCorner[0], 2) + Math.pow(y - lastCorner[1], 2);\n \n if (dist > 4) {\n this.points = [ ...this.points, this.mousepos];\n this.setPoints(this.points); \n this.mask.redraw();\n }\n }\n\n get element() {\n return this.polygon;\n }\n\n destroy = () => {\n this.group.parentNode.removeChild(this.group);\n this.polygon = null; \n this.group = null;\n }\n\n toSelection = () => {\n return new Selection(toSVGTarget(this.group, this.env.image));\n }\n\n}\n","import EditableShape from '../EditableShape';\nimport { drawEmbeddedSVG, svgFragmentToShape, toSVGTarget } from '../../selectors/EmbeddedSVG';\nimport { SVG_NAMESPACE } from '../../util/SVG';\nimport { format, setFormatterElSize } from '../../util/Formatting';\nimport Mask from './PolygonMask';\n\nconst getPoints = shape => {\n // Could just be Array.from(shape.querySelector('.inner').points) but...\n // IE11 :-(\n const pointList = shape.querySelector('.a9s-inner').points;\n const points = [];\n\n for (let i=0; i\n shape.querySelector('.a9s-inner').getBBox();\n\n/**\n * An editable polygon shape.\n */\nexport default class EditablePolygon extends EditableShape {\n\n constructor(annotation, g, config, env) {\n super(annotation, g, config, env);\n\n this.svg.addEventListener('mousemove', this.onMouseMove);\n this.svg.addEventListener('mouseup', this.onMouseUp);\n\n // SVG markup for this class looks like this:\n //\n // \n // \n // <-- return this node as .element\n // \n // \n // ... \n // ... \n // ... \n // ...\n // \n // \n\n // 'g' for the editable polygon compound shape\n this.containerGroup = document.createElementNS(SVG_NAMESPACE, 'g');\n\n this.shape = drawEmbeddedSVG(annotation);\n this.shape.querySelector('.a9s-inner')\n .addEventListener('mousedown', this.onGrab(this.shape));\n\n this.mask = new Mask(env.image, this.shape.querySelector('.a9s-inner'));\n\n this.containerGroup.appendChild(this.mask.element);\n\n this.elementGroup = document.createElementNS(SVG_NAMESPACE, 'g');\n this.elementGroup.setAttribute('class', 'a9s-annotation editable selected');\n this.elementGroup.setAttribute('data-id', annotation.id);\n this.elementGroup.appendChild(this.shape);\n\n this.handles = getPoints(this.shape).map(pt => {\n const handle = this.drawHandle(pt.x, pt.y);\n handle.addEventListener('mousedown', this.onGrab(handle));\n this.elementGroup.appendChild(handle);\n return handle;\n });\n\n this.containerGroup.appendChild(this.elementGroup);\n g.appendChild(this.containerGroup);\n\n format(this.shape, annotation, config.formatters);\n\n // The grabbed element (handle or entire shape), if any\n this.grabbedElem = null;\n\n // Mouse grab point\n this.grabbedAt = null;\n }\n\n onScaleChanged = () => \n this.handles.map(this.scaleHandle);\n\n setPoints = (points) => {\n // Not using .toFixed(1) because that will ALWAYS\n // return one decimal, e.g. \"15.0\" (when we want \"15\")\n const round = num =>\n Math.round(10 * num) / 10;\n\n const str = points.map(pt => `${round(pt.x)},${round(pt.y)}`).join(' ');\n\n const inner = this.shape.querySelector('.a9s-inner');\n inner.setAttribute('points', str);\n\n const outer = this.shape.querySelector('.a9s-outer');\n outer.setAttribute('points', str);\n\n this.mask.redraw();\n\n const { x, y, width, height } = outer.getBBox();\n setFormatterElSize(this.elementGroup, x, y, width, height);\n }\n\n onGrab = grabbedElem => evt => {\n if (evt.button !== 0) return; // left click\n this.grabbedElem = grabbedElem;\n this.grabbedAt = this.getSVGPoint(evt);\n }\n\n onMouseMove = evt => {\n const constrain = (coord, delta, max) =>\n coord + delta < 0 ? -coord : (coord + delta > max ? max - coord : delta);\n\n if (this.grabbedElem) {\n const pos = this.getSVGPoint(evt);\n\n if (this.grabbedElem === this.shape) {\n const { x, y, width, height } = getBBox(this.shape);\n\n const { naturalWidth, naturalHeight } = this.env.image;\n\n const dx = constrain(x, pos.x - this.grabbedAt.x, naturalWidth - width);\n const dy = constrain(y, pos.y - this.grabbedAt.y, naturalHeight - height);\n\n const updatedPoints = getPoints(this.shape).map(pt =>\n ({ x: pt.x + dx, y: pt.y + dy }));\n\n this.grabbedAt = pos;\n\n this.setPoints(updatedPoints);\n updatedPoints.forEach((pt, idx) => this.setHandleXY(this.handles[idx], pt.x, pt.y));\n\n this.emit('update', toSVGTarget(this.shape, this.env.image));\n } else {\n const handleIdx = this.handles.indexOf(this.grabbedElem);\n\n const updatedPoints = getPoints(this.shape).map((pt, idx) =>\n (idx === handleIdx) ? pos : pt);\n\n this.setPoints(updatedPoints);\n this.setHandleXY(this.handles[handleIdx], pos.x, pos.y);\n\n this.emit('update', toSVGTarget(this.shape, this.env.image));\n }\n }\n }\n\n onMouseUp = evt => {\n this.grabbedElem = null;\n this.grabbedAt = null;\n }\n\n get element() {\n return this.elementGroup;\n }\n\n updateState = annotation => {\n const points = svgFragmentToShape(annotation)\n .getAttribute('points')\n .split(' ') // Split x/y tuples\n .map(xy => { \n const [ x, y ] = xy.split(',').map(str => parseFloat(str.trim()));\n return { x, y };\n });\n \n this.setPoints(points);\n points.forEach((pt, idx) => this.setHandleXY(this.handles[idx], pt.x, pt.y));\n }\n\n destroy = () => {\n this.containerGroup.parentNode.removeChild(this.containerGroup);\n super.destroy();\n }\n\n}\n","import RubberbandPolygon from './RubberbandPolygon';\nimport EditablePolygon from './EditablePolygon';\nimport Tool from '../Tool';\n\n/**\n * A rubberband selector for polygon fragments.\n */\nexport default class RubberbandPolygonTool extends Tool {\n\n constructor(g, config, env) {\n super(g, config, env);\n\n this._isDrawing = false;\n this._startOnSingleClick = false;\n }\n\n startDrawing = (x, y, startOnSingleClick) => {\n this._isDrawing = true;\n this._startOnSingleClick = startOnSingleClick;\n\n this.attachListeners({\n mouseMove: this.onMouseMove,\n mouseUp: this.onMouseUp,\n dblClick: this.onDblClick\n });\n \n this.rubberband = new RubberbandPolygon([ x, y ], this.g, this.env);\n }\n\n stop = () => {\n this.detachListeners();\n \n this._isDrawing = false;\n\n if (this.rubberband) {\n this.rubberband.destroy();\n this.rubberband = null;\n }\n }\n\n onMouseMove = (x, y) =>\n this.rubberband.dragTo([ x, y ]);\n\n onMouseUp = () => {\n const { width, height } = this.rubberband.getBoundingClientRect();\n\n const minWidth = this.config.minSelectionWidth || 4;\n const minHeight = this.config.minSelectionHeight || 4;\n \n if (width >= minWidth || height >= minHeight) {\n this.rubberband.addPoint();\n } else if (!this._startOnSingleClick) {\n this.emit('cancel');\n this.stop();\n }\n }\n\n onDblClick = () => {\n this._isDrawing = false;\n\n const shape = this.rubberband.element;\n shape.annotation = this.rubberband.toSelection();\n this.emit('complete', shape);\n\n this.stop();\n }\n\n get isDrawing() {\n return this._isDrawing;\n }\n\n createEditableShape = (annotation, formatters) =>\n new EditablePolygon(annotation, this.g, {...this.config, formatters}, this.env);\n\n}\n\nRubberbandPolygonTool.identifier = 'polygon';\n\nRubberbandPolygonTool.supports = annotation => {\n const selector = annotation.selector('SvgSelector');\n if (selector)\n return selector.value?.match(/^\n this._registered.map(impl => impl.identifier);\n\n registerTool = impl => {\n // If there's a tool with the same ID, replace\n const id = impl.identifier;\n if (this.listTools().includes(id))\n this.unregisterTool(id);\n\n this._registered.unshift(impl);\n }\n\n unregisterTool = id =>\n this._registered = this._registered.filter(impl => impl.identifier !== id);\n\n /** \n * Sets a drawing tool by providing an implementation, or the ID\n * of a built-in toll.\n */\n setCurrent = toolOrId => {\n if (this._current)\n this._current.destroy();\n \n const Tool = (typeof toolOrId === 'string' || toolOrId instanceof String) ?\n this._registered.find(impl => impl.identifier === toolOrId) :\n toolOrId;\n\n this._current = new Tool(this._g, this._config, this._env);\n this._current.on('startSelection', pt => this.emit('startSelection', pt));\n this._current.on('complete', evt => this.emit('complete', evt));\n this._current.on('cancel', evt => this.emit('cancel', evt));\n }\n\n forAnnotation = annotation => {\n // First target\n const [ target, ..._ ] = annotation.targets;\n const renderedVia = target.renderedVia?.name;\n\n const Tool = renderedVia ?\n this._registered.find(impl => impl.identifier === renderedVia) :\n this._registered.find(impl => impl.supports(annotation));\n\n return Tool ? new Tool(this._g, this._config, this._env) : null;\n }\n\n get current() {\n return this._current;\n }\n \n}","import { drawRect, rectArea } from './RectFragment';\nimport { drawEmbeddedSVG, svgArea } from './EmbeddedSVG';\n\n// Drawing functions per selector type\nconst drawFn = {\n 'FragmentSelector': drawRect,\n 'SvgSelector': drawEmbeddedSVG\n};\n\n// Area computation functions per selector type\nconst areaFn = {\n 'FragmentSelector': rectArea,\n 'SvgSelector': svgArea\n}\n\n// Helper to get the first selector from an annotation\nconst getFirstSelector = annotation => {\n const firstTarget = annotation.targets[0];\n if (firstTarget)\n return Array.isArray(firstTarget.selector) ? firstTarget.selector[0] : firstTarget.selector;\n}\n\n/** \n * Evaluates the annotation target and picks the right drawing functions. \n * \n * We currently support the following selectors\n * - MediaFragment\n * - SVG (with embedded SVG shape)\n */\nexport const drawShape = (annotation, image) =>\n drawFn[getFirstSelector(annotation).type](annotation, image);\n\nexport const shapeArea = (annotation, image) =>\n areaFn[getFirstSelector(annotation).type](annotation, image);\n\nexport { parseRectFragment } from './RectFragment';\n\nexport * from './EmbeddedSVG';\nexport * from './RectFragment';\n\n\n","import { SVG_NAMESPACE } from '@recogito/annotorious/src/util/SVG';\n\nexport default class Crosshair {\n\n constructor(svgEl) {\n const container = document.createElementNS(SVG_NAMESPACE, 'svg');\n container.setAttribute('class', 'a9s-osd-crosshair-container');\n\n const g = document.createElementNS(SVG_NAMESPACE, 'g');\n g.setAttribute('class', 'a9s-crosshair');\n \n container.appendChild(g);\n\n const h = document.createElementNS(SVG_NAMESPACE, 'line');\n const v = document.createElementNS(SVG_NAMESPACE, 'line');\n\n g.appendChild(h);\n g.appendChild(v);\n\n svgEl.parentElement.appendChild(container);\n\n const onMove = evt => {\n const { offsetX, offsetY } = evt;\n\n const width = svgEl.parentElement.offsetWidth;\n const height = svgEl.parentElement.offsetHeight;\n\n h.setAttribute('x1', 0);\n h.setAttribute('y1', offsetY);\n h.setAttribute('x2', width);\n h.setAttribute('y2', offsetY);\n\n v.setAttribute('x1', offsetX);\n v.setAttribute('y1', 0);\n v.setAttribute('x2', offsetX);\n v.setAttribute('y2', height);\n };\n\n svgEl.addEventListener('pointermove', onMove);\n svgEl.parentElement.addEventListener('pointermove', onMove);\n }\n\n}","\nexport default function quickselect(arr, k, left, right, compare) {\n quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);\n}\n\nfunction quickselectStep(arr, k, left, right, compare) {\n\n while (right > left) {\n if (right - left > 600) {\n var n = right - left + 1;\n var m = k - left + 1;\n var z = Math.log(n);\n var s = 0.5 * Math.exp(2 * z / 3);\n var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);\n var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));\n var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));\n quickselectStep(arr, k, newLeft, newRight, compare);\n }\n\n var t = arr[k];\n var i = left;\n var j = right;\n\n swap(arr, left, k);\n if (compare(arr[right], t) > 0) swap(arr, left, right);\n\n while (i < j) {\n swap(arr, i, j);\n i++;\n j--;\n while (compare(arr[i], t) < 0) i++;\n while (compare(arr[j], t) > 0) j--;\n }\n\n if (compare(arr[left], t) === 0) swap(arr, left, j);\n else {\n j++;\n swap(arr, j, right);\n }\n\n if (j <= k) left = j + 1;\n if (k <= j) right = j - 1;\n }\n}\n\nfunction swap(arr, i, j) {\n var tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\n\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","import quickselect from 'quickselect';\n\nexport default class RBush {\n constructor(maxEntries = 9) {\n // max entries in a node is 9 by default; min node fill is 40% for best performance\n this._maxEntries = Math.max(4, maxEntries);\n this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));\n this.clear();\n }\n\n all() {\n return this._all(this.data, []);\n }\n\n search(bbox) {\n let node = this.data;\n const result = [];\n\n if (!intersects(bbox, node)) return result;\n\n const toBBox = this.toBBox;\n const nodesToSearch = [];\n\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf) result.push(child);\n else if (contains(bbox, childBBox)) this._all(child, result);\n else nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return result;\n }\n\n collides(bbox) {\n let node = this.data;\n\n if (!intersects(bbox, node)) return false;\n\n const nodesToSearch = [];\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? this.toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf || contains(bbox, childBBox)) return true;\n nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return false;\n }\n\n load(data) {\n if (!(data && data.length)) return this;\n\n if (data.length < this._minEntries) {\n for (let i = 0; i < data.length; i++) {\n this.insert(data[i]);\n }\n return this;\n }\n\n // recursively build the tree with the given data from scratch using OMT algorithm\n let node = this._build(data.slice(), 0, data.length - 1, 0);\n\n if (!this.data.children.length) {\n // save as is if tree is empty\n this.data = node;\n\n } else if (this.data.height === node.height) {\n // split root if trees have the same height\n this._splitRoot(this.data, node);\n\n } else {\n if (this.data.height < node.height) {\n // swap trees if inserted one is bigger\n const tmpNode = this.data;\n this.data = node;\n node = tmpNode;\n }\n\n // insert the small tree into the large tree at appropriate level\n this._insert(node, this.data.height - node.height - 1, true);\n }\n\n return this;\n }\n\n insert(item) {\n if (item) this._insert(item, this.data.height - 1);\n return this;\n }\n\n clear() {\n this.data = createNode([]);\n return this;\n }\n\n remove(item, equalsFn) {\n if (!item) return this;\n\n let node = this.data;\n const bbox = this.toBBox(item);\n const path = [];\n const indexes = [];\n let i, parent, goingUp;\n\n // depth-first iterative tree traversal\n while (node || path.length) {\n\n if (!node) { // go up\n node = path.pop();\n parent = path[path.length - 1];\n i = indexes.pop();\n goingUp = true;\n }\n\n if (node.leaf) { // check current node\n const index = findItem(item, node.children, equalsFn);\n\n if (index !== -1) {\n // item found, remove the item and condense tree upwards\n node.children.splice(index, 1);\n path.push(node);\n this._condense(path);\n return this;\n }\n }\n\n if (!goingUp && !node.leaf && contains(node, bbox)) { // go down\n path.push(node);\n indexes.push(i);\n i = 0;\n parent = node;\n node = node.children[0];\n\n } else if (parent) { // go right\n i++;\n node = parent.children[i];\n goingUp = false;\n\n } else node = null; // nothing found\n }\n\n return this;\n }\n\n toBBox(item) { return item; }\n\n compareMinX(a, b) { return a.minX - b.minX; }\n compareMinY(a, b) { return a.minY - b.minY; }\n\n toJSON() { return this.data; }\n\n fromJSON(data) {\n this.data = data;\n return this;\n }\n\n _all(node, result) {\n const nodesToSearch = [];\n while (node) {\n if (node.leaf) result.push(...node.children);\n else nodesToSearch.push(...node.children);\n\n node = nodesToSearch.pop();\n }\n return result;\n }\n\n _build(items, left, right, height) {\n\n const N = right - left + 1;\n let M = this._maxEntries;\n let node;\n\n if (N <= M) {\n // reached leaf level; return leaf\n node = createNode(items.slice(left, right + 1));\n calcBBox(node, this.toBBox);\n return node;\n }\n\n if (!height) {\n // target height of the bulk-loaded tree\n height = Math.ceil(Math.log(N) / Math.log(M));\n\n // target number of root entries to maximize storage utilization\n M = Math.ceil(N / Math.pow(M, height - 1));\n }\n\n node = createNode([]);\n node.leaf = false;\n node.height = height;\n\n // split the items into M mostly square tiles\n\n const N2 = Math.ceil(N / M);\n const N1 = N2 * Math.ceil(Math.sqrt(M));\n\n multiSelect(items, left, right, N1, this.compareMinX);\n\n for (let i = left; i <= right; i += N1) {\n\n const right2 = Math.min(i + N1 - 1, right);\n\n multiSelect(items, i, right2, N2, this.compareMinY);\n\n for (let j = i; j <= right2; j += N2) {\n\n const right3 = Math.min(j + N2 - 1, right2);\n\n // pack each entry recursively\n node.children.push(this._build(items, j, right3, height - 1));\n }\n }\n\n calcBBox(node, this.toBBox);\n\n return node;\n }\n\n _chooseSubtree(bbox, node, level, path) {\n while (true) {\n path.push(node);\n\n if (node.leaf || path.length - 1 === level) break;\n\n let minArea = Infinity;\n let minEnlargement = Infinity;\n let targetNode;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const area = bboxArea(child);\n const enlargement = enlargedArea(bbox, child) - area;\n\n // choose entry with the least area enlargement\n if (enlargement < minEnlargement) {\n minEnlargement = enlargement;\n minArea = area < minArea ? area : minArea;\n targetNode = child;\n\n } else if (enlargement === minEnlargement) {\n // otherwise choose one with the smallest area\n if (area < minArea) {\n minArea = area;\n targetNode = child;\n }\n }\n }\n\n node = targetNode || node.children[0];\n }\n\n return node;\n }\n\n _insert(item, level, isNode) {\n const bbox = isNode ? item : this.toBBox(item);\n const insertPath = [];\n\n // find the best node for accommodating the item, saving all nodes along the path too\n const node = this._chooseSubtree(bbox, this.data, level, insertPath);\n\n // put the item into the node\n node.children.push(item);\n extend(node, bbox);\n\n // split on node overflow; propagate upwards if necessary\n while (level >= 0) {\n if (insertPath[level].children.length > this._maxEntries) {\n this._split(insertPath, level);\n level--;\n } else break;\n }\n\n // adjust bboxes along the insertion path\n this._adjustParentBBoxes(bbox, insertPath, level);\n }\n\n // split overflowed node into two\n _split(insertPath, level) {\n const node = insertPath[level];\n const M = node.children.length;\n const m = this._minEntries;\n\n this._chooseSplitAxis(node, m, M);\n\n const splitIndex = this._chooseSplitIndex(node, m, M);\n\n const newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));\n newNode.height = node.height;\n newNode.leaf = node.leaf;\n\n calcBBox(node, this.toBBox);\n calcBBox(newNode, this.toBBox);\n\n if (level) insertPath[level - 1].children.push(newNode);\n else this._splitRoot(node, newNode);\n }\n\n _splitRoot(node, newNode) {\n // split root node\n this.data = createNode([node, newNode]);\n this.data.height = node.height + 1;\n this.data.leaf = false;\n calcBBox(this.data, this.toBBox);\n }\n\n _chooseSplitIndex(node, m, M) {\n let index;\n let minOverlap = Infinity;\n let minArea = Infinity;\n\n for (let i = m; i <= M - m; i++) {\n const bbox1 = distBBox(node, 0, i, this.toBBox);\n const bbox2 = distBBox(node, i, M, this.toBBox);\n\n const overlap = intersectionArea(bbox1, bbox2);\n const area = bboxArea(bbox1) + bboxArea(bbox2);\n\n // choose distribution with minimum overlap\n if (overlap < minOverlap) {\n minOverlap = overlap;\n index = i;\n\n minArea = area < minArea ? area : minArea;\n\n } else if (overlap === minOverlap) {\n // otherwise choose distribution with minimum area\n if (area < minArea) {\n minArea = area;\n index = i;\n }\n }\n }\n\n return index || M - m;\n }\n\n // sorts node children by the best axis for split\n _chooseSplitAxis(node, m, M) {\n const compareMinX = node.leaf ? this.compareMinX : compareNodeMinX;\n const compareMinY = node.leaf ? this.compareMinY : compareNodeMinY;\n const xMargin = this._allDistMargin(node, m, M, compareMinX);\n const yMargin = this._allDistMargin(node, m, M, compareMinY);\n\n // if total distributions margin value is minimal for x, sort by minX,\n // otherwise it's already sorted by minY\n if (xMargin < yMargin) node.children.sort(compareMinX);\n }\n\n // total margin of all possible split distributions where each node is at least m full\n _allDistMargin(node, m, M, compare) {\n node.children.sort(compare);\n\n const toBBox = this.toBBox;\n const leftBBox = distBBox(node, 0, m, toBBox);\n const rightBBox = distBBox(node, M - m, M, toBBox);\n let margin = bboxMargin(leftBBox) + bboxMargin(rightBBox);\n\n for (let i = m; i < M - m; i++) {\n const child = node.children[i];\n extend(leftBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(leftBBox);\n }\n\n for (let i = M - m - 1; i >= m; i--) {\n const child = node.children[i];\n extend(rightBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(rightBBox);\n }\n\n return margin;\n }\n\n _adjustParentBBoxes(bbox, path, level) {\n // adjust bboxes along the given tree path\n for (let i = level; i >= 0; i--) {\n extend(path[i], bbox);\n }\n }\n\n _condense(path) {\n // go through the path, removing empty nodes and updating bboxes\n for (let i = path.length - 1, siblings; i >= 0; i--) {\n if (path[i].children.length === 0) {\n if (i > 0) {\n siblings = path[i - 1].children;\n siblings.splice(siblings.indexOf(path[i]), 1);\n\n } else this.clear();\n\n } else calcBBox(path[i], this.toBBox);\n }\n }\n}\n\nfunction findItem(item, items, equalsFn) {\n if (!equalsFn) return items.indexOf(item);\n\n for (let i = 0; i < items.length; i++) {\n if (equalsFn(item, items[i])) return i;\n }\n return -1;\n}\n\n// calculate node's bbox from bboxes of its children\nfunction calcBBox(node, toBBox) {\n distBBox(node, 0, node.children.length, toBBox, node);\n}\n\n// min bounding rectangle of node children from k to p-1\nfunction distBBox(node, k, p, toBBox, destNode) {\n if (!destNode) destNode = createNode(null);\n destNode.minX = Infinity;\n destNode.minY = Infinity;\n destNode.maxX = -Infinity;\n destNode.maxY = -Infinity;\n\n for (let i = k; i < p; i++) {\n const child = node.children[i];\n extend(destNode, node.leaf ? toBBox(child) : child);\n }\n\n return destNode;\n}\n\nfunction extend(a, b) {\n a.minX = Math.min(a.minX, b.minX);\n a.minY = Math.min(a.minY, b.minY);\n a.maxX = Math.max(a.maxX, b.maxX);\n a.maxY = Math.max(a.maxY, b.maxY);\n return a;\n}\n\nfunction compareNodeMinX(a, b) { return a.minX - b.minX; }\nfunction compareNodeMinY(a, b) { return a.minY - b.minY; }\n\nfunction bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }\nfunction bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }\n\nfunction enlargedArea(a, b) {\n return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *\n (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));\n}\n\nfunction intersectionArea(a, b) {\n const minX = Math.max(a.minX, b.minX);\n const minY = Math.max(a.minY, b.minY);\n const maxX = Math.min(a.maxX, b.maxX);\n const maxY = Math.min(a.maxY, b.maxY);\n\n return Math.max(0, maxX - minX) *\n Math.max(0, maxY - minY);\n}\n\nfunction contains(a, b) {\n return a.minX <= b.minX &&\n a.minY <= b.minY &&\n b.maxX <= a.maxX &&\n b.maxY <= a.maxY;\n}\n\nfunction intersects(a, b) {\n return b.minX <= a.maxX &&\n b.minY <= a.maxY &&\n b.maxX >= a.minX &&\n b.maxY >= a.minY;\n}\n\nfunction createNode(children) {\n return {\n children,\n height: 1,\n leaf: true,\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity\n };\n}\n\n// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;\n// combines selection algorithm with binary divide & conquer approach\n\nfunction multiSelect(arr, left, right, n, compare) {\n const stack = [left, right];\n\n while (stack.length) {\n right = stack.pop();\n left = stack.pop();\n\n if (right - left <= n) continue;\n\n const mid = left + Math.ceil((right - left) / n / 2) * n;\n quickselect(arr, mid, left, right, compare);\n\n stack.push(left, mid, mid, right);\n }\n}\n","import RBush from 'rbush';\nimport { SVG_NAMESPACE } from '@recogito/annotorious/src/util/SVG';\nimport { drawShape, shapeArea, svgFragmentToShape, parseRectFragment } from '@recogito/annotorious/src/selectors';\nimport { WebAnnotation } from '@recogito/recogito-client-core';\nimport { \n pointInCircle,\n pointInEllipse,\n pointInPolygon,\n svgPathToPolygons,\n pointInLine\n} from '@recogito/annotorious/src/util/Geom2D';\n\n/** \n * Computes the bounding box of an annotation. WARNING:\n * this is an expensive operation which parses the annotation,\n * creates a temporary SVG element and attaches it to the DOM,\n * uses .getBBox() and then removes the temporary SVG element. \n */\n const getBounds = (annotation, image) => { \n const isBox = annotation.targets[0].selector.type === 'FragmentSelector';\n\n if (isBox) {\n const {x,y,w,h} = parseRectFragment(annotation, image);\n\n return {\n minX: x, \n minY: y,\n maxX: x + w,\n maxY: y + h\n }; \n } else {\n const shape = drawShape(annotation, image);\n \n // A temporary SVG buffer, so we can use .getBBox()\n const svg = document.createElementNS(SVG_NAMESPACE, 'svg');\n svg.style.position = 'absolute';\n svg.style.opacity = 0;\n svg.style.top = 0;\n svg.style.left = 0;\n \n svg.appendChild(shape);\n document.body.appendChild(svg);\n \n const { x, y, width, height } = shape.getBBox(); \n \n document.body.removeChild(svg);\n \n return {\n minX: x, \n minY: y,\n maxX: x + width,\n maxY: y + height\n }; \n }\n}\n\nconst getSelectorType = annotation => {\n const firstTarget = annotation.targets[0];\n\n return Array.isArray(firstTarget.selector) ? \n firstTarget.selector[0].type : firstTarget.selector?.type;\n}\n\n/**\n * Checks if a point is inside the annotation shape. \n * WARNING: this is only for internal use ONLY. It pre-assumes\n * an annotation with an SVGSelector (not a FragmentSelector)!\n * @param {number} x point x coordinate \n * @param {number} y point y coordinate \n * @param {WebAnnotation} annotation annotation (with an SVG Selector!) \n */\nconst pointInSVGShape = (x, y, annotation, buffer) => {\n const svg = svgFragmentToShape(annotation);\n const nodeName = svg.nodeName.toLowerCase();\n\n const pt = [x, y];\n\n if (nodeName === 'polygon') {\n const points = Array.from(svg.points).map(pt => [pt.x, pt.y]);\n \n return pointInPolygon(pt, points);\n } else if (nodeName === 'circle') {\n const cx = svg.getAttribute('cx');\n const cy = svg.getAttribute('cy');\n const r = svg.getAttribute('r');\n\n return pointInCircle(pt, cx, cy, r);\n } else if (nodeName === 'ellipse') {\n const cx = svg.getAttribute('cx');\n const cy = svg.getAttribute('cy');\n const rx = svg.getAttribute('rx');\n const ry = svg.getAttribute('ry');\n\n return pointInEllipse(pt, cx, cy, rx, ry);\n } else if (nodeName === 'path') {\n const polygons = svgPathToPolygons(svg);\n return polygons.find(polygon => pointInPolygon(pt, polygon));\n } else if (nodeName === 'line') {\n const x1 = parseInt(svg.getAttribute('x1'));\n const y1 = parseInt(svg.getAttribute('y1'));\n const x2 = parseInt(svg.getAttribute('x2'));\n const y2 = parseInt(svg.getAttribute('y2'));\n return pointInLine(pt, x1, y1, x2, y2, buffer);\n } else {\n throw `Unsupported SVG shape type: ${nodeName}`;\n }\n}\n\nexport default class AnnotationStore {\n\n constructor(env) {\n this.env = env;\n\n // Hacky... the store exposes itself to the environment, so that tools \n // have access to it\n env.store = this;\n \n this.spatial_index = new RBush();\n }\n\n clear = () =>\n this.spatial_index.clear();\n\n getAnnotationAt = (x, y, scale) => {\n // 5 pixel buffer, so we reliably catch point \n // annotations (optionally with scale applied)\n const buffer = scale ? 5 / scale : 5;\n\n // Fast hit test in index (bounds only!)\n const idxHits = this.spatial_index.search({\n minX: x - buffer,\n minY: y - buffer,\n maxX: x + buffer,\n maxY: y + buffer\n }).map(item => item.annotation);\n\n // Exact hit test on shape (needed for SVG fragments only!)\n const exactHits = idxHits.filter(annotation => {\n const selectorType = getSelectorType(annotation);\n if (selectorType === 'FragmentSelector') {\n return true; // For FragmentSelectors, shape is always equal to bounds! \n } else if (selectorType === 'SvgSelector') {\n return pointInSVGShape(x, y, annotation, buffer);\n } else {\n throw `Unsupported selector type: ${selectorType}`;\n }\n });\n\n // Get smallest annotation\n if (exactHits.length > 0) {\n exactHits.sort((a, b) => shapeArea(a, this.env.image) - shapeArea(b, this.env.image));\n return exactHits[0];\n }\n }\n\n getAnnotationsIntersecting = annotationOrBounds => {\n const isBounds = annotationOrBounds.minX; // Bit of a naive test...\n\n const bounds = isBounds ? annotationOrBounds : getBounds(annotationOrBounds, this.env.image);\n const intersecting = this.spatial_index.search(bounds).map(item => item.annotation);\n\n return isBounds ? intersecting :\n intersecting.filter(a => !a.isEqual(annotationOrBounds));\n }\n\n insert = arg => {\n const annotations = Array.isArray(arg) ? arg : [ arg ];\n annotations.forEach(annotation => {\n this.spatial_index.insert({\n ...getBounds(annotation, this.env.image), annotation\n })\n });\n }\n\n getBounds = annotation => {\n return this.getBounds(annotation, this.env.image);\n }\n\n remove = annotation => {\n // Unfortunately, .remove currently requires bounds,\n // therefore we need to re-compute. See:\n // https://github.com/mourner/rbush/issues/95\n const item = {\n ...getBounds(annotation, this.env.image),\n annotation\n };\n\n this.spatial_index.remove(item, (a, b) =>\n a.annotation.id === b.annotation.id);\n }\n\n}","import { hasClass } from '@recogito/annotorious/src/util/SVG';\n\nexport const getSnippet = (viewer, element) => {\n // Annotation shape could be the element itself or a \n // child (in case of editable shapes, the element would be \n // the group with shape + handles)\n const shape = hasClass(element, '.a9s-annotation') ? \n element : element.closest('.a9s-annotation');\n\n const outer = shape.querySelector('.a9s-outer');\n const outerBounds = outer.getBoundingClientRect();\n\n // Scale factor for OSD canvas element (physical vs. logical resolution)\n const { canvas } = viewer.drawer;\n const canvasBounds = canvas.getBoundingClientRect();\n const kx = canvas.width / canvasBounds.width;\n const ky = canvas.height / canvasBounds.height;\n\n const x = outerBounds.x - canvasBounds.x;\n const y = outerBounds.y - canvasBounds.y;\n const { width, height } = outerBounds;\n\n // Cut out the image snippet as in-memory canvas element\n const snippet = document.createElement('CANVAS');\n const ctx = snippet.getContext('2d');\n snippet.width = width;\n snippet.height = height;\n ctx.drawImage(canvas, x * kx, y * ky, width * kx, height * ky, 0, 0, width, height);\n\n // Compute reverse transform\n const topLeft = viewer.viewport.viewerElementToImageCoordinates(new OpenSeadragon.Point(x, y));\n const imageZoom = viewer.viewport.viewportToImageZoom(viewer.viewport.getZoom()); \n\n return { \n snippet, \n transform: xy => {\n const px = topLeft.x + (xy[0] / kx) / imageZoom;\n const py = topLeft.y + (xy[1] / ky) / imageZoom;\n return [ px, py ];\n }\n };\n}","import EventEmitter from 'tiny-emitter';\nimport OpenSeadragon from 'openseadragon';\nimport { SVG_NAMESPACE, addClass, hasClass, removeClass } from '@recogito/annotorious/src/util/SVG';\nimport DrawingTools from '@recogito/annotorious/src/tools/ToolsRegistry';\nimport { drawShape } from '@recogito/annotorious/src/selectors';\nimport { format } from '@recogito/annotorious/src/util/Formatting';\nimport { isTouchDevice, enableTouchTranslation } from '@recogito/annotorious/src/util/Touch';\nimport Crosshair from './OSDCrosshair';\nimport AnnotationStore from './AnnotationStore';\nimport { getSnippet } from './util/ImageSnippet';\n\nconst isTouch = isTouchDevice();\n\n/**\n * Code shared between (normal) OSDAnnotationLayer and\n * GigapixelAnnotationLayer\n */\nexport class AnnotationLayer extends EventEmitter {\n\n constructor(props) {\n super();\n\n this.viewer = props.viewer;\n\n this.config = props.config;\n this.env = props.env;\n\n this.readOnly = props.config.readOnly;\n this.headless = props.config.headless;\n\n // Deprecate the old 'formatter' option \n if (props.config.formatter)\n this.formatters = [ props.config.formatter ];\n else if (props.config.formatters)\n this.formatters = Array.isArray(props.config.formatters) ? \n props.config.formatters : [ props.config.formatters ];\n\n this.disableSelect = props.config.disableSelect;\n this.drawOnSingleClick = props.config.drawOnSingleClick;\n\n this.svg = document.createElementNS(SVG_NAMESPACE, 'svg');\n\n if (isTouch) {\n this.svg.setAttribute('class', 'a9s-annotationlayer a9s-osd-annotationlayer touch');\n enableTouchTranslation(this.svg);\n } else {\n this.svg.setAttribute('class', 'a9s-annotationlayer a9s-osd-annotationlayer');\n } \n\n this.g = document.createElementNS(SVG_NAMESPACE, 'g');\n\n this.svg.appendChild(this.g);\n \n this.viewer.canvas.appendChild(this.svg);\n\n this.viewer.addHandler('animation', () => this.resize());\n this.viewer.addHandler('rotate', () => this.resize());\n this.viewer.addHandler('resize', () => this.resize());\n this.viewer.addHandler('flip', () => this.resize());\n\n this.loaded = false;\n\n const onLoad = () => {\n const { x, y } = this.viewer.world.getItemAt(0).source.dimensions;\n\n const src = this.viewer.world.getItemAt(0).source['@id'] || \n new URL(this.viewer.world.getItemAt(0).source.url, document.baseURI).href;\n\n this.env.image = {\n src, \n naturalWidth: x,\n naturalHeight: y\n };\n\n if (props.config.crosshair) {\n if (!this.crosshair) {\n this.crosshair = new Crosshair(this.svg);\n addClass(this.svg, 'no-cursor');\n }\n }\n\n if (!this.loaded)\n this.emit('load', src);\n\n this.loaded = true;\n\n this.g.style.display = 'inline';\n\n this.resize(); \n }\n\n // Store image properties on open (incl. after page change) and on addTiledImage\n this.viewer.addHandler('open', onLoad);\n this.viewer.world.addHandler('add-item', onLoad);\n\n // Or: if Annotorious gets initialized on a loaded image\n if (this.viewer.world.getItemAt(0))\n onLoad();\n\n this.store = new AnnotationStore(this.env);\n\n this.selectedShape = null;\n\n this.hoveredShape = null;\n\n this._initMouseEvents();\n }\n\n _getShapeAt = evt => {\n const getSVGPoint = evt => {\n const pt = this.svg.createSVGPoint();\n \n if (window.TouchEvent && (evt instanceof TouchEvent)) {\n const bbox = this.svg.getBoundingClientRect();\n\n const e = evt.touches[0];\n const x = e.clientX - bbox.x;\n const y = e.clientY - bbox.y;\n \n const { left, top } = this.svg.getBoundingClientRect();\n pt.x = x + left;\n pt.y = y + top;\n \n return pt.matrixTransform(this.g.getScreenCTM().inverse());\n } else {\n pt.x = evt.offsetX;\n pt.y = evt.offsetY;\n \n return pt.matrixTransform(this.g.getCTM().inverse());\n }\n }\n\n const { x, y } = getSVGPoint(evt);\n\n const annotation = this.store.getAnnotationAt(x, y, this.currentScale());\n if (annotation)\n return this.findShape(annotation);\n }\n\n /** Initializes the OSD MouseTracker used for drawing **/\n _initDrawingTools = gigapixelMode => {\n let started = false;\n \n let firstDragDone = false;\n\n let dragging = false;\n\n this.tools = new DrawingTools(this.g, this.config, this.env);\n\n this.tools.on('complete', shape => {\n firstDragDone = false;\n this.onDrawingComplete(shape);\n });\n\n this.mouseTracker = new OpenSeadragon.MouseTracker({\n element: this.svg,\n\n preProcessEventHandler: info => {\n if (!this.mouseTracker.enabled) {\n info.preventDefault = false;\n info.preventGesture = true;\n }\n\n if (this.selectedShape && info.eventType === 'wheel') {\n info.preventDefault = false;\n this.viewer.canvas.dispatchEvent(new info.originalEvent.constructor(info.eventType, info.originalEvent));\n }\n },\n\n pressHandler: evt => {\n if (!this.tools.current.isDrawing) {\n this.tools.current.start(evt.originalEvent, this.drawOnSingleClick && !this.hoveredShape);\n if (!gigapixelMode)\n this.scaleTool(this.tools.current);\n }\n },\n\n moveHandler: evt => {\n if (this.tools.current.isDrawing) {\n const { x , y } = this.tools.current.getSVGPoint(evt.originalEvent);\n \n if (!evt.buttons || !firstDragDone) {\n evt.originalEvent.stopPropagation();\n\n this.tools.current.onMouseMove(x, y, evt.originalEvent);\n\n if (!started) {\n this.emit('startSelection', { x , y });\n started = true;\n }\n } else {\n if (!dragging && this.tools.current.onDragStart)\n this.tools.current.onDragStart(x, y, evt.originalEvent);\n\n dragging = true;\n }\n }\n },\n\n releaseHandler: evt => {\n if (this.tools.current.isDrawing) {\n firstDragDone = true;\n // continue in dragging mode if moveHandler has not been fired\n // if (!started) return;\n const { x , y } = this.tools.current.getSVGPoint(evt.originalEvent);\n if (started) this.emit('endSelection', { x , y });\n this.tools.current.onMouseUp(x, y, evt.originalEvent);\n\n if (dragging && this.tools.current.onDragEnd)\n this.tools.current.onDragEnd();\n }\n\n started = false;\n\n dragging = false;\n }\n });\n\n // Draw mode hotkey\n const hotkey = this.config.hotkey ?\n (this.config.hotkey.key ? this.config.hotkey.key.toLowerCase() : this.config.hotkey.toLowerCase()) :\n 'shift';\n\n // Inverted mode\n const inverted = this.config.hotkey?.inverted;\n \n this.mouseTracker.enabled = inverted;\n\n // Keep tracker disabled until Shift is held\n if (this.onKeyDown)\n document.removeEventListener('keydown', this.onKeyDown);\n \n if (this.onKeyUp)\n document.removeEventListener('keydown', this.onKeyDown);\n\n this.onKeyDown = evt => {\n if (evt.key.toLowerCase() === hotkey && !this.selectedShape) {\n const enabled = !this.readOnly && !inverted;\n this.mouseTracker.enabled = enabled;\n this.tools.current.enabled = enabled;\n }\n };\n\n this.onKeyUp = evt => {\n if (evt.key.toLowerCase() === hotkey && !this.tools.current.isDrawing) {\n this.mouseTracker.enabled = inverted;\n this.tools.current.enabled = inverted;\n }\n };\n \n document.addEventListener('keydown', this.onKeyDown);\n document.addEventListener('keyup', this.onKeyUp);\n }\n\n _initMouseEvents = () => {\n // We use mouse-move to track which annotation is currently hovered on.\n // Keep in mind that annotations are NOT automatically stacked from large\n // to small. Therefore, smaller ones might be obscured underneath larger\n // ones. That's the reason we can't use native mouseEnter/mouseLeave events\n // on the SVG shapes! \n this.svg.addEventListener('mousemove', evt => {\n // Don't track mouseEnter/mouseLeave while drawing\n if (!this.tools?.current.isDrawing) {\n // Don't do anything if the move happens over the current selection\n const isMoveSelection = evt.target.closest('.a9s-annotation.editable.selected');\n\n if (!isMoveSelection) {\n const shape = this._getShapeAt(evt);\n\n // Hovered annotation changed\n if (shape?.annotation !== this.hoveredShape?.annotation) {\n if (this.hoveredShape) {\n const element = this.hoveredShape.element || this.hoveredShape;\n removeClass(element, 'hover');\n \n this.emit('mouseLeaveAnnotation', this.hoveredShape.annotation, this.hoveredShape);\n }\n\n if (shape) {\n addClass(shape, 'hover');\n this.emit('mouseEnterAnnotation', shape.annotation, shape);\n }\n }\n\n this.hoveredShape = shape;\n }\n }\n });\n\n this.svg.parentElement.addEventListener('mouseleave', () => {\n if (this.hoveredShape) {\n removeClass(this.hoveredShape, 'hover');\n this.emit('mouseLeaveAnnotation', this.hoveredShape.annotation, this.hoveredShape);\n this.hoveredShape = null;\n }\n });\n\n // Unfortunately, drag ALSO creates a click \n // event - ignore in this case.\n let lastMouseDown = null;\n\n this.viewer.addHandler('canvas-press', () =>\n lastMouseDown = new Date().getTime());\n\n this.viewer.addHandler('canvas-click', evt => {\n const { originalEvent } = evt;\n\n // Click & no drawing in progress\n if (!(this.tools.current?.isDrawing || this.disableSelect)) {\n // Ignore \"false click\" after drag!\n const timeSinceMouseDown = new Date().getTime() - lastMouseDown;\n \n // Real click (no drag)\n if (timeSinceMouseDown < 250) { \n // Click happened on the current selection?\n const isSelection = originalEvent.target.closest('.a9s-annotation.editable.selected');\n const hoveredShape = isSelection ? this.selectedShape : this._getShapeAt(originalEvent);\n\n // Ignore clicks on selection\n if (hoveredShape) {\n evt.preventDefaultAction = true; // No zoom on click\n this.selectShape(hoveredShape);\n } else if (!hoveredShape) {\n this.deselect();\n this.emit('select', {});\n }\n } \n }\n\n if (this.disableSelect && this.hoveredShape)\n this.emit('clickAnnotation', this.hoveredShape.annotation, this.hoveredShape);\n });\n\n }\n\n /**\n * Helper - executes immediately if the tilesource is loaded,\n * or defers to after load if not\n */\n _lazy = fn => {\n if (this.viewer.world.getItemAt(0)) {\n fn();\n } else {\n const onLoad = () => {\n fn();\n this.viewer.removeHandler('open', onLoad);\n this.viewer.world.removeHandler('add-item', onLoad);\n };\n\n this.viewer.addHandler('open', onLoad);\n this.viewer.world.addHandler('add-item', onLoad);\n }\n }\n\n _refreshNonScalingAnnotations = () => {\n const scale = this.currentScale();\n Array.from(this.svg.querySelectorAll('.a9s-non-scaling')).forEach(shape =>\n // This could check if the shape is actually inside the viewport.\n // However, the lookup might be just as costly as setting the attribute.\n // Alternatively, a future implementation of the annotation store which caches \n // the bounds might be able to provide this info without a DOM lookup.\n // Either way: this is for the future. No need to optimize prematurely.\n shape.setAttribute('transform', `scale(${1 / scale})`));\n }\n\n /** \n * Adds an annotation to the annotation layer.\n * Returns the shape for convenience. \n */\n addAnnotation = (annotation, optBuffer) => {\n const g = optBuffer || this.g;\n\n const shape = drawShape(annotation, this.env.image);\n addClass(shape, 'a9s-annotation');\n\n shape.setAttribute('data-id', annotation.id);\n shape.annotation = annotation;\n\n g.appendChild(shape);\n \n format(shape, annotation, this.formatters);\n this.scaleFormatterElements(shape);\n \n return shape;\n }\n\n addDrawingTool = plugin =>\n this.tools.registerTool(plugin);\n\n addOrUpdateAnnotation = (annotation, previous) => {\n const selected = this.selectedShape?.annotation;\n if (selected === annotation || selected?.isSelection || selected == previous)\n this.deselect();\n \n if (previous)\n this.removeAnnotation(annotation);\n\n this.removeAnnotation(annotation);\n\n const shape = this.addAnnotation(annotation);\n if (hasClass(shape, 'a9s-non-scaling'))\n shape.setAttribute('transform', `scale(${1 / this.currentScale()})`);\n\n this.store.insert(annotation);\n }\n\n currentScale = () => {\n const containerWidth = this.viewer.viewport.getContainerSize().x;\n const zoom = this.viewer.viewport.getZoom(true);\n return zoom * containerWidth / this.viewer.world.getContentFactor();\n }\n\n deselect = () => { \n this.tools?.current.stop();\n \n if (this.selectedShape) {\n const { annotation } = this.selectedShape;\n\n if (this.selectedShape.destroy) {\n // Modifiable shape: destroy and re-add the annotation\n this.selectedShape.mouseTracker.destroy();\n this.selectedShape.destroy();\n\n if (!annotation.isSelection) {\n const shape = this.addAnnotation(annotation);\n if (hasClass(shape, 'a9s-non-scaling'))\n shape.setAttribute('transform', `scale(${1 / this.currentScale()})`);\n }\n } else {\n // Non-editable shape or read-only\n removeClass(this.selectedShape, 'selected');\n }\n \n this.selectedShape = null;\n }\n }\n\n destroy = () => {\n this.deselect();\n this.svg.parentNode.removeChild(this.svg);\n }\n\n findShape = annotationOrId => {\n const id = annotationOrId?.id ? annotationOrId.id : annotationOrId;\n return this.g.querySelector(`.a9s-annotation[data-id=\"${id}\"]`);\n }\n\n // Common code for fitBounds and fitBoundsWithConstraints\n _fit = (annotationOrId, opts, fn) => {\n const shape = this.findShape(annotationOrId);\n if (shape) {\n const immediately = opts ? (\n typeof opts == 'boolean' ? opts : opts.immediately\n ) : false; \n\n const padding = (opts?.padding || 0);\n \n const containerBounds = this.viewer.container.getBoundingClientRect();\n\n const paddingRelative = Math.min(\n 2 * padding / containerBounds.width,\n 2 * padding / containerBounds.height\n );\n\n const { x, y, width, height } = shape.getBBox(); // SVG element bounds, image coordinates\n\n const padX = x - paddingRelative * width;\n const padY = y - paddingRelative * height;\n const padW = width + 2 * paddingRelative * width;\n const padH = height + 2 * paddingRelative * height;\n\n const rect = this.viewer.viewport.imageToViewportRectangle(padX, padY, padW, padH);\n this.viewer.viewport[fn](rect, immediately);\n } \n }\n\n fitBounds = (annotationOrId, immediately) =>\n this._fit(annotationOrId, immediately, 'fitBounds');\n\n fitBoundsWithConstraints = (annotationOrId, immediately) =>\n this._fit(annotationOrId, immediately, 'fitBoundsWithConstraints');\n\n getAnnotations = () => {\n const shapes = Array.from(this.g.querySelectorAll('.a9s-annotation'));\n return shapes.map(s => s.annotation);\n }\n\n getAnnotationsIntersecting = annotationOrId => {\n const annotation = annotationOrId.id ? annotationOrId : this.findShape(annotationOrId).annotation;\n return this.store.getAnnotationsIntersecting(annotation);\n }\n\n getImageSnippetById = annotationId => {\n const shape = this.findShape(annotationId);\n if (shape)\n return getSnippet(this.viewer, shape);\n }\n\n getSelectedImageSnippet = () => {\n if (this.selectedShape) {\n const shape = this.selectedShape.element ?? this.selectedShape;\n return getSnippet(this.viewer, shape);\n }\n }\n\n init = annotations => {\n // Clear existing\n this.deselect();\n\n const shapes = Array.from(this.g.querySelectorAll('.a9s-annotation'));\n shapes.forEach(s => this.g.removeChild(s));\n\n this.store.clear();\n\n this._lazy(() => {\n // Draw annotations\n console.time('Took');\n console.log('Drawing...');\n\n if (!this.loaded)\n this.g.style.display = 'none';\n\n annotations.forEach(annotation => this.addAnnotation(annotation));\n\n // Insert into store (and spatial index)\n console.log('Indexing...')\n this.store.insert(annotations);\n console.timeEnd('Took');\n\n this.resize(); \n });\n }\n\n listDrawingTools = () =>\n this.tools.listTools();\n\n overrideId = (originalId, forcedId) => {\n // Update SVG shape data attribute\n const shape = this.findShape(originalId);\n shape.setAttribute('data-id', forcedId);\n\n // Update annotation\n const { annotation } = shape;\n\n const updated = annotation.clone({ id : forcedId });\n shape.annotation = updated;\n\n // Update spatial index\n this.store.remove(annotation);\n this.store.insert(updated);\n\n return updated;\n }\n\n panTo = (annotationOrId, immediately) => {\n const shape = this.findShape(annotationOrId);\n if (shape) {\n const { top, left, width, height } = shape.getBoundingClientRect();\n\n const x = left + width / 2 + window.scrollX;\n const y = top + height / 2 + window.scrollY;\n const center = this.viewer.viewport.windowToViewportCoordinates(new OpenSeadragon.Point(x, y));\n\n this.viewer.viewport.panTo(center, immediately);\n } \n }\n\n removeAnnotation = annotationOrId => {\n // Removal won't work if the annotation is currently selected - deselect!\n const id = annotationOrId.type ? annotationOrId.id : annotationOrId;\n\n if (this.selectedShape?.annotation.id === id)\n this.deselect();\n \n const toRemove = this.findShape(annotationOrId);\n\n if (toRemove) {\n const { annotation } = toRemove;\n\n if (this.selectedShape?.annotation === annotation)\n this.deselect();\n\n toRemove.parentNode.removeChild(toRemove);\n\n // Remove from spatial tree!\n this.store.remove(annotation);\n }\n }\n \n removeDrawingTool = id =>\n this.tools?.unregisterTool(id);\n\n resize() {\n const flipped = this.viewer.viewport.getFlip();\n\n const p = this.viewer.viewport.pixelFromPoint(new OpenSeadragon.Point(0, 0), true);\n if (flipped)\n p.x = this.viewer.viewport._containerInnerSize.x - p.x;\n\n const scaleY = this.currentScale();\n const scaleX = flipped ? - scaleY : scaleY;\n const rotation = this.viewer.viewport.getRotation();\n\n this.g.setAttribute('transform', `translate(${p.x}, ${p.y}) scale(${scaleX}, ${scaleY}) rotate(${rotation})`);\n\n this._refreshNonScalingAnnotations();\n this.scaleFormatterElements();\n\n if (this.selectedShape) {\n if (this.selectedShape.element) { // Editable shape\n this.scaleTool(this.selectedShape);\n this.emit('viewportChange', this.selectedShape.element);\n } else {\n this.emit('viewportChange', this.selectedShape); \n } \n }\n\n if (this.tools?.current)\n this.scaleTool(this.tools.current);\n }\n \n scaleFormatterElements = opt_shape => {\n const scale = 1 / this.currentScale();\n\n if (opt_shape) {\n const el = opt_shape.querySelector('.a9s-formatter-el');\n if (el)\n el.firstChild.setAttribute('transform', `scale(${scale})`);\n } else {\n const elements = Array.from(this.g.querySelectorAll('.a9s-formatter-el'));\n elements.forEach(el =>\n el.firstChild.setAttribute('transform', `scale(${scale})`));\n }\n }\n\n scaleTool = tool => {\n if (tool) {\n const scale = 1 / this.currentScale();\n tool.scale = scale;\n\n if (tool.onScaleChanged)\n tool.onScaleChanged(scale);\n }\n }\n\n selectAnnotation = (annotationOrId, skipEvent) => {\n if (this.selectedShape)\n this.deselect();\n\n const selected = this.findShape(annotationOrId);\n\n if (selected) {\n this.selectShape(selected, skipEvent);\n\n const element = this.selectedShape.element ? \n this.selectedShape.element : this.selectedShape;\n\n return { annotation: selected.annotation, element };\n } else {\n this.deselect();\n }\n }\n\n selectShape = (shape, skipEvent) => {\n if (!skipEvent && !shape.annotation.isSelection)\n this.emit('clickAnnotation', shape.annotation, shape);\n \n // Don't re-select\n if (this.selectedShape?.annotation === shape.annotation)\n return;\n\n // If another shape is currently selected, deselect first\n if (this.selectedShape && this.selectedShape.annotation !== shape.annotation)\n this.deselect();\n\n const { annotation } = shape;\n\n const readOnly = this.readOnly || annotation.readOnly;\n\n if (!(readOnly || this.headless)) {\n const toolForAnnotation = this.tools.forAnnotation(annotation);\n\n if (toolForAnnotation) {\n setTimeout(() => {\n shape.parentNode.removeChild(shape);\n\n // Fire the event AFTER the original shape was removed. Otherwise,\n // people calling `.getAnnotations()` in the `onSelectAnnotation` \n // handler will receive a duplicate annotation\n // (See issue https://github.com/recogito/annotorious-openseadragon/issues/63)\n if (!skipEvent)\n this.emit('select', { annotation, element: this.selectedShape.element });\n }, 1);\n\n this.selectedShape = toolForAnnotation.createEditableShape(annotation, this.formatters);\n this.scaleTool(this.selectedShape);\n\n this.scaleFormatterElements(this.selectedShape.element);\n\n this.selectedShape.element.annotation = annotation; \n\n // Disable normal OSD nav\n const editableShapeMouseTracker = new OpenSeadragon.MouseTracker({\n element: this.svg,\n\n preProcessEventHandler: info => {\n info.stopPropagation = true;\n info.preventDefault = false;\n info.preventGesture = true;\n }\n }).setTracking(false);\n\n // En-/disable OSD nav based on hover status\n this.selectedShape.element.addEventListener('mouseenter', () => {\n this.hoveredShape = this.selectedShape;\n editableShapeMouseTracker.setTracking(true);\n });\n\n this.selectedShape.element.addEventListener('mouseleave', () => {\n this.hoveredShape = null;\n editableShapeMouseTracker.setTracking(false);\n });\n\n this.selectedShape.mouseTracker = editableShapeMouseTracker;\n\n this.selectedShape.on('update', fragment =>\n this.emit('updateTarget', this.selectedShape.element, fragment));\n } else {\n this.selectedShape = shape;\n\n if (!skipEvent)\n this.emit('select', { annotation, element: this.selectedShape });\n }\n } else {\n this.selectedShape = shape;\n addClass(shape, 'selected');\n\n if (!skipEvent)\n this.emit('select', { annotation, element: shape, skipEvent }); \n }\n }\n\n setDrawingEnabled = enable => {\n if (this.mouseTracker) {\n const enabled = enable && !this.readOnly;\n this.mouseTracker.enabled = enabled;\n this.mouseTracker.setTracking(enabled);\n if (this.tools.current)\n this.tools.current.enabled = enabled;\n }\n }\n\n setDrawingTool = shape => {\n if (this.tools) {\n this.tools.current?.stop();\n this.tools.setCurrent(shape);\n }\n }\n\n setVisible = visible => {\n if (visible) {\n this.svg.style.display = null;\n } else {\n this.deselect();\n this.svg.style.display = 'none';\n }\n }\n\n stopDrawing = () => {\n if (this.tools?.current) {\n if (this.tools.current.isDrawing)\n this.tools.current.stop();\n \n this.mouseTracker.enabled = false;\n this.tools.current.enabled = false; \n }\n }\n\n}\n\nexport default class OSDAnnotationLayer extends AnnotationLayer {\n\n constructor(props) {\n super(props);\n this._initDrawingTools();\n }\n\n onDrawingComplete = shape => {\n this.mouseTracker.enabled = this.config.hotkey?.inverted;\n this.selectShape(shape);\n this.emit('createSelection', shape.annotation);\n }\n\n}","import { WebAnnotation } from '@recogito/recogito-client-core';\nimport { SVG_NAMESPACE } from '@recogito/annotorious/src/util/SVG';\nimport { \n parseRectFragment,\n svgFragmentToShape,\n toRectFragment, \n} from '@recogito/annotorious/src/selectors';\n\nconst currentTransform = viewer => {\n const extent = viewer.viewport.viewportToImageRectangle(viewer.viewport.getBounds(true));\n \n const containerWidth = viewer.viewport.getContainerSize().x;\n const zoom = viewer.viewport.getZoom(true);\n const scale = zoom * containerWidth / viewer.world.getContentFactor();\n\n return { extent, scale };\n}\n\n/**\n * 'FragmentSelector' or 'SvgSelector'\n */\nconst getSelectorType = annotation => {\n const firstTarget = annotation.targets[0];\n\n return firstTarget ? (\n Array.isArray(firstTarget.selector) ? firstTarget.selector[0].type : firstTarget.selector?.type\n ) : null;\n}\n\n/**\n * Converts an annotation target in gigapixel viewport coordinates to \n * base image coordinates.\n */\nexport const viewportTargetToImage = (viewer, target) => {\n const { extent, scale } = currentTransform(viewer);\n const { selector } = target;\n \n // Create an empty annotation wrapper so we can use the\n // standard parse functions\n const annotation = WebAnnotation.create({ target });\n\n if (selector.type === 'SvgSelector') {\n const shape = svgFragmentToShape(annotation);\n const nodeName = shape.nodeName.toLowerCase();\n\n let transformed = null;\n\n if (nodeName === 'polygon') {\n transformed = polygonTargetToImage(shape, extent, scale);\n } else if (nodeName === 'circle') {\n transformed = circleTargetToImage(shape, extent, scale);\n } else if (nodeName === 'ellipse') {\n transformed = ellipseTargetToImage(shape, extent, scale);\n } else if (nodeName === 'path') {\n transformed = pathTargetToImage(shape, extent, scale);\n } else {\n throw `Unsupported SVG shape type: ${nodeName}`;\n }\n\n // TODO refactor to avoid code duplication!\n let serialized = transformed.outerHTML || new XMLSerializer().serializeToString(transformed);\n serialized = serialized.replace(` xmlns=\"${SVG_NAMESPACE}\"`, '');\n \n return {\n ...target,\n selector: {\n type: \"SvgSelector\",\n value: `${serialized}`\n }\n }\n } else if (selector.type === 'FragmentSelector') {\n const { x, y, w, h } = parseRectFragment(annotation);\n\n const xP = extent.x + x / scale;\n const yP = extent.y + y / scale; \n const wP = w / scale;\n const hP = h / scale;\n\n return w === 0 && h === 0 ?\n // Edge case/hack - handle via point tool\n { ...toRectFragment(xP, yP, wP, hP), renderedVia: { name: 'point' } } :\n toRectFragment(xP, yP, wP, hP);\n } else {\n throw `Unsupported selector type: ${selector.type}`;\n }\n}\n\nconst polygonTargetToImage = (shape, extent, scale) => {\n const points = Array.from(shape.points);\n\n const transformed = points.map(pt => {\n const x = extent.x + pt.x / scale;\n const y = extent.y + pt.y / scale;\n\n return x + ',' + y;\n }).join(' ');\n\n shape.setAttribute('points', transformed);\n return shape;\n}\n\nconst circleTargetToImage = (shape, extent, scale) => {\n const cx = parseFloat(shape.getAttribute('cx'));\n const cy = parseFloat(shape.getAttribute('cy'));\n const r = parseFloat(shape.getAttribute('r'));\n\n shape.setAttribute('cx', extent.x + cx / scale);\n shape.setAttribute('cy', extent.y + cy / scale);\n shape.setAttribute('r', r / scale);\n\n return shape;\n}\n\nconst ellipseTargetToImage = (shape, extent, scale) => {\n const cx = parseFloat(shape.getAttribute('cx'));\n const cy = parseFloat(shape.getAttribute('cy'));\n const rx = parseFloat(shape.getAttribute('rx'));\n const ry = parseFloat(shape.getAttribute('ry'));\n\n shape.setAttribute('cx', extent.x + cx / scale);\n shape.setAttribute('cy', extent.y + cy / scale);\n shape.setAttribute('rx', rx / scale);\n shape.setAttribute('ry', ry / scale);\n\n return shape;\n}\n\nconst pathTargetToImage = (shape, extent, scale) => {\n const commands = shape.getAttribute('d')\n .split(/(?=M|m|L|l|H|h|V|v|Z|z)/g)\n .map(str => str.trim());\n\n const transformed = commands.map(cmd => {\n const op = cmd.substring(0, 1);\n\n if (op.toLowerCase() === 'z') {\n return op;\n } else {\n const xy = cmd.substring(1).split(' ')\n .map(str => parseFloat(str.trim()));\n\n // Uppercase ops are absolute coords -> transform\n const isUppercase = op === op.toUpperCase();\n\n const x = isUppercase ? extent.x + xy[0] / scale : xy[0] / scale;\n const y = isUppercase ? extent.y + xy[1] / scale : xy[1] / scale;\n\n return op + ' ' + x + ' ' + y;\n }\n }).join(' ');\n\n shape.setAttribute('d', transformed);\n return shape;\n}\n\n/**\n * Converts an annotation in base image coordinates to \n * gigapixel viewport coordinates.\n */\nexport const imageAnnotationToViewport = (viewer, annotation) => {\n const { extent, scale } = currentTransform(viewer);\n\n const fragmentSelector = annotation.selector('FragmentSelector');\n const svgSelector = annotation.selector('SvgSelector');\n \n if (svgSelector) {\n const shape = svgFragmentToShape(annotation);\n const nodeName = shape.nodeName.toLowerCase();\n\n let transformed = null;\n\n if (nodeName === 'polygon')\n transformed = polygonAnnotationToViewport(shape, extent, scale);\n else if (nodeName === 'circle')\n transformed = circleAnnotationToViewport(shape, extent, scale);\n else if (nodeName === 'ellipse')\n transformed = ellipseAnnotationToViewport(shape, extent, scale);\n else if (nodeName === 'path')\n transformed = pathAnnotationToViewport(shape, extent, scale);\n else\n throw `Unsupported SVG shape type: ${nodeName}`;\n\n let serialized = transformed.outerHTML || new XMLSerializer().serializeToString(transformed);\n serialized = serialized.replace(` xmlns=\"${SVG_NAMESPACE}\"`, '');\n \n const target = {\n selector: {\n type: \"SvgSelector\",\n value: `${serialized}`\n }\n }\n\n return annotation.clone({ target });\n\n } else if (fragmentSelector) {\n const { x, y, w, h } = parseRectFragment(annotation);\n\n const updatedX = (x - extent.x) * scale;\n const updatedY = (y - extent.y) * scale;\n\n const target = toRectFragment(\n updatedX, updatedY, \n w * scale, h * scale\n );\n\n return annotation.clone({ target });\n }\n}\n\nconst polygonAnnotationToViewport = (shape, extent, scale) => {\n const points = Array.from(shape.points);\n\n const transformed = points.map(pt => {\n const x = scale * (pt.x - extent.x);\n const y = scale * (pt.y - extent.y);\n\n return x + ',' + y;\n }).join(' ');\n\n shape.setAttribute('points', transformed);\n return shape;\n}\n\nconst circleAnnotationToViewport = (shape, extent, scale) => {\n const cx = shape.getAttribute('cx');\n const cy = shape.getAttribute('cy');\n const r = shape.getAttribute('r');\n\n shape.setAttribute('cx', scale * (cx - extent.x));\n shape.setAttribute('cy', scale * (cy - extent.y));\n shape.setAttribute('r', r * scale);\n\n return shape;\n}\n\nconst ellipseAnnotationToViewport = (shape, extent, scale) => {\n const cx = shape.getAttribute('cx');\n const cy = shape.getAttribute('cy');\n const rx = shape.getAttribute('rx');\n const ry = shape.getAttribute('ry');\n\n shape.setAttribute('cx', scale * (cx - extent.x));\n shape.setAttribute('cy', scale * (cy - extent.y));\n shape.setAttribute('rx', rx * scale);\n shape.setAttribute('ry', ry * scale);\n\n return shape;\n}\n\nconst pathAnnotationToViewport = (shape, extent, scale) => {\n const commands = shape.getAttribute('d')\n .split(/(?=M|m|L|l|H|h|V|v|Z|z)/g)\n .map(str => str.trim());\n\n const transformed = commands.map(cmd => {\n const op = cmd.substring(0, 1);\n\n if (op.toLowerCase() === 'z') {\n return op;\n } else {\n const xy = cmd.substring(1).split(' ')\n .filter(str => str) // Remove leading empty strings\n .map(str => parseFloat(str.trim()));\n\n // Uppercase ops are absolute coords -> transform\n const isUppercase = op === op.toUpperCase();\n const x = isUppercase ? scale * (xy[0] - extent.x) : scale * xy[0];\n const y = isUppercase ? scale * (xy[1] - extent.y) : scale * xy[1];\n\n return op + ' ' + x + ' ' + y;\n }\n }).join(' ');\n\n shape.setAttribute('d', transformed);\n return shape;\n}\n\n/**\n * Updates the position of the shape to match the current viewport\n * transform.\n */\nexport const refreshViewportPosition = (viewer, shape) => {\n const { extent, scale } = currentTransform(viewer);\n\n const selectorType = getSelectorType(shape.annotation);\n \n if (selectorType === 'FragmentSelector')\n refreshRectFragment(shape, extent, scale);\n else if (selectorType === 'SvgSelector') \n refreshSvg(shape, extent, scale);\n else\n throw `Unsupported selector type type: ${selectorType}`;\n\n // Update formatter element position, if any\n const formatterEl = shape.querySelector('.a9s-formatter-el');\n if (formatterEl) {\n const { x, y } = shape.querySelector('.a9s-inner').getBBox();\n formatterEl.setAttribute('x', x);\n formatterEl.setAttribute('y', y);\n }\n}\n\nconst refreshRectFragment = (shape, extent, scale) => {\n const { x, y, w, h } = parseRectFragment(shape.annotation);\n\n const outer = shape.querySelector('.a9s-outer');\n const inner = shape.querySelector('.a9s-inner');\n\n const offsetX = scale * (x - extent.x);\n const offsetY = scale * (y - extent.y);\n\n if (w === 0 && h === 0) {\n // Edge case: rendered as a point!\n [ outer, inner ].forEach(elem => {\n elem.setAttribute('cx', offsetX);\n elem.setAttribute('cy', offsetY);\n });\n } else {\n [ outer, inner ].forEach(elem => {\n elem.setAttribute('x', offsetX);\n elem.setAttribute('y', offsetY);\n elem.setAttribute('width', w * scale);\n elem.setAttribute('height', h * scale);\n });\n }\n}\n\nconst refreshSvg = (shape, extent, scale) => {\n const parsedShape = svgFragmentToShape(shape.annotation);\n const nodeName = parsedShape.nodeName.toLowerCase();\n\n if (nodeName === 'polygon') {\n refreshPolygon(shape, parsedShape, extent, scale);\n } else if (nodeName === 'circle') {\n refreshCircle(shape, parsedShape, extent, scale);\n } else if (nodeName === 'ellipse') {\n refreshEllipse(shape, parsedShape, extent, scale);\n } else if (nodeName === 'path') {\n refreshPath(shape, parsedShape, extent, scale);\n } else {\n throw `Unsupported SVG shape type: ${nodeName}`;\n }\n}\n\nconst refreshPolygon = (shape, imageShape, extent, scale) => {\n const points = Array.from(imageShape.points);\n\n const transformed = points.map(pt => {\n const x = scale * (pt.x - extent.x);\n const y = scale * (pt.y - extent.y);\n\n return x + ',' + y;\n }).join(' ');\n\n const outer = shape.querySelector('.a9s-outer');\n outer.setAttribute('points', transformed);\n\n const inner = shape.querySelector('.a9s-inner');\n inner.setAttribute('points', transformed);\n}\n\nconst refreshCircle = (shape, imageShape, extent, scale) => {\n const cx = scale * (imageShape.getAttribute('cx') - extent.x);\n const cy = scale * (imageShape.getAttribute('cy') - extent.y);\n const r = scale * imageShape.getAttribute('r');\n\n const outer = shape.querySelector('.a9s-outer');\n outer.setAttribute('cx', cx);\n outer.setAttribute('cy', cy);\n outer.setAttribute('r', r);\n\n const inner = shape.querySelector('.a9s-inner');\n inner.setAttribute('cx', cx);\n inner.setAttribute('cy', cy);\n inner.setAttribute('r', r);\n} \n\nconst refreshEllipse = (shape, imageShape, extent, scale) => {\n const cx = scale * (imageShape.getAttribute('cx') - extent.x);\n const cy = scale * (imageShape.getAttribute('cy') - extent.y);\n const rx = scale * imageShape.getAttribute('rx');\n const ry = scale * imageShape.getAttribute('ry');\n\n const outer = shape.querySelector('.a9s-outer');\n outer.setAttribute('cx', cx);\n outer.setAttribute('cy', cy);\n outer.setAttribute('rx', rx);\n outer.setAttribute('ry', ry);\n\n const inner = shape.querySelector('.a9s-inner');\n inner.setAttribute('cx', cx);\n inner.setAttribute('cy', cy);\n inner.setAttribute('rx', rx);\n inner.setAttribute('ry', ry);\n}\n\nconst refreshPath = (shape, imageShape, extent, scale) => {\n const commands = imageShape.getAttribute('d')\n .split(/(?=M|m|L|l|H|h|V|v|Z|z)/g)\n .map(str => str.trim());\n\n const transformed = commands.map(cmd => {\n const op = cmd.substring(0, 1);\n\n if (op.toLowerCase() === 'z') {\n return op;\n } else {\n const xy = cmd.substring(1).split(' ')\n .filter(str => str) // Remove leading empty strings\n .map(str => parseFloat(str.trim()));\n\n // Uppercase ops are absolute coords -> transform\n const isUppercase = op === op.toUpperCase();\n const x = isUppercase ? scale * (xy[0] - extent.x) : scale * xy[0];\n const y = isUppercase ? scale * (xy[1] - extent.y) : scale * xy[1];\n\n return op + ' ' + x + ' ' + y;\n }\n }).join(' ');\n\n shape.querySelector('.a9s-inner').setAttribute('d', transformed);\n shape.querySelector('.a9s-outer').setAttribute('d', transformed);\n}","import OpenSeadragon from 'openseadragon';\nimport { drawShape } from '@recogito/annotorious/src/selectors';\nimport { format } from '@recogito/annotorious/src/util/Formatting';\nimport { addClass, removeClass } from '@recogito/annotorious/src/util/SVG';\nimport { isTouchDevice } from '@recogito/annotorious/src/util/Touch';\nimport { viewportTargetToImage, imageAnnotationToViewport, refreshViewportPosition } from '.';\nimport { AnnotationLayer } from '../OSDAnnotationLayer';\n\nconst isTouch = isTouchDevice();\n\nexport default class GigapixelAnnotationLayer extends AnnotationLayer {\n\n constructor(props) {\n super(props);\n this._initDrawingTools(true);\n }\n\n // Common code for fitBounds and fitBoundsWithConstraints\n _fit = (annotationOrId, opts, fn) => {\n const immediately = opts ? (\n typeof opts == 'boolean' ? opts : opts.immediately\n ) : false; \n\n const padding = opts?.padding || 0;\n\n const shape = this.findShape(annotationOrId);\n if (shape) {\n const containerBounds = this.viewer.container.getBoundingClientRect();\n const shapeBounds = shape.getBoundingClientRect();\n\n const x = shapeBounds.x - containerBounds.x;\n const y = shapeBounds.y - containerBounds.y;\n const { width, height } = shapeBounds;\n\n const padX = x - padding;\n const padY = y - padding;\n const padW = width + 2 * padding;\n const padH = height + 2 * padding;\n\n const rect = this.viewer.viewport.viewerElementToViewportRectangle(new OpenSeadragon.Rect(padX, padY, padW, padH)); \n \n this.viewer.viewport[fn](rect, immediately);\n } \n }\n\n _getShapeAt = evt => {\n const getXY = evt => {\n if (isTouch) {\n const bbox = this.svg.getBoundingClientRect();\n \n const x = evt.clientX - bbox.x;\n const y = evt.clientY - bbox.y;\n \n return new OpenSeadragon.Point(x, y);\n } else {\n return new OpenSeadragon.Point(evt.offsetX, evt.offsetY);\n }\n }\n\n // For some reason, this doesn't seem to work in one step...\n const pt = this.viewer.viewport.viewerElementToViewportCoordinates(getXY(evt));\n const { x, y } = this.viewer.viewport.viewportToImageCoordinates(pt.x, pt.y);\n\n const annotation = this.store.getAnnotationAt(x, y, this.currentScale());\n if (annotation)\n return this.findShape(annotation);\n }\n\n _refreshNonScalingAnnotations = () => {\n // No scaling needed in gigapixel mode!\n }\n\n addAnnotation = (annotation, optBuffer) => {\n const g = optBuffer || this.g;\n\n const shape = drawShape(annotation, this.env.image);\n addClass(shape, 'a9s-annotation');\n\n shape.setAttribute('data-id', annotation.id);\n shape.annotation = annotation;\n\n refreshViewportPosition(this.viewer, shape);\n\n g.appendChild(shape);\n\n format(shape, annotation, this.formatters);\n\n return shape;\n }\n\n /**\n * Differs from non-gigapixel implementation only onsofar as \n * non-scaling shapes need no scaling!\n */\n addOrUpdateAnnotation = (annotation, previous) => {\n const selected = this.selectedShape?.annotation;\n if (selected === annotation || selected?.isSelection || selected == previous)\n this.deselect();\n \n if (previous)\n this.removeAnnotation(annotation);\n\n this.removeAnnotation(annotation);\n\n this.addAnnotation(annotation);\n this.store.insert(annotation);\n }\n\n /** Same: no counter-scaling for non-scaling shapes needed **/\n deselect = () => {\n this.tools?.current.stop();\n \n if (this.selectedShape) {\n const { annotation } = this.selectedShape;\n\n if (this.selectedShape.destroy) {\n // Modifiable shape: destroy and re-add the annotation\n this.selectedShape.mouseTracker.destroy();\n this.selectedShape.destroy();\n\n if (!annotation.isSelection)\n this.addAnnotation(annotation);\n } else {\n // Non-editable shape or read-only\n removeClass(this.selectedShape, 'selected');\n }\n \n this.selectedShape = null;\n }\n }\n\n onDrawingComplete = shape => {\n // Annotation is in SVG coordinates - project to image coordinates \n const reprojected = shape.annotation.clone({ target: viewportTargetToImage(this.viewer, shape.annotation.target) });\n shape.annotation = reprojected;\n\n this.selectShape(shape);\n this.emit('createSelection', shape.annotation);\n\n this.mouseTracker.enabled = false;\n }\n\n resize() {\n if (!this.store)\n return;\n\n // Update positions for all annotations except selected (will be handled separately)\n const shapes = Array.from(this.g.querySelectorAll('.a9s-annotation:not(.selected)'));\n shapes.forEach(s =>\n refreshViewportPosition(this.viewer, s));\n \n if (this.selectedShape) {\n if (this.selectedShape.element) {\n // Update the viewport position of the editable shape by transforming\n // this.selectedShape.element.annotation -> this always holds the current\n // position in image coordinates (including after drag/resize)\n const projected = imageAnnotationToViewport(this.viewer, this.selectedShape.element.annotation);\n \n this.selectedShape.updateState && this.selectedShape.updateState(projected);\n \n this.emit('viewportChange', this.selectedShape.element);\n } else {\n this.emit('viewportChange', this.selectedShape); \n } \n }\n }\n\n selectShape = (shape, skipEvent) => {\n if (!skipEvent && !shape.annotation.isSelection)\n this.emit('clickAnnotation', shape.annotation, shape);\n \n // Don't re-select\n if (this.selectedShape?.annotation === shape.annotation)\n return;\n\n // If another shape is currently selected, deselect first\n if (this.selectedShape && this.selectedShape.annotation !== shape.annotation)\n this.deselect(true);\n\n const { annotation } = shape;\n\n const readOnly = this.readOnly || annotation.readOnly;\n\n if (!(readOnly || this.headless)) {\n setTimeout(() => {\n shape.parentNode.removeChild(shape);\n\n // Fire the event AFTER the original shape was removed. Otherwise,\n // people calling `.getAnnotations()` in the `onSelectAnnotation` \n // handler will receive a duplicate annotation\n // (See issue https://github.com/recogito/annotorious-openseadragon/issues/63)\n if (!skipEvent)\n this.emit('select', { annotation, element: this.selectedShape.element });\n }, 1);\n\n // Init the EditableShape (with the original annotation in image coordinates)\n const toolForAnnotation = this.tools.forAnnotation(annotation);\n this.selectedShape = toolForAnnotation.createEditableShape(annotation);\n this.selectedShape.element.annotation = annotation; \n\n // Instantly reproject the original annotation to viewport coorods\n const projected = imageAnnotationToViewport(this.viewer, annotation);\n this.selectedShape.updateState(projected);\n\n // Disable normal OSD nav\n const editableShapeMouseTracker = new OpenSeadragon.MouseTracker({\n element: this.svg,\n\n preProcessEventHandler: info => {\n info.stopPropagation = true;\n info.preventDefault = false;\n info.preventGesture = true;\n }\n }).setTracking(false);\n\n // En-/disable OSD nav based on hover status\n this.selectedShape.element.addEventListener('mouseenter', () => {\n this.hoveredShape = this.selectedShape;\n editableShapeMouseTracker.setTracking(true);\n });\n\n this.selectedShape.element.addEventListener('mouseleave', () => {\n this.hoveredShape = null;\n editableShapeMouseTracker.setTracking(false);\n });\n\n this.selectedShape.mouseTracker = editableShapeMouseTracker;\n\n this.selectedShape.on('update', fragment => {\n // Fragment is in viewport coordinates - project back to image coords...\n const projectedTarget = viewportTargetToImage(this.viewer, fragment);\n\n // ...and update element.annotation, so everything stays in sync\n this.selectedShape.element.annotation =\n this.selectedShape.annotation.clone({ target: projectedTarget });\n\n this.emit('updateTarget', this.selectedShape.element, projectedTarget)\n });\n } else {\n this.selectedShape = shape;\n addClass(shape, 'selected');\n\n if (!skipEvent)\n this.emit('select', { annotation, element: shape, skipEvent }); \n }\n }\n\n}","import{options as r,Fragment as _}from\"preact\";export{Fragment}from\"preact\";var o=0;function e(_,e,n,t,f){var l,s,u={};for(s in e)\"ref\"==s?l=e[s]:u[s]=e[s];var a={type:_,props:u,key:n,ref:l,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:--o,__source:t,__self:f};if(\"function\"==typeof _&&(l=_.defaultProps))for(s in l)void 0===u[s]&&(u[s]=l[s]);return r.vnode&&r.vnode(a),a}export{e as jsx,e as jsxs,e as jsxDEV};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import React, { Component } from 'react';\nimport { Editor } from '@recogito/recogito-client-core';\nimport OSDAnnotationLayer from './OSDAnnotationLayer';\nimport GigapixelAnnotationLayer from './gigapixel/GigapixelAnnotationLayer';\n\nexport default class OpenSeadragonAnnotator extends Component {\n\n constructor(props) {\n super(props);\n\n this.state = {\n selectedAnnotation: null,\n selectedDOMElement: null,\n modifiedTarget: null,\n \n // ReadOnly mode\n readOnly: props.config.readOnly,\n \n // Headless mode\n editorDisabled: props.config.disableEditor,\n \n // Widgets\n widgets: props.config.widgets,\n \n // Records the state before any potential headless modify (done via\n // .updateSelected) so we can properly fire the updateAnnotation(a, previous)\n // event, and distinguish between headless Save and Cancel \n beforeHeadlessModify: null\n }\n\n this._editor = React.createRef();\n }\n\n /** Shorthand **/\n clearState = opt_callback => this.setState({\n selectedAnnotation: null,\n selectedDOMElement: null,\n modifiedTarget: null,\n beforeHeadlessModify: null\n }, opt_callback);\n\n componentDidMount() {\n this.annotationLayer = this.props.config.gigapixelMode ? \n new GigapixelAnnotationLayer(this.props) :\n new OSDAnnotationLayer(this.props);\n\n this.annotationLayer.on('load', this.props.onLoad);\n\n this.annotationLayer.on('startSelection', this.handleStartSelect);\n this.annotationLayer.on('endSelection', this.handleEndSelect);\n this.annotationLayer.on('select', this.handleSelect);\n\n this.annotationLayer.on('updateTarget', this.handleUpdateTarget);\n\n this.annotationLayer.on('viewportChange', this.handleViewportChange);\n\n this.forwardEvent('clickAnnotation','onClickAnnotation');\n this.forwardEvent('mouseEnterAnnotation', 'onMouseEnterAnnotation');\n this.forwardEvent('mouseLeaveAnnotation', 'onMouseLeaveAnnotation');\n \n // Escape cancels editing\n document.addEventListener('keyup', this.onKeyUp);\n }\n\n forwardEvent = (from, to) => {\n this.annotationLayer.on(from, (annotation, elem) => {\n this.props[to](annotation.clone(), elem);\n });\n }\n\n componentWillUnmount() {\n this.annotationLayer.destroy();\n\n document.removeEventListener('keyup', this.onKeyUp);\n }\n\n onKeyUp = evt => {\n if (evt.which === 27) { // Escape\n this.annotationLayer.stopDrawing();\n \n const { selectedAnnotation } = this.state;\n if (selectedAnnotation) {\n this.cancelSelected();\n this.props.onCancelSelected(selectedAnnotation);\n }\n } else if (evt.which === 46) { // Delete\n const { disableDeleteKey } = this.props.config;\n\n if (!disableDeleteKey) {\n const { selectedAnnotation } = this.state;\n if (selectedAnnotation) {\n if (selectedAnnotation.isSelection) {\n this.onCancelAnnotation(selectedAnnotation);\n } else {\n this.onDeleteAnnotation(selectedAnnotation);\n }\n }\n }\n }\n }\n\n handleStartSelect = pt =>\n this.props.onSelectionStarted(pt);\n\n handleEndSelect = pt =>\n this.props.onSelectionEnded(pt);\n \n handleSelect = (evt, skipEvent) => {\n this.state.editorDisabled ?\n this.onHeadlessSelect(evt, skipEvent) : this.onNormalSelect(evt, skipEvent);\n }\n\n onNormalSelect = (evt, skipEvent) => {\n const { annotation, element } = evt;\n\n if (annotation) {\n // Select action needs to run immediately if no annotation was\n // selected before. Otherwise, make a deselect state change first,\n // and then select after this state change has completed. (This is\n // keep our external event cycle clean!)\n const select = () => {\n this.setState({ \n selectedAnnotation: annotation,\n selectedDOMElement: element,\n modifiedTarget: null\n }, () => {\n if (!skipEvent) {\n if (annotation.isSelection) {\n this.props.onSelectionCreated(annotation.clone());\n } else {\n this.props.onAnnotationSelected(annotation.clone(), element);\n }\n }\n }); \n }\n\n // If there is another selected annotation,\n // fire cancel before making the new selection\n const { selectedAnnotation } = this.state;\n\n if (selectedAnnotation && !selectedAnnotation.isEqual(annotation)) {\n this.clearState(() => {\n this.props.onCancelSelected(selectedAnnotation);\n select();\n });\n } else {\n select();\n }\n } else {\n const { selectedAnnotation } = this.state; \n \n if (selectedAnnotation)\n this.clearState(() => \n this.props.onCancelSelected(selectedAnnotation));\n else\n this.clearState();\n }\n }\n\n onHeadlessSelect = (evt, skipEvent) => {\n // When in headless mode, changing selection acts as 'Ok' - changes\n // to the previous annotation are stored! (In normal mode, selection\n // acts as 'Cancel'.)\n this.saveSelected().then(() => {\n this.onNormalSelect(evt, skipEvent);\n });\n }\n\n handleUpdateTarget = (selectedDOMElement, modifiedTarget) => {\n this.setState({ selectedDOMElement, modifiedTarget });\n\n const clone = JSON.parse(JSON.stringify(modifiedTarget));\n this.props.onSelectionTargetChanged(clone);\n }\n\n handleViewportChange = selectedDOMElement =>\n this.setState({ selectedDOMElement });\n\n /**\n * A convenience method that allows the external application to\n * override the autogenerated Id for an annotation.\n */\n overrideAnnotationId = originalAnnotation => forcedId => {\n const { id } = originalAnnotation;\n\n // Force the editor to close first, otherwise there's a risk of orphaned annotation\n if (this.state.selectedAnnotation) {\n this.setState({\n selectedAnnotation: null,\n selectedDOMElement: null,\n modifiedTarget: null\n }, () => {\n this.annotationLayer.overrideId(id, forcedId);\n });\n } else {\n this.annotationLayer.overrideId(id, forcedId);\n }\n }\n\n /**************************/ \n /* Annotation CRUD events */\n /**************************/ \n\n onCreateOrUpdateAnnotation = (method, opt_callback) => (annotation, previous) => {\n // Merge updated target if necessary\n let a = annotation.isSelection ? annotation.toAnnotation() : annotation;\n \n a = (this.state.modifiedTarget) ?\n a.clone({ target: this.state.modifiedTarget }) : a.clone();\n\n this.clearState(() => {\n // this.annotationLayer.deselect();\n this.annotationLayer.addOrUpdateAnnotation(a, previous);\n\n // Call CREATE or UPDATE handler\n if (previous)\n this.props[method](a, previous.clone());\n else\n this.props[method](a, this.overrideAnnotationId(a)); \n\n opt_callback && opt_callback();\n });\n }\n\n onDeleteAnnotation = annotation => {\n this.clearState();\n this.annotationLayer.removeAnnotation(annotation);\n this.props.onAnnotationDeleted(annotation);\n }\n\n onCancelAnnotation = (annotation, opt_callback) => {\n if (!this.state.editorDisabled)\n this.annotationLayer.deselect();\n\n this.props.onCancelSelected(annotation);\n this.clearState(opt_callback);\n }\n\n /****************/ \n /* External API */\n /****************/\n\n addAnnotation = annotation => {\n // Deselect first in case the annotation is currently selected\n if (annotation.id === this.state.selectedAnnotation?.id) {\n this.annotationLayer.deselect();\n this.clearState();\n }\n\n this.annotationLayer.addOrUpdateAnnotation(annotation.clone());\n }\n \n addDrawingTool = plugin =>\n this.annotationLayer.addDrawingTool(plugin);\n\n /** Cancel is an async op, return promise **/\n cancelSelected = () => new Promise(resolve => {\n this.annotationLayer.deselect();\n\n if (this.state.selectedAnnotation) {\n // Clear state and resolve afterwards\n this.clearState(resolve);\n } else { \n // Nothing to clear - resolve now\n resolve();\n }\n });\n\n get disableEditor() {\n return this.state.editorDisabled;\n }\n\n set disableEditor(disabled) {\n this.setState({ editorDisabled: disabled });\n }\n\n get disableSelect() {\n return this.annotationLayer.disableSelect;\n }\n\n set disableSelect(disable) { \n this.annotationLayer.disableSelect = disable;\n }\n \n fitBounds = (annotationOrId, immediately) =>\n this.annotationLayer.fitBounds(annotationOrId, immediately);\n\n fitBoundsWithConstraints = (annotationOrId, immediately) =>\n this.annotationLayer.fitBoundsWithConstraints(annotationOrId, immediately);\n\n get formatters() {\n return this.annotationLayer.formatters;\n }\n\n set formatters(formatters) {\n this.annotationLayer.formatters = formatters;\n }\n \n getAnnotationById = annotationId =>\n this.annotationLayer.findShape(annotationId)?.annotation;\n\n getAnnotations = () =>\n this.annotationLayer.getAnnotations().map(a => a.clone());\n\n getAnnotationsIntersecting = annotationOrId =>\n this.annotationLayer.getAnnotationsIntersecting(annotationOrId);\n\n getImageSnippetById = annotationId =>\n this.annotationLayer.getImageSnippetById(annotationId);\n\n getSelected = () => {\n if (this.state.selectedAnnotation) {\n return this.state.editorDisabled ? \n this.state.selectedAnnotation :\n this._editor.current?.getCurrentAnnotation();\n }\n }\n\n getSelectedImageSnippet = () =>\n this.annotationLayer.getSelectedImageSnippet();\n\n listDrawingTools = () =>\n this.annotationLayer.listDrawingTools();\n\n panTo = (annotationOrId, immediately) =>\n this.annotationLayer.panTo(annotationOrId, immediately);\n\n get readOnly() {\n return this.state.readOnly;\n }\n\n set readOnly(readOnly) {\n this.annotationLayer.readOnly = readOnly;\n this.setState({ readOnly });\n }\n\n removeAnnotation = annotationOrId =>\n this.annotationLayer.removeAnnotation(annotationOrId);\n\n removeDrawingTool = id =>\n this.annotationLayer.removeDrawingTool(id);\n\n saveSelected = () =>\n new Promise(resolve => {\n const a = this.state.selectedAnnotation;\n\n if (a) {\n if (this._editor.current) {\n this._editor.current.onOk();\n resolve();\n } else if (a.isSelection) {\n if (a.bodies.length > 0 || this.props.config.allowEmpty) {\n this.onCreateOrUpdateAnnotation('onAnnotationCreated', resolve)(a);\n } else {\n this.annotationLayer.deselect();\n resolve();\n }\n } else {\n // Headless update?\n const { beforeHeadlessModify, modifiedTarget } = this.state;\n \n if (beforeHeadlessModify) {\n // Annotation was modified using '.updateSelected()'\n this.onCreateOrUpdateAnnotation('onAnnotationUpdated', resolve)(a, beforeHeadlessModify);\n } else if (modifiedTarget) {\n // Target was modified, but otherwise no change\n this.onCreateOrUpdateAnnotation('onAnnotationUpdated', resolve)(a, a);\n } else {\n this.onCancelAnnotation(a, resolve);\n } \n }\n } else {\n resolve();\n }\n });\n\n selectAnnotation = arg => {\n const selected = this.annotationLayer.selectAnnotation(arg, true);\n \n if (selected) { \n this.handleSelect(selected, true);\n return selected.annotation.clone();\n } else {\n this.clearState(); // Deselect\n }\n }\n \n setAnnotations = annotations =>\n this.annotationLayer.init(annotations.map(a => a.clone()));\n\n setDrawingEnabled = enable =>\n this.annotationLayer.setDrawingEnabled(enable);\n \n setDrawingTool = shape =>\n this.annotationLayer.setDrawingTool(shape);\n\n setVisible = visible => {\n this.annotationLayer.setVisible(visible);\n\n if (!visible)\n this.clearState();\n }\n\n updateSelected = (annotation, saveImmediately) =>\n new Promise(resolve => {\n if (this.state.selectedAnnotation) {\n if (saveImmediately) {\n if (this.state.selectedAnnotation.isSelection) {\n this.onCreateOrUpdateAnnotation('onAnnotationCreated', resolve)(annotation);\n } else {\n this.onCreateOrUpdateAnnotation('onAnnotationUpdated', resolve)(annotation, this.state.selectedAnnotation);\n }\n } else {\n this.setState({ \n selectedAnnotation: annotation,\n beforeHeadlessModify: this.state.beforeHeadlessModify || this.state.selectedAnnotation\n }, resolve);\n }\n }\n });\n\n get widgets() {\n return this.state.widgets;\n }\n\n set widgets(widgets) {\n this.setState({ widgets });\n }\n\n render() {\n // The editor should open under normal conditions - annotation was selected, no headless mode\n const open = this.state.selectedAnnotation && !this.state.editorDisabled;\n\n const readOnly = this.state.readOnly || this.state.selectedAnnotation?.readOnly;\n\n return (open && (\n \n )\n )\n }\n\n}","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport Emitter from 'tiny-emitter';\nimport OpenSeadragonAnnotator from './OpenSeadragonAnnotator';\nimport { \n Selection,\n WebAnnotation,\n createEnvironment,\n setLocale\n} from '@recogito/recogito-client-core';\n\nimport '@recogito/annotorious/src/ImageAnnotator.scss';\nimport '@recogito/recogito-client-core/themes/default';\nimport './OpenSeadragonAnnotator.scss';\n\nclass OSDAnnotorious {\n\n constructor(viewer, conf) {\n const config = conf || {};\n\n this._app = React.createRef();\n \n this._emitter = new Emitter();\n\n this._env = createEnvironment();\n\n this._element = viewer.element;\n\n // Set position to 'relative' if there's no position yet. This\n // ensures that the viewer element provides the reference frame\n // for the editor position.\n const elPosition = window.getComputedStyle(this._element).getPropertyValue('position');\n if (elPosition === 'static')\n this._element.style.position = 'relative';\n\n setLocale(config.locale, config.messages);\n\n this.appContainerEl = document.createElement('DIV');\n\n this._element.appendChild(this.appContainerEl);\n \n ReactDOM.render(\n , this.appContainerEl);\n }\n\n /********************/ \n /* External events */\n /********************/ \n\n handleAnnotationCreated = (annotation, overrideId) =>\n this._emitter.emit('createAnnotation', annotation.underlying, overrideId);\n\n handleAnnotationDeleted = annotation =>\n this._emitter.emit('deleteAnnotation', annotation.underlying);\n\n handleAnnotationSelected = (annotation, elem) => \n this._emitter.emit('selectAnnotation', annotation.underlying, elem);\n\n handleAnnotationUpdated = (annotation, previous) =>\n this._emitter.emit('updateAnnotation', annotation.underlying, previous.underlying);\n\n handleCancelSelected = annotation =>\n this._emitter.emit('cancelSelected', annotation.underlying);\n\n handleClickAnnotation = (annotation, elem) =>\n this._emitter.emit('clickAnnotation', annotation.underlying, elem);\n\n handleLoad = src =>\n this._emitter.emit('load', src);\n \n handleSelectionCreated = selection =>\n this._emitter.emit('createSelection', selection.underlying);\n\n handleSelectionStarted = pt =>\n this._emitter.emit('startSelection', pt);\n\n handleSelectionEnded = pt =>\n this._emitter.emit('endSelection', pt);\n\n handleSelectionTargetChanged = target =>\n this._emitter.emit('changeSelectionTarget', target);\n\n handleMouseEnterAnnotation = (annotation, elem) =>\n this._emitter.emit('mouseEnterAnnotation', annotation.underlying, elem);\n\n handleMouseLeaveAnnotation = (annotation, elem) =>\n this._emitter.emit('mouseLeaveAnnotation', annotation.underlying, elem);\n\n /********************/ \n /* External API */\n /********************/ \n\n // Common shorthand for handling annotationOrId args\n _wrap = annotationOrId =>\n annotationOrId?.type === 'Annotation' ? new WebAnnotation(annotationOrId) : annotationOrId;\n\n addAnnotation = annotation =>\n this._app.current.addAnnotation(new WebAnnotation(annotation));\n\n addDrawingTool = plugin =>\n this._app.current.addDrawingTool(plugin);\n\n cancelSelected = () =>\n this._app.current.cancelSelected();\n\n clearAnnotations = () =>\n this.setAnnotations([]);\n\n clearAuthInfo = () =>\n this._env.user = null;\n\n get disableEditor() {\n return this._app.current.disableEditor;\n }\n\n set disableEditor(disabled) {\n this._app.current.disableEditor = disabled;\n }\n\n get disableSelect() {\n return this._app.current.disableSelect;\n }\n\n set disableSelect(select) {\n this._app.current.disableSelect = select;\n }\n \n destroy = () =>\n ReactDOM.unmountComponentAtNode(this.appContainerEl);\n\n fitBounds = (annotationOrId, immediately) =>\n this._app.current.fitBounds(this._wrap(annotationOrId), immediately);\n\n fitBoundsWithConstraints = (annotationOrId, immediately) =>\n this._app.current.fitBoundsWithConstraints(this._wrap(annotationOrId), immediately);\n\n get formatters() {\n return this._app.current.formatters || [];\n }\n\n set formatters(arg) {\n if (arg) {\n const formatters = Array.isArray(arg) ? arg : [ arg ];\n this._app.current.formatters = formatters; \n } else {\n this._app.current.formatters = null;\n }\n }\n\n getAnnotationById = annotationId => {\n const a = this._app.current.getAnnotationById(annotationId);\n return a?.underlying;\n }\n\n getAnnotations = () => {\n const annotations = this._app.current.getAnnotations();\n return annotations.map(a => a.underlying);\n }\n\n getAnnotationsIntersecting = annotationOrId =>\n this._app.current.getAnnotationsIntersecting(this._wrap(annotationOrId));\n\n getImageSnippetById = annotationId =>\n this._app.current.getImageSnippetById(annotationId);\n\n getSelected = () => {\n const selected = this._app.current.getSelected();\n return selected?.underlying;\n }\n \n getSelectedImageSnippet = () =>\n this._app.current.getSelectedImageSnippet();\n\n listDrawingTools = () =>\n this._app.current.listDrawingTools();\n\n loadAnnotations = url => fetch(url)\n .then(response => response.json()).then(annotations => {\n this.setAnnotations(annotations);\n return annotations;\n });\n\n off = (event, callback) =>\n this._emitter.off(event, callback);\n\n on = (event, handler) =>\n this._emitter.on(event, handler);\n\n once = (event, handler) =>\n this._emitter.once(event, handler);\n\n panTo = (annotationOrId, immediately) =>\n this._app.current.panTo(this._wrap(annotationOrId), immediately);\n\n get readOnly() {\n return this._app.current.readOnly;\n }\n\n set readOnly(readOnly) {\n this._app.current.readOnly = readOnly;\n }\n\n removeAnnotation = annotationOrId =>\n this._app.current.removeAnnotation(this._wrap(annotationOrId));\n\n removeDrawingTool = id =>\n this._app.current.removeDrawingTool(id);\n\n saveSelected = () =>\n this._app.current.saveSelected();\n\n selectAnnotation = annotationOrId => {\n const selected = this._app.current.selectAnnotation(this._wrap(annotationOrId));\n return selected?.underlying;\n }\n \n setAnnotations = annotations => {\n const safe = annotations || []; // Allow null for clearning all current annotations\n const webannotations = safe.map(a => new WebAnnotation(a));\n this._app.current.setAnnotations(webannotations);\n }\n\n setAuthInfo = authinfo =>\n this._env.user = authinfo;\n\n setDrawingEnabled = enable =>\n this._app.current.setDrawingEnabled(enable);\n\n setDrawingTool = shape =>\n this._app.current.setDrawingTool(shape);\n\n setServerTime = timestamp => \n this._env.setServerTime(timestamp);\n\n setVisible = visible =>\n this._app.current.setVisible(visible); \n\n updateSelected = (annotation, saveImmediately) => {\n let updated = null;\n\n if (annotation.type === 'Annotation') {\n updated = new WebAnnotation(annotation);\n } else if (annotation.type === 'Selection') {\n updated = new Selection(annotation.target, annotation.body);\n }\n \n if (updated)\n this._app.current.updateSelected(updated, saveImmediately);\n }\n\n get widgets() {\n return this._app.current.widgets;\n }\n\n set widgets(widgets) {\n this._app.current.widgets = widgets;\n }\n\n}\n\nexport default (viewer, config) =>\n new OSDAnnotorious(viewer, config); \n"],"names":["n","l","u","t","r","o","f","e","c","s","a","h","v","i","y","p","d","_","k","b","m","g","j","z","w","A","x","P","N","M","C","H","$","T","I","O","L","S","q","B","D","F","E","R","U","W","V","Z","Y","G","J","K","Q","X","nn","tn","en","rn","un","on","ln","cn","fn","name","callback","ctx","self","listener","data","evtArr","len","evts","liveEvents","ReactPropTypesSecret","ReactPropTypesSecret_1","require$$0","emptyFunction","emptyFunctionWithReset","factoryWithThrowingShims","shim","props","propName","componentName","location","propFullName","secret","err","getShim","ReactPropTypes","propTypesModule","clsx","shims","dontSetMe","findInArray","int","isFunction","isNum","array","length","func","num","getPrefix_1","browserPrefixToKey","browserPrefixToStyle","getPrefix","prefixes","_window$document","_window$document$docu","prop","style","prefix","kebabToTitleCase","str","out","shouldCapitalize","_default","_typeof","obj","domFns","addClassName","addEvent","addUserSelectStyles","createCSSTransform","createSVGTransform","getTouch","getTouchIdentifier","getTranslation","innerHeight","innerWidth","matchesSelector","matchesSelectorAndParentsTo","offsetXYFromParent","outerHeight","outerWidth","removeClassName","removeEvent","removeUserSelectStyles","_shims","_getPrefix","_interopRequireWildcard","require$$1","_getRequireWildcardCache","nodeInterop","cacheBabelInterop","cacheNodeInterop","cache","newObj","hasPropertyDescriptor","key","desc","ownKeys","object","enumerableOnly","keys","symbols","sym","_objectSpread","target","source","_defineProperty","value","matchesSelectorFunc","el","selector","method","baseNode","node","event","handler","inputOptions","options","height","computedStyle","width","evt","offsetParent","scale","isBody","offsetParentRect","controlPos","positionOffset","translation","_ref2","unitSuffix","defaultX","defaultY","identifier","doc","styleEl","selection","className","positionFns","canDragX","canDragY","createCoreData","createDraggableData","getBoundPosition","getControlPosition","snapToGrid","_domFns","draggable","bounds","cloneBounds","findDOMNode","ownerDocument","ownerWindow","boundNode","boundNodeEl","nodeStyle","boundNodeStyle","grid","pendingX","pendingY","touchIdentifier","draggableCore","touchObj","state","isStart","coreData","log_1","log","DraggableCore_1","React","_propTypes","_interopRequireDefault","_reactDom","require$$2","require$$3","_positionFns","require$$4","require$$5","_log","require$$6","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","minLen","_arrayLikeToArray","arr2","_i","_arr","_n","_d","_s","_e","_classCallCheck","instance","Constructor","_defineProperties","descriptor","_createClass","protoProps","staticProps","_inherits","subClass","superClass","_setPrototypeOf","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","Super","_getPrototypeOf","result","NewTarget","_possibleConstructorReturn","call","_assertThisInitialized","eventsFor","dragEventFor","DraggableCore","_React$Component","_super","_this","_len","args","_key","thisNode","position","coreEvent","shouldUpdate","deltaX","deltaY","_snapToGrid","_snapToGrid2","_snapToGrid3","_snapToGrid4","shouldContinue","_this$props","_this$props2","_this$props2$nodeRef","exports","_DraggableCore","_clsx2","require$$7","require$$8","_excluded","_extends","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","sourceSymbolKeys","sourceKeys","Draggable","shouldStart","uiData","newState","_getBoundPosition","_getBoundPosition2","newStateX","newStateY","controlled","_this$props$position","_this$props$nodeRef$c","_this$props$nodeRef","_clsx","children","defaultPosition","defaultClassName","defaultClassNameDragging","defaultClassNameDragged","draggableCoreProps","svgTransform","validPosition","transformOpts","_ref","prevPropsPosition","_require","EN_US","diff","idx","unit","ZH_CN","Locales","register","locale","getLocale","SEC_ARRAY","toDate","input","formatDiff","localeFunc","agoIn","totalSec","diffSec","date","relativeDate","relDate","nextInterval","rst","format","opts","sec","ATTR_TIMEAGO_TID","getDateAttribute","setTimerId","timerId","getTimerId","TIMER_POOL","clear","tid","run","minInterval","cancel","render","nodes","nodeList","en_US","zh_CN","__extends","this","extendStatics","__","__assign","__rest","toDateTime","TimeAgo","_a","live","datetime","others","React.createElement","React.PureComponent","useClickOutside","ref","onClickOutside","useEffect","toStr","isArguments","isArgs","keysShim","has","isEnumerable","hasDontEnumBug","hasProtoEnumBug","dontEnums","equalsConstructorPrototype","ctor","excludedKeys","hasAutomationEqualityBug","equalsConstructorPrototypeIfNotBuggy","isObject","isString","theKeys","skipProto","skipConstructor","implementation","slice","origKeys","originalKeys","keysWorksWithArguments","objectKeys","shams","symObj","symVal","syms","origSymbol","hasSymbolSham","hasSymbols","test","$Object","hasProto","ERROR_MESSAGE","funcType","that","bound","binder","boundLength","boundArgs","Empty","functionBind","bind","src","undefined","$SyntaxError","$Function","$TypeError","getEvalledConstructor","expressionSyntax","$gOPD","throwTypeError","ThrowTypeError","getProto","needsEval","TypedArray","INTRINSICS","errorProto","doEval","gen","LEGACY_ALIASES","hasOwn","$concat","$spliceApply","$replace","$strSlice","$exec","rePropName","reEscapeChar","stringToPath","string","first","last","match","number","quote","subString","getBaseIntrinsic","allowMissing","intrinsicName","alias","getIntrinsic","parts","intrinsicBaseName","intrinsic","intrinsicRealName","skipFurtherCaching","isOwn","part","GetIntrinsic","$defineProperty","hasPropertyDescriptors","hasPropertyDescriptors_1","concat","origDefineProperty","supportsDescriptors","defineProperty","predicate","defineProperties","map","predicates","defineProperties_1","$apply","$call","$reflectApply","$max","module","originalFunction","applyBind","callBind","$indexOf","callBound","CheckObjectCoercible","optMessage","RequireObjectCoercible","$Array","IsArray","argument","Call","argumentsList","hasMap","mapSizeDescriptor","mapSize","mapForEach","hasSet","setSizeDescriptor","setSize","setForEach","hasWeakMap","weakMapHas","hasWeakSet","weakSetHas","hasWeakRef","weakRefDeref","booleanValueOf","objectToString","functionToString","$match","$slice","$toUpperCase","$toLowerCase","$test","$join","$arrSlice","$floor","bigIntValueOf","gOPS","symToString","hasShammedSymbols","toStringTag","gPO","addNumericSeparator","sepRegex","intStr","dec","utilInspect","inspectCustom","inspectSymbol","isSymbol","objectInspect","inspect_","depth","seen","customInspect","numericSeparator","inspectString","bigIntStr","maxDepth","isArray","indent","getIndent","indexOf","inspect","from","noIndent","newOpts","isRegExp","nameOf","arrObjKeys","symString","markBoxed","isElement","attrs","wrapQuotes","xs","singleLineValues","indentedJoin","isError","isMap","mapParts","collectionOf","isSet","setParts","isWeakMap","weakCollectionOf","isWeakSet","isWeakRef","isNumber","isBigInt","isBoolean","isDate","ys","isPlainObject","protoTag","stringTag","constructorTag","tag","defaultStyle","quoteChar","remaining","trailer","lowbyte","type","size","entries","joinedEntries","baseIndent","lineJoiner","isArr","symMap","IsPropertyKey","Type","ES5Type","Get","HasProperty","fnToStr","reflectApply","badArrayLike","isCallableMarker","constructorRegex","isES6ClassFn","fnStr","tryFunctionObject","objectClass","fnClass","genClass","ddaClass","ddaClass2","ddaClass3","hasToStringTag","isIE68","isDDA","all","isCallable","strClass","IsCallable","$Math","$Number","maxSafeInteger","$abs","abs","floor","isPrimitive","getDay","tryDateObject","dateClass","isDateObject","symToStr","symStringRegex","isSymbolObject","isSymbolModule","ordinaryToPrimitive","hint","methodNames","GetMethod","es2015","exoticToPrim","toPrimitive","ToPrimitive","isRegexMarker","badStringifier","throwRegexMarker","$toString","gOPD","regexClass","isRegex","hasLastIndexDataProperty","safeRegexTest","regex","$String","ToString","mvsIsWS","leftWhitespace","rightWhitespace","zeroWidthSpace","mongolianVowelSeparator","polyfill","define","getPolyfill","boundMethod","receiver","string_prototype_trim","$RegExp","$parseInteger","regexTester","isBinary","isOctal","isInvalidHexLiteral","nonWS","nonWSregex","hasNonWS","$trim","StringToNumber","trimmed","ToNumber","_isNaN","$isNaN","_isFinite","sign","$isFinite","$sign","ToIntegerOrInfinity","integer","MAX_SAFE_INTEGER","ToLength","LengthOfArrayLike","ToObject","strValue","tryStringObject","require$$9","$split","boxedString","splitString","callbackfn","thisO","thisArg","Pk","kPresent","kValue","esArrayMethodBoxesProperly","properlyBoxesNonStrict","properlyBoxesStrict","threwException","arrayMethodBoxesProperly","boundCoercible","array_prototype_foreach","$isEnumerable","$push","entrys","object_entries","forEach","trim","warn","message","defaultReplace","split","delimiter","russianPluralGroups","lastTwo","end","defaultPluralRules","langToTypeMap","mapping","ret","entry","langs","lang","pluralTypeName","pluralRules","langToPluralType","pluralTypeIndex","pluralType","count","createMemoizedPluralTypeNameSelector","localePluralTypeStorage","escape","token","constructTokenRegex","suffix","memoizedPluralTypeName","defaultTokenRegex","transformPhrase","phrase","substitutions","tokenRegex","replaceImplementation","interpolationRegex","replace","pluralRulesOrDefault","texts","bestLocale","pluralTypeWithCount","expression","Polyglot","newLocale","morePhrases","prefixedKey","newPhrases","onMissingKey","nodePolyglot","ar","timeTypes","formatTime","default_1","index","timeStr","cs","inflectionIndex","isInflectionNeeded","de","es","fi","fr","gl","hi_IN","it","ja","ko","nl","pt_BR","ru","formatNum","f1","n10","seconds","minutes","hours","days","weeks","months","years","sv","th","tr","zh_TW","MESSAGES","messages_ar","messages_cs","messages_de","messages_el","messages_es","messages_fi","messages_fr","messages_gl","messages_hi","messages_it","messages_ja","messages_ko","messages_nl","messages_pt","messages_ru","messages_sv","messages_th","messages_tr","messages_ur","messages_zh_CN","messages_zh_TW","availableLocales","i18n","opt_messages","hi","pt","messages","useRef","global","factory","values","createEvent","assign","ta","heightOffset","clientWidth","cachedHeight","init","update","changeOverflow","getParentOverflows","resize","overflows","docTop","styleHeight","computed","actualHeight","pageResize","destroy","methods","autosize","getComputedStyle","word","letter","computedStyle_commonjs","lineHeight","lnHeightStr","lnHeight","_lnHeightStyle","nodeName","_node","fontSizeStr","body","lineHeight_1","PropTypes","_getLineHeight","getLineHeight","RESIZED","TextareaAutosizeClass","onChange","maxRows","async","_b","maxHeight","element","TextareaAutosize_1","TextEntryField","Component","__publicField","createRef","TextareaAutosize","sheetForTag","createStyleElement","StyleSheet","before","_proto","rule","sheet","MS","MOZ","WEBKIT","COMMENT","RULESET","DECLARATION","IMPORT","KEYFRAMES","LAYER","hash","charat","pattern","replacement","indexof","search","substr","begin","strlen","sizeof","append","combine","line","column","character","characters","root","parent","copy","char","prev","next","peek","caret","alloc","dealloc","delimit","whitespace","escaping","commenter","compile","parse","rules","rulesets","pseudo","points","declarations","offset","atrule","property","previous","variable","scanning","ampersand","reference","comment","declaration","ruleset","post","serialize","output","stringify","middleware","collection","rulesheet","memoize","arg","identifierWithPointTracking","toRules","parsed","getRules","fixedElements","compat","isImplicitRule","parentRules","removeLabel","prefixer","defaultStylisPlugins","createCache","ssrStyles","dataEmotionAttribute","stylisPlugins","inserted","container","nodesToHydrate","attrib","_insert","omnipresentPlugins","currentSheet","finalizingPlugins","serializer","stylis","styles","serialized","shouldCache","reactIsModule","reactIs","FORWARD_REF_STATICS","MEMO_STATICS","TYPE_STATICS","isBrowser","getRegisteredStyles","registered","registeredStyles","classNames","rawClassName","registerStyles","isStringTag","insertStyles","current","murmur2","unitlessKeys","hyphenateRegex","animationRegex","isCustomProperty","isProcessableValue","processStyleName","styleName","processStyleValue","p1","p2","cursor","unitless","noComponentSelectorMessage","handleInterpolation","mergedProps","interpolation","createStringFromObject","previousCursor","cached","interpolated","labelPattern","serializeStyles","stringMode","strings","identifierName","hashString","syncFallback","create","useInsertionEffect","useInsertionEffectAlwaysWithSyncFallback","hasOwnProperty","EmotionCacheContext","React.createContext","withEmotionCache","forwardRef","useContext","ThemeContext","typePropName","createEmotionProps","newProps","Insertion","Emotion","cssProp","WrappedComponent","React.useContext","React.Fragment","Emotion$1","jsx","argsLength","createElementArgArray","css","keyframes","insertable","classnames","cls","toAdd","merge","serializedArr","ClassNames","hasRendered","cx","_len2","_key2","content","ele","_taggedTemplateLiteral","raw","objectWithoutPropertiesLoose","AutosizeInput_1","_react","_react2","_propTypes2","sizerStyle","INPUT_PROPS_BLACKLIST","cleanInputProps","inputProps","field","copyStyles","isIE","generateId","AutosizeInput","_Component","id","prevProps","prevState","inputStyles","newInputWidth","extraWidth","injectStyles","sizerValue","previousValue","currentValue","wrapperStyle","inputStyle","_toPrimitive","prim","res","_toPropertyKey","toPropertyKey","setPrototypeOf","_objectSpread2","noop","applyPrefixToName","cleanValue","cleanCommonProps","innerProps","isDocumentElement","getScrollTop","scrollTo","top","getScrollParent","excludeStaticParent","overflowRx","docEl","easeOutCubic","animatedScrollTo","to","duration","start","change","increment","currentTime","animateScroll","val","scrollIntoView","menuEl","focusedEl","menuRect","focusedRect","overScroll","getBoundingClientObj","rect","isTouchCapable","isMobileDevice","passiveOptionAccessed","supportsPassiveEvents","getMenuPlacement","minHeight","placement","shouldScroll","isFixedPosition","theme","spacing","scrollParent","defaultState","_scrollParent$getBoun","scrollHeight","_menuEl$getBoundingCl","menuBottom","menuHeight","menuTop","_menuEl$offsetParent$","containerTop","viewHeight","scrollTop","marginBottom","marginTop","viewSpaceAbove","viewSpaceBelow","scrollSpaceAbove","scrollSpaceBelow","scrollDown","scrollUp","scrollDuration","constrainedHeight","_constrainedHeight","spaceAbove","_constrainedHeight2","alignToControl","placementToCSSProp","coercePlacement","menuCSS","_ref3","_ref2$theme","borderRadius","colors","_defineProperty$1","PortalPlacementContext","createContext","MenuPlacer","minMenuHeight","maxMenuHeight","menuPlacement","menuPosition","menuShouldScrollIntoView","getPortalPlacement","Menu","getStyles","innerRef","menuListCSS","_ref4","baseUnit","MenuList","isMulti","noticeCSS","_ref5","_ref5$theme","noOptionsMessageCSS","loadingMessageCSS","NoOptionsMessage","LoadingMessage","menuPortalCSS","_ref6","MenuPortal","_Component2","_super2","_this2","_ref7","initialPlacement","appendTo","controlElement","isFixed","scrollDistance","menuWrapper","createPortal","containerCSS","isDisabled","isRtl","SelectContainer","valueContainerCSS","ValueContainer","hasValue","indicatorsContainerCSS","IndicatorsContainer","_templateObject","Svg","CrossIcon","DownChevron","baseCSS","isFocused","_ref3$theme","dropdownIndicatorCSS","DropdownIndicator","clearIndicatorCSS","ClearIndicator","indicatorSeparatorCSS","_ref4$theme","IndicatorSeparator","loadingDotAnimations","loadingIndicatorCSS","LoadingDot","delay","css$2","LoadingIndicator","_ref$theme","Control","menuIsOpen","groupCSS","Group","Heading","headingProps","label","selectProps","groupHeadingCSS","GroupHeading","_cleanCommonProps","inputCSS","isHidden","Input","multiValueCSS","multiValueLabelCSS","cropWithEllipsis","multiValueRemoveCSS","MultiValueGeneric","MultiValueContainer","MultiValueLabel","MultiValueRemove","MultiValue","components","removeProps","Container","Label","Remove","emotionCx","optionCSS","isSelected","Option","placeholderCSS","Placeholder","css$1","SingleValue","defaultComponents","_arrayWithoutHoles","arrayLikeToArray","_iterableToArray","iter","_nonIterableSpread","_toConsumableArray","arrayWithoutHoles","iterableToArray","unsupportedIterableToArray","nonIterableSpread","safeIsNaN","isEqual","second","areInputsEqual","newInputs","lastInputs","memoizeOne","resultFn","lastThis","lastArgs","lastResult","calledOnce","memoized","newArgs","A11yText","defaultAriaLiveMessages","isSearchable","tabSelectsValue","context","action","_props$label","_props$focused","focused","_props$label2","selectValue","getArrayIndex","item","disabled","status","inputValue","resultsMessage","LiveRegion","ariaSelection","focusedOption","focusedValue","focusableOptions","ariaLiveMessages","getOptionLabel","isOptionDisabled","screenReaderStatus","ariaLabel","ariaLive","useMemo","ariaSelected","option","removedValue","asOption","selected","onChangeProps","ariaFocused","focusMsg","onFocusProps","ariaResults","resultsMsg","ariaGuidance","guidanceMsg","ariaContext","diacritics","anyDiacritic","diacriticToBase","diacritic","stripDiacritics","memoizedStripDiacriticsForInput","trimString","defaultStringify","createFilter","config","rawInput","_ignoreCase$ignoreAcc","ignoreCase","ignoreAccents","matchFrom","candidate","DummyInput","cancelScroll","useScrollCapture","isEnabled","onBottomArrive","onBottomLeave","onTopArrive","onTopLeave","isBottom","isTop","touchStart","scrollTarget","handleEventDelta","useCallback","delta","_scrollTarget$current","clientHeight","isDeltaPositive","availableScroll","shouldCancelScroll","onWheel","onTouchStart","onTouchMove","startListening","notPassive","stopListening","STYLE_KEYS","LOCK_STYLES","preventTouchMove","allowTouchMove","preventInertiaScroll","totalScroll","currentScroll","isTouchDevice","canUseDOM","activeScrollLocks","listenerOptions","useScrollLock","_ref$accountForScroll","accountForScrollbars","originalStyles","addScrollLock","touchScrollTarget","targetStyle","currentPadding","adjustedPadding","removeScrollLock","blurSelectInput","ScrollManager","lockEnabled","_ref$captureEnabled","captureEnabled","setScrollCaptureTarget","setScrollLockTarget","targetRef","formatGroupLabel","group","getOptionValue","defaultStyles","controlHeight","menuGutter","defaultTheme","defaultProps","toCategorizedOption","_isOptionDisabled","_isOptionSelected","getOptionLabel$1","getOptionValue$1","buildCategorizedOptions","groupOrOption","groupOrOptionIndex","categorizedOptions","optionIndex","categorizedOption","isFocusable","buildFocusableOptionsFromCategorizedOptions","optionsAccumulator","buildFocusableOptions","_props$inputValue","shouldHideSelectedOptions","_filterOption","getNextFocusedValue","nextSelectValue","lastSelectValue","lastFocusedIndex","nextFocusedIndex","getNextFocusedOption","lastFocusedOption","hideSelectedOptions","instanceId","Select","_props","newValue","actionMeta","closeMenuOnSelect","_this$props3","blurInputOnSelect","deselected","newValueArray","lastSelectedValue","base","custom","openMenuOnClick","_this$props4","touches","touch","moveThreshold","_this$props5","backspaceRemovesValue","escapeClearsValue","isClearable","onKeyDown","openMenuOnFocus","_this$state","_this$props6","focusOption","_this$state2","openAtIndex","selectedIndex","direction","_this$state3","focusedIndex","lastIndex","nextFocus","pageSize","clearValue","getValue","selectOption","setValue","_this$props7","_this$props8","inputId","tabIndex","form","_this$getComponents","inputIsHidden","commonProps","ariaAttributes","_this3","_this$getComponents2","_this$props9","controlShouldRenderValue","placeholder","_this$state4","selectValues","opt","isOptionFocused","singleValue","_this$getComponents3","_this$props10","isLoading","_this$getComponents4","_this$props11","_this$getComponents5","_this$getComponents6","_this4","_this$getComponents7","_this$props12","captureMenuScroll","loadingMessage","menuPortalTarget","menuShouldBlockScroll","noOptionsMessage","onMenuScrollToTop","onMenuScrollToBottom","onHover","onSelect","optionId","menuUI","groupIndex","groupId","headingId","_message","menuPlacementProps","menuElement","_ref4$placerProps","scrollTargetRef","_this5","_this$props13","_value","_this$state5","_this$getComponents8","_this$props14","clearFocusValueOnUpdate","inputIsHiddenAfterUpdate","newMenuOptionsState","newInputIsHiddenState","manageState","SelectComponent","_class","_temp","StateManager","PURPOSES","selectedOption","ChevronDownIcon","CloseIcon","TrashIcon","isEditable","setIsEditable","useState","isMenuVisible","setIsMenuVisible","onMakeEditable","onDelete","onUpdateComment","onChangePurpose","timestamp","creatorInfo","PurposeSelect","DropdownMenu","validPurposes","isComment","matchAllPurposes","hasMatchingPurpose","isReadOnlyComment","creator","getDraftReply","existingDraft","isReply","CommentWidget","draftReply","comments","onEditReply","updated","onChangeReplyPurpose","purpose","isReadable","hasReply","Comment","annotation","_inheritsLoose","hasClass","addClass","replaceClassName","origClass","classToRemove","removeClass","forceReflow","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","parentGroup","appear","initialStatus","nextIn","nextStatus","timeout","exit","enter","mounting","ReactDOM","appearing","maybeNode","maybeAppearing","timeouts","enterTimeout","nextState","active","doesNotHaveTimeoutOrListener","maybeNextCallback","childProps","TransitionGroupContext","_addClass","classes","addOneClass","removeOneClass","CSSTransition","_this$resolveArgument","_this$resolveArgument2","_this$resolveArgument3","_this$resolveArgument4","_this$resolveArgument5","_this$resolveArgument6","isStringClassNames","baseClassName","activeClassName","doneClassName","phase","_this$getClassNames","_this$appliedClasses$","getVocabSuggestions","query","vocabulary","getFnSuggestions","suggestions","setSuggestions","highlightedIndex","setHighlightedIndex","getSuggestions","onSubmit","matchingTerm","getDraftTag","draftTag","tags","showDelete","setShowDelete","toggle","onDraftChange","toSubmit","tagValue","Autocomplete","WrappedWidget","widgetEl","saveImmediately","diffs","uri","BUILTIN_WIDGETS","TagWidget","DEFAULT_WIDGETS","isReactComponent","isClassComponent","component","isFunctionComponent","getWidget","instantiate","widget","force","MARGIN_VERTICAL","wrapperEl","editorEl","selectedEl","autoPosition","containerBounds","left","right","bottom","defaultOrientation","editorHeight","currentOrientation","shapeBottom","elem","Editor","resizeObserver","meta","user","arg1","arg2","existing","autoUpserts","toRemove","toAppend","toUpdate","updatedBodies","currentAnnotation","undraft","draft","rest","selectionBounds","nextBounds","widgets","isReadOnlyWidget","hasDelete","getRandomValues","rnds8","rng","validate","uuid","REGEX","byteToHex","v4","buf","rnds","fastDeepEqual","equal","_WebAnnotation","opt_props","opt_opts","other","equals","bodies","WebAnnotation","stub","Selection","cloned","serverTimeDifference","serverNow","browserNow","serverTime","setLocale","fallback","foundLocale","_l","I18n","OpenSeadragon","class2type","toString","lastKey","canvasElement","canvas","isTainted","supported","devicePixelRatio","backingStoreRatio","copyIsArray","clone","deep","isIOSDevice","userAgent","getOffsetParent","docElement","win","boundingRect","memo","modulo","point","scroll","originalScroll","wrappers","tagName","img","opacity","usesAlpha","ieOpacity","ieFilter","searchElement","fromIndex","pivot","oldClasses","newClasses","eventName","initialArgs","URLPARAMS","url","local","supportActiveX","onSuccess","onError","withCredentials","headers","responseType","protocol","request","headerName","script","head","jsonpCallback","callbackParam","response","isAbort","xmlDoc","parser","extension","FILEFORMATS","formats","nullfunction","msg","ver","ua","sep","requestAnimationFrame","cancelAnimationFrame","aAnimQueue","processing","iRequestId","iIntervalId","time","temp","requestId","fullScreenApi","userData","times","onceHandler","events","handlers","eventType","eventArgs","THIS","onClick","onDblClick","onKeyUp","onKeyPress","onFocus","onBlur","onContextMenu","onMouseWheel","onLoseCapture","onPointerEnter","onPointerLeave","onPointerOver","onPointerOut","onPointerDown","onPointerUp","onPointerMove","onTouchEnd","onTouchCancel","onGestureStart","onGestureChange","onGotPointerCapture","onLostPointerCapture","onPointerCancel","onPointerUpCaptured","onPointerMoveCaptured","stopTracking","track","startTracking","delegate","list","isInIframe","canAccessEvents","trackerPoints","intervalId","lastTime","_generateGuid","tracker","gPoint","_doTracking","trackPoint","now","elapsedTime","distance","speed","addPoint","guid","removePoint","divElement","gp","clearTrackedPointers","pointsList","gPoints","gPointsToRemove","pointerListCount","stopTrackingPointer","getCaptureEventParams","pointerType","capturePointer","eventParams","updatePointerCaptured","releasePointer","cachedGPoint","getPointerId","getPointerType","getIsPrimary","getMouseAbsolute","getMouseRelative","getPointRelativeToAbsolute","getCenterPoint","point1","point2","eventInfo","preProcessEvent","handleWheelEvent","simulatedEvent","originalEvent","nDelta","touchCount","updatePointerEnter","updatePointerDown","updatePointerUp","updatePointerLeave","updatePointerMove","updatePointerCancel","updatePointerOver","updatePointerOut","implicitlyCaptured","handlePointerUp","handlePointerMove","startTrackingPointer","listLength","trackedGPoint","getEventProcessDefaults","isCaptured","updateGPoint","dispatchEventObj","buttonChanged","releasePoint","releaseTime","wasCaptured","quick","gPointArray","handlePointerStop","originalMoveEvent","visible","layouts","layout","controlOptions","div","getControlIndex","enabled","dock","controls","nextHash","onCanvasContextMenu","onCanvasKeyDown","onCanvasKeyPress","onCanvasClick","onCanvasDblClick","onCanvasDrag","onCanvasDragEnd","onCanvasEnter","onCanvasLeave","onCanvasPress","onCanvasRelease","onCanvasNonPrimaryPress","onCanvasNonPrimaryRelease","onCanvasScroll","onCanvasPinch","onContainerEnter","onContainerLeave","_getSafeElemSize","scheduleUpdate","updateMulti","beginControlsAutoHide","dzi","tileSource","tileSources","initialPage","expected","successes","failures","failEvent","checkCompletion","getOverlayObject","doOne","originalSuccess","originalError","abortControlsAutoHide","debugMode","fullPage","bodyStyle","docStyle","fullPageEventArgs","restoreScrollCounter","restoreScroll","pageScroll","fullScreen","fullScreeEventArgs","onFullScreenChange","isFullScreen","myQueueItem","raiseAddItemFailed","refreshWorld","theItem","processReadyItems","queueItem","tiledImage","optionsClone","newIndex","getTileSourceImplementation","level","drawer","onFocusHandler","onBlurHandler","onNextHandler","onPreviousHandler","navImages","useGroup","resolveUrl","beginZoomingInHandler","beginZoomingIn","endZoomingHandler","endZooming","doSingleZoomInHandler","doSingleZoomIn","beginZoomingOutHandler","beginZoomingOut","doSingleZoomOutHandler","doSingleZoomOut","onHomeHandler","onHome","onFullScreenHandler","onFullScreen","onRotateLeftHandler","onRotateLeft","onRotateRightHandler","onRotateRight","onFlipHandler","onFlip","buttons","lightUp","page","onDraw","getOverlayIndex","overlay","previusPixelDensityRatio","currentPixelDensityRatio","oElement","viewer","imgOptions","successCallback","failCallback","tileSourceJ","waitUntilReady","originalTileSource","customTileSource","$TileSource","overlays","updateFunc","scheduleControlsFade","updateControlsFade","deltaTime","canvasKeyDownEventArgs","canvasKeyPressEventArgs","gestureSettings","haveKeyboardFocus","canvasClickEventArgs","canvasDblClickEventArgs","canvasDragEventArgs","constrainedBounds","canvasDragEndEventArgs","amplitudeX","amplitudeY","center","centerPt","lastCenterPt","panByPt","canvasPinchEventArgs","angle1","angle2","canvasScrollEventArgs","factor","thisScrollTime","deltaScrollTime","updateOnce","containerSize","prevContainerSize","viewport","resizeRatio","zoom","oldBounds","viewportChange","animated","drawWorld","scheduleZoom","doZoom","adjustedFactor","currRotation","viewerSize","navigatorSize","borderWidth","rotate","degrees","_setTransformRotate","theirItem","myItem","setElementTransform","newWidth","newHeight","topleft","bottomright","original","matchBounds","matchOpacity","matchCompositeOperation","immediately","I18N","capture","cos","sin","angle","tileSize","tileOverlap","minLevel","maxLevel","levelScaleCache","_level","imageSizeScaled","rx","ry","tiles","validPoint","widthScaled","pixelX","pixelY","EPSILON","isSource","dimensionsScaled","tileWidth","tileHeight","px","py","sx","sy","callbackName","readySource","urlParts","filename","lastDot","xhr","processResponse","exc","formattedExc","numTiles","responseText","statusText","tilesUrl","fileFormat","displayRects","ns","configureFromObject","configureFromXML","rects","xMin","yMin","xMax","yMax","rootName","configuration","dispRectNodes","dispRectNode","rectNode","sizeNode","messageNode","imageData","sizeData","dispRectData","rectData","sf","scaleFactor","canBeTiled","shortDim","tileOptions","smallerTiles","constructLevels","maxScaleFactor","configureFromXml10","levelScale","IIIF_ROTATION","levelWidth","levelHeight","iiifTileSizeWidth","iiifTileSizeHeight","iiifRegion","iiifTileX","iiifTileY","iiifTileW","iiifTileH","iiifSize","iiifSizeW","iiifSizeH","iiifQuality","level0Profiles","profileLevel","isLevel0","hasCanoncicalSizeFeature","levels","parseXML10","bufferedWidth","bufferedHeight","max","yTiles","currentImageSize","filterFiles","dataUrl","files","filtered","file","conf","image","currentWidth","currentHeight","bigCanvas","bigContext","smallCanvas","smallContext","rows","inTo","outTo","scheduleFade","button","updateFade","beginFading","stopFading","newTopLeft","topLeft","topRight","bottomLeft","radians","thisBoundingBox","otherBoundingBox","intersectionPoints","thisTopLeft","thisTopRight","thisBottomLeft","thisBottomRight","rectTopLeft","rectTopRight","rectBottomLeft","rectBottomRight","thisSegments","rectSegments","thisSegment","rectSegment","intersect","getIntersection","abVector","cdVector","denom","minX","maxX","minY","maxY","bottomRight","newTopRight","boundingBox","epsilon","topDiff","leftDiff","onStripClick","onStripDrag","onStripScroll","onStripEnter","onStripLeave","loadPanels","scrollWidth","offsetLeft","offsetTop","strip","panelSize","activePanelsStart","activePanelsEnd","miniViewer","miniTileSource","startValue","targetValue","transform","oldValue","stiffness","ImageJob","selfAbort","blb","BlobBuilder","bb","successful","complete","job","completeJob","jobOptions","newJob","loader","nextJob","exists","context2D","loadWithAjax","ajaxHeaders","sourceBounds","drawingHandler","translate","rendered","sourceWidth","sourceHeight","canvasSize","sketchCanvasSize","properties","transformOriginProp","transformProp","positionAndSize","scaledSize","eltSize","refPoint","viewportSize","vpPoint","polygons","useSketch","polygon","coord","world","maxOpacity","rectangle","tile","resizeSketchCanvas","fillStyle","compositeOperation","widthExt","heightExt","widthDiff","heightDiff","colorIndex","tileCenterX","tileCenterY","imageSmoothingEnabled","sketch","pixelDensityRatio","contentSize","contentFactor","aspectFactor","homeZoom","margins","centerCurrent","centerTarget","oldZoomPixel","newZoomPixel","deltaZoomPixels","deltaZoomPoints","newBounds","horizontalThreshold","boundsRight","contentRight","leftDx","rightDx","verticalThreshold","boundsBottom","contentBottom","topDy","bottomDy","actualZoom","constrainedZoom","constraints","aspect","newZoom","newBoundsAspectRatio","newConstrainedZoom","oldZoom","referencePoint","box","newContainerSize","maintain","widthDeltaFactor","changed","zoomSpringHandler","deltaPoints","deltaPixels","pixel","viewerX","viewerY","imageX","imageY","pixelWidth","pixelHeight","coordA","coordB","pointWidth","pointHeight","viewerCoordinates","viewportZoom","imageWidth","containerWidth","viewportToImageZoomRatio","imageZoom","fitBounds","fitBoundsPlacement","flag","xUpdated","yUpdated","scaleUpdated","degreesUpdated","worldWidth","ratio","clip","xMod","yMod","sameTarget","isXYObject","objectToSimpleXYObject","objs","anchor","anchorProperties","aspectRatio","xOffset","yOffset","displayedWidthRatio","displayedHeightRatio","marginLeft","newClip","flip","preload","lowestLevel","currentZeroRatio","highestLevel","drawArea","tiledImageBounds","levelsInterval","bestTile","haveDrawn","drawLevel","currentRenderPixelRatio","targetRenderPixelRatio","targetZeroRatio","optimalRatio","levelOpacity","levelVisibility","updateLevel","providesCoverage","drawTiles","loadTile","topLeftBound","bottomRightBound","leftX","rightX","topY","bottomY","topLeftTile","bottomRightTile","best","resetCoverage","cornerTiles","numberOfTiles","viewportCenter","flippedX","updateTile","getTile","drawTile","setCoverage","loadingCoverage","isCovered","positionTile","setTileLoaded","imageRecord","needsDraw","blendTile","compareTiles","tilesMatrix","worldHeight","errorMsg","tileRequest","onTileLoad","finish","cutoff","getCompletionCallback","completionCallback","overlap","boundsTL","boundsSize","positionC","positionT","sizeC","sizeT","tileCenter","tileSquaredDistance","blendTimeMillis","coverage","cols","covers","previousBest","lastDrawn","sketchScale","sketchTranslate","usedClip","clipRect","clipPoint","placeholderRect","drawDebugInfo","TileRecord","ImageRecord","renderedContext","insertionIndex","worstTile","worstTileIndex","worstTileRecord","prevTile","worstTime","worstLevel","prevTime","prevLevel","prevTileRecord","tileRecord","cacheKey","oldIndex","removedItems","columns","tileMargin","wrap","oldHomeBounds","oldContentSize","oldContentFactor","clippedBounds","SVG_NAMESPACE","getClassNames","attr","parseRectFragment","coords","toPixelRectFragment","toPercentRectFragment","pw","ph","toRectFragment","fragmentUnit","setXYWH","shape","setPointXY","drawRectMask","imageDimensions","mask","naturalWidth","naturalHeight","setRectMaskSize","drawRect","arg3","arg4","outerPoint","innerPoint","outerRect","innerRect","getRectSize","outer","setRectSize","inner","rectArea","RubberbandRect","anchorX","anchorY","env","oppositeX","oppositeY","SIM_EVENTS","enableTouchTranslation","pressAndHoldTrigger","simulateEvent","touchHandler","IMPLEMENTATION_MISSING","isTouch","ToolLike","EventEmitter","svgBounds","bbox","containerGroup","drawCircle","radius","handle","Tool","mouseMove","mouseUp","dblClick","startOnSingleClick","startX","startY","formatters","EditableShape","isFirefox","formatSvgEl","svgEl","appendFormatterEl","formatterEl","merged","elements","setFormatterElSize","CORNER","EDGE","EditableRect","topright","bottomleft","topEdge","rightEdge","bottomEdge","leftEdge","draggedHandleIdx","anchorHandle","mousePos","handleIdx","oppositeHandle","currentRectDims","isHeightAdjustment","grabbedElem","pos","constrain","edgeHandles","RubberbandRectTool","constrainX","constrainY","minWidth","fragmentSelector","polygonArea","area","pointInCircle","cy","dx","dy","pointInEllipse","rotation","rot","tdx","tdy","pointInPolygon","xy","inside","xi","yi","xj","yj","polygonInPolygon","polygonA","polygonB","pointInLine","x1","y1","x2","y2","buffer","svgPathToPolygons","path","commands","cmd","op","isUppercase","insertSVGNamespace","originalDoc","namespaced","sanitize","cleanEl","scripts","svgFragmentToShape","isPrefixDeclared","isDefaultNamespaceSVG","drawEmbeddedSVG","toSVGTarget","svgArea","svgPolygonArea","svgCircleArea","svgEllipseArea","svgPathArea","circle","ellipse","isHole","poly","PolygonMask","RubberbandPolygon","rubberband","lastCorner","Mask","getPoints","pointList","getBBox","EditablePolygon","round","updatedPoints","RubberbandPolygonTool","ToolRegistry","impl","toolOrId","renderedVia","drawFn","areaFn","getFirstSelector","firstTarget","drawShape","shapeArea","Crosshair","constructor","document","createElementNS","setAttribute","appendChild","parentElement","onMove","offsetX","offsetY","offsetWidth","offsetHeight","addEventListener","quickselect","compare","quickselectStep","defaultCompare","sd","newLeft","newRight","swap","tmp","RBush","maxEntries","intersects","toBBox","nodesToSearch","child","childBBox","contains","tmpNode","createNode","equalsFn","indexes","goingUp","findItem","items","calcBBox","N2","N1","multiSelect","right2","right3","minArea","minEnlargement","targetNode","bboxArea","enlargement","enlargedArea","isNode","insertPath","extend","splitIndex","newNode","minOverlap","bbox1","distBBox","bbox2","intersectionArea","compareMinX","compareNodeMinX","compareMinY","compareNodeMinY","xMargin","yMargin","leftBBox","rightBBox","margin","bboxMargin","siblings","destNode","stack","mid","getBounds","targets","svg","removeChild","getSelectorType","Array","pointInSVGShape","toLowerCase","getAttribute","find","parseInt","AnnotationStore","spatial_index","getAnnotationAt","exactHits","filter","selectorType","sort","getAnnotationsIntersecting","annotationOrBounds","isBounds","intersecting","insert","remove","store","getSnippet","outerBounds","closest","querySelector","getBoundingClientRect","canvasBounds","kx","ky","snippet","createElement","getContext","drawImage","viewerElementToImageCoordinates","Point","viewportToImageZoom","getZoom","AnnotationLayer","_getShapeAt","getSVGPoint","createSVGPoint","window","TouchEvent","clientX","clientY","matrixTransform","getScreenCTM","inverse","getCTM","currentScale","findShape","_initDrawingTools","gigapixelMode","started","firstDragDone","dragging","tools","DrawingTools","onDrawingComplete","mouseTracker","MouseTracker","preProcessEventHandler","info","preventDefault","preventGesture","selectedShape","dispatchEvent","pressHandler","isDrawing","drawOnSingleClick","hoveredShape","scaleTool","moveHandler","stopPropagation","onMouseMove","emit","onDragStart","releaseHandler","onMouseUp","onDragEnd","hotkey","inverted","removeEventListener","readOnly","_initMouseEvents","lastMouseDown","addHandler","Date","getTime","disableSelect","preventDefaultAction","selectShape","deselect","_lazy","getItemAt","onLoad","removeHandler","_refreshNonScalingAnnotations","querySelectorAll","addAnnotation","optBuffer","scaleFormatterElements","addDrawingTool","plugin","registerTool","addOrUpdateAnnotation","isSelection","removeAnnotation","getContainerSize","getContentFactor","stop","parentNode","annotationOrId","_fit","padding","paddingRelative","Math","min","padX","padY","padW","padH","imageToViewportRectangle","fitBoundsWithConstraints","getAnnotations","getImageSnippetById","annotationId","getSelectedImageSnippet","annotations","console","loaded","display","timeEnd","listDrawingTools","listTools","overrideId","originalId","forcedId","panTo","scrollX","scrollY","windowToViewportCoordinates","removeDrawingTool","unregisterTool","opt_shape","firstChild","tool","onScaleChanged","selectAnnotation","skipEvent","headless","toolForAnnotation","forAnnotation","setTimeout","createEditableShape","editableShapeMouseTracker","setTracking","fragment","setDrawingEnabled","enable","setDrawingTool","setCurrent","setVisible","stopDrawing","formatter","dimensions","URL","baseURI","href","crosshair","flipped","getFlip","pixelFromPoint","_containerInnerSize","scaleY","scaleX","getRotation","OSDAnnotationLayer","currentTransform","extent","viewportToImageRectangle","viewportTargetToImage","transformed","polygonTargetToImage","circleTargetToImage","ellipseTargetToImage","pathTargetToImage","outerHTML","XMLSerializer","serializeToString","xP","yP","wP","hP","join","parseFloat","substring","toUpperCase","imageAnnotationToViewport","polygonAnnotationToViewport","circleAnnotationToViewport","ellipseAnnotationToViewport","pathAnnotationToViewport","updatedX","updatedY","refreshViewportPosition","refreshRectFragment","refreshSvg","parsedShape","refreshPolygon","refreshCircle","refreshEllipse","refreshPath","imageShape","GigapixelAnnotationLayer","shapeBounds","viewerElementToViewportRectangle","Rect","getXY","viewerElementToViewportCoordinates","viewportToImageCoordinates","reprojected","projected","updateState","projectedTarget","OpenSeadragonAnnotator","clearState","setState","selectedAnnotation","selectedDOMElement","modifiedTarget","beforeHeadlessModify","opt_callback","forwardEvent","annotationLayer","which","cancelSelected","onCancelSelected","disableDeleteKey","onCancelAnnotation","onDeleteAnnotation","handleStartSelect","onSelectionStarted","handleEndSelect","onSelectionEnded","handleSelect","editorDisabled","onHeadlessSelect","onNormalSelect","select","onSelectionCreated","onAnnotationSelected","saveSelected","then","handleUpdateTarget","JSON","onSelectionTargetChanged","handleViewportChange","overrideAnnotationId","originalAnnotation","onCreateOrUpdateAnnotation","toAnnotation","onAnnotationDeleted","Promise","resolve","getAnnotationById","getSelected","_editor","getCurrentAnnotation","onOk","allowEmpty","setAnnotations","updateSelected","disableEditor","componentDidMount","componentWillUnmount","disable","open","_jsx","detachable","selectedElement","onAnnotationCreated","onAnnotationUpdated","onCancel","OSDAnnotorious","handleAnnotationCreated","_emitter","underlying","handleAnnotationDeleted","handleAnnotationSelected","handleAnnotationUpdated","handleCancelSelected","handleClickAnnotation","handleLoad","handleSelectionCreated","handleSelectionStarted","handleSelectionEnded","handleSelectionTargetChanged","handleMouseEnterAnnotation","handleMouseLeaveAnnotation","_wrap","_app","clearAnnotations","clearAuthInfo","_env","unmountComponentAtNode","appContainerEl","loadAnnotations","fetch","json","off","once","webannotations","setAuthInfo","authinfo","setServerTime","Emitter","createEnvironment","_element","getPropertyValue","onClickAnnotation","onMouseEnterAnnotation","onMouseLeaveAnnotation"],"mappings":"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AAS,yKACX,EAAG,CACD,KAAM,IACN,QAAS,iCACX,EAAG,CACD,KAAM,IACN,QAAS,uFACX,EAAG,CACD,KAAM,IACN,QAAS,iFACX,EAAG,CACD,KAAM,IACN,QAAS,6GACX,EAAG,CACD,KAAM,IACN,QAAS,2BACX,EAAG,CACD,KAAM,IACN,QAAS,iFACX,EAAG,CACD,KAAM,IACN,QAAS,yGACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,IACN,QAAS,6CACX,EAAG,CACD,KAAM,IACN,QAAS,2FACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,IACN,QAAS,mPACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,IACN,QAAS,yDACX,EAAG,CACD,KAAM,IACN,QAAS,iCACX,EAAG,CACD,KAAM,IACN,QAAS,mGACX,EAAG,CACD,KAAM,IACN,QAAS,mGACX,EAAG,CACD,KAAM,IACN,QAAS,uFACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,IACN,QAAS,iMACX,EAAG,CACD,KAAM,IACN,QAAS,6CACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,IACN,QAAS,yDACX,EAAG,CACD,KAAM,IACN,QAAS,2BACX,EAAG,CACD,KAAM,IACN,QAAS,qFACX,EAAG,CACD,KAAM,IACN,QAAS,iFACX,EAAG,CACD,KAAM,IACN,QAAS,mMACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,KACN,QAAS,kBACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,KACN,QAAS,cACX,EAAG,CACD,KAAM,KACN,QAAS,QACX,EAAG,CACD,KAAM,IACN,QAAS,mDACX,EAAG,CACD,KAAM,IACN,QAAS,y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"} \ No newline at end of file diff --git a/script/openseadragon/annotorious.min.css b/script/openseadragon/annotorious.min.css new file mode 100644 index 0000000..2c889d8 --- /dev/null +++ b/script/openseadragon/annotorious.min.css @@ -0,0 +1 @@ +.r6o-editor{top:0;left:0;margin-left:-19px}.a9s-annotationlayer{position:absolute;top:0;left:0;width:100%;height:100%;outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.a9s-annotationlayer.no-cursor,.a9s-annotationlayer.no-cursor *{cursor:none!important}.a9s-crosshair line{stroke-width:1px;stroke:#00000080;pointer-events:none;vector-effect:non-scaling-stroke;shape-rendering:crispEdges}.a9s-selection-mask{stroke:none;fill:transparent;pointer-events:none}.a9s-annotation rect,.a9s-annotation circle,.a9s-annotation ellipse,.a9s-annotation path,.a9s-annotation polygon,.a9s-annotation line,.a9s-selection rect,.a9s-selection circle,.a9s-selection ellipse,.a9s-selection path,.a9s-selection polygon,.a9s-selection line{fill:transparent;cursor:pointer;vector-effect:non-scaling-stroke}.a9s-annotation .a9s-inner,.a9s-selection .a9s-inner{stroke:#fff;stroke-width:1px;fill:transparent}.a9s-annotation .a9s-inner:hover,.a9s-selection .a9s-inner:hover{stroke:#fff000}.a9s-annotation .a9s-outer,.a9s-selection .a9s-outer{stroke:#000000b3;stroke-width:3px;fill:none}.a9s-annotation .a9s-formatter-el,.a9s-selection .a9s-formatter-el{overflow:visible}.a9s-annotation.a9s-point .a9s-inner{display:none}.a9s-annotation.a9s-point .a9s-outer{stroke:#5a5a5a;stroke-width:1.5px;fill:#ffffff80}.a9s-annotation.a9s-point .a9s-outer:hover{fill:#fff000}.a9s-annotation.selected .a9s-inner,.a9s-selection .a9s-inner{stroke:#fff000}.a9s-annotation.editable .a9s-inner{stroke:#fff000;cursor:move!important}.a9s-annotation.editable .a9s-inner:hover{fill:#fff0001a}.a9s-handle{cursor:move}.a9s-handle .a9s-handle-inner{stroke:#fff000;fill:#000}.a9s-handle .a9s-handle-outer{stroke:#000;fill:#fff}.a9s-handle:hover .a9s-handle-inner{fill:#fff000}.r6o-btn{background-color:#4483c4;border:1px solid #4483c4;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-size:14px;margin:0;outline:none;text-decoration:none;white-space:nowrap;padding:6px 18px;min-width:70px;vertical-align:middle;-webkit-border-radius:2px;-khtml-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.r6o-btn *{vertical-align:middle;cursor:pointer}.r6o-btn .r6o-icon{margin-right:4px}.r6o-btn:disabled{border-color:#a3c2e2!important;background-color:#a3c2e2!important}.r6o-btn:hover{background-color:#4f92d7;border-color:#4f92d7}.r6o-btn.outline{border:1px solid #4483c4;color:#4483c4;background-color:transparent;text-shadow:none}.r6o-autocomplete{display:inline;position:relative}.r6o-autocomplete div[role=combobox]{display:inline}.r6o-autocomplete input{outline:none;border:none;width:80px;height:100%;line-height:14px;white-space:pre;box-sizing:border-box;background-color:transparent;font-size:14px;color:#3f3f3f}.r6o-autocomplete ul{position:absolute;margin:0;padding:0;list-style-type:none;background-color:#fff;border-radius:3px;border:1px solid #d6d7d9;box-sizing:border-box;box-shadow:0 0 20px #00000040}.r6o-autocomplete ul:empty{display:none}.r6o-autocomplete li{box-sizing:border-box;padding:2px 12px;width:100%;cursor:pointer}.r6o-editable-text{max-height:120px;overflow:auto;outline:none;min-height:2em;font-size:14px;font-family:Lato,sans-serif}.r6o-editable-text:empty:not(:focus):before{content:attr(data-placeholder);color:#c2c2c2}.r6o-widget.comment{font-size:14px;min-height:3em;background-color:#fff;position:relative}.r6o-widget.comment .r6o-editable-text,.r6o-widget.comment .r6o-readonly-comment{padding:10px;width:100%;box-sizing:border-box;outline:none;border:none;background-color:transparent;resize:none}.r6o-widget.comment .r6o-readonly-comment{white-space:pre-line}.r6o-widget.comment .r6o-editable-text::-webkit-input-placeholder{color:#c2c2c2}.r6o-widget.comment .r6o-editable-text::-moz-placeholder{color:#c2c2c2}.r6o-widget.comment .r6o-editable-text:-moz-placeholder{color:#c2c2c2}.r6o-widget.comment .r6o-editable-text:-ms-input-placeholder{color:#c2c2c2}.r6o-widget.comment .r6o-lastmodified{border:1px solid #e5e5e5;display:inline-block;border-radius:2px;margin:0 10px 8px;padding:4px 5px;line-height:100%;font-size:12px}.r6o-widget.comment .r6o-lastmodified .r6o-lastmodified-at{color:#757575;padding-left:3px}.r6o-widget.comment .r6o-arrow-down{position:absolute;height:20px;width:20px;top:9px;right:9px;line-height:22px;background-color:#fff;text-align:center;-webkit-font-smoothing:antialiased;border:1px solid #e5e5e5;cursor:pointer;-webkit-border-radius:1px;-khtml-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.r6o-widget.comment .r6o-arrow-down.r6o-menu-open{border-color:#4483c4}.r6o-widget.comment .r6o-comment-dropdown-menu{position:absolute;top:32px;right:8px;background-color:#fff;border:1px solid #e5e5e5;list-style-type:none;margin:0;padding:5px 0;z-index:9999;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px #0003}.r6o-widget.comment .r6o-comment-dropdown-menu li{padding:0 15px;cursor:pointer}.r6o-widget.comment .r6o-comment-dropdown-menu li:hover{background-color:#ecf0f1}.r6o-widget.comment .r6o-purposedropdown{position:relative;z-index:2}.r6o-widget.comment.editable{background-color:#ecf0f1}.r6o-widget.r6o-tag:empty{display:none}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.r6o-widget.tag .r6o-taglist li{height:27px}.r6o-widget.tag .r6o-taglist li .r6o-delete-wrapper .r6o-delete{position:relative;top:-4px}}.r6o-widget.r6o-tag{background-color:#ecf0f1;border-bottom:1px solid #e5e5e5;padding:1px 3px;display:flex}.r6o-widget.r6o-tag ul{margin:0;padding:0;list-style-type:none;z-index:1}.r6o-widget.r6o-tag ul.r6o-taglist{flex:0;white-space:nowrap}.r6o-widget.r6o-tag ul.r6o-taglist li{display:inline-block;margin:1px 1px 1px 0;padding:0;vertical-align:middle;overflow:hidden;font-size:12px;background-color:#fff;border:1px solid #d6d7d9;cursor:pointer;position:relative;line-height:180%;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-border-radius:2px;-khtml-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 4px rgba(0,0,0,.1);-moz-box-shadow:0 0 4px rgba(0,0,0,.1);box-shadow:0 0 4px #0000001a}.r6o-widget.r6o-tag ul.r6o-taglist li .r6o-label{padding:2px 8px;display:inline-block}.r6o-widget.r6o-tag ul.r6o-taglist li .r6o-delete-wrapper{display:inline-block;padding:2px 0;color:#fff;width:0;height:100%;background-color:#4483c4;-webkit-border-top-right-radius:2px;-webkit-border-bottom-right-radius:2px;-khtml-border-radius-topright:2px;-khtml-border-radius-bottomright:2px;-moz-border-radius-topright:2px;-moz-border-radius-bottomright:2px;border-top-right-radius:2px;border-bottom-right-radius:2px}.r6o-widget.r6o-tag ul.r6o-taglist li .r6o-delete-wrapper .r6o-delete{padding:2px 6px}.r6o-widget.r6o-tag ul.r6o-taglist li .r6o-delete-wrapper svg{vertical-align:text-top}.r6o-widget.r6o-tag ul.r6o-taglist li .r6o-delete-enter-active{width:24px;transition:width .2s}.r6o-widget.r6o-tag ul.r6o-taglist li .r6o-delete-enter-done,.r6o-widget.r6o-tag ul.r6o-taglist li .r6o-delete-exit{width:24px}.r6o-widget.r6o-tag ul.r6o-taglist li .r6o-delete-exit-active{width:0;transition:width .2s}.r6o-widget.r6o-tag .r6o-autocomplete{flex:1;position:relative}.r6o-widget.r6o-tag .r6o-autocomplete li{font-size:14px}.r6o-widget.r6o-tag input{width:100%;padding:0 3px;min-width:80px;outline:none;border:none;line-height:170%;background-color:transparent;color:#3f3f3f}.r6o-widget.r6o-tag input::-webkit-input-placeholder{color:#c2c2c2}.r6o-widget.r6o-tag input::-moz-placeholder{color:#c2c2c2}.r6o-widget.r6o-tag input:-moz-placeholder{color:#c2c2c2}.r6o-widget.r6o-tag input:-ms-input-placeholder{color:#c2c2c2}.r6o-editor{position:absolute;z-index:99999;width:400px;color:#3f3f3f;opacity:0;font-family:Lato,sans-serif;font-size:17px;line-height:27px;-webkit-transition:opacity .2s ease-in;-moz-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.r6o-editor .r6o-arrow{position:absolute;overflow:hidden;top:-12px;left:12px;width:28px;height:12px;display:none}.r6o-editor .r6o-arrow:after{content:"";position:absolute;top:5px;left:5px;width:18px;height:18px;background-color:#fff;-webkit-backface-visibility:hidden;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.r6o-editor .r6o-editor-inner{background-color:#fff;-webkit-border-radius:2px;-khtml-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:2px 2px 42px rgba(0,0,0,.4);-moz-box-shadow:2px 2px 42px rgba(0,0,0,.4);box-shadow:2px 2px 42px #0006}.r6o-editor .r6o-editor-inner .r6o-widget:first-child{-webkit-border-top-left-radius:2px;-webkit-border-top-right-radius:2px;-khtml-border-radius-topleft:2px;-khtml-border-radius-topright:2px;-moz-border-radius-topleft:2px;-moz-border-radius-topright:2px;border-top-left-radius:2px;border-top-right-radius:2px}.r6o-editor .r6o-editor-inner .r6o-widget{border-bottom:1px solid #e5e5e5}.r6o-editor .r6o-footer{position:relative;text-align:right;padding:8px 0}.r6o-editor .r6o-footer .r6o-btn{margin-right:8px}.r6o-editor .r6o-footer .r6o-btn.delete-annotation{position:absolute;top:7px;left:7px;background-color:transparent;border:none;color:#4483c4;width:32px;height:32px;min-width:0;border-radius:100%;padding:0;display:flex;justify-content:center;align-items:center;-webkit-transition:all .1s ease-in;-moz-transition:all .1s ease-in;-o-transition:all .1s ease-in;transition:all .1s ease-in}.r6o-editor .r6o-footer .r6o-btn.delete-annotation:hover{color:#fff;background-color:#ef352c}@media (max-width: 640px){.r6o-editor{width:260px}}.r6o-editor.r6o-arrow-top .r6o-arrow{display:block}.r6o-editor.r6o-arrow-right{margin-left:8px}.r6o-editor.r6o-arrow-right .r6o-arrow{left:auto;right:12px}.r6o-editor.r6o-arrow-bottom .r6o-arrow{display:block;top:auto;bottom:-12px}.r6o-editor.r6o-arrow-bottom .r6o-arrow:after{top:-11px;box-shadow:none}.r6o-editor.pushed .r6o-arrow,.r6o-editor.dragged .r6o-arrow{display:none}.r6o-editor .r6o-draggable{cursor:move}.r6o-purposedropdown{width:150px;display:inline-block}.r6o-noselect{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.a9s-annotation.hover .a9s-inner{stroke:#fff000}.a9s-annotation:not(.hover):hover .a9s-inner{stroke:#fff}.a9s-osd-crosshair-container{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;pointer-events:none} diff --git a/script/openseadragon/changelog.txt b/script/openseadragon/changelog.txt new file mode 100644 index 0000000..98937a0 --- /dev/null +++ b/script/openseadragon/changelog.txt @@ -0,0 +1,656 @@ +OPENSEADRAGON CHANGELOG +======================= + +4.1.0: + +* NEW BEHAVIOR: When `navigatorRotate` is false, while the navigator image doesn't rotate, the red outline now does (#2356 @lcl45) +* The viewer no longer emits `canvas-key` events for both keydown and keypress events; canvas-key is now just for keydown, and the new `canvas-key-press` is for keypress (#2270 @hrghauri) +* You can now specify a priority when calling addHandler, to control when your event handler gets called relative to others (#2273 @Aiosa) +* Added tileRetryMax and tileRetryDelay options, so the viewer can retry loading failed tiles (#2238 @Ughuuu @paaddyy, #2334 @Ughuuu @Titan21) +* All of the viewers keyboard handling is now in response to keydown events (it used to be split between keydown and keypress) (#2291 @MohitBansal321) +* Added `canvas-focus` and `canvas-blur` events to Viewer (#2301 @MohitBansal321) +* You can now more easily add custom buttons to the viewer (#2306 @MohitBansal321) +* The fitBounds function now takes zoom constraints into account (#2293 @pearcetm) +* The viewer now has an `after-resize` event what happens after the viewport bounds have been updated, to complement the `resize` event which happens before (#2317 @pearcetm) +* IIIFTileSource now uses resolution level dimensions provided in the info.json "sizes" field for more accurate tile requests (#2337 @ruven) +* Added setAjaxHeaders method to Viewer and TiledImage (#2346 @uschmidt83) +* Improved documentation (#2297 @KevinBritten) +* Fixed: The `tile-loaded` event's completionCallback could be called more than once in some circumstances (#2282 @Aiosa, @pearcetm) +* Fixed: Navigator display rectangle was off if the page had `box-sizing: border-box` (#2276 @ambujsahu81) +* Fixed: Code that required identifying functions would fail for async functions (#2273 @Aiosa) +* Fixed: Reference strip click detection was not accurate for long reference strips (#2280 @damonsson) +* Fixed: Translation problems in some circumstances with cropping polygons enabled (#2316 @pearcetm) +* Fixed: The navigator area rectangle would grow larger when you zoom in very far (#2318 @donotloveshampo) +* Fixed: JSON with embedded XML was being incorrectly identified as XML (#2328 @craigberry) +* Fixed: Touch/pinch rotate was not working properly on some platforms (#2324 @rsimon, @pearcetm) +* Fixed: Navigator rotation didn't honor `immediately` parameter (#2333 @robertjcolley) +* Fixed: The navigator didn't update for its new size in certain circumstances (#2347 @pearcetm) + +4.0.0: + +* NEW BEHAVIOR: Setting the viewport rotation now animates by default (pass true for the new `immediately` parameter to disable) (#2136 @jonasengelmann) +* NEW BEHAVIOR: The auto resize now takes both width and height into account when scaling the contents proportionally to the viewer (#2256 @pearcetm) +* DEPRECATION: Don't access the viewport's degrees property directly anymore; instead use setRotation and getRotation (#2136 @jonasengelmann) +* New gesture: Double-click and drag to zoom (on by default for touch) (#2225 @HamzaTatheer) +* You can now provide a pivot point when rotating the viewport (#2233 #2253 @pearcetm) +* Improved the constraints that keep the image in the viewer, specifically when zoomed out a lot (#2160 @joedf, #2246 @pearcetm) +* You can now provide an element for the navigator (as an alternative to an ID) (#1303 @cameronbaney, #2166 #2175 @joedf) +* Now supporting IIIF "id" and "identifier" in addition to "@id" (#2173 @ahankinson) +* We now delegate tile fetching and caching to the TileSource, to allow for custom tile formats (#2148 @Aiosa) +* Added support for dynamic URLs from tile sources (#2247 @JohnReagan) +* The viewer now emits before-destroy and destroy events (#2239 @pearcetm) +* Auto resize detection is now more efficient (#2256 @pearcetm) +* Improved documentation (#2211 @shyamkumaryadav) +* Fixed: Cropping tiled images with polygons was broken (#2183 @altert) +* Fixed: Boundary constraints were wrong when the viewport was rotated (#2249 @pearcetm) +* Fixed: IIIF tile sizes would be calculated wrong on rare occasions (#2206 @filak) +* Fixed: Disabling buttons only changed their appearance, but they were still clickable (#2187 @pearcetm) +* Fixed: ImageTileSource produced an error having to do with getTileHashKey (#2190 @Aiosa) +* Fixed: On startup you would get an unnecessary "Viewer.buttons is deprecated" warning (#2201 @joedf, #2219 @jssullivan, #2212 @joedf) + +3.1.0: + +* Added subPixelRoundingForTransparency Viewer option to address seams that can appear in semi-transparent images (#2075 @TanukiSharp) +* Added Viewer.isAnimating() (#2075 @TanukiSharp) +* Added isFullScreen method to Viewer (#2067 @JachiOnuoha) +* Added option to include POST data when loading files via Ajax (#2072 @Aiosa) +* Exposed TiledImage's private functions for better maintainability (#2134 @Aiosa) +* Tile cache keys are now generated by the tile source, so it's easier to override them as needed (#2138 @Aiosa) +* Pinch to zoom now zooms around the center of the pinch, rather than the center of the viewer (#2158 @cavenel) +* Added fallback and deprecation warning for Viewer.buttons (which got changed to buttonGroup in 3.0.0) (#2153 @devbyjonah) +* Fixed an issue where turning off panVertical or panHorizontal would not affect the panning keyboard combos (#2069 @JachiOnuoha) +* Cleaned up console.logs so that errors and warnings use console.error and console.warn as appropriate (#2073 @Abhishek-90) +* Improved documentation (#2067 @JachiOnuoha, #2112 @shyamkumaryadav, #2152 @joedf, #2155 @samwilson) +* Fixed: Setting useCanvas to false would break the viewer (#2116 @rvv-bouvet) +* Allow silencing multi-image warnings on viewport coordinate conversion functions (#2120 @claycoleman) +* Fixed: Swiping fast multiple times made contact points in MouseTracker out of sync for touch events (#2121 @ronnymikalsen) +* Made MouseTracker more robust in certain scenarios (#2134, #2147 @Aiosa) +* Fixed an issue where full page mode wouldn't grow properly if you resized the window (#2100 @TanukiSharp) +* Now if you pass an error handler into makeAjaxRequest, it doesn't report errors into the console (#2142 @Aiosa) +* Fixed error caused by attaching MouseTracker to the page's document element (#2145 @tdiprima) +* Fixed an issue that would sometimes cause problems with freeing up ImageTileSource memory (#2162 @pearcetm) + +3.0.0: + +* BREAKING CHANGE: Dropped support for older browsers (IE < 11) (#1872 #1949 #1951 @msalsbery, #1950 @rmontroy) +* BREAKING CHANGE: Removed deprecated OpenSeadragon.getEvent function (#1949 @msalsbery) +* DEPRECATION: MouseTracker exitHandler deprecated for name change to leaveHandler for consistency with DOM event names (#1872 @msalsbery) +* Now when "simple image" tile sources are removed from the viewer, they free the memory used by the pyramid they create (#1789 @TakumaKira) +* Improvements to docs (#1814 @kenanchristian, #1872 @msalsbery, #1996 @tdiprima) +* Better cleanup on destruction, to avoid memory leaks (#1832 @JoFrMueller) +* Better handle destruction when navigator in custom location (#1884 @woodchuck) +* Miscellaneous code cleanup (#1840 @msalsbery) +* You can now specify tileSize for the Zoomify Tile Source (#1868 @abrlam) +* Better use of IIIF "max" and "full" URL parameters (#1871 @MImranAsghar) +* You can now specify the file format of the tiles in the Zoomify tile source (#1889 @abrlam) +* Improved browser sniffing - detect EDGE and CHROMEEDGE browsers (#1872 @msalsbery) +* Improved DOM event model feature detection (#1872 @msalsbery) +* Added support for options parameter on addEvent()/removeEvent (to support passive option) (#1872 @msalsbery) +* Added OpenSeadragon.eventIsCanceled() function for defaultPrevented detection on DOM events (#1872 @msalsbery) +* MouseTracker: better PointerEvent model detection - removed use of deprecated window.navigator.pointerEnabled (#1872 @msalsbery) +* MouseTracker: added overHandler/outHandler options for handling corresponding pointerover/pointerout events (#1872 @msalsbery) +* MouseTracker: changed enterHandler/leaveHandler to use DOM pointerenter/pointerleave events instead of simulating using pointerover/pointerout (#1872 @msalsbery) +* All internal uses of MouseTracker use pointerenter/pointerleave events instead of pointerover/pointerout events for more consistent pointer tracking (#1872 @msalsbery) +* Fixed bug in Button class where two MouseTracker event handlers used an invalid "this" causing issues in some browsers (#1872 @msalsbery) +* Added pointerType property to Viewer container-enter, container-exit, canvas-drag, canvas-drag-end, canvas-pinch events (#1872 @msalsbery) +* MouseTracker: Fire dragEndHandler event even if release point same as initial contact point (#1872 @msalsbery) +* MouseTracker: Pointer capture implemented with capture APIs where available. Only fallback to emulated capture on extremely old browsers (#1872 @msalsbery) +* MouseTracker: Added preProcessEventHandler option to allow MouseTracker instances to control bubbling and default behavior of events on their associated element (#1872 @msalsbery) +* MouseTracker: Improved handling of canceled events (#1872 @msalsbery) +* MouseTracker: Improved releasing of tracked pointers on destroy()/stopTracking() (#1872 @msalsbery) +* Updated Viewer, Button, Drawer, Navigator, ReferenceStrip DOM for proper DOM event handling (#1872 @msalsbery) +* Added OpenSeadragon.setElementPointerEventsNone() for setting pointer-events:'none' on DOM elements (#1872 @msalsbery) +* MouseTracker: added contextMenuHandler option for handling contextmenu events (#1872 @msalsbery) +* Viewer: added a canvas-contextmenu event (#1872 @msalsbery) +* Fixed simulated drag events in navigator tests (#1949 @msalsbery) +* Added preventDefault option to MouseTracker.contextMenuHandler and Viewer 'canvas-contextmenu' event args (#1951 @msalsbery) +* MouseTracker: Added preProcessEventHandler for keydown, keyup, keypress, focus, blur Events (#1951 @msalsbery) +* Fixed preventDefaultAction functionality in viewer events (#1953 @msalsbery) +* Added setImageFormatsSupported function (#1954 @pandaxtc) +* Added dragToPan to the GestureSettings class, implemented in Viewer (#1956 @msalsbery) +* Added preventDefault option to MouseTracker handlers: scrollHandler, keyDownHandler, keyUpHandler, keyHandler (#1957 @msalsbery) +* Fixed test "Events: Viewer: preventDefaultAction in dblClickHandler". Fixes #1372 (#1960 @msalsbery) +* ReferenceStrip: Fixed issue where its element was being removed from its parent element twice on destroy, causing an exception (#1958 @msalsbery) +* ReferenceStrip: Made its element focusable for keyboard navigation (#1958 @msalsbery) +* You can now flip individual images (not just the whole viewport) (#1903 @ali1234) +* Accessibility: we now take the browser's zoom into account when choosing what detail level to draw (#1937 @ronnymikalsen) +* Fixed a bug causing overlays to disappear in Sequence Mode (#1865 @gunmiosb) +* Fixed a bug where the ajaxHeaders provided per-image were not being used for image requests (#1968 @maxshuty) +* MouseTracker: Added workaround for WebKit Pointer Event Implicit Capture Bug (#1972 @msalsbery) +* Removed test for move-leave (fly-over, no enter event)...not a valid, handleable event state, no longer supported (#1972 @msalsbery) +* Added OpenSeadragon.setElementPointerEvents() for setting pointer-events to other values besides 'none' on DOM elements (#1972 @msalsbery) +* Now ensuring the page body is display:block when in fullscreen (#1995 @thewilkybarkid) +* Added a static method in OpenSeadragon to get an existing viewer (#2000 @HerCerM) +* Now ensuring that the new item is already in the navigator when the "add-item" event fires (#2005 @RammasEchor) +* Added keys to change image in sequence mode (j: previous, k: next) (#2007 @RammasEchor) +* Fixed a bug where the navigator wouldn't pick up opacity/composite changes made while it is loading (#2018 @crydell) +* Explicitly set passive:false for wheel event handlers to suppress console warnings. Fixes #1669 (#2043 @msalsbery) +* Viewer's canvas-click events now include an originalTarget property so you can know which element received the click (#2037 @iangilman) +* Added method for getting the size of an image in window coordinates (#2049 @superbland) +* Added a setMaxLevel function to TileSource so you can change its maxLevel if needed (#2059, #2066 @kim-sanghoon) + +2.4.2: + +* Add support for IIIF Image API 3.0 beta (#1764) +* You can now crop an image with arbitrary polygons (#1772) +* Improved support for using the Reference Strip in an OpenSeadragon Viewer inside a Web Component (#1676) +* Added setWidth and setHeight methods to Navigator (#1686) +* Improvements to docs (#1696, #1698, #1716, #1719) +* Now passing Viewer AJAX configs down to ReferenceStrip thumbnails (#1701) +* The ReferenceStrip now honors the useCanvas option from the Viewer (#1742) +* Fixed: Navigator was still resizing after you explicitly set its width and height with navigatorWidth and navigatorHeight (#1686) +* Fixed issues with touches on iOS 13 and iPad (#1754, #1756) +* No longer throwing an exception on pages that have malformed URL parameters (#1758) +* Fixed an issue with flipping the viewport on high pixel density screens (#1779) +* Removed use of deprecated imageSmoothingEnabled prefixes (#1740) + +2.4.1: + +* You can now turn off the default canvas image smoothing, if you want sharp pixels when zoomed in past 100% (#1507, #1593, #1595, #1647, #1648) +* Fixed problem with navigator highlight rectangle when returning from full screen with a custom navigator location (#1515) +* Added option to set rotation increment for nav buttons and keyboard (#1524) +* Fixed issue with flipping and opacity with multi-image (#1549) +* Removed vestigial button group label element that was causing issues for accessibility tools (#1560) +* Fixed a bug causing Viewer.areControlsEnabled to throw an exception (#1562) +* Added tileFormat option to IIIFTileSource so you can specify the tile format (#1625) +* Now using canonical URIs more consistently in IIIF to make caching and processing time easier on the server side (#1625) +* Added support for IIIF's new preferredFormats property (#1656) + +2.4.0: + +* BREAKING CHANGE: Viewer's canvas-double-click event is now fired before it initiates the zoom (#1288) +* You can now flip the viewport to get a mirror image of the original (#1441) +* You can now prevent canvas-double-click events from zooming on a per-event basis (#1288) +* Fixed: Opacity 0 images were causing unnecessary redraws (#1319) +* The "page" event is now fired after the page index has been updated (#1330) +* Added option pixelsPerArrowPress that sets the speed of arrow keys (#1364) +* Improved IIIF options.maxLevel calculation (#1401) +* Added canvas-key events, along with the ability to cancel key actions (#1414) +* Added optional zoom in the middle of the image instead of pointer position (#1423) +* Now supporting square edge tiles that are padded rather than cropped (#1426) +* Fixed an issue causing the simple image tileSource to sometimes show duplicate copies (#1370) +* Fixed an issue causing seams to appear in semi-transparent PNG tiled images (#1470) +* Added visual customization options for the navigator (#1480) +* You can now prevent canvas-drag events on the navigator (#1484) +* You can now prevent canvas-click events on the navigator (#1416) +* The navigator can now be restricted to just horizontal or just vertical panning (#1416) +* Fixed DziTileSource so it doesn't load levels above maxLevel or below minLevel, if set (#1492) + +2.3.1: + +* Debug mode now uses different colors for different tiled images (customizable via debugGridColor) (#1271) +* Fixed a problem with preventDefaultAction for the canvas-drag event (#1278) +* Fixed an issue causing double images with certain aspect ratios (#1280) +* Fixed: placeholderFillStyle had no effect (#1286) +* Fixed seams that appear in wrap mode on Safari and Firefox (#1305) + +2.3.0: + +* BREAKING CHANGE: Tile.distance has been removed (#1027) +* BREAKING CHANGE: Viewer's canvas-click event is now fired before it initiates the zoom (#1148) +* BREAKING CHANGE: Viewer's canvas-drag event is now fired before it pans (#1149) +* Added Zoomify tile source (#863) +* You can now set the rotation of individual tiled images (#1006) +* Added getFullyLoaded method and "fully-loaded-change" event to TiledImage to know when tiles are fully loaded (#837, #1073) +* You can now preload images without drawing them to the screen (#1071) +* Added support for commonjs (#984) +* Added an option to addTiledImage to change the crossOriginPolicy (#981) +* You can now load tiles via AJAX and custom AJAX request headers (#1055) +* Added ability to provide thumbnail URLs for reference strip (#1241) +* Improved panning constraints for constrainDuringPan (#1133 and #1245) +* You can now prevent canvas-click events from zooming on a per-event basis (#1148) +* You can now prevent canvas-drag events from panning on a per-event basis (#1149) +* The navigationControlAnchor option now works for custom toolbar as well (#1004) +* LegacyTileSource now allows any image URLs regardless of type (#1056) +* Enabled configuration of ImageLoader timeout (#1192) +* Viewer.open() now supports an initialPage argument for sequenceMode (#1196) +* New events for opacity and compositeOperation changes (#1203) +* Added support for setting debug mode after the Viewer object has been constructed (#1224) +* Added functions for dynamically adding and removing the reference strip in sequence mode (#1213) +* Better calculation for TileCache release cutoff (#1214) +* The navigator now picks up opacity and compositeOperation changes (#1203) +* Improved calculation for determining which level to load first (#1198) +* Added fix for supporting weird filenames that look like JSONs (#1189) +* Improved DziTileSource guessing of tilesUrl (#1074) +* The Viewer's tileSources option is now smarter about detecting JSON vs XML vs URL (#999) +* Better compression for our UI images (#1134) +* Optimization: Use the squared distance when comparing tiles (#1027) +* Now clamping pixel ratio density to a minimum of 1, fixing display issues on low density devices (#1200) +* More forgiving check for DZI schema (#1249) +* ImageTileSource now works in IE8 (#1041) +* Fixed CORS bug in IE 10 (#967) +* Fixed issue with tiles not appearing with wrapHorizontal/wrapVertical if you pan too far away from the origin (#987, #1066) +* Fixed: Initial tile load wasn't happening in parallel (#1014) +* Fixed problem with "sparse image" DZI files (#995) +* Fix IndexSizeError on IE and Edge that occurred under certain circumstances (e.g. multi-image with transparency) (#1035) +* Fixed error in IE8 when zooming in (due to edge smoothing) (#1064) +* Fixed issue with OpenSeadragon.version in the minified JavaScript (#1099) +* Fixed smoothTileEdgesMinZoom performance degradation on single-tile images (#1101) +* Fixed issue with tiles not appearing after rotation (#1102) +* Fixed: The navigator wasn't respecting the constrainDuringPan setting (#1104) +* Fixed an issue causing overlays to be mis-positioned in some circumstances (#1119) +* Fixed: ImageTileSource would sometimes produce a double image (#1123) +* Fixed: console.debug caused exceptions on IE10 (#1129) +* Fixed: the reference strip would leak memory when opening new sets of images (#1175) +* Fixed: zoomTo/zoomBy ignore refPoint if immediately is true (#1184) +* Fixed: IIPImageServer didn't work with the latest OSD release (#1199) +* Fixed: setItemIndex method not working with navigator inside "open" event (#1201) +* Fixed: The reference strip didn't show the initial page if it wasn't the first page (#1208) +* Fixed: Sometimes the image would stick to the mouse when right-clicking and left-clicking simultaneously (#1223) +* Fixed issue with transparent images sometimes disappearing on Safari (#1222) +* Fixed: One image failing to load could cause the others to never load (#1229) +* Fixed: Mouse up outside map will cause "canvas-drag" event to stick (#1133) +* Fixed more issues with tracking multiple pointers (#1244) + +2.2.1: + +* Fixed problems with zoom/pan constraints with certain extreme settings (#965) +* Fixed an issue causing the browser to crash on iOS (#966) + +2.2.0: + +* BREAKING CHANGE: Viewport.homeBounds, Viewport.contentSize, Viewport.contentAspectX and + Viewport.contentAspectY have been removed. (#846) +* BREAKING CHANGE: The Overlay.getBounds method now takes the viewport as parameter. (#896) +* DEPRECATION: Overlay.scales, Overlay.bounds and Overlay.position have been deprecated. (#896) + * Overlay.width !== null should be used to test whether the overlay scales horizontally + * Overlay.height !== null should be used to test whether the overlay scales vertically + * The Overlay.getBounds method should be used to get the bounds of the overlay in viewport coordinates + * Overlay.location replaces Overlay.position +* DEPRECATION: Viewport.setHomeBounds has been deprecated (#846) +* DEPRECATION: the Viewport constructor is now ignoring the contentSize option (#846) +* Tile edge smoothing at high zoom (#764) +* Fixed issue with reference strip popping up virtual keyboard on mobile devices (#779) +* Now supporting rotation in the Rect class (#782) +* Drag outside of iframe now works better, as long as both pages are on the same domain (#790) +* Coordinate conversion now takes rotation into account (#796) +* Support tile-less IIIF as per LegacyTileSource (#816) +* You can now give an empty string to the tabIndex option (#805) +* Fixed issue with rotation and clicking in the navigator (#807) +* Broadened the check for mime type in LegacyTileSource URLs to allow query strings (#819) +* Added globalCompositeOperation option for tiledImage, to allow for different transfer modes (#814) +* Added Viewer.addSimpleImage method for easily adding non-tiled images (#827) +* DziTileSource now works properly with DZI files that have no extension (#835) +* Fixed content clipping with rotation (#463, #567 and #833) +* Fixed navigator not being rotated when viewport rotation is set in constructor (#840) +* Fixed: Viewer.setMouseNavEnabled wasn't affecting all of the viewer's trackers (#845) +* Fixed: with scrollToZoom disabled, the viewer caused page scrolling to slow down (#858) +* Added Viewer.getOverlayById and Overlay.getBounds functions (#853) +* Tiled images with 0 opacity no longer load their tiles or do drawing calculations (#859) +* Fixed issue with edge smoothing with PNG tiles at high zoom (#860) +* Fixed: Images with transparency were clearing images layered below them (#861) +* Fixed issue causing HTML pages to jump unwantedly to the reference strip upon loading (#872) +* Added addOnceHandler method to EventSource (#887) +* Added TiledImage.fitBounds method (#888) +* Overlays can now be scaled in a single dimension by providing a point location and either width or height (#896) +* Added full rotation support to overlays (#729, #193) +* Viewport.goHome() now takes clipping into account (#910) +* Improved zoom to point (#923) +* Optimized sketch canvas clearing and blending for images with opacity or transfer modes (#927) +* Now taking rotation into account in viewport getBounds and fitBounds methods (#934) +* Added option to disable navigator auto-fade (#935) +* Fixed issue with maintaining viewport position with full screen (#940) +* Fixed an issue with simultaneous touch events (#930) +* Avoid loading clipped out tiles (#939) +* Improved precision for subtle moves with fitBounds (#939) +* Fixed an issue in viewer.addTiledImage with replace:true when viewer has navigator (#948) + +2.1.0: + +* BREAKING CHANGE: the tile does not hold a reference to its image anymore. Only the tile cache keep a reference to images. +* BREAKING CHANGE: TileSource.tileSize no longer exists; use TileSource.getTileWidth() and TileSource.getTileHeight() instead. +* DEPRECATION: let ImageRecord.getRenderedContext create the rendered context instead of using ImageRecord.setRenderedContext +* DEPRECATION: TileSource.getTileSize() is deprecated. Use TileSource.getTileWidth() and TileSource.getTileHeight() instead. +* Changed resize behaviour to prevent "snapping" to world bounds when constraints allow more space (#711) +* Added support for non-square tiles (#673) + * TileSource.Options objects can now optionally provide tileWidth/tileHeight instead of tileSize for non-square tile support. + * IIIFTileSources will now respect non-square tiles if available. +* Added new tile source for simple images: ImageTileSource (#760) +* Optimized adding large numbers of items to the world with collectionMode (#735) +* Registers as an AMD module where possible (#719) +* Added "tile-loaded" event on the viewer allowing to modify a tile before it is marked ready to be drawn (#659) +* Added "tile-unloaded" event on the viewer allowing to free up memory one has allocated on a tile (#659) +* Added 'tile-load-failed' event (#725) +* Added additional coordinates conversion methods to TiledImage (#662) +* Added `preserveImageSizeOnResize` option (#666) +* Added collectionColumns as a configuration parameter (#680) +* Added option in addTiledImage to replace tiledImage at index (#706) +* Added autoRefigureSizes flag to World for optimizing mass rearrangements (#715) +* You can now change viewport margins after the viewer is created (#721) +* Added a patch to help slow down the scroll devices that fire too fast (#754) +* Fixed flickering tiles with useCanvas=false when no cache is used (#661) +* 'display: none' no longer gets reset on overlays during draw (#668) +* Better error reporting for tile load failures (#679) +* Added XDomainRequest as fallback method for ajax requests if XMLHttpRequest fails (for IE < 10) (#693) +* Now avoiding using eval when JSON.parse is available (#696) +* Rotation now works properly on retina display (#708) +* Fixed issue with tiledImages loading tiles at every level instead of just the best level (#728) +* Fixed placeholderFillStyle flicker (#727) +* Fix for Chrome (v45) issue that key is sometimes undefined outside of the for-in loop (#730) +* World.removeAll now cancels any in-flight image loads; same for Viewer.open and Viewer.close (#734) +* Fixed overlays position (use rounding instead of flooring and ceiling) (#741) +* Fixed issue with including overlays in your tileSources array when creating/opening in the viewer (#745) +* Fixed issue in iOS devices that would cause all touch events to fail after a Multitasking Gesture was triggered (#744) +* Fixed an issue with TiledImage setPosition/setWidth/setHeight not reliably triggering a redraw (#720) +* Fixed zooming in with plus key on a Swedish keyboard (#763) + +2.0.0: + +* True multi-image mode (#450) + * BREAKING CHANGE: Passing an array for the tileSources option is no longer enough to trigger sequence mode; you have to set the sequenceMode option to true as well + * BREAKING CHANGE: Navigator no longer sends an open event when its viewer opens + * BREAKING CHANGE: Viewer.drawers and Viewer.drawersContainer no longer exist + * BREAKING CHANGE: A Viewer's Drawer and Viewport are now made once per Viewer and reused for every image that Viewer opens (rather than being recreated for every open); this means if you change Viewer options between opens, the behavior is different now. + * DEPRECATION: use Viewer.addTiledImage instead of Viewer.addLayer + * addTiledImage supports positioning config properties + * DEPRECATION: use World.getItemAt instead of Viewer.getLayerAtLevel + * DEPRECATION: use World.getIndexOfItem instead of Viewer.getLevelOfLayer + * DEPRECATION: use World.getItemCount instead of Viewer.getLayersCount + * DEPRECATION: use World.setItemIndex instead of Viewer.setLayerLevel + * DEPRECATION: use World.removeItem instead of Viewer.removeLayer + * DEPRECATION: use World.needsDraw instead of Drawer.needsUpdate + * DEPRECATION: use TileCache.numTilesLoaded instead of Drawer.numTilesLoaded + * DEPRECATION: use World.resetItems instead of Drawer.reset + * DEPRECATION: use Drawer.clear and World.draw instead of Drawer.update + * DEPRECATION: the layersAspectRatioEpsilon option is no longer necessary + * DEPRECATION: Viewer's add-layer event is now World's add-item event + * DEPRECATION: Viewer's layer-level-changed event is now World's item-index-change event + * DEPRECATION: Viewer's remove-layer event is now World's remove-item event + * DEPRECATION: Viewer's add-layer-failed event is now add-item-failed + * DEPRECATION: TileSourceCollection has been retired in favor of World + * DEPRECATION: collectionMode no longer draws outlines or reflections for items + * Drawer has been split into three classes: + * TiledImage, tile management and positioning for a single tiled image + * TileCache, tile caching for all images + * Drawer, tile drawing for all images + * New class: World, keeps track of multiple images in the scene + * Viewer now has world and tileCache properties + * Rect and Point now have clone functions + * New Viewport method for managing homeBounds as well as constraints: setHomeBounds + * Viewport.open supports positioning config properties + * For multi-image open, drawing isn't started until all tileSources have been opened + * You can specify a clip area for each image (only works on browsers that support the HTML5 canvas) (#594) + * Added placeholderFillStyle so image rectangles can be drawn even before their tiles load (#635) + * Ability to set opacity on individual TiledImages (#644) +* Margins option to push the home region in from the edges of the Viewer (#505) +* Rect and Point toString() functions are now consistent: rounding values to nearest hundredth +* Overlays appear in the DOM immediately on open or addOverlay (#507) +* imageLoaderLimit now works (#544) +* Turning off scrollToZoom in gestureSettings now allows scroll events to propagate +* You can now set a minZoomLevel that's greater than the home zoom level +* Added union() to OpenSeadragon.Rect +* Fixed an error in fitBounds if the new and old bounds were extremely close in size +* Added ajaxWithCredentials option (#543) +* Added viewport-change event for after the viewport changes but before it's drawn +* A spring's current value is now updated immediately on reset (#524) +* Fixed an error in fitBounds that occurred sometimes with immediately = true +* Added support for HDPI (retina) displays (#583) +* Corrected IIIF tile source to use canonical syntax (#586) +* Fixed x/y typo that caused horizontal reference strip to be rendered only relative to height (#595) +* Fixed Firefox 35 not able to open local files (#588) +* Fixed an issue with zero size viewers in IE8 (#609) +* Fixed: Cross Origin policy not working (#613) +* Optimized tile loading by clearing the queue on a re-draw when imageLoaderLimit is set (#616) +* Now animating zoom spring exponentially (#631) +* Added http://editorconfig.org/ config file (#637) +* Keyboard pan speed is now the same regardless of zoom level (#645) + +1.2.1: + +* Added preserveOverlays option (#561) +* Fixed: DZI tilesource was broken on IE8/IE9 (#563) +* Exposed secondary pointer button (middle, right, etc.) events from MouseTracker and through viewer (#479) +* MouseTracker - Improved IE 8 compatibility (#562) +* MouseTracker - Improved IE 9+ compatibility (#564) +* MouseTracker - Simulated touchenter/touchleave events now bubble to parent element MouseTrackers (#566) +* MouseTracker - Improved multitouch support in enter/exit event handlers (#566) +* MouseTracker - orphaned tracked touch pointers removed (fix for #539) +* MouseTracker - removed touchenter/touchleave event support since the events don't exist on any known platform and have been removed from the W3C specification (#566) +* Removed Viewer onContainerPress/onContainerRelease handlers (and the associated 'container-release' event ) that were never fired due to the canvas (child) element capturing the DOM events (#566) +* Added 'canvas-enter', 'canvas-exit', and 'canvas-press' events to Viewer (#566) +* ButtonGroup - removed obsolete MouseTracker event handlers (#566) +* MouseTracker - added keydown and keyup handlers (#568) +* Modifier keys ignored in keyboard navigation handlers (#503) +* Requesting keyboard focus when viewer is clicked (#537) +* Arrow key navigation fixed across platforms (#565) +* Removed textarea element from viewer DOM. Viewer.canvas now handles keyboard navigation (#569) +* Removed 'position' property from MouseTracker keyDownHandler/keyUpHandler/keyHandler functions (#573) +* Fixed pointer event model detection for IE 10 and IE 11 (#571) +* Added setMouseNavEnabled() support to Navigator (#572) +* MouseTracker now defaults to tracking on (#558) +* Removed Viewer focusHandler/onCanvasFocus (#577) +* Added tabIndex option to viewer (#577) + +1.2.0: + +* New combined IIIF TileSource for 1.0 through 2.0 (#441) + * BREAKING CHANGE: Removed IIIF1_1TileSource (now that IIIFTileSource supports all versions) +* Allowed TileSources to have dynamic tileSize via source.getTileSize(level) (#441) + * DEPRECATION: Use .getTileSize(level) instead of .tileSize +* Fix for IIPServer-style urls when using DZI (#413) +* Fix memory leak while destroying the viewer (#421) +* Added fitBoundsWithConstraints() to the viewport (#423) +* Fixed MouseTracker cross-browser issues with tracking pointers over and out of the tracked element (pull request #448, fix for #152, #404, #420, and #427) +* Fixed incorrect flick direction after image is rotated (#452) +* Debug mode now works with rotate images (#453) +* Now supporting dzi xml with namespaces (#462) +* You can now rotate the navigator along with the main viewer (#455) +* Viewport.setRotation now allows all rotation angles (#466) +* Pinch rotate is now available (defaults to off) (#468) +* Added option for home button to fill viewer (#474) +* Better handling of mid-update image loaded callbacks (#409) +* Tracked pointers are now cleaned up when Viewer.setMouseNavEnabled(false) is called (#518) +* Added explicit pointer capture for touch event model touchstart events (#552) + +1.1.1: + +* Fixed issue with dragging the navigator highlight on Webkit browsers (#395) +* Improved Viewer Options Support in Gesture Handling (#399) + +1.1.0: + +* BREAKING CHANGE: the openseadragon-canvas element now has two child divs. This means: (#298) + * The drawer element is no longer accessible via viewer.canvas.firstChild but via viewer.drawersContainer.firstChild or viewer.drawer.canvas. + * The overlays elements are no longer accessible via viewer.canvas.childNodes but via viewer.overlaysContainer.childNodes or viewer.currentOverlays[i].element. +* BREAKING CHANGE: Pseudo full screen mode on IE<11 using activex has been dropped. OpenSeadragon will run in full page if full screen mode is requested. +* BREAKING CHANGE: MouseTracker touch pinch gestures are no longer converted to scroll events. MouseTracker.pinchHandler should be used instead. (#369) +* DEPRECATION: overlay functions have been moved from Drawer to Viewer (#331) +* DEPRECATION: OpenSeadragon.cancelFullScreen has been renamed OpenSeadragon.exitFullScreen (#358) +* DEPRECATION: The 'isTouchEvent' property passed in MouseTracker events is deprecated and has been replaced with 'pointerType', which is a String value "mouse", "touch", "pen", etc. to support multiple simultaneous pointing devices (#369) +* DEPRECATION: The 'buttonDownAny' property passed in MouseTracker enter and exit events (enterHandler/exitHandler) is deprecated and has been replaced with 'buttons', which indicates the button(s) currently pressed (#369) +* DEPRECATION: The 'buttonDownAny' property passed in Viewer's 'container-enter' and 'container-exit' events is deprecated and has been replaced with 'buttons', which indicates the button(s) currently pressed (#369) +* Added layers support. Multiple images can now been displayed on top of each other with transparency via the Viewer.addLayer method (#298) +* Improved overlay functions (#331) +* Fixed: Nav button highlight states aren't quite aligned on Firefox (#303) +* Added ControlAnchor options for default controls (#304) +* Enabled basic cross-domain tile loading without tainting canvas (works in Chrome and Firefox) (#308) +* Added crossOriginPolicy drawer configuration to enable or disable CORS image requests (#364) +* Disabled CORS by default (#377) +* Added a ControlAnchor.ABSOLUTE enumeration. Enables absolute positioning of control elements in the viewer (#310) +* Added a 'navigator-scroll' event to Navigator. Fired when mousewheel events occur in the navigator (#310) +* Added a navigatorMaintainSizeRatio option. If set to true, the navigator minimap resizes when the viewer element is resized (#310) +* Added 'ABSOLUTE' as a navigatorPosition option, along with corresponding navigatorTop, navigatorLeft options. Allows the navigator minimap to be placed anywhere in the viewer (#310) +* Enhanced the navigatorTop, navigatorLeft, navigatorHeight, and navigatorWidth options to allow a number for pixel units or a string for other element units (%, em, etc.) (#310) +* Additional enhancements for IIIF support (#315) +* Fixed: Setting degrees in Viewer constructor has no effect (#336) +* Added pre-draw event for tiles to allow applications to alter the image (#348) +* Added optional Rotate Left/Right buttons to standard controls (#341) +* Added optimization for large numbers of overlays: `checkResize = false` option for OpenSeadragon.Overlay (#365) +* Updated full screen API, adding support for Opera and IE11 and allowing keyboard input in Chrome (#358) +* Various fixes to bring OpenSeadragon into W3C compliance (#375) +* Added separate flags for turning off each of the nav buttons (#376) +* Added support for query parameters in DZI tileSource URL (#378) +* Enhanced MouseTracker for multi-touch (#369) + * Added support for tracking multiple touch-points on multiple/simultaneous pointing devices + * Added support for the W3C Pointer Events event model. Enables touch/multi-touch on IE10+ + * Added a dragEndHandler event callback, called when a drag gesture ends + * Added a pinchHandler event callback, called as a pinch gesture (2 touch points) is occurring + * Added real-time velocity (speed and direction) tracking to drag operations. 'speed' and 'direction' values are passed in the dragHandler and dragEndHandler event data +* Enhanced Viewer for multi-touch (#369) + * Added pinch zoom with the new MouseTracker pinchHandler. The 'pan' and 'zoom' Viewer events can be used to detect changes resulting in pinch gestures + * Added a "canvas-pinch" event fired by the pinch event handler + * Added flick gesture with the new MouseTracker dragEndHandler + * Added a "canvas-drag-end" event fired by the drag-end event handler + * Added a GestureSettings class for per-device gesture options. Currently has settings to enable/disable zoom-on-scroll, zoom-on-pinch, zoom-on-click, and flick gesture settings. + * Added GestureSettings objects for mouse, touch, and pen devices to the Viewer options giving users the ability to customize gesture handling in the viewer + * Added velocity (speed and direction) properties to the "canvas-drag" event +* Added double-click gesture detection to MouseTracker with corresponding dblClickHandler event callback (#392) +* Added zoom on double-click feature to Viewer, with corresponding dblClickToZoom option added to the GestureSettings class (#392) +* Made it possible to run OpenSeadragon from local filesystem on some browsers (#379) + +1.0.0: + +NOTE: This version has a number of breaking changes to the API, mostly in event handling. See below. + +* BREAKING CHANGE: All EventSource and MouseTracker event handler method signatures changed to 'handlerMethod(event)' where event == { eventSource, userData, ... } (#251) (Also fixes #23, #224, #239) + * The new eventSource property in the event object replaces the old eventSource parameter that was passed to handler methods. + * Where the event object duplicated the eventSource value, those properties have been removed. This affects the following events: + * All Button events - 'button' property removed + * All Viewer (Viewer, Drawer, Viewport) events - 'viewer' property removed +* BREAKING CHANGE: Renamed EventHandler to EventSource (#225) +* BREAKING CHANGE: Event names changed for consistency: changed to lower case, compound names hyphenated, and "on" prefixes removed (#226): + * Viewer "animationstart" changed to "animation-start" + * Viewer "animationfinish" changed to "animation-finish" + * Button "onPress" changed to "press" + * Button "onRelease" changed to "release" + * Button "onClick" changed to "click" + * Button "onEnter" changed to "enter" + * Button "onExit" changed to "exit" + * Button "onFocus" changed to "focus" + * Button "onBlur" changed to "blur" +* BREAKING CHANGE: Numerous improvements to fullPage/fullScreen (#256): + * Retains zoom/pan position better when switching into and out of fullPage. + * Retains scroll position when switching back out. + * More resilient to styling variations on the page. + * setFullPage no longer automatically engages fullScreen; there's now a separate setFullScreen. + * 'fullpage' event is now 'full-page'. + * The `fullpage` property of the 'full-page' event is now `fullPage`. + * There is now a 'full-screen' event with a `fullScreen` property (true if it has gone to full screen). + * There are now 'pre-full-page' and 'pre-full-screen' events that include a `preventDefaultAction` property you can set in your handler to cancel. They also have `fullPage` and `fullScreen` properties respectively, to indicate if they are going into or out of the mode. +* BREAKING CHANGE: Removed the 'onPageChange' callback from the viewer options. Viewer.goToPage() now raises the 'page' event only (#285) +* Major documentation improvements (#281) +* MouseTracker now passes the original event objects to its handler methods (#23) +* MouseTracker now supports an optional 'moveHandler' method for tracking mousemove events (#215) +* Added stopHandler to MouseTracker. (#262) +* Fixed: Element-relative mouse coordinates now correct if the element and/or page is scrolled (using new OpenSeadragon.getElementOffset() method) (#131) +* Fixed: Pinch zoom event issue, regressive issue from previous event system changes (#244) +* Added IIIF Image API 1.1 Tile Source (#230) +* IIIF 1.0 now uses pixel based syntax (#249) +* Fixed: Touch event issue where no canvas-click events were being raised (#240) +* Check that zoom reference point is valid before using it in zoomTo and zoomBy (#247) +* Added a number of easier coordinate conversion methods to viewport (#243) +* Added the ability to create a viewer and start at a specified page (#252) +* Fixed image resolve issue with collection mode (#255) +* DOM events are now passed through as 'event.originalEvent' in viewer and button events where appropriate. (#257) Affects the following events: + * Viewer: 'canvas-release', 'canvas-click', 'canvas-drag', 'canvas-scroll', 'container-enter', 'container-exit', 'container-release' + * Button: 'enter', 'exit', 'press', 'release', 'focus', 'blur', 'click' +* Fixed: IE 10 not reading DZI file correctly in certain circumstances (#218) +* Added support for the 'wheel' DOM mousewheel event (#261) +* Fix for non-canvas tile rendering at large size (#264) +* Drawer now uses an HTML5 canvas element whenever it's available. Can be overridden with the Viewer.useCanvas option (#191) +* Added a boolean preventDefaultAction property (default false) to the event object passed to MouseTracker handler methods. (#270) Implemented in the following MouseTracker subscribers: + * Viewer.keyboardCommandArea.innerTracker.focusHandler: preventDefaultAction == true prevents scrolling viewer into view + * Viewer.keyboardCommandArea.innerTracker.keyHandler: preventDefaultAction == true prevents viewer keyboard navigation + * Viewer.innerTracker.clickHandler: preventDefaultAction == true prevents viewer zoom on click + * Viewer.innerTracker.dragHandler: preventDefaultAction == true prevents viewer panning with mouse/touch + * Viewer.innerTracker.scrollHandler: preventDefaultAction == true prevents viewer zooming on mousewheel/pinch +* Fixed: IE8 error with custom buttons - "Object doesn't support this action" (#279) +* Support IIIF servers that don't report tile dimensions (#286) +* Added an autoResize option. Default is true. When set to false, the viewer takes no action when its container element is resized. (#291) +* Added a static 'version' property to OpenSeadragon. Useful for plugins that require specific OpenSeadragon versions. (#292) + +0.9.131: + +* Fixed: canvas-click event shouldn't fire as you drag (#198) +* Fixed: LegacyTileSource doesn't fail gracefully when no supported file formats are found (#202) +* Added an optional userData argument to EventHandler.addHandler() which is passed unchanged to the handler method (#203) +* Fixed AJAX error reporting on IE8 (#208) +* Added viewportToImageRectangle method, and updated imageToViewportRectangle, imageToViewportCoordinates, and viewportToImageCoordinates to be more flexible with params (#212) +* Fixed: Viewer is not responsive (css) after returning from full screen (#222) + +0.9.130: + +* Added partial support for rotation (just 90 degree increments for now). (#185) +* Hiding and restoring broke the viewer; fixed (#177) +* You can now provide an onDraw function for overlays to do custom overlay manipulation (#160) +* Added a destroy function on the viewer to clean up and remove elements (#179) +* Fixed: navigatorPosition option corrected. (#163) +* OpenSeadragon.now() returned undefined the first time; fixed +* onTouchEnd did not call the correct mouse up handler; fixed (#159) +* Touch events no longer capture mouse (was causing issues on devices that support both) (#168) +* Clicking on a button control no longer refreshes page (#184) +* Drawer now works when the page is rtl (#187) +* Fixed a situation that could throw errors in touch handling (#188) + +0.9.129: + +* Fixed: navigator image not updating when base zoom image is changed (#147) +* Fixed tile rendering issue at lower zoom levels with the IIIF TileSource (#55) +* On IE, ajax errors would cause an exception to be thrown; fixed (#144) +* Faster and more consistent millisecond getter (#138) +* Fixed an error when using navPrevNextWrap on single images (#135) +* Various fixes to our timer handling (#133) +* Now generating source map for openseadragon.min.js (#51) +* Fix for calculating overlay width / height (#142) +* JSHint tidying (#136) +* Improved Ajax method (#149) +* Overhauled AJAX error reporting (#151) + +0.9.128: + +* The navigator is now off by default (#102) +* Reverted minPixelRatio to 0.5 for better quality (#116) +* Sometimes tiles wouldn't resolve if you used the blendTime option; fixed. (#95) +* You can now choose to have previous and next buttons wrap using the config.navPrevNextWrap. (#114) +* You can now specify an ID for a div to hold the navigator (#46) +* You can now click in the navigator to go to a new location (#46) +* Keyboard handling is now done in the viewer rather than navigator (#46) +* Additional navigator fixes (#46) +* Drawer events now fire properly (#94) +* Fixed an error in EventHandler.removeHandler() (#48) +* Better requestAnimationFrame detection on older Firefox (#103) +* More efficient navigator loading (#115) +* Simplified element opacity setting implementation (#123) + +0.9.127: + +* Fixed a problem with getString when the string property is a sub-property. (#64) +* Fixed: Tooltips for Navigation Controls not displaying (#63) +* Cleaned up some diagnostic code that was broken. +* Added fullpage class to viewer element when in fullpage mode (#61) +* Reverted to original New BSD license; cleaned up license declarations (#89) + +0.9.126: + +* DZI JSONp was broken; fixed. + +0.9.125: + +* Fully deprecated OpenSeadragon.createFromDZI, safely deprecated Viewer.openTileSource and + Viewer.openDZI to use Viewer.open internally. (#53 & #54). +* Full page bug fix for when viewer is child of document body (#43). +* Overlays for DZI bug fix (#45). +* DziTileSource: avoid changing relative paths (#56). +* Fix typo in preserveViewport handling (#77). +* Fix updateMulti timer leak after multiple Viewer.open() calls (#76). +* Minor documentation fixes. + +0.9.124: + +* Performance enhancements. + + +0.9.123: + +* Real fullscreen support. + + +0.9.122: + +* Performance enhancements. + + +0.9.121: + +* Touch pan now works on Android. +* Pinch zoom is better on all devices. diff --git a/script/openseadragon/images/button_grouphover.png b/script/openseadragon/images/button_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..9db590ea2adb845fc875b2e3a1fc45ad2a5fc8c8 GIT binary patch literal 1506 zcmV<81s(c{P);M1%f1T;mr?<=Ha+c?L;^&`#KKSXUpPrTg1t>37V40yV4#or#e*E#rTU>{zSFhgW zP$<;V_kB_-7K@ZjCifmZc<{GZUw!qH4?q0yFcD>y%ups6Gl(rALXSQ6ShE{$xZ$3L z4IAEUSr)+w;$R3BLI_e&sZ@%#ZQJ(oyYIgH{>LAGypM=dPzK6LpkgVIxCoH&>eZ_k zckI~lb%x-<7(}_DLY?#9Fcd43${X2YXY(jFqV|dAZymF zxw%c7HZRz=O@%^%^7%Z&C?Fj~fd=BgbsUFcu^3gaUVU7jK7BGj{P4q8mEbx=DU8XL z@Q*+KI2Mk)6Ap(Ng6&rW8$*XuVC+!Mnl%YAtZv=9+mkZACHM@hS z2OvgA^n2>s1jkbbclp>7t1z)_*|KeF$?J7UcSbL0p*nTy{GT6yB;+^K-&jcj7^Oh? zw+zFp3%N&4n>L+AMAe`ukE0b(VVRtH?z!iBVtTr2346|5Q7cD3SHZtiK>Qqbxj};l zZHEmT)?I^f)HIo#aay--J&s*b^X(M@!+r`PAN;N*$hKUvh08y}xkZ++0pj2q=e8~H zS^883E;nx6nDb{S5k(Y?a>gMov}x*sr1g{WxUd|DLLrCj0tRD7eGP#NX zlgERK~Xvi?Ezli)#YZBFEZ|(Y0Lkw1Q`Z@t^{#@0RAxn{Vua;K6yyt~A&cOh0YhxN#qx-=S?KSl+qXfz86c z#X;7OYu~;-KSVXk%M!bY=h5e%e@<}y8?3JNL{tvNp^S9N(_w@rXEy?G(-G0$bzLs! zsx4fSIBM0ZMJG<2V3?K1k01Yth|VyK+Hk4dQ7~lcQK-W4y?gi088Bc#@ZfYh%{g?@ zj&ShyfnNqKhRVy!--E+EMP<^JG?X*Llze)eJbCg2lCEsircI;!_3KB~s#Rkk)vwMg z20$MQTFTQ;Kg}!XJ-GV^5uJuApoF&L^UvjsufrkPc49>wMBA^6Xxg=FS5-v==~Kt| zxu>Dy2R#TIDSGk67dhu%LVNj9f|N5zsVl}kaLN8RA~!-c9LH&dy~rJ~ec{xpQ>jar zEaC28jaGiW5;Oo=FRloci$0e)vuV=FYz+Rv^Yd625E!+2`^i&s$9?*jGbH$r+&xrs2seKkIE7AhWz3`Ra^#=ifM|V4z=Pu#lUIk zh#Vv#<&%B*`3jhEB07*qo IM6N<$g437j#Q*>R literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/button_hover.png b/script/openseadragon/images/button_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..645c241b9fd4ceb3b2dc44ad9dc81c323ccdf803 GIT binary patch literal 1827 zcmV+;2i*9HP)Kn2s5j9y2q;GEZPKnIyKmyRNg-y0dZ~ zy?I(F=~JzDpuhQTH-vEJRrEXfjDOJ@iahXr_?mMvTyT9>WGIJlNQcP%n>_5X4l~sG zp`_?xN+?e-;B9Yv+sGT<@P-X(nhIkK?cTlnQ}$|$f$GZk>Wr-?AwirNc#$c8CDSsL4$;ZlOlku0Eh{$nAs8-ER2B}NEvOB z8m25k*GMsYtP{?xZ*O?|)1SV>rPJ|3%BO^)WYqTU+n*5~yCv=(m(nOLNu>m%!301M zGyq};{cl-X@v#gmh{(cPW`Gq9dXm7ThI+?Aa})dHEnBuc-pSkzAoLExL8{=jmaevn zLwAPBp#?S*u?PYovGV4)=73nSu?`^sFbDuMF);%YBnA>BhyjqvIO{Ciq}3Lc`ED2l z8`c4cyohv&)!rtNW!YHJTnKEVDY2MZUQhu1cqk~Mm9G$p`Tu8kQbLMmN@SL0Wl05E z&sB#+Xf+vHT3TX}^hKO3D@mG^lsKbO1l`jpaUz$K&~!Q-6s-7AD5zGewbUo#5z`IW zWI~c)oJmO{nHWSelS@|i-5=X4bS~JT@u^d%4x9`}(#@rwG#yP+)0xQ_KrmBW%EZ3@ zSlVbb^0P2|3T5n_ciwr^txw+2dEs1tKG|;t35HYvDFF%uAPEpyt^6wD!hjP2MqnO&h{*l|dTQ}R~I1LD>0aOK0 zaovGcUfM}fdCK!2cd9n2 zvoLc)Tpftee+Q-l33d`TA~2jtZ1Lc{?7r(CWBZz|_AagUegI9MO3#rF$rK+&>h*e4 z22tnY`rOv1J-HokjM7L$z*JYH;H21rGQm1dOAL?%X$jR)iyN!5{np=BA3WJy-qY*# zt_4tcEIK;59Urfj3_Fk$I-DAD>d*I#v06uCPut$B42+mp2Iat^9D)EQNJEGN22We_ z!~4VIAN_TBq`uhuTaqMKdXbi+Gn`7{9(ZW~TXK{gHKo+Fd#K+&H7Z{E;g>E=y?RG7 z`lwM|wkd%vKoSs&alkUG|7@46A8VK!wAL3h^U2(EvXpyP^jc&nzYliAj;f<3 zrJRZ5_@zRKCo=Qwqt@$atjw~p#O98JNQ^PZn0cS;Hv%~62XFiC6Di)1ul1-BIATvZ zN6AUe0jMx@>Ztoc5>Gcr@8KU+iW8DvD0Du;*UhmV-e1<{sZ6O!f_F; RjBo$|002ovPDHLkV1lbmc`X0{ literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/button_pressed.png b/script/openseadragon/images/button_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b1d7d0c94a08de3cc8a851523620f88df16db1 GIT binary patch literal 1895 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 literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/flip_grouphover.png b/script/openseadragon/images/flip_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..24c110c892c8f9210beefc92531111e6c8148329 GIT binary patch literal 4920 zcmcInX>66(5uNX?Ua;{Z2r-4)gt8b53KAfd7LoF(V`9>UC`yD7R-y`|{HfHcKOzAF zL<(x23;YQ6Gmu$1KK#8=UpI)#_v-W20ZH*^|KE@N z3O%_$dG3{;isYA49Qo~A)6nVvSWSw9Xiy5F#=&QB}awd z6oPvqD9rg>F#u#C2Qmp#x^3IGZ{EFockkoJk6YvMcq$f)rJ~VjDiVpL(3k4y==gV2 zQ&YpHO`E=r`4x~du7hwr^%$$v|D}onAp^OP$y>K>t-N>d-fw7_AXpm+0-;!&pgKD{ zQ|Hc|JFs!%#%Hmfpq`>02=!4fna%)|(ZC=J`zYK2-Qv4?_3A5g=FHjWa=9dxN(o#d zJv}{g|Neb}VN4MzEG(4r@^UFIE*8geq_3|}Zrr$`edo`ge`E9J&40qQ$fyjUrrYRF zbDJ7NJEIsF1+shh?m$IF#XinRCX)gN+^5DS(AvhXlF_1H7&J@Iv+`M^Hu3x_{ zix)4JWy_Ym+0f8Xyk*Ol-(e~NSYZsYXi#(a=_MVA|K!P&t7~d%-u3(a3gp(UThiFr zC~mh~R<2w*Cd-#Em-+MO%akco1g?~e7cVMExJ?!=Tqs3FMYOS^q@<+f(xprP!MB|< zf-pepH%_!dF!UvT>Yp)V#%n&GPZEiQghC-@Wcu{!vSGspnLBr`6ciLFBV=XLq)9Sw z-aH)}92}H8ckU=4oHQ948WJ*wH7`RiTefl*Rew{4PJuEpn zIkIZiD*fgkf=Dlnk;8`%YfN#BZmg=R(l*%z$eE?3rQyq$FSlSFm0H~Bk*8rR#tH%Y z5QueDfRm%+1VqZy0Welea3l~h0wRE*sSV`hAzF$-cc;q`jOLXj4|UWFE3wBR?OeSLnATv{+ToK>wOL4bvfd8dByE`M{)o_xEwb?dCP z*$>X@@h3yJv1!w$F@C-U+f0B4M&l;kO$Lr`nvbAOMM5FRge!Zkzh#CAkDZ0y%VQvTQzF<&}{;^S6T~JktdJyi8soTgN;&2vbS^(3YdT2Zt zWe1E*!A_k1&|?|ENyzp2B^r)MX;F!UA|dJP?~`{99FW>|wIgu>K2jtP;NUdb|IU6r zK^T;9C@kIGT@sJR#q0N}OX0F&%%*JvqHf9t#=$Wjri&5@N?e8pk`hB8N23u5tX?C3 zeeW+4i^in6`4cI7`fG%uTT3Fgn*P-!VE`vZv=E6zB@&8A67d7_H2%WjFpnYGAQ(ebC(X?gi$$gSd)0c(PyOwE>Fn&#@i68v$Xjo< z>IS$z3?RW^uf(vS#6UvzF<(JK83soiKK@r2eqvIh?yR3J=%xRJG=CxybaziZbny)F!mo+4y$*3@?e40m*N ze1vf(J%Z7M$NA&Ia9|MG_tV?AZ#Po`qu-8rYip~f`9+Hs$(}uX5F23yHcGvIGw1Bs zv12Uv(A9CoAN9cfh_mKNRHpdmi2iM!kF?10loF^& z%wTM+I0&{ju+fejQZjYw)G|`fASECQ88T4pCkuRf@(#koT=wqW%fS65;_W1~5(wQx zAQ`NnJ(BtOkygkKK~i|L@(wA&v3?3~k=L=?m)5Rbt1mmojwMIFd*~KC#P#ia?AS3R zyx?gBa3eO;2^|(E1Vcs`z&uInBGeOtvAE%_%2yv>X8c#90HB_R(U-u&cVMIf?-OA% zJF@7Z1C02nv5`L=^Dn04|-C=m2d2*$<;h+=@q6y0WG%+aNsN5wQ^J2z0Q34;9u z%XudF94S=rMa96d=5Z$|8YWW|wkbBx4A3Bj#wi5IcDh?QH={fWj7>IU21@e~23ecf zTpBbX2>Ujmp95hFzbu&a`L-q&LqwP^bNPOMe)f=Jh0-hhS;QzUwKNUb@ZT|A3tBJzDmk+%9 zYnXAit$pH$gv6SVDcSM6R+zMZv~K+xd&qEN*76kn`zk^j-&wc%;m5z}(7whsX$o6D zE6pTB{Xary67)%OaKApI`?X^Y0$a@}ueOil8A%J8aj|ByRxyKl4vekt>vgSE!kPfC zZS@+qGt#Gl(MqsI#l|F?(3+bzZK_|te*J9E^Oz8V_VxAM+`W7E1gs$t3?_e)v5$=4 zZVT#@z-S<~Ana}1wzY2AvSmX{OUnZhL*7NoH>i}7D5Z$Bn^dkWMg|53j=uQfi~roU zYu8Os?$+>3pkVnH-42Wfg6=?TSkFHD?5wR@w?5I4ifyFV4>3CQ0VCsiC4EaN!4zeJ zGRvp3Ax8a9Jl!@=ag=|Jqm zhYzp4XG!;u*}xkHJ#&;-Gjab~(Uc!f6pgIwQ9_wYI1#b1Ipw#QlsGbD70es+V?= z?A^O}5M-h?YGViWhe16ZOs!Sy*Is+={(BZL`icGaFQb(+fjTm7$UmJpkz}T+zIgBQ z{39z?l)R}klh zA*-$}t5v(+FpQq|*}>*Dk7lJ1#^sR_hgvqt(&oVLm+G#Oe?)tFdRBw%1TfZf8yMpe z^`YLdgRLf<#0~bIJ$oLTYm9%(diPx??ap#lG%oFkC08%Iw@ifOL<&O%0apSTTi~-7 zFUDRuus@}wWJE~{|H#rgb1DHuNki_MBU+o9Vr>h{V4XqGfoZSfCUhGr)`URNQi#-Q zZf^dHbK8D!py3T83co4`}yaeUwluy^PR+r_u_dsDG1}_ z?MwfOxn9*wIT1=#U@#eQCVT^On^Uj~6+R=vgL%OW0drunz^m|~(HnM>GZj=lqrp$x z!-*#IdbVpa zpb-CPpj!mS3A++1AA@O0Bv_~K{0GsPY0A#_4k|oBE2D(AHePW$J3D*8Rp;R>-u#FG zJwj{2!1$J%IOp@&)qcypI<7>c1IfcU^Ie1bK9_+ae>--(eq;BdDgoW-F3e2Cq7;Qc zMKWNKzn=RbB47es=QH6+zgUv)M4rXk%9d%)Zinr)0URdMbTBBB`M#etv*V`BWI4%s zQjNp5be6XJfyf5|^>bOebL48|Yi%u9QPD(*1akthkiQIGi$Fv|AKo`^5lUQ+vn*Iw zlz6OQm_g852d7XshDB%DO=MzX zqELk}truleL11zy_wQ$NRtYY|CmbffA2-DxGevXH@K|JXQ=OkOIM{=bgM|veRP}h6 zVBjJFhN(iLK)E5@6~yK~FGya6kFDVT=``Ib<#<3KzwI@_?#x;IRvy zU}jJj3om9P8L8-#2|H*bt_-UM9PBm(eJ)e9M#ZggMrBVY?O-D~g#kDx;>apkPL@2j9t!%%z2F+R%vH7Y5pI?h{_iDBO$ml`%JR7daxOHO)x*Qy zRj|wu=+RFJtioa3O`U;>&??X(T6b`8aNjF**>Lo3L1`3%4E$b#BlQtNwl08AZva=^ zhC5~vdVVD(b6~H8N`mK|1%m!!xM^g3eEcNH*KZqqN=#X2D(YcUM>Vzvyw-+Es;gt+ z{PMiHvgEvRQ;~)Bl)Su(kvZ_&gT`RjZCJs4U7V72ZIoOtQL<(pA#c@3GA|r8-h+7T zgOeFxe4c7h2uRg}fpJI(1}z46vQatZbuM4IWGvq52iB9_jBo%%W3XisNG&J?f%mbB zP9Z^&~uh@^1z~a0PZ{feXNxRp_o6!5|Q1B$`gAv)r_chtjR{ zHm)o<^Bms}0H>&f@{eT;Kq&+k1?9jY2n50@;gXWNge0fyjr_(x*ImAuE$ypRDo5cI z-bp!NEH?VZ7iQEEJ8Y)%r%v6v*iUBB?;{u+Y zCKQ-vDSma)8vWj@*7bC*vd4AZ!ypuapnDL=N2~(lDJx)K6IupAVhw^23?D*qa9ML> zW8>qg1nYgKw~$)9z)dVl1W^f3UEBZYX8bG@Q)~5*PkTGt;7az0^Fghj z@M}>SGFm`0y5)|4s=%3$YAuAI5D>mU@aor$W1Poz+>c*~UyIchvqXc!7RS@8Zf$(d z7&CBYiZmeYHht|Q0Aw5^>wPF38Lfki$~6ESW2M!5J^}>hKNSq_LDI@JsIU&fJhqx~ z9}+6mj8@Y9+k(JDNGSYHNQ1&Nx<8YQ>5BFEPIP^yy)%KjBY|JvxAh0JoaNueL+jRT LSiP(Fsh|EA06U4g literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/flip_pressed.png b/script/openseadragon/images/flip_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..026d55ec06395b5873780dfe0039c6b672a3fa3e GIT binary patch literal 4920 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 KMNUMnLSTZq6&5D| literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/fullpage_pressed.png b/script/openseadragon/images/fullpage_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa182aea98eb7884d7e82dc07f4975c02303564 GIT binary patch literal 2225 zcmV;i2u}BjP)X*utmM|~A_~PW% zS6{tvb93{=z|A%7-m<<@3W32?H;+ySOy9e1-MURT-+c4Z&p!Js1;8Dml+-Vgp^%|@ zVO)0EWy!0qy6Uhh$2fY`Hy_XJ+PbN>zq30Q6az_uKqSCTjbbCJvLjl@w71SWaK(nU z-QV1E&pnGi{q)l=069fLQ4EEG;X?EaM9dF9_+Z|=IkV4O^3DtU?OMKkRR8WCUQA~L z@_eZ)6^$TC0>nT}=S(k;F{`mkluw$pW7Ph~eD~@bZ+>*sO*btAkPW5WQbN3h3=7c} zrh2M_$G5gz@Xa$1oY40D()#{wol?)Z!3eJT4Z7{uo0h22%%IvZMN%_@gdkyLy+CyK zk=xx-)t}zgI_<#2cN=OqmbwyBemFu3WMN<=`{IY2sEo6B(H zDPsZ&3B85N*9akzh#b8j3x>lwMJi&rlb)g_jW!f`d3QKbMuowv2S9)yGWJ ztN>sRJ5WomCZ@(b&fToZ`g-8?_fcxcS|O%2lT$sG-d$%?yu5-gKXR<_VupP5+Ya70 z;N#*WYDI08lzz5=F|ndJtbs&!&1TB3-!3!TIxuK2k`?60f)xaTHB5wlOolR3!TN_ar2NCnO`yM>d;9i4z|TC6Y>|@;qj`iE5oWwcu8RqK>##t1)IU3}Or} zG3m1DaUb_xSu2S%oN>b{T1|{!`Bn#icU^|X$J*R!WdHg9T5zXMXF;5M{r&wOhNYB@ z9HhOyz01?}bfVrutOhJrFUeBv85Kmt0HzVj#w94xYJqqWb802terPs?kT~+Z@A2Au zdm)GrZ!yVfA{zYvSS?th*`#hyq}9V_qMKbvNg1(v_3EwdIlj$mt{@}9$*3Zxmq}up zkHKW}0;_u@ZS*+XkQLOI$zxWliP=-j5Dm8^>1Fug|Lt;4@i7(j#fH>2^{_*mUZ4;^ zCLMA{#DB2?9Voyp8(=2|$LoUtZAQI7#$1Oi7(} z)v^!O@azE47s?bA#c0ozzR!eTr_<@Ikj$IEN%{vJF|MJO`!Qtm5afe20b)?d9~csY zkU)W;=Pbk%jo4E;vGcg=mc84yJGH@e-HiZxB0}y^&qQUSkx@Cd412P9f8gaW)4Rq@ z8&ffERI(V@5W zeA6D^a^b($etOS~o91V8`K3aL9X}x=6!Ir8S;5Aq0l1-o(voD!baT)#S*)&{JrHZA6DRNC2DPdSa}=#j`H@W zrJ}`ugrSHCfkF(I_$%HL(SPzSk-s*-zrlY4x#}XU2!muN00000NkvXXu0mjf3ARyj literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/fullpage_rest.png b/script/openseadragon/images/fullpage_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..bfab64339211da4c3220a209dda18efb1ae99389 GIT binary patch literal 1309 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 VQ~vuQ5gh;k002ovPDHLkV1msc@dy9_ literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/home_pressed.png b/script/openseadragon/images/home_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..00c349b0dd9ad581d2c48a6d7120ca0e266c4951 GIT binary patch literal 2138 zcmV-g2&MOlP) zr*iP%rM?nmX7uT`p7oybUkK8JGYWbJ7p6W;q6APw$1L!(rzEJH!QFR7f>Ojs_;86A z+KK=@gPf*BFbnF-U;gsQ>t6S|zIMA!UDqYcmoG1^TD7X?3%C-;$Mp$IouW){3H<{f z_(0~WtFC(1=;-J&CRGrwhYuCQ-eeZi4SFT)H1Yif~C3R96 z;=_Ci?ZY4baOTP@uY7UZ(q6Ic@rN#%Ik>OCGM$fjZBGzRKnMrZ6%v`3uFqSrXmY`& z&)c#mckJ<>|NQ6cR;*Yt1E3*kN!q@U7ZxI?Afn%Y|NYCBU4GfSH{5;wvyX1xd{*UH zfwfC@k2tPSrHVozhyVx$p(>+lB0`PfG*6s+?$}w+dF7M0+IF*|%zy9WfB*Gsb5Cs?tQ?vaYR&fMF~uEHO?OZ?cvjK9K27HtMe|~u zaINlme7a2R{8YM9I=bM(=e?LMSiIDg&r=?N2rpAere{|4KmPHL=U#sCMel#|pTB+M zv9&v+-b~HQQq>)`EZ#3AlDZ~hstQw6iK!^WfC2-Q8-xhM5rUSR9xu#VO{cJE;j>=Y z@&snLZQE83RT=MH+P+9PE9ako{&P3n`L|b0ZQdJ|f7ls~7~Vk26p54$MOPSA89<5r zC*ZXNcS^PpMZwi37mO%ea|CG?8n(N6uhurTS6p`4Wx0R+;~z%@4|1^lMX$^#68*aC zu6rIUO?+_diPaZ)6J@z1nm0Tzg3N+Ao9t6Hdq~&%&QGZ3f~a!q;i7)-C23|xHNss& zJO>b-pn`KsJrAVPfWhn-8|-6db~L|b%a%LyrtEt+yXIM6G;$6HAd8^LXB*MnIkdUxp+rNfX!{Y01Usr z?f|aaS5Q;W?$Z+I#1*5@P!v<49t0)hRWV3v3uKG}Fak1ELTHb&X7XbF<)dS<#@_ux zDHox4WRfP;vnE@$vq%+1L6@LR_jvhZQ~2iHhZq*e6l)|x6pK->)gbNMF=16_BD$_8 z0qCI@Dtawb=RFe@c3r3C0-QrTNO|2uqLo{N-!FfXeC7L(qEe}#6O6GSb0U;d)a!LT zx$Y3&_uU8C=A&C#b8HjZ(+3Ez6^JEThUa-kNQ4}(v`MX26B))yEFy@-1k{K}>-9-; z{zx0=el&x3eS9UlVVMjUT`+`drGy=Os_4c!i(~ld=NF68qmzVLHr3KXFjG*XxO1{S z-uS&+h+?tW%tmxO(x+0Z4QQ5t7IQJbA83yl2*$ZfqIl}IOVJ53awobGu_!K|uVXSR zP$|2VG65^5l3J8GGPBO9G*_a-C&$7$aH=R7(oV43~&@ zn;ZIt24Bq zWG13g2t-c`qDUE86$r*mzKtLK=`eouhl2=)a5=!6o#$=t_v7g(srC<-?pQs3NG?;p z+e-NG@G}!^7wrQF4s2aJZ*c9q7mvP5Ei@n^4ybA)Yt-=IPZvV5On?x0O&h%3p4(sk z>!qNoCPiErZWG+Df~g)XO+#Yw2!6DtxIUlHj|X}i`?#-z0Ls|dScz+W=EYZxo-;yA zai9TWacHWG;k1jPsExr$6GJgc!p3mI!BG6^a|2cb8Lc5DTc8bscr=THi6uur_2aD% z6$*tN0A?knfRrZ@$IDDx(#qv>o4$85dEkd1z38nYc`s$V1qfjSt}V9&p#MIb2>)>u ze)r2-3M?yw^3eIkw_myG0l7S50LqeDpzG_I8HDB@QYw||Tu^8AKH)z9rAvnTnHxd9 z1x`E=g@aH55Ds*<5Fh}+1<)c;8wR4WVT`BFnSS-Po9@XSEAFvvdoO@OS18c&iC!`Y zHOWMlVWHl1t2aGTI=bk>Mad;+Wzt3+40R6P%YNXgnS$qeHO_faa>Rd7tCEVp^+kF$YKO5nhDLfsV`FP7D zYG}|8&)RNiy!Fm-ygj*8c=-3}1`pu*+pxrcC3<}&qK4`HmB{}w{u>wk7w8WF@?bSV QcK`qY07*qoM6N<$f~LC{^Z)<= literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/home_rest.png b/script/openseadragon/images/home_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac397da6208b3c05f89f49b5482e3340e6bf530 GIT binary patch literal 1258 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 literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/next_pressed.png b/script/openseadragon/images/next_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..5297c52661475ec06ad3ca43c3494abd49cb1220 GIT binary patch literal 2411 zcmV-x36%DUP)`+p+jt9VuE#LM090CN2my$&*zntQXM&RBwT)OnHMTU9im9t;NT#;_~MH>0OJE6 z_>4I|K5FK2R&s1)q)#cuJ>^oVG+Qf`O4XxBE5YW?_jv%kC{sbPSo8~pg8yt%^jt*l zxZ@5Mr(OQ?mwy=e)_1@B#&svGTOYLQ`KiPE`u%pBfd~Wn)r(r%#e)YAK6=Hq*X}s` zwA0D}{0MJ&c-SqM%OQZETk5&UP=_cg9+iZzS+mCc$*+Gs^uc$%10@38Uet%?5eBYw0a=- zmECvW@}&b0PYf+iR*3sym@#CS;)b#rK@h3sFYwQs)l!JP-L z`R~8}wbKFSWH#GeSXgl55~>)8r|O|vtwsQhjT<+v86WKb;`ZBb_}rd5?jG^xn<~qM zKVVxb#Uc^Tv}Cjrk=7a^aTRc(T7D2Vrxtjlx+SZ<;G=JR^_$%v{q(2$%+pTWp74DY zl}tw^TNa@R&3m&F_lfbvFMd1o(GS1xlSdxB_g6%L6^U#;rX)PchXo9T2~HyVwuv464*B@ziS zH#aAL``e$q!E9H*dE}8t-rAg+VFQK{3`Y`aX%H8pBfu!S)r>K4P7zB+iog`WA`b#I zV}K^tgMgc0xeS_|m9}r+S zpF1>^ashM*BWOjYyH`H@&e!If(^GG*P8CK(t*QDAOGg=DQVK9r5EBASFc9y^@a2Yq z3ImvAKnEe(O%0_3Efm+jPteu2PS4C_hVqFG8%8su`wD0Z-){j}o-Fl*%tXCH8D#kC ze15z>S6&q^)>(>pkdlH-+aNn@la+NyCQUFyfH-@+?X_OIIaZk?iyIgwQ&%fhU7uB2 z`MwSVUt_+dGsErUj?X3Y`+&(nHI1luL^SH`3DXp9ejV80x91{lR>(z!qN2PhF7TmUOFSNBg z6Tocdl8)egK*AF3hERsFyrGgn&k9VF`+ktp&AP3tvj`eKHN%E->>TakNp{;rn+GJ3 zOeG+M5%&y1YX!y#rD6qlZaIM4w;bT_d;Kc*+5TiWJl70Wt))9fG=r8Yw6*~*l}2<| zFNr+maYok_wOTDCn4*Ni$PyZiTo!s&R++BS^$!(+MjL<~!D3{D7onCIO53PZJ>0wF zQ5xHjWgnK7vZbbuJLif5&m|yW!st2&>Mc`eH5${HpI>aJBy&?4lTyNGcG7@hfxSA( z@u!cD=)mHTl2iAlqBUS}!epg|3vM`uSFKLt3mY=}LrJOCY?NK$aVKps&*4$BT_0#_ zNC|jYSx+icYi353rc1N=0b1xEFp)Of+;K=tQ)8V)c=eE@MM8iZOveMg(leG|*epS- zJ~f7quTAQNuhFjh@KRuDQ&2V|*8XKbKm*Qn&1y(m183&cOe`OB0%Gr7mG{Q zf#UnhRdBSSv1YWk@!s;qr(Cz=y0t@g>0qT*0WcdMYy9ra=m;fwU+7@Y-FvLOcXhUJ z^V)p+z_a)#t!R$YFiw(G8abH@NQ7u}#8cl}CsMDI7% z=H|lu2>i{D9Ne38=&m=9<<`H>2-es^gDH!^B?EPx|I<@wAkIwaYZzL?&N(>D?Wt?G z9oe?;K;dvcXV(k!tyY(e?(n3{l!0jSa$cW3zp!J+)TUD)n&)TmBjrw6*YlA?N zhzVMfdVFWnE9KFlhVr!*A&^KrG@s1P{qKs&yKjB)@Sd@pIWt*r)c`aj-0ss*{#0jq z?RFc&2IW%Jp4igx0!#3<>j#F8OHfhi-%hsgFY5y*-&T6yq|5hC0D7;K#`I#tn+H&f=qc0Fp9AxF z>@CM}?5y3)6lO7$S~c>{PrfSk)~~&L_ziCvw?+qLm|~vCl+s{~0BPuAi!JP}xHH#2 zRNiyyebc)!zj$!KL0Ji7damkM0d%OxCGww(3@wj(EM$%6cxum7Eel}yEpHlo-P!?T zEX9#Ynk;9VT)JKuG~8fewxt&*7yX5Yw-%2AD31?YwV7JD*laF|G;Gp*jz<5HH{<{S002ovPDHLkV1jO%l3M@( literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/next_rest.png b/script/openseadragon/images/next_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c5a3ca732014d06beb4fea48ba424ae9650a6d GIT binary patch literal 2027 zcmVHrK?Y}fL(f7Mk$*a7qo_255sbrGQ z?bGL?d$iAKDuf*s&F*lu@tO)r}iB2CrVdI`H7Z1Lx?`qqXktZl|N8!@Ya= zu5;(k9Vbp!@QKO9iEP`pO%G*H|M8E1Z28My{xWCElqr)6g+dEN(!P&>%*7r)eAsjL z?AhBNe)!?3_uhN&K9B2y_V)JL{rmSl8TLFv>P19|zd=Zh2@@uy|Ms`PwSDuO-<&^j z;>7v3ZFlRso&q{#0!)*ue1k$kwOaKC2L~S>IB?+f`t|G2?b@~L&ZSG222irr)6-KA z33*9E#*2s$bCb|y-+ue;1wZ@Q&wh{OOH+2L-84+)d7cC6s3KPpiE|r* zOJXWibv=|>7hMENb{E@Mot7GyMhjEoyM&ZZ?yKBmmT zzC?NYsJy5Xc5ppOMv*HD>CCB9r;etVlvtG;sUoZAW0@!qio{${5bzt>EnpV;uJGi^ zlQL=)@YNuVpEQ1SsX~e&P517=Uq-@MEEXd&unLXMPoOfHj0xH)Jr^nOSQskVTvGl0 z{S}&788w8Mjwvw>3ot1nhF+Odxh#s)QAxQi7<(w zh=!!Kp`jr~5=uEMCQ^{9jvYJh8q((&Ci!A$31f00=o4Oj#flY8RAZHK>5lTA0NjF9nf-@g5X?&wu2rAAre#KVThj~{=AUU8cwl`1lU7B?Xd0hdCk z;A1=+>yg>BXJ24pRZ)&=GC5A@B>1olmwk+PLJB0v&<6rm<#B+z#i3}pT%MQZ0|Q4M zR+pq^vO#jjh!QtRMwDRznP2|$mnX=xK8_7Kd8G4=D4o52{kqE$;|U9@p-}ALl^_Fw z075SN$i2yvCqDpFSbdgU7yzCm^`l3RTn*!SpgqGFr>LGmQH_I^j=5o8WeI=z=FOWm zhCPxHqLBC!_{k0&0H5lS7b6h63@KO25a*W2%nBPxEs*d%3jrnxiu}5alW#;_$P{<% z*kMs=kEFjcMo85`sLsPpZrw1I)Il|rcoq>76`qS|45rgx@`SEq z?b@{gs@$R_JjCCi)C#Bp_j$^Q`Bahv`znfGMV-t+*nLS_IY!t{JH3N$1qWUh2y%KafbdWx90P^Qgn2L*QE z3=?NiA;z z!yY4{%E=Kywgiv^1&{_oD1B9cT7!@q6ml^V)sTo2FX>PGCl2T#sgwYf(kTo@QgqZ5 z6Q;>8d9MhkF9&zbrO!A#mu!wBA^|@6pSUC;ff2$CiCMrD(AuM&I0~@`oEY2?{wMx> z`w3NwV1&>^MCQj3Cji3tUy!K;84IN1NT{ZVP~f$his3Wc{{d&lSLL-$7lZ%+002ov JPDHLkV1m9S(G>sy literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/previous_grouphover.png b/script/openseadragon/images/previous_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0fda1b5f6263456ff4a17eb3200462e9df54fa GIT binary patch literal 1933 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 literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/previous_pressed.png b/script/openseadragon/images/previous_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..75c7e7d253ba307c55b9b1bdb2d53bbe2dddbf33 GIT binary patch literal 2413 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 LNkvXXu0mjf369FO literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/rotateleft_grouphover.png b/script/openseadragon/images/rotateleft_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..302ac6285f316bea6a9445c2b992a79d21bb88c9 GIT binary patch literal 1731 zcmV;!20ZzRP)X+Wiylk&@larb^_2%}e zb5XZPifAV7)q-u>g0R=j4~b4h88~K@X0^=&v{_SJiS7wSCnG~}40-@ASBn&(EfNVJ zY1R~BDHfTGG*BTDy$pJP^2sNc4j(>zt1pA+rTx^@)O>&Hsi!_^2*iLcu0)8G*Bv1l zfrtzA1o}Mv^wZlHFJ63?Qfh3!e*IMc{{21tECNfVQlh=RT>)M)nXLNq%P()c>86{0 zz*alZ0dxX!AlV%u8G%SIpzoeNdtT|=x9^5w!-h#i!gmH$L|_sIBPm5v_4W0lp`l^d zh7B7o!*&bMW=O@lBP62`*|%@su0ewaO&B$5RLXH2p4!6$eIk5#U|MVcGrpr-*OmB= zgRm(Os$98p7%{9 zO(hZua*`xU#fYx1E-L5^9Xiy5kI`R!_0@H{Q7E?z`{) znu-wNKIB@;D8sh*!i5X(9x-Bs#A#Dhgz?|GbB8J}E|$f`MIvmYMvWF@$BxyVot=I~ zSxGHG!b9~5_;XJ_`Q+Cu0zxTb zu`Wr~Xe5NN1>koy{Al3w7*huXw#U?|rGGtRz zlOJn3BAJek4j#@s>7&tV|UO2S%NT0Hzs z3Kf^wzkh!W;Y`6Vn`5tZB)A%LGmv4wV4N9y1(h_)H-%2>hXd+}k3Ray#f7NPKKmRG zeMY?e^2_SO4?jpdrm|2%LkW+{k{p#nWin*(K#kubqxlDbq|}T%APqE5=AqxD&O7gX ziSpMaB_$q-pLN#R8uyX&%{O2B&I=0*X)^YNhLhCfgD^uSr%ajRq9R=uz<1w$_Y{XL!X6`RWm1N1?3rht`4;VaA3CcG zxm`G9xC9Z92$bSQ>AF1--fNPvSlmNSu!MaglP6Dhp&;(Hoeq*X>%$K}+-(h6fjZg= zH$1x=|M0^PUv1j7=}gQt13-qCp+t_b8e|YQ5@Wtl6^4ai__#NF_G||sRcr$o&KmBy z=bjtPfYl7N1T&3ACi6Seu3fv{!IX9;mG1H_Mc?LFw24k?^f`RJ>3{^vTgO3|Gjs!$tB!==8 z9Hu~`2|eXW&d(%5M4Evk66y~OG{pLE-n{udD6#^ueH{4y`|sa0rQ2!3(HimXAo_cg zA=S^Uea!D&t9hFCkS5a+;l1h4y-`|InoTAZ^^NlX^{)Nz{}xP7i0GUPv Z`vpbOG?l!-l_CHD002ovPDHLkV1goEL{R_$ literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/rotateleft_hover.png b/script/openseadragon/images/rotateleft_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..e757d87a673323d6e8704e1ba4be0df689fdaf0c GIT binary patch literal 2094 zcmV+}2+{Y6P)BUZQC~f|Jt@~+qP{V+rn7b6SLD;Yu%MyovBn;rYe_sD^HB4 zzOV7E5R4a+zD<#iPJ#68-y4!Z4cuTETtn928S*3WlGj~>m3)q-< zAtVaJum_+|kT8%^qlC!c(wfh|=}pHUdi?S4)P=%cV2raM@QE=)5=|+Uw(UZiRI3|* z^Ru76`%Rzv^z8sThOWUkgob#O5E(=SEbfx{a;tB73rsVOd8|0m^L2g{zp1p~I$#f+mThb}tO7 z^{}w#o(`QgE8Cg3U|v)%Z#?GQbFTqVON2TpA@Fo%hBj9B)*t-fb29I(oLSktUT$CA z?KXDk{L{!yrJe#-9g-g=gfMrZh7U+HY-)^q4vg@C`NkDL|eCO zE~BAhEaDomq88)C&1N&z+i&a6v7Ls$GF!Olvddobk#BwL{-j0W@a|4`(;_=^GfOkI zYOV9cladqWHUnng@u1)vH%sFCK8DHIEkv}#ZLh&CyCJx2aTatL3wqpW3mb5{k3S}z za;Zs*#f1R8p~?&no@BZ_>AmQOAN;`6LZw))Qtoyhd_u>in9M~rTE1kvYPFhZHk)X* zTD!RKp_qL1>lR<#ZaMDkl4aQ?!Ga1$tHw~T8?iw6k3FKiN+pbxVjp|eD=z`yCNg|f zn+7thIBV7^q}vTpsUq4kMFZ}lH`|I&Jh&R)b^l_~XbED1bUyceumhHMovZh1k!ZUU zqO6rFcL?eYhIX5yQU;wjKiYGzy^a9z?Lk#W$|TS@3^@-1ts70ox{*+uCG{U5s*sV< z=?B!=N540Z5rUD~x)pTq{FHT&t5nz#ij}2eeh3l8+LV#1pr_*~n(n}`$e>N>5E;e9 ze1I?|g(bC3JBr6^BHFtl>f_bZsl?LhzjFrWE3WzOs=VcQiU(6P9T zg{8I4wc^v?8-~tMCkT>^l!>E|MPW#&)`A1Jh_%I=l*tX8$ww((efCym@emiDuv35W zg=_Rr-}#t6@5G&m<9M3wC7@Rfm_0iX!d8||w6F*S)0)R&M0!$1qvjz#LPqyLU}UJs zW`#uvB?N*gFkYiHUSm@?r^t&>E$Jhd_z3UFzya{mqpN896u-ZvfPS8=Sag3|bBhBY zq<^7S&SRY@q|z{Il%S(zs#`YSG}Y^I<$0FKhoEAh-z%YeC1ZS0+hFkvx!)jsU5PKRY1^*VsCPkPu&_f93o!Q=Pb^Nvch zi5q(X%bamC;eCmT5Ugm(8G(ERUNBOIzQ{w{ZIo*QAAQayEDU0xf$56%U(cR@0&eI9 zq}*)brWC6abzBopUhQinH*|2Rr!S?^a`Jo;2S5wI4nwkr>FdlUBtBIo70S$QdSH zd-W-wyLDsd0MF&P`uN2-_waehu`UobF$l48Xv!>pdFOU~`{qq(`!SAOpYX%-u$TQ>efhU*zMt&6e$tNC_^X5Qm$aFr zb(s-M*Flsa9+K()ee0$%R+I@&YD!DX>^ek@zoPulueJYo|AqJu|35Q++vpgOU5t^x Y0z3gJtqq~URsaA107*qoM6N<$g3o3lEC2ui literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/rotateleft_pressed.png b/script/openseadragon/images/rotateleft_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..1480b1ae48975d491769388c758f1acd39cac296 GIT binary patch literal 2036 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 V+AcUF<%a+O002ovPDHLkV1ktsRHgs` literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/rotateright_grouphover.png b/script/openseadragon/images/rotateright_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..9e71371209a165941aeb234f59ab46ebd977e822 GIT binary patch literal 1800 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 literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/zoomout_grouphover.png b/script/openseadragon/images/zoomout_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..b588ecf77670d984c29ae63728b44eb7ad087ef6 GIT binary patch literal 977 zcmV;?11|iDP)Rx7s6&iK*kw65H}=1}$ulG4-;F=*CM3Ww zDt6$(FtutG&&*~pr@s7Y|2x0Y7c>S8z{L6cf{NEHJfie^Q4l-Jq?+7A_iuQ6BvC8_ zr7;!`*_vB2xJ0p!M#r`FD(oP-e0y`=w(uM+W#rsB{!0 zpAZoV#$s^eSx3{I3^oRs+Dr8pW$|RO@$^Iz&e$Rg2?PR445Ri;x(UX_u#=s!IKm~5 zO&<(Aa@cx@L;*foY$A#%Osqz-F&phE(;FO+!(}J^S;W5XUl<3NOu%CtNcCEmR>kcMB9G>o`UnkK|X49D> z`tduvM^T_88>OQd35(%>%o)C)o)V`WDWoUsnLKmHa9SuxGN|-yJW88>`jKt|^4gO? z4BjO7ANy&cgqNNTvXaHX0bjZ|C7lOrz>UDDfaFb>_z z>LKc8*3m~5)fNKWvI?SN#|=i$$ig8*R+PcPirbWrhb!`u_*GpsUn{9vaSs<~$*y|g)-*K{hNEHXu{nySbM7bLP!)<(Dn7&o95 zGMR8EZgSsDx!!`B)7bA2Q(bVTyz}mRe`70pF90-CsW?x_ne&cGMV@-1m~&}`P)Vu(B+s^JpVwXx4xgSQk9Km73X0brv=rDSh^ z${QwT5jWp_^A+8}&U4^}9=9s@3UtXKrWFSu4vImmG6Z==w-Tl$rpYKt#2HnS4z+l5 zZ|R`@S01x=?b-`|`O9D4mR`s*BLytyTHzLV@#4jo`!C&6sg0IFGM7Oj1%$B&LF7UZ z&Vpgo!kZ$#1`cF>lWwRvpiDT*SfI25D)bmd1!h9eVsqr}B20;9=eO2ttq(~gFiCizIV%k} z+$F5G>iFZ2-#;Vc?5?kqcNguq-+m`}!!P;a2*D%LrTvRyc1;)@}0EqwF zlE?xU1Ee(Q$QU`JbP`HMaY8E57>)ogThQy<>Ktw_9FwqTZdfV_n}xUg5x-l4I%=i6f_zQ zh~rp%@bpFelM5E8XlD&rH9^!(UaC7nsb%Fh5u8f~>-9RZIAVU>bT}$>I0tVg<}o&K z`}Xb79;H$Vn$0G(M{u~pf>0cS5LBq3KrwH|u5QWZyz%qj+SAk1^$3wVbRbAe#*vXT zCfO;gg!$G-_cOd(AbJRM1tkP}TGH|87-yvJxQ&qUScAtUuNxlOlMNv!So?ljjE|4^ zjq#4eFN9oBXzLm{e4@q=9<0N9K($tZTq{w{#X1dgJ)t^bBp^OI!$i`Y-A`+OJrPf) zrl!)T@ci#4vY3qGQcSYz!8YS++hGw6L4j~SU3Y< z4uZcd!H24TV`OA-2LQ-a#>^#SEb4&=9@x3hKA+e)xUzF~_vlPfA^ALq2*oafdn*3a&5y~Ktjse2&`5=(MYRu8du0+!)ZgEK=Qrq}6Muee!&@~H zmO?-vAAq&CVyRS)1R1mpE+bGG07^Dnpom~BRIs@PN8nbd+-czXGOu0xm-5cBYV)2j z44(#o$&65(sSNSCs+J5z(%LlCU@yh5&@XHG(e)XtB{h z+3t>f?oaN}FlMP+YH3bI@;=Dlc&j2Teo8Sz z!AdQ&xkN;XWimZToDyUR_tdIzm_I1Rv~`I|y5q1VU>QlPP-`QtMy6+aLrvTpZ*O^9 zgYV?@+A2k+=(pM4&Mnp6{HN>=lR;ZdyTp6(lZcr2Cz1Cy-u?mq3jpalfBHQLp8x;= M07*qoM6N<$g7xO3{Qv*} literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/zoomout_pressed.png b/script/openseadragon/images/zoomout_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..679c5cdab467bd848b8623b86ffde3bd5abe9149 GIT binary patch literal 1997 zcmV;;2Qv7HP)kpI+MqnCl%GK{^AcNA#mXiLT6y8e- zVX&G!^{G!yKIb{l>1i|?EDS^Z=Rf~hxccg=%SIs71cuPiBDGeTcnRlaFMCs#OY#Lk5Mw4*otW6$D+vwfw7rKD^~LWO{+fI9+{-JO;0%=lbp?_&<1zC3-y z7r*$$+yC{ie=Pz)Ra4hAjF4;`#uYUWxzkldMAG#X=Dn`nW6XG#4%wTC8 z{Z^0Llo@&P4L|(qvoGI#SAXf^0$F8Wc5@L9SYFugxT;q;vd4B*m#}48p|UH1R0~D) zm*zW5g{jQW$2^f|Hf##@cv>uu0XT}1DhjRO&FrZn5D~v zD^$BBR4QBb?L%km#^I};wr}6QT>#LgNoX96FzsP{X3RMG$xnXr7+#ot`NWO4?2xlX z-6gi{a~zd)9AuVYXbBENi*UYz&~RjghzfN{#DElIQUaE$;Br6B`+K<8JG^xG@ZqJ^ zDIZ;jqM3;Wn!yLq{NJUtq|X z0^;YFWN%@5*XGTeHvvFW<7w>30*WFoGjDjq8-~i$7xq?X=Gwe^5OmotBy}U)=D2`w2}gy?gX<7G7Ea+$ig!gP`_!3nIiWI&6ow6qMj-8KQO(G)8b z3eXylepo-UbpUo-hzJBcO$BNla8P4u~?!3;G_t+6X2dM2R`qo6Z zPro~utO4_qlDJcYQBJU7)FY7qKucGy5ELqq?Ey3jHE7i9;B|*cNyK!I1D66-&@Wq# ztioi7l~Koz9lNl;XV1m;!|gll*;%mGg~+S`03?K^8iZvuV+l1QJV0UTW*=#vSrJWgF7>i^Qw~_R;mEZAwVY0|6hBM0#H6e z(o4Z|-(dcC-#&X$cT-cQ(Q>|t-41w@bUJN&ZEbyfM#Bw`uVvB-n%%=ajk`u1045L| zX+!&X2EKNOyy2?bCl1$YwJ887XqGi~lO+|E!3bhvVxpkz9&h)7;Vna~unwRKEJYxU zjQAfC%+aL{fEn>$Um~#>~R3d8JVh)ks6A~{P!M(h~epZ+kM;< zhBMtk$s_OqJ@ucBI!3~7)-}yi03d1+--5K$1ErCj`Def9&>t6;@~5SgGXRh`S*d9n zEi&;}5xsU)6tUozvlKq|$r}gyM3{tX9f&DF3xIJ1izig{kqK#`o?U#^GM8+y?a;kdiAqxSN2fs+T=95zKt>tH%!?zfimw zhT&>9a;t+jGFHO1$YAswtnoA{O`0**<$2x?T@E(uPdU)p)!Sh?bGf?zx0@HUQp&PY zDzBL|0?V3`DNRP=4&-aUs#qG&kci+SVn?$iB54{6HNK%5p?2@DD)AZOM#$DU5p0bW z+3?6T5|~E)2#uIkm+s&7)`%H|q4lmE8Ulm7pV!+fOSNA94XdFdm@KqNJOn?9L?iwu fk%ur4?q~cPu=JgC>T4o300000NkvXXu0mjf>sHZU literal 0 HcmV?d00001 diff --git a/script/openseadragon/images/zoomout_rest.png b/script/openseadragon/images/zoomout_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ac4abd825fd63e7bc20b18a4d51efa9dae14e4 GIT binary patch literal 1153 zcmV-{1b+L8P)2*9_UPD%ZCltSt617U5%%#aT4fu1mtAbzmaZ^D&-8S6RsE?`!)yHS5oX^0 zN?_Pg4PHUmW^GHuGyv;=C!?X>_npx&1BV4}zA_DI6lC|4HdnE2C~S=b=iKahQwbOB z_3B$8Bm`28&tYK9cv)f2a!uykN{ins})N|m2}yZ_5KD~Jt!)s`Bjv9!XyZsOK6 z_dSJ=5-|lLFalRh@K*JsFCYHwjg4rbjRXR+Ct_PjyqAwVcI<`DBnj145)3wTXhm)TN>FN3Ffu#8h_{NMexrsm5lTF5-+!hypqlg0ukPEe$j zOmxU`m3&h)gKy@MNz(BfbiE|N+pDJ604Wj;&S6_G+h4Qmv{ z$LkJUd-$AFjv^?Hz&5MkmnOap>qR6G8a2EaELeG$?RNlGS}93v8*a@{K9~LB?`RdO zXrPT0s-s~B``@ZHeZXFsW<3$x6oF3_)+|4{q4WdFsG1E-f{bRcu9#T0|FPpd3e&A8 zVtg`h?Rjrf{#C9)1r0<<`kKLkQf)&1w8t@%W1^KNq%aII-&q)I?|G*v{u%#@5^4y| z4oJgksH3Zt;?~E(#PXrO3#n2PM#g#0n<>oAeK_+_T=^yWSxc%2ds#N!i!IpjkwM;? z7&~eFfb+creZUM7Sz6={_B*ru2-2+E z*pT$+FYV~?)iRB(>7C(1lWOEP4&QC4%w@o^QpzBqdWv1Wn3&q^VzOJsu!H&^Vcl}W T`Qdz700000NkvXXu0mjfB_}SI literal 0 HcmV?d00001 diff --git a/script/openseadragon/openseadragon-annotorious.min.js b/script/openseadragon/openseadragon-annotorious.min.js new file mode 100644 index 0000000..b1e593c --- /dev/null +++ b/script/openseadragon/openseadragon-annotorious.min.js @@ -0,0 +1,29 @@ +(function(ke,X){typeof exports=="object"&&typeof module!="undefined"?module.exports=X():typeof define=="function"&&define.amd?define(X):(ke=typeof globalThis!="undefined"?globalThis:ke||self,ke.OpenSeadragon=ke.OpenSeadragon||{},ke.OpenSeadragon.Annotorious=X())})(this,function(){"use strict";var Rx=Object.defineProperty;var Mx=(ke,X,xt)=>X in ke?Rx(ke,X,{enumerable:!0,configurable:!0,writable:!0,value:xt}):ke[X]=xt;var P=(ke,X,xt)=>(Mx(ke,typeof X!="symbol"?X+"":X,xt),xt);var ke,X,xt,yn,vs,ys,ws,Yn={},bs=[],od=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function ft(i,t){for(var e in t)i[e]=t[e];return i}function Ss(i){var t=i.parentNode;t&&t.removeChild(i)}function Oe(i,t,e){var n,r,o,s={};for(o in t)o=="key"?n=t[o]:o=="ref"?r=t[o]:s[o]=t[o];if(arguments.length>2&&(s.children=arguments.length>3?ke.call(arguments,2):e),typeof i=="function"&&i.defaultProps!=null)for(o in i.defaultProps)s[o]===void 0&&(s[o]=i.defaultProps[o]);return wn(i,s,n,r,null)}function wn(i,t,e,n,r){var o={type:i,props:t,key:e,ref:n,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:r==null?++xt:r};return r==null&&X.vnode!=null&&X.vnode(o),o}function ur(){return{current:null}}function nt(i){return i.children}function Pe(i,t){this.props=i,this.context=t}function jt(i,t){if(t==null)return i.__?jt(i.__,i.__.__k.indexOf(i)+1):null;for(var e;t0?wn(g.type,g.props,g.key,null,g.__v):g)!=null){if(g.__=e,g.__b=e.__b+1,(d=T[c])===null||d&&g.key==d.key&&g.type===d.type)T[c]=void 0;else for(h=0;h2&&(s.children=arguments.length>3?ke.call(arguments,2):e),wn(i.type,s,n||i.key,r||i.ref,null)}function Sn(i,t){var e={__c:t="__cC"+ws++,__:i,Consumer:function(n,r){return n.children(r)},Provider:function(n){var r,o;return this.getChildContext||(r=[],(o={})[t]=this,this.getChildContext=function(){return o},this.shouldComponentUpdate=function(s){this.props.value!==s.value&&r.some(cr)},this.sub=function(s){r.push(s);var a=s.componentWillUnmount;s.componentWillUnmount=function(){r.splice(r.indexOf(s),1),a&&a.call(s)}}),n.children}};return e.Provider.__=e.Consumer.contextType=e}ke=bs.slice,X={__e:function(i,t){for(var e,n,r;t=t.__;)if((e=t.__c)&&!e.__)try{if((n=e.constructor)&&n.getDerivedStateFromError!=null&&(e.setState(n.getDerivedStateFromError(i)),r=e.__d),e.componentDidCatch!=null&&(e.componentDidCatch(i),r=e.__d),r)return e.__E=e}catch(o){i=o}throw i}},xt=0,Pe.prototype.setState=function(i,t){var e;e=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=ft({},this.state),typeof i=="function"&&(i=i(ft({},e),this.props)),i&&ft(e,i),i!=null&&this.__v&&(t&&this.__h.push(t),cr(this))},Pe.prototype.forceUpdate=function(i){this.__v&&(this.__e=!0,i&&this.__h.push(i),cr(this))},Pe.prototype.render=nt,yn=[],vs=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Zn.__r=0,ws=0;var Ft,Le,Fs,Gt=0,dr=[],ks=X.__b,Ls=X.__r,Bs=X.diffed,Is=X.__c,Ns=X.unmount;function qt(i,t){X.__h&&X.__h(Le,i,Gt||t),Gt=0;var e=Le.__H||(Le.__H={__:[],__h:[]});return i>=e.__.length&&e.__.push({}),e.__[i]}function mt(i){return Gt=1,fr(Us,i)}function fr(i,t,e){var n=qt(Ft++,2);return n.t=i,n.__c||(n.__=[e?e(t):Us(void 0,t),function(r){var o=n.t(n.__[0],r);n.__[0]!==o&&(n.__=[o,n.__[1]],n.__c.setState({}))}],n.__c=Le),n.__}function kt(i,t){var e=qt(Ft++,3);!X.__s&&gr(e.__H,t)&&(e.__=i,e.__H=t,Le.__H.__h.push(e))}function pr(i,t){var e=qt(Ft++,4);!X.__s&&gr(e.__H,t)&&(e.__=i,e.__H=t,Le.__h.push(e))}function ot(i){return Gt=5,gt(function(){return{current:i}},[])}function Hs(i,t,e){Gt=6,pr(function(){typeof i=="function"?i(t()):i&&(i.current=t())},e==null?e:e.concat(i))}function gt(i,t){var e=qt(Ft++,7);return gr(e.__H,t)&&(e.__=i(),e.__H=t,e.__h=i),e.__}function st(i,t){return Gt=8,gt(function(){return i},t)}function En(i){var t=Le.context[i.__c],e=qt(Ft++,9);return e.c=i,t?(e.__==null&&(e.__=!0,t.sub(Le)),t.props.value):i.__}function zs(i,t){X.useDebugValue&&X.useDebugValue(t?t(i):i)}function cd(i){var t=qt(Ft++,10),e=mt();return t.__=i,Le.componentDidCatch||(Le.componentDidCatch=function(n){t.__&&t.__(n),e[1](n)}),[e[0],function(){e[1](void 0)}]}function hd(){var i;for(dr.sort(function(t,e){return t.__v.__b-e.__v.__b});i=dr.pop();)if(i.__P)try{i.__H.__h.forEach(Jn),i.__H.__h.forEach(mr),i.__H.__h=[]}catch(t){i.__H.__h=[],X.__e(t,i.__v)}}X.__b=function(i){Le=null,ks&&ks(i)},X.__r=function(i){Ls&&Ls(i),Ft=0;var t=(Le=i.__c).__H;t&&(t.__h.forEach(Jn),t.__h.forEach(mr),t.__h=[])},X.diffed=function(i){Bs&&Bs(i);var t=i.__c;t&&t.__H&&t.__H.__h.length&&(dr.push(t)!==1&&Fs===X.requestAnimationFrame||((Fs=X.requestAnimationFrame)||function(e){var n,r=function(){clearTimeout(o),Vs&&cancelAnimationFrame(n),setTimeout(e)},o=setTimeout(r,100);Vs&&(n=requestAnimationFrame(r))})(hd)),Le=null},X.__c=function(i,t){t.some(function(e){try{e.__h.forEach(Jn),e.__h=e.__h.filter(function(n){return!n.__||mr(n)})}catch(n){t.some(function(r){r.__h&&(r.__h=[])}),t=[],X.__e(n,e.__v)}}),Is&&Is(i,t)},X.unmount=function(i){Ns&&Ns(i);var t,e=i.__c;e&&e.__H&&(e.__H.__.forEach(function(n){try{Jn(n)}catch(r){t=r}}),t&&X.__e(t,e.__v))};var Vs=typeof requestAnimationFrame=="function";function Jn(i){var t=Le,e=i.__c;typeof e=="function"&&(i.__c=void 0,e()),Le=t}function mr(i){var t=Le;i.__c=i.__(),Le=t}function gr(i,t){return!i||i.length!==t.length||t.some(function(e,n){return e!==i[n]})}function Us(i,t){return typeof t=="function"?t(i):t}function Ws(i,t){for(var e in t)i[e]=t[e];return i}function vr(i,t){for(var e in i)if(e!=="__source"&&!(e in t))return!0;for(var n in t)if(n!=="__source"&&i[n]!==t[n])return!0;return!1}function xn(i){this.props=i}function js(i,t){function e(r){var o=this.props.ref,s=o==r.ref;return!s&&o&&(o.call?o(null):o.current=null),t?!t(this.props,r)||!s:vr(this.props,r)}function n(r){return this.shouldComponentUpdate=e,Oe(i,r)}return n.displayName="Memo("+(i.displayName||i.name)+")",n.prototype.isReactComponent=!0,n.__f=!0,n}(xn.prototype=new Pe).isPureReactComponent=!0,xn.prototype.shouldComponentUpdate=function(i,t){return vr(this.props,i)||vr(this.state,t)};var Gs=X.__b;X.__b=function(i){i.type&&i.type.__f&&i.ref&&(i.props.ref=i.ref,i.ref=null),Gs&&Gs(i)};var dd=typeof Symbol!="undefined"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function yr(i){function t(e,n){var r=Ws({},e);return delete r.ref,i(r,(n=e.ref||n)&&(typeof n!="object"||"current"in n)?n:null)}return t.$$typeof=dd,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(i.displayName||i.name)+")",t}var qs=function(i,t){return i==null?null:pt(pt(i).map(t))},Xs={map:qs,forEach:qs,count:function(i){return i?pt(i).length:0},only:function(i){var t=pt(i);if(t.length!==1)throw"Children.only";return t[0]},toArray:pt},fd=X.__e;X.__e=function(i,t,e){if(i.then){for(var n,r=t;r=r.__;)if((n=r.__c)&&n.__c)return t.__e==null&&(t.__e=e.__e,t.__k=e.__k),n.__c(i,t)}fd(i,t,e)};var Ys=X.unmount;function _n(){this.__u=0,this.t=null,this.__b=null}function Zs(i){var t=i.__.__c;return t&&t.__e&&t.__e(i)}function Ks(i){var t,e,n;function r(o){if(t||(t=i()).then(function(s){e=s.default||s},function(s){n=s}),n)throw n;if(!e)throw t;return Oe(e,o)}return r.displayName="Lazy",r.__f=!0,r}function Xt(){this.u=null,this.o=null}X.unmount=function(i){var t=i.__c;t&&t.__R&&t.__R(),t&&i.__h===!0&&(i.type=null),Ys&&Ys(i)},(_n.prototype=new Pe).__c=function(i,t){var e=t.__c,n=this;n.t==null&&(n.t=[]),n.t.push(e);var r=Zs(n.__v),o=!1,s=function(){o||(o=!0,e.__R=null,r?r(a):a())};e.__R=s;var a=function(){if(!--n.__u){if(n.state.__e){var u=n.state.__e;n.__v.__k[0]=function h(d,g,y){return d&&(d.__v=null,d.__k=d.__k&&d.__k.map(function(x){return h(x,g,y)}),d.__c&&d.__c.__P===g&&(d.__e&&y.insertBefore(d.__e,d.__d),d.__c.__e=!0,d.__c.__P=y)),d}(u,u.__c.__P,u.__c.__O)}var c;for(n.setState({__e:n.__b=null});c=n.t.pop();)c.forceUpdate()}},l=t.__h===!0;n.__u++||l||n.setState({__e:n.__b=n.__v.__k[0]}),i.then(s,s)},_n.prototype.componentWillUnmount=function(){this.t=[]},_n.prototype.render=function(i,t){if(this.__b){if(this.__v.__k){var e=document.createElement("div"),n=this.__v.__k[0].__c;this.__v.__k[0]=function o(s,a,l){return s&&(s.__c&&s.__c.__H&&(s.__c.__H.__.forEach(function(u){typeof u.__c=="function"&&u.__c()}),s.__c.__H=null),(s=Ws({},s)).__c!=null&&(s.__c.__P===l&&(s.__c.__P=a),s.__c=null),s.__k=s.__k&&s.__k.map(function(u){return o(u,a,l)})),s}(this.__b,e,n.__O=n.__P)}this.__b=null}var r=t.__e&&Oe(nt,null,i.fallback);return r&&(r.__h=null),[Oe(nt,null,t.__e?null:i.children),r]};var Js=function(i,t,e){if(++e[1]===e[0]&&i.o.delete(t),i.props.revealOrder&&(i.props.revealOrder[0]!=="t"||!i.o.size))for(e=i.u;e;){for(;e.length>3;)e.pop()();if(e[1]>>1,1),t.i.removeChild(n)}}),bn(Oe(pd,{context:t.context},i.__v),t.l)):t.l&&t.componentWillUnmount()}function wr(i,t){return Oe(md,{__v:i,i:t})}(Xt.prototype=new Pe).__e=function(i){var t=this,e=Zs(t.__v),n=t.o.get(i);return n[0]++,function(r){var o=function(){t.props.revealOrder?(n.push(r),Js(t,i,n)):r()};e?e(o):o()}},Xt.prototype.render=function(i){this.u=null,this.o=new Map;var t=pt(i.children);i.revealOrder&&i.revealOrder[0]==="b"&&t.reverse();for(var e=t.length;e--;)this.o.set(t[e],this.u=[1,0,this.u]);return i.children},Xt.prototype.componentDidUpdate=Xt.prototype.componentDidMount=function(){var i=this;this.o.forEach(function(t,e){Js(i,e,t)})};var Qs=typeof Symbol!="undefined"&&Symbol.for&&Symbol.for("react.element")||60103,gd=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,vd=typeof document!="undefined",yd=function(i){return(typeof Symbol!="undefined"&&typeof Symbol()=="symbol"?/fil|che|rad/i:/fil|che|ra/i).test(i)};function $s(i,t,e){return t.__k==null&&(t.textContent=""),bn(i,t),typeof e=="function"&&e(),i?i.__c:null}function ea(i,t,e){return Ms(i,t),typeof e=="function"&&e(),i?i.__c:null}Pe.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(i){Object.defineProperty(Pe.prototype,i,{configurable:!0,get:function(){return this["UNSAFE_"+i]},set:function(t){Object.defineProperty(this,i,{configurable:!0,writable:!0,value:t})}})});var ta=X.event;function wd(){}function bd(){return this.cancelBubble}function Sd(){return this.defaultPrevented}X.event=function(i){return ta&&(i=ta(i)),i.persist=wd,i.isPropagationStopped=bd,i.isDefaultPrevented=Sd,i.nativeEvent=i};var na,ia={configurable:!0,get:function(){return this.class}},ra=X.vnode;X.vnode=function(i){var t=i.type,e=i.props,n=e;if(typeof t=="string"){var r=t.indexOf("-")===-1;for(var o in n={},e){var s=e[o];vd&&o==="children"&&t==="noscript"||o==="value"&&"defaultValue"in e&&s==null||(o==="defaultValue"&&"value"in e&&e.value==null?o="value":o==="download"&&s===!0?s="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!yd(e.type)?o="oninput":/^onfocus$/i.test(o)?o="onfocusin":/^onblur$/i.test(o)?o="onfocusout":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():r&&gd.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():s===null&&(s=void 0),n[o]=s)}t=="select"&&n.multiple&&Array.isArray(n.value)&&(n.value=pt(e.children).forEach(function(a){a.props.selected=n.value.indexOf(a.props.value)!=-1})),t=="select"&&n.defaultValue!=null&&(n.value=pt(e.children).forEach(function(a){a.props.selected=n.multiple?n.defaultValue.indexOf(a.props.value)!=-1:n.defaultValue==a.props.value})),i.props=n,e.class!=e.className&&(ia.enumerable="className"in e,e.className!=null&&(n.class=e.className),Object.defineProperty(n,"className",ia))}i.$$typeof=Qs,ra&&ra(i)};var oa=X.__r;X.__r=function(i){oa&&oa(i),na=i.__c};var sa={ReactCurrentDispatcher:{current:{readContext:function(i){return na.__n[i.__c].props.value}}}},Ed="17.0.2";function aa(i){return Oe.bind(null,i)}function br(i){return!!i&&i.$$typeof===Qs}function la(i){return br(i)?ud.apply(null,arguments):i}function ua(i){return!!i.__k&&(bn(null,i),!0)}function ca(i){return i&&(i.base||i.nodeType===1&&i)||null}var ha=function(i,t){return i(t)},da=function(i,t){return i(t)},xd=nt,k={useState:mt,useReducer:fr,useEffect:kt,useLayoutEffect:pr,useRef:ot,useImperativeHandle:Hs,useMemo:gt,useCallback:st,useContext:En,useDebugValue:zs,version:"17.0.2",Children:Xs,render:$s,hydrate:ea,unmountComponentAtNode:ua,createPortal:wr,createElement:Oe,createContext:Sn,createFactory:aa,cloneElement:la,createRef:ur,Fragment:nt,isValidElement:br,findDOMNode:ca,Component:Pe,PureComponent:xn,memo:js,forwardRef:yr,flushSync:da,unstable_batchedUpdates:ha,StrictMode:nt,Suspense:_n,SuspenseList:Xt,lazy:Ks,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:sa},Sr=Object.freeze({__proto__:null,[Symbol.toStringTag]:"Module",default:k,version:Ed,Children:Xs,render:$s,hydrate:ea,unmountComponentAtNode:ua,createPortal:wr,createFactory:aa,cloneElement:la,isValidElement:br,findDOMNode:ca,PureComponent:xn,memo:js,forwardRef:yr,flushSync:da,unstable_batchedUpdates:ha,StrictMode:xd,Suspense:_n,SuspenseList:Xt,lazy:Ks,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:sa,createElement:Oe,createContext:Sn,createRef:ur,Fragment:nt,Component:Pe,useState:mt,useReducer:fr,useEffect:kt,useLayoutEffect:pr,useRef:ot,useImperativeHandle:Hs,useMemo:gt,useCallback:st,useContext:En,useDebugValue:zs,useErrorBoundary:cd}),_t=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{};function _d(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}function Er(i){if(i.__esModule)return i;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(i).forEach(function(e){var n=Object.getOwnPropertyDescriptor(i,e);Object.defineProperty(t,e,n.get?n:{enumerable:!0,get:function(){return i[e]}})}),t}var xr={exports:{}};function _r(){}_r.prototype={on:function(i,t,e){var n=this.e||(this.e={});return(n[i]||(n[i]=[])).push({fn:t,ctx:e}),this},once:function(i,t,e){var n=this;function r(){n.off(i,r),t.apply(e,arguments)}return r._=t,this.on(i,r,e)},emit:function(i){var t=[].slice.call(arguments,1),e=((this.e||(this.e={}))[i]||[]).slice(),n=0,r=e.length;for(n;n0&&arguments[0]!==void 0?arguments[0]:"transform";if(typeof window=="undefined")return"";var n=(i=window.document)===null||i===void 0||(t=i.documentElement)===null||t===void 0?void 0:t.style;if(!n||e in n)return"";for(var r=0;r: Unmounted during event!");return t}var ti={},ni={};Object.defineProperty(ni,"__esModule",{value:!0}),ni.default=uf;function uf(){}function ii(i){return ii=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ii(i)}Object.defineProperty(ti,"__esModule",{value:!0}),ti.default=void 0;var Or=hf(Yt),Ye=Rr(Tn.exports),cf=Rr(Yt),Ve=xe,Tt=lt,Dr=at,Cn=Rr(ni);function Rr(i){return i&&i.__esModule?i:{default:i}}function Aa(i){if(typeof WeakMap!="function")return null;var t=new WeakMap,e=new WeakMap;return(Aa=function(r){return r?e:t})(i)}function hf(i,t){if(!t&&i&&i.__esModule)return i;if(i===null||ii(i)!=="object"&&typeof i!="function")return{default:i};var e=Aa(t);if(e&&e.has(i))return e.get(i);var n={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in i)if(o!=="default"&&Object.prototype.hasOwnProperty.call(i,o)){var s=r?Object.getOwnPropertyDescriptor(i,o):null;s&&(s.get||s.set)?Object.defineProperty(n,o,s):n[o]=i[o]}return n.default=i,e&&e.set(i,n),n}function Oa(i,t){return mf(i)||pf(i,t)||ff(i,t)||df()}function df(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function ff(i,t){if(!!i){if(typeof i=="string")return Da(i,t);var e=Object.prototype.toString.call(i).slice(8,-1);if(e==="Object"&&i.constructor&&(e=i.constructor.name),e==="Map"||e==="Set")return Array.from(i);if(e==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e))return Da(i,t)}}function Da(i,t){(t==null||t>i.length)&&(t=i.length);for(var e=0,n=new Array(t);e not mounted on DragStart!");var u=l.ownerDocument;if(!(n.props.disabled||!(a.target instanceof u.defaultView.Node)||n.props.handle&&!(0,Ve.matchesSelectorAndParentsTo)(a.target,n.props.handle,l)||n.props.cancel&&(0,Ve.matchesSelectorAndParentsTo)(a.target,n.props.cancel,l))){a.type==="touchstart"&&a.preventDefault();var c=(0,Ve.getTouchIdentifier)(a);n.setState({touchIdentifier:c});var h=(0,Tt.getControlPosition)(a,c,Ue(n));if(h!=null){var d=h.x,g=h.y,y=(0,Tt.createCoreData)(Ue(n),d,g);(0,Cn.default)("DraggableCore: handleDragStart: %j",y),(0,Cn.default)("calling",n.props.onStart);var x=n.props.onStart(a,y);x===!1||n.mounted===!1||(n.props.enableUserSelectHack&&(0,Ve.addUserSelectStyles)(u),n.setState({dragging:!0,lastX:d,lastY:g}),(0,Ve.addEvent)(u,Ct.move,n.handleDrag),(0,Ve.addEvent)(u,Ct.stop,n.handleDragStop))}}}),it(Ue(n),"handleDrag",function(a){var l=(0,Tt.getControlPosition)(a,n.state.touchIdentifier,Ue(n));if(l!=null){var u=l.x,c=l.y;if(Array.isArray(n.props.grid)){var h=u-n.state.lastX,d=c-n.state.lastY,g=(0,Tt.snapToGrid)(n.props.grid,h,d),y=Oa(g,2);if(h=y[0],d=y[1],!h&&!d)return;u=n.state.lastX+h,c=n.state.lastY+d}var x=(0,Tt.createCoreData)(Ue(n),u,c);(0,Cn.default)("DraggableCore: handleDrag: %j",x);var b=n.props.onDrag(a,x);if(b===!1||n.mounted===!1){try{n.handleDragStop(new MouseEvent("mouseup"))}catch{var T=document.createEvent("MouseEvents");T.initMouseEvent("mouseup",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),n.handleDragStop(T)}return}n.setState({lastX:u,lastY:c})}}),it(Ue(n),"handleDragStop",function(a){if(!!n.state.dragging){var l=(0,Tt.getControlPosition)(a,n.state.touchIdentifier,Ue(n));if(l!=null){var u=l.x,c=l.y;if(Array.isArray(n.props.grid)){var h=u-n.state.lastX||0,d=c-n.state.lastY||0,g=(0,Tt.snapToGrid)(n.props.grid,h,d),y=Oa(g,2);h=y[0],d=y[1],u=n.state.lastX+h,c=n.state.lastY+d}var x=(0,Tt.createCoreData)(Ue(n),u,c),b=n.props.onStop(a,x);if(b===!1||n.mounted===!1)return!1;var T=n.findDOMNode();T&&n.props.enableUserSelectHack&&(0,Ve.removeUserSelectStyles)(T.ownerDocument),(0,Cn.default)("DraggableCore: handleDragStop: %j",x),n.setState({dragging:!1,lastX:NaN,lastY:NaN}),T&&((0,Cn.default)("DraggableCore: Removing handlers"),(0,Ve.removeEvent)(T.ownerDocument,Ct.move,n.handleDrag),(0,Ve.removeEvent)(T.ownerDocument,Ct.stop,n.handleDragStop))}}}),it(Ue(n),"onMouseDown",function(a){return Ct=rt.mouse,n.handleDragStart(a)}),it(Ue(n),"onMouseUp",function(a){return Ct=rt.mouse,n.handleDragStop(a)}),it(Ue(n),"onTouchStart",function(a){return Ct=rt.touch,n.handleDragStart(a)}),it(Ue(n),"onTouchEnd",function(a){return Ct=rt.touch,n.handleDragStop(a)}),n}return vf(e,[{key:"componentDidMount",value:function(){this.mounted=!0;var r=this.findDOMNode();r&&(0,Ve.addEvent)(r,rt.touch.start,this.onTouchStart,{passive:!1})}},{key:"componentWillUnmount",value:function(){this.mounted=!1;var r=this.findDOMNode();if(r){var o=r.ownerDocument;(0,Ve.removeEvent)(o,rt.mouse.move,this.handleDrag),(0,Ve.removeEvent)(o,rt.touch.move,this.handleDrag),(0,Ve.removeEvent)(o,rt.mouse.stop,this.handleDragStop),(0,Ve.removeEvent)(o,rt.touch.stop,this.handleDragStop),(0,Ve.removeEvent)(r,rt.touch.start,this.onTouchStart,{passive:!1}),this.props.enableUserSelectHack&&(0,Ve.removeUserSelectStyles)(o)}}},{key:"findDOMNode",value:function(){var r,o,s;return(r=this.props)!==null&&r!==void 0&&r.nodeRef?(o=this.props)===null||o===void 0||(s=o.nodeRef)===null||s===void 0?void 0:s.current:cf.default.findDOMNode(this)}},{key:"render",value:function(){return Or.cloneElement(Or.Children.only(this.props.children),{onMouseDown:this.onMouseDown,onMouseUp:this.onMouseUp,onTouchEnd:this.onTouchEnd})}}]),e}(Or.Component);ti.default=oi,it(oi,"displayName","DraggableCore"),it(oi,"propTypes",{allowAnyClick:Ye.default.bool,disabled:Ye.default.bool,enableUserSelectHack:Ye.default.bool,offsetParent:function(t,e){if(t[e]&&t[e].nodeType!==1)throw new Error("Draggable's offsetParent must be a DOM Node.")},grid:Ye.default.arrayOf(Ye.default.number),handle:Ye.default.string,cancel:Ye.default.string,nodeRef:Ye.default.object,onStart:Ye.default.func,onDrag:Ye.default.func,onStop:Ye.default.func,onMouseDown:Ye.default.func,scale:Ye.default.number,className:Dr.dontSetMe,style:Dr.dontSetMe,transform:Dr.dontSetMe}),it(oi,"defaultProps",{allowAnyClick:!1,disabled:!1,enableUserSelectHack:!0,onStart:function(){},onDrag:function(){},onStop:function(){},onMouseDown:function(){},scale:1}),function(i){function t(F){return t=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(H){return typeof H}:function(H){return H&&typeof Symbol=="function"&&H.constructor===Symbol&&H!==Symbol.prototype?"symbol":typeof H},t(F)}Object.defineProperty(i,"__esModule",{value:!0}),Object.defineProperty(i,"DraggableCore",{enumerable:!0,get:function(){return u.default}}),i.default=void 0;var e=y(Yt),n=d(Tn.exports),r=d(Yt),o=d(Dd),s=xe,a=lt,l=at,u=d(ti),c=d(ni),h=["axis","bounds","children","defaultPosition","defaultClassName","defaultClassNameDragging","defaultClassNameDragged","position","positionOffset","scale"];function d(F){return F&&F.__esModule?F:{default:F}}function g(F){if(typeof WeakMap!="function")return null;var H=new WeakMap,U=new WeakMap;return(g=function(j){return j?U:H})(F)}function y(F,H){if(!H&&F&&F.__esModule)return F;if(F===null||t(F)!=="object"&&typeof F!="function")return{default:F};var U=g(H);if(U&&U.has(F))return U.get(F);var W={},j=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var $ in F)if($!=="default"&&Object.prototype.hasOwnProperty.call(F,$)){var ae=j?Object.getOwnPropertyDescriptor(F,$):null;ae&&(ae.get||ae.set)?Object.defineProperty(W,$,ae):W[$]=F[$]}return W.default=F,U&&U.set(F,W),W}function x(){return x=Object.assign||function(F){for(var H=1;H=0)&&(!Object.prototype.propertyIsEnumerable.call(F,W)||(U[W]=F[W]))}return U}function T(F,H){if(F==null)return{};var U={},W=Object.keys(F),j,$;for($=0;$=0)&&(U[j]=F[j]);return U}function f(F,H){var U=Object.keys(F);if(Object.getOwnPropertySymbols){var W=Object.getOwnPropertySymbols(F);H&&(W=W.filter(function(j){return Object.getOwnPropertyDescriptor(F,j).enumerable})),U.push.apply(U,W)}return U}function E(F){for(var H=1;HF.length)&&(H=F.length);for(var U=0,W=new Array(H);U, without drag handlers. This will make this component effectively undraggable. Please attach `onDrag` or `onStop` handlers so you can adjust the `position` of this element."),j}return V(U,[{key:"componentDidMount",value:function(){typeof window.SVGElement!="undefined"&&this.findDOMNode()instanceof window.SVGElement&&this.setState({isElementSVG:!0})}},{key:"componentWillUnmount",value:function(){this.setState({dragging:!1})}},{key:"findDOMNode",value:function(){var j,$,ae;return(j=($=this.props)===null||$===void 0||(ae=$.nodeRef)===null||ae===void 0?void 0:ae.current)!==null&&j!==void 0?j:r.default.findDOMNode(this)}},{key:"render",value:function(){var j,$=this.props;$.axis,$.bounds;var ae=$.children,we=$.defaultPosition,me=$.defaultClassName,Qe=$.defaultClassNameDragging,$e=$.defaultClassNameDragged,et=$.position,p=$.positionOffset;$.scale;var _=b($,h),R={},N=null,L=Boolean(et),J=!L||this.state.dragging,q=et||we,fe={x:(0,a.canDragX)(this)&&J?this.state.x:q.x,y:(0,a.canDragY)(this)&&J?this.state.y:q.y};this.state.isElementSVG?N=(0,s.createSVGTransform)(fe,p):R=(0,s.createCSSTransform)(fe,p);var Se=(0,o.default)(ae.props.className||"",me,(j={},G(j,Qe,this.state.dragging),G(j,$e,this.state.dragged),j));return e.createElement(u.default,x({},_,{onStart:this.onDragStart,onDrag:this.onDrag,onStop:this.onDragStop}),e.cloneElement(e.Children.only(ae),{className:Se,style:E(E({},ae.props.style),R),transform:N}))}}],[{key:"getDerivedStateFromProps",value:function(j,$){var ae=j.position,we=$.prevPropsPosition;return ae&&(!we||ae.x!==we.x||ae.y!==we.y)?((0,c.default)("Draggable: getDerivedStateFromProps %j",{position:ae,prevPropsPosition:we}),{x:ae.x,y:ae.y,prevPropsPosition:E({},ae)}):null}}]),U}(e.Component);i.default=Me,G(Me,"displayName","Draggable"),G(Me,"propTypes",E(E({},u.default.propTypes),{},{axis:n.default.oneOf(["both","x","y","none"]),bounds:n.default.oneOfType([n.default.shape({left:n.default.number,right:n.default.number,top:n.default.number,bottom:n.default.number}),n.default.string,n.default.oneOf([!1])]),defaultClassName:n.default.string,defaultClassNameDragging:n.default.string,defaultClassNameDragged:n.default.string,defaultPosition:n.default.shape({x:n.default.number,y:n.default.number}),positionOffset:n.default.shape({x:n.default.oneOfType([n.default.number,n.default.string]),y:n.default.oneOfType([n.default.number,n.default.string])}),position:n.default.shape({x:n.default.number,y:n.default.number}),className:l.dontSetMe,style:l.dontSetMe,transform:l.dontSetMe})),G(Me,"defaultProps",E(E({},u.default.defaultProps),{},{axis:"both",bounds:!1,defaultClassName:"react-draggable",defaultClassNameDragging:"react-draggable-dragging",defaultClassNameDragged:"react-draggable-dragged",defaultPosition:{x:0,y:0},scale:1}))}(fa);var Ma=fa,Fa=Ma.default,Ef=Ma.DraggableCore;$n.exports=Fa,$n.exports.default=Fa,$n.exports.DraggableCore=Ef;var xf=$n.exports,_f=["second","minute","hour","day","week","month","year"];function Tf(i,t){if(t===0)return["just now","right now"];var e=_f[Math.floor(t/2)];return i>1&&(e+="s"),[i+" "+e+" ago","in "+i+" "+e]}var Cf=["\u79D2","\u5206\u949F","\u5C0F\u65F6","\u5929","\u5468","\u4E2A\u6708","\u5E74"];function Pf(i,t){if(t===0)return["\u521A\u521A","\u7247\u523B\u540E"];var e=Cf[~~(t/2)];return[i+" "+e+"\u524D",i+" "+e+"\u540E"]}var Fr={},_e=function(i,t){Fr[i]=t},ka=function(i){return Fr[i]||Fr.en_US},Bt=[60,60,24,7,365/7/12,12];function La(i){return i instanceof Date?i:!isNaN(i)||/^\d+$/.test(i)?new Date(parseInt(i)):(i=(i||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(i))}function Ba(i,t){var e=i<0?1:0;i=Math.abs(i);for(var n=i,r=0;i>=Bt[r]&&r(r===0?9:1)&&(r+=1),t(i,r,n)[e].replace("%s",i.toString())}function Ia(i,t){var e=t?La(t):new Date;return(+e-+La(i))/1e3}function Af(i){for(var t=1,e=0,n=Math.abs(i);i>=Bt[e]&&e{i.current&&!i.current.contains(event.target)&&t()};kt(()=>(document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)))}var Ua=Object.prototype.toString,Wa=function(t){var e=Ua.call(t),n=e==="[object Arguments]";return n||(n=e!=="[object Array]"&&t!==null&&typeof t=="object"&&typeof t.length=="number"&&t.length>=0&&Ua.call(t.callee)==="[object Function]"),n},ja;if(!Object.keys){var si=Object.prototype.hasOwnProperty,Ga=Object.prototype.toString,Nf=Wa,qa=Object.prototype.propertyIsEnumerable,Hf=!qa.call({toString:null},"toString"),zf=qa.call(function(){},"prototype"),ai=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],Ir=function(i){var t=i.constructor;return t&&t.prototype===i},Vf={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},Uf=function(){if(typeof window=="undefined")return!1;for(var i in window)try{if(!Vf["$"+i]&&si.call(window,i)&&window[i]!==null&&typeof window[i]=="object")try{Ir(window[i])}catch{return!0}}catch{return!0}return!1}(),Wf=function(i){if(typeof window=="undefined"||!Uf)return Ir(i);try{return Ir(i)}catch{return!1}};ja=function(t){var e=t!==null&&typeof t=="object",n=Ga.call(t)==="[object Function]",r=Nf(t),o=e&&Ga.call(t)==="[object String]",s=[];if(!e&&!n&&!r)throw new TypeError("Object.keys called on a non-object");var a=zf&&n;if(o&&t.length>0&&!si.call(t,0))for(var l=0;l0)for(var u=0;u1&&typeof e!="boolean")throw new Jt('"allowMissing" argument must be a boolean');if(cp(/^%?[^%]*%?$/,t)===null)throw new Kt("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var n=fp(t),r=n.length>0?n[0]:"",o=pp("%"+r+"%",e),s=o.name,a=o.value,l=!1,u=o.alias;u&&(r=u[0],up(n,lp([0,1],u)));for(var c=1,h=!0;c=n.length){var x=It(a,d);h=!!x,h&&"get"in x&&!("originalValue"in x.get)?a=x.get:a=a[d]}else h=ui(a,d),a=a[d];h&&!l&&(Nt[s]=a)}}return a},mp=Be,Ur=mp("%Object.defineProperty%",!0),Wr=function(){if(Ur)try{return Ur({},"a",{value:1}),!0}catch{return!1}return!1};Wr.hasArrayLengthDefineBug=function(){if(!Wr())return null;try{return Ur([],"length",{value:1}).length!==1}catch{return!0}};var gp=Wr,vp=Xf,yp=typeof Symbol=="function"&&typeof Symbol("foo")=="symbol",wp=Object.prototype.toString,bp=Array.prototype.concat,il=Object.defineProperty,Sp=function(i){return typeof i=="function"&&wp.call(i)==="[object Function]"},Ep=gp(),rl=il&&Ep,xp=function(i,t,e,n){if(t in i){if(n===!0){if(i[t]===e)return}else if(!Sp(n)||!n())return}rl?il(i,t,{configurable:!0,enumerable:!1,value:e,writable:!0}):i[t]=e},ol=function(i,t){var e=arguments.length>2?arguments[2]:{},n=vp(t);yp&&(n=bp.call(n,Object.getOwnPropertySymbols(t)));for(var r=0;r-1?al(n):n},Tp=Be,Cp=Tp("%TypeError%"),Pp=function(t,e){if(t==null)throw new Cp(e||"Cannot call method on "+t);return t},On=Pp,Ap=Be,ll=Ap("%Array%"),Op=!ll.isArray&&vt("Object.prototype.toString"),Dp=ll.isArray||function(t){return Op(t)==="[object Array]"},Rp=Dp,ul=Be,Mp=vt,Fp=ul("%TypeError%"),kp=Rp,Lp=ul("%Reflect.apply%",!0)||Mp("Function.prototype.apply"),Bp=function(t,e){var n=arguments.length>2?arguments[2]:[];if(!kp(n))throw new Fp("Assertion failed: optional `argumentsList`, if provided, must be a List");return Lp(t,e,n)},Ip={},Np=Object.freeze({__proto__:null,[Symbol.toStringTag]:"Module",default:Ip}),Hp=Er(Np),jr=typeof Map=="function"&&Map.prototype,Gr=Object.getOwnPropertyDescriptor&&jr?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,hi=jr&&Gr&&typeof Gr.get=="function"?Gr.get:null,cl=jr&&Map.prototype.forEach,qr=typeof Set=="function"&&Set.prototype,Xr=Object.getOwnPropertyDescriptor&&qr?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,di=qr&&Xr&&typeof Xr.get=="function"?Xr.get:null,hl=qr&&Set.prototype.forEach,zp=typeof WeakMap=="function"&&WeakMap.prototype,Dn=zp?WeakMap.prototype.has:null,Vp=typeof WeakSet=="function"&&WeakSet.prototype,Rn=Vp?WeakSet.prototype.has:null,Up=typeof WeakRef=="function"&&WeakRef.prototype,dl=Up?WeakRef.prototype.deref:null,Wp=Boolean.prototype.valueOf,jp=Object.prototype.toString,Gp=Function.prototype.toString,qp=String.prototype.match,Yr=String.prototype.slice,Pt=String.prototype.replace,Xp=String.prototype.toUpperCase,fl=String.prototype.toLowerCase,pl=RegExp.prototype.test,ml=Array.prototype.concat,ut=Array.prototype.join,Yp=Array.prototype.slice,gl=Math.floor,Zr=typeof BigInt=="function"?BigInt.prototype.valueOf:null,Kr=Object.getOwnPropertySymbols,Jr=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Symbol.prototype.toString:null,tn=typeof Symbol=="function"&&typeof Symbol.iterator=="object",We=typeof Symbol=="function"&&Symbol.toStringTag&&(typeof Symbol.toStringTag===tn?"object":"symbol")?Symbol.toStringTag:null,vl=Object.prototype.propertyIsEnumerable,yl=(typeof Reflect=="function"?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(i){return i.__proto__}:null);function wl(i,t){if(i===1/0||i===-1/0||i!==i||i&&i>-1e3&&i<1e3||pl.call(/e/,t))return t;var e=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if(typeof i=="number"){var n=i<0?-gl(-i):gl(i);if(n!==i){var r=String(n),o=Yr.call(t,r.length+1);return Pt.call(r,e,"$&_")+"."+Pt.call(Pt.call(o,/([0-9]{3})/g,"$&_"),/_$/,"")}}return Pt.call(t,e,"$&_")}var Qr=Hp,bl=Qr.custom,Sl=_l(bl)?bl:null,Zp=function i(t,e,n,r){var o=e||{};if(At(o,"quoteStyle")&&o.quoteStyle!=="single"&&o.quoteStyle!=="double")throw new TypeError('option "quoteStyle" must be "single" or "double"');if(At(o,"maxStringLength")&&(typeof o.maxStringLength=="number"?o.maxStringLength<0&&o.maxStringLength!==1/0:o.maxStringLength!==null))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var s=At(o,"customInspect")?o.customInspect:!0;if(typeof s!="boolean"&&s!=="symbol")throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(At(o,"indent")&&o.indent!==null&&o.indent!==" "&&!(parseInt(o.indent,10)===o.indent&&o.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(At(o,"numericSeparator")&&typeof o.numericSeparator!="boolean")throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var a=o.numericSeparator;if(typeof t=="undefined")return"undefined";if(t===null)return"null";if(typeof t=="boolean")return t?"true":"false";if(typeof t=="string")return Cl(t,o);if(typeof t=="number"){if(t===0)return 1/0/t>0?"0":"-0";var l=String(t);return a?wl(t,l):l}if(typeof t=="bigint"){var u=String(t)+"n";return a?wl(t,u):u}var c=typeof o.depth=="undefined"?5:o.depth;if(typeof n=="undefined"&&(n=0),n>=c&&c>0&&typeof t=="object")return $r(t)?"[Array]":"[Object]";var h=fm(o,n);if(typeof r=="undefined")r=[];else if(Tl(r,t)>=0)return"[Circular]";function d(K,Q,le){if(Q&&(r=Yp.call(r),r.push(Q)),le){var re={depth:o.depth};return At(o,"quoteStyle")&&(re.quoteStyle=o.quoteStyle),i(K,re,n+1,r)}return i(K,o,n+1,r)}if(typeof t=="function"&&!xl(t)){var g=rm(t),y=fi(t,d);return"[Function"+(g?": "+g:" (anonymous)")+"]"+(y.length>0?" { "+ut.call(y,", ")+" }":"")}if(_l(t)){var x=tn?Pt.call(String(t),/^(Symbol\(.*\))_[^)]*$/,"$1"):Jr.call(t);return typeof t=="object"&&!tn?Mn(x):x}if(cm(t)){for(var b="<"+fl.call(String(t.nodeName)),T=t.attributes||[],f=0;f",b}if($r(t)){if(t.length===0)return"[]";var E=fi(t,d);return h&&!dm(E)?"["+to(E,h)+"]":"[ "+ut.call(E,", ")+" ]"}if(Qp(t)){var A=fi(t,d);return!("cause"in Error.prototype)&&"cause"in t&&!vl.call(t,"cause")?"{ ["+String(t)+"] "+ut.call(ml.call("[cause]: "+d(t.cause),A),", ")+" }":A.length===0?"["+String(t)+"]":"{ ["+String(t)+"] "+ut.call(A,", ")+" }"}if(typeof t=="object"&&s){if(Sl&&typeof t[Sl]=="function"&&Qr)return Qr(t,{depth:c-n});if(s!=="symbol"&&typeof t.inspect=="function")return t.inspect()}if(om(t)){var C=[];return cl&&cl.call(t,function(K,Q){C.push(d(Q,t,!0)+" => "+d(K,t))}),Pl("Map",hi.call(t),C,h)}if(lm(t)){var O=[];return hl&&hl.call(t,function(K){O.push(d(K,t))}),Pl("Set",di.call(t),O,h)}if(sm(t))return eo("WeakMap");if(um(t))return eo("WeakSet");if(am(t))return eo("WeakRef");if(em(t))return Mn(d(Number(t)));if(nm(t))return Mn(d(Zr.call(t)));if(tm(t))return Mn(Wp.call(t));if($p(t))return Mn(d(String(t)));if(!Jp(t)&&!xl(t)){var D=fi(t,d),I=yl?yl(t)===Object.prototype:t instanceof Object||t.constructor===Object,B=t instanceof Object?"":"null prototype",Z=!I&&We&&Object(t)===t&&We in t?Yr.call(Ot(t),8,-1):B?"Object":"",Y=I||typeof t.constructor!="function"?"":t.constructor.name?t.constructor.name+" ":"",V=Y+(Z||B?"["+ut.call(ml.call([],Z||[],B||[]),": ")+"] ":"");return D.length===0?V+"{}":h?V+"{"+to(D,h)+"}":V+"{ "+ut.call(D,", ")+" }"}return String(t)};function El(i,t,e){var n=(e.quoteStyle||t)==="double"?'"':"'";return n+i+n}function Kp(i){return Pt.call(String(i),/"/g,""")}function $r(i){return Ot(i)==="[object Array]"&&(!We||!(typeof i=="object"&&We in i))}function Jp(i){return Ot(i)==="[object Date]"&&(!We||!(typeof i=="object"&&We in i))}function xl(i){return Ot(i)==="[object RegExp]"&&(!We||!(typeof i=="object"&&We in i))}function Qp(i){return Ot(i)==="[object Error]"&&(!We||!(typeof i=="object"&&We in i))}function $p(i){return Ot(i)==="[object String]"&&(!We||!(typeof i=="object"&&We in i))}function em(i){return Ot(i)==="[object Number]"&&(!We||!(typeof i=="object"&&We in i))}function tm(i){return Ot(i)==="[object Boolean]"&&(!We||!(typeof i=="object"&&We in i))}function _l(i){if(tn)return i&&typeof i=="object"&&i instanceof Symbol;if(typeof i=="symbol")return!0;if(!i||typeof i!="object"||!Jr)return!1;try{return Jr.call(i),!0}catch{}return!1}function nm(i){if(!i||typeof i!="object"||!Zr)return!1;try{return Zr.call(i),!0}catch{}return!1}var im=Object.prototype.hasOwnProperty||function(i){return i in this};function At(i,t){return im.call(i,t)}function Ot(i){return jp.call(i)}function rm(i){if(i.name)return i.name;var t=qp.call(Gp.call(i),/^function\s*([\w$]+)/);return t?t[1]:null}function Tl(i,t){if(i.indexOf)return i.indexOf(t);for(var e=0,n=i.length;et.maxStringLength){var e=i.length-t.maxStringLength,n="... "+e+" more character"+(e>1?"s":"");return Cl(Yr.call(i,0,t.maxStringLength),t)+n}var r=Pt.call(Pt.call(i,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,hm);return El(r,"single",t)}function hm(i){var t=i.charCodeAt(0),e={8:"b",9:"t",10:"n",12:"f",13:"r"}[t];return e?"\\"+e:"\\x"+(t<16?"0":"")+Xp.call(t.toString(16))}function Mn(i){return"Object("+i+")"}function eo(i){return i+" { ? }"}function Pl(i,t,e,n){var r=n?to(e,n):ut.call(e,", ");return i+" ("+t+") {"+r+"}"}function dm(i){for(var t=0;t=0)return!1;return!0}function fm(i,t){var e;if(i.indent===" ")e=" ";else if(typeof i.indent=="number"&&i.indent>0)e=ut.call(Array(i.indent+1)," ");else return null;return{base:e,prev:ut.call(Array(t+1),e)}}function to(i,t){if(i.length===0)return"";var e=` +`+t.prev+t.base;return e+ut.call(i,","+e)+` +`+t.prev}function fi(i,t){var e=$r(i),n=[];if(e){n.length=i.length;for(var r=0;r1&&(arguments[1]===String?e="string":arguments[1]===Number&&(e="number"));var n;if(rg&&(Symbol.toPrimitive?n=ag(t,Symbol.toPrimitive):Bl(t)&&(n=Symbol.prototype.valueOf)),typeof n!="undefined"){var r=n.call(t,e);if(lo(r))return r;throw new TypeError("unable to convert exotic object to primitive")}return e==="default"&&(og(t)||Bl(t))&&(e="string"),sg(t,e==="default"?"number":e)},Il=lg,ug=function(t){return arguments.length>1?Il(t,arguments[1]):Il(t)},uo=vt,Nl=so(),Hl,zl,co,ho;if(Nl){Hl=uo("Object.prototype.hasOwnProperty"),zl=uo("RegExp.prototype.exec"),co={};var fo=function(){throw co};ho={toString:fo,valueOf:fo},typeof Symbol.toPrimitive=="symbol"&&(ho[Symbol.toPrimitive]=fo)}var cg=uo("Object.prototype.toString"),hg=Object.getOwnPropertyDescriptor,dg="[object RegExp]",fg=Nl?function(t){if(!t||typeof t!="object")return!1;var e=hg(t,"lastIndex"),n=e&&Hl(e,"value");if(!n)return!1;try{zl(t,ho)}catch(r){return r===co}}:function(t){return!t||typeof t!="object"&&typeof t!="function"?!1:cg(t)===dg},pg=vt,mg=Be,gg=fg,vg=pg("RegExp.prototype.exec"),yg=mg("%TypeError%"),wg=function(t){if(!gg(t))throw new yg("`regex` must be a RegExp");return function(n){return vg(t,n)!==null}},Vl=Be,bg=Vl("%String%"),Sg=Vl("%TypeError%"),Ul=function(t){if(typeof t=="symbol")throw new Sg("Cannot convert a Symbol value to a string");return bg(t)},Eg=On,xg=Ul,_g=vt,Wl=_g("String.prototype.replace"),jl=/^\s$/.test("\u180E"),Tg=jl?/^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/:/^[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+/,Cg=jl?/[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/:/[\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF]+$/,Gl=function(){var t=xg(Eg(this));return Wl(Wl(t,Tg,""),Cg,"")},Pg=Gl,ql="\u200B",rn="\u180E",Xl=function(){return String.prototype.trim&&ql.trim()===ql&&rn.trim()===rn&&("_"+rn).trim()==="_"+rn&&(rn+"_").trim()===rn+"_"?String.prototype.trim:Pg},Ag=en,Og=Xl,Dg=function(){var t=Og();return Ag(String.prototype,{trim:t},{trim:function(){return String.prototype.trim!==t}}),t},Rg=An.exports,Mg=en,Fg=On,kg=Gl,Yl=Xl,Lg=Dg,Bg=Rg(Yl()),Zl=function(t){return Fg(t),Bg(t)};Mg(Zl,{getPolyfill:Yl,implementation:kg,shim:Lg});var Kl=Zl,gi=Be,po=gi("%Number%"),Ig=gi("%RegExp%"),Ng=gi("%TypeError%"),Jl=gi("%parseInt%"),Hg=vt,vi=wg,Ql=Hg("String.prototype.slice"),zg=vi(/^0b[01]+$/i),Vg=vi(/^0o[0-7]+$/i),Ug=vi(/^[-+]0x[0-9a-f]+$/i),Wg=["\x85","\u200B","\uFFFE"].join(""),jg=new Ig("["+Wg+"]","g"),Gg=vi(jg),qg=Kl,Xg=Fn,Yg=function i(t){if(Xg(t)!=="String")throw new Ng("Assertion failed: `argument` is not a String");if(zg(t))return po(Jl(Ql(t,2),2));if(Vg(t))return po(Jl(Ql(t,2),8));if(Gg(t)||Ug(t))return NaN;var e=qg(t);return e!==t?i(e):po(t)},$l=Be,eu=$l("%TypeError%"),tu=$l("%Number%"),Zg=jm,Kg=ug,Jg=Yg,Qg=function(t){var e=Zg(t)?t:Kg(t,tu);if(typeof e=="symbol")throw new eu("Cannot convert a Symbol value to a number");if(typeof e=="bigint")throw new eu("Conversion from 'BigInt' to 'number' is not allowed.");return typeof e=="string"?Jg(e):tu(e)},nu=Number.isNaN||function(t){return t!==t},$g=nu,ev=function(i){return(typeof i=="number"||typeof i=="bigint")&&!$g(i)&&i!==1/0&&i!==-1/0},tv=function(t){return t>=0?1:-1},nv=zm,iv=Wm,rv=Qg,ov=nu,sv=ev,av=tv,lv=function(t){var e=rv(t);if(ov(e)||e===0)return 0;if(!sv(e))return e;var n=iv(nv(e));return n===0?0:av(e)*n},iu=Im,uv=lv,cv=function(t){var e=uv(t);return e<=0?0:e>iu?iu:e},hv=Be,dv=hv("%TypeError%"),fv=Dl,pv=cv,mv=Fn,gv=function(t){if(mv(t)!=="Object")throw new dv("Assertion failed: `obj` must be an Object");return pv(fv(t,"length"))},vv=Be,yv=vv("%Object%"),wv=On,bv=function(t){return wv(t),yv(t)},Sv=String.prototype.valueOf,Ev=function(t){try{return Sv.call(t),!0}catch{return!1}},xv=Object.prototype.toString,_v="[object String]",Tv=so(),Cv=function(t){return typeof t=="string"?!0:typeof t!="object"?!1:Tv?Ev(t):xv.call(t)===_v},Pv=Be,Av=vt,Ov=Pv("%TypeError%"),Dv=Bp,Rv=Dl,Mv=xm,Fv=km,kv=gv,Lv=bv,Bv=Ul,Iv=Cv,Nv=Av("String.prototype.split"),ru=Object("a"),Hv=ru[0]!=="a"||!(0 in ru),ou=function(t){var e=Lv(this),n=Hv&&Iv(this)?Nv(this,""):e,r=kv(n);if(!Fv(t))throw new Ov("Array.prototype.forEach callback must be a function");var o;arguments.length>1&&(o=arguments[1]);for(var s=0;s=12&&t<=14)?1:2},vu={pluralTypes:{arabic:function(i){if(i<3)return i;var t=i%100;return t>=3&&t<=10?3:t>=11?4:5},bosnian_serbian:go,chinese:function(){return 0},croatian:go,french:function(i){return i>=2?1:0},german:function(i){return i!==1?1:0},russian:go,lithuanian:function(i){return i%10===1&&i%100!==11?0:i%10>=2&&i%10<=9&&(i%100<11||i%100>19)?1:2},czech:function(i){return i===1?0:i>=2&&i<=4?1:2},polish:function(i){if(i===1)return 0;var t=i%10;return 2<=t&&t<=4&&(i%100<10||i%100>=20)?1:2},icelandic:function(i){return i%10!==1||i%100===11?1:0},slovenian:function(i){var t=i%100;return t===1?0:t===2?1:t===3||t===4?2:3},romanian:function(i){if(i===1)return 0;var t=i%100;return i===0||t>=2&&t<=19?1:2}},pluralTypeToLanguages:{arabic:["ar"],bosnian_serbian:["bs-Latn-BA","bs-Cyrl-BA","srl-RS","sr-RS"],chinese:["id","id-ID","ja","ko","ko-KR","lo","ms","th","th-TH","zh"],croatian:["hr","hr-HR"],german:["fa","da","de","en","es","fi","el","he","hi-IN","hu","hu-HU","it","nl","no","pt","sv","tr"],french:["fr","tl","pt-br"],russian:["ru","ru-RU"],lithuanian:["lt"],czech:["cs","cs-CZ","sk"],polish:["pl"],icelandic:["is","mk"],slovenian:["sl-SL"],romanian:["ro"]}};function gy(i){var t={};return yi(mo(i),function(e){var n=e[0],r=e[1];yi(r,function(o){t[o]=n})}),t}function vy(i,t){var e=gy(i.pluralTypeToLanguages);return e[t]||e[gu.call(t,/-/,1)[0]]||e.en}function yy(i,t,e){return i.pluralTypes[t](e)}function wy(){var i={};return function(t,e){var n=i[e];return n&&!t.pluralTypes[n]&&(n=null,i[e]=n),n||(n=vy(t,e),n&&(i[e]=n)),n}}function yu(i){return i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function by(i){var t=i&&i.prefix||"%{",e=i&&i.suffix||"}";if(t===wi||e===wi)throw new RangeError('"'+wi+'" token is reserved for pluralization');return new RegExp(yu(t)+"(.*?)"+yu(e),"g")}var Sy=wy(),Ey=/%\{(.*?)\}/g;function vo(i,t,e,n,r,o){if(typeof i!="string")throw new TypeError("Polyglot.transformPhrase expects argument #1 to be string");if(t==null)return i;var s=i,a=n||Ey,l=o||mu,u=typeof t=="number"?{smart_count:t}:t;if(u.smart_count!=null&&i){var c=r||vu,h=gu.call(i,wi),d=e||"en",g=Sy(c,d),y=yy(c,g,u.smart_count);s=py(h[y]||h[0])}return s=l.call(s,a,function(x,b){return!pu(u,b)||u[b]==null?x:u[b]}),s}function yt(i){var t=i||{};this.phrases={},this.extend(t.phrases||{}),this.currentLocale=t.locale||"en";var e=t.allowMissing?vo:null;this.onMissingKey=typeof t.onMissingKey=="function"?t.onMissingKey:e,this.warn=t.warn||my,this.replaceImplementation=t.replace||mu,this.tokenRegex=by(t.interpolation),this.pluralRules=t.pluralRules||vu}yt.prototype.locale=function(i){return i&&(this.currentLocale=i),this.currentLocale},yt.prototype.extend=function(i,t){yi(mo(i||{}),function(e){var n=e[0],r=e[1],o=t?t+"."+n:n;typeof r=="object"?this.extend(r,o):this.phrases[o]=r},this)},yt.prototype.unset=function(i,t){typeof i=="string"?delete this.phrases[i]:yi(mo(i||{}),function(e){var n=e[0],r=e[1],o=t?t+"."+n:n;typeof r=="object"?this.unset(r,o):delete this.phrases[o]},this)},yt.prototype.clear=function(){this.phrases={}},yt.prototype.replace=function(i){this.clear(),this.extend(i)},yt.prototype.t=function(i,t){var e,n,r=t==null?{}:t;if(typeof this.phrases[i]=="string")e=this.phrases[i];else if(typeof r._=="string")e=r._;else if(this.onMissingKey){var o=this.onMissingKey;n=o(i,r,this.currentLocale,this.tokenRegex,this.pluralRules,this.replaceImplementation)}else this.warn('Missing translation for key: "'+i+'"'),n=i;return typeof e=="string"&&(n=vo(e,r,this.currentLocale,this.tokenRegex,this.pluralRules,this.replaceImplementation)),n},yt.prototype.has=function(i){return pu(this.phrases,i)},yt.transformPhrase=function(t,e,n){return vo(t,e,n)};var xy=yt,_y={"Add a comment...":"\u0625\u0636\u0627\u0641\u0629 \u062A\u0639\u0644\u064A\u0642","Add a reply...":"\u0625\u0636\u0627\u0641\u0629 \u0631\u062F","Add tag...":"\u0625\u0636\u0627\u0641\u0629 \u0639\u0644\u0627\u0645\u0629",Cancel:"\u0625\u0644\u063A\u0627\u0621",Close:"\u0625\u063A\u0644\u0627\u0642",Edit:"Edit",Delete:"Delete",Ok:"\u062A\u0645"},Ty={"Add a comment...":"Napsat koment\xE1\u0159...","Add a reply...":"Odpov\u011Bd\u011Bt...","Add tag...":"P\u0159idat \u0161t\xEDtek...",Cancel:"Zru\u0161it",Close:"Zav\u0159\xEDt",Edit:"Upravit",Delete:"Smazat",Ok:"Ok"},Cy={"Add a comment...":"Kommentar schreiben...","Add a reply...":"Antwort schreiben...","Add tag...":"Tag...",Cancel:"Abbrechen",Close:"Schliessen",Edit:"Bearbeiten",Delete:"L\xF6schen",Ok:"Ok"},Py={"Add a comment...":"\u03A3\u03C7\u03BF\u03BB\u03AF\u03B1\u03C3\u03B5...","Add a reply...":"\u0391\u03C0\u03AC\u03BD\u03C4\u03B7\u03C3\u03B5...","Add tag...":"\u03A0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C3\u03B5 tag...",Cancel:"\u0386\u03BA\u03C5\u03C1\u03BF",Close:"\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF",Edit:"\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1",Delete:"\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE",Ok:"Ok"},Ay={"Add a comment...":"Agregar un comentario...","Add a reply...":"Agregar una respuesta...","Add tag...":"Etiquetar...",Cancel:"Cancelar",Close:"Cerrar",Edit:"Editar",Delete:"Eliminar",Ok:"Ok"},Oy={"Add a comment...":"Lis\xE4\xE4 kommentti","Add a reply...":"Lis\xE4\xE4 vastaus","Add tag...":"Lis\xE4\xE4 tunniste",Cancel:"Peruuta",Close:"Sulje",Edit:"Muokkaa",Delete:"Poista",Ok:"Ok"},Dy={"Add a comment...":"Ajouter un commentaire...","Add a reply...":"Ajouter une r\xE9ponse...","Add tag...":"Ajouter une \xE9tiquette...",Cancel:"Annuler",Close:"Fermer",Edit:"\xC9diter",Delete:"Supprimer",Ok:"Ok"},Ry={"Add a comment...":"Engadir un comentario...","Add a reply...":"Engadir unha resposta...","Add tag...":"Etiquetar...",Cancel:"Cancelar",Close:"Pechar",Edit:"Edit",Delete:"Delete",Ok:"Ok"},My={"Add a comment...":"\u091F\u093F\u092A\u094D\u092A\u0923\u0940 \u091C\u094B\u0921\u093C\u0947\u0902","Add a reply...":"\u091C\u0935\u093E\u092C \u0926\u0947\u0902","Add tag...":"\u091F\u0948\u0917 \u0932\u0917\u093E\u090F\u0901",Cancel:"\u0930\u0926\u094D\u0926 \u0915\u0930\u0947\u0902",Close:"\u092C\u0902\u0926 \u0915\u0930\u0947\u0902",Edit:"\u0938\u0902\u092A\u093E\u0926\u093F\u0924 \u0915\u0930\u0947\u0902",Delete:"\u0939\u091F\u093E\u090F\u0901",Ok:"\u0920\u0940\u0915 \u0939\u0948"},Fy={"Add a comment...":"Commenta...","Add a reply...":"Rispondi...","Add tag...":"Aggiungi tag...",Cancel:"Annulla",Close:"Chiudi",Edit:"Edit",Delete:"Delete",Ok:"Ok"},ky={"Add a comment...":"\u30B3\u30E1\u30F3\u30C8\u3092\u8FFD\u52A0\u3059\u308B...","Add a reply...":"\u8FD4\u4FE1\u3059\u308B...","Add tag...":"\u30BF\u30B0\u3092\u8FFD\u52A0\u3059\u308B...",Cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",Close:"\u9589\u3058\u308B",Edit:"\u7DE8\u96C6",Delete:"\u524A\u9664",Ok:"Ok"},Ly={"Add a comment...":"\uB313\uAE00 \uCD94\uAC00","Add a reply...":"\uB2F5\uAE00 \uCD94\uAC00","Add tag...":"\uD0DC\uADF8 \uCD94\uAC00",Cancel:"\uCDE8\uC18C",Close:"\uB2EB\uAE30",Edit:"\uC218\uC815",Delete:"\uC0AD\uC81C",Ok:"\uD655\uC778"},By={"Add a comment...":"Commentaar toevoegen...","Add a reply...":"Antwoord toevoegen...","Add tag...":"Tag toevoegen...",Cancel:"Afbreken",Close:"Sluiten",Edit:"Bewerken",Delete:"Verwijderen",Ok:"Ok"},Iy={"Add a comment...":"Adicionar um coment\xE1rio...","Add a reply...":"Adicionar uma resposta...","Add tag...":"Etiquetar...",Cancel:"Cancelar",Close:"Fechar",Edit:"Editar",Delete:"Apagar",Ok:"Ok"},Ny={"Add a comment...":"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439...","Add a reply...":"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0432\u0435\u0442...","Add tag...":"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0442\u044D\u0433...",Cancel:"\u041E\u0442\u043C\u0435\u043D\u0430",Close:"\u0417\u0430\u043A\u0440\u044B\u0442\u044C",Edit:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C",Delete:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C",Ok:"\u041E\u043A"},Hy={"Add a comment...":"Skriv en kommentar...","Add a reply...":"Skriv ett svar...","Add tag...":"Tagg...",Cancel:"Cancel",Close:"St\xE4ng",Edit:"Edit",Delete:"Delete",Ok:"Ok"},zy={"Add a comment...":"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E04\u0E2D\u0E21\u0E40\u0E21\u0E19\u0E15\u0E4C...","Add a reply...":"\u0E15\u0E2D\u0E1A\u0E01\u0E25\u0E31\u0E1A...","Add tag...":"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E41\u0E17\u0E47\u0E01...",Cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",Close:"\u0E1B\u0E34\u0E14",Edit:"\u0E41\u0E01\u0E49\u0E44\u0E02",Delete:"\u0E25\u0E1A",Ok:"\u0E15\u0E01\u0E25\u0E07"},Vy={"Add a comment...":"Yorum ekle...","Add a reply...":"Cevap ekle...","Add tag...":"Tag Ekle...",Cancel:"\u0130ptal",Close:"Kapat",Edit:"D\xFCzenle",Delete:"Sil",Ok:"Tamam"},Uy={"Add a comment...":"\u062A\u0628\u0635\u0631\u06C1 \u06A9\u0631\u06CC\u06BA","Add a reply...":"\u062C\u0648\u0627\u0628 \u062F\u06CC\u06BA","Add tag...":"\u0679\u06CC\u06AF \u0644\u06AF\u0627\u0626\u06CC\u06BA",Cancel:"\u0645\u0646\u0633\u0648\u062E \u06A9\u0631\u06CC\u06BA",Close:"\u0628\u0646\u062F \u06A9\u0631\u06CC\u06BA",Edit:"\u062A\u0631\u0645\u06CC\u0645 \u06A9\u0631\u06CC\u06BA",Delete:"\u06C1\u0679\u0627\u0626\u06CC\u06BA",Ok:"\u0679\u06BE\u06CC\u06A9 \u06C1\u06D2"},Wy={"Add a comment...":"\u6DFB\u52A0\u8BC4\u8BBA...","Add a reply...":"\u6DFB\u52A0\u56DE\u590D...","Add tag...":"\u6DFB\u52A0\u6807\u7B7E...",Cancel:"\u53D6\u6D88",Close:"\u5173\u95ED",Edit:"\u7F16\u8F91",Delete:"\u5220\u9664",Ok:"\u786E\u8BA4"},jy={"Add a comment...":"\u6DFB\u52A0\u8A55\u8AD6...","Add a reply...":"\u6DFB\u52A0\u56DE\u8986...","Add tag...":"\u6DFB\u52A0\u6A19\u7C64...",Cancel:"\u53D6\u6D88",Close:"\u95DC\u9589",Edit:"\u7DE8\u8F2F",Delete:"\u522A\u9664",Ok:"\u78BA\u8A8D"},wu={};Object.defineProperty(wu,"__esModule",{value:!0});var yo=[["\u062B\u0627\u0646\u064A\u0629","\u062B\u0627\u0646\u064A\u062A\u064A\u0646","%s \u062B\u0648\u0627\u0646","%s \u062B\u0627\u0646\u064A\u0629"],["\u062F\u0642\u064A\u0642\u0629","\u062F\u0642\u064A\u0642\u062A\u064A\u0646","%s \u062F\u0642\u0627\u0626\u0642","%s \u062F\u0642\u064A\u0642\u0629"],["\u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u062A\u064A\u0646","%s \u0633\u0627\u0639\u0627\u062A","%s \u0633\u0627\u0639\u0629"],["\u064A\u0648\u0645","\u064A\u0648\u0645\u064A\u0646","%s \u0623\u064A\u0627\u0645","%s \u064A\u0648\u0645\u0627\u064B"],["\u0623\u0633\u0628\u0648\u0639","\u0623\u0633\u0628\u0648\u0639\u064A\u0646","%s \u0623\u0633\u0627\u0628\u064A\u0639","%s \u0623\u0633\u0628\u0648\u0639\u0627\u064B"],["\u0634\u0647\u0631","\u0634\u0647\u0631\u064A\u0646","%s \u0623\u0634\u0647\u0631","%s \u0634\u0647\u0631\u0627\u064B"],["\u0639\u0627\u0645","\u0639\u0627\u0645\u064A\u0646","%s \u0623\u0639\u0648\u0627\u0645","%s \u0639\u0627\u0645\u0627\u064B"]];function Gy(i,t){return t<3?yo[i][t-1]:t>=3&&t<=10?yo[i][2]:yo[i][3]}function qy(i,t){if(t===0)return["\u0645\u0646\u0630 \u0644\u062D\u0638\u0627\u062A","\u0628\u0639\u062F \u0644\u062D\u0638\u0627\u062A"];var e=Gy(Math.floor(t/2),i);return["\u0645\u0646\u0630 "+e,"\u0628\u0639\u062F "+e]}var Xy=wu.default=qy,bu={};Object.defineProperty(bu,"__esModule",{value:!0});function Yy(i,t){var e=0,n=t==1||t==3||t==5||t==7||t==9||t==11||t==13;return n&&i>=5&&(e=1),[[["pr\xE1v\u011B te\u010F","pr\xE1v\u011B te\u010F"]],[["p\u0159ed %s vte\u0159inami","za %s vte\u0159iny"],["p\u0159ed %s vte\u0159inami","za %s vte\u0159in"]],[["p\u0159ed minutou","za minutu"]],[["p\u0159ed %s minutami","za %s minuty"],["p\u0159ed %s minutami","za %s minut"]],[["p\u0159ed hodinou","za hodinu"]],[["p\u0159ed %s hodinami","za %s hodiny"],["p\u0159ed %s hodinami","za %s hodin"]],[["v\u010Dera","z\xEDtra"]],[["p\u0159ed %s dny","za %s dny"],["p\u0159ed %s dny","za %s dn\u016F"]],[["minul\xFD t\xFDden","p\u0159\xED\u0161t\xED t\xFDden"]],[["p\u0159ed %s t\xFDdny","za %s t\xFDdny"],["p\u0159ed %s t\xFDdny","za %s t\xFDdn\u016F"]],[["minul\xFD m\u011Bs\xEDc","p\u0159\xEDst\xED m\u011Bs\xEDc"]],[["p\u0159ed %s m\u011Bs\xEDci","za %s m\u011Bs\xEDce"],["p\u0159ed %s m\u011Bs\xEDci","za %s m\u011Bs\xEDc\u016F"]],[["p\u0159ed rokem","p\u0159\xEDst\xED rok"]],[["p\u0159ed %s lety","za %s roky"],["p\u0159ed %s lety","za %s let"]]][t][e]}var Zy=bu.default=Yy,Su={};Object.defineProperty(Su,"__esModule",{value:!0});function Ky(i,t){return[["gerade eben","vor einer Weile"],["vor %s Sekunden","in %s Sekunden"],["vor 1 Minute","in 1 Minute"],["vor %s Minuten","in %s Minuten"],["vor 1 Stunde","in 1 Stunde"],["vor %s Stunden","in %s Stunden"],["vor 1 Tag","in 1 Tag"],["vor %s Tagen","in %s Tagen"],["vor 1 Woche","in 1 Woche"],["vor %s Wochen","in %s Wochen"],["vor 1 Monat","in 1 Monat"],["vor %s Monaten","in %s Monaten"],["vor 1 Jahr","in 1 Jahr"],["vor %s Jahren","in %s Jahren"]][t]}var Jy=Su.default=Ky,Eu={};Object.defineProperty(Eu,"__esModule",{value:!0});function Qy(i,t){return[["\u03BC\u03CC\u03BB\u03B9\u03C2 \u03C4\u03CE\u03C1\u03B1","\u03C3\u03B5 \u03BB\u03AF\u03B3\u03BF"],["%s \u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 %s \u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1"],["1 \u03BB\u03B5\u03C0\u03C4\u03CC \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 1 \u03BB\u03B5\u03C0\u03C4\u03CC"],["%s \u03BB\u03B5\u03C0\u03C4\u03AC \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 %s \u03BB\u03B5\u03C0\u03C4\u03AC"],["1 \u03CE\u03C1\u03B1 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 1 \u03CE\u03C1\u03B1"],["%s \u03CE\u03C1\u03B5\u03C2 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 %s \u03CE\u03C1\u03B5\u03C2"],["1 \u03BC\u03AD\u03C1\u03B1 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 1 \u03BC\u03AD\u03C1\u03B1"],["%s \u03BC\u03AD\u03C1\u03B5\u03C2 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 %s \u03BC\u03AD\u03C1\u03B5\u03C2"],["1 \u03B5\u03B2\u03B4\u03BF\u03BC\u03AC\u03B4\u03B1 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 1 \u03B5\u03B2\u03B4\u03BF\u03BC\u03AC\u03B4\u03B1"],["%s \u03B5\u03B2\u03B4\u03BF\u03BC\u03AC\u03B4\u03B5\u03C2 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 %s \u03B5\u03B2\u03B4\u03BF\u03BC\u03AC\u03B4\u03B5\u03C2"],["1 \u03BC\u03AE\u03BD\u03B1 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 1 \u03BC\u03AE\u03BD\u03B1"],["%s \u03BC\u03AE\u03BD\u03B5\u03C2 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 %s \u03BC\u03AE\u03BD\u03B5\u03C2"],["1 \u03C7\u03C1\u03CC\u03BD\u03BF \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 1 \u03C7\u03C1\u03CC\u03BD\u03BF"],["%s \u03C7\u03C1\u03CC\u03BD\u03B9\u03B1 \u03C0\u03C1\u03B9\u03BD","\u03C3\u03B5 %s \u03C7\u03C1\u03CC\u03BD\u03B9\u03B1"]][t]}var $y=Eu.default=Qy,xu={};Object.defineProperty(xu,"__esModule",{value:!0});function e0(i,t){return[["justo ahora","en un rato"],["hace %s segundos","en %s segundos"],["hace 1 minuto","en 1 minuto"],["hace %s minutos","en %s minutos"],["hace 1 hora","en 1 hora"],["hace %s horas","en %s horas"],["hace 1 d\xEDa","en 1 d\xEDa"],["hace %s d\xEDas","en %s d\xEDas"],["hace 1 semana","en 1 semana"],["hace %s semanas","en %s semanas"],["hace 1 mes","en 1 mes"],["hace %s meses","en %s meses"],["hace 1 a\xF1o","en 1 a\xF1o"],["hace %s a\xF1os","en %s a\xF1os"]][t]}var t0=xu.default=e0,_u={};Object.defineProperty(_u,"__esModule",{value:!0});function n0(i,t){return[["juuri \xE4sken","juuri nyt"],["%s sekuntia sitten","%s sekunnin p\xE4\xE4st\xE4"],["minuutti sitten","minuutin p\xE4\xE4st\xE4"],["%s minuuttia sitten","%s minuutin p\xE4\xE4st\xE4"],["tunti sitten","tunnin p\xE4\xE4st\xE4"],["%s tuntia sitten","%s tunnin p\xE4\xE4st\xE4"],["p\xE4iv\xE4 sitten","p\xE4iv\xE4n p\xE4\xE4st\xE4"],["%s p\xE4iv\xE4\xE4 sitten","%s p\xE4iv\xE4n p\xE4\xE4st\xE4"],["viikko sitten","viikon p\xE4\xE4st\xE4"],["%s viikkoa sitten","%s viikon p\xE4\xE4st\xE4"],["kuukausi sitten","kuukauden p\xE4\xE4st\xE4"],["%s kuukautta sitten","%s kuukauden p\xE4\xE4st\xE4"],["vuosi sitten","vuoden p\xE4\xE4st\xE4"],["%s vuotta sitten","%s vuoden p\xE4\xE4st\xE4"]][t]}var i0=_u.default=n0,Tu={};Object.defineProperty(Tu,"__esModule",{value:!0});function r0(i,t){return[["\xE0 l'instant","dans un instant"],["il y a %s secondes","dans %s secondes"],["il y a 1 minute","dans 1 minute"],["il y a %s minutes","dans %s minutes"],["il y a 1 heure","dans 1 heure"],["il y a %s heures","dans %s heures"],["il y a 1 jour","dans 1 jour"],["il y a %s jours","dans %s jours"],["il y a 1 semaine","dans 1 semaine"],["il y a %s semaines","dans %s semaines"],["il y a 1 mois","dans 1 mois"],["il y a %s mois","dans %s mois"],["il y a 1 an","dans 1 an"],["il y a %s ans","dans %s ans"]][t]}var o0=Tu.default=r0,Cu={};Object.defineProperty(Cu,"__esModule",{value:!0});function s0(i,t){return[["xusto agora","daqu\xED a un pouco"],["hai %s segundos","en %s segundos"],["hai 1 minuto","nun minuto"],["hai %s minutos","en %s minutos"],["hai 1 hora","nunha hora"],["hai %s horas","en %s horas"],["hai 1 d\xEDa","nun d\xEDa"],["hai %s d\xEDas","en %s d\xEDas"],["hai 1 semana","nunha semana"],["hai %s semanas","en %s semanas"],["hai 1 mes","nun mes"],["hai %s meses","en %s meses"],["hai 1 ano","nun ano"],["hai %s anos","en %s anos"]][t]}var a0=Cu.default=s0,Pu={};Object.defineProperty(Pu,"__esModule",{value:!0});function l0(i,t){return[["\u0905\u092D\u0940","\u0915\u0941\u091B \u0938\u092E\u092F"],["%s \u0938\u0947\u0915\u0902\u0921 \u092A\u0939\u0932\u0947","%s \u0938\u0947\u0915\u0902\u0921 \u092E\u0947\u0902"],["1 \u092E\u093F\u0928\u091F \u092A\u0939\u0932\u0947","1 \u092E\u093F\u0928\u091F \u092E\u0947\u0902"],["%s \u092E\u093F\u0928\u091F \u092A\u0939\u0932\u0947","%s \u092E\u093F\u0928\u091F \u092E\u0947\u0902"],["1 \u0918\u0902\u091F\u0947 \u092A\u0939\u0932\u0947","1 \u0918\u0902\u091F\u0947 \u092E\u0947\u0902"],["%s \u0918\u0902\u091F\u0947 \u092A\u0939\u0932\u0947","%s \u0918\u0902\u091F\u0947 \u092E\u0947\u0902"],["1 \u0926\u093F\u0928 \u092A\u0939\u0932\u0947","1 \u0926\u093F\u0928 \u092E\u0947\u0902"],["%s \u0926\u093F\u0928 \u092A\u0939\u0932\u0947","%s \u0926\u093F\u0928\u094B\u0902 \u092E\u0947\u0902"],["1 \u0938\u092A\u094D\u0924\u093E\u0939 \u092A\u0939\u0932\u0947","1 \u0938\u092A\u094D\u0924\u093E\u0939 \u092E\u0947\u0902"],["%s \u0939\u092B\u094D\u0924\u0947 \u092A\u0939\u0932\u0947","%s \u0939\u092B\u094D\u0924\u094B\u0902 \u092E\u0947\u0902"],["1 \u092E\u0939\u0940\u0928\u0947 \u092A\u0939\u0932\u0947","1 \u092E\u0939\u0940\u0928\u0947 \u092E\u0947\u0902"],["%s \u092E\u0939\u0940\u0928\u0947 \u092A\u0939\u0932\u0947","%s \u092E\u0939\u0940\u0928\u094B\u0902 \u092E\u0947\u0902"],["1 \u0938\u093E\u0932 \u092A\u0939\u0932\u0947","1 \u0938\u093E\u0932 \u092E\u0947\u0902"],["%s \u0938\u093E\u0932 \u092A\u0939\u0932\u0947","%s \u0938\u093E\u0932 \u092E\u0947\u0902"]][t]}var u0=Pu.default=l0,Au={};Object.defineProperty(Au,"__esModule",{value:!0});function c0(i,t){return[["poco fa","fra poco"],["%s secondi fa","fra %s secondi"],["un minuto fa","fra un minuto"],["%s minuti fa","fra %s minuti"],["un'ora fa","fra un'ora"],["%s ore fa","fra %s ore"],["un giorno fa","fra un giorno"],["%s giorni fa","fra %s giorni"],["una settimana fa","fra una settimana"],["%s settimane fa","fra %s settimane"],["un mese fa","fra un mese"],["%s mesi fa","fra %s mesi"],["un anno fa","fra un anno"],["%s anni fa","fra %s anni"]][t]}var h0=Au.default=c0,Ou={};Object.defineProperty(Ou,"__esModule",{value:!0});function d0(i,t){return[["\u3059\u3053\u3057\u524D","\u3059\u3050\u306B"],["%s\u79D2\u524D","%s\u79D2\u4EE5\u5185"],["1\u5206\u524D","1\u5206\u4EE5\u5185"],["%s\u5206\u524D","%s\u5206\u4EE5\u5185"],["1\u6642\u9593\u524D","1\u6642\u9593\u4EE5\u5185"],["%s\u6642\u9593\u524D","%s\u6642\u9593\u4EE5\u5185"],["1\u65E5\u524D","1\u65E5\u4EE5\u5185"],["%s\u65E5\u524D","%s\u65E5\u4EE5\u5185"],["1\u9031\u9593\u524D","1\u9031\u9593\u4EE5\u5185"],["%s\u9031\u9593\u524D","%s\u9031\u9593\u4EE5\u5185"],["1\u30F6\u6708\u524D","1\u30F6\u6708\u4EE5\u5185"],["%s\u30F6\u6708\u524D","%s\u30F6\u6708\u4EE5\u5185"],["1\u5E74\u524D","1\u5E74\u4EE5\u5185"],["%s\u5E74\u524D","%s\u5E74\u4EE5\u5185"]][t]}var f0=Ou.default=d0,Du={};Object.defineProperty(Du,"__esModule",{value:!0});function p0(i,t){return[["\uBC29\uAE08","\uACE7"],["%s\uCD08 \uC804","%s\uCD08 \uD6C4"],["1\uBD84 \uC804","1\uBD84 \uD6C4"],["%s\uBD84 \uC804","%s\uBD84 \uD6C4"],["1\uC2DC\uAC04 \uC804","1\uC2DC\uAC04 \uD6C4"],["%s\uC2DC\uAC04 \uC804","%s\uC2DC\uAC04 \uD6C4"],["1\uC77C \uC804","1\uC77C \uD6C4"],["%s\uC77C \uC804","%s\uC77C \uD6C4"],["1\uC8FC\uC77C \uC804","1\uC8FC\uC77C \uD6C4"],["%s\uC8FC\uC77C \uC804","%s\uC8FC\uC77C \uD6C4"],["1\uAC1C\uC6D4 \uC804","1\uAC1C\uC6D4 \uD6C4"],["%s\uAC1C\uC6D4 \uC804","%s\uAC1C\uC6D4 \uD6C4"],["1\uB144 \uC804","1\uB144 \uD6C4"],["%s\uB144 \uC804","%s\uB144 \uD6C4"]][t]}var m0=Du.default=p0,Ru={};Object.defineProperty(Ru,"__esModule",{value:!0});function g0(i,t){return[["recent","binnenkort"],["%s seconden geleden","binnen %s seconden"],["1 minuut geleden","binnen 1 minuut"],["%s minuten geleden","binnen %s minuten"],["1 uur geleden","binnen 1 uur"],["%s uur geleden","binnen %s uur"],["1 dag geleden","binnen 1 dag"],["%s dagen geleden","binnen %s dagen"],["1 week geleden","binnen 1 week"],["%s weken geleden","binnen %s weken"],["1 maand geleden","binnen 1 maand"],["%s maanden geleden","binnen %s maanden"],["1 jaar geleden","binnen 1 jaar"],["%s jaar geleden","binnen %s jaar"]][t]}var v0=Ru.default=g0,Mu={};Object.defineProperty(Mu,"__esModule",{value:!0});function y0(i,t){return[["agora mesmo","agora"],["h\xE1 %s segundos","em %s segundos"],["h\xE1 um minuto","em um minuto"],["h\xE1 %s minutos","em %s minutos"],["h\xE1 uma hora","em uma hora"],["h\xE1 %s horas","em %s horas"],["h\xE1 um dia","em um dia"],["h\xE1 %s dias","em %s dias"],["h\xE1 uma semana","em uma semana"],["h\xE1 %s semanas","em %s semanas"],["h\xE1 um m\xEAs","em um m\xEAs"],["h\xE1 %s meses","em %s meses"],["h\xE1 um ano","em um ano"],["h\xE1 %s anos","em %s anos"]][t]}var w0=Mu.default=y0,Fu={};Object.defineProperty(Fu,"__esModule",{value:!0});function Ht(i,t,e,n,r){var o=r%10,s=n;return r===1?s=i:o===1&&r>20?s=t:o>1&&o<5&&(r>20||r<10)&&(s=e),s}var ku=Ht.bind(null,"\u0441\u0435\u043A\u0443\u043D\u0434\u0443","%s \u0441\u0435\u043A\u0443\u043D\u0434\u0443","%s \u0441\u0435\u043A\u0443\u043D\u0434\u044B","%s \u0441\u0435\u043A\u0443\u043D\u0434"),Lu=Ht.bind(null,"\u043C\u0438\u043D\u0443\u0442\u0443","%s \u043C\u0438\u043D\u0443\u0442\u0443","%s \u043C\u0438\u043D\u0443\u0442\u044B","%s \u043C\u0438\u043D\u0443\u0442"),Bu=Ht.bind(null,"\u0447\u0430\u0441","%s \u0447\u0430\u0441","%s \u0447\u0430\u0441\u0430","%s \u0447\u0430\u0441\u043E\u0432"),Iu=Ht.bind(null,"\u0434\u0435\u043D\u044C","%s \u0434\u0435\u043D\u044C","%s \u0434\u043D\u044F","%s \u0434\u043D\u0435\u0439"),Nu=Ht.bind(null,"\u043D\u0435\u0434\u0435\u043B\u044E","%s \u043D\u0435\u0434\u0435\u043B\u044E","%s \u043D\u0435\u0434\u0435\u043B\u0438","%s \u043D\u0435\u0434\u0435\u043B\u044C"),Hu=Ht.bind(null,"\u043C\u0435\u0441\u044F\u0446","%s \u043C\u0435\u0441\u044F\u0446","%s \u043C\u0435\u0441\u044F\u0446\u0430","%s \u043C\u0435\u0441\u044F\u0446\u0435\u0432"),zu=Ht.bind(null,"\u0433\u043E\u0434","%s \u0433\u043E\u0434","%s \u0433\u043E\u0434\u0430","%s \u043B\u0435\u0442");function b0(i,t){switch(t){case 0:return["\u0442\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u043E","\u0447\u0435\u0440\u0435\u0437 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0435\u043A\u0443\u043D\u0434"];case 1:return[ku(i)+" \u043D\u0430\u0437\u0430\u0434","\u0447\u0435\u0440\u0435\u0437 "+ku(i)];case 2:case 3:return[Lu(i)+" \u043D\u0430\u0437\u0430\u0434","\u0447\u0435\u0440\u0435\u0437 "+Lu(i)];case 4:case 5:return[Bu(i)+" \u043D\u0430\u0437\u0430\u0434","\u0447\u0435\u0440\u0435\u0437 "+Bu(i)];case 6:return["\u0432\u0447\u0435\u0440\u0430","\u0437\u0430\u0432\u0442\u0440\u0430"];case 7:return[Iu(i)+" \u043D\u0430\u0437\u0430\u0434","\u0447\u0435\u0440\u0435\u0437 "+Iu(i)];case 8:case 9:return[Nu(i)+" \u043D\u0430\u0437\u0430\u0434","\u0447\u0435\u0440\u0435\u0437 "+Nu(i)];case 10:case 11:return[Hu(i)+" \u043D\u0430\u0437\u0430\u0434","\u0447\u0435\u0440\u0435\u0437 "+Hu(i)];case 12:case 13:return[zu(i)+" \u043D\u0430\u0437\u0430\u0434","\u0447\u0435\u0440\u0435\u0437 "+zu(i)];default:return["",""]}}var S0=Fu.default=b0,Vu={};Object.defineProperty(Vu,"__esModule",{value:!0});function E0(i,t){return[["just nu","om en stund"],["%s sekunder sedan","om %s sekunder"],["1 minut sedan","om 1 minut"],["%s minuter sedan","om %s minuter"],["1 timme sedan","om 1 timme"],["%s timmar sedan","om %s timmar"],["1 dag sedan","om 1 dag"],["%s dagar sedan","om %s dagar"],["1 vecka sedan","om 1 vecka"],["%s veckor sedan","om %s veckor"],["1 m\xE5nad sedan","om 1 m\xE5nad"],["%s m\xE5nader sedan","om %s m\xE5nader"],["1 \xE5r sedan","om 1 \xE5r"],["%s \xE5r sedan","om %s \xE5r"]][t]}var x0=Vu.default=E0,Uu={};Object.defineProperty(Uu,"__esModule",{value:!0});function _0(i,t){return[["\u0E40\u0E21\u0E37\u0E48\u0E2D\u0E2A\u0E31\u0E01\u0E04\u0E23\u0E39\u0E48\u0E19\u0E35\u0E49","\u0E2D\u0E35\u0E01\u0E2A\u0E31\u0E01\u0E04\u0E23\u0E39\u0E48"],["%s \u0E27\u0E34\u0E19\u0E32\u0E17\u0E35\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 %s \u0E27\u0E34\u0E19\u0E32\u0E17\u0E35"],["1 \u0E19\u0E32\u0E17\u0E35\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 1 \u0E19\u0E32\u0E17\u0E35"],["%s \u0E19\u0E32\u0E17\u0E35\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 %s \u0E19\u0E32\u0E17\u0E35"],["1 \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 1 \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07"],["%s \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 %s \u0E0A\u0E31\u0E48\u0E27\u0E42\u0E21\u0E07"],["1 \u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 1 \u0E27\u0E31\u0E19"],["%s \u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 %s \u0E27\u0E31\u0E19"],["1 \u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 1 \u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C"],["%s \u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 %s \u0E2D\u0E32\u0E17\u0E34\u0E15\u0E22\u0E4C"],["1 \u0E40\u0E14\u0E37\u0E2D\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 1 \u0E40\u0E14\u0E37\u0E2D\u0E19"],["%s \u0E40\u0E14\u0E37\u0E2D\u0E19\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 %s \u0E40\u0E14\u0E37\u0E2D\u0E19"],["1 \u0E1B\u0E35\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 1 \u0E1B\u0E35"],["%s \u0E1B\u0E35\u0E17\u0E35\u0E48\u0E41\u0E25\u0E49\u0E27","\u0E43\u0E19 %s \u0E1B\u0E35"]][t]}var T0=Uu.default=_0,Wu={};Object.defineProperty(Wu,"__esModule",{value:!0});function C0(i,t){return[["az \xF6nce","\u015Fimdi"],["%s saniye \xF6nce","%s saniye i\xE7inde"],["1 dakika \xF6nce","1 dakika i\xE7inde"],["%s dakika \xF6nce","%s dakika i\xE7inde"],["1 saat \xF6nce","1 saat i\xE7inde"],["%s saat \xF6nce","%s saat i\xE7inde"],["1 g\xFCn \xF6nce","1 g\xFCn i\xE7inde"],["%s g\xFCn \xF6nce","%s g\xFCn i\xE7inde"],["1 hafta \xF6nce","1 hafta i\xE7inde"],["%s hafta \xF6nce","%s hafta i\xE7inde"],["1 ay \xF6nce","1 ay i\xE7inde"],["%s ay \xF6nce","%s ay i\xE7inde"],["1 y\u0131l \xF6nce","1 y\u0131l i\xE7inde"],["%s y\u0131l \xF6nce","%s y\u0131l i\xE7inde"]][t]}var P0=Wu.default=C0,ju={};Object.defineProperty(ju,"__esModule",{value:!0});var A0=["\u79D2","\u5206\u949F","\u5C0F\u65F6","\u5929","\u5468","\u4E2A\u6708","\u5E74"];function O0(i,t){if(t===0)return["\u521A\u521A","\u7247\u523B\u540E"];var e=A0[~~(t/2)];return[i+" "+e+"\u524D",i+" "+e+"\u540E"]}var D0=ju.default=O0,Gu={};Object.defineProperty(Gu,"__esModule",{value:!0});function R0(i,t){return[["\u525B\u525B","\u7247\u523B\u5F8C"],["%s \u79D2\u524D","%s \u79D2\u5F8C"],["1 \u5206\u9418\u524D","1 \u5206\u9418\u5F8C"],["%s \u5206\u9418\u524D","%s \u5206\u9418\u5F8C"],["1 \u5C0F\u6642\u524D","1 \u5C0F\u6642\u5F8C"],["%s \u5C0F\u6642\u524D","%s \u5C0F\u6642\u5F8C"],["1 \u5929\u524D","1 \u5929\u5F8C"],["%s \u5929\u524D","%s \u5929\u5F8C"],["1 \u9031\u524D","1 \u9031\u5F8C"],["%s \u9031\u524D","%s \u9031\u5F8C"],["1 \u500B\u6708\u524D","1 \u500B\u6708\u5F8C"],["%s \u500B\u6708\u524D","%s \u500B\u6708\u5F8C"],["1 \u5E74\u524D","1 \u5E74\u5F8C"],["%s \u5E74\u524D","%s \u5E74\u5F8C"]][t]}var M0=Gu.default=R0;const on={ar:_y,cs:Ty,de:Cy,el:Py,es:Ay,fi:Oy,fr:Dy,gl:Ry,hi:My,it:Fy,ja:ky,ko:Ly,nl:By,pt:Iy,ru:Ny,sv:Hy,th:zy,tr:Vy,ur:Uy,"zh-CN":Wy,"zh-TW":jy},F0=Object.keys(on),zt=new xy({allowMissing:!0});zt.init=(i,t)=>{zt.clear(),i&&(zt.locale(i),zt.extend(on[i])),t&&zt.extend(t)},_e("ar",Xy),_e("cs",Zy),_e("de",Jy),_e("el",$y),_e("es",t0),_e("fi",i0),_e("fr",o0),_e("gl",a0),_e("hi",u0),_e("it",h0),_e("ja",f0),_e("ko",m0),_e("nl",v0),_e("pt",w0),_e("ru",S0),_e("sv",x0),_e("th",T0),_e("tr",P0),_e("zh-CN",D0),_e("zh-TW",M0),zt.registerMessages=(i,t)=>{on[i]?on[i]={...on[i],...t}:on[i]=t};var Ze=zt,k0=i=>{const t=ot();return If(t,()=>i.onClickOutside()),k.createElement("ul",{ref:t,className:"r6o-comment-dropdown-menu"},k.createElement("li",{onClick:i.onEdit},Ze.t("Edit")),k.createElement("li",{onClick:i.onDelete},Ze.t("Delete")))},qu={},wo={},bo={exports:{}};/*! + autosize 4.0.4 + license: MIT + http://www.jacklmoore.com/autosize +*/(function(i,t){(function(e,n){n(i,t)})(_t,function(e,n){var r=typeof Map=="function"?new Map:function(){var c=[],h=[];return{has:function(g){return c.indexOf(g)>-1},get:function(g){return h[c.indexOf(g)]},set:function(g,y){c.indexOf(g)===-1&&(c.push(g),h.push(y))},delete:function(g){var y=c.indexOf(g);y>-1&&(c.splice(y,1),h.splice(y,1))}}}(),o=function(h){return new Event(h,{bubbles:!0})};try{new Event("test")}catch{o=function(d){var g=document.createEvent("Event");return g.initEvent(d,!0,!1),g}}function s(c){if(!c||!c.nodeName||c.nodeName!=="TEXTAREA"||r.has(c))return;var h=null,d=null,g=null;function y(){var C=window.getComputedStyle(c,null);C.resize==="vertical"?c.style.resize="none":C.resize==="both"&&(c.style.resize="horizontal"),C.boxSizing==="content-box"?h=-(parseFloat(C.paddingTop)+parseFloat(C.paddingBottom)):h=parseFloat(C.borderTopWidth)+parseFloat(C.borderBottomWidth),isNaN(h)&&(h=0),f()}function x(C){{var O=c.style.width;c.style.width="0px",c.offsetWidth,c.style.width=O}c.style.overflowY=C}function b(C){for(var O=[];C&&C.parentNode&&C.parentNode instanceof Element;)C.parentNode.scrollTop&&O.push({node:C.parentNode,scrollTop:C.parentNode.scrollTop}),C=C.parentNode;return O}function T(){if(c.scrollHeight!==0){var C=b(c),O=document.documentElement&&document.documentElement.scrollTop;c.style.height="",c.style.height=c.scrollHeight+h+"px",d=c.clientWidth,C.forEach(function(D){D.node.scrollTop=D.scrollTop}),O&&(document.documentElement.scrollTop=O)}}function f(){T();var C=Math.round(parseFloat(c.style.height)),O=window.getComputedStyle(c,null),D=O.boxSizing==="content-box"?Math.round(parseFloat(O.height)):c.offsetHeight;if(D{e.which===13&&e.ctrlKey&&this.props.onSaveAndClose()});P(this,"onKeyUp",e=>{e.which===46&&e.stopPropagation()});this.element=ur()}componentDidMount(){this.props.focus&&this.element.current&&this.element.current.focus({preventScroll:!0})}render(){return k.createElement(j0,{ref:this.element,className:"r6o-editable-text",value:this.props.content,placeholder:this.props.placeholder||Ze.t("Add a comment..."),disabled:!this.props.editable,onChange:this.props.onChange,onKeyUp:this.onKeyUp,onKeyDown:this.onKeyDown})}}function ne(){return ne=Object.assign?Object.assign.bind():function(i){for(var t=1;t0?Ie(an,--Ge):0,sn--,Ce===10&&(sn=1,Ti--),Ce}function Ke(){return Ce=Ge2||Nn(Ce)>3?"":" "}function rw(i,t){for(;--t&&Ke()&&!(Ce<48||Ce>102||Ce>57&&Ce<65||Ce>70&&Ce<97););return In(i,Pi()+(t<6&&ht()==32&&Ke()==32))}function Po(i){for(;Ke();)switch(Ce){case i:return Ge;case 34:case 39:i!==34&&i!==39&&Po(Ce);break;case 40:i===41&&Po(i);break;case 92:Ke();break}return Ge}function ow(i,t){for(;Ke()&&i+Ce!==47+10;)if(i+Ce===42+42&&ht()===47)break;return"/*"+In(t,Ge-1)+"*"+xi(i===47?i:Ke())}function sw(i){for(;!Nn(ht());)Ke();return In(i,Ge)}function aw(i){return ec(Oi("",null,null,null,[""],i=$u(i),0,[0],i))}function Oi(i,t,e,n,r,o,s,a,l){for(var u=0,c=0,h=s,d=0,g=0,y=0,x=1,b=1,T=1,f=0,E="",A=r,C=o,O=n,D=E;b;)switch(y=f,f=Ke()){case 40:if(y!=108&&Ie(D,h-1)==58){To(D+=ye(Ai(f),"&","&\f"),"&\f")!=-1&&(T=-1);break}case 34:case 39:case 91:D+=Ai(f);break;case 9:case 10:case 13:case 32:D+=iw(y);break;case 92:D+=rw(Pi()-1,7);continue;case 47:switch(ht()){case 42:case 47:_i(lw(ow(Ke(),Pi()),t,e),l);break;default:D+="/"}break;case 123*x:a[u++]=ct(D)*T;case 125*x:case 59:case 0:switch(f){case 0:case 125:b=0;case 59+c:T==-1&&(D=ye(D,/\f/g,"")),g>0&&ct(D)-h&&_i(g>32?nc(D+";",n,e,h-1):nc(ye(D," ","")+";",n,e,h-2),l);break;case 59:D+=";";default:if(_i(O=tc(D,t,e,u,c,r,a,E,A=[],C=[],h),o),f===123)if(c===0)Oi(D,t,O,O,A,o,h,a,C);else switch(d===99&&Ie(D,3)===110?100:d){case 100:case 108:case 109:case 115:Oi(i,O,O,n&&_i(tc(i,O,O,0,0,r,a,E,r,A=[],h),C),r,C,h,a,n?A:C);break;default:Oi(D,O,O,O,[""],C,0,a,C)}}u=c=g=0,x=T=1,E=D="",h=s;break;case 58:h=1+ct(D),g=y;default:if(x<1){if(f==123)--x;else if(f==125&&x++==0&&nw()==125)continue}switch(D+=xi(f),f*x){case 38:T=c>0?1:(D+="\f",-1);break;case 44:a[u++]=(ct(D)-1)*T,T=1;break;case 64:ht()===45&&(D+=Ai(Ke())),d=ht(),c=h=ct(E=D+=sw(Pi())),f++;break;case 45:y===45&&ct(D)==2&&(x=0)}}return o}function tc(i,t,e,n,r,o,s,a,l,u,c){for(var h=r-1,d=r===0?o:[""],g=Co(d),y=0,x=0,b=0;y0?d[T]+" "+f:ye(f,/&\f/g,d[T])))&&(l[b++]=E);return Ci(i,t,e,r===0?xo:a,l,u,c)}function lw(i,t,e){return Ci(i,t,e,Zu,xi(tw()),Ln(i,2,-2),0)}function nc(i,t,e,n){return Ci(i,t,e,_o,Ln(i,0,n),Ln(i,n+1,-1),n)}function ln(i,t){for(var e="",n=Co(i),r=0;r6)switch(Ie(i,t+1)){case 109:if(Ie(i,t+4)!==45)break;case 102:return ye(i,/(.+:)(.+)-([^]+)/,"$1"+ve+"$2-$3$1"+Ei+(Ie(i,t+3)==108?"$3":"$2-$3"))+i;case 115:return~To(i,"stretch")?rc(ye(i,"stretch","fill-available"),t)+i:i}break;case 4949:if(Ie(i,t+1)!==115)break;case 6444:switch(Ie(i,ct(i)-3-(~To(i,"!important")&&10))){case 107:return ye(i,":",":"+ve)+i;case 101:return ye(i,/(.+:)([^;!]+)(;|!.+)?/,"$1"+ve+(Ie(i,14)===45?"inline-":"")+"box$3$1"+ve+"$2$3$1"+je+"$2box$3")+i}break;case 5936:switch(Ie(i,t+11)){case 114:return ve+i+je+ye(i,/[svh]\w+-[tblr]{2}/,"tb")+i;case 108:return ve+i+je+ye(i,/[svh]\w+-[tblr]{2}/,"tb-rl")+i;case 45:return ve+i+je+ye(i,/[svh]\w+-[tblr]{2}/,"lr")+i}return ve+i+je+i+i}return i}var yw=function(t,e,n,r){if(t.length>-1&&!t.return)switch(t.type){case _o:t.return=rc(t.value,t.length);break;case Ku:return ln([Bn(t,{value:ye(t.value,"@","@"+ve)})],r);case xo:if(t.length)return ew(t.props,function(o){switch($0(o,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return ln([Bn(t,{props:[ye(o,/:(read-\w+)/,":"+Ei+"$1")]})],r);case"::placeholder":return ln([Bn(t,{props:[ye(o,/:(plac\w+)/,":"+ve+"input-$1")]}),Bn(t,{props:[ye(o,/:(plac\w+)/,":"+Ei+"$1")]}),Bn(t,{props:[ye(o,/:(plac\w+)/,je+"input-$1")]})],r)}return""})}},ww=[yw],bw=function(t){var e=t.key;if(e==="css"){var n=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(n,function(x){var b=x.getAttribute("data-emotion");b.indexOf(" ")!==-1&&(document.head.appendChild(x),x.setAttribute("data-s",""))})}var r=t.stylisPlugins||ww,o={},s,a=[];s=t.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+e+' "]'),function(x){for(var b=x.getAttribute("data-emotion").split(" "),T=1;T=4;++n,r-=4)e=i.charCodeAt(n)&255|(i.charCodeAt(++n)&255)<<8|(i.charCodeAt(++n)&255)<<16|(i.charCodeAt(++n)&255)<<24,e=(e&65535)*1540483477+((e>>>16)*59797<<16),e^=e>>>24,t=(e&65535)*1540483477+((e>>>16)*59797<<16)^(t&65535)*1540483477+((t>>>16)*59797<<16);switch(r){case 3:t^=(i.charCodeAt(n+2)&255)<<16;case 2:t^=(i.charCodeAt(n+1)&255)<<8;case 1:t^=i.charCodeAt(n)&255,t=(t&65535)*1540483477+((t>>>16)*59797<<16)}return t^=t>>>13,t=(t&65535)*1540483477+((t>>>16)*59797<<16),((t^t>>>15)>>>0).toString(36)}var Dw={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Rw=/[A-Z]|^ms/g,Mw=/_EMO_([^_]+?)_([^]*?)_EMO_/g,hc=function(t){return t.charCodeAt(1)===45},dc=function(t){return t!=null&&typeof t!="boolean"},Mo=dw(function(i){return hc(i)?i:i.replace(Rw,"-$&").toLowerCase()}),fc=function(t,e){switch(t){case"animation":case"animationName":if(typeof e=="string")return e.replace(Mw,function(n,r,o){return dt={name:r,styles:o,next:dt},r})}return Dw[t]!==1&&!hc(t)&&typeof e=="number"&&e!==0?e+"px":e},R1="Component selectors can only be used in conjunction with @emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware compiler transform.";function Hn(i,t,e){if(e==null)return"";if(e.__emotion_styles!==void 0)return e;switch(typeof e){case"boolean":return"";case"object":{if(e.anim===1)return dt={name:e.name,styles:e.styles,next:dt},e.name;if(e.styles!==void 0){var n=e.next;if(n!==void 0)for(;n!==void 0;)dt={name:n.name,styles:n.styles,next:dt},n=n.next;var r=e.styles+";";return r}return Fw(i,t,e)}case"function":{if(i!==void 0){var o=dt,s=e(i);return dt=o,Hn(i,t,s)}break}}if(t==null)return e;var a=t[e];return a!==void 0?a:e}function Fw(i,t,e){var n="";if(Array.isArray(e))for(var r=0;r=0)&&(e[r]=i[r]);return e}function un(i,t){if(i==null)return{};var e=Io(i,t),n,r;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(i);for(r=0;r=0)&&(!Object.prototype.propertyIsEnumerable.call(i,n)||(e[n]=i[n]))}return e}function cn(i){return cn=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},cn(i)}var wc={};Object.defineProperty(wc,"__esModule",{value:!0});var No=Object.assign||function(i){for(var t=1;t=0||!Object.prototype.hasOwnProperty.call(i,n)||(e[n]=i[n]);return e}function Yw(i,t){if(!(i instanceof t))throw new TypeError("Cannot call a class as a function")}function Zw(i,t){if(!i)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t&&(typeof t=="object"||typeof t=="function")?t:i}function Kw(i,t){if(typeof t!="function"&&t!==null)throw new TypeError("Super expression must either be null or a function, not "+typeof t);i.prototype=Object.create(t&&t.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(i,t):i.__proto__=t)}var xc={position:"absolute",top:0,left:0,visibility:"hidden",height:0,overflow:"scroll",whiteSpace:"pre"},Jw=["extraWidth","injectStyles","inputClassName","inputRef","inputStyle","minWidth","onAutosize","placeholderIsMinWidth"],Qw=function(t){return Jw.forEach(function(e){return delete t[e]}),t},_c=function(t,e){e.style.fontSize=t.fontSize,e.style.fontFamily=t.fontFamily,e.style.fontWeight=t.fontWeight,e.style.fontStyle=t.fontStyle,e.style.letterSpacing=t.letterSpacing,e.style.textTransform=t.textTransform},Tc=typeof window!="undefined"&&window.navigator?/MSIE |Trident\/|Edge\//.test(window.navigator.userAgent):!1,Cc=function(){return Tc?"_"+Math.random().toString(36).substr(2,12):void 0},Ho=function(i){Kw(t,i),bc(t,null,[{key:"getDerivedStateFromProps",value:function(n,r){var o=n.id;return o!==r.prevId?{inputId:o||Cc(),prevId:o}:null}}]);function t(e){Yw(this,t);var n=Zw(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.inputRef=function(r){n.input=r,typeof n.props.inputRef=="function"&&n.props.inputRef(r)},n.placeHolderSizerRef=function(r){n.placeHolderSizer=r},n.sizerRef=function(r){n.sizer=r},n.state={inputWidth:e.minWidth,inputId:e.id||Cc(),prevId:e.id},n}return bc(t,[{key:"componentDidMount",value:function(){this.mounted=!0,this.copyInputStyles(),this.updateInputWidth()}},{key:"componentDidUpdate",value:function(n,r){r.inputWidth!==this.state.inputWidth&&typeof this.props.onAutosize=="function"&&this.props.onAutosize(this.state.inputWidth),this.updateInputWidth()}},{key:"componentWillUnmount",value:function(){this.mounted=!1}},{key:"copyInputStyles",value:function(){if(!(!this.mounted||!window.getComputedStyle)){var n=this.input&&window.getComputedStyle(this.input);!n||(_c(n,this.sizer),this.placeHolderSizer&&_c(n,this.placeHolderSizer))}}},{key:"updateInputWidth",value:function(){if(!(!this.mounted||!this.sizer||typeof this.sizer.scrollWidth=="undefined")){var n=void 0;this.props.placeholder&&(!this.props.value||this.props.value&&this.props.placeholderIsMinWidth)?n=Math.max(this.sizer.scrollWidth,this.placeHolderSizer.scrollWidth)+2:n=this.sizer.scrollWidth+2;var r=this.props.type==="number"&&this.props.extraWidth===void 0?16:parseInt(this.props.extraWidth)||0;n+=r,n-1}function Mc(i){return zo(i)?window.pageYOffset:i.scrollTop}function Xi(i,t){if(zo(i)){window.scrollTo(0,t);return}i.scrollTop=t}function ab(i){var t=getComputedStyle(i),e=t.position==="absolute",n=/(auto|scroll)/,r=document.documentElement;if(t.position==="fixed")return r;for(var o=i;o=o.parentElement;)if(t=getComputedStyle(o),!(e&&t.position==="static")&&n.test(t.overflow+t.overflowY+t.overflowX))return o;return r}function lb(i,t,e,n){return e*((i=i/n-1)*i*i+1)+t}function Yi(i,t){var e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:200,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:qi,r=Mc(i),o=t-r,s=10,a=0;function l(){a+=s;var u=lb(a,r,o,e);Xi(i,u),ae.bottom?Xi(i,Math.min(t.offsetTop+t.clientHeight-i.offsetHeight+r,i.scrollHeight)):n.top-r=x)return{placement:"bottom",maxHeight:t};if(Z>=x&&!s)return o&&Yi(u,Y,K),{placement:"bottom",maxHeight:t};if(!s&&Z>=n||s&&I>=n){o&&Yi(u,Y,K);var Q=s?I-C:Z-C;return{placement:"bottom",maxHeight:Q}}if(r==="auto"||s){var le=t,re=s?D:B;return re>=n&&(le=Math.min(re-C-l.controlHeight,t)),{placement:"top",maxHeight:le}}if(r==="bottom")return o&&Xi(u,Y),{placement:"bottom",maxHeight:t};break;case"top":if(D>=x)return{placement:"top",maxHeight:t};if(B>=x&&!s)return o&&Yi(u,V,K),{placement:"top",maxHeight:t};if(!s&&B>=n||s&&D>=n){var se=t;return(!s&&B>=n||s&&D>=n)&&(se=s?D-O:B-O),o&&Yi(u,V,K),{placement:"top",maxHeight:se}}return{placement:"bottom",maxHeight:t};default:throw new Error('Invalid placement provided "'.concat(r,'".'))}return c}function mb(i){var t={bottom:"top",top:"bottom"};return i?t[i]:"bottom"}var Vo=function(t){return t==="auto"?"bottom":t},gb=function(t){var e,n=t.placement,r=t.theme,o=r.borderRadius,s=r.spacing,a=r.colors;return e={label:"menu"},wt(e,mb(n),"100%"),wt(e,"backgroundColor",a.neutral0),wt(e,"borderRadius",o),wt(e,"boxShadow","0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)"),wt(e,"marginBottom",s.menuGutter),wt(e,"marginTop",s.menuGutter),wt(e,"position","absolute"),wt(e,"width","100%"),wt(e,"zIndex",1),e},Lc=Sn({getPortalPlacement:null}),Bc=function(i){Wi(e,i);var t=Gi(e);function e(){var n;zi(this,e);for(var r=arguments.length,o=new Array(r),s=0;si.length)&&(t=i.length);for(var e=0,n=new Array(t);e-1}};function xS(i){i.in,i.out,i.onExited,i.appear,i.enter,i.exit;var t=i.innerRef;i.emotion;var e=un(i,["in","out","onExited","appear","enter","exit","innerRef","emotion"]);return ie("input",ne({ref:t},e,{css:Bo({label:"dummyInput",background:0,border:0,fontSize:"inherit",outline:0,padding:0,width:1,color:"transparent",left:-100,opacity:0,position:"relative",transform:"scale(0)"},"","")}))}var _S=function(t){t.preventDefault(),t.stopPropagation()};function TS(i){var t=i.isEnabled,e=i.onBottomArrive,n=i.onBottomLeave,r=i.onTopArrive,o=i.onTopLeave,s=ot(!1),a=ot(!1),l=ot(0),u=ot(null),c=st(function(b,T){if(u.current!==null){var f=u.current,E=f.scrollTop,A=f.scrollHeight,C=f.clientHeight,O=u.current,D=T>0,I=A-C-E,B=!1;I>T&&s.current&&(n&&n(b),s.current=!1),D&&a.current&&(o&&o(b),a.current=!1),D&&T>I?(e&&!s.current&&e(b),O.scrollTop=A,B=!0,s.current=!0):!D&&-T>E&&(r&&!a.current&&r(b),O.scrollTop=0,B=!0,a.current=!0),B&&_S(b)}},[]),h=st(function(b){c(b,b.deltaY)},[c]),d=st(function(b){l.current=b.changedTouches[0].clientY},[]),g=st(function(b){var T=l.current-b.changedTouches[0].clientY;c(b,T)},[c]),y=st(function(b){if(!!b){var T=fb?{passive:!1}:!1;typeof b.addEventListener=="function"&&b.addEventListener("wheel",h,T),typeof b.addEventListener=="function"&&b.addEventListener("touchstart",d,T),typeof b.addEventListener=="function"&&b.addEventListener("touchmove",g,T)}},[g,d,h]),x=st(function(b){!b||(typeof b.removeEventListener=="function"&&b.removeEventListener("wheel",h,!1),typeof b.removeEventListener=="function"&&b.removeEventListener("touchstart",d,!1),typeof b.removeEventListener=="function"&&b.removeEventListener("touchmove",g,!1))},[g,d,h]);return kt(function(){if(!!t){var b=u.current;return y(b),function(){x(b)}}},[t,y,x]),function(b){u.current=b}}var Qc=["boxSizing","height","overflow","paddingRight","position"],$c={boxSizing:"border-box",overflow:"hidden",position:"relative",height:"100%"};function eh(i){i.preventDefault()}function th(i){i.stopPropagation()}function nh(){var i=this.scrollTop,t=this.scrollHeight,e=i+this.offsetHeight;i===0?this.scrollTop=1:e===t&&(this.scrollTop=i-1)}function ih(){return"ontouchstart"in window||navigator.maxTouchPoints}var rh=!!(typeof window!="undefined"&&window.document&&window.document.createElement),Vn=0,hn={capture:!1,passive:!1};function CS(i){var t=i.isEnabled,e=i.accountForScrollbars,n=e===void 0?!0:e,r=ot({}),o=ot(null),s=st(function(l){if(!!rh){var u=document.body,c=u&&u.style;if(n&&Qc.forEach(function(y){var x=c&&c[y];r.current[y]=x}),n&&Vn<1){var h=parseInt(r.current.paddingRight,10)||0,d=document.body?document.body.clientWidth:0,g=window.innerWidth-d+h||0;Object.keys($c).forEach(function(y){var x=$c[y];c&&(c[y]=x)}),c&&(c.paddingRight="".concat(g,"px"))}u&&ih()&&(u.addEventListener("touchmove",eh,hn),l&&(l.addEventListener("touchstart",nh,hn),l.addEventListener("touchmove",th,hn))),Vn+=1}},[]),a=st(function(l){if(!!rh){var u=document.body,c=u&&u.style;Vn=Math.max(Vn-1,0),n&&Vn<1&&Qc.forEach(function(h){var d=r.current[h];c&&(c[h]=d)}),u&&ih()&&(u.removeEventListener("touchmove",eh,hn),l&&(l.removeEventListener("touchstart",nh,hn),l.removeEventListener("touchmove",th,hn)))}},[]);return kt(function(){if(!!t){var l=o.current;return s(l),function(){a(l)}}},[t,s,a]),function(l){o.current=l}}var PS=function(){return document.activeElement&&document.activeElement.blur()},AS={name:"1kfdb0e",styles:"position:fixed;left:0;bottom:0;right:0;top:0"};function OS(i){var t=i.children,e=i.lockEnabled,n=i.captureEnabled,r=n===void 0?!0:n,o=i.onBottomArrive,s=i.onBottomLeave,a=i.onTopArrive,l=i.onTopLeave,u=TS({isEnabled:r,onBottomArrive:o,onBottomLeave:s,onTopArrive:a,onTopLeave:l}),c=CS({isEnabled:e}),h=function(g){u(g),c(g)};return ie(k.Fragment,null,e&&ie("div",{onClick:PS,css:AS}),t(h))}var DS=function(t){return t.label},RS=function(t){return t.label},MS=function(t){return t.value},FS=function(t){return!!t.isDisabled},kS={clearIndicator:Fb,container:_b,control:Hb,dropdownIndicator:Rb,group:Vb,groupHeading:Wb,indicatorsContainer:Ab,indicatorSeparator:Lb,input:Gb,loadingIndicator:Nb,loadingMessage:Sb,menu:gb,menuList:yb,menuPortal:Eb,multiValue:Yb,multiValueLabel:Zb,multiValueRemove:Kb,noOptionsMessage:bb,option:eS,placeholder:nS,singleValue:rS,valueContainer:Cb},LS={primary:"#2684FF",primary75:"#4C9AFF",primary50:"#B2D4FF",primary25:"#DEEBFF",danger:"#DE350B",dangerLight:"#FFBDAD",neutral0:"hsl(0, 0%, 100%)",neutral5:"hsl(0, 0%, 95%)",neutral10:"hsl(0, 0%, 90%)",neutral20:"hsl(0, 0%, 80%)",neutral30:"hsl(0, 0%, 70%)",neutral40:"hsl(0, 0%, 60%)",neutral50:"hsl(0, 0%, 50%)",neutral60:"hsl(0, 0%, 40%)",neutral70:"hsl(0, 0%, 30%)",neutral80:"hsl(0, 0%, 20%)",neutral90:"hsl(0, 0%, 10%)"},BS=4,oh=4,IS=38,NS=oh*2,HS={baseUnit:oh,controlHeight:IS,menuGutter:NS},Zo={borderRadius:BS,colors:LS,spacing:HS},zS={"aria-live":"polite",backspaceRemovesValue:!0,blurInputOnSelect:Fc(),captureMenuScroll:!Fc(),closeMenuOnSelect:!0,closeMenuOnScroll:!1,components:{},controlShouldRenderValue:!0,escapeClearsValue:!1,filterOption:ES(),formatGroupLabel:DS,getOptionLabel:RS,getOptionValue:MS,isDisabled:!1,isLoading:!1,isMulti:!1,isRtl:!1,isSearchable:!0,isOptionDisabled:FS,loadingMessage:function(){return"Loading..."},maxMenuHeight:300,minMenuHeight:140,menuIsOpen:!1,menuPlacement:"bottom",menuPosition:"absolute",menuShouldBlockScroll:!1,menuShouldScrollIntoView:!hb(),noOptionsMessage:function(){return"No options"},openMenuOnFocus:!1,openMenuOnClick:!0,options:[],pageSize:5,placeholder:"Select...",screenReaderStatus:function(t){var e=t.count;return"".concat(e," result").concat(e!==1?"s":""," available")},styles:{},tabIndex:"0",tabSelectsValue:!0};function sh(i,t,e,n){var r=hh(i,t,e),o=dh(i,t,e),s=ch(i,t),a=Ki(i,t);return{type:"option",data:t,isDisabled:r,isSelected:o,label:s,value:a,index:n}}function ah(i,t){return i.options.map(function(e,n){if(e.options){var r=e.options.map(function(s,a){return sh(i,s,t,a)}).filter(function(s){return uh(i,s)});return r.length>0?{type:"group",data:e,options:r,index:n}:void 0}var o=sh(i,e,t,n);return uh(i,o)?o:void 0}).filter(function(e){return!!e})}function lh(i){return i.reduce(function(t,e){return e.type==="group"?t.push.apply(t,Xc(e.options.map(function(n){return n.data}))):t.push(e.data),t},[])}function VS(i,t){return lh(ah(i,t))}function uh(i,t){var e=i.inputValue,n=e===void 0?"":e,r=t.data,o=t.isSelected,s=t.label,a=t.value;return(!ph(i)||!o)&&fh(i,{label:s,value:a,data:r},n)}function US(i,t){var e=i.focusedValue,n=i.selectValue,r=n.indexOf(e);if(r>-1){var o=t.indexOf(e);if(o>-1)return e;if(r-1?e:t[0]}var ch=function(t,e){return t.getOptionLabel(e)},Ki=function(t,e){return t.getOptionValue(e)};function hh(i,t,e){return typeof i.isOptionDisabled=="function"?i.isOptionDisabled(t,e):!1}function dh(i,t,e){if(e.indexOf(t)>-1)return!0;if(typeof i.isOptionSelected=="function")return i.isOptionSelected(t,e);var n=Ki(i,t);return e.some(function(r){return Ki(i,r)===n})}function fh(i,t,e){return i.filterOption?i.filterOption(t,e):!0}var ph=function(t){var e=t.hideSelectedOptions,n=t.isMulti;return e===void 0?n:e},jS=1,mh=function(i){Wi(e,i);var t=Gi(e);function e(n){var r;return zi(this,e),r=t.call(this,n),r.state={ariaSelection:null,focusedOption:null,focusedValue:null,inputIsHidden:!1,isFocused:!1,selectValue:[],clearFocusValueOnUpdate:!1,inputIsHiddenAfterUpdate:void 0,prevProps:void 0},r.blockOptionHover=!1,r.isComposing=!1,r.commonProps=void 0,r.initialTouchX=0,r.initialTouchY=0,r.instancePrefix="",r.openAfterFocus=!1,r.scrollToFocusedOptionOnUpdate=!1,r.userIsDragging=void 0,r.controlRef=null,r.getControlRef=function(o){r.controlRef=o},r.focusedOptionRef=null,r.getFocusedOptionRef=function(o){r.focusedOptionRef=o},r.menuListRef=null,r.getMenuListRef=function(o){r.menuListRef=o},r.inputRef=null,r.getInputRef=function(o){r.inputRef=o},r.focus=r.focusInput,r.blur=r.blurInput,r.onChange=function(o,s){var a=r.props,l=a.onChange,u=a.name;s.name=u,r.ariaOnChange(o,s),l(o,s)},r.setValue=function(o){var s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"set-value",a=arguments.length>2?arguments[2]:void 0,l=r.props,u=l.closeMenuOnSelect,c=l.isMulti;r.onInputChange("",{action:"set-value"}),u&&(r.setState({inputIsHiddenAfterUpdate:!c}),r.onMenuClose()),r.setState({clearFocusValueOnUpdate:!0}),r.onChange(o,{action:s,option:a})},r.selectOption=function(o){var s=r.props,a=s.blurInputOnSelect,l=s.isMulti,u=s.name,c=r.state.selectValue,h=l&&r.isOptionSelected(o,c),d=r.isOptionDisabled(o,c);if(h){var g=r.getOptionValue(o);r.setValue(c.filter(function(y){return r.getOptionValue(y)!==g}),"deselect-option",o)}else if(!d)l?r.setValue([].concat(Xc(c),[o]),"select-option",o):r.setValue(o,"select-option");else{r.ariaOnChange(o,{action:"select-option",name:u});return}a&&r.blurInput()},r.removeValue=function(o){var s=r.props.isMulti,a=r.state.selectValue,l=r.getOptionValue(o),u=a.filter(function(h){return r.getOptionValue(h)!==l}),c=s?u:u[0]||null;r.onChange(c,{action:"remove-value",removedValue:o}),r.focusInput()},r.clearValue=function(){var o=r.state.selectValue;r.onChange(r.props.isMulti?[]:null,{action:"clear",removedValues:o})},r.popValue=function(){var o=r.props.isMulti,s=r.state.selectValue,a=s[s.length-1],l=s.slice(0,s.length-1),u=o?l:l[0]||null;r.onChange(u,{action:"pop-value",removedValue:a})},r.getValue=function(){return r.state.selectValue},r.cx=function(){for(var o=arguments.length,s=new Array(o),a=0;ac||u>c}},r.onTouchEnd=function(o){r.userIsDragging||(r.controlRef&&!r.controlRef.contains(o.target)&&r.menuListRef&&!r.menuListRef.contains(o.target)&&r.blurInput(),r.initialTouchX=0,r.initialTouchY=0)},r.onControlTouchEnd=function(o){r.userIsDragging||r.onControlMouseDown(o)},r.onClearIndicatorTouchEnd=function(o){r.userIsDragging||r.onClearIndicatorMouseDown(o)},r.onDropdownIndicatorTouchEnd=function(o){r.userIsDragging||r.onDropdownIndicatorMouseDown(o)},r.handleInputChange=function(o){var s=o.currentTarget.value;r.setState({inputIsHiddenAfterUpdate:!1}),r.onInputChange(s,{action:"input-change"}),r.props.menuIsOpen||r.onMenuOpen()},r.onInputFocus=function(o){r.props.onFocus&&r.props.onFocus(o),r.setState({inputIsHiddenAfterUpdate:!1,isFocused:!0}),(r.openAfterFocus||r.props.openMenuOnFocus)&&r.openMenu("first"),r.openAfterFocus=!1},r.onInputBlur=function(o){if(r.menuListRef&&r.menuListRef.contains(document.activeElement)){r.inputRef.focus();return}r.props.onBlur&&r.props.onBlur(o),r.onInputChange("",{action:"input-blur"}),r.onMenuClose(),r.setState({focusedValue:null,isFocused:!1})},r.onOptionHover=function(o){r.blockOptionHover||r.state.focusedOption===o||r.setState({focusedOption:o})},r.shouldHideSelectedOptions=function(){return ph(r.props)},r.onKeyDown=function(o){var s=r.props,a=s.isMulti,l=s.backspaceRemovesValue,u=s.escapeClearsValue,c=s.inputValue,h=s.isClearable,d=s.isDisabled,g=s.menuIsOpen,y=s.onKeyDown,x=s.tabSelectsValue,b=s.openMenuOnFocus,T=r.state,f=T.focusedOption,E=T.focusedValue,A=T.selectValue;if(!d&&!(typeof y=="function"&&(y(o),o.defaultPrevented))){switch(r.blockOptionHover=!0,o.key){case"ArrowLeft":if(!a||c)return;r.focusValue("previous");break;case"ArrowRight":if(!a||c)return;r.focusValue("next");break;case"Delete":case"Backspace":if(c)return;if(E)r.removeValue(E);else{if(!l)return;a?r.popValue():h&&r.clearValue()}break;case"Tab":if(r.isComposing||o.shiftKey||!g||!x||!f||b&&r.isOptionSelected(f,A))return;r.selectOption(f);break;case"Enter":if(o.keyCode===229)break;if(g){if(!f||r.isComposing)return;r.selectOption(f);break}return;case"Escape":g?(r.setState({inputIsHiddenAfterUpdate:!1}),r.onInputChange("",{action:"menu-close"}),r.onMenuClose()):h&&u&&r.clearValue();break;case" ":if(c)return;if(!g){r.openMenu("first");break}if(!f)return;r.selectOption(f);break;case"ArrowUp":g?r.focusOption("up"):r.openMenu("last");break;case"ArrowDown":g?r.focusOption("down"):r.openMenu("first");break;case"PageUp":if(!g)return;r.focusOption("pageup");break;case"PageDown":if(!g)return;r.focusOption("pagedown");break;case"Home":if(!g)return;r.focusOption("first");break;case"End":if(!g)return;r.focusOption("last");break;default:return}o.preventDefault()}},r.instancePrefix="react-select-"+(r.props.instanceId||++jS),r.state.selectValue=Dc(n.value),r}return Vi(e,[{key:"componentDidMount",value:function(){this.startListeningComposition(),this.startListeningToTouch(),this.props.closeMenuOnScroll&&document&&document.addEventListener&&document.addEventListener("scroll",this.onScroll,!0),this.props.autoFocus&&this.focusInput()}},{key:"componentDidUpdate",value:function(r){var o=this.props,s=o.isDisabled,a=o.menuIsOpen,l=this.state.isFocused;(l&&!s&&r.isDisabled||l&&a&&!r.menuIsOpen)&&this.focusInput(),l&&s&&!r.isDisabled&&this.setState({isFocused:!1},this.onMenuClose),this.menuListRef&&this.focusedOptionRef&&this.scrollToFocusedOptionOnUpdate&&(ub(this.menuListRef,this.focusedOptionRef),this.scrollToFocusedOptionOnUpdate=!1)}},{key:"componentWillUnmount",value:function(){this.stopListeningComposition(),this.stopListeningToTouch(),document.removeEventListener("scroll",this.onScroll,!0)}},{key:"onMenuOpen",value:function(){this.props.onMenuOpen()}},{key:"onMenuClose",value:function(){this.onInputChange("",{action:"menu-close"}),this.props.onMenuClose()}},{key:"onInputChange",value:function(r,o){this.props.onInputChange(r,o)}},{key:"focusInput",value:function(){!this.inputRef||this.inputRef.focus()}},{key:"blurInput",value:function(){!this.inputRef||this.inputRef.blur()}},{key:"openMenu",value:function(r){var o=this,s=this.state,a=s.selectValue,l=s.isFocused,u=this.buildFocusableOptions(),c=r==="first"?0:u.length-1;if(!this.props.isMulti){var h=u.indexOf(a[0]);h>-1&&(c=h)}this.scrollToFocusedOptionOnUpdate=!(l&&this.menuListRef),this.setState({inputIsHiddenAfterUpdate:!1,focusedValue:null,focusedOption:u[c]},function(){return o.onMenuOpen()})}},{key:"focusValue",value:function(r){var o=this.state,s=o.selectValue,a=o.focusedValue;if(!!this.props.isMulti){this.setState({focusedOption:null});var l=s.indexOf(a);a||(l=-1);var u=s.length-1,c=-1;if(!!s.length){switch(r){case"previous":l===0?c=0:l===-1?c=u:c=l-1;break;case"next":l>-1&&l0&&arguments[0]!==void 0?arguments[0]:"first",o=this.props.pageSize,s=this.state.focusedOption,a=this.getFocusableOptions();if(!!a.length){var l=0,u=a.indexOf(s);s||(u=-1),r==="up"?l=u>0?u-1:a.length-1:r==="down"?l=(u+1)%a.length:r==="pageup"?(l=u-o,l<0&&(l=0)):r==="pagedown"?(l=u+o,l>a.length-1&&(l=a.length-1)):r==="last"&&(l=a.length-1),this.scrollToFocusedOptionOnUpdate=!0,this.setState({focusedOption:a[l],focusedValue:null})}}},{key:"getTheme",value:function(){return this.props.theme?typeof this.props.theme=="function"?this.props.theme(Zo):Ne(Ne({},Zo),this.props.theme):Zo}},{key:"getCommonProps",value:function(){var r=this.clearValue,o=this.cx,s=this.getStyles,a=this.getValue,l=this.selectOption,u=this.setValue,c=this.props,h=c.isMulti,d=c.isRtl,g=c.options,y=this.hasValue();return{clearValue:r,cx:o,getStyles:s,getValue:a,hasValue:y,isMulti:h,isRtl:d,options:g,selectOption:l,selectProps:c,setValue:u,theme:this.getTheme()}}},{key:"hasValue",value:function(){var r=this.state.selectValue;return r.length>0}},{key:"hasOptions",value:function(){return!!this.getFocusableOptions().length}},{key:"isClearable",value:function(){var r=this.props,o=r.isClearable,s=r.isMulti;return o===void 0?s:o}},{key:"isOptionDisabled",value:function(r,o){return hh(this.props,r,o)}},{key:"isOptionSelected",value:function(r,o){return dh(this.props,r,o)}},{key:"filterOption",value:function(r,o){return fh(this.props,r,o)}},{key:"formatOptionLabel",value:function(r,o){if(typeof this.props.formatOptionLabel=="function"){var s=this.props.inputValue,a=this.state.selectValue;return this.props.formatOptionLabel(r,{context:o,inputValue:s,selectValue:a})}else return this.getOptionLabel(r)}},{key:"formatGroupLabel",value:function(r){return this.props.formatGroupLabel(r)}},{key:"startListeningComposition",value:function(){document&&document.addEventListener&&(document.addEventListener("compositionstart",this.onCompositionStart,!1),document.addEventListener("compositionend",this.onCompositionEnd,!1))}},{key:"stopListeningComposition",value:function(){document&&document.removeEventListener&&(document.removeEventListener("compositionstart",this.onCompositionStart),document.removeEventListener("compositionend",this.onCompositionEnd))}},{key:"startListeningToTouch",value:function(){document&&document.addEventListener&&(document.addEventListener("touchstart",this.onTouchStart,!1),document.addEventListener("touchmove",this.onTouchMove,!1),document.addEventListener("touchend",this.onTouchEnd,!1))}},{key:"stopListeningToTouch",value:function(){document&&document.removeEventListener&&(document.removeEventListener("touchstart",this.onTouchStart),document.removeEventListener("touchmove",this.onTouchMove),document.removeEventListener("touchend",this.onTouchEnd))}},{key:"renderInput",value:function(){var r=this.props,o=r.isDisabled,s=r.isSearchable,a=r.inputId,l=r.inputValue,u=r.tabIndex,c=r.form,h=this.getComponents(),d=h.Input,g=this.state.inputIsHidden,y=this.commonProps,x=a||this.getElementId("input"),b={"aria-autocomplete":"list","aria-label":this.props["aria-label"],"aria-labelledby":this.props["aria-labelledby"]};return s?k.createElement(d,ne({},y,{autoCapitalize:"none",autoComplete:"off",autoCorrect:"off",id:x,innerRef:this.getInputRef,isDisabled:o,isHidden:g,onBlur:this.onInputBlur,onChange:this.handleInputChange,onFocus:this.onInputFocus,spellCheck:"false",tabIndex:u,form:c,type:"text",value:l},b)):k.createElement(xS,ne({id:x,innerRef:this.getInputRef,onBlur:this.onInputBlur,onChange:qi,onFocus:this.onInputFocus,readOnly:!0,disabled:o,tabIndex:u,form:c,value:""},b))}},{key:"renderPlaceholderOrValue",value:function(){var r=this,o=this.getComponents(),s=o.MultiValue,a=o.MultiValueContainer,l=o.MultiValueLabel,u=o.MultiValueRemove,c=o.SingleValue,h=o.Placeholder,d=this.commonProps,g=this.props,y=g.controlShouldRenderValue,x=g.isDisabled,b=g.isMulti,T=g.inputValue,f=g.placeholder,E=this.state,A=E.selectValue,C=E.focusedValue,O=E.isFocused;if(!this.hasValue()||!y)return T?null:k.createElement(h,ne({},d,{key:"placeholder",isDisabled:x,isFocused:O}),f);if(b){var D=A.map(function(B,Z){var Y=B===C;return k.createElement(s,ne({},d,{components:{Container:a,Label:l,Remove:u},isFocused:Y,isDisabled:x,key:"".concat(r.getOptionValue(B)).concat(Z),index:Z,removeProps:{onClick:function(){return r.removeValue(B)},onTouchEnd:function(){return r.removeValue(B)},onMouseDown:function(K){K.preventDefault(),K.stopPropagation()}},data:B}),r.formatOptionLabel(B,"value"))});return D}if(T)return null;var I=A[0];return k.createElement(c,ne({},d,{data:I,isDisabled:x}),this.formatOptionLabel(I,"value"))}},{key:"renderClearIndicator",value:function(){var r=this.getComponents(),o=r.ClearIndicator,s=this.commonProps,a=this.props,l=a.isDisabled,u=a.isLoading,c=this.state.isFocused;if(!this.isClearable()||!o||l||!this.hasValue()||u)return null;var h={onMouseDown:this.onClearIndicatorMouseDown,onTouchEnd:this.onClearIndicatorTouchEnd,"aria-hidden":"true"};return k.createElement(o,ne({},s,{innerProps:h,isFocused:c}))}},{key:"renderLoadingIndicator",value:function(){var r=this.getComponents(),o=r.LoadingIndicator,s=this.commonProps,a=this.props,l=a.isDisabled,u=a.isLoading,c=this.state.isFocused;if(!o||!u)return null;var h={"aria-hidden":"true"};return k.createElement(o,ne({},s,{innerProps:h,isDisabled:l,isFocused:c}))}},{key:"renderIndicatorSeparator",value:function(){var r=this.getComponents(),o=r.DropdownIndicator,s=r.IndicatorSeparator;if(!o||!s)return null;var a=this.commonProps,l=this.props.isDisabled,u=this.state.isFocused;return k.createElement(s,ne({},a,{isDisabled:l,isFocused:u}))}},{key:"renderDropdownIndicator",value:function(){var r=this.getComponents(),o=r.DropdownIndicator;if(!o)return null;var s=this.commonProps,a=this.props.isDisabled,l=this.state.isFocused,u={onMouseDown:this.onDropdownIndicatorMouseDown,onTouchEnd:this.onDropdownIndicatorTouchEnd,"aria-hidden":"true"};return k.createElement(o,ne({},s,{innerProps:u,isDisabled:a,isFocused:l}))}},{key:"renderMenu",value:function(){var r=this,o=this.getComponents(),s=o.Group,a=o.GroupHeading,l=o.Menu,u=o.MenuList,c=o.MenuPortal,h=o.LoadingMessage,d=o.NoOptionsMessage,g=o.Option,y=this.commonProps,x=this.state.focusedOption,b=this.props,T=b.captureMenuScroll,f=b.inputValue,E=b.isLoading,A=b.loadingMessage,C=b.minMenuHeight,O=b.maxMenuHeight,D=b.menuIsOpen,I=b.menuPlacement,B=b.menuPosition,Z=b.menuPortalTarget,Y=b.menuShouldBlockScroll,V=b.menuShouldScrollIntoView,K=b.noOptionsMessage,Q=b.onMenuScrollToTop,le=b.onMenuScrollToBottom;if(!D)return null;var re=function(H,U){var W=H.type,j=H.data,$=H.isDisabled,ae=H.isSelected,we=H.label,me=H.value,Qe=x===j,$e=$?void 0:function(){return r.onOptionHover(j)},et=$?void 0:function(){return r.selectOption(j)},p="".concat(r.getElementId("option"),"-").concat(U),_={id:p,onClick:et,onMouseMove:$e,onMouseOver:$e,tabIndex:-1};return k.createElement(g,ne({},y,{innerProps:_,data:j,isDisabled:$,isSelected:ae,key:p,label:we,type:W,value:me,isFocused:Qe,innerRef:Qe?r.getFocusedOptionRef:void 0}),r.formatOptionLabel(H.data,"menu"))},se;if(this.hasOptions())se=this.getCategorizedOptions().map(function(F){if(F.type==="group"){var H=F.data,U=F.options,W=F.index,j="".concat(r.getElementId("group"),"-").concat(W),$="".concat(j,"-heading");return k.createElement(s,ne({},y,{key:j,data:H,options:U,Heading:a,headingProps:{id:$,data:F.data},label:r.formatGroupLabel(F.data)}),F.options.map(function(ae){return re(ae,"".concat(W,"-").concat(ae.index))}))}else if(F.type==="option")return re(F,"".concat(F.index))});else if(E){var de=A({inputValue:f});if(de===null)return null;se=k.createElement(h,y,de)}else{var pe=K({inputValue:f});if(pe===null)return null;se=k.createElement(d,y,pe)}var G={minMenuHeight:C,maxMenuHeight:O,menuPlacement:I,menuPosition:B,menuShouldScrollIntoView:V},Me=k.createElement(Bc,ne({},y,G),function(F){var H=F.ref,U=F.placerProps,W=U.placement,j=U.maxHeight;return k.createElement(l,ne({},y,G,{innerRef:H,innerProps:{onMouseDown:r.onMenuMouseDown,onMouseMove:r.onMenuMouseMove},isLoading:E,placement:W}),k.createElement(OS,{captureEnabled:T,onTopArrive:Q,onBottomArrive:le,lockEnabled:Y},function($){return k.createElement(u,ne({},y,{innerRef:function(we){r.getMenuListRef(we),$(we)},isLoading:E,maxHeight:j,focusedOption:x}),se)}))});return Z||B==="fixed"?k.createElement(c,ne({},y,{appendTo:Z,controlElement:this.controlRef,menuPlacement:I,menuPosition:B}),Me):Me}},{key:"renderFormField",value:function(){var r=this,o=this.props,s=o.delimiter,a=o.isDisabled,l=o.isMulti,u=o.name,c=this.state.selectValue;if(!(!u||a))if(l)if(s){var h=c.map(function(y){return r.getOptionValue(y)}).join(s);return k.createElement("input",{name:u,type:"hidden",value:h})}else{var d=c.length>0?c.map(function(y,x){return k.createElement("input",{key:"i-".concat(x),name:u,type:"hidden",value:r.getOptionValue(y)})}):k.createElement("input",{name:u,type:"hidden"});return k.createElement("div",null,d)}else{var g=c[0]?this.getOptionValue(c[0]):"";return k.createElement("input",{name:u,type:"hidden",value:g})}}},{key:"renderLiveRegion",value:function(){var r=this.commonProps,o=this.state,s=o.ariaSelection,a=o.focusedOption,l=o.focusedValue,u=o.isFocused,c=o.selectValue,h=this.getFocusableOptions();return k.createElement(yS,ne({},r,{ariaSelection:s,focusedOption:a,focusedValue:l,isFocused:u,selectValue:c,focusableOptions:h}))}},{key:"render",value:function(){var r=this.getComponents(),o=r.Control,s=r.IndicatorsContainer,a=r.SelectContainer,l=r.ValueContainer,u=this.props,c=u.className,h=u.id,d=u.isDisabled,g=u.menuIsOpen,y=this.state.isFocused,x=this.commonProps=this.getCommonProps();return k.createElement(a,ne({},x,{className:c,innerProps:{id:h,onKeyDown:this.onKeyDown},isDisabled:d,isFocused:y}),this.renderLiveRegion(),k.createElement(o,ne({},x,{innerRef:this.getControlRef,innerProps:{onMouseDown:this.onControlMouseDown,onTouchEnd:this.onControlTouchEnd},isDisabled:d,isFocused:y,menuIsOpen:g}),k.createElement(l,ne({},x,{isDisabled:d}),this.renderPlaceholderOrValue(),this.renderInput()),k.createElement(s,ne({},x,{isDisabled:d}),this.renderClearIndicator(),this.renderLoadingIndicator(),this.renderIndicatorSeparator(),this.renderDropdownIndicator())),this.renderMenu(),this.renderFormField())}}],[{key:"getDerivedStateFromProps",value:function(r,o){var s=o.prevProps,a=o.clearFocusValueOnUpdate,l=o.inputIsHiddenAfterUpdate,u=r.options,c=r.value,h=r.menuIsOpen,d=r.inputValue,g={};if(s&&(c!==s.value||u!==s.options||h!==s.menuIsOpen||d!==s.inputValue)){var y=Dc(c),x=h?VS(r,y):[],b=a?US(o,y):null,T=WS(o,x);g={selectValue:y,focusedOption:T,focusedValue:b,clearFocusValueOnUpdate:!1}}var f=l!=null&&r!==s?{inputIsHidden:l,inputIsHiddenAfterUpdate:void 0}:{};return Ne(Ne(Ne({},g),f),{},{prevProps:r})}}]),e}(Pe);mh.defaultProps=zS;var GS={defaultInputValue:"",defaultMenuIsOpen:!1,defaultValue:null},qS=function(t){var e,n;return n=e=function(r){Wi(s,r);var o=Gi(s);function s(){var a;zi(this,s);for(var l=arguments.length,u=new Array(l),c=0;c1?c-1:0),d=1;d{const t=i.content?Ko.find(e=>e.value===i.content):null;return k.createElement("div",{className:"r6o-purposedropdown"},k.createElement(YS,{value:t,onChange:i.onChange,options:Ko,isDisabled:!i.editable}))};const ZS=i=>k.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1000 940",width:i.width},k.createElement("metadata",null,"IcoFont Icons"),k.createElement("title",null,"simple-down"),k.createElement("glyph",{glyphName:"simple-down",unicode:"\uEAB2",horizAdvX:"1000"}),k.createElement("path",{fill:"currentColor",d:"M200 392.6l300 300 300-300-85.10000000000002-85.10000000000002-214.89999999999998 214.79999999999995-214.89999999999998-214.89999999999998-85.10000000000002 85.20000000000005z"})),KS=i=>k.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"180 150 700 800",width:i.width},k.createElement("metadata",null,"IcoFont Icons"),k.createElement("title",null,"close"),k.createElement("glyph",{glyphName:"close",unicode:"\uEEE4",horizAdvX:"1000"}),k.createElement("path",{fill:"currentColor",d:"M709.8 206.6c-64.39999999999998 65.50000000000003-128.89999999999998 131.20000000000002-194.19999999999993 197.6-8.600000000000023 8.699999999999989-22.400000000000034 8.800000000000011-31 0-65-66-129.70000000000005-131.8-194.5-197.6-8.600000000000023-8.699999999999989-22.400000000000034-8.599999999999994-30.900000000000034 0.09999999999999432-15.699999999999989 16.200000000000017-31.099999999999994 32.30000000000001-47.099999999999994 48.80000000000001-8.5 8.800000000000011-8.299999999999983 23 0.20000000000001705 31.69999999999999 63.099999999999966 64.19999999999999 127.89999999999998 130.10000000000002 193.59999999999997 197 8.600000000000023 8.699999999999989 8.5 22.80000000000001 0 31.599999999999966-65.19999999999999 66.40000000000009-130.2 132.5-194.7 198.10000000000002-8.5 8.700000000000045-8.5 22.800000000000068 0.20000000000001705 31.399999999999977l47.79999999999998 47.90000000000009c8.600000000000023 8.599999999999909 22.600000000000023 8.599999999999909 31.100000000000023-0.10000000000002274l194.2-197.30000000000007c8.600000000000023-8.699999999999932 22.399999999999977-8.699999999999932 31 0 64.70000000000005 65.80000000000007 129.20000000000005 131.4000000000001 194.20000000000005 197.5 8.599999999999909 8.700000000000045 22.5 8.800000000000068 31 0.10000000000002274 16-16.199999999999932 31.699999999999932-32.19999999999993 47.59999999999991-48.299999999999955 8.600000000000023-8.700000000000045 8.600000000000023-22.899999999999977 0.10000000000002274-31.600000000000023-63.799999999999955-65-128.5-130.89999999999998-194.19999999999993-197.79999999999995-8.600000000000023-8.700000000000045-8.600000000000023-22.900000000000034 0-31.600000000000023 65.19999999999993-66.40000000000003 130.0999999999999-132.5 194.5-198.20000000000005 8.599999999999909-8.699999999999989 8.5-22.799999999999955-0.10000000000002274-31.49999999999997l-47.80000000000007-48.099999999999994c-8.5-8.5-22.399999999999977-8.400000000000006-31 0.29999999999998295z"})),JS=i=>k.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:i.width},k.createElement("path",{fill:"currentColor",d:"M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z"}));var QS=i=>{const[t,e]=mt(!1),[n,r]=mt(!1),o=h=>{e(!0),r(!1)},s=h=>{i.onDelete(i.body),r(!1)},a=h=>i.onUpdate(i.body,{...i.body,value:h.target.value}),l=h=>i.onUpdate(i.body,{...i.body,purpose:h.value}),u=i.body.modified||i.body.created,c=i.body.creator&&k.createElement("div",{className:"r6o-lastmodified"},k.createElement("span",{className:"r6o-lastmodified-by"},i.body.creator.name||i.body.creator.id),i.body.created&&k.createElement("span",{className:"r6o-lastmodified-at"},k.createElement(Bf,{datetime:i.env.toClientTime(u),locale:Ze.locale()})));return i.readOnly?k.createElement("div",{className:"r6o-widget comment"},k.createElement("div",{className:"r6o-readonly-comment"},i.body.value),c):k.createElement("div",{className:t?"r6o-widget comment editable":"r6o-widget comment"},k.createElement(Yu,{editable:t,content:i.body.value,onChange:a,onSaveAndClose:i.onSaveAndClose}),!t&&c,i.purposeSelector&&k.createElement(gh,{editable:t,content:i.body.purpose,onChange:l,onSaveAndClose:i.onSaveAndClose}),k.createElement("div",{className:n?"r6o-icon r6o-arrow-down r6o-menu-open":"r6o-icon r6o-arrow-down",onClick:()=>r(!n)},k.createElement(ZS,{width:12})),n&&k.createElement(k0,{onEdit:o,onDelete:s,onClickOutside:()=>r(!1)}))};const $S=Ko.map(i=>i.value),vh=(i,t)=>{const e=t?$S.indexOf(i.purpose)>-1:i.purpose=="commenting"||i.purpose=="replying";return i.type==="TextualBody"&&(!Object.prototype.hasOwnProperty.call(i,"purpose")||e)},yh=(i,t)=>{var e,n;if(t.editable===!0)return!1;if(t.editable===!1)return!0;if(t.editable==="MINE_ONLY"){const r=(e=i.creator)==null?void 0:e.id;return((n=t.env.user)==null?void 0:n.id)!==r}return t.readOnly},eE=(i,t)=>i||{type:"TextualBody",value:"",purpose:t?"replying":"commenting",draft:!0},wh=i=>{const t=i.annotation?i.annotation.bodies.filter(l=>vh(l,i.purposeSelector)):[],e=eE(t.find(l=>l.draft==!0),t.length>1),n=t.filter(l=>l!=e),r=l=>{const u=e.value,c=l.target.value;u.length===0&&c.length>0?i.onAppendBody({...e,value:c}):u.length>0&&c.length===0?i.onRemoveBody(e):i.onUpdateBody(e,{...e,value:c})},o=l=>i.onUpdateBody(e,{...e,purpose:l.value}),s=!i.readOnly&&i.annotation,a=n.length===0||!i.disableReply;return k.createElement(k.Fragment,null,n.map((l,u)=>k.createElement(QS,{key:u,env:i.env,purposeSelector:i.purposeSelector,readOnly:yh(l,i),body:l,onUpdate:i.onUpdateBody,onDelete:i.onRemoveBody,onSaveAndClose:i.onSaveAndClose})),s&&a&&k.createElement("div",{className:"r6o-widget comment editable"},k.createElement(Yu,{focus:i.focus,content:e.value,editable:!0,placeholder:n.length>0?Ze.t("Add a reply..."):i.textPlaceHolder||Ze.t("Add a comment..."),onChange:r,onSaveAndClose:()=>i.onSaveAndClose()}),i.purposeSelector&&e.value.length>0&&k.createElement(gh,{editable:!0,content:e.purpose,onChange:o,onSaveAndClose:()=>i.onSaveAndClose()})))};wh.disableDelete=(i,t)=>i.bodies.filter(n=>vh(n,t.purposeSelector)).some(n=>yh(n,t));var bh=wh;function Sh(i,t){i.prototype=Object.create(t.prototype),i.prototype.constructor=i,Ui(i,t)}function tE(i,t){return i.classList?!!t&&i.classList.contains(t):(" "+(i.className.baseVal||i.className)+" ").indexOf(" "+t+" ")!==-1}function nE(i,t){i.classList?i.classList.add(t):tE(i,t)||(typeof i.className=="string"?i.className=i.className+" "+t:i.setAttribute("class",(i.className&&i.className.baseVal||"")+" "+t))}function Eh(i,t){return i.replace(new RegExp("(^|\\s)"+t+"(?:\\s|$)","g"),"$1").replace(/\s+/g," ").replace(/^\s*|\s*$/g,"")}function iE(i,t){i.classList?i.classList.remove(t):typeof i.className=="string"?i.className=Eh(i.className,t):i.setAttribute("class",Eh(i.className&&i.className.baseVal||"",t))}var xh={disabled:!1},_h=k.createContext(null),Th=function(t){return t.scrollTop},Un="unmounted",Vt="exited",Ut="entering",dn="entered",Jo="exiting",bt=function(i){Sh(t,i);function t(n,r){var o;o=i.call(this,n,r)||this;var s=r,a=s&&!s.isMounting?n.enter:n.appear,l;return o.appearStatus=null,n.in?a?(l=Vt,o.appearStatus=Ut):l=dn:n.unmountOnExit||n.mountOnEnter?l=Un:l=Vt,o.state={status:l},o.nextCallback=null,o}t.getDerivedStateFromProps=function(r,o){var s=r.in;return s&&o.status===Un?{status:Vt}:null};var e=t.prototype;return e.componentDidMount=function(){this.updateStatus(!0,this.appearStatus)},e.componentDidUpdate=function(r){var o=null;if(r!==this.props){var s=this.state.status;this.props.in?s!==Ut&&s!==dn&&(o=Ut):(s===Ut||s===dn)&&(o=Jo)}this.updateStatus(!1,o)},e.componentWillUnmount=function(){this.cancelNextCallback()},e.getTimeouts=function(){var r=this.props.timeout,o,s,a;return o=s=a=r,r!=null&&typeof r!="number"&&(o=r.exit,s=r.enter,a=r.appear!==void 0?r.appear:s),{exit:o,enter:s,appear:a}},e.updateStatus=function(r,o){if(r===void 0&&(r=!1),o!==null)if(this.cancelNextCallback(),o===Ut){if(this.props.unmountOnExit||this.props.mountOnEnter){var s=this.props.nodeRef?this.props.nodeRef.current:k.findDOMNode(this);s&&Th(s)}this.performEnter(r)}else this.performExit();else this.props.unmountOnExit&&this.state.status===Vt&&this.setState({status:Un})},e.performEnter=function(r){var o=this,s=this.props.enter,a=this.context?this.context.isMounting:r,l=this.props.nodeRef?[a]:[k.findDOMNode(this),a],u=l[0],c=l[1],h=this.getTimeouts(),d=a?h.appear:h.enter;if(!r&&!s||xh.disabled){this.safeSetState({status:dn},function(){o.props.onEntered(u)});return}this.props.onEnter(u,c),this.safeSetState({status:Ut},function(){o.props.onEntering(u,c),o.onTransitionEnd(d,function(){o.safeSetState({status:dn},function(){o.props.onEntered(u,c)})})})},e.performExit=function(){var r=this,o=this.props.exit,s=this.getTimeouts(),a=this.props.nodeRef?void 0:k.findDOMNode(this);if(!o||xh.disabled){this.safeSetState({status:Vt},function(){r.props.onExited(a)});return}this.props.onExit(a),this.safeSetState({status:Jo},function(){r.props.onExiting(a),r.onTransitionEnd(s.exit,function(){r.safeSetState({status:Vt},function(){r.props.onExited(a)})})})},e.cancelNextCallback=function(){this.nextCallback!==null&&(this.nextCallback.cancel(),this.nextCallback=null)},e.safeSetState=function(r,o){o=this.setNextCallback(o),this.setState(r,o)},e.setNextCallback=function(r){var o=this,s=!0;return this.nextCallback=function(a){s&&(s=!1,o.nextCallback=null,r(a))},this.nextCallback.cancel=function(){s=!1},this.nextCallback},e.onTransitionEnd=function(r,o){this.setNextCallback(o);var s=this.props.nodeRef?this.props.nodeRef.current:k.findDOMNode(this),a=r==null&&!this.props.addEndListener;if(!s||a){setTimeout(this.nextCallback,0);return}if(this.props.addEndListener){var l=this.props.nodeRef?[this.nextCallback]:[s,this.nextCallback],u=l[0],c=l[1];this.props.addEndListener(u,c)}r!=null&&setTimeout(this.nextCallback,r)},e.render=function(){var r=this.state.status;if(r===Un)return null;var o=this.props,s=o.children;o.in,o.mountOnEnter,o.unmountOnExit,o.appear,o.enter,o.exit,o.timeout,o.addEndListener,o.onEnter,o.onEntering,o.onEntered,o.onExit,o.onExiting,o.onExited,o.nodeRef;var a=Io(o,["children","in","mountOnEnter","unmountOnExit","appear","enter","exit","timeout","addEndListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","nodeRef"]);return k.createElement(_h.Provider,{value:null},typeof s=="function"?s(r,a):k.cloneElement(k.Children.only(s),a))},t}(k.Component);bt.contextType=_h,bt.propTypes={};function fn(){}bt.defaultProps={in:!1,mountOnEnter:!1,unmountOnExit:!1,appear:!1,enter:!0,exit:!0,onEnter:fn,onEntering:fn,onEntered:fn,onExit:fn,onExiting:fn,onExited:fn},bt.UNMOUNTED=Un,bt.EXITED=Vt,bt.ENTERING=Ut,bt.ENTERED=dn,bt.EXITING=Jo;var rE=bt,oE=function(t,e){return t&&e&&e.split(" ").forEach(function(n){return nE(t,n)})},Qo=function(t,e){return t&&e&&e.split(" ").forEach(function(n){return iE(t,n)})},$o=function(i){Sh(t,i);function t(){for(var n,r=arguments.length,o=new Array(r),s=0;st.filter(e=>(e.label?e.label:e).toLowerCase().startsWith(i.toLowerCase())),lE=(i,t)=>t(i);var uE=i=>{const t=ot(),[e,n]=mt(i.initialValue||""),[r,o]=mt([]),[s,a]=mt(null);kt(()=>{i.focus&&t.current.querySelector("input").focus({preventScroll:!0})},[]),kt(()=>{i.onChange&&i.onChange(e)},[e]);const l=d=>{if(typeof i.vocabulary=="function"){const g=lE(d,i.vocabulary);g.then?g.then(o):o(g)}else{const g=aE(d,i.vocabulary);o(g)}},u=()=>{if(s!==null)i.onSubmit(r[s]);else{const d=e.trim();if(d){const g=Array.isArray(i.vocabulary)?i.vocabulary.find(y=>(y.label||y).toLowerCase()===d.toLowerCase()):null;g?i.onSubmit(g):i.onSubmit(d)}}n(""),o([]),a(null)},c=d=>{if(d.which===13)u();else if(d.which===27)i.onCancel&&i.onCancel();else if(r.length>0){if(d.which===38)if(s===null)a(0);else{const g=Math.max(0,s-1);a(g)}else if(d.which===40)if(s===null)a(0);else{const g=Math.min(r.length-1,s+1);a(g)}}else d.which===40&&Array.isArray(i.vocabulary)&&o(i.vocabulary)},h=d=>{const{value:g}=d.target;n(g),a(null),g?l(g):o([])};return k.createElement("div",{ref:t,className:"r6o-autocomplete"},k.createElement("div",null,k.createElement("input",{onKeyDown:c,onChange:h,value:e,placeholder:i.placeholder})),k.createElement("ul",null,r.length>0&&r.map((d,g)=>k.createElement("li",{key:`${d.label?d.label:d}${g}`,onClick:u,onMouseEnter:()=>a(g),style:s===g?{backgroundColor:"#bde4ff"}:{}},d.label?d.label:d))))};const cE=i=>i||{type:"TextualBody",value:"",purpose:"tagging",draft:!0};var Ch=i=>{const t=i.annotation?i.annotation.bodies.filter(h=>h.purpose==="tagging"):[],e=cE(t.slice().reverse().find(h=>h.draft)),n=t.filter(h=>h!=e),[r,o]=mt(!1),s=h=>d=>{o(r===h?!1:h)},a=h=>{const d=e.value.trim(),g=h.trim();d.length===0&&g.length>0?i.onAppendBody({...e,value:g}):d.length>0&&g.length===0?i.onRemoveBody(e):d!==g&&i.onUpdateBody(e,{...e,value:g})},l=h=>d=>{d.stopPropagation(),i.onRemoveBody(h)},u=h=>{const d=h.uri?{type:"SpecificResource",purpose:"tagging",source:{id:h.uri,label:h.label}}:{type:"TextualBody",purpose:"tagging",value:h.label||h};e.value.trim().length===0?i.onAppendBody(d):i.onUpdateBody(e,d)},c=h=>h.value||h.source.label;return k.createElement("div",{className:"r6o-widget r6o-tag"},n.length>0&&k.createElement("ul",{className:"r6o-taglist"},n.map(h=>k.createElement("li",{key:c(h),onClick:s(h)},k.createElement("span",{className:"r6o-label"},c(h)),!i.readOnly&&k.createElement(sE,{in:r===h,timeout:200,classNames:"r6o-delete"},k.createElement("span",{className:"r6o-delete-wrapper",onClick:l(h)},k.createElement("span",{className:"r6o-delete"},k.createElement(KS,{width:12}))))))),!i.readOnly&&k.createElement(uE,{focus:i.focus,placeholder:i.textPlaceHolder||Ze.t("Add tag..."),vocabulary:i.vocabulary||[],onChange:a,onSubmit:u}))};class Ph extends Pe{constructor(t){super(t),this.element=k.createRef()}renderWidget(t){const e=this.props.widget({annotation:t.annotation,readOnly:t.readOnly,...t.config,onAppendBody:(n,r)=>t.onAppendBody(n,r),onUpdateBody:(n,r,o)=>t.onUpdateBody(n,r,o),onUpsertBody:(n,r,o)=>t.onUpsertBody(n,r,o),onRemoveBody:(n,r)=>t.onRemoveBody(n,r),onBatchModify:(n,r)=>t.onBatchModify(n,r),onSetProperty:(n,r)=>t.onSetProperty(n,r),onAddContext:n=>t.onAddContext(n),onSaveAndClose:()=>t.onSaveAndClose()});for(;this.element.current.firstChild;)this.element.current.removeChild(this.element.current.lastChild);this.element.current.appendChild(e)}componentDidMount(){this.renderWidget(this.props)}componentWillReceiveProps(t){this.element.current&&this.props.annotation!==t.annotation&&this.renderWidget(t)}render(){return k.createElement("div",{ref:this.element,className:"widget"})}}window.React=k,window.ReactDOM=k;const hE={COMMENT:bh,TAG:Ch},dE=[k.createElement(bh,null),k.createElement(Ch,null)],fE=i=>{const t=n=>{var r;return typeof n=="function"&&!!((r=n.prototype)!=null&&r.isReactComponent)},e=n=>typeof n=="function"&&(String(n).match(/return .+\(['|"].+['|"],\s*\{/g)||String(n).match(/return .+preact_compat/)||String(n).match(/return .+\.createElement/g));return t(i)||e(i)},pE=i=>{const t=(e,n,r)=>{if(typeof e=="string"||e instanceof String)return k.createElement(hE[e],n);if((r==null?void 0:r.toLowerCase())==="react")return k.createElement(e,n);if((r==null?void 0:r.toLowerCase())==="plainjs")return k.createElement(Ph,{widget:e,config:n});if(fE(e))return k.createElement(e,n);if(typeof e=="function"||e instanceof Function)return k.createElement(Ph,{widget:e,config:n});throw`${e} is not a valid plugin`};if(i.widget){const{widget:e,force:n,...r}=i;return t(e,r,n)}else return t(i)},Ah=14;var Oh=(i,t,e,n)=>{const r=i.getBoundingClientRect();t.className="r6o-editor r6o-arrow-top r6o-arrow-left";const{left:o,top:s,right:a,bottom:l}=e.getBoundingClientRect();if(t.style.top=`${l-r.top+Ah}px`,t.style.left=`${o-r.left}px`,n){const u=t.children[1].getBoundingClientRect(),{innerWidth:c,innerHeight:h}=i.ownerDocument.defaultView;if(u.right>c&&(t.classList.remove("r6o-arrow-left"),t.classList.add("r6o-arrow-right"),t.style.left=`${a-u.width-r.left}px`),u.bottom>h){t.classList.remove("r6o-arrow-top"),t.classList.add("r6o-arrow-bottom");const g=t.children[1].getBoundingClientRect().height;t.style.top=`${s-r.top-g-Ah}px`}const d=t.children[1].getBoundingClientRect();if(d.top<0){t.classList.add("pushed","down"),t.style.top=`${-r.top}px`;const g=l-r.top;d.height-r.top>g&&t.classList.remove("r6o-arrow-bottom")}d.left<0&&(t.classList.add("pushed","right"),t.style.left=`${-r.left}px`),requestAnimationFrame(()=>t.style.opacity=1)}};const Dh=i=>{const{top:t,left:e,width:n,height:r}=i.getBoundingClientRect();return`${t}, ${e}, ${n}, ${r}`};class mE extends Pe{constructor(e){super(e);P(this,"initResizeObserver",()=>{const e=this.props.autoPosition===void 0?!0:this.props.autoPosition;if(window!=null&&window.ResizeObserver){const n=new ResizeObserver(()=>{this.state.dragged||Oh(this.props.wrapperEl,this.element.current,this.props.selectedElement,e)});return n.observe(this.props.wrapperEl),()=>n.disconnect()}else this.state.dragged||Oh(this.props.wrapperEl,this.element.current,this.props.selectedElement,e)});P(this,"creationMeta",e=>{const n={},{user:r}=this.props.env;return r&&(n.creator={},r.id&&(n.creator.id=r.id),r.displayName&&(n.creator.name=r.displayName),n[e.created?"modified":"created"]=this.props.env.getCurrentTimeAdjusted()),n});P(this,"getCurrentAnnotation",()=>this.state.currentAnnotation.clone());P(this,"hasChanges",()=>{var e;return!((e=this.props.annotation)!=null&&e.isEqual(this.state.currentAnnotation))});P(this,"updateCurrentAnnotation",(e,n)=>{this.setState({currentAnnotation:this.state.currentAnnotation.clone(e)},()=>{n?this.onOk():this.props.onChanged&&this.props.onChanged()})});P(this,"onAppendBody",(e,n)=>this.updateCurrentAnnotation({body:[...this.state.currentAnnotation.bodies,{...e,...this.creationMeta(e)}]},n));P(this,"onUpdateBody",(e,n,r)=>this.updateCurrentAnnotation({body:this.state.currentAnnotation.bodies.map(o=>o===e?{...n,...this.creationMeta(n)}:o)},r));P(this,"onRemoveBody",(e,n)=>this.updateCurrentAnnotation({body:this.state.currentAnnotation.bodies.filter(r=>r!==e)},n));P(this,"onUpsertBody",(e,n,r)=>{if(e==null&&n!=null)this.onAppendBody(n,r);else if(e!=null&&n!=null)this.onUpdateBody(e,n,r);else if(e!=null&&n==null){const o=this.state.currentAnnotation.bodies.find(s=>s.purpose===e.purpose);o?this.onUpdateBody(o,e,r):this.onAppendBody(e,r)}});P(this,"onBatchModify",(e,n)=>{const r=e.filter(u=>u.action==="upsert"&&u.body).map(u=>({previous:this.state.currentAnnotation.bodies.find(c=>c.purpose===u.body.purpose),updated:{...u.body,...this.creationMeta(u.body)}})),o=e.filter(u=>u.action==="remove").map(u=>u.body),s=[...e.filter(u=>u.action==="append"||u.action==="upsert"&&u.updated&&!u.previous).map(u=>({...u.body,...this.creationMeta(u.body)})),...r.filter(u=>!u.previous).map(u=>u.updated)],a=[...e.filter(u=>u.action==="update"||u.action==="upsert"&&u.updated&&u.previous).map(u=>({previous:u.previous,updated:{...u.updated,...this.creationMeta(u.updated)}})),...r.filter(u=>u.previous)],l=[...this.state.currentAnnotation.bodies.filter(u=>!o.includes(u)).map(u=>{const c=a.find(h=>h.previous===u);return c?c.updated:u}),...s];this.updateCurrentAnnotation({body:l},n)});P(this,"onSetProperty",(e,n)=>{if(["@context","id","type","body","target"].includes(e))throw new Exception(`Cannot set ${e} - not allowed`);if(n)this.updateCurrentAnnotation({[e]:n});else{const o=this.currentAnnotation.clone();delete o[e],this.setState({currentAnnotation:o})}});P(this,"onAddContext",e=>{const{currentAnnotation:n}=this.state,r=Array.isArray(n.context)?n.context:[n.context];r.indexOf(e)<0&&(r.push(e),this.updateCurrentAnnotation({"@context":r}))});P(this,"onCancel",()=>this.props.onCancel(this.props.annotation));P(this,"onOk",()=>{const e=r=>r.clone({body:r.bodies.map(({draft:o,...s})=>s)}),{currentAnnotation:n}=this.state;n.bodies.length===0&&!this.props.allowEmpty?n.isSelection?this.onCancel():this.props.onAnnotationDeleted(this.props.annotation):n.isSelection?this.props.onAnnotationCreated(e(n).toAnnotation()):this.props.onAnnotationUpdated(e(n),this.props.annotation)});P(this,"onDelete",()=>this.props.onAnnotationDeleted(this.props.annotation));this.element=k.createRef(),this.state={currentAnnotation:e.annotation,dragged:!1,selectionBounds:Dh(e.selectedElement)}}componentWillReceiveProps(e){var o;const{selectionBounds:n}=this.state,r=Dh(e.selectedElement);(o=this.props.annotation)!=null&&o.isEqual(e.annotation)?this.setState({selectionBounds:r}):this.setState({currentAnnotation:e.annotation,selectionBounds:r}),this.props.modifiedTarget!=e.modifiedTarget&&this.state.currentAnnotation&&this.updateCurrentAnnotation({target:this.props.modifiedTarget}),n!=r&&this.element.current&&(this.removeObserver&&this.removeObserver(),this.removeObserver=this.initResizeObserver())}componentDidMount(){this.removeObserver=this.initResizeObserver(),new MutationObserver(()=>{this.element.current&&(this.removeObserver&&this.removeObserver(),this.removeObserver=this.initResizeObserver())}).observe(this.element.current,{childList:!0,subtree:!0})}componentWillUnmount(){this.removeObserver&&this.removeObserver()}render(){const{currentAnnotation:e}=this.state,n=this.props.widgets?this.props.widgets.map(pE):dE,r=s=>s.type.disableDelete?s.type.disableDelete(e,{...s.props,readOnly:this.props.readOnly,env:this.props.env}):!1,o=e&&(e.bodies.length>0||this.props.allowEmpty)&&!this.props.readOnly&&!e.isSelection&&!n.some(r);return k.createElement(xf,{disabled:!this.props.detachable,handle:".r6o-draggable",cancel:".r6o-btn, .r6o-btn *",onDrag:()=>this.setState({dragged:!0})},k.createElement("div",{ref:this.element,className:this.state.dragged?"r6o-editor dragged":"r6o-editor"},k.createElement("div",{className:"r6o-arrow"}),k.createElement("div",{className:"r6o-editor-inner"},n.map((s,a)=>k.cloneElement(s,{key:`${a}`,focus:a===0,annotation:e,readOnly:this.props.readOnly,env:this.props.env,onAppendBody:this.onAppendBody,onUpdateBody:this.onUpdateBody,onRemoveBody:this.onRemoveBody,onUpsertBody:this.onUpsertBody,onBatchModify:this.onBatchModify,onSetProperty:this.onSetProperty,onAddContext:this.onAddContext,onSaveAndClose:this.onOk})),this.props.readOnly?k.createElement("div",{className:"r6o-footer"},k.createElement("button",{className:"r6o-btn",onClick:this.onCancel},Ze.t("Close"))):k.createElement("div",{className:this.props.detachable?"r6o-footer r6o-draggable":"r6o-footer"},o&&k.createElement("button",{className:"r6o-btn left delete-annotation",title:Ze.t("Delete"),onClick:this.onDelete},k.createElement(JS,{width:12})),k.createElement("button",{className:"r6o-btn outline",onClick:this.onCancel},Ze.t("Cancel")),k.createElement("button",{className:"r6o-btn ",onClick:this.onOk},Ze.t("Ok"))))))}}var Ji,gE=new Uint8Array(16);function vE(){if(!Ji&&(Ji=typeof crypto!="undefined"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||typeof msCrypto!="undefined"&&typeof msCrypto.getRandomValues=="function"&&msCrypto.getRandomValues.bind(msCrypto),!Ji))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Ji(gE)}var yE=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function wE(i){return typeof i=="string"&&yE.test(i)}for(var He=[],es=0;es<256;++es)He.push((es+256).toString(16).substr(1));function bE(i){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,e=(He[i[t+0]]+He[i[t+1]]+He[i[t+2]]+He[i[t+3]]+"-"+He[i[t+4]]+He[i[t+5]]+"-"+He[i[t+6]]+He[i[t+7]]+"-"+He[i[t+8]]+He[i[t+9]]+"-"+He[i[t+10]]+He[i[t+11]]+He[i[t+12]]+He[i[t+13]]+He[i[t+14]]+He[i[t+15]]).toLowerCase();if(!wE(e))throw TypeError("Stringified UUID is invalid");return e}function Rh(i,t,e){i=i||{};var n=i.random||(i.rng||vE)();if(n[6]=n[6]&15|64,n[8]=n[8]&63|128,t){e=e||0;for(var r=0;r<16;++r)t[e+r]=n[r];return t}return bE(n)}var SE=function i(t,e){if(t===e)return!0;if(t&&e&&typeof t=="object"&&typeof e=="object"){if(t.constructor!==e.constructor)return!1;var n,r,o;if(Array.isArray(t)){if(n=t.length,n!=e.length)return!1;for(r=n;r--!==0;)if(!i(t[r],e[r]))return!1;return!0}if(t.constructor===RegExp)return t.source===e.source&&t.flags===e.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===e.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===e.toString();if(o=Object.keys(t),n=o.length,n!==Object.keys(e).length)return!1;for(r=n;r--!==0;)if(!Object.prototype.hasOwnProperty.call(e,o[r]))return!1;for(r=n;r--!==0;){var s=o[r];if(!i(t[s],e[s]))return!1}return!0}return t!==t&&e!==e},Mh=SE;const lr=class{constructor(t,e){P(this,"clone",(t,e)=>new lr({...this.underlying,...t},{...this.opts,...e}));P(this,"selector",t=>{const{target:e}=this.underlying;if(e.selector)return(Array.isArray(e.selector)?e.selector:[e.selector]).find(r=>r.type===t)});this.underlying=t,this.opts=e}isEqual(t){return(t==null?void 0:t.type)!=="Annotation"?!1:this.underlying===t.underlying?!0:!this.underlying.id||!t.underlying.id?!1:Mh(this.underlying,t.underlying)}get readOnly(){var t;return(t=this.opts)==null?void 0:t.readOnly}get id(){return this.underlying.id}get context(){return this.underlying["@context"]}get type(){return this.underlying.type}get motivation(){return this.underlying.motivation}get body(){return this.underlying.body}get target(){return this.underlying.target}get bodies(){return Array.isArray(this.underlying.body)?this.underlying.body:[this.underlying.body]}set bodies(t){this.underlying.body=t}get targets(){return Array.isArray(this.underlying.target)?this.underlying.target:[this.underlying.target]}get quote(){var t;return(t=this.selector("TextQuoteSelector"))==null?void 0:t.exact}get start(){var t;return(t=this.selector("TextPositionSelector"))==null?void 0:t.start}get end(){var t;return(t=this.selector("TextPositionSelector"))==null?void 0:t.end}};let St=lr;P(St,"create",t=>{const e={"@context":"http://www.w3.org/ns/anno.jsonld",type:"Annotation",id:`#${Rh()}`,body:[]};return new lr({...e,...t})});class Wn{constructor(t,e){P(this,"clone",t=>{const e=new Wn;return e.underlying=JSON.parse(JSON.stringify(this.underlying)),t&&(e.underlying={...e.underlying,...t}),e});P(this,"selector",t=>{const{target:e}=this.underlying;if(e.selector)return(Array.isArray(e.selector)?e.selector:[e.selector]).find(r=>r.type===t)});P(this,"toAnnotation",()=>{const t=Object.assign({},this.underlying,{type:"Annotation",id:`#${Rh()}`});return new St(t)});this.underlying={"@context":"http://www.w3.org/ns/anno.jsonld",type:"Selection",body:e||[],target:t}}get context(){return this.underlying["@context"]}get type(){return this.underlying.type}get body(){return this.underlying.body}get target(){return this.underlying.target}get targets(){return Array.isArray(this.underlying.target)?this.underlying.target:[this.underlying.target]}isEqual(t){return t?Mh(this.underlying,t.underlying):!1}get bodies(){return Array.isArray(this.underlying.body)?this.underlying.body:[this.underlying.body]}get quote(){var t;return(t=this.selector("TextQuoteSelector"))==null?void 0:t.exact}get isSelection(){return!0}}let ts=0;var EE=()=>({setServerTime:i=>{const t=Date.now();ts=i-t},getCurrentTimeAdjusted:()=>new Date(Date.now()+ts).toISOString(),toClientTime:i=>Date.parse(i)-ts});const xE=(i,t)=>{if(i){const e=i==="auto"?window.navigator.userLanguage||window.navigator.language:i,n=e.split("-")[0].toLowerCase(),r=[e,n].find(o=>F0.includes(o));r||console.warn(`Unsupported locale '${e}'. Falling back to default en.`),Ze.init(r,t)}else Ze.init(null,t)};var Fh={exports:{}};(function(i){//! openseadragon 3.0.0 +//! Built on 2021-12-15 +//! Git commit: v3.0.0-0-3eded36 +//! http://openseadragon.github.io +//! License: http://openseadragon.github.io/license/ +function t(e){return new t.Viewer(e)}(function(e){e.version={versionStr:"3.0.0",major:parseInt("3",10),minor:parseInt("0",10),revision:parseInt("0",10)};var n={"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regexp","[object Object]":"object"},r=Object.prototype.toString,o=Object.prototype.hasOwnProperty;e.isFunction=function(s){return e.type(s)==="function"},e.isArray=Array.isArray||function(s){return e.type(s)==="array"},e.isWindow=function(s){return s&&typeof s=="object"&&"setInterval"in s},e.type=function(s){return s==null?String(s):n[r.call(s)]||"object"},e.isPlainObject=function(s){if(!s||t.type(s)!=="object"||s.nodeType||e.isWindow(s)||s.constructor&&!o.call(s,"constructor")&&!o.call(s.constructor.prototype,"isPrototypeOf"))return!1;var a;for(var l in s)a=l;return a===void 0||o.call(s,a)},e.isEmptyObject=function(s){for(var a in s)return!1;return!0},e.freezeObject=function(s){return Object.freeze?e.freezeObject=Object.freeze:e.freezeObject=function(a){return a},e.freezeObject(s)},e.supportsCanvas=function(){var s=document.createElement("canvas");return!!(e.isFunction(s.getContext)&&s.getContext("2d"))}(),e.isCanvasTainted=function(s){var a=!1;try{s.getContext("2d").getImageData(0,0,1,1)}catch{a=!0}return a},e.supportsAddEventListener=function(){return!!(document.documentElement.addEventListener&&document.addEventListener)}(),e.supportsRemoveEventListener=function(){return!!(document.documentElement.removeEventListener&&document.removeEventListener)}(),e.supportsEventListenerOptions=function(){var s=0;if(e.supportsAddEventListener)try{var a={get capture(){return s++,!1},get once(){return s++,!1},get passive(){return s++,!1}};window.addEventListener("test",null,a),window.removeEventListener("test",null,a)}catch{s=0}return s>=3}(),e.getCurrentPixelDensityRatio=function(){if(e.supportsCanvas){var s=document.createElement("canvas").getContext("2d"),a=window.devicePixelRatio||1,l=s.webkitBackingStorePixelRatio||s.mozBackingStorePixelRatio||s.msBackingStorePixelRatio||s.oBackingStorePixelRatio||s.backingStorePixelRatio||1;return Math.max(a,1)/l}else return 1},e.pixelDensityRatio=e.getCurrentPixelDensityRatio()})(t),function(e){e.extend=function(){var l,u,c,h,d,g,y=arguments[0]||{},x=arguments.length,b=!1,T=1;for(typeof y=="boolean"&&(b=y,y=arguments[1]||{},T=2),typeof y!="object"&&!t.isFunction(y)&&(y={}),x===T&&(y=this,--T);T=c.x&&u.x=c.y},getMousePosition:function(l){if(typeof l.pageX=="number")e.getMousePosition=function(u){var c=new e.Point;return c.x=u.pageX,c.y=u.pageY,c};else if(typeof l.clientX=="number")e.getMousePosition=function(u){var c=new e.Point;return c.x=u.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,c.y=u.clientY+document.body.scrollTop+document.documentElement.scrollTop,c};else throw new Error("Unknown event mouse position, no known technique.");return e.getMousePosition(l)},getPageScroll:function(){var l=document.documentElement||{},u=document.body||{};if(typeof window.pageXOffset=="number")e.getPageScroll=function(){return new e.Point(window.pageXOffset,window.pageYOffset)};else if(u.scrollLeft||u.scrollTop)e.getPageScroll=function(){return new e.Point(document.body.scrollLeft,document.body.scrollTop)};else if(l.scrollLeft||l.scrollTop)e.getPageScroll=function(){return new e.Point(document.documentElement.scrollLeft,document.documentElement.scrollTop)};else return new e.Point(0,0);return e.getPageScroll()},setPageScroll:function(l){if(typeof window.scrollTo!="undefined")e.setPageScroll=function(h){window.scrollTo(h.x,h.y)};else{var u=e.getPageScroll();if(u.x===l.x&&u.y===l.y)return;document.body.scrollLeft=l.x,document.body.scrollTop=l.y;var c=e.getPageScroll();if(c.x!==u.x&&c.y!==u.y){e.setPageScroll=function(h){document.body.scrollLeft=h.x,document.body.scrollTop=h.y};return}if(document.documentElement.scrollLeft=l.x,document.documentElement.scrollTop=l.y,c=e.getPageScroll(),c.x!==u.x&&c.y!==u.y){e.setPageScroll=function(h){document.documentElement.scrollLeft=h.x,document.documentElement.scrollTop=h.y};return}e.setPageScroll=function(h){}}e.setPageScroll(l)},getWindowSize:function(){var l=document.documentElement||{},u=document.body||{};if(typeof window.innerWidth=="number")e.getWindowSize=function(){return new e.Point(window.innerWidth,window.innerHeight)};else if(l.clientWidth||l.clientHeight)e.getWindowSize=function(){return new e.Point(document.documentElement.clientWidth,document.documentElement.clientHeight)};else if(u.clientWidth||u.clientHeight)e.getWindowSize=function(){return new e.Point(document.body.clientWidth,document.body.clientHeight)};else throw new Error("Unknown window size, no known technique.");return e.getWindowSize()},makeCenteredNode:function(l){l=e.getElement(l);var u=[e.makeNeutralElement("div"),e.makeNeutralElement("div"),e.makeNeutralElement("div")];return e.extend(u[0].style,{display:"table",height:"100%",width:"100%"}),e.extend(u[1].style,{display:"table-row"}),e.extend(u[2].style,{display:"table-cell",verticalAlign:"middle",textAlign:"center"}),u[0].appendChild(u[1]),u[1].appendChild(u[2]),u[2].appendChild(l),u[0]},makeNeutralElement:function(l){var u=document.createElement(l),c=u.style;return c.background="transparent none",c.border="none",c.margin="0px",c.padding="0px",c.position="static",u},now:function(){return Date.now?e.now=Date.now:e.now=function(){return new Date().getTime()},e.now()},makeTransparentImage:function(l){var u=e.makeNeutralElement("img");return u.src=l,u},setElementOpacity:function(l,u,c){var h,d;l=e.getElement(l),c&&!e.Browser.alpha&&(u=Math.round(u)),e.Browser.opacity?l.style.opacity=u<1?u:"":u<1?(h=Math.round(100*u),d="alpha(opacity="+h+")",l.style.filter=d):l.style.filter=""},setElementTouchActionNone:function(l){l=e.getElement(l),typeof l.style.touchAction!="undefined"?l.style.touchAction="none":typeof l.style.msTouchAction!="undefined"&&(l.style.msTouchAction="none")},setElementPointerEvents:function(l,u){l=e.getElement(l),typeof l.style.pointerEvents!="undefined"&&(l.style.pointerEvents=u)},setElementPointerEventsNone:function(l){e.setElementPointerEvents(l,"none")},addClass:function(l,u){l=e.getElement(l),l.className?(" "+l.className+" ").indexOf(" "+u+" ")===-1&&(l.className+=" "+u):l.className=u},indexOf:function(l,u,c){return Array.prototype.indexOf?this.indexOf=function(h,d,g){return h.indexOf(d,g)}:this.indexOf=function(h,d,g){var y,x=g||0,b;if(!h)throw new TypeError;if(b=h.length,b===0||x>=b)return-1;for(x<0&&(x=b-Math.abs(x)),y=x;y=200&&x.status<300||x.status===0&&y!=="http:"&&y!=="https:"?u(x):(e.console.log("AJAX request returned %d: %s",x.status,l),e.isFunction(c)&&c(x)))};try{if(x.open("GET",l,!0),g&&(x.responseType=g),d)for(var b in d)Object.prototype.hasOwnProperty.call(d,b)&&d[b]&&x.setRequestHeader(b,d[b]);h&&(x.withCredentials=!0),x.send(null)}catch(T){e.console.log("%s while making AJAX request: %s",T.name,T.message),x.onreadystatechange=function(){},e.isFunction(c)&&c(x,T)}return x},jsonp:function(l){var u,c=l.url,h=document.head||document.getElementsByTagName("head")[0]||document.documentElement,d=l.callbackName||"openseadragon"+e.now(),g=window[d],y="$1"+d+"$2",x=l.param||"callback",b=l.callback;c=c.replace(/(=)\?(&|$)|\?\?/i,y),c+=(/\?/.test(c)?"&":"?")+x+"="+d,window[d]=function(T){if(g)window[d]=g;else try{delete window[d]}catch{}b&&e.isFunction(b)&&b(T)},u=document.createElement("script"),(l.async!==void 0||l.async!==!1)&&(u.async="async"),l.scriptCharset&&(u.charset=l.scriptCharset),u.src=c,u.onload=u.onreadystatechange=function(T,f){(f||!u.readyState||/loaded|complete/.test(u.readyState))&&(u.onload=u.onreadystatechange=null,h&&u.parentNode&&h.removeChild(u),u=void 0)},h.insertBefore(u,h.firstChild)},createFromDZI:function(){throw"OpenSeadragon.createFromDZI is deprecated, use Viewer.open."},parseXml:function(l){if(window.DOMParser)e.parseXml=function(u){var c=null,h;return h=new DOMParser,c=h.parseFromString(u,"text/xml"),c};else if(window.ActiveXObject)e.parseXml=function(u){var c=null;return c=new ActiveXObject("Microsoft.XMLDOM"),c.async=!1,c.loadXML(u),c};else throw new Error("Browser doesn't support XML DOM.");return e.parseXml(l)},parseJSON:function(l){return e.parseJSON=window.JSON.parse,e.parseJSON(l)},imageFormatSupported:function(l){return l=l||"",!!o[l.toLowerCase()]},setImageFormatsSupported:function(l){e.extend(o,l)}});var r=function(l){};e.console=window.console||{log:r,debug:r,info:r,warn:r,error:r,assert:r},e.Browser={vendor:e.BROWSERS.UNKNOWN,version:0,alpha:!0};var o={bmp:!1,jpeg:!0,jpg:!0,png:!0,tif:!1,wdp:!1},s={};(function(){var l=navigator.appVersion,u=navigator.userAgent,c;switch(navigator.appName){case"Microsoft Internet Explorer":!!window.attachEvent&&!!window.ActiveXObject&&(e.Browser.vendor=e.BROWSERS.IE,e.Browser.version=parseFloat(u.substring(u.indexOf("MSIE")+5,u.indexOf(";",u.indexOf("MSIE")))));break;case"Netscape":window.addEventListener&&(u.indexOf("Edge")>=0?(e.Browser.vendor=e.BROWSERS.EDGE,e.Browser.version=parseFloat(u.substring(u.indexOf("Edge")+5))):u.indexOf("Edg")>=0?(e.Browser.vendor=e.BROWSERS.CHROMEEDGE,e.Browser.version=parseFloat(u.substring(u.indexOf("Edg")+4))):u.indexOf("Firefox")>=0?(e.Browser.vendor=e.BROWSERS.FIREFOX,e.Browser.version=parseFloat(u.substring(u.indexOf("Firefox")+8))):u.indexOf("Safari")>=0?(e.Browser.vendor=u.indexOf("Chrome")>=0?e.BROWSERS.CHROME:e.BROWSERS.SAFARI,e.Browser.version=parseFloat(u.substring(u.substring(0,u.indexOf("Safari")).lastIndexOf("/")+1,u.indexOf("Safari")))):(c=new RegExp("Trident/.*rv:([0-9]{1,}[.0-9]{0,})"),c.exec(u)!==null&&(e.Browser.vendor=e.BROWSERS.IE,e.Browser.version=parseFloat(RegExp.$1))));break;case"Opera":e.Browser.vendor=e.BROWSERS.OPERA,e.Browser.version=parseFloat(l);break}var h=window.location.search.substring(1),d=h.split("&"),g,y,x;for(x=0;x0){var b=g.substring(0,y),T=g.substring(y+1);try{s[b]=decodeURIComponent(T)}catch{e.console.error("Ignoring malformed URL parameter: %s=%s",b,T)}}e.Browser.alpha=!(e.Browser.vendor===e.BROWSERS.CHROME&&e.Browser.version<2),e.Browser.opacity=!0,e.Browser.vendor===e.BROWSERS.IE&&e.Browser.version<11&&e.console.error("Internet Explorer versions < 11 are not supported by OpenSeadragon")})(),function(l){var u=l.requestAnimationFrame||l.mozRequestAnimationFrame||l.webkitRequestAnimationFrame||l.msRequestAnimationFrame,c=l.cancelAnimationFrame||l.mozCancelAnimationFrame||l.webkitCancelAnimationFrame||l.msCancelAnimationFrame;if(u&&c)e.requestAnimationFrame=function(){return u.apply(l,arguments)},e.cancelAnimationFrame=function(){return c.apply(l,arguments)};else{var h=[],d=[],g=0,y;e.requestAnimationFrame=function(x){return h.push([++g,x]),y||(y=setInterval(function(){if(h.length){var b=e.now(),T=d;for(d=h,h=T;d.length;)d.shift()[1](b)}else clearInterval(y),y=void 0},1e3/50)),g},e.cancelAnimationFrame=function(x){var b,T;for(b=0,T=h.length;b8||"onwheel"in document.createElement("div")?"wheel":document.onmousewheel!==void 0?"mousewheel":"DOMMouseScroll",e.MouseTracker.subscribeEvents=["click","dblclick","keydown","keyup","keypress","focus","blur","contextmenu",e.MouseTracker.wheelEventName],e.MouseTracker.wheelEventName==="DOMMouseScroll"&&e.MouseTracker.subscribeEvents.push("MozMousePixelScroll"),window.PointerEvent?(e.MouseTracker.havePointerEvents=!0,e.MouseTracker.subscribeEvents.push("pointerenter","pointerleave","pointerover","pointerout","pointerdown","pointerup","pointermove","pointercancel"),e.MouseTracker.havePointerCapture=function(){var v=document.createElement("div");return e.isFunction(v.setPointerCapture)&&e.isFunction(v.releasePointerCapture)}(),e.MouseTracker.havePointerCapture&&e.MouseTracker.subscribeEvents.push("gotpointercapture","lostpointercapture")):(e.MouseTracker.havePointerEvents=!1,e.MouseTracker.subscribeEvents.push("mouseenter","mouseleave","mouseover","mouseout","mousedown","mouseup","mousemove"),e.MouseTracker.mousePointerId="legacy-mouse",e.MouseTracker.havePointerCapture=function(){var v=document.createElement("div");return e.isFunction(v.setCapture)&&e.isFunction(v.releaseCapture)}(),e.MouseTracker.havePointerCapture&&e.MouseTracker.subscribeEvents.push("losecapture"),"ontouchstart"in window&&e.MouseTracker.subscribeEvents.push("touchstart","touchend","touchmove","touchcancel"),"ongesturestart"in window&&e.MouseTracker.subscribeEvents.push("gesturestart","gesturechange")),e.MouseTracker.GesturePointList=function(v){this._gPoints=[],this.type=v,this.buttons=0,this.contacts=0,this.clicks=0,this.captureCount=0},e.MouseTracker.GesturePointList.prototype={getLength:function(){return this._gPoints.length},asArray:function(){return this._gPoints},add:function(v){return this._gPoints.push(v)},removeById:function(v){var m,w=this._gPoints.length;for(m=0;m1&&(this.type==="mouse"||this.type==="pen")&&(e.console.warn("GesturePointList.addContact() Implausible contacts value"),this.contacts=1)},removeContact:function(){--this.contacts,this.contacts<0&&(e.console.warn("GesturePointList.removeContact() Implausible contacts value"),this.contacts=0)}};function s(v){var m=n[v.hash],w,S,M,z,ee,Ee=m.activePointersLists.length;for(w=0;w0){for(ee=[],z=M.asArray(),S=0;Sm.touches.length-M&&e.console.warn("Tracked touch contact count doesn't match event.touches.length");var Ee={originalEvent:m,eventType:"pointerdown",pointerType:"touch",isEmulated:!1};for(L(v,Ee),S=0;S0&&m.removeContact(),S=m.removeById(w.id)):S=m.getLength(),S}function N(v,m){switch(m.eventType){case"pointermove":m.isStoppable=!0,m.isCancelable=!0,m.preventDefault=!1,m.preventGesture=!v.hasGestureHandlers,m.stopPropagation=!1;break;case"pointerover":case"pointerout":case"contextmenu":case"keydown":case"keyup":case"keypress":m.isStoppable=!0,m.isCancelable=!0,m.preventDefault=!1,m.preventGesture=!1,m.stopPropagation=!1;break;case"pointerdown":m.isStoppable=!0,m.isCancelable=!0,m.preventDefault=!1,m.preventGesture=!v.hasGestureHandlers,m.stopPropagation=!1;break;case"pointerup":m.isStoppable=!0,m.isCancelable=!0,m.preventDefault=!1,m.preventGesture=!v.hasGestureHandlers,m.stopPropagation=!1;break;case"wheel":m.isStoppable=!0,m.isCancelable=!0,m.preventDefault=!1,m.preventGesture=!v.hasScrollHandler,m.stopPropagation=!1;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":m.isStoppable=!0,m.isCancelable=!1,m.preventDefault=!1,m.preventGesture=!1,m.stopPropagation=!1;break;case"click":m.isStoppable=!0,m.isCancelable=!0,m.preventDefault=!!v.clickHandler,m.preventGesture=!1,m.stopPropagation=!1;break;case"dblclick":m.isStoppable=!0,m.isCancelable=!0,m.preventDefault=!!v.dblClickHandler,m.preventGesture=!1,m.stopPropagation=!1;break;case"focus":case"blur":case"pointerenter":case"pointerleave":default:m.isStoppable=!1,m.isCancelable=!1,m.preventDefault=!1,m.preventGesture=!1,m.stopPropagation=!1;break}}function L(v,m){m.eventSource=v,m.eventPhase=m.originalEvent&&typeof m.originalEvent.eventPhase!="undefined"?m.originalEvent.eventPhase:0,m.defaultPrevented=e.eventIsCanceled(m.originalEvent),m.shouldCapture=!1,m.shouldReleaseCapture=!1,m.userData=v.userData,N(v,m),v.preProcessEventHandler&&v.preProcessEventHandler(m)}function J(v,m,w){var S=v.getActivePointersListByType(m.type),M=S.getById(m.id);M?w&&!M.captured?(M.captured=!0,S.captureCount++):!w&&M.captured&&(M.captured=!1,S.captureCount--,S.captureCount<0&&(S.captureCount=0,e.console.warn("updatePointerCaptured() - pointsList.captureCount went negative"))):e.console.warn("updatePointerCaptured() called on untracked pointer")}function q(v,m,w){var S=v.getActivePointersListByType(w.type),M;M=S.getById(w.id),M?(M.insideElement=!0,M.lastPos=M.currentPos,M.lastTime=M.currentTime,M.currentPos=w.currentPos,M.currentTime=w.currentTime,w=M):(w.captured=!1,w.insideElementPressed=!1,w.insideElement=!0,_(S,w)),v.enterHandler&&v.enterHandler({eventSource:v,pointerType:w.type,position:T(w.currentPos,v.element),buttons:S.buttons,pointers:v.getActivePointerCount(),insideElementPressed:w.insideElementPressed,buttonDownAny:S.buttons!==0,isTouchEvent:w.type==="touch",originalEvent:m.originalEvent,userData:v.userData})}function fe(v,m,w){var S=v.getActivePointersListByType(w.type),M,z;M=S.getById(w.id),M?(M.captured?(M.insideElement=!1,M.lastPos=M.currentPos,M.lastTime=M.currentTime,M.currentPos=w.currentPos,M.currentTime=w.currentTime):R(v,S,M),w=M):(w.captured=!1,w.insideElementPressed=!1),(v.leaveHandler||v.exitHandler)&&(z={eventSource:v,pointerType:w.type,position:w.currentPos&&T(w.currentPos,v.element),buttons:S.buttons,pointers:v.getActivePointerCount(),insideElementPressed:w.insideElementPressed,buttonDownAny:S.buttons!==0,isTouchEvent:w.type==="touch",originalEvent:m.originalEvent,userData:v.userData},v.leaveHandler&&v.leaveHandler(z),v.exitHandler&&v.exitHandler(z))}function Se(v,m,w){var S,M;S=v.getActivePointersListByType(w.type),M=S.getById(w.id),M?w=M:(w.captured=!1,w.insideElementPressed=!1),v.overHandler&&v.overHandler({eventSource:v,pointerType:w.type,position:T(w.currentPos,v.element),buttons:S.buttons,pointers:v.getActivePointerCount(),insideElementPressed:w.insideElementPressed,buttonDownAny:S.buttons!==0,isTouchEvent:w.type==="touch",originalEvent:m.originalEvent,userData:v.userData})}function ge(v,m,w){var S,M;S=v.getActivePointersListByType(w.type),M=S.getById(w.id),M?w=M:(w.captured=!1,w.insideElementPressed=!1),v.outHandler&&v.outHandler({eventSource:v,pointerType:w.type,position:w.currentPos&&T(w.currentPos,v.element),buttons:S.buttons,pointers:v.getActivePointerCount(),insideElementPressed:w.insideElementPressed,buttonDownAny:S.buttons!==0,isTouchEvent:w.type==="touch",originalEvent:m.originalEvent,userData:v.userData})}function oe(v,m,w,S){var M=n[v.hash],z=v.getActivePointersListByType(w.type),ee;if(typeof m.originalEvent.buttons!="undefined"?z.buttons=m.originalEvent.buttons:S===0?z.buttons|=1:S===1?z.buttons|=4:S===2?z.buttons|=2:S===3?z.buttons|=8:S===4?z.buttons|=16:S===5&&(z.buttons|=32),S!==0){m.shouldCapture=!1,m.shouldReleaseCapture=!1,v.nonPrimaryPressHandler&&!m.preventGesture&&!m.defaultPrevented&&(m.preventDefault=!0,v.nonPrimaryPressHandler({eventSource:v,pointerType:w.type,position:T(w.currentPos,v.element),button:S,buttons:z.buttons,isTouchEvent:w.type==="touch",originalEvent:m.originalEvent,userData:v.userData}));return}if(ee=z.getById(w.id),ee)ee.insideElementPressed=!0,ee.insideElement=!0,ee.originalTarget=m.originalEvent.target,ee.contactPos=w.currentPos,ee.contactTime=w.currentTime,ee.lastPos=ee.currentPos,ee.lastTime=ee.currentTime,ee.currentPos=w.currentPos,ee.currentTime=w.currentTime,w=ee;else{e.console.warn("pointerdown event on untracked pointer"),w.captured=!1,w.insideElementPressed=!0,w.insideElement=!0,w.originalTarget=m.originalEvent.target,_(z,w);return}z.addContact(),!m.preventGesture&&!m.defaultPrevented?(m.shouldCapture=!0,m.shouldReleaseCapture=!1,m.preventDefault=!0,(v.dragHandler||v.dragEndHandler||v.pinchHandler)&&e.MouseTracker.gesturePointVelocityTracker.addPoint(v,w),z.contacts===1?v.pressHandler&&!m.preventGesture&&v.pressHandler({eventSource:v,pointerType:w.type,position:T(w.contactPos,v.element),buttons:z.buttons,isTouchEvent:w.type==="touch",originalEvent:m.originalEvent,userData:v.userData}):z.contacts===2&&v.pinchHandler&&w.type==="touch"&&(M.pinchGPoints=z.asArray(),M.lastPinchDist=M.currentPinchDist=M.pinchGPoints[0].currentPos.distanceTo(M.pinchGPoints[1].currentPos),M.lastPinchCenter=M.currentPinchCenter=f(M.pinchGPoints[0].currentPos,M.pinchGPoints[1].currentPos))):(m.shouldCapture=!1,m.shouldReleaseCapture=!1)}function Te(v,m,w,S){var M=n[v.hash],z=v.getActivePointersListByType(w.type),ee,Ee,te,tt=!1,Fe;if(typeof m.originalEvent.buttons!="undefined"?z.buttons=m.originalEvent.buttons:S===0?z.buttons^=-2:S===1?z.buttons^=-5:S===2?z.buttons^=-3:S===3?z.buttons^=-9:S===4?z.buttons^=-17:S===5&&(z.buttons^=-33),m.shouldCapture=!1,S!==0){m.shouldReleaseCapture=!1,v.nonPrimaryReleaseHandler&&!m.preventGesture&&!m.defaultPrevented&&(m.preventDefault=!0,v.nonPrimaryReleaseHandler({eventSource:v,pointerType:w.type,position:T(w.currentPos,v.element),button:S,buttons:z.buttons,isTouchEvent:w.type==="touch",originalEvent:m.originalEvent,userData:v.userData}));return}te=z.getById(w.id),te?(z.removeContact(),te.captured&&(tt=!0),te.lastPos=te.currentPos,te.lastTime=te.currentTime,te.currentPos=w.currentPos,te.currentTime=w.currentTime,te.insideElement||R(v,z,te),ee=te.currentPos,Ee=te.currentTime):(e.console.warn("updatePointerUp(): pointerup on untracked gPoint"),w.captured=!1,w.insideElementPressed=!1,w.insideElement=!0,_(z,w),te=w),!m.preventGesture&&!m.defaultPrevented&&(tt?(m.shouldReleaseCapture=!0,m.preventDefault=!0,(v.dragHandler||v.dragEndHandler||v.pinchHandler)&&e.MouseTracker.gesturePointVelocityTracker.removePoint(v,te),z.contacts===0?(v.releaseHandler&&v.releaseHandler({eventSource:v,pointerType:te.type,position:T(ee,v.element),buttons:z.buttons,insideElementPressed:te.insideElementPressed,insideElementReleased:te.insideElement,isTouchEvent:te.type==="touch",originalEvent:m.originalEvent,userData:v.userData}),v.dragEndHandler&&M.sentDragEvent&&v.dragEndHandler({eventSource:v,pointerType:te.type,position:T(te.currentPos,v.element),speed:te.speed,direction:te.direction,shift:m.originalEvent.shiftKey,isTouchEvent:te.type==="touch",originalEvent:m.originalEvent,userData:v.userData}),M.sentDragEvent=!1,(v.clickHandler||v.dblClickHandler)&&te.insideElement&&(Fe=Ee-te.contactTime<=v.clickTimeThreshold&&te.contactPos.distanceTo(ee)<=v.clickDistThreshold,v.clickHandler&&v.clickHandler({eventSource:v,pointerType:te.type,position:T(te.currentPos,v.element),quick:Fe,shift:m.originalEvent.shiftKey,isTouchEvent:te.type==="touch",originalEvent:m.originalEvent,originalTarget:te.originalTarget,userData:v.userData}),v.dblClickHandler&&Fe&&(z.clicks++,z.clicks===1?(M.lastClickPos=ee,M.dblClickTimeOut=setTimeout(function(){z.clicks=0},v.dblClickTimeThreshold)):z.clicks===2&&(clearTimeout(M.dblClickTimeOut),z.clicks=0,M.lastClickPos.distanceTo(ee)<=v.dblClickDistThreshold&&v.dblClickHandler({eventSource:v,pointerType:te.type,position:T(te.currentPos,v.element),shift:m.originalEvent.shiftKey,isTouchEvent:te.type==="touch",originalEvent:m.originalEvent,userData:v.userData}),M.lastClickPos=null)))):z.contacts===2&&v.pinchHandler&&te.type==="touch"&&(M.pinchGPoints=z.asArray(),M.lastPinchDist=M.currentPinchDist=M.pinchGPoints[0].currentPos.distanceTo(M.pinchGPoints[1].currentPos),M.lastPinchCenter=M.currentPinchCenter=f(M.pinchGPoints[0].currentPos,M.pinchGPoints[1].currentPos))):(m.shouldReleaseCapture=!1,v.releaseHandler&&(v.releaseHandler({eventSource:v,pointerType:te.type,position:T(ee,v.element),buttons:z.buttons,insideElementPressed:te.insideElementPressed,insideElementReleased:te.insideElement,isTouchEvent:te.type==="touch",originalEvent:m.originalEvent,userData:v.userData}),m.preventDefault=!0)))}function he(v,m,w){var S=n[v.hash],M=v.getActivePointersListByType(w.type),z,ee,Ee;if(typeof m.originalEvent.buttons!="undefined"&&(M.buttons=m.originalEvent.buttons),z=M.getById(w.id),z)z.lastPos=z.currentPos,z.lastTime=z.currentTime,z.currentPos=w.currentPos,z.currentTime=w.currentTime;else return;m.shouldCapture=!1,m.shouldReleaseCapture=!1,v.stopHandler&&w.type==="mouse"&&(clearTimeout(v.stopTimeOut),v.stopTimeOut=setTimeout(function(){Mt(v,m.originalEvent,w.type)},v.stopDelay)),M.contacts===0?v.moveHandler&&v.moveHandler({eventSource:v,pointerType:w.type,position:T(w.currentPos,v.element),buttons:M.buttons,isTouchEvent:w.type==="touch",originalEvent:m.originalEvent,userData:v.userData}):M.contacts===1?(v.moveHandler&&(z=M.asArray()[0],v.moveHandler({eventSource:v,pointerType:z.type,position:T(z.currentPos,v.element),buttons:M.buttons,isTouchEvent:z.type==="touch",originalEvent:m.originalEvent,userData:v.userData})),v.dragHandler&&!m.preventGesture&&!m.defaultPrevented&&(z=M.asArray()[0],Ee=z.currentPos.minus(z.lastPos),v.dragHandler({eventSource:v,pointerType:z.type,position:T(z.currentPos,v.element),buttons:M.buttons,delta:Ee,speed:z.speed,direction:z.direction,shift:m.originalEvent.shiftKey,isTouchEvent:z.type==="touch",originalEvent:m.originalEvent,userData:v.userData}),m.preventDefault=!0,S.sentDragEvent=!0)):M.contacts===2&&(v.moveHandler&&(ee=M.asArray(),v.moveHandler({eventSource:v,pointerType:ee[0].type,position:T(f(ee[0].currentPos,ee[1].currentPos),v.element),buttons:M.buttons,isTouchEvent:ee[0].type==="touch",originalEvent:m.originalEvent,userData:v.userData})),v.pinchHandler&&w.type==="touch"&&!m.preventGesture&&!m.defaultPrevented&&(Ee=S.pinchGPoints[0].currentPos.distanceTo(S.pinchGPoints[1].currentPos),Ee!==S.currentPinchDist&&(S.lastPinchDist=S.currentPinchDist,S.currentPinchDist=Ee,S.lastPinchCenter=S.currentPinchCenter,S.currentPinchCenter=f(S.pinchGPoints[0].currentPos,S.pinchGPoints[1].currentPos),v.pinchHandler({eventSource:v,pointerType:"touch",gesturePoints:S.pinchGPoints,lastCenter:T(S.lastPinchCenter,v.element),center:T(S.currentPinchCenter,v.element),lastDistance:S.lastPinchDist,distance:S.currentPinchDist,shift:m.originalEvent.shiftKey,originalEvent:m.originalEvent,userData:v.userData}),m.preventDefault=!0)))}function ze(v,m,w){var S=v.getActivePointersListByType(w.type),M;M=S.getById(w.id),M&&R(v,S,M)}function Mt(v,m,w){v.stopHandler&&v.stopHandler({eventSource:v,pointerType:w,position:b(m,v.element),buttons:v.getActivePointersListByType(w).buttons,isTouchEvent:w==="touch",originalEvent:m,userData:v.userData})}}(t),function(e){e.ControlAnchor={NONE:0,TOP_LEFT:1,TOP_RIGHT:2,BOTTOM_RIGHT:3,BOTTOM_LEFT:4,ABSOLUTE:5},e.Control=function(n,r,o){var s=n.parentNode;typeof r=="number"&&(e.console.error("Passing an anchor directly into the OpenSeadragon.Control constructor is deprecated; please use an options object instead. Support for this deprecated variant is scheduled for removal in December 2013"),r={anchor:r}),r.attachToViewer=typeof r.attachToViewer=="undefined"?!0:r.attachToViewer,this.autoFade=typeof r.autoFade=="undefined"?!0:r.autoFade,this.element=n,this.anchor=r.anchor,this.container=o,this.anchor===e.ControlAnchor.ABSOLUTE?(this.wrapper=e.makeNeutralElement("div"),this.wrapper.style.position="absolute",this.wrapper.style.top=typeof r.top=="number"?r.top+"px":r.top,this.wrapper.style.left=typeof r.left=="number"?r.left+"px":r.left,this.wrapper.style.height=typeof r.height=="number"?r.height+"px":r.height,this.wrapper.style.width=typeof r.width=="number"?r.width+"px":r.width,this.wrapper.style.margin="0px",this.wrapper.style.padding="0px",this.element.style.position="relative",this.element.style.top="0px",this.element.style.left="0px",this.element.style.height="100%",this.element.style.width="100%"):(this.wrapper=e.makeNeutralElement("div"),this.wrapper.style.display="inline-block",this.anchor===e.ControlAnchor.NONE&&(this.wrapper.style.width=this.wrapper.style.height="100%")),this.wrapper.appendChild(this.element),r.attachToViewer?this.anchor===e.ControlAnchor.TOP_RIGHT||this.anchor===e.ControlAnchor.BOTTOM_RIGHT?this.container.insertBefore(this.wrapper,this.container.firstChild):this.container.appendChild(this.wrapper):s.appendChild(this.wrapper)},e.Control.prototype={destroy:function(){this.wrapper.removeChild(this.element),this.anchor!==e.ControlAnchor.NONE&&this.container.removeChild(this.wrapper)},isVisible:function(){return this.wrapper.style.display!=="none"},setVisible:function(n){this.wrapper.style.display=n?this.anchor===e.ControlAnchor.ABSOLUTE?"block":"inline-block":"none"},setOpacity:function(n){this.element[e.SIGNAL]&&e.Browser.vendor===e.BROWSERS.IE?e.setElementOpacity(this.element,n,!0):e.setElementOpacity(this.wrapper,n,!0)}}}(t),function(e){e.ControlDock=function(r){var o=["topleft","topright","bottomright","bottomleft"],s,a;for(e.extend(!0,this,{id:"controldock-"+e.now()+"-"+Math.floor(Math.random()*1e6),container:e.makeNeutralElement("div"),controls:[]},r),this.container.onsubmit=function(){return!1},this.element&&(this.element=e.getElement(this.element),this.element.appendChild(this.container),this.element.style.position="relative",this.container.style.width="100%",this.container.style.height="100%"),a=0;a=0)){switch(o.anchor){case e.ControlAnchor.TOP_RIGHT:s=this.controls.topright,r.style.position="relative",r.style.paddingRight="0px",r.style.paddingTop="0px";break;case e.ControlAnchor.BOTTOM_RIGHT:s=this.controls.bottomright,r.style.position="relative",r.style.paddingRight="0px",r.style.paddingBottom="0px";break;case e.ControlAnchor.BOTTOM_LEFT:s=this.controls.bottomleft,r.style.position="relative",r.style.paddingLeft="0px",r.style.paddingBottom="0px";break;case e.ControlAnchor.TOP_LEFT:s=this.controls.topleft,r.style.position="relative",r.style.paddingLeft="0px",r.style.paddingTop="0px";break;case e.ControlAnchor.ABSOLUTE:s=this.container,r.style.margin="0px",r.style.padding="0px";break;default:case e.ControlAnchor.NONE:s=this.container,r.style.margin="0px",r.style.padding="0px";break}this.controls.push(new e.Control(r,o,s)),r.style.display="inline-block"}},removeControl:function(r){r=e.getElement(r);var o=n(this,r);return o>=0&&(this.controls[o].destroy(),this.controls.splice(o,1)),this},clearControls:function(){for(;this.controls.length>0;)this.controls.pop().destroy();return this},areControlsEnabled:function(){var r;for(r=this.controls.length-1;r>=0;r--)if(this.controls[r].isVisible())return!0;return!1},setControlsEnabled:function(r){var o;for(o=this.controls.length-1;o>=0;o--)this.controls[o].setVisible(r);return this}};function n(r,o){var s=r.controls,a;for(a=s.length-1;a>=0;a--)if(s[a].element===o)return a;return-1}}(t),function(e){e.Placement=e.freezeObject({CENTER:0,TOP_LEFT:1,TOP:2,TOP_RIGHT:3,RIGHT:4,BOTTOM_RIGHT:5,BOTTOM:6,BOTTOM_LEFT:7,LEFT:8,properties:{0:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!1,isVerticallyCentered:!0,isBottom:!1},1:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!0,isVerticallyCentered:!1,isBottom:!1},2:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!0,isVerticallyCentered:!1,isBottom:!1},3:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!0,isVerticallyCentered:!1,isBottom:!1},4:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!1,isVerticallyCentered:!0,isBottom:!1},5:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!1,isVerticallyCentered:!1,isBottom:!0},6:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!1,isVerticallyCentered:!1,isBottom:!0},7:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!1,isVerticallyCentered:!1,isBottom:!0},8:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!1,isVerticallyCentered:!0,isBottom:!1}}})}(t),function(e){var n={},r=1;e.Viewer=function(p){var _=arguments,R=this,N;if(e.isPlainObject(p)||(p={id:_[0],xmlPath:_.length>1?_[1]:void 0,prefixUrl:_.length>2?_[2]:void 0,controls:_.length>3?_[3]:void 0,overlays:_.length>4?_[4]:void 0}),p.config&&(e.extend(!0,p,p.config),delete p.config),e.extend(!0,this,{id:p.id,hash:p.hash||r++,initialPage:0,element:null,container:null,canvas:null,overlays:[],overlaysContainer:null,previousBody:[],customControls:[],source:null,drawer:null,world:null,viewport:null,navigator:null,collectionViewport:null,collectionDrawer:null,navImages:null,buttons:null,profiler:null},e.DEFAULT_SETTINGS,p),typeof this.hash=="undefined")throw new Error("A hash must be defined, either by specifying options.id or options.hash.");for(typeof n[this.hash]!="undefined"&&e.console.warn("Hash "+this.hash+" has already been used."),n[this.hash]={fsBoundsDelta:new e.Point(1,1),prevContainerSize:null,animating:!1,forceRedraw:!1,mouseInside:!1,group:null,zooming:!1,zoomFactor:null,lastZoomTime:null,fullPage:!1,onfullscreenchange:null},this._sequenceIndex=0,this._firstOpen=!0,this._updateRequestId=null,this._loadQueue=[],this.currentOverlays=[],this._updatePixelDensityRatioBind=null,this._lastScrollTime=e.now(),e.EventSource.call(this),this.addHandler("open-failed",function(L){var J=e.getString("Errors.OpenFailed",L.eventSource,L.message);R._showMessage(J)}),e.ControlDock.call(this,p),this.xmlPath&&(this.tileSources=[this.xmlPath]),this.element=this.element||document.getElementById(this.id),this.canvas=e.makeNeutralElement("div"),this.canvas.className="openseadragon-canvas",function(L){L.width="100%",L.height="100%",L.overflow="hidden",L.position="absolute",L.top="0px",L.left="0px"}(this.canvas.style),e.setElementTouchActionNone(this.canvas),p.tabIndex!==""&&(this.canvas.tabIndex=p.tabIndex===void 0?0:p.tabIndex),this.container.className="openseadragon-container",function(L){L.width="100%",L.height="100%",L.position="relative",L.overflow="hidden",L.left="0px",L.top="0px",L.textAlign="left"}(this.container.style),e.setElementTouchActionNone(this.container),this.container.insertBefore(this.canvas,this.container.firstChild),this.element.appendChild(this.container),this.bodyWidth=document.body.style.width,this.bodyHeight=document.body.style.height,this.bodyOverflow=document.body.style.overflow,this.docOverflow=document.documentElement.style.overflow,this.innerTracker=new e.MouseTracker({userData:"Viewer.innerTracker",element:this.canvas,startDisabled:!this.mouseNavEnabled,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,dblClickTimeThreshold:this.dblClickTimeThreshold,dblClickDistThreshold:this.dblClickDistThreshold,contextMenuHandler:e.delegate(this,b),keyDownHandler:e.delegate(this,T),keyHandler:e.delegate(this,f),clickHandler:e.delegate(this,E),dblClickHandler:e.delegate(this,A),dragHandler:e.delegate(this,C),dragEndHandler:e.delegate(this,O),enterHandler:e.delegate(this,D),leaveHandler:e.delegate(this,I),pressHandler:e.delegate(this,B),releaseHandler:e.delegate(this,Z),nonPrimaryPressHandler:e.delegate(this,Y),nonPrimaryReleaseHandler:e.delegate(this,V),scrollHandler:e.delegate(this,Q),pinchHandler:e.delegate(this,K)}),this.outerTracker=new e.MouseTracker({userData:"Viewer.outerTracker",element:this.container,startDisabled:!this.mouseNavEnabled,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,dblClickTimeThreshold:this.dblClickTimeThreshold,dblClickDistThreshold:this.dblClickDistThreshold,enterHandler:e.delegate(this,le),leaveHandler:e.delegate(this,re)}),this.toolbar&&(this.toolbar=new e.ControlDock({element:this.toolbar})),this.bindStandardControls(),n[this.hash].prevContainerSize=o(this.container),this.world=new e.World({viewer:this}),this.world.addHandler("add-item",function(L){R.source=R.world.getItemAt(0).source,n[R.hash].forceRedraw=!0,R._updateRequestId||(R._updateRequestId=u(R,se))}),this.world.addHandler("remove-item",function(L){R.world.getItemCount()?R.source=R.world.getItemAt(0).source:R.source=null,n[R.hash].forceRedraw=!0}),this.world.addHandler("metrics-change",function(L){R.viewport&&R.viewport._setContentBounds(R.world.getHomeBounds(),R.world.getContentFactor())}),this.world.addHandler("item-index-change",function(L){R.source=R.world.getItemAt(0).source}),this.viewport=new e.Viewport({containerSize:n[this.hash].prevContainerSize,springStiffness:this.springStiffness,animationTime:this.animationTime,minZoomImageRatio:this.minZoomImageRatio,maxZoomPixelRatio:this.maxZoomPixelRatio,visibilityRatio:this.visibilityRatio,wrapHorizontal:this.wrapHorizontal,wrapVertical:this.wrapVertical,defaultZoomLevel:this.defaultZoomLevel,minZoomLevel:this.minZoomLevel,maxZoomLevel:this.maxZoomLevel,viewer:this,degrees:this.degrees,flipped:this.flipped,navigatorRotate:this.navigatorRotate,homeFillsViewer:this.homeFillsViewer,margins:this.viewportMargins}),this.viewport._setContentBounds(this.world.getHomeBounds(),this.world.getContentFactor()),this.imageLoader=new e.ImageLoader({jobLimit:this.imageLoaderLimit,timeout:p.timeout}),this.tileCache=new e.TileCache({maxImageCacheCount:this.maxImageCacheCount}),this.drawer=new e.Drawer({viewer:this,viewport:this.viewport,element:this.canvas,debugGridColor:this.debugGridColor}),this.overlaysContainer=e.makeNeutralElement("div"),this.canvas.appendChild(this.overlaysContainer),this.drawer.canRotate()||(this.rotateLeft&&(N=this.buttonGroup.buttons.indexOf(this.rotateLeft),this.buttonGroup.buttons.splice(N,1),this.buttonGroup.element.removeChild(this.rotateLeft.element)),this.rotateRight&&(N=this.buttonGroup.buttons.indexOf(this.rotateRight),this.buttonGroup.buttons.splice(N,1),this.buttonGroup.element.removeChild(this.rotateRight.element))),this._addUpdatePixelDensityRatioEvent(),this.showNavigator&&(this.navigator=new e.Navigator({id:this.navigatorId,position:this.navigatorPosition,sizeRatio:this.navigatorSizeRatio,maintainSizeRatio:this.navigatorMaintainSizeRatio,top:this.navigatorTop,left:this.navigatorLeft,width:this.navigatorWidth,height:this.navigatorHeight,autoResize:this.navigatorAutoResize,autoFade:this.navigatorAutoFade,prefixUrl:this.prefixUrl,viewer:this,navigatorRotate:this.navigatorRotate,background:this.navigatorBackground,opacity:this.navigatorOpacity,borderColor:this.navigatorBorderColor,displayRegionColor:this.navigatorDisplayRegionColor,crossOriginPolicy:this.crossOriginPolicy})),this.sequenceMode&&this.bindSequenceControls(),this.tileSources&&this.open(this.tileSources),N=0;N-1&&p.index=0&&p=0)return this;var J=a(this,L);return this.currentOverlays.push(J),J.drawHTML(this.overlaysContainer,this.viewport),this.raiseEvent("add-overlay",{element:p,location:L.location,placement:L.placement}),this},updateOverlay:function(p,_,R){var N;return p=e.getElement(p),N=l(this.currentOverlays,p),N>=0&&(this.currentOverlays[N].update(_,R),n[this.hash].forceRedraw=!0,this.raiseEvent("update-overlay",{element:p,location:_,placement:R})),this},removeOverlay:function(p){var _;return p=e.getElement(p),_=l(this.currentOverlays,p),_>=0&&(this.currentOverlays[_].destroy(),this.currentOverlays.splice(_,1),n[this.hash].forceRedraw=!0,this.raiseEvent("remove-overlay",{element:p})),this},clearOverlays:function(){for(;this.currentOverlays.length>0;)this.currentOverlays.pop().destroy();return n[this.hash].forceRedraw=!0,this.raiseEvent("clear-overlay",{}),this},getOverlayById:function(p){var _;return p=e.getElement(p),_=l(this.currentOverlays,p),_>=0?this.currentOverlays[_]:null},_updateSequenceButtons:function(p){this.nextButton&&(!this.tileSources||this.tileSources.length-1===p?this.navPrevNextWrap||this.nextButton.disable():this.nextButton.enable()),this.previousButton&&(p>0?this.previousButton.enable():this.navPrevNextWrap||this.previousButton.disable())},_showMessage:function(p){this._hideMessage();var _=e.makeNeutralElement("div");_.appendChild(document.createTextNode(p)),this.messageDiv=e.makeCenteredNode(_),e.addClass(this.messageDiv,"openseadragon-message"),this.container.appendChild(this.messageDiv)},_hideMessage:function(){var p=this.messageDiv;p&&(p.parentNode.removeChild(p),delete this.messageDiv)},gestureSettingsByDeviceType:function(p){switch(p){case"mouse":return this.gestureSettingsMouse;case"touch":return this.gestureSettingsTouch;case"pen":return this.gestureSettingsPen;default:return this.gestureSettingsUnknown}},_drawOverlays:function(){var p,_=this.currentOverlays.length;for(p=0;p<_;p++)this.currentOverlays[p].drawHTML(this.overlaysContainer,this.viewport)},_cancelPendingImages:function(){this._loadQueue=[]},removeReferenceStrip:function(){this.showReferenceStrip=!1,this.referenceStrip&&(this.referenceStrip.destroy(),this.referenceStrip=null)},addReferenceStrip:function(){if(this.showReferenceStrip=!0,this.sequenceMode){if(this.referenceStrip)return;this.tileSources.length&&this.tileSources.length>1&&(this.referenceStrip=new e.ReferenceStrip({id:this.referenceStripElement,position:this.referenceStripPosition,sizeRatio:this.referenceStripSizeRatio,scroll:this.referenceStripScroll,height:this.referenceStripHeight,width:this.referenceStripWidth,tileSources:this.tileSources,prefixUrl:this.prefixUrl,useCanvas:this.useCanvas,viewer:this}),this.referenceStrip.setFocus(this._sequenceIndex))}else e.console.warn('Attempting to display a reference strip while "sequenceMode" is off.')},_addUpdatePixelDensityRatioEvent:function(){this._updatePixelDensityRatioBind=this._updatePixelDensityRatio.bind(this),e.addEvent(window,"resize",this._updatePixelDensityRatioBind)},_removeUpdatePixelDensityRatioEvent:function(){e.removeEvent(window,"resize",this._updatePixelDensityRatioBind)},_updatePixelDensityRatio:function(){var p=e.pixelDensityRatio,_=e.getCurrentPixelDensityRatio();p!==_&&(e.pixelDensityRatio=_,this.world.resetItems(),this.forceRedraw())},goToPreviousPage:function(){var p=this._sequenceIndex-1;this.navPrevNextWrap&&p<0&&(p+=this.tileSources.length),this.goToPage(p)},goToNextPage:function(){var p=this._sequenceIndex+1;this.navPrevNextWrap&&p>=this.tileSources.length&&(p=0),this.goToPage(p)}});function o(p){return p=e.getElement(p),new e.Point(p.clientWidth===0?1:p.clientWidth,p.clientHeight===0?1:p.clientHeight)}function s(p,_,R,N,L){var J=p;if(e.type(_)==="string"){if(_.match(/^\s*<.*>\s*$/))_=e.parseXml(_);else if(_.match(/^\s*[{[].*[}\]]\s*$/))try{var q=e.parseJSON(_);_=q}catch{}}function fe(Se,ge){Se.ready?N(Se):(Se.addHandler("ready",function(){N(Se)}),Se.addHandler("open-failed",function(oe){L({message:oe.message,source:ge})}))}setTimeout(function(){if(e.type(_)==="string")_=new e.TileSource({url:_,crossOriginPolicy:R.crossOriginPolicy!==void 0?R.crossOriginPolicy:p.crossOriginPolicy,ajaxWithCredentials:p.ajaxWithCredentials,ajaxHeaders:R.ajaxHeaders?R.ajaxHeaders:p.ajaxHeaders,useCanvas:p.useCanvas,success:function(Te){N(Te.tileSource)}}),_.addHandler("open-failed",function(Te){L(Te)});else if(e.isPlainObject(_)||_.nodeType)if(_.crossOriginPolicy===void 0&&(R.crossOriginPolicy!==void 0||p.crossOriginPolicy!==void 0)&&(_.crossOriginPolicy=R.crossOriginPolicy!==void 0?R.crossOriginPolicy:p.crossOriginPolicy),_.ajaxWithCredentials===void 0&&(_.ajaxWithCredentials=p.ajaxWithCredentials),_.useCanvas===void 0&&(_.useCanvas=p.useCanvas),e.isFunction(_.getTileUrl)){var Se=new e.TileSource(_);Se.getTileUrl=_.getTileUrl,N(Se)}else{var ge=e.TileSource.determineType(J,_);if(!ge){L({message:"Unable to load TileSource",source:_});return}var oe=ge.prototype.configure.apply(J,[_]);fe(new ge(oe),_)}else fe(_,_)})}function a(p,_){if(_ instanceof e.Overlay)return _;var R=null;if(_.element)R=e.getElement(_.element);else{var N=_.id?_.id:"openseadragon-overlay-"+Math.floor(Math.random()*1e7);R=e.getElement(_.id),R||(R=document.createElement("a"),R.href="#/overlay/"+N),R.id=N,e.addClass(R,_.className?_.className:"openseadragon-overlay")}var L=_.location,J=_.width,q=_.height;if(!L){var fe=_.x,Se=_.y;if(_.px!==void 0){var ge=p.viewport.imageToViewportRectangle(new e.Rect(_.px,_.py,J||0,q||0));fe=ge.x,Se=ge.y,J=J!==void 0?ge.width:void 0,q=q!==void 0?ge.height:void 0}L=new e.Point(fe,Se)}var oe=_.placement;return oe&&e.type(oe)==="string"&&(oe=e.Placement[_.placement.toUpperCase()]),new e.Overlay({element:R,location:L,placement:oe,onDraw:_.onDraw,checkResize:_.checkResize,width:J,height:q,rotationMode:_.rotationMode})}function l(p,_){var R;for(R=p.length-1;R>=0;R--)if(p[R].element===_)return R;return-1}function u(p,_){return e.requestAnimationFrame(function(){_(p)})}function c(p){e.requestAnimationFrame(function(){d(p)})}function h(p){!p.autoHideControls||(p.controlsShouldFade=!0,p.controlsFadeBeginTime=e.now()+p.controlsFadeDelay,window.setTimeout(function(){c(p)},p.controlsFadeDelay))}function d(p){var _,R,N,L;if(p.controlsShouldFade){for(_=e.now(),R=_-p.controlsFadeBeginTime,N=1-R/p.controlsFadeLength,N=Math.min(1,N),N=Math.max(0,N),L=p.controls.length-1;L>=0;L--)p.controls[L].autoFade&&p.controls[L].setOpacity(N);N>0&&c(p)}}function g(p){var _;for(p.controlsShouldFade=!1,_=p.controls.length-1;_>=0;_--)p.controls[_].setOpacity(1)}function y(){g(this)}function x(){h(this)}function b(p){var _={tracker:p.eventSource,position:p.position,originalEvent:p.originalEvent,preventDefault:p.preventDefault};this.raiseEvent("canvas-contextmenu",_),p.preventDefault=_.preventDefault}function T(p){var _={originalEvent:p.originalEvent,preventDefaultAction:!1,preventVerticalPan:p.preventVerticalPan,preventHorizontalPan:p.preventHorizontalPan};if(this.raiseEvent("canvas-key",_),!_.preventDefaultAction&&!p.ctrl&&!p.alt&&!p.meta)switch(p.keyCode){case 38:_.preventVerticalPan||(p.shift?this.viewport.zoomBy(1.1):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new e.Point(0,-this.pixelsPerArrowPress))),this.viewport.applyConstraints()),p.preventDefault=!0;break;case 40:_.preventVerticalPan||(p.shift?this.viewport.zoomBy(.9):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new e.Point(0,this.pixelsPerArrowPress))),this.viewport.applyConstraints()),p.preventDefault=!0;break;case 37:_.preventHorizontalPan||(this.viewport.panBy(this.viewport.deltaPointsFromPixels(new e.Point(-this.pixelsPerArrowPress,0))),this.viewport.applyConstraints()),p.preventDefault=!0;break;case 39:_.preventHorizontalPan||(this.viewport.panBy(this.viewport.deltaPointsFromPixels(new e.Point(this.pixelsPerArrowPress,0))),this.viewport.applyConstraints()),p.preventDefault=!0;break;default:p.preventDefault=!1;break}else p.preventDefault=!1}function f(p){var _={originalEvent:p.originalEvent,preventDefaultAction:!1,preventVerticalPan:p.preventVerticalPan,preventHorizontalPan:p.preventHorizontalPan};if(this.raiseEvent("canvas-key",_),!_.preventDefaultAction&&!p.ctrl&&!p.alt&&!p.meta)switch(p.keyCode){case 43:case 61:this.viewport.zoomBy(1.1),this.viewport.applyConstraints(),p.preventDefault=!0;break;case 45:this.viewport.zoomBy(.9),this.viewport.applyConstraints(),p.preventDefault=!0;break;case 48:this.viewport.goHome(),this.viewport.applyConstraints(),p.preventDefault=!0;break;case 119:case 87:_.preventVerticalPan||(p.shift?this.viewport.zoomBy(1.1):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new e.Point(0,-40))),this.viewport.applyConstraints()),p.preventDefault=!0;break;case 115:case 83:_.preventVerticalPan||(p.shift?this.viewport.zoomBy(.9):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new e.Point(0,40))),this.viewport.applyConstraints()),p.preventDefault=!0;break;case 97:_.preventHorizontalPan||(this.viewport.panBy(this.viewport.deltaPointsFromPixels(new e.Point(-40,0))),this.viewport.applyConstraints()),p.preventDefault=!0;break;case 100:_.preventHorizontalPan||(this.viewport.panBy(this.viewport.deltaPointsFromPixels(new e.Point(40,0))),this.viewport.applyConstraints()),p.preventDefault=!0;break;case 114:this.viewport.flipped?this.viewport.setRotation(e.positiveModulo(this.viewport.degrees-this.rotationIncrement,360)):this.viewport.setRotation(e.positiveModulo(this.viewport.degrees+this.rotationIncrement,360)),this.viewport.applyConstraints(),p.preventDefault=!0;break;case 82:this.viewport.flipped?this.viewport.setRotation(e.positiveModulo(this.viewport.degrees+this.rotationIncrement,360)):this.viewport.setRotation(e.positiveModulo(this.viewport.degrees-this.rotationIncrement,360)),this.viewport.applyConstraints(),p.preventDefault=!0;break;case 102:this.viewport.toggleFlip(),p.preventDefault=!0;break;case 106:this.goToPreviousPage();break;case 107:this.goToNextPage();break;default:p.preventDefault=!1;break}else p.preventDefault=!1}function E(p){var _,R=document.activeElement===this.canvas;R||this.canvas.focus(),this.viewport.flipped&&(p.position.x=this.viewport.getContainerSize().x-p.position.x);var N={tracker:p.eventSource,position:p.position,quick:p.quick,shift:p.shift,originalEvent:p.originalEvent,originalTarget:p.originalTarget,preventDefaultAction:!1};this.raiseEvent("canvas-click",N),!N.preventDefaultAction&&this.viewport&&p.quick&&(_=this.gestureSettingsByDeviceType(p.pointerType),_.clickToZoom&&(this.viewport.zoomBy(p.shift?1/this.zoomPerClick:this.zoomPerClick,_.zoomToRefPoint?this.viewport.pointFromPixel(p.position,!0):null),this.viewport.applyConstraints()))}function A(p){var _,R={tracker:p.eventSource,position:p.position,shift:p.shift,originalEvent:p.originalEvent,preventDefaultAction:!1};this.raiseEvent("canvas-double-click",R),!R.preventDefaultAction&&this.viewport&&(_=this.gestureSettingsByDeviceType(p.pointerType),_.dblClickToZoom&&(this.viewport.zoomBy(p.shift?1/this.zoomPerClick:this.zoomPerClick,_.zoomToRefPoint?this.viewport.pointFromPixel(p.position,!0):null),this.viewport.applyConstraints()))}function C(p){var _,R={tracker:p.eventSource,pointerType:p.pointerType,position:p.position,delta:p.delta,speed:p.speed,direction:p.direction,shift:p.shift,originalEvent:p.originalEvent,preventDefaultAction:!1};if(this.raiseEvent("canvas-drag",R),_=this.gestureSettingsByDeviceType(p.pointerType),_.dragToPan&&!R.preventDefaultAction&&this.viewport){if(this.panHorizontal||(p.delta.x=0),this.panVertical||(p.delta.y=0),this.viewport.flipped&&(p.delta.x=-p.delta.x),this.constrainDuringPan){var N=this.viewport.deltaPointsFromPixels(p.delta.negate());this.viewport.centerSpringX.target.value+=N.x,this.viewport.centerSpringY.target.value+=N.y;var L=this.viewport.getBounds(),J=this.viewport.getConstrainedBounds();this.viewport.centerSpringX.target.value-=N.x,this.viewport.centerSpringY.target.value-=N.y,L.x!==J.x&&(p.delta.x=0),L.y!==J.y&&(p.delta.y=0)}this.viewport.panBy(this.viewport.deltaPointsFromPixels(p.delta.negate()),_.flickEnabled&&!this.constrainDuringPan)}}function O(p){var _={tracker:p.eventSource,pointerType:p.pointerType,position:p.position,speed:p.speed,direction:p.direction,shift:p.shift,originalEvent:p.originalEvent,preventDefaultAction:!1};if(this.raiseEvent("canvas-drag-end",_),!_.preventDefaultAction&&this.viewport){var R=this.gestureSettingsByDeviceType(p.pointerType);if(R.flickEnabled&&p.speed>=R.flickMinSpeed){var N=0;this.panHorizontal&&(N=R.flickMomentum*p.speed*Math.cos(p.direction));var L=0;this.panVertical&&(L=R.flickMomentum*p.speed*Math.sin(p.direction));var J=this.viewport.pixelFromPoint(this.viewport.getCenter(!0)),q=this.viewport.pointFromPixel(new e.Point(J.x-N,J.y-L));this.viewport.panTo(q,!1)}this.viewport.applyConstraints()}}function D(p){this.raiseEvent("canvas-enter",{tracker:p.eventSource,pointerType:p.pointerType,position:p.position,buttons:p.buttons,pointers:p.pointers,insideElementPressed:p.insideElementPressed,buttonDownAny:p.buttonDownAny,originalEvent:p.originalEvent})}function I(p){this.raiseEvent("canvas-exit",{tracker:p.eventSource,pointerType:p.pointerType,position:p.position,buttons:p.buttons,pointers:p.pointers,insideElementPressed:p.insideElementPressed,buttonDownAny:p.buttonDownAny,originalEvent:p.originalEvent})}function B(p){this.raiseEvent("canvas-press",{tracker:p.eventSource,pointerType:p.pointerType,position:p.position,insideElementPressed:p.insideElementPressed,insideElementReleased:p.insideElementReleased,originalEvent:p.originalEvent})}function Z(p){this.raiseEvent("canvas-release",{tracker:p.eventSource,pointerType:p.pointerType,position:p.position,insideElementPressed:p.insideElementPressed,insideElementReleased:p.insideElementReleased,originalEvent:p.originalEvent})}function Y(p){this.raiseEvent("canvas-nonprimary-press",{tracker:p.eventSource,position:p.position,pointerType:p.pointerType,button:p.button,buttons:p.buttons,originalEvent:p.originalEvent})}function V(p){this.raiseEvent("canvas-nonprimary-release",{tracker:p.eventSource,position:p.position,pointerType:p.pointerType,button:p.button,buttons:p.buttons,originalEvent:p.originalEvent})}function K(p){var _,R,N,L,J={tracker:p.eventSource,pointerType:p.pointerType,gesturePoints:p.gesturePoints,lastCenter:p.lastCenter,center:p.center,lastDistance:p.lastDistance,distance:p.distance,shift:p.shift,originalEvent:p.originalEvent,preventDefaultPanAction:!1,preventDefaultZoomAction:!1,preventDefaultRotateAction:!1};if(this.raiseEvent("canvas-pinch",J),this.viewport&&(_=this.gestureSettingsByDeviceType(p.pointerType),_.pinchToZoom&&(!J.preventDefaultPanAction||!J.preventDefaultZoomAction)&&(R=this.viewport.pointFromPixel(p.center,!0),J.preventDefaultZoomAction||this.viewport.zoomBy(p.distance/p.lastDistance,R,!0),_.zoomToRefPoint&&!J.preventDefaultPanAction&&(N=this.viewport.pointFromPixel(p.lastCenter,!0),L=N.minus(R),this.panHorizontal||(L.x=0),this.panVertical||(L.y=0),this.viewport.panBy(L,!0)),this.viewport.applyConstraints()),_.pinchRotate&&!J.preventDefaultRotateAction)){var q=Math.atan2(p.gesturePoints[0].currentPos.y-p.gesturePoints[1].currentPos.y,p.gesturePoints[0].currentPos.x-p.gesturePoints[1].currentPos.x),fe=Math.atan2(p.gesturePoints[0].lastPos.y-p.gesturePoints[1].lastPos.y,p.gesturePoints[0].lastPos.x-p.gesturePoints[1].lastPos.x);this.viewport.setRotation(this.viewport.getRotation()+(q-fe)*(180/Math.PI))}}function Q(p){var _,R,N,L,J;L=e.now(),J=L-this._lastScrollTime,J>this.minScrollDeltaTime?(this._lastScrollTime=L,_={tracker:p.eventSource,position:p.position,scroll:p.scroll,shift:p.shift,originalEvent:p.originalEvent,preventDefaultAction:!1,preventDefault:!0},this.raiseEvent("canvas-scroll",_),!_.preventDefaultAction&&this.viewport&&(this.viewport.flipped&&(p.position.x=this.viewport.getContainerSize().x-p.position.x),R=this.gestureSettingsByDeviceType(p.pointerType),R.scrollToZoom&&(N=Math.pow(this.zoomPerScroll,p.scroll),this.viewport.zoomBy(N,R.zoomToRefPoint?this.viewport.pointFromPixel(p.position,!0):null),this.viewport.applyConstraints())),p.preventDefault=_.preventDefault):p.preventDefault=!0}function le(p){n[this.hash].mouseInside=!0,g(this),this.raiseEvent("container-enter",{tracker:p.eventSource,pointerType:p.pointerType,position:p.position,buttons:p.buttons,pointers:p.pointers,insideElementPressed:p.insideElementPressed,buttonDownAny:p.buttonDownAny,originalEvent:p.originalEvent})}function re(p){p.pointers<1&&(n[this.hash].mouseInside=!1,n[this.hash].animating||h(this)),this.raiseEvent("container-exit",{tracker:p.eventSource,pointerType:p.pointerType,position:p.position,buttons:p.buttons,pointers:p.pointers,insideElementPressed:p.insideElementPressed,buttonDownAny:p.buttonDownAny,originalEvent:p.originalEvent})}function se(p){de(p),p.isOpen()?p._updateRequestId=u(p,se):p._updateRequestId=!1}function de(p){if(!(p._opening||!n[p.hash])){if(p.autoResize){var _=o(p.container),R=n[p.hash].prevContainerSize;if(!_.equals(R)){var N=p.viewport;if(p.preserveImageSizeOnResize){var L=R.x/_.x,J=N.getZoom()*L,q=N.getCenter();N.resize(_,!1),N.zoomTo(J,null,!0),N.panTo(q,!0)}else{var fe=N.getBounds();N.resize(_,!0),N.fitBoundsWithConstraints(fe,!0)}n[p.hash].prevContainerSize=_,n[p.hash].forceRedraw=!0}}var Se=p.viewport.update(),ge=p.world.update()||Se;Se&&p.raiseEvent("viewport-change"),p.referenceStrip&&(ge=p.referenceStrip.update(p.viewport)||ge),!n[p.hash].animating&&ge&&(p.raiseEvent("animation-start"),g(p)),(ge||n[p.hash].forceRedraw||p.world.needsDraw())&&(pe(p),p._drawOverlays(),p.navigator&&p.navigator.update(p.viewport),n[p.hash].forceRedraw=!1,ge&&p.raiseEvent("animation")),n[p.hash].animating&&!ge&&(p.raiseEvent("animation-finish"),n[p.hash].mouseInside||h(p)),n[p.hash].animating=ge}}function pe(p){p.imageLoader.clear(),p.drawer.clear(),p.world.draw(),p.raiseEvent("update-viewport",{})}function G(p,_){return p?p+_:_}function Me(){n[this.hash].lastZoomTime=e.now(),n[this.hash].zoomFactor=this.zoomPerSecond,n[this.hash].zooming=!0,U(this)}function F(){n[this.hash].lastZoomTime=e.now(),n[this.hash].zoomFactor=1/this.zoomPerSecond,n[this.hash].zooming=!0,U(this)}function H(){n[this.hash].zooming=!1}function U(p){e.requestAnimationFrame(e.delegate(p,W))}function W(){var p,_,R;n[this.hash].zooming&&this.viewport&&(p=e.now(),_=p-n[this.hash].lastZoomTime,R=Math.pow(n[this.hash].zoomFactor,_/1e3),this.viewport.zoomBy(R),this.viewport.applyConstraints(),n[this.hash].lastZoomTime=p,U(this))}function j(){this.viewport&&(n[this.hash].zooming=!1,this.viewport.zoomBy(this.zoomPerClick/1),this.viewport.applyConstraints())}function $(){this.viewport&&(n[this.hash].zooming=!1,this.viewport.zoomBy(1/this.zoomPerClick),this.viewport.applyConstraints())}function ae(){this.buttonGroup&&(this.buttonGroup.emulateEnter(),this.buttonGroup.emulateLeave())}function we(){this.viewport&&this.viewport.goHome()}function me(){this.isFullPage()&&!e.isFullScreen()?this.setFullPage(!1):this.setFullScreen(!this.isFullPage()),this.buttonGroup&&this.buttonGroup.emulateLeave(),this.fullPageButton.element.focus(),this.viewport&&this.viewport.applyConstraints()}function Qe(){if(this.viewport){var p=this.viewport.getRotation();this.viewport.flipped?p=e.positiveModulo(p+this.rotationIncrement,360):p=e.positiveModulo(p-this.rotationIncrement,360),this.viewport.setRotation(p)}}function $e(){if(this.viewport){var p=this.viewport.getRotation();this.viewport.flipped?p=e.positiveModulo(p-this.rotationIncrement,360):p=e.positiveModulo(p+this.rotationIncrement,360),this.viewport.setRotation(p)}}function et(){this.viewport.toggleFlip()}}(t),function(e){e.Navigator=function(u){var c=u.viewer,h=this,d,g;u.id?(this.element=document.getElementById(u.id),u.controlOptions={anchor:e.ControlAnchor.NONE,attachToViewer:!1,autoFade:!1}):(u.id="navigator-"+e.now(),this.element=e.makeNeutralElement("div"),u.controlOptions={anchor:e.ControlAnchor.TOP_RIGHT,attachToViewer:!0,autoFade:u.autoFade},u.position&&(u.position==="BOTTOM_RIGHT"?u.controlOptions.anchor=e.ControlAnchor.BOTTOM_RIGHT:u.position==="BOTTOM_LEFT"?u.controlOptions.anchor=e.ControlAnchor.BOTTOM_LEFT:u.position==="TOP_RIGHT"?u.controlOptions.anchor=e.ControlAnchor.TOP_RIGHT:u.position==="TOP_LEFT"?u.controlOptions.anchor=e.ControlAnchor.TOP_LEFT:u.position==="ABSOLUTE"&&(u.controlOptions.anchor=e.ControlAnchor.ABSOLUTE,u.controlOptions.top=u.top,u.controlOptions.left=u.left,u.controlOptions.height=u.height,u.controlOptions.width=u.width))),this.element.id=u.id,this.element.className+=" navigator",u=e.extend(!0,{sizeRatio:e.DEFAULT_SETTINGS.navigatorSizeRatio},u,{element:this.element,tabIndex:-1,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:0,autoResize:u.autoResize,minZoomImageRatio:1,background:u.background,opacity:u.opacity,borderColor:u.borderColor,displayRegionColor:u.displayRegionColor}),u.minPixelRatio=this.minPixelRatio=c.minPixelRatio,e.setElementTouchActionNone(this.element),this.borderWidth=2,this.fudge=new e.Point(1,1),this.totalBorderWidths=new e.Point(this.borderWidth*2,this.borderWidth*2).minus(this.fudge),u.controlOptions.anchor!==e.ControlAnchor.NONE&&function(b,T){b.margin="0px",b.border=T+"px solid "+u.borderColor,b.padding="0px",b.background=u.background,b.opacity=u.opacity,b.overflow="hidden"}(this.element.style,this.borderWidth),this.displayRegion=e.makeNeutralElement("div"),this.displayRegion.id=this.element.id+"-displayregion",this.displayRegion.className="displayregion",function(b,T){b.position="relative",b.top="0px",b.left="0px",b.fontSize="0px",b.overflow="hidden",b.border=T+"px solid "+u.displayRegionColor,b.margin="0px",b.padding="0px",b.background="transparent",b.float="left",b.cssFloat="left",b.styleFloat="left",b.zIndex=999999999,b.cursor="default"}(this.displayRegion.style,this.borderWidth),e.setElementPointerEventsNone(this.displayRegion),e.setElementTouchActionNone(this.displayRegion),this.displayRegionContainer=e.makeNeutralElement("div"),this.displayRegionContainer.id=this.element.id+"-displayregioncontainer",this.displayRegionContainer.className="displayregioncontainer",this.displayRegionContainer.style.width="100%",this.displayRegionContainer.style.height="100%",e.setElementPointerEventsNone(this.displayRegionContainer),e.setElementTouchActionNone(this.displayRegionContainer),c.addControl(this.element,u.controlOptions),this._resizeWithViewer=u.controlOptions.anchor!==e.ControlAnchor.ABSOLUTE&&u.controlOptions.anchor!==e.ControlAnchor.NONE,u.width&&u.height?(this.setWidth(u.width),this.setHeight(u.height)):this._resizeWithViewer&&(d=e.getElementSize(c.element),this.element.style.height=Math.round(d.y*u.sizeRatio)+"px",this.element.style.width=Math.round(d.x*u.sizeRatio)+"px",this.oldViewerSize=d,g=e.getElementSize(this.element),this.elementArea=g.x*g.y),this.oldContainerSize=new e.Point(0,0),e.Viewer.apply(this,[u]),this.displayRegionContainer.appendChild(this.displayRegion),this.element.getElementsByTagName("div")[0].appendChild(this.displayRegionContainer);function y(b){a(h.displayRegionContainer,b),a(h.displayRegion,-b),h.viewport.setRotation(b)}if(u.navigatorRotate){var x=u.viewer.viewport?u.viewer.viewport.getRotation():u.viewer.degrees||0;y(x),u.viewer.addHandler("rotate",function(b){y(b.degrees)})}this.innerTracker.destroy(),this.innerTracker=new e.MouseTracker({userData:"Navigator.innerTracker",element:this.element,dragHandler:e.delegate(this,r),clickHandler:e.delegate(this,n),releaseHandler:e.delegate(this,o),scrollHandler:e.delegate(this,s),preProcessEventHandler:function(b){b.eventType==="wheel"&&(b.preventDefault=!0)}}),this.outerTracker.userData="Navigator.outerTracker",e.setElementPointerEventsNone(this.canvas),e.setElementPointerEventsNone(this.container),this.addHandler("reset-size",function(){h.viewport&&h.viewport.goHome(!0)}),c.world.addHandler("item-index-change",function(b){window.setTimeout(function(){var T=h.world.getItemAt(b.previousIndex);h.world.setItemIndex(T,b.newIndex)},1)}),c.world.addHandler("remove-item",function(b){var T=b.item,f=h._getMatchingItem(T);f&&h.world.removeItem(f)}),this.update(c.viewport)},e.extend(e.Navigator.prototype,e.EventSource.prototype,e.Viewer.prototype,{updateSize:function(){if(this.viewport){var u=new e.Point(this.container.clientWidth===0?1:this.container.clientWidth,this.container.clientHeight===0?1:this.container.clientHeight);u.equals(this.oldContainerSize)||(this.viewport.resize(u,!0),this.viewport.goHome(!0),this.oldContainerSize=u,this.drawer.clear(),this.world.draw())}},setWidth:function(u){this.width=u,this.element.style.width=typeof u=="number"?u+"px":u,this._resizeWithViewer=!1},setHeight:function(u){this.height=u,this.element.style.height=typeof u=="number"?u+"px":u,this._resizeWithViewer=!1},setFlip:function(u){return this.viewport.setFlip(u),this.setDisplayTransform(this.viewer.viewport.getFlip()?"scale(-1,1)":"scale(1,1)"),this},setDisplayTransform:function(u){l(this.displayRegion,u),l(this.canvas,u),l(this.element,u)},update:function(u){var c,h,d,g,y,x;if(c=e.getElementSize(this.viewer.element),this._resizeWithViewer&&c.x&&c.y&&!c.equals(this.oldViewerSize)&&(this.oldViewerSize=c,this.maintainSizeRatio||!this.elementArea?(h=c.x*this.sizeRatio,d=c.y*this.sizeRatio):(h=Math.sqrt(this.elementArea*(c.x/c.y)),d=this.elementArea/h),this.element.style.width=Math.round(h)+"px",this.element.style.height=Math.round(d)+"px",this.elementArea||(this.elementArea=h*d),this.updateSize()),u&&this.viewport){g=u.getBoundsNoRotate(!0),y=this.viewport.pixelFromPointNoRotate(g.getTopLeft(),!1),x=this.viewport.pixelFromPointNoRotate(g.getBottomRight(),!1).minus(this.totalBorderWidths);var b=this.displayRegion.style;b.display=this.world.getItemCount()?"block":"none",b.top=Math.round(y.y)+"px",b.left=Math.round(y.x)+"px";var T=Math.abs(y.x-x.x),f=Math.abs(y.y-x.y);b.width=Math.round(Math.max(T,0))+"px",b.height=Math.round(Math.max(f,0))+"px"}},addTiledImage:function(u){var c=this,h=u.originalTiledImage;delete u.original;var d=e.extend({},u,{success:function(g){var y=g.item;y._originalForNavigator=h,c._matchBounds(y,h,!0),c._matchOpacity(y,h),c._matchCompositeOperation(y,h);function x(){c._matchBounds(y,h)}function b(){c._matchOpacity(y,h)}function T(){c._matchCompositeOperation(y,h)}h.addHandler("bounds-change",x),h.addHandler("clip-change",x),h.addHandler("opacity-change",b),h.addHandler("composite-operation-change",T)}});return e.Viewer.prototype.addTiledImage.apply(this,[d])},destroy:function(){return e.Viewer.prototype.destroy.apply(this)},_getMatchingItem:function(u){for(var c=this.world.getItemCount(),h,d=0;d1||o.y>1));r++);return r-1},getTileAtPoint:function(r,o){var s=o.x>=0&&o.x<=1&&o.y>=0&&o.y<=1/this.aspectRatio;e.console.assert(s,"[TileSource.getTileAtPoint] must be called with a valid point.");var a=this.dimensions.x*this.getLevelScale(r),l=o.x*a,u=o.y*a,c=Math.floor(l/this.getTileWidth(r)),h=Math.floor(u/this.getTileHeight(r));o.x>=1&&(c=this.getNumTiles(r).x-1);var d=1e-15;return o.y>=1/this.aspectRatio-d&&(h=this.getNumTiles(r).y-1),new e.Point(c,h)},getTileBounds:function(r,o,s,a){var l=this.dimensions.times(this.getLevelScale(r)),u=this.getTileWidth(r),c=this.getTileHeight(r),h=o===0?0:u*o-this.tileOverlap,d=s===0?0:c*s-this.tileOverlap,g=u+(o===0?1:2)*this.tileOverlap,y=c+(s===0?1:2)*this.tileOverlap,x=1/l.x;return g=Math.min(g,l.x-h),y=Math.min(y,l.y-d),a?new e.Rect(0,0,g,y):new e.Rect(h*x,d*x,g*x,y*x)},getImageInfo:function(r){var o=this,s,a,l,u,c,h,d;r&&(c=r.split("/"),h=c[c.length-1],d=h.lastIndexOf("."),d>-1&&(c[c.length-1]=h.slice(0,d))),a=function(g){typeof g=="string"&&(g=e.parseXml(g));var y=e.TileSource.determineType(o,g,r);if(!y){o.raiseEvent("open-failed",{message:"Unable to load TileSource",source:r});return}u=y.prototype.configure.apply(o,[g,r]),u.ajaxWithCredentials===void 0&&(u.ajaxWithCredentials=o.ajaxWithCredentials),l=new y(u),o.ready=!0,o.raiseEvent("ready",{tileSource:l})},r.match(/\.js$/)?(s=r.split("/").pop().replace(".js",""),e.jsonp({url:r,async:!1,callbackName:s,callback:a})):e.makeAjaxRequest({url:r,withCredentials:this.ajaxWithCredentials,headers:this.ajaxHeaders,success:function(g){var y=n(g);a(y)},error:function(g,y){var x;try{x="HTTP "+g.status+" attempting to load TileSource"}catch{var b;typeof y=="undefined"||!y.toString?b="Unknown error":b=y.toString(),x=b+" attempting to load TileSource"}o.raiseEvent("open-failed",{message:x,source:r})}})},supports:function(r,o){return!1},configure:function(r,o){throw new Error("Method not implemented.")},getTileUrl:function(r,o,s){throw new Error("Method not implemented.")},getTileAjaxHeaders:function(r,o,s){return{}},tileExists:function(r,o,s){var a=this.getNumTiles(r);return r>=this.minLevel&&r<=this.maxLevel&&o>=0&&s>=0&&o=0;y--)for(x=this.displayRects[y],b=x.minLevel;b<=x.maxLevel;b++)this._levelRects[b]||(this._levelRects[b]=[]),this._levelRects[b].push(x);e.TileSource.apply(this,[T])},e.extend(e.DziTileSource.prototype,e.TileSource.prototype,{supports:function(o,s){var a;return o.Image?a=o.Image.xmlns:o.documentElement&&(o.documentElement.localName==="Image"||o.documentElement.tagName==="Image")&&(a=o.documentElement.namespaceURI),a=(a||"").toLowerCase(),a.indexOf("schemas.microsoft.com/deepzoom/2008")!==-1||a.indexOf("schemas.microsoft.com/deepzoom/2009")!==-1},configure:function(o,s){var a;return e.isPlainObject(o)?a=r(this,o):a=n(this,o),s&&!a.tilesUrl&&(a.tilesUrl=s.replace(/([^/]+?)(\.(dzi|xml|js)?(\?[^/]*)?)?\/?$/,"$1_files/"),s.search(/\.(dzi|xml|js)\?/)!==-1?a.queryParams=s.match(/\?.*/):a.queryParams=""),a},getTileUrl:function(o,s,a){return[this.tilesUrl,o,"/",s,"_",a,".",this.fileFormat,this.queryParams].join("")},tileExists:function(o,s,a){var l=this._levelRects[o],u,c,h,d,g,y,x;if(this.minLevel&&othis.maxLevel)return!1;if(!l||!l.length)return!0;for(x=l.length-1;x>=0;x--)if(u=l[x],!(ou.maxLevel)&&(c=this.getLevelScale(o),h=u.x*c,d=u.y*c,g=h+u.width*c,y=d+u.height*c,h=Math.floor(h/this._tileWidth),d=Math.floor(d/this._tileWidth),g=Math.ceil(g/this._tileWidth),y=Math.ceil(y/this._tileWidth),h<=s&&s0?a.tileSize=Math.max.apply(null,g):a.tileSize=h}else this.sizes&&this.sizes.length>0?(this.emulateLegacyImagePyramid=!0,a.levels=r(this),e.extend(!0,a,{width:a.levels[a.levels.length-1].width,height:a.levels[a.levels.length-1].height,tileSize:Math.max(a.height,a.width),tileOverlap:0,minLevel:0,maxLevel:a.levels.length-1}),this.levels=a.levels):e.console.error("Nothing in the info.json to construct image pyramids from");if(!a.maxLevel&&!this.emulateLegacyImagePyramid)if(!this.scale_factors)a.maxLevel=Number(Math.ceil(Math.log(Math.max(this.width,this.height),2)));else{var x=Math.max.apply(null,this.scale_factors);a.maxLevel=Math.round(Math.log(x)*Math.LOG2E)}e.TileSource.apply(this,[a])},e.extend(e.IIIFTileSource.prototype,e.TileSource.prototype,{supports:function(a,l){return a.protocol&&a.protocol==="http://iiif.io/api/image"||a["@context"]&&(a["@context"]==="http://library.stanford.edu/iiif/image-api/1.1/context.json"||a["@context"]==="http://iiif.io/api/image/1/context.json")||a.profile&&a.profile.indexOf("http://library.stanford.edu/iiif/image-api/compliance.html")===0||a.identifier&&a.width&&a.height?!0:!!(a.documentElement&&a.documentElement.tagName==="info"&&a.documentElement.namespaceURI==="http://library.stanford.edu/iiif/image-api/ns/")},configure:function(a,l){if(e.isPlainObject(a)){if(!a["@context"])a["@context"]="http://iiif.io/api/image/1.0/context.json",a["@id"]=l.replace("/info.json",""),a.version=1;else{var c=a["@context"];if(Array.isArray(c)){for(var h=0;h0&&a>=this.minLevel&&a<=this.maxLevel&&(l=this.levels[a].width/this.levels[this.maxLevel].width),l}return e.TileSource.prototype.getLevelScale.call(this,a)},getNumTiles:function(a){if(this.emulateLegacyImagePyramid){var l=this.getLevelScale(a);return l?new e.Point(1,1):new e.Point(0,0)}return e.TileSource.prototype.getNumTiles.call(this,a)},getTileAtPoint:function(a,l){return this.emulateLegacyImagePyramid?new e.Point(0,0):e.TileSource.prototype.getTileAtPoint.call(this,a,l)},getTileUrl:function(a,l,u){if(this.emulateLegacyImagePyramid){var c=null;return this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(c=this.levels[a].url),c}var h="0",d=Math.pow(.5,this.maxLevel-a),g=Math.ceil(this.width*d),y=Math.ceil(this.height*d),x,b,T,f,E,A,C,O,D,I,B,Z,Y,V;return x=this.getTileWidth(a),b=this.getTileHeight(a),T=Math.ceil(x/d),f=Math.ceil(b/d),this.version===1?Y="native."+this.tileFormat:Y="default."+this.tileFormat,g1&&a.profile[1].supports&&(h=a.profile[1].supports.indexOf("sizeByW")!==-1),a.version===3&&a.extraFeatures&&(h=a.extraFeatures.indexOf("sizeByWh")!==-1),!c||h}function r(a){for(var l=[],u=0;uc?h=u/256:h=c/256,l.maxLevel=Math.ceil(Math.log(h)/Math.log(2))-1,l.tileSize=256,l.width=u,l.height=c,e.TileSource.apply(this,[l])},e.extend(e.TmsTileSource.prototype,e.TileSource.prototype,{supports:function(n,r){return n.type&&n.type==="tiledmapservice"},configure:function(n,r){return n},getTileUrl:function(n,r,o){var s=this.getNumTiles(n).y-1;return this.tilesUrl+n+"/"+r+"/"+(s-o)+".png"}})}(t),function(e){e.ZoomifyTileSource=function(n){typeof n.tileSize=="undefined"&&(n.tileSize=256),typeof n.fileFormat=="undefined"&&(n.fileFormat="jpg",this.fileFormat=n.fileFormat);var r={x:n.width,y:n.height};for(n.imageSizes=[{x:n.width,y:n.height}],n.gridSize=[this._getGridSize(n.width,n.height,n.tileSize)];parseInt(r.x,10)>n.tileSize||parseInt(r.y,10)>n.tileSize;)r.x=Math.floor(r.x/2),r.y=Math.floor(r.y/2),n.imageSizes.push({x:r.x,y:r.y}),n.gridSize.push(this._getGridSize(r.x,r.y,n.tileSize));n.imageSizes.reverse(),n.gridSize.reverse(),n.minLevel=0,n.maxLevel=n.gridSize.length-1,t.TileSource.apply(this,[n])},e.extend(e.ZoomifyTileSource.prototype,e.TileSource.prototype,{_getGridSize:function(n,r,o){return{x:Math.ceil(n/o),y:Math.ceil(r/o)}},_calculateAbsoluteTileNumber:function(n,r,o){for(var s=0,a={},l=0;l0?(l=a.levels[a.levels.length-1].width,u=a.levels[a.levels.length-1].height):(l=0,u=0,e.console.error("No supported image formats found")),e.extend(!0,a,{width:l,height:u,tileSize:Math.max(u,l),tileOverlap:0,minLevel:0,maxLevel:a.levels.length>0?a.levels.length-1:0}),e.TileSource.apply(this,[a]),this.levels=a.levels},e.extend(e.LegacyTileSource.prototype,e.TileSource.prototype,{supports:function(s,a){return s.type&&s.type==="legacy-image-pyramid"||s.documentElement&&s.documentElement.getAttribute("type")==="legacy-image-pyramid"},configure:function(s,a){var l;return e.isPlainObject(s)?l=o(this,s):l=r(this,s),l},getLevelScale:function(s){var a=NaN;return this.levels.length>0&&s>=this.minLevel&&s<=this.maxLevel&&(a=this.levels[s].width/this.levels[this.maxLevel].width),a},getNumTiles:function(s){var a=this.getLevelScale(s);return a?new e.Point(1,1):new e.Point(0,0)},getTileUrl:function(s,a,l){var u=null;return this.levels.length>0&&s>=this.minLevel&&s<=this.maxLevel&&(u=this.levels[s].url),u}});function n(s){var a=[],l,u;for(u=0;u");return a.sort(function(c,h){return c.height-h.height})}function r(s,a){if(!a||!a.documentElement)throw new Error(e.getString("Errors.Xml"));var l=a.documentElement,u=l.tagName,c=null,h=[],d,g;if(u==="image")try{for(c={type:l.getAttribute("type"),levels:[]},h=l.getElementsByTagName("level"),g=0;g=this.minLevel&&n<=this.maxLevel&&(r=this.levels[n].width/this.levels[this.maxLevel].width),r},getNumTiles:function(n){var r=this.getLevelScale(n);return r?new e.Point(1,1):new e.Point(0,0)},getTileUrl:function(n,r,o){var s=null;return n>=this.minLevel&&n<=this.maxLevel&&(s=this.levels[n].url),s},getContext2D:function(n,r,o){var s=null;return n>=this.minLevel&&n<=this.maxLevel&&(s=this.levels[n].context2D),s},destroy:function(){this._freeupCanvasMemory()},_buildLevels:function(){var n=[{url:this._image.src,width:this._image.naturalWidth,height:this._image.naturalHeight}];if(!this.buildPyramid||!e.supportsCanvas||!this.useCanvas)return delete this._image,n;var r=this._image.naturalWidth,o=this._image.naturalHeight,s=document.createElement("canvas"),a=s.getContext("2d");if(s.width=r,s.height=o,a.drawImage(this._image,0,0,r,o),n[0].context2D=a,delete this._image,e.isCanvasTainted(s))return n;for(;r>=2&&o>=2;){r=Math.floor(r/2),o=Math.floor(o/2);var l=document.createElement("canvas"),u=l.getContext("2d");l.width=r,l.height=o,u.drawImage(s,0,0,r,o),n.splice(0,0,{context2D:u,width:r,height:o}),s=l,a=u}return n},_freeupCanvasMemory:function(){for(var n=0;n0&&n(u))}function o(u){u.shouldFade=!0,u.fadeBeginTime=e.now()+u.fadeDelay,window.setTimeout(function(){n(u)},u.fadeDelay)}function s(u){u.shouldFade=!1,u.imgGroup&&e.setElementOpacity(u.imgGroup,1,!0)}function a(u,c){u.element.disabled||(c>=e.ButtonState.GROUP&&u.currentState===e.ButtonState.REST&&(s(u),u.currentState=e.ButtonState.GROUP),c>=e.ButtonState.HOVER&&u.currentState===e.ButtonState.GROUP&&(u.imgHover&&(u.imgHover.style.visibility=""),u.currentState=e.ButtonState.HOVER),c>=e.ButtonState.DOWN&&u.currentState===e.ButtonState.HOVER&&(u.imgDown&&(u.imgDown.style.visibility=""),u.currentState=e.ButtonState.DOWN))}function l(u,c){u.element.disabled||(c<=e.ButtonState.HOVER&&u.currentState===e.ButtonState.DOWN&&(u.imgDown&&(u.imgDown.style.visibility="hidden"),u.currentState=e.ButtonState.HOVER),c<=e.ButtonState.GROUP&&u.currentState===e.ButtonState.HOVER&&(u.imgHover&&(u.imgHover.style.visibility="hidden"),u.currentState=e.ButtonState.GROUP),c<=e.ButtonState.REST&&u.currentState===e.ButtonState.GROUP&&(o(u),u.currentState=e.ButtonState.REST))}}(t),function(e){e.ButtonGroup=function(n){e.extend(!0,this,{buttons:[],clickTimeThreshold:e.DEFAULT_SETTINGS.clickTimeThreshold,clickDistThreshold:e.DEFAULT_SETTINGS.clickDistThreshold,labelText:""},n);var r=this.buttons.concat([]),o=this,s;if(this.element=n.element||e.makeNeutralElement("div"),!n.group)for(this.element.style.display="inline-block",s=0;s=270?(l=this.getTopRight(),this.x=l.x,this.y=l.y,u=this.height,this.height=this.width,this.width=u,this.degrees-=270):this.degrees>=180?(l=this.getBottomRight(),this.x=l.x,this.y=l.y,this.degrees-=180):this.degrees>=90&&(l=this.getBottomLeft(),this.x=l.x,this.y=l.y,u=this.height,this.height=this.width,this.width=u,this.degrees-=90)},e.Rect.fromSummits=function(n,r,o){var s=n.distanceTo(r),a=n.distanceTo(o),l=r.minus(n),u=Math.atan(l.y/l.x);return l.x<0?u+=Math.PI:l.y<0&&(u+=2*Math.PI),new e.Rect(n.x,n.y,s,a,u/Math.PI*180)},e.Rect.prototype={clone:function(){return new e.Rect(this.x,this.y,this.width,this.height,this.degrees)},getAspectRatio:function(){return this.width/this.height},getTopLeft:function(){return new e.Point(this.x,this.y)},getBottomRight:function(){return new e.Point(this.x+this.width,this.y+this.height).rotate(this.degrees,this.getTopLeft())},getTopRight:function(){return new e.Point(this.x+this.width,this.y).rotate(this.degrees,this.getTopLeft())},getBottomLeft:function(){return new e.Point(this.x,this.y+this.height).rotate(this.degrees,this.getTopLeft())},getCenter:function(){return new e.Point(this.x+this.width/2,this.y+this.height/2).rotate(this.degrees,this.getTopLeft())},getSize:function(){return new e.Point(this.width,this.height)},equals:function(n){return n instanceof e.Rect&&this.x===n.x&&this.y===n.y&&this.width===n.width&&this.height===n.height&&this.degrees===n.degrees},times:function(n){return new e.Rect(this.x*n,this.y*n,this.width*n,this.height*n,this.degrees)},translate:function(n){return new e.Rect(this.x+n.x,this.y+n.y,this.width,this.height,this.degrees)},union:function(n){var r=this.getBoundingBox(),o=n.getBoundingBox(),s=Math.min(r.x,o.x),a=Math.min(r.y,o.y),l=Math.max(r.x+r.width,o.x+o.width),u=Math.max(r.y+r.height,o.y+o.height);return new e.Rect(s,a,l-s,u-a)},intersection:function(n){var r=1e-10,o=[],s=this.getTopLeft();n.containsPoint(s,r)&&o.push(s);var a=this.getTopRight();n.containsPoint(a,r)&&o.push(a);var l=this.getBottomLeft();n.containsPoint(l,r)&&o.push(l);var u=this.getBottomRight();n.containsPoint(u,r)&&o.push(u);var c=n.getTopLeft();this.containsPoint(c,r)&&o.push(c);var h=n.getTopRight();this.containsPoint(h,r)&&o.push(h);var d=n.getBottomLeft();this.containsPoint(d,r)&&o.push(d);var g=n.getBottomRight();this.containsPoint(g,r)&&o.push(g);for(var y=this._getSegments(),x=n._getSegments(),b=0;bD&&(D=Y.x),Y.yB&&(B=Y.y)}return new e.Rect(O,I,D-O,B-I)},_getSegments:function(){var n=this.getTopLeft(),r=this.getTopRight(),o=this.getBottomLeft(),s=this.getBottomRight();return[[n,r],[r,s],[s,o],[o,n]]},rotate:function(n,r){if(n=e.positiveModulo(n,360),n===0)return this.clone();r=r||this.getCenter();var o=this.getTopLeft().rotate(n,r),s=this.getTopRight().rotate(n,r),a=s.minus(o);a=a.apply(function(u){var c=1e-15;return Math.abs(u)=-r&&(n.x-s.x)*l.x+(n.y-s.y)*l.y<=r&&(n.x-o.x)*u.x+(n.y-o.y)*u.y>=-r&&(n.x-a.x)*u.x+(n.y-a.y)*u.y<=r},toString:function(){return"["+Math.round(this.x*100)/100+", "+Math.round(this.y*100)/100+", "+Math.round(this.width*100)/100+"x"+Math.round(this.height*100)/100+", "+Math.round(this.degrees*100)/100+"deg]"}}}(t),function(e){var n={};e.ReferenceStrip=function(d){var g=this,y=d.viewer,x=e.getElementSize(y.element),b,T,f;for(d.id||(d.id="referencestrip-"+e.now(),this.element=e.makeNeutralElement("div"),this.element.id=d.id,this.element.className="referencestrip"),d=e.extend(!0,{sizeRatio:e.DEFAULT_SETTINGS.referenceStripSizeRatio,position:e.DEFAULT_SETTINGS.referenceStripPosition,scroll:e.DEFAULT_SETTINGS.referenceStripScroll,clickTimeThreshold:e.DEFAULT_SETTINGS.clickTimeThreshold},d,{element:this.element}),e.extend(this,d),n[this.id]={animating:!1},this.minPixelRatio=this.viewer.minPixelRatio,this.element.tabIndex=0,T=this.element.style,T.marginTop="0px",T.marginRight="0px",T.marginBottom="0px",T.marginLeft="0px",T.left="0px",T.bottom="0px",T.border="0px",T.background="#000",T.position="relative",e.setElementTouchActionNone(this.element),e.setElementOpacity(this.element,.8),this.viewer=y,this.tracker=new e.MouseTracker({userData:"ReferenceStrip.tracker",element:this.element,clickHandler:e.delegate(this,r),dragHandler:e.delegate(this,o),scrollHandler:e.delegate(this,s),enterHandler:e.delegate(this,l),leaveHandler:e.delegate(this,u),keyDownHandler:e.delegate(this,c),keyHandler:e.delegate(this,h),preProcessEventHandler:function(E){E.eventType==="wheel"&&(E.preventDefault=!0)}}),d.width&&d.height?(this.element.style.width=d.width+"px",this.element.style.height=d.height+"px",y.addControl(this.element,{anchor:e.ControlAnchor.BOTTOM_LEFT})):d.scroll==="horizontal"?(this.element.style.width=x.x*d.sizeRatio*y.tileSources.length+12*y.tileSources.length+"px",this.element.style.height=x.y*d.sizeRatio+"px",y.addControl(this.element,{anchor:e.ControlAnchor.BOTTOM_LEFT})):(this.element.style.height=x.y*d.sizeRatio*y.tileSources.length+12*y.tileSources.length+"px",this.element.style.width=x.x*d.sizeRatio+"px",y.addControl(this.element,{anchor:e.ControlAnchor.TOP_LEFT})),this.panelWidth=x.x*this.sizeRatio+8,this.panelHeight=x.y*this.sizeRatio+8,this.panels=[],this.miniViewers={},f=0;fT+y.x-this.panelWidth?(E=Math.min(E,x-y.x),this.element.style.marginLeft=-E+"px",a(this,y.x,-E)):Ef+y.y-this.panelHeight?(E=Math.min(E,b-y.y),this.element.style.marginTop=-E+"px",a(this,y.y,-E)):E0?g>-(x-T.x)&&(this.element.style.marginLeft=g+d.delta.x*2+"px",a(this,T.x,g+d.delta.x*2)):-d.delta.x<0&&g<0&&(this.element.style.marginLeft=g+d.delta.x*2+"px",a(this,T.x,g+d.delta.x*2)):-d.delta.y>0?y>-(b-T.y)&&(this.element.style.marginTop=y+d.delta.y*2+"px",a(this,T.y,y+d.delta.y*2)):-d.delta.y<0&&y<0&&(this.element.style.marginTop=y+d.delta.y*2+"px",a(this,T.y,y+d.delta.y*2))}}function s(d){if(this.element){var g=Number(this.element.style.marginLeft.replace("px","")),y=Number(this.element.style.marginTop.replace("px","")),x=Number(this.element.style.width.replace("px","")),b=Number(this.element.style.height.replace("px","")),T=e.getElementSize(this.viewer.canvas);this.scroll==="horizontal"?d.scroll>0?g>-(x-T.x)&&(this.element.style.marginLeft=g-d.scroll*60+"px",a(this,T.x,g-d.scroll*60)):d.scroll<0&&g<0&&(this.element.style.marginLeft=g-d.scroll*60+"px",a(this,T.x,g-d.scroll*60)):d.scroll<0?y>T.y-b&&(this.element.style.marginTop=y+d.scroll*60+"px",a(this,T.y,y+d.scroll*60)):d.scroll>0&&y<0&&(this.element.style.marginTop=y+d.scroll*60+"px",a(this,T.y,y+d.scroll*60)),d.preventDefault=!0}}function a(d,g,y){var x,b,T,f,E,A;for(d.scroll==="horizontal"?x=d.panelWidth:x=d.panelHeight,b=Math.ceil(g/x)+5,T=Math.ceil((Math.abs(y)+g)/x)+1,b=T-b,b=b<0?0:b,E=b;E1?o[1].springStiffness:5,animationTime:o.length>1?o[1].animationTime:1.5}),e.console.assert(typeof r.springStiffness=="number"&&r.springStiffness!==0,"[OpenSeadragon.Spring] options.springStiffness must be a non-zero number"),e.console.assert(typeof r.animationTime=="number"&&r.animationTime>=0,"[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0"),r.exponential&&(this._exponential=!0,delete r.exponential),e.extend(!0,this,r),this.current={value:typeof this.initial=="number"?this.initial:this._exponential?0:1,time:e.now()},e.console.assert(!this._exponential||this.current.value!==0,"[OpenSeadragon.Spring] value must be non-zero for exponential springs"),this.start={value:this.current.value,time:this.current.time},this.target={value:this.current.value,time:this.current.time},this._exponential&&(this.start._logValue=Math.log(this.start.value),this.target._logValue=Math.log(this.target.value),this.current._logValue=Math.log(this.current.value))},e.Spring.prototype={resetTo:function(r){e.console.assert(!this._exponential||r!==0,"[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs"),this.start.value=this.target.value=this.current.value=r,this.start.time=this.target.time=this.current.time=e.now(),this._exponential&&(this.start._logValue=Math.log(this.start.value),this.target._logValue=Math.log(this.target.value),this.current._logValue=Math.log(this.current.value))},springTo:function(r){e.console.assert(!this._exponential||r!==0,"[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs"),this.start.value=this.current.value,this.start.time=this.current.time,this.target.value=r,this.target.time=this.start.time+1e3*this.animationTime,this._exponential&&(this.start._logValue=Math.log(this.start.value),this.target._logValue=Math.log(this.target.value))},shiftBy:function(r){this.start.value+=r,this.target.value+=r,this._exponential&&(e.console.assert(this.target.value!==0&&this.start.value!==0,"[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs"),this.start._logValue=Math.log(this.start.value),this.target._logValue=Math.log(this.target.value))},setExponential:function(r){this._exponential=r,this._exponential&&(e.console.assert(this.current.value!==0&&this.target.value!==0&&this.start.value!==0,"[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs"),this.start._logValue=Math.log(this.start.value),this.target._logValue=Math.log(this.target.value),this.current._logValue=Math.log(this.current.value))},update:function(){this.current.time=e.now();var r,o;this._exponential?(r=this.start._logValue,o=this.target._logValue):(r=this.start.value,o=this.target.value);var s=this.current.time>=this.target.time?o:r+(o-r)*n(this.springStiffness,(this.current.time-this.start.time)/(this.target.time-this.start.time)),a=this.current.value;return this._exponential?this.current.value=Math.exp(s):this.current.value=s,a!==this.current.value},isAtTargetValue:function(){return this.current.value===this.target.value}};function n(r,o){return(1-Math.exp(r*-o))/(1-Math.exp(-r))}}(t),function(e){function n(o){e.extend(!0,this,{timeout:e.DEFAULT_SETTINGS.timeout,jobId:null},o),this.image=null}n.prototype={errorMsg:null,start:function(){var o=this,s=this.abort;this.image=new Image,this.image.onload=function(){o.finish(!0)},this.image.onabort=this.image.onerror=function(){o.errorMsg="Image load aborted",o.finish(!1)},this.jobId=window.setTimeout(function(){o.errorMsg="Image load exceeded timeout ("+o.timeout+" ms)",o.finish(!1)},this.timeout),this.loadWithAjax?(this.request=e.makeAjaxRequest({url:this.src,withCredentials:this.ajaxWithCredentials,headers:this.ajaxHeaders,responseType:"arraybuffer",success:function(a){var l;try{l=new window.Blob([a.response])}catch(d){var u=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder;if(d.name==="TypeError"&&u){var c=new u;c.append(a.response),l=c.getBlob()}}l.size===0&&(o.errorMsg="Empty image response.",o.finish(!1));var h=(window.URL||window.webkitURL).createObjectURL(l);o.image.src=h},error:function(a){o.errorMsg="Image load aborted - XHR error",o.finish(!1)}}),this.abort=function(){o.request.abort(),typeof s=="function"&&s()}):(this.crossOriginPolicy!==!1&&(this.image.crossOrigin=this.crossOriginPolicy),this.image.src=this.src)},finish:function(o){this.image.onload=this.image.onerror=this.image.onabort=null,o||(this.image=null),this.jobId&&window.clearTimeout(this.jobId),this.callback(this)}},e.ImageLoader=function(o){e.extend(!0,this,{jobLimit:e.DEFAULT_SETTINGS.imageLoaderLimit,timeout:e.DEFAULT_SETTINGS.timeout,jobQueue:[],jobsInProgress:0},o)},e.ImageLoader.prototype={addJob:function(o){var s=this,a=function(c){r(s,c,o.callback)},l={src:o.src,loadWithAjax:o.loadWithAjax,ajaxHeaders:o.loadWithAjax?o.ajaxHeaders:null,crossOriginPolicy:o.crossOriginPolicy,ajaxWithCredentials:o.ajaxWithCredentials,callback:a,abort:o.abort,timeout:this.timeout},u=new n(l);!this.jobLimit||this.jobsInProgress0&&(l=o.jobQueue.shift(),l.start(),o.jobsInProgress++),a(s.image,s.errorMsg,s.request)}}(t),function(e){e.Tile=function(n,r,o,s,a,l,u,c,h,d){this.level=n,this.x=r,this.y=o,this.bounds=s,this.sourceBounds=d,this.exists=a,this.url=l,this.context2D=u,this.loadWithAjax=c,this.ajaxHeaders=h,this.ajaxHeaders?this.cacheKey=this.url+"+"+JSON.stringify(this.ajaxHeaders):this.cacheKey=this.url,this.loaded=!1,this.loading=!1,this.element=null,this.imgElement=null,this.image=null,this.style=null,this.position=null,this.size=null,this.flipped=!1,this.blendStart=null,this.opacity=null,this.squaredDistance=null,this.visibility=null,this.beingDrawn=!1,this.lastTouchTime=0,this.isRightMost=!1,this.isBottomMost=!1},e.Tile.prototype={toString:function(){return this.level+"/"+this.x+"_"+this.y},_hasTransparencyChannel:function(){return!!this.context2D||this.url.match(".png")},drawHTML:function(n){if(!this.cacheImageRecord){e.console.warn("[Tile.drawHTML] attempting to draw tile %s when it's not cached",this.toString());return}if(!this.loaded){e.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString());return}this.element||(this.element=e.makeNeutralElement("div"),this.imgElement=this.cacheImageRecord.getImage().cloneNode(),this.imgElement.style.msInterpolationMode="nearest-neighbor",this.imgElement.style.width="100%",this.imgElement.style.height="100%",this.style=this.element.style,this.style.position="absolute"),this.element.parentNode!==n&&n.appendChild(this.element),this.imgElement.parentNode!==this.element&&this.element.appendChild(this.imgElement),this.style.top=this.position.y+"px",this.style.left=this.position.x+"px",this.style.height=this.size.y+"px",this.style.width=this.size.x+"px",this.flipped&&(this.style.transform="scaleX(-1)"),e.setElementOpacity(this.element,this.opacity)},drawCanvas:function(n,r,o,s){var a=this.position.times(e.pixelDensityRatio),l=this.size.times(e.pixelDensityRatio),u;if(!this.context2D&&!this.cacheImageRecord){e.console.warn("[Tile.drawCanvas] attempting to draw tile %s when it's not cached",this.toString());return}if(u=this.context2D||this.cacheImageRecord.getRenderedContext(),!this.loaded||!u){e.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString());return}n.save(),n.globalAlpha=this.opacity,typeof o=="number"&&o!==1&&(a=a.times(o),l=l.times(o)),s instanceof e.Point&&(a=a.plus(s)),n.globalAlpha===1&&this._hasTransparencyChannel()&&n.clearRect(a.x,a.y,l.x,l.y),r({context:n,tile:this,rendered:u});var c,h;this.sourceBounds?(c=Math.min(this.sourceBounds.width,u.canvas.width),h=Math.min(this.sourceBounds.height,u.canvas.height)):(c=u.canvas.width,h=u.canvas.height),n.translate(a.x+l.x/2,0),this.flipped&&n.scale(-1,1),n.drawImage(u.canvas,0,0,c,h,-l.x/2,a.y,l.x,l.y),n.restore()},getScaleForEdgeSmoothing:function(){var n;if(this.cacheImageRecord)n=this.cacheImageRecord.getRenderedContext();else if(this.context2D)n=this.context2D;else return e.console.warn("[Tile.drawCanvas] attempting to get tile scale %s when tile's not cached",this.toString()),1;return n.canvas.width/(this.size.x*e.pixelDensityRatio)},getTranslationForEdgeSmoothing:function(n,r,o){var s=Math.max(1,Math.ceil((o.x-r.x)/2)),a=Math.max(1,Math.ceil((o.y-r.y)/2));return new e.Point(s,a).minus(this.position.times(e.pixelDensityRatio).times(n||1).apply(function(l){return l%1}))},unload:function(){this.imgElement&&this.imgElement.parentNode&&this.imgElement.parentNode.removeChild(this.imgElement),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.element=null,this.imgElement=null,this.loaded=!1,this.loading=!1}}}(t),function(e){e.OverlayPlacement=e.Placement,e.OverlayRotationMode=e.freezeObject({NO_ROTATION:1,EXACT:2,BOUNDING_BOX:3}),e.Overlay=function(n,r,o){var s;e.isPlainObject(n)?s=n:s={element:n,location:r,placement:o},this.element=s.element,this.style=s.element.style,this._init(s)},e.Overlay.prototype={_init:function(n){this.location=n.location,this.placement=n.placement===void 0?e.Placement.TOP_LEFT:n.placement,this.onDraw=n.onDraw,this.checkResize=n.checkResize===void 0?!0:n.checkResize,this.width=n.width===void 0?null:n.width,this.height=n.height===void 0?null:n.height,this.rotationMode=n.rotationMode||e.OverlayRotationMode.EXACT,this.location instanceof e.Rect&&(this.width=this.location.width,this.height=this.location.height,this.location=this.location.getTopLeft(),this.placement=e.Placement.TOP_LEFT),this.scales=this.width!==null&&this.height!==null,this.bounds=new e.Rect(this.location.x,this.location.y,this.width,this.height),this.position=this.location},adjust:function(n,r){var o=e.Placement.properties[this.placement];!o||(o.isHorizontallyCentered?n.x-=r.x/2:o.isRight&&(n.x-=r.x),o.isVerticallyCentered?n.y-=r.y/2:o.isBottom&&(n.y-=r.y))},destroy:function(){var n=this.element,r=this.style;n.parentNode&&(n.parentNode.removeChild(n),n.prevElementParent&&(r.display="none",document.body.appendChild(n))),this.onDraw=null,r.top="",r.left="",r.position="",this.width!==null&&(r.width=""),this.height!==null&&(r.height="");var o=e.getCssPropertyWithVendorPrefix("transformOrigin"),s=e.getCssPropertyWithVendorPrefix("transform");o&&s&&(r[o]="",r[s]="")},drawHTML:function(n,r){var o=this.element;o.parentNode!==n&&(o.prevElementParent=o.parentNode,o.prevNextSibling=o.nextSibling,n.appendChild(o),this.style.position="absolute",this.size=e.getElementSize(o));var s=this._getOverlayPositionAndSize(r),a=s.position,l=this.size=s.size,u=s.rotate;if(this.onDraw)this.onDraw(a,l,this.element);else{var c=this.style;c.left=a.x+"px",c.top=a.y+"px",this.width!==null&&(c.width=l.x+"px"),this.height!==null&&(c.height=l.y+"px");var h=e.getCssPropertyWithVendorPrefix("transformOrigin"),d=e.getCssPropertyWithVendorPrefix("transform");h&&d&&(u?(c[h]=this._getTransformOrigin(),c[d]="rotate("+u+"deg)"):(c[h]="",c[d]="")),c.display="block"}},_getOverlayPositionAndSize:function(n){var r=n.pixelFromPoint(this.location,!0),o=this._getSizeInPixels(n);this.adjust(r,o);var s=0;if(n.degrees&&this.rotationMode!==e.OverlayRotationMode.NO_ROTATION)if(this.rotationMode===e.OverlayRotationMode.BOUNDING_BOX&&this.width!==null&&this.height!==null){var a=new e.Rect(r.x,r.y,o.x,o.y),l=this._getBoundingBox(a,n.degrees);r=l.getTopLeft(),o=l.getSize()}else s=n.degrees;return{position:r,size:o,rotate:s}},_getSizeInPixels:function(n){var r=this.size.x,o=this.size.y;if(this.width!==null||this.height!==null){var s=n.deltaPixelsFromPointsNoRotate(new e.Point(this.width||0,this.height||0),!0);this.width!==null&&(r=s.x),this.height!==null&&(o=s.y)}if(this.checkResize&&(this.width===null||this.height===null)){var a=this.size=e.getElementSize(this.element);this.width===null&&(r=a.x),this.height===null&&(o=a.y)}return new e.Point(r,o)},_getBoundingBox:function(n,r){var o=this._getPlacementPoint(n);return n.rotate(r,o).getBoundingBox()},_getPlacementPoint:function(n){var r=new e.Point(n.x,n.y),o=e.Placement.properties[this.placement];return o&&(o.isHorizontallyCentered?r.x+=n.width/2:o.isRight&&(r.x+=n.width),o.isVerticallyCentered?r.y+=n.height/2:o.isBottom&&(r.y+=n.height)),r},_getTransformOrigin:function(){var n="",r=e.Placement.properties[this.placement];return r&&(r.isLeft?n="left":r.isRight&&(n="right"),r.isTop?n+=" top":r.isBottom&&(n+=" bottom")),n},update:function(n,r){var o=e.isPlainObject(n)?n:{location:n,placement:r};this._init({location:o.location||this.location,placement:o.placement!==void 0?o.placement:this.placement,onDraw:o.onDraw||this.onDraw,checkResize:o.checkResize||this.checkResize,width:o.width!==void 0?o.width:this.width,height:o.height!==void 0?o.height:this.height,rotationMode:o.rotationMode||this.rotationMode})},getBounds:function(n){e.console.assert(n,"A viewport must now be passed to Overlay.getBounds.");var r=this.width,o=this.height;if(r===null||o===null){var s=n.deltaPointsFromPixelsNoRotate(this.size,!0);r===null&&(r=s.x),o===null&&(o=s.y)}var a=this.location.clone();return this.adjust(a,new e.Point(r,o)),this._adjustBoundsForRotation(n,new e.Rect(a.x,a.y,r,o))},_adjustBoundsForRotation:function(n,r){if(!n||n.degrees===0||this.rotationMode===e.OverlayRotationMode.EXACT)return r;if(this.rotationMode===e.OverlayRotationMode.BOUNDING_BOX){if(this.width===null||this.height===null)return r;var o=this._getOverlayPositionAndSize(n);return n.viewerElementToViewportRectangle(new e.Rect(o.position.x,o.position.y,o.size.x,o.size.y))}return r.rotate(-n.degrees,this._getPlacementPoint(r))}}}(t),function(e){e.Drawer=function(n){e.console.assert(n.viewer,"[Drawer] options.viewer is required");var r=arguments;if(e.isPlainObject(n)||(n={source:r[0],viewport:r[1],element:r[2]}),e.console.assert(n.viewport,"[Drawer] options.viewport is required"),e.console.assert(n.element,"[Drawer] options.element is required"),n.source&&e.console.error("[Drawer] options.source is no longer accepted; use TiledImage instead"),this.viewer=n.viewer,this.viewport=n.viewport,this.debugGridColor=typeof n.debugGridColor=="string"?[n.debugGridColor]:n.debugGridColor||e.DEFAULT_SETTINGS.debugGridColor,n.opacity&&e.console.error("[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead"),this.useCanvas=e.supportsCanvas&&(this.viewer?this.viewer.useCanvas:!0),this.container=e.getElement(n.element),this.canvas=e.makeNeutralElement(this.useCanvas?"canvas":"div"),this.context=this.useCanvas?this.canvas.getContext("2d"):null,this.sketchCanvas=null,this.sketchContext=null,this.element=this.container,this.container.dir="ltr",this.useCanvas){var o=this._calculateCanvasSize();this.canvas.width=o.x,this.canvas.height=o.y}this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.position="absolute",e.setElementOpacity(this.canvas,this.opacity,!0),e.setElementPointerEventsNone(this.canvas),e.setElementTouchActionNone(this.canvas),this.container.style.textAlign="left",this.container.appendChild(this.canvas),this._imageSmoothingEnabled=!0},e.Drawer.prototype={addOverlay:function(n,r,o,s){return e.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead."),this.viewer.addOverlay(n,r,o,s),this},updateOverlay:function(n,r,o){return e.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead."),this.viewer.updateOverlay(n,r,o),this},removeOverlay:function(n){return e.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead."),this.viewer.removeOverlay(n),this},clearOverlays:function(){return e.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead."),this.viewer.clearOverlays(),this},viewportCoordToDrawerCoord:function(n){var r=this.viewport.pixelFromPointNoRotate(n,!0);return new e.Point(r.x*e.pixelDensityRatio,r.y*e.pixelDensityRatio)},clipWithPolygons:function(n,r){if(!!this.useCanvas){var o=this._getContext(r);o.beginPath(),n.forEach(function(s){s.forEach(function(a,l){o[l===0?"moveTo":"lineTo"](a.x,a.y)})}),o.clip()}},setOpacity:function(n){e.console.error("drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.");for(var r=this.viewer.world,o=0;or&&(r=s)}return r},needsUpdate:function(){return e.console.error("[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead."),this.viewer.world.needsDraw()},numTilesLoaded:function(){return e.console.error("[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead."),this.viewer.tileCache.numTilesLoaded()},reset:function(){return e.console.error("[Drawer.reset] this function is deprecated. Use World.resetItems instead."),this.viewer.world.resetItems(),this},update:function(){return e.console.error("[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead."),this.clear(),this.viewer.world.draw(),this},canRotate:function(){return this.useCanvas},destroy:function(){this.canvas.width=1,this.canvas.height=1,this.sketchCanvas=null,this.sketchContext=null},clear:function(){if(this.canvas.innerHTML="",this.useCanvas){var n=this._calculateCanvasSize();if((this.canvas.width!==n.x||this.canvas.height!==n.y)&&(this.canvas.width=n.x,this.canvas.height=n.y,this._updateImageSmoothingEnabled(this.context),this.sketchCanvas!==null)){var r=this._calculateSketchCanvasSize();this.sketchCanvas.width=r.x,this.sketchCanvas.height=r.y,this._updateImageSmoothingEnabled(this.sketchContext)}this._clear()}},_clear:function(n,r){if(!!this.useCanvas){var o=this._getContext(n);if(r)o.clearRect(r.x,r.y,r.width,r.height);else{var s=o.canvas;o.clearRect(0,0,s.width,s.height)}}},viewportToDrawerRectangle:function(n){var r=this.viewport.pixelFromPointNoRotate(n.getTopLeft(),!0),o=this.viewport.deltaPixelsFromPointsNoRotate(n.getSize(),!0);return new e.Rect(r.x*e.pixelDensityRatio,r.y*e.pixelDensityRatio,o.x*e.pixelDensityRatio,o.y*e.pixelDensityRatio)},drawTile:function(n,r,o,s,a){if(e.console.assert(n,"[Drawer.drawTile] tile is required"),e.console.assert(r,"[Drawer.drawTile] drawingHandler is required"),this.useCanvas){var l=this._getContext(o);s=s||1,n.drawCanvas(l,r,s,a)}else n.drawHTML(this.canvas)},_getContext:function(n){var r=this.context;if(n){if(this.sketchCanvas===null){this.sketchCanvas=document.createElement("canvas");var o=this._calculateSketchCanvasSize();if(this.sketchCanvas.width=o.x,this.sketchCanvas.height=o.y,this.sketchContext=this.sketchCanvas.getContext("2d"),this.viewport.getRotation()===0){var s=this;this.viewer.addHandler("rotate",function a(){if(s.viewport.getRotation()!==0){s.viewer.removeHandler("rotate",a);var l=s._calculateSketchCanvasSize();s.sketchCanvas.width=l.x,s.sketchCanvas.height=l.y}})}this._updateImageSmoothingEnabled(this.sketchContext)}r=this.sketchContext}return r},saveContext:function(n){!this.useCanvas||this._getContext(n).save()},restoreContext:function(n){!this.useCanvas||this._getContext(n).restore()},setClip:function(n,r){if(!!this.useCanvas){var o=this._getContext(r);o.beginPath(),o.rect(n.x,n.y,n.width,n.height),o.clip()}},drawRectangle:function(n,r,o){if(!!this.useCanvas){var s=this._getContext(o);s.save(),s.fillStyle=r,s.fillRect(n.x,n.y,n.width,n.height),s.restore()}},blendSketch:function(n,r,o,s){var a=n;if(e.isPlainObject(a)||(a={opacity:n,scale:r,translate:o,compositeOperation:s}),!(!this.useCanvas||!this.sketchCanvas)){n=a.opacity,s=a.compositeOperation;var l=a.bounds;if(this.context.save(),this.context.globalAlpha=n,s&&(this.context.globalCompositeOperation=s),l)l.x<0&&(l.width+=l.x,l.x=0),l.x+l.width>this.canvas.width&&(l.width=this.canvas.width-l.x),l.y<0&&(l.height+=l.y,l.y=0),l.y+l.height>this.canvas.height&&(l.height=this.canvas.height-l.y),this.context.drawImage(this.sketchCanvas,l.x,l.y,l.width,l.height,l.x,l.y,l.width,l.height);else{r=a.scale||1,o=a.translate;var u=o instanceof e.Point?o:new e.Point(0,0),c=0,h=0;if(o){var d=this.sketchCanvas.width-this.canvas.width,g=this.sketchCanvas.height-this.canvas.height;c=Math.round(d/2),h=Math.round(g/2)}this.context.drawImage(this.sketchCanvas,u.x-c*r,u.y-h*r,(this.canvas.width+2*c)*r,(this.canvas.height+2*h)*r,-c,-h,this.canvas.width+2*c,this.canvas.height+2*h)}this.context.restore()}},drawDebugInfo:function(n,r,o,s){if(!!this.useCanvas){var a=this.viewer.world.getIndexOfItem(s)%this.debugGridColor.length,l=this.context;l.save(),l.lineWidth=2*e.pixelDensityRatio,l.font="small-caps bold "+13*e.pixelDensityRatio+"px arial",l.strokeStyle=this.debugGridColor[a],l.fillStyle=this.debugGridColor[a],this.viewport.degrees!==0&&this._offsetForRotation({degrees:this.viewport.degrees}),s.getRotation(!0)%360!==0&&this._offsetForRotation({degrees:s.getRotation(!0),point:s.viewport.pixelFromPointNoRotate(s._getRotationPoint(!0),!0)}),s.viewport.degrees===0&&s.getRotation(!0)%360===0&&s._drawer.viewer.viewport.getFlip()&&s._drawer._flip(),l.strokeRect(n.position.x*e.pixelDensityRatio,n.position.y*e.pixelDensityRatio,n.size.x*e.pixelDensityRatio,n.size.y*e.pixelDensityRatio);var u=(n.position.x+n.size.x/2)*e.pixelDensityRatio,c=(n.position.y+n.size.y/2)*e.pixelDensityRatio;l.translate(u,c),l.rotate(Math.PI/180*-this.viewport.degrees),l.translate(-u,-c),n.x===0&&n.y===0&&(l.fillText("Zoom: "+this.viewport.getZoom(),n.position.x*e.pixelDensityRatio,(n.position.y-30)*e.pixelDensityRatio),l.fillText("Pan: "+this.viewport.getBounds().toString(),n.position.x*e.pixelDensityRatio,(n.position.y-20)*e.pixelDensityRatio)),l.fillText("Level: "+n.level,(n.position.x+10)*e.pixelDensityRatio,(n.position.y+20)*e.pixelDensityRatio),l.fillText("Column: "+n.x,(n.position.x+10)*e.pixelDensityRatio,(n.position.y+30)*e.pixelDensityRatio),l.fillText("Row: "+n.y,(n.position.x+10)*e.pixelDensityRatio,(n.position.y+40)*e.pixelDensityRatio),l.fillText("Order: "+o+" of "+r,(n.position.x+10)*e.pixelDensityRatio,(n.position.y+50)*e.pixelDensityRatio),l.fillText("Size: "+n.size.toString(),(n.position.x+10)*e.pixelDensityRatio,(n.position.y+60)*e.pixelDensityRatio),l.fillText("Position: "+n.position.toString(),(n.position.x+10)*e.pixelDensityRatio,(n.position.y+70)*e.pixelDensityRatio),this.viewport.degrees!==0&&this._restoreRotationChanges(),s.getRotation(!0)%360!==0&&this._restoreRotationChanges(),s.viewport.degrees===0&&s.getRotation(!0)%360===0&&s._drawer.viewer.viewport.getFlip()&&s._drawer._flip(),l.restore()}},debugRect:function(n){if(this.useCanvas){var r=this.context;r.save(),r.lineWidth=2*e.pixelDensityRatio,r.strokeStyle=this.debugGridColor[0],r.fillStyle=this.debugGridColor[0],r.strokeRect(n.x*e.pixelDensityRatio,n.y*e.pixelDensityRatio,n.width*e.pixelDensityRatio,n.height*e.pixelDensityRatio),r.restore()}},setImageSmoothingEnabled:function(n){this.useCanvas&&(this._imageSmoothingEnabled=n,this._updateImageSmoothingEnabled(this.context),this.viewer.forceRedraw())},_updateImageSmoothingEnabled:function(n){n.msImageSmoothingEnabled=this._imageSmoothingEnabled,n.imageSmoothingEnabled=this._imageSmoothingEnabled},getCanvasSize:function(n){var r=this._getContext(n).canvas;return new e.Point(r.width,r.height)},getCanvasCenter:function(){return new e.Point(this.canvas.width/2,this.canvas.height/2)},_offsetForRotation:function(n){var r=n.point?n.point.times(e.pixelDensityRatio):this.getCanvasCenter(),o=this._getContext(n.useSketch);o.save(),o.translate(r.x,r.y),this.viewer.viewport.flipped?(o.rotate(Math.PI/180*-n.degrees),o.scale(-1,1)):o.rotate(Math.PI/180*n.degrees),o.translate(-r.x,-r.y)},_flip:function(n){n=n||{};var r=n.point?n.point.times(e.pixelDensityRatio):this.getCanvasCenter(),o=this._getContext(n.useSketch);o.translate(r.x,0),o.scale(-1,1),o.translate(-r.x,0)},_restoreRotationChanges:function(n){var r=this._getContext(n);r.restore()},_calculateCanvasSize:function(){var n=e.pixelDensityRatio,r=this.viewport.getContainerSize();return{x:Math.round(r.x*n),y:Math.round(r.y*n)}},_calculateSketchCanvasSize:function(){var n=this._calculateCanvasSize();if(this.viewport.getRotation()===0)return n;var r=Math.ceil(Math.sqrt(n.x*n.x+n.y*n.y));return{x:r,y:r}}}}(t),function(e){e.Viewport=function(n){var r=arguments;r.length&&r[0]instanceof e.Point&&(n={containerSize:r[0],contentSize:r[1],config:r[2]}),n.config&&(e.extend(!0,n,n.config),delete n.config),this._margins=e.extend({left:0,top:0,right:0,bottom:0},n.margins||{}),delete n.margins,e.extend(!0,this,{containerSize:null,contentSize:null,zoomPoint:null,viewer:null,springStiffness:e.DEFAULT_SETTINGS.springStiffness,animationTime:e.DEFAULT_SETTINGS.animationTime,minZoomImageRatio:e.DEFAULT_SETTINGS.minZoomImageRatio,maxZoomPixelRatio:e.DEFAULT_SETTINGS.maxZoomPixelRatio,visibilityRatio:e.DEFAULT_SETTINGS.visibilityRatio,wrapHorizontal:e.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:e.DEFAULT_SETTINGS.wrapVertical,defaultZoomLevel:e.DEFAULT_SETTINGS.defaultZoomLevel,minZoomLevel:e.DEFAULT_SETTINGS.minZoomLevel,maxZoomLevel:e.DEFAULT_SETTINGS.maxZoomLevel,degrees:e.DEFAULT_SETTINGS.degrees,flipped:e.DEFAULT_SETTINGS.flipped,homeFillsViewer:e.DEFAULT_SETTINGS.homeFillsViewer},n),this._updateContainerInnerSize(),this.centerSpringX=new e.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime}),this.centerSpringY=new e.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime}),this.zoomSpring=new e.Spring({exponential:!0,initial:1,springStiffness:this.springStiffness,animationTime:this.animationTime}),this._oldCenterX=this.centerSpringX.current.value,this._oldCenterY=this.centerSpringY.current.value,this._oldZoom=this.zoomSpring.current.value,this._setContentBounds(new e.Rect(0,0,1,1),1),this.goHome(!0),this.update()},e.Viewport.prototype={resetContentSize:function(n){return e.console.assert(n,"[Viewport.resetContentSize] contentSize is required"),e.console.assert(n instanceof e.Point,"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point"),e.console.assert(n.x>0,"[Viewport.resetContentSize] contentSize.x must be greater than 0"),e.console.assert(n.y>0,"[Viewport.resetContentSize] contentSize.y must be greater than 0"),this._setContentBounds(new e.Rect(0,0,1,n.y/n.x),n.x),this},setHomeBounds:function(n,r){e.console.error("[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually."),this._setContentBounds(n,r)},_setContentBounds:function(n,r){e.console.assert(n,"[Viewport._setContentBounds] bounds is required"),e.console.assert(n instanceof e.Rect,"[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect"),e.console.assert(n.width>0,"[Viewport._setContentBounds] bounds.width must be greater than 0"),e.console.assert(n.height>0,"[Viewport._setContentBounds] bounds.height must be greater than 0"),this._contentBoundsNoRotate=n.clone(),this._contentSizeNoRotate=this._contentBoundsNoRotate.getSize().times(r),this._contentBounds=n.rotate(this.degrees).getBoundingBox(),this._contentSize=this._contentBounds.getSize().times(r),this._contentAspectRatio=this._contentSize.x/this._contentSize.y,this.viewer&&this.viewer.raiseEvent("reset-size",{contentSize:this._contentSizeNoRotate.clone(),contentFactor:r,homeBounds:this._contentBoundsNoRotate.clone(),contentBounds:this._contentBounds.clone()})},getHomeZoom:function(){if(this.defaultZoomLevel)return this.defaultZoomLevel;var n=this._contentAspectRatio/this.getAspectRatio(),r;return this.homeFillsViewer?r=n>=1?n:1:r=n>=1?1:n,r/this._contentBounds.width},getHomeBounds:function(){return this.getHomeBoundsNoRotate().rotate(-this.getRotation())},getHomeBoundsNoRotate:function(){var n=this._contentBounds.getCenter(),r=1/this.getHomeZoom(),o=r/this.getAspectRatio();return new e.Rect(n.x-r/2,n.y-o/2,r,o)},goHome:function(n){return this.viewer&&this.viewer.raiseEvent("home",{immediately:n}),this.fitBounds(this.getHomeBounds(),n)},getMinZoom:function(){var n=this.getHomeZoom(),r=this.minZoomLevel?this.minZoomLevel:this.minZoomImageRatio*n;return r},getMaxZoom:function(){var n=this.maxZoomLevel;return n||(n=this._contentSize.x*this.maxZoomPixelRatio/this._containerInnerSize.x,n/=this._contentBounds.width),Math.max(n,this.getHomeZoom())},getAspectRatio:function(){return this._containerInnerSize.x/this._containerInnerSize.y},getContainerSize:function(){return new e.Point(this.containerSize.x,this.containerSize.y)},getMargins:function(){return e.extend({},this._margins)},setMargins:function(n){e.console.assert(e.type(n)==="object","[Viewport.setMargins] margins must be an object"),this._margins=e.extend({left:0,top:0,right:0,bottom:0},n),this._updateContainerInnerSize(),this.viewer&&this.viewer.forceRedraw()},getBounds:function(n){return this.getBoundsNoRotate(n).rotate(-this.getRotation())},getBoundsNoRotate:function(n){var r=this.getCenter(n),o=1/this.getZoom(n),s=o/this.getAspectRatio();return new e.Rect(r.x-o/2,r.y-s/2,o,s)},getBoundsWithMargins:function(n){return this.getBoundsNoRotateWithMargins(n).rotate(-this.getRotation(),this.getCenter(n))},getBoundsNoRotateWithMargins:function(n){var r=this.getBoundsNoRotate(n),o=this._containerInnerSize.x*this.getZoom(n);return r.x-=this._margins.left/o,r.y-=this._margins.top/o,r.width+=(this._margins.left+this._margins.right)/o,r.height+=(this._margins.top+this._margins.bottom)/o,r},getCenter:function(n){var r=new e.Point(this.centerSpringX.current.value,this.centerSpringY.current.value),o=new e.Point(this.centerSpringX.target.value,this.centerSpringY.target.value),s,a,l,u,c,h,d,g;return n?r:this.zoomPoint?(s=this.pixelFromPoint(this.zoomPoint,!0),a=this.getZoom(),l=1/a,u=l/this.getAspectRatio(),c=new e.Rect(r.x-l/2,r.y-u/2,l,u),h=this._pixelFromPoint(this.zoomPoint,c),d=h.minus(s),g=d.divide(this._containerInnerSize.x*a),o.plus(g)):o},getZoom:function(n){return n?this.zoomSpring.current.value:this.zoomSpring.target.value},_applyZoomConstraints:function(n){return Math.max(Math.min(n,this.getMaxZoom()),this.getMinZoom())},_applyBoundaryConstraints:function(n){var r=new e.Rect(n.x,n.y,n.width,n.height);if(!this.wrapHorizontal){var o=this.visibilityRatio*r.width,s=r.x+r.width,a=this._contentBoundsNoRotate.x+this._contentBoundsNoRotate.width,l=this._contentBoundsNoRotate.x-s+o,u=a-r.x-o;o>this._contentBoundsNoRotate.width?r.x+=(l+u)/2:u<0?r.x+=u:l>0&&(r.x+=l)}if(!this.wrapVertical){var c=this.visibilityRatio*r.height,h=r.y+r.height,d=this._contentBoundsNoRotate.y+this._contentBoundsNoRotate.height,g=this._contentBoundsNoRotate.y-h+c,y=d-r.y-c;c>this._contentBoundsNoRotate.height?r.y+=(g+y)/2:y<0?r.y+=y:g>0&&(r.y+=g)}return r},_raiseConstraintsEvent:function(n){this.viewer&&this.viewer.raiseEvent("constrain",{immediately:n})},applyConstraints:function(n){var r=this.getZoom(),o=this._applyZoomConstraints(r);r!==o&&this.zoomTo(o,this.zoomPoint,n);var s=this.getBoundsNoRotate(),a=this._applyBoundaryConstraints(s);return this._raiseConstraintsEvent(n),(s.x!==a.x||s.y!==a.y||n)&&this.fitBounds(a.rotate(-this.getRotation()),n),this},ensureVisible:function(n){return this.applyConstraints(n)},_fitBounds:function(n,r){r=r||{};var o=r.immediately||!1,s=r.constraints||!1,a=this.getAspectRatio(),l=n.getCenter(),u=new e.Rect(n.x,n.y,n.width,n.height,n.degrees+this.getRotation()).getBoundingBox();u.getAspectRatio()>=a?u.height=u.width/a:u.width=u.height*a,u.x=l.x-u.width/2,u.y=l.y-u.height/2;var c=1/u.width;if(s){var h=u.getAspectRatio(),d=this._applyZoomConstraints(c);c!==d&&(c=d,u.width=1/c,u.x=l.x-u.width/2,u.height=u.width/h,u.y=l.y-u.height/2),u=this._applyBoundaryConstraints(u),l=u.getCenter(),this._raiseConstraintsEvent(o)}if(o)return this.panTo(l,!0),this.zoomTo(c,null,!0);this.panTo(this.getCenter(!0),!0),this.zoomTo(this.getZoom(!0),null,!0);var g=this.getBounds(),y=this.getZoom();if(y===0||Math.abs(c/y-1)<1e-8)return this.zoomTo(c,!0),this.panTo(l,o);u=u.rotate(-this.getRotation());var x=u.getTopLeft().times(c).minus(g.getTopLeft().times(y)).divide(c-y);return this.zoomTo(c,x,o)},fitBounds:function(n,r){return this._fitBounds(n,{immediately:r,constraints:!1})},fitBoundsWithConstraints:function(n,r){return this._fitBounds(n,{immediately:r,constraints:!0})},fitVertically:function(n){var r=new e.Rect(this._contentBounds.x+this._contentBounds.width/2,this._contentBounds.y,0,this._contentBounds.height);return this.fitBounds(r,n)},fitHorizontally:function(n){var r=new e.Rect(this._contentBounds.x,this._contentBounds.y+this._contentBounds.height/2,this._contentBounds.width,0);return this.fitBounds(r,n)},getConstrainedBounds:function(n){var r,o;return r=this.getBounds(n),o=this._applyBoundaryConstraints(r),o},panBy:function(n,r){var o=new e.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);return this.panTo(o.plus(n),r)},panTo:function(n,r){return r?(this.centerSpringX.resetTo(n.x),this.centerSpringY.resetTo(n.y)):(this.centerSpringX.springTo(n.x),this.centerSpringY.springTo(n.y)),this.viewer&&this.viewer.raiseEvent("pan",{center:n,immediately:r}),this},zoomBy:function(n,r,o){return this.zoomTo(this.zoomSpring.target.value*n,r,o)},zoomTo:function(n,r,o){var s=this;return this.zoomPoint=r instanceof e.Point&&!isNaN(r.x)&&!isNaN(r.y)?r:null,o?this._adjustCenterSpringsForZoomPoint(function(){s.zoomSpring.resetTo(n)}):this.zoomSpring.springTo(n),this.viewer&&this.viewer.raiseEvent("zoom",{zoom:n,refPoint:r,immediately:o}),this},setRotation:function(n){return!this.viewer||!this.viewer.drawer.canRotate()?this:(this.degrees=e.positiveModulo(n,360),this._setContentBounds(this.viewer.world.getHomeBounds(),this.viewer.world.getContentFactor()),this.viewer.forceRedraw(),this.viewer.raiseEvent("rotate",{degrees:n}),this)},getRotation:function(){return this.degrees},resize:function(n,r){var o=this.getBoundsNoRotate(),s=o,a;return this.containerSize.x=n.x,this.containerSize.y=n.y,this._updateContainerInnerSize(),r&&(a=n.x/this.containerSize.x,s.width=o.width*a,s.height=s.width/this.getAspectRatio()),this.viewer&&this.viewer.raiseEvent("resize",{newContainerSize:n,maintain:r}),this.fitBounds(s,!0)},_updateContainerInnerSize:function(){this._containerInnerSize=new e.Point(Math.max(1,this.containerSize.x-(this._margins.left+this._margins.right)),Math.max(1,this.containerSize.y-(this._margins.top+this._margins.bottom)))},update:function(){var n=this;this._adjustCenterSpringsForZoomPoint(function(){n.zoomSpring.update()}),this.centerSpringX.update(),this.centerSpringY.update();var r=this.centerSpringX.current.value!==this._oldCenterX||this.centerSpringY.current.value!==this._oldCenterY||this.zoomSpring.current.value!==this._oldZoom;return this._oldCenterX=this.centerSpringX.current.value,this._oldCenterY=this.centerSpringY.current.value,this._oldZoom=this.zoomSpring.current.value,r},_adjustCenterSpringsForZoomPoint:function(n){if(this.zoomPoint){var r=this.pixelFromPoint(this.zoomPoint,!0);n();var o=this.pixelFromPoint(this.zoomPoint,!0),s=o.minus(r),a=this.deltaPointsFromPixels(s,!0);this.centerSpringX.shiftBy(a.x),this.centerSpringY.shiftBy(a.y),this.zoomSpring.isAtTargetValue()&&(this.zoomPoint=null)}else n()},deltaPixelsFromPointsNoRotate:function(n,r){return n.times(this._containerInnerSize.x*this.getZoom(r))},deltaPixelsFromPoints:function(n,r){return this.deltaPixelsFromPointsNoRotate(n.rotate(this.getRotation()),r)},deltaPointsFromPixelsNoRotate:function(n,r){return n.divide(this._containerInnerSize.x*this.getZoom(r))},deltaPointsFromPixels:function(n,r){return this.deltaPointsFromPixelsNoRotate(n,r).rotate(-this.getRotation())},pixelFromPointNoRotate:function(n,r){return this._pixelFromPointNoRotate(n,this.getBoundsNoRotate(r))},pixelFromPoint:function(n,r){return this._pixelFromPoint(n,this.getBoundsNoRotate(r))},_pixelFromPointNoRotate:function(n,r){return n.minus(r.getTopLeft()).times(this._containerInnerSize.x/r.width).plus(new e.Point(this._margins.left,this._margins.top))},_pixelFromPoint:function(n,r){return this._pixelFromPointNoRotate(n.rotate(this.getRotation(),this.getCenter(!0)),r)},pointFromPixelNoRotate:function(n,r){var o=this.getBoundsNoRotate(r);return n.minus(new e.Point(this._margins.left,this._margins.top)).divide(this._containerInnerSize.x/o.width).plus(o.getTopLeft())},pointFromPixel:function(n,r){return this.pointFromPixelNoRotate(n,r).rotate(-this.getRotation(),this.getCenter(!0))},_viewportToImageDelta:function(n,r){var o=this._contentBoundsNoRotate.width;return new e.Point(n*this._contentSizeNoRotate.x/o,r*this._contentSizeNoRotate.x/o)},viewportToImageCoordinates:function(n,r){if(n instanceof e.Point)return this.viewportToImageCoordinates(n.x,n.y);if(this.viewer){var o=this.viewer.world.getItemCount();if(o>1)e.console.error("[Viewport.viewportToImageCoordinates] is not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.");else if(o===1){var s=this.viewer.world.getItemAt(0);return s.viewportToImageCoordinates(n,r,!0)}}return this._viewportToImageDelta(n-this._contentBoundsNoRotate.x,r-this._contentBoundsNoRotate.y)},_imageToViewportDelta:function(n,r){var o=this._contentBoundsNoRotate.width;return new e.Point(n/this._contentSizeNoRotate.x*o,r/this._contentSizeNoRotate.x*o)},imageToViewportCoordinates:function(n,r){if(n instanceof e.Point)return this.imageToViewportCoordinates(n.x,n.y);if(this.viewer){var o=this.viewer.world.getItemCount();if(o>1)e.console.error("[Viewport.imageToViewportCoordinates] is not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.");else if(o===1){var s=this.viewer.world.getItemAt(0);return s.imageToViewportCoordinates(n,r,!0)}}var a=this._imageToViewportDelta(n,r);return a.x+=this._contentBoundsNoRotate.x,a.y+=this._contentBoundsNoRotate.y,a},imageToViewportRectangle:function(n,r,o,s){var a=n;if(a instanceof e.Rect||(a=new e.Rect(n,r,o,s)),this.viewer){var l=this.viewer.world.getItemCount();if(l>1)e.console.error("[Viewport.imageToViewportRectangle] is not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.");else if(l===1){var u=this.viewer.world.getItemAt(0);return u.imageToViewportRectangle(n,r,o,s,!0)}}var c=this.imageToViewportCoordinates(a.x,a.y),h=this._imageToViewportDelta(a.width,a.height);return new e.Rect(c.x,c.y,h.x,h.y,a.degrees)},viewportToImageRectangle:function(n,r,o,s){var a=n;if(a instanceof e.Rect||(a=new e.Rect(n,r,o,s)),this.viewer){var l=this.viewer.world.getItemCount();if(l>1)e.console.error("[Viewport.viewportToImageRectangle] is not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.");else if(l===1){var u=this.viewer.world.getItemAt(0);return u.viewportToImageRectangle(n,r,o,s,!0)}}var c=this.viewportToImageCoordinates(a.x,a.y),h=this._viewportToImageDelta(a.width,a.height);return new e.Rect(c.x,c.y,h.x,h.y,a.degrees)},viewerElementToImageCoordinates:function(n){var r=this.pointFromPixel(n,!0);return this.viewportToImageCoordinates(r)},imageToViewerElementCoordinates:function(n){var r=this.imageToViewportCoordinates(n);return this.pixelFromPoint(r,!0)},windowToImageCoordinates:function(n){e.console.assert(this.viewer,"[Viewport.windowToImageCoordinates] the viewport must have a viewer.");var r=n.minus(e.getElementPosition(this.viewer.element));return this.viewerElementToImageCoordinates(r)},imageToWindowCoordinates:function(n){e.console.assert(this.viewer,"[Viewport.imageToWindowCoordinates] the viewport must have a viewer.");var r=this.imageToViewerElementCoordinates(n);return r.plus(e.getElementPosition(this.viewer.element))},viewerElementToViewportCoordinates:function(n){return this.pointFromPixel(n,!0)},viewportToViewerElementCoordinates:function(n){return this.pixelFromPoint(n,!0)},viewerElementToViewportRectangle:function(n){return e.Rect.fromSummits(this.pointFromPixel(n.getTopLeft(),!0),this.pointFromPixel(n.getTopRight(),!0),this.pointFromPixel(n.getBottomLeft(),!0))},viewportToViewerElementRectangle:function(n){return e.Rect.fromSummits(this.pixelFromPoint(n.getTopLeft(),!0),this.pixelFromPoint(n.getTopRight(),!0),this.pixelFromPoint(n.getBottomLeft(),!0))},windowToViewportCoordinates:function(n){e.console.assert(this.viewer,"[Viewport.windowToViewportCoordinates] the viewport must have a viewer.");var r=n.minus(e.getElementPosition(this.viewer.element));return this.viewerElementToViewportCoordinates(r)},viewportToWindowCoordinates:function(n){e.console.assert(this.viewer,"[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.");var r=this.viewportToViewerElementCoordinates(n);return r.plus(e.getElementPosition(this.viewer.element))},viewportToImageZoom:function(n){if(this.viewer){var r=this.viewer.world.getItemCount();if(r>1)e.console.error("[Viewport.viewportToImageZoom] is not accurate with multi-image.");else if(r===1){var o=this.viewer.world.getItemAt(0);return o.viewportToImageZoom(n)}}var s=this._contentSizeNoRotate.x,a=this._containerInnerSize.x,l=this._contentBoundsNoRotate.width,u=a/s*l;return n*u},imageToViewportZoom:function(n){if(this.viewer){var r=this.viewer.world.getItemCount();if(r>1)e.console.error("[Viewport.imageToViewportZoom] is not accurate with multi-image.");else if(r===1){var o=this.viewer.world.getItemAt(0);return o.imageToViewportZoom(n)}}var s=this._contentSizeNoRotate.x,a=this._containerInnerSize.x,l=this._contentBoundsNoRotate.width,u=s/a/l;return n*u},toggleFlip:function(){return this.setFlip(!this.getFlip()),this},getFlip:function(){return this.flipped},setFlip:function(n){return this.flipped===n?this:(this.flipped=n,this.viewer.navigator&&this.viewer.navigator.setFlip(this.getFlip()),this.viewer.forceRedraw(),this.viewer.raiseEvent("flip",{flipped:n}),this)}}}(t),function(e){e.TiledImage=function(f){var E=this;e.console.assert(f.tileCache,"[TiledImage] options.tileCache is required"),e.console.assert(f.drawer,"[TiledImage] options.drawer is required"),e.console.assert(f.viewer,"[TiledImage] options.viewer is required"),e.console.assert(f.imageLoader,"[TiledImage] options.imageLoader is required"),e.console.assert(f.source,"[TiledImage] options.source is required"),e.console.assert(!f.clip||f.clip instanceof e.Rect,"[TiledImage] options.clip must be an OpenSeadragon.Rect if present"),e.EventSource.call(this),this._tileCache=f.tileCache,delete f.tileCache,this._drawer=f.drawer,delete f.drawer,this._imageLoader=f.imageLoader,delete f.imageLoader,f.clip instanceof e.Rect&&(this._clip=f.clip.clone()),delete f.clip;var A=f.x||0;delete f.x;var C=f.y||0;delete f.y,this.normHeight=f.source.dimensions.y/f.source.dimensions.x,this.contentAspectX=f.source.dimensions.x/f.source.dimensions.y;var O=1;f.width?(O=f.width,delete f.width,f.height&&(e.console.error("specifying both width and height to a tiledImage is not supported"),delete f.height)):f.height&&(O=f.height/this.normHeight,delete f.height);var D=f.fitBounds;delete f.fitBounds;var I=f.fitBoundsPlacement||t.Placement.CENTER;delete f.fitBoundsPlacement;var B=f.degrees||0;delete f.degrees,e.extend(!0,this,{viewer:null,tilesMatrix:{},coverage:{},loadingCoverage:{},lastDrawn:[],lastResetTime:0,_midDraw:!1,_needsDraw:!0,_hasOpaqueTile:!1,_tilesLoading:0,springStiffness:e.DEFAULT_SETTINGS.springStiffness,animationTime:e.DEFAULT_SETTINGS.animationTime,minZoomImageRatio:e.DEFAULT_SETTINGS.minZoomImageRatio,wrapHorizontal:e.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:e.DEFAULT_SETTINGS.wrapVertical,immediateRender:e.DEFAULT_SETTINGS.immediateRender,blendTime:e.DEFAULT_SETTINGS.blendTime,alwaysBlend:e.DEFAULT_SETTINGS.alwaysBlend,minPixelRatio:e.DEFAULT_SETTINGS.minPixelRatio,smoothTileEdgesMinZoom:e.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,iOSDevice:e.DEFAULT_SETTINGS.iOSDevice,debugMode:e.DEFAULT_SETTINGS.debugMode,crossOriginPolicy:e.DEFAULT_SETTINGS.crossOriginPolicy,ajaxWithCredentials:e.DEFAULT_SETTINGS.ajaxWithCredentials,placeholderFillStyle:e.DEFAULT_SETTINGS.placeholderFillStyle,opacity:e.DEFAULT_SETTINGS.opacity,preload:e.DEFAULT_SETTINGS.preload,compositeOperation:e.DEFAULT_SETTINGS.compositeOperation},f),this._preload=this.preload,delete this.preload,this._fullyLoaded=!1,this._xSpring=new e.Spring({initial:A,springStiffness:this.springStiffness,animationTime:this.animationTime}),this._ySpring=new e.Spring({initial:C,springStiffness:this.springStiffness,animationTime:this.animationTime}),this._scaleSpring=new e.Spring({initial:O,springStiffness:this.springStiffness,animationTime:this.animationTime}),this._degreesSpring=new e.Spring({initial:B,springStiffness:this.springStiffness,animationTime:this.animationTime}),this._updateForScale(),D&&this.fitBounds(D,I,!0),this._drawingHandler=function(Z){E.viewer.raiseEvent("tile-drawing",e.extend({tiledImage:E},Z))}},e.extend(e.TiledImage.prototype,e.EventSource.prototype,{needsDraw:function(){return this._needsDraw},getFullyLoaded:function(){return this._fullyLoaded},_setFullyLoaded:function(f){f!==this._fullyLoaded&&(this._fullyLoaded=f,this.raiseEvent("fully-loaded-change",{fullyLoaded:this._fullyLoaded}))},reset:function(){this._tileCache.clearTilesFor(this),this.lastResetTime=e.now(),this._needsDraw=!0},update:function(){var f=this._xSpring.update(),E=this._ySpring.update(),A=this._scaleSpring.update(),C=this._degreesSpring.update();return f||E||A||C?(this._updateForScale(),this._needsDraw=!0,!0):!1},draw:function(){this.opacity!==0||this._preload?(this._midDraw=!0,this._updateViewport(),this._midDraw=!1):this._needsDraw=!1},destroy:function(){this.reset(),this.source.destroy&&this.source.destroy()},getBounds:function(f){return this.getBoundsNoRotate(f).rotate(this.getRotation(f),this._getRotationPoint(f))},getBoundsNoRotate:function(f){return f?new e.Rect(this._xSpring.current.value,this._ySpring.current.value,this._worldWidthCurrent,this._worldHeightCurrent):new e.Rect(this._xSpring.target.value,this._ySpring.target.value,this._worldWidthTarget,this._worldHeightTarget)},getWorldBounds:function(){return e.console.error("[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead"),this.getBounds()},getClippedBounds:function(f){var E=this.getBoundsNoRotate(f);if(this._clip){var A=f?this._worldWidthCurrent:this._worldWidthTarget,C=A/this.source.dimensions.x,O=this._clip.times(C);E=new e.Rect(E.x+O.x,E.y+O.y,O.width,O.height)}return E.rotate(this.getRotation(f),this._getRotationPoint(f))},getTileBounds:function(f,E,A){var C=this.source.getNumTiles(f),O=(C.x+E%C.x)%C.x,D=(C.y+A%C.y)%C.y,I=this.source.getTileBounds(f,O,D);return this.getFlip()&&(I.x=1-I.x-I.width),I.x+=(E-O)/C.x,I.y+=this._worldHeightCurrent/this._worldWidthCurrent*((A-D)/C.y),I},getContentSize:function(){return new e.Point(this.source.dimensions.x,this.source.dimensions.y)},getSizeInWindowCoordinates:function(){var f=this.imageToWindowCoordinates(new e.Point(0,0)),E=this.imageToWindowCoordinates(this.getContentSize());return new e.Point(E.x-f.x,E.y-f.y)},_viewportToImageDelta:function(f,E,A){var C=A?this._scaleSpring.current.value:this._scaleSpring.target.value;return new e.Point(f*(this.source.dimensions.x/C),E*(this.source.dimensions.y*this.contentAspectX/C))},viewportToImageCoordinates:function(f,E,A){var C;return f instanceof e.Point?(A=E,C=f):C=new e.Point(f,E),C=C.rotate(-this.getRotation(A),this._getRotationPoint(A)),A?this._viewportToImageDelta(C.x-this._xSpring.current.value,C.y-this._ySpring.current.value):this._viewportToImageDelta(C.x-this._xSpring.target.value,C.y-this._ySpring.target.value)},_imageToViewportDelta:function(f,E,A){var C=A?this._scaleSpring.current.value:this._scaleSpring.target.value;return new e.Point(f/this.source.dimensions.x*C,E/this.source.dimensions.y/this.contentAspectX*C)},imageToViewportCoordinates:function(f,E,A){f instanceof e.Point&&(A=E,E=f.y,f=f.x);var C=this._imageToViewportDelta(f,E);return A?(C.x+=this._xSpring.current.value,C.y+=this._ySpring.current.value):(C.x+=this._xSpring.target.value,C.y+=this._ySpring.target.value),C.rotate(this.getRotation(A),this._getRotationPoint(A))},imageToViewportRectangle:function(f,E,A,C,O){var D=f;D instanceof e.Rect?O=E:D=new e.Rect(f,E,A,C);var I=this.imageToViewportCoordinates(D.getTopLeft(),O),B=this._imageToViewportDelta(D.width,D.height,O);return new e.Rect(I.x,I.y,B.x,B.y,D.degrees+this.getRotation(O))},viewportToImageRectangle:function(f,E,A,C,O){var D=f;f instanceof e.Rect?O=E:D=new e.Rect(f,E,A,C);var I=this.viewportToImageCoordinates(D.getTopLeft(),O),B=this._viewportToImageDelta(D.width,D.height,O);return new e.Rect(I.x,I.y,B.x,B.y,D.degrees-this.getRotation(O))},viewerElementToImageCoordinates:function(f){var E=this.viewport.pointFromPixel(f,!0);return this.viewportToImageCoordinates(E)},imageToViewerElementCoordinates:function(f){var E=this.imageToViewportCoordinates(f);return this.viewport.pixelFromPoint(E,!0)},windowToImageCoordinates:function(f){var E=f.minus(t.getElementPosition(this.viewer.element));return this.viewerElementToImageCoordinates(E)},imageToWindowCoordinates:function(f){var E=this.imageToViewerElementCoordinates(f);return E.plus(t.getElementPosition(this.viewer.element))},_viewportToTiledImageRectangle:function(f){var E=this._scaleSpring.current.value;return f=f.rotate(-this.getRotation(!0),this._getRotationPoint(!0)),new e.Rect((f.x-this._xSpring.current.value)/E,(f.y-this._ySpring.current.value)/E,f.width/E,f.height/E,f.degrees)},viewportToImageZoom:function(f){var E=this._scaleSpring.current.value*this.viewport._containerInnerSize.x/this.source.dimensions.x;return E*f},imageToViewportZoom:function(f){var E=this._scaleSpring.current.value*this.viewport._containerInnerSize.x/this.source.dimensions.x;return f/E},setPosition:function(f,E){var A=this._xSpring.target.value===f.x&&this._ySpring.target.value===f.y;if(E){if(A&&this._xSpring.current.value===f.x&&this._ySpring.current.value===f.y)return;this._xSpring.resetTo(f.x),this._ySpring.resetTo(f.y),this._needsDraw=!0}else{if(A)return;this._xSpring.springTo(f.x),this._ySpring.springTo(f.y),this._needsDraw=!0}A||this._raiseBoundsChange()},setWidth:function(f,E){this._setScale(f,E)},setHeight:function(f,E){this._setScale(f/this.normHeight,E)},setCroppingPolygons:function(f){var E=function(C){return C instanceof e.Point||typeof C.x=="number"&&typeof C.y=="number"},A=function(C){return C.map(function(O){try{if(E(O))return{x:O.x,y:O.y};throw new Error}catch{throw new Error("A Provided cropping polygon point is not supported")}})};try{if(!e.isArray(f))throw new Error("Provided cropping polygon is not an array");this._croppingPolygons=f.map(function(C){return A(C)})}catch(C){e.console.error("[TiledImage.setCroppingPolygons] Cropping polygon format not supported"),e.console.error(C),this._croppingPolygons=null}},resetCroppingPolygons:function(){this._croppingPolygons=null},fitBounds:function(f,E,A){E=E||e.Placement.CENTER;var C=e.Placement.properties[E],O=this.contentAspectX,D=0,I=0,B=1,Z=1;if(this._clip&&(O=this._clip.getAspectRatio(),B=this._clip.width/this.source.dimensions.x,Z=this._clip.height/this.source.dimensions.y,f.getAspectRatio()>O?(D=this._clip.x/this._clip.height*f.height,I=this._clip.y/this._clip.height*f.height):(D=this._clip.x/this._clip.width*f.width,I=this._clip.y/this._clip.width*f.width)),f.getAspectRatio()>O){var Y=f.height/Z,V=0;C.isHorizontallyCentered?V=(f.width-f.height*O)/2:C.isRight&&(V=f.width-f.height*O),this.setPosition(new e.Point(f.x-D+V,f.y-I),A),this.setHeight(Y,A)}else{var K=f.width/B,Q=0;C.isVerticallyCentered?Q=(f.height-f.width/O)/2:C.isBottom&&(Q=f.height-f.width/O),this.setPosition(new e.Point(f.x-D,f.y-I+Q),A),this.setWidth(K,A)}},getClip:function(){return this._clip?this._clip.clone():null},setClip:function(f){e.console.assert(!f||f instanceof e.Rect,"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null"),f instanceof e.Rect?this._clip=f.clone():this._clip=null,this._needsDraw=!0,this.raiseEvent("clip-change")},getFlip:function(){return!!this.flipped},setFlip:function(f){this.flipped=!!f,this._needsDraw=!0,this._raiseBoundsChange()},getOpacity:function(){return this.opacity},setOpacity:function(f){f!==this.opacity&&(this.opacity=f,this._needsDraw=!0,this.raiseEvent("opacity-change",{opacity:this.opacity}))},getPreload:function(){return this._preload},setPreload:function(f){this._preload=!!f,this._needsDraw=!0},getRotation:function(f){return f?this._degreesSpring.current.value:this._degreesSpring.target.value},setRotation:function(f,E){this._degreesSpring.target.value===f&&this._degreesSpring.isAtTargetValue()||(E?this._degreesSpring.resetTo(f):this._degreesSpring.springTo(f),this._needsDraw=!0,this._raiseBoundsChange())},_getRotationPoint:function(f){return this.getBoundsNoRotate(f).getCenter()},getCompositeOperation:function(){return this.compositeOperation},setCompositeOperation:function(f){f!==this.compositeOperation&&(this.compositeOperation=f,this._needsDraw=!0,this.raiseEvent("composite-operation-change",{compositeOperation:this.compositeOperation}))},_setScale:function(f,E){var A=this._scaleSpring.target.value===f;if(E){if(A&&this._scaleSpring.current.value===f)return;this._scaleSpring.resetTo(f),this._updateForScale(),this._needsDraw=!0}else{if(A)return;this._scaleSpring.springTo(f),this._updateForScale(),this._needsDraw=!0}A||this._raiseBoundsChange()},_updateForScale:function(){this._worldWidthTarget=this._scaleSpring.target.value,this._worldHeightTarget=this.normHeight*this._scaleSpring.target.value,this._worldWidthCurrent=this._scaleSpring.current.value,this._worldHeightCurrent=this.normHeight*this._scaleSpring.current.value},_raiseBoundsChange:function(){this.raiseEvent("bounds-change")},_isBottomItem:function(){return this.viewer.world.getItemAt(0)===this},_getLevelsInterval:function(){var f=Math.max(this.source.minLevel,Math.floor(Math.log(this.minZoomImageRatio)/Math.log(2))),E=this.viewport.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(0),!0).x*this._scaleSpring.current.value,A=Math.min(Math.abs(this.source.maxLevel),Math.abs(Math.floor(Math.log(E/this.minPixelRatio)/Math.log(2))));return A=Math.max(A,this.source.minLevel||0),f=Math.min(f,A),{lowestLevel:f,highestLevel:A}},_updateViewport:function(){for(this._needsDraw=!1,this._tilesLoading=0,this.loadingCoverage={};this.lastDrawn.length>0;){var f=this.lastDrawn.pop();f.beingDrawn=!1}var E=this.viewport,A=this._viewportToTiledImageRectangle(E.getBoundsWithMargins(!0));if(!this.wrapHorizontal&&!this.wrapVertical){var C=this._viewportToTiledImageRectangle(this.getClippedBounds(!0));if(A=A.intersection(C),A===null)return}for(var O=this._getLevelsInterval(),D=O.lowestLevel,I=O.highestLevel,B=null,Z=!1,Y=e.now(),V=I;V>=D;V--){var K=!1,Q=E.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(V),!0).x*this._scaleSpring.current.value;if(V===D||!Z&&Q>=this.minPixelRatio)K=!0,Z=!0;else if(!Z)continue;var le=E.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(V),!1).x*this._scaleSpring.current.value,re=E.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(Math.max(this.source.getClosestLevel(),0)),!1).x*this._scaleSpring.current.value,se=this.immediateRender?1:re,de=Math.min(1,(Q-.5)/.5),pe=se/Math.abs(se-le);if(B=n(this,Z,K,V,de,pe,A,Y,B),h(this.coverage,V))break}b(this,this.lastDrawn),B&&!B.context2D?(s(this,B,Y),this._needsDraw=!0,this._setFullyLoaded(!1)):this._setFullyLoaded(this._tilesLoading===0)},_getCornerTiles:function(f,E,A){var C,O;this.wrapHorizontal?(C=e.positiveModulo(E.x,1),O=e.positiveModulo(A.x,1)):(C=Math.max(0,E.x),O=Math.min(1,A.x));var D,I,B=1/this.source.aspectRatio;this.wrapVertical?(D=e.positiveModulo(E.y,B),I=e.positiveModulo(A.y,B)):(D=Math.max(0,E.y),I=Math.min(B,A.y));var Z=this.source.getTileAtPoint(f,new e.Point(C,D)),Y=this.source.getTileAtPoint(f,new e.Point(O,I)),V=this.source.getNumTiles(f);return this.wrapHorizontal&&(Z.x+=V.x*Math.floor(E.x),Y.x+=V.x*Math.floor(A.x)),this.wrapVertical&&(Z.y+=V.y*Math.floor(E.y/B),Y.y+=V.y*Math.floor(A.y/B)),{topLeft:Z,bottomRight:Y}}});function n(f,E,A,C,O,D,I,B,Z){var Y=I.getBoundingBox().getTopLeft(),V=I.getBoundingBox().getBottomRight();f.viewer&&f.viewer.raiseEvent("update-level",{tiledImage:f,havedrawn:E,level:C,opacity:O,visibility:D,drawArea:I,topleft:Y,bottomright:V,currenttime:B,best:Z}),y(f.coverage,C),y(f.loadingCoverage,C);var K=f._getCornerTiles(C,Y,V),Q=K.topLeft,le=K.bottomRight,re=f.source.getNumTiles(C),se=f.viewport.pixelFromPoint(f.viewport.getCenter());f.getFlip()&&(le.x+=1,f.wrapHorizontal||(le.x=Math.min(le.x,re.x-1)));for(var de=Q.x;de<=le.x;de++)for(var pe=Q.y;pe<=le.y;pe++){var G;if(f.getFlip()){var Me=(re.x+de%re.x)%re.x;G=de+re.x-Me-Me-1}else G=de;I.intersection(f.getTileBounds(C,G,pe))!==null&&(Z=r(f,A,E,G,pe,C,O,D,se,re,B,Z))}return Z}function r(f,E,A,C,O,D,I,B,Z,Y,V,K){var Q=o(C,O,D,f,f.source,f.tilesMatrix,V,Y,f._worldWidthCurrent,f._worldHeightCurrent),le=A;f.viewer&&f.viewer.raiseEvent("update-tile",{tiledImage:f,tile:Q}),g(f.coverage,D,C,O,!1);var re=Q.loaded||Q.loading||d(f.loadingCoverage,D,C,O);if(g(f.loadingCoverage,D,C,O,re),!Q.exists||(E&&!le&&(d(f.coverage,D,C,O)?g(f.coverage,D,C,O,!0):le=!0),!le))return K;if(u(Q,f.source.tileOverlap,f.viewport,Z,B,f),!Q.loaded)if(Q.context2D)l(f,Q);else{var se=f._tileCache.getImageRecord(Q.cacheKey);if(se){var de=se.getImage();l(f,Q,de)}}if(Q.loaded){var pe=c(f,Q,C,O,D,I,V);pe&&(f._needsDraw=!0)}else Q.loading?f._tilesLoading++:re||(K=x(K,Q));return K}function o(f,E,A,C,O,D,I,B,Z,Y){var V,K,Q,le,re,se,de,pe,G;return D[A]||(D[A]={}),D[A][f]||(D[A][f]={}),(!D[A][f][E]||!D[A][f][E].flipped!=!C.flipped)&&(V=(B.x+f%B.x)%B.x,K=(B.y+E%B.y)%B.y,Q=C.getTileBounds(A,f,E),le=O.getTileBounds(A,V,K,!0),re=O.tileExists(A,V,K),se=O.getTileUrl(A,V,K),C.loadTilesWithAjax?(de=O.getTileAjaxHeaders(A,V,K),e.isPlainObject(C.ajaxHeaders)&&(de=e.extend({},C.ajaxHeaders,de))):de=null,pe=O.getContext2D?O.getContext2D(A,V,K):void 0,G=new e.Tile(A,f,E,Q,re,se,pe,C.loadTilesWithAjax,de,le),C.getFlip()?V===0&&(G.isRightMost=!0):V===B.x-1&&(G.isRightMost=!0),K===B.y-1&&(G.isBottomMost=!0),G.flipped=C.flipped,D[A][f][E]=G),G=D[A][f][E],G.lastTouchTime=I,G}function s(f,E,A){E.loading=!0,f._imageLoader.addJob({src:E.url,loadWithAjax:E.loadWithAjax,ajaxHeaders:E.ajaxHeaders,crossOriginPolicy:f.crossOriginPolicy,ajaxWithCredentials:f.ajaxWithCredentials,callback:function(C,O,D){a(f,E,A,C,O,D)},abort:function(){E.loading=!1}})}function a(f,E,A,C,O,D){if(!C){e.console.log("Tile %s failed to load: %s - error: %s",E,E.url,O),f.viewer.raiseEvent("tile-load-failed",{tile:E,tiledImage:f,time:A,message:O,tileRequest:D}),E.loading=!1,E.exists=!1;return}if(Af.visibility||E.visibility===f.visibility&&E.squaredDistance1&&B>f.smoothTileEdgesMinZoom&&!f.iOSDevice&&f.getRotation(!0)%360===0&&e.supportsCanvas&&(C=!0,O=A.getScaleForEdgeSmoothing(),D=A.getTranslationForEdgeSmoothing(O,f._drawer.getCanvasSize(!1),f._drawer.getCanvasSize(!0)));var Z;C&&(O||(Z=f.viewport.viewportToViewerElementRectangle(f.getClippedBounds(!0)).getIntegerBoundingBox(),f._drawer.viewer.viewport.getFlip()&&(f.viewport.degrees!==0||f.getRotation(!0)%360!==0)&&(Z.x=f._drawer.viewer.container.clientWidth-(Z.x+Z.width)),Z=Z.times(e.pixelDensityRatio)),f._drawer._clear(!0,Z)),O||(f.viewport.degrees!==0&&f._drawer._offsetForRotation({degrees:f.viewport.degrees,useSketch:C}),f.getRotation(!0)%360!==0&&f._drawer._offsetForRotation({degrees:f.getRotation(!0),point:f.viewport.pixelFromPointNoRotate(f._getRotationPoint(!0),!0),useSketch:C}),f.viewport.degrees===0&&f.getRotation(!0)%360===0&&f._drawer.viewer.viewport.getFlip()&&f._drawer._flip());var Y=!1;if(f._clip){f._drawer.saveContext(C);var V=f.imageToViewportRectangle(f._clip,!0);V=V.rotate(-f.getRotation(!0),f._getRotationPoint(!0));var K=f._drawer.viewportToDrawerRectangle(V);O&&(K=K.times(O)),D&&(K=K.translate(D)),f._drawer.setClip(K,C),Y=!0}if(f._croppingPolygons){f._drawer.saveContext(C);try{var Q=f._croppingPolygons.map(function(de){return de.map(function(pe){var G=f.imageToViewportCoordinates(pe.x,pe.y,!0).rotate(-f.getRotation(!0),f._getRotationPoint(!0)),Me=f._drawer.viewportCoordToDrawerCoord(G);return O&&(Me=Me.times(O)),Me})});f._drawer.clipWithPolygons(Q,C)}catch(de){e.console.error(de)}Y=!0}if(f.placeholderFillStyle&&f._hasOpaqueTile===!1){var le=f._drawer.viewportToDrawerRectangle(f.getBounds(!0));O&&(le=le.times(O)),D&&(le=le.translate(D));var re=null;typeof f.placeholderFillStyle=="function"?re=f.placeholderFillStyle(f,f._drawer.context):re=f.placeholderFillStyle,f._drawer.drawRectangle(le,re,C)}for(var se=E.length-1;se>=0;se--)A=E[se],f._drawer.drawTile(A,f._drawingHandler,C,O,D),A.beingDrawn=!0,f.viewer&&f.viewer.raiseEvent("tile-drawn",{tiledImage:f,tile:A});Y&&f._drawer.restoreContext(C),O||(f.getRotation(!0)%360!==0&&f._drawer._restoreRotationChanges(C),f.viewport.degrees!==0&&f._drawer._restoreRotationChanges(C)),C&&(O&&(f.viewport.degrees!==0&&f._drawer._offsetForRotation({degrees:f.viewport.degrees,useSketch:!1}),f.getRotation(!0)%360!==0&&f._drawer._offsetForRotation({degrees:f.getRotation(!0),point:f.viewport.pixelFromPointNoRotate(f._getRotationPoint(!0),!0),useSketch:!1})),f._drawer.blendSketch({opacity:f.opacity,scale:O,translate:D,compositeOperation:f.compositeOperation,bounds:Z}),O&&(f.getRotation(!0)%360!==0&&f._drawer._restoreRotationChanges(!1),f.viewport.degrees!==0&&f._drawer._restoreRotationChanges(!1))),O||f.viewport.degrees===0&&f.getRotation(!0)%360===0&&f._drawer.viewer.viewport.getFlip()&&f._drawer._flip(),T(f,E)}}function T(f,E){if(f.debugMode)for(var A=E.length-1;A>=0;A--){var C=E[A];try{f._drawer.drawDebugInfo(C,E.length,A,f)}catch(O){e.console.error(O)}}}}(t),function(e){var n=function(o){e.console.assert(o,"[TileCache.cacheTile] options is required"),e.console.assert(o.tile,"[TileCache.cacheTile] options.tile is required"),e.console.assert(o.tiledImage,"[TileCache.cacheTile] options.tiledImage is required"),this.tile=o.tile,this.tiledImage=o.tiledImage},r=function(o){e.console.assert(o,"[ImageRecord] options is required"),e.console.assert(o.image,"[ImageRecord] options.image is required"),this._image=o.image,this._tiles=[]};r.prototype={destroy:function(){this._image=null,this._renderedContext=null,this._tiles=null},getImage:function(){return this._image},getRenderedContext:function(){if(!this._renderedContext){var o=document.createElement("canvas");o.width=this._image.width,o.height=this._image.height,this._renderedContext=o.getContext("2d"),this._renderedContext.drawImage(this._image,0,0),this._image=null}return this._renderedContext},setRenderedContext:function(o){e.console.error("ImageRecord.setRenderedContext is deprecated. The rendered context should be created by the ImageRecord itself when calling ImageRecord.getRenderedContext."),this._renderedContext=o},addTile:function(o){e.console.assert(o,"[ImageRecord.addTile] tile is required"),this._tiles.push(o)},removeTile:function(o){for(var s=0;sthis._maxImageCacheCount){for(var u=null,c=-1,h=null,d,g,y,x,b,T,f=this._tilesLoaded.length-1;f>=0;f--)if(T=this._tilesLoaded[f],d=T.tile,!(d.level<=s||d.beingDrawn)){if(!u){u=d,c=f,h=T;continue}x=d.lastTouchTime,g=u.lastTouchTime,b=d.level,y=u.level,(xy)&&(u=d,c=f,h=T)}u&&c>=0&&(this._unloadTile(h),a=c)}this._tilesLoaded[a]=new n({tile:o.tile,tiledImage:o.tiledImage})},clearTilesFor:function(o){e.console.assert(o,"[TileCache.clearTilesFor] tiledImage is required");for(var s,a=0;a=this._items.length)throw new Error("Index bigger than number of layers.");r===o||o===-1||(this._items.splice(o,1),this._items.splice(r,0,n),this._needsDraw=!0,this.raiseEvent("item-index-change",{item:n,previousIndex:o,newIndex:r}))},removeItem:function(n){e.console.assert(n,"[World.removeItem] item is required");var r=e.indexOf(this._items,n);r!==-1&&(n.removeHandler("bounds-change",this._delegatedFigureSizes),n.removeHandler("clip-change",this._delegatedFigureSizes),n.destroy(),this._items.splice(r,1),this._figureSizes(),this._needsDraw=!0,this._raiseRemoveItem(n))},removeAll:function(){this.viewer._cancelPendingImages();var n,r;for(r=0;rx.height?b=l:b=l*(x.width/x.height),T=b*(x.height/x.width),f=new e.Point(d+(l-b)/2,g+(l-T)/2),y.setPosition(f,r),y.setWidth(b,r),o==="horizontal"?d+=c:g+=c;this.setAutoRefigureSizes(!0)},_figureSizes:function(){var n=this._homeBounds?this._homeBounds.clone():null,r=this._contentSize?this._contentSize.clone():null,o=this._contentFactor||0;if(!this._items.length)this._homeBounds=new e.Rect(0,0,1,1),this._contentSize=new e.Point(1,1),this._contentFactor=1;else{var s=this._items[0],a=s.getBounds();this._contentFactor=s.getContentSize().x/a.width;for(var l=s.getClippedBounds().getBoundingBox(),u=l.x,c=l.y,h=l.x+l.width,d=l.y+l.height,g=1;g{const t=i.getAttribute("class");return t?new Set(t.split(" ")):new Set},Et=(i,t)=>{const e=ns(i);e.add(t),i.setAttribute("class",Array.from(e).join(" "))},Qi=(i,t)=>{const e=ns(i);e.delete(t),e.size===0?i.removeAttribute("class"):i.setAttribute("class",Array.from(e).join(" "))},is=(i,t)=>ns(i).has(t),Rt=(i,t)=>{const e=i.selector("FragmentSelector");if(e!=null&&e.conformsTo.startsWith("http://www.w3.org/TR/media-frags")){const{value:n}=e,r=n.includes(":")?n.substring(n.indexOf("=")+1,n.indexOf(":")):"pixel",o=n.includes(":")?n.substring(n.indexOf(":")+1):n.substring(n.indexOf("=")+1);let[s,a,l,u]=o.split(",").map(parseFloat);return r.toLowerCase()==="percent"&&(s=s*t.naturalWidth/100,a=a*t.naturalHeight/100,l=l*t.naturalWidth/100,u=u*t.naturalHeight/100),{x:s,y:a,w:l,h:u}}},_E=(i,t,e,n,r)=>({source:r==null?void 0:r.src,selector:{type:"FragmentSelector",conformsTo:"http://www.w3.org/TR/media-frags/",value:`xywh=pixel:${i},${t},${e},${n}`}}),TE=(i,t,e,n,r)=>{const o=i/r.naturalWidth*100,s=t/r.naturalHeight*100,a=e/r.naturalWidth*100,l=n/r.naturalHeight*100;return{source:r.src,selector:{type:"FragmentSelector",conformsTo:"http://www.w3.org/TR/media-frags/",value:`xywh=percent:${o},${s},${a},${l}`}}},pn=(i,t,e,n,r,o)=>(o==null?void 0:o.toLowerCase())==="percent"?TE(i,t,e,n,r):_E(i,t,e,n,r),$i=(i,t,e,n,r)=>{i.setAttribute("x",t),i.setAttribute("y",e),i.setAttribute("width",n),i.setAttribute("height",r)},er=(i,t,e)=>{i.setAttribute("cx",t),i.setAttribute("cy",e),i.setAttribute("r",7)},kh=(i,t,e,n,r)=>{const o=document.createElementNS(ce,"path");o.setAttribute("fill-rule","evenodd");const{naturalWidth:s,naturalHeight:a}=i;return o.setAttribute("d",`M0 0 h${s} v${a} h-${s} z M${t} ${e} h${n} v${r} h-${n} z`),o},Lh=(i,t,e,n,r,o)=>{const{naturalWidth:s,naturalHeight:a}=t;i.setAttribute("d",`M0 0 h${s} v${a} h-${s} z M${e} ${n} h${r} v${o} h-${r} z`)},rs=(i,t,e,n)=>{const{x:r,y:o,w:s,h:a}=i.type==="Annotation"||i.type==="Selection"?Rt(i,t):{x:i,y:t,w:e,h:n},l=document.createElementNS(ce,"g");if(s===0&&a===0){Et(l,"a9s-point"),Et(l,"a9s-non-scaling"),l.setAttribute("transform-origin",`${r} ${o}`);const u=document.createElementNS(ce,"circle"),c=document.createElementNS(ce,"circle");c.setAttribute("class","a9s-inner"),er(c,r,o),u.setAttribute("class","a9s-outer"),er(u,r,o),l.appendChild(u),l.appendChild(c)}else{const u=document.createElementNS(ce,"rect"),c=document.createElementNS(ce,"rect");c.setAttribute("class","a9s-inner"),$i(c,r,o,s,a),u.setAttribute("class","a9s-outer"),$i(u,r,o,s,a),l.appendChild(u),l.appendChild(c)}return l},os=i=>{const t=i.querySelector(".a9s-outer");if(t.nodeName==="rect"){const e=parseFloat(t.getAttribute("x")),n=parseFloat(t.getAttribute("y")),r=parseFloat(t.getAttribute("width")),o=parseFloat(t.getAttribute("height"));return{x:e,y:n,w:r,h:o}}else{const e=parseFloat(t.getAttribute("cx")),n=parseFloat(t.getAttribute("cy"));return{x:e,y:n,w:0,h:0}}},Bh=(i,t,e,n,r)=>{const o=i.querySelector(".a9s-inner"),s=i.querySelector(".a9s-outer");s.nodeName==="rect"?($i(o,t,e,n,r),$i(s,t,e,n,r)):(er(o,t,e),er(s,t,e))},CE=(i,t)=>{const{w:e,h:n}=Rt(i,t);return e*n};class PE{constructor(t,e,n,r,o){P(this,"dragTo",(t,e)=>{this.group.style.display=null,this.opposite=[t,e];const{x:n,y:r,w:o,h:s}=this.bbox;Lh(this.mask,this.env.image,n,r,o,s),Bh(this.rect,n,r,o,s)});P(this,"getBoundingClientRect",()=>this.rect.getBoundingClientRect());P(this,"toSelection",()=>{const{x:t,y:e,w:n,h:r}=this.bbox;return new Wn(pn(t,e,n,r,this.env.image,this.config.fragmentUnit))});P(this,"destroy",()=>{this.group.parentNode.removeChild(this.group),this.mask=null,this.rect=null,this.group=null});this.anchor=[t,e],this.opposite=[t,e],this.config=r,this.env=o,this.group=document.createElementNS(ce,"g"),this.mask=kh(o.image,t,e,2,2),this.mask.setAttribute("class","a9s-selection-mask"),this.rect=rs(t,e,2,2),this.rect.setAttribute("class","a9s-selection"),this.group.style.pointerEvents="none",this.group.style.display="none",this.group.appendChild(this.mask),this.group.appendChild(this.rect),n.appendChild(this.group)}get bbox(){const t=this.opposite[0]-this.anchor[0],e=this.opposite[1]-this.anchor[1];return{x:t>0?this.anchor[0]:this.opposite[0],y:e>0?this.anchor[1]:this.opposite[1],w:Math.max(1,Math.abs(t)),h:Math.max(1,Math.abs(e))}}get element(){return this.rect}}const AE={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"},ss=()=>"ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0,OE=i=>{let t=null;const e=(r,o)=>new MouseEvent(r,{screenX:o.screenX,screenY:o.screenY,clientX:o.clientX,clientY:o.clientY,pageX:o.pageX,pageY:o.pageY,bubbles:!0}),n=r=>{const o=r.changedTouches[0],s=e(AE[r.type],o);o.target.dispatchEvent(s),r.preventDefault(),(r.type==="touchstart"||r.type==="touchmove")&&(t&&clearTimeout(t),t=setTimeout(()=>{const a=e("dblclick",o);o.target.dispatchEvent(a)},800)),r.type==="touchend"&&t&&clearTimeout(t)};i.addEventListener("touchstart",n,!0),i.addEventListener("touchmove",n,!0),i.addEventListener("touchend",n,!0),i.addEventListener("touchcancel",n,!0)},tr="An implementation is missing",DE=ss();class Ih extends Qn{constructor(e,n,r){super();P(this,"enableResponsive",()=>{window.ResizeObserver&&(this.resizeObserver=new ResizeObserver(()=>{const e=this.svg.getBoundingClientRect(),{width:n,height:r}=this.svg.viewBox.baseVal;this.scale=Math.max(n/e.width,r/e.height),this.onScaleChanged&&this.onScaleChanged(this.scale)}),this.resizeObserver.observe(this.svg.parentNode))});P(this,"getSVGPoint",e=>{const n=this.svg.createSVGPoint();if(DE){const r=this.svg.getBoundingClientRect(),o=e.clientX-r.x,s=e.clientY-r.y,{left:a,top:l}=this.svg.getBoundingClientRect();return n.x=o+a,n.y=s+l,n.matrixTransform(this.g.getScreenCTM().inverse())}else return n.x=e.offsetX,n.y=e.offsetY,n.matrixTransform(this.g.getCTM().inverse())});P(this,"drawHandle",(e,n)=>{const r=document.createElementNS(ce,"g");r.setAttribute("class","a9s-handle");const o=document.createElementNS(ce,"g"),s=c=>{const h=document.createElementNS(ce,"circle");return h.setAttribute("cx",e),h.setAttribute("cy",n),h.setAttribute("r",c),h.setAttribute("transform-origin",`${e} ${n}`),h},a=this.config.handleRadius||6,l=s(a);l.setAttribute("class","a9s-handle-inner");const u=s(a+1);return u.setAttribute("class","a9s-handle-outer"),o.appendChild(u),o.appendChild(l),r.appendChild(o),r});P(this,"setHandleXY",(e,n,r)=>{const o=e.querySelector(".a9s-handle-inner");o.setAttribute("cx",n),o.setAttribute("cy",r),o.setAttribute("transform-origin",`${n} ${r}`);const s=e.querySelector(".a9s-handle-outer");s.setAttribute("cx",n),s.setAttribute("cy",r),s.setAttribute("transform-origin",`${n} ${r}`)});P(this,"getHandleXY",e=>{const n=e.querySelector(".a9s-handle-outer");return{x:parseFloat(n.getAttribute("cx")),y:parseFloat(n.getAttribute("cy"))}});P(this,"scaleHandle",e=>{const n=e.querySelector(".a9s-handle-inner"),r=e.querySelector(".a9s-handle-outer"),o=this.scale*(this.config.handleRadius||6);n.setAttribute("r",o),r.setAttribute("r",o)});this.svg=e.closest("svg"),this.g=e,this.config=n,this.env=r,this.scale=1;const{image:o}=r;(o instanceof Element||o instanceof HTMLDocument)&&this.enableResponsive()}destroy(){this.resizeObserver&&this.resizeObserver.disconnect(),this.resizeObserver=null}}class as extends Ih{constructor(e,n,r){super(e,n,r);P(this,"attachListeners",({mouseMove:e,mouseUp:n,dblClick:r})=>{e&&(this.mouseMove=o=>{const{x:s,y:a}=this.getSVGPoint(o);this.started||(this.emit("startSelection",{x:s,y:a}),this.started=!0),e(s,a,o)},this.svg.addEventListener("mousemove",this.mouseMove)),n&&(this.mouseUp=o=>{if(o.button!==0)return;const{x:s,y:a}=this.getSVGPoint(o);n(s,a,o)},document.addEventListener("mouseup",this.mouseUp)),r&&(this.dblClick=o=>{const{x:s,y:a}=this.getSVGPoint(o);r(s,a,o)},document.addEventListener("dblclick",this.dblClick))});P(this,"detachListeners",()=>{this.mouseMove&&this.svg.removeEventListener("mousemove",this.mouseMove),this.mouseUp&&document.removeEventListener("mouseup",this.mouseUp),this.dblClick&&document.removeEventListener("dblclick",this.dblClick)});P(this,"start",(e,n)=>{const{x:r,y:o}=this.getSVGPoint(e),{naturalWidth:s,naturalHeight:a}=this.env.image,l=r<0?0:r>s?s:r,u=o<0?0:o>a?a:o;this.startDrawing(l,u,n,e)});P(this,"startDrawing",e=>{throw new Error(tr)});P(this,"createEditableShape",(e,n)=>{throw new Error(tr)});this.started=!1}get isDrawing(){throw new Error(tr)}}as.supports=i=>{throw new Error(tr)};const Nh="An implementation is missing";class Hh extends Ih{constructor(e,n,r,o){super(n,r,o);P(this,"updateState",e=>{throw new Error(Nh)});this.annotation=e}get element(){throw new Error(Nh)}}const RE=/firefox/i.test(navigator.userAgent),zh=(i,t,e,n,r)=>{i.setAttribute("width",n),i.setAttribute("height",r),RE?(i.setAttribute("x",0),i.setAttribute("y",0),i.setAttribute("transform",`translate(${t}, ${e})`)):(i.setAttribute("x",t),i.setAttribute("y",e))},ME=(i,t)=>{const{x:e,y:n,width:r,height:o}=t.getBBox(),s=document.createElementNS(ce,"svg");s.setAttribute("class","a9s-formatter-el"),zh(s,e,n,r,o);const a=document.createElementNS(ce,"g");a.appendChild(i),s.appendChild(a),t.append(s)},nr=(i,t,e)=>{if(!e)return i;const n=e.reduce((a,l)=>{const u=l(t);if(!u)return a;if(typeof u=="string"||u instanceof String)a.className=a.className?`${a.className} ${u}`:u;else if(u.nodeType===Node.ELEMENT_NODE)a.elements=a.elements?[...a.elements,u]:[u];else{const{className:c,style:h,element:d}=u;c&&(a.className=a.className?`${a.className} ${c}`:c),h&&(a.style=a.style?`${a.style} ${h}`:h),d&&(a.elements=a.elements?[...a.elements,d]:[d])}for(const c in u)u.hasOwnProperty(c)&&c.startsWith("data-")&&(a[c]=u[c]);return a},{}),{className:r,style:o,elements:s}=n;if(r&&Et(i,r),o){const a=i.querySelector(".a9s-outer"),l=i.querySelector(".a9s-inner");a&&l?(a.setAttribute("style","display:none"),l.setAttribute("style",o)):i.setAttribute("style",o)}s&&s.forEach(a=>ME(a,i));for(const a in n)n.hasOwnProperty(a)&&a.startsWith("data-")&&i.setAttribute(a,n[a])},Vh=(i,t,e,n,r)=>{const o=i.querySelector(".a9s-formatter-el");o&&zh(o,t,e,n,r)},jn="corner",ir="edge";class FE extends Hh{constructor(e,n,r,o){super(e,n,r,o);P(this,"onScaleChanged",()=>this.handles.map(this.scaleHandle));P(this,"setSize",(e,n,r,o)=>{Bh(this.rectangle,e,n,r,o),Lh(this.mask,this.env.image,e,n,r,o),Vh(this.elementGroup,e,n,r,o);const[s,a,l,u,c,h,d,g]=this.handles;this.setHandleXY(s,e,n),this.setHandleXY(a,e+r,n),this.setHandleXY(l,e+r,n+o),this.setHandleXY(u,e,n+o),this.enableEdgeControls&&(this.setHandleXY(c,e+r/2,n),this.setHandleXY(h,e+r,n+o/2),this.setHandleXY(d,e+r/2,n+o),this.setHandleXY(g,e,n+o/2))});P(this,"stretchCorners",(e,n,r)=>{const o=this.getHandleXY(n),s=r.x-o.x,a=r.y-o.y,l=s>0?o.x:r.x,u=a>0?o.y:r.y,c=Math.abs(s),h=Math.abs(a);return this.setSize(l,u,c,h),{x:l,y:u,w:c,h}});P(this,"stretchEdge",(e,n,r)=>{const o=this.getHandleXY(n),s=os(this.rectangle),a=e%2===0,l=a?s.w:r.x-o.x,u=a?r.y-o.y:s.h,c=a?s.x:l>0?o.x:r.x,h=a?u>0?o.y:r.y:s.y,d=Math.abs(l),g=Math.abs(u);return this.setSize(c,h,d,g),{x:c,y:h,w:d,h:g}});P(this,"onGrab",(e,n)=>r=>{if(r.button!==0)return;this.grabbedElem=e,this.grabbedType=n;const o=this.getSVGPoint(r),{x:s,y:a}=os(this.rectangle);this.mouseOffset={x:o.x-s,y:o.y-a}});P(this,"onMouseMove",e=>{if(e.button!==0)return;const n=(r,o)=>r<0?0:r>o?o:r;if(this.grabbedElem){const r=this.getSVGPoint(e);if(this.grabbedElem===this.rectangle){const{w:o,h:s}=os(this.rectangle),{naturalWidth:a,naturalHeight:l}=this.env.image,u=n(r.x-this.mouseOffset.x,a-o),c=n(r.y-this.mouseOffset.y,l-s);this.setSize(u,c,o,s),this.emit("update",pn(u,c,o,s,this.env.image,this.config.fragmentUnit))}else{const o=this.handles.indexOf(this.grabbedElem),s=this.handles[o^2],{x:a,y:l,w:u,h:c}=this.grabbedType===jn?this.stretchCorners(o,s,r):this.stretchEdge(o,s,r);this.emit("update",pn(a,l,u,c,this.env.image,this.config.fragmentUnit))}}});P(this,"onMouseUp",e=>{this.grabbedElem=null,this.grabbedType=null,this.mouseOffset=null});P(this,"updateState",e=>{const{x:n,y:r,w:o,h:s}=Rt(e,this.env.image);this.setSize(n,r,o,s)});this.svg.addEventListener("mousemove",this.onMouseMove),this.svg.addEventListener("mouseup",this.onMouseUp);const{x:s,y:a,w:l,h:u}=Rt(e,o.image);this.containerGroup=document.createElementNS(ce,"g"),this.mask=kh(o.image,s,a,l,u),this.mask.setAttribute("class","a9s-selection-mask"),this.containerGroup.appendChild(this.mask),this.elementGroup=document.createElementNS(ce,"g"),this.elementGroup.setAttribute("class","a9s-annotation editable selected"),this.elementGroup.setAttribute("data-id",e.id),this.rectangle=rs(s,a,l,u),this.rectangle.querySelector(".a9s-inner").addEventListener("mousedown",this.onGrab(this.rectangle)),this.elementGroup.appendChild(this.rectangle),this.enableEdgeControls=r.enableEdgeControls;const c=this.enableEdgeControls?[[s+l/2,a,ir],[s+l,a+u/2,ir],[s+l/2,a+u,ir],[s,a+u/2,ir]]:[];this.handles=[[s,a,jn],[s+l,a,jn],[s+l,a+u,jn],[s,a+u,jn],...c].map(h=>{const[d,g,y]=h,x=this.drawHandle(d,g);return x.addEventListener("mousedown",this.onGrab(x,y)),this.elementGroup.appendChild(x),x}),this.containerGroup.appendChild(this.elementGroup),n.appendChild(this.containerGroup),nr(this.rectangle,e,r.formatters),this.grabbedElem=null,this.grabbedType=null,this.mouseOffset=null}get element(){return this.elementGroup}destroy(){this.containerGroup.parentNode.removeChild(this.containerGroup),super.destroy()}}class rr extends as{constructor(e,n,r){super(e,n,r);P(this,"startDrawing",(e,n)=>{this.attachListeners({mouseMove:this.onMouseMove,mouseUp:this.onMouseUp}),this.rubberband=new PE(e,n,this.g,this.config,this.env)});P(this,"stop",()=>{this.rubberband&&(this.rubberband.destroy(),this.rubberband=null)});P(this,"onMouseMove",(e,n)=>{const{naturalWidth:r,naturalHeight:o}=this.env.image,s=Math.min(Math.max(e,0),r),a=Math.min(Math.max(n,0),o);this.rubberband.dragTo(s,a)});P(this,"onMouseUp",()=>{this.detachListeners(),this.started=!1;const{width:e,height:n}=this.rubberband.getBoundingClientRect(),r=this.config.minSelectionWidth||4,o=this.config.minSelectionHeight||4;if(e>=r&&n>=o){const{element:s}=this.rubberband;s.annotation=this.rubberband.toSelection(),this.emit("complete",s)}else this.emit("cancel");this.stop()});P(this,"createEditableShape",(e,n)=>new FE(e,this.g,{...this.config,formatters:n},this.env));this.rubberband=null}get isDrawing(){return this.rubberband!=null}}rr.identifier="rect",rr.supports=i=>{const t=i.selector("FragmentSelector");return t==null?void 0:t.conformsTo.startsWith("http://www.w3.org/TR/media-frags")};const or=i=>{let t=0,e=i.length-1;for(let n=0;n{const r=i[0]-t,o=i[1]-e;return Math.sqrt(r*r+o*o)<=n},LE=(i,t,e,n,r,o)=>{const s=o||0,a=Math.cos(s),l=Math.sin(s),u=i[0]-t,c=i[1]-e,h=a*u+l*c,d=l*u-a*c;return h*h/(n*n)+d*d/(r*r)<=1},ls=(i,t)=>{const e=i[0],n=i[1];let r=!1;for(let o=0,s=t.length-1;on!=c>n&&e<(u-a)*(n-l)/(c-l)+a&&(r=!r)}return r},BE=(i,t)=>{for(let e of i)if(!ls(e,t))return!1;return!0},IE=(i,t,e,n,r,o)=>{const s=i[0],a=i[1],l=n-t,u=r-e,c=Math.sqrt(l*l+u*u);return Math.abs((s-t)*u-(a-e)*l)/c<=o},Uh=i=>{const t=i.getAttribute("d").split(/(?=M|m|L|l|H|h|V|v|Z|z)/g).map(r=>r.trim()),e=[];let n=[];for(let r of t){const o=r.substring(0,1);if(o.toLowerCase()==="z")e.push([...n]),n=[];else{const s=r.substring(1).split(" ").map(c=>parseFloat(c.trim())),a=o===o.toUpperCase(),l=a?s[0]:s[0]+n[n.length-1][0],u=a?s[1]:s[1]+n[n.length-1][1];n.push([l,u])}}return n.length>0&&e.push([...n]),e},NE=i=>{const n=new XMLSerializer().serializeToString(i.documentElement).replace("",``);return new DOMParser().parseFromString(n,"image/svg+xml").documentElement},Wh=i=>{const t=n=>{Array.from(n.attributes).forEach(r=>{r.name.startsWith("on")&&n.removeAttribute(r.name)})},e=i.getElementsByTagName("script");return Array.from(e).reverse().forEach(n=>n.parentNode.removeChild(n)),t(i),Array.from(i.querySelectorAll("*")).forEach(t),i},Wt=i=>{const t=i.selector("SvgSelector");if(t){const e=new DOMParser,{value:n}=t,r=e.parseFromString(n,"image/svg+xml"),o=r.lookupPrefix(ce),s=r.lookupNamespaceURI(null);return o||s?Wh(r).firstChild:Wh(NE(r)).firstChild}},jh=i=>{const t=Wt(i),e=document.createElementNS(ce,"g"),n=t.cloneNode(!0);n.setAttribute("class","a9s-inner");const r=t.cloneNode(!0);return r.setAttribute("class","a9s-outer"),e.appendChild(r),e.appendChild(n),e},us=(i,t)=>{const e=i.querySelector(".a9s-inner").cloneNode(!0);e.removeAttribute("class"),e.removeAttribute("xmlns");let n=e.outerHTML||new XMLSerializer().serializeToString(e);return n=n.replace(` xmlns="${ce}"`,""),{source:t==null?void 0:t.src,selector:{type:"SvgSelector",value:`${n}`}}},HE=i=>{const t=Wt(i),e=t.nodeName.toLowerCase();if(e==="polygon")return zE(t);if(e==="circle")return VE(t);if(e==="ellipse")return UE(t);if(e=="path")return WE(t);if(e=="line")return 0;throw`Unsupported SVG shape type: ${e}`},zE=i=>{const t=i.getAttribute("points").trim().split(" ").map(e=>e.split(",").map(n=>parseFloat(n.trim())));return or(t)},VE=i=>{const t=i.getAttribute("r");return t*t*Math.PI},UE=i=>{const t=i.getAttribute("rx"),e=i.getAttribute("ry");return t*e*Math.PI},WE=i=>{const t=Uh(i);if(t.length==1)return or(t[0]);{const e=r=>t.find(o=>{if(r!==o)return BE(r,o)});let n=0;for(let r of t)e(r)?n-=or(r):n+=or(r);return n}};class Gh{constructor(t,e){P(this,"redraw",()=>{this.mask.setAttribute("d",`M0 0 h${this.w} v${this.h} h-${this.w} z M${this.polygon.getAttribute("points")} z`)});P(this,"destroy",()=>this.mask.parentNode.removeChild(this.mask));this.w=t.naturalWidth,this.h=t.naturalHeight,this.polygon=e,this.mask=document.createElementNS(ce,"path"),this.mask.setAttribute("fill-rule","evenodd"),this.mask.setAttribute("class","a9s-selection-mask"),this.mask.setAttribute("d",`M0 0 h${this.w} v${this.h} h-${this.w} z M${this.polygon.getAttribute("points")} z`)}get element(){return this.mask}}class jE{constructor(t,e,n){P(this,"setPoints",t=>{const e=t.map(n=>`${n[0]},${n[1]}`).join(" ");this.outer.setAttribute("points",e),this.inner.setAttribute("points",e)});P(this,"getBoundingClientRect",()=>this.outer.getBoundingClientRect());P(this,"dragTo",t=>{this.group.style.display=null,this.mousepos=t;const e=[...this.points,t];this.setPoints(e),this.mask.redraw()});P(this,"addPoint",()=>{const[t,e]=this.mousepos,n=this.points[this.points.length-1];Math.pow(t-n[0],2)+Math.pow(e-n[1],2)>4&&(this.points=[...this.points,this.mousepos],this.setPoints(this.points),this.mask.redraw())});P(this,"destroy",()=>{this.group.parentNode.removeChild(this.group),this.polygon=null,this.group=null});P(this,"toSelection",()=>new Wn(us(this.group,this.env.image)));this.points=[t],this.env=n,this.mousepos=t,this.group=document.createElementNS(ce,"g"),this.polygon=document.createElementNS(ce,"g"),this.polygon.setAttribute("class","a9s-selection"),this.outer=document.createElementNS(ce,"polygon"),this.outer.setAttribute("class","a9s-outer"),this.inner=document.createElementNS(ce,"polygon"),this.inner.setAttribute("class","a9s-inner"),this.setPoints(this.points),this.mask=new Gh(n.image,this.inner),this.polygon.appendChild(this.outer),this.polygon.appendChild(this.inner),this.group.style.display="none",this.group.appendChild(this.mask.element),this.group.appendChild(this.polygon),e.appendChild(this.group)}get element(){return this.polygon}}const cs=i=>{const t=i.querySelector(".a9s-inner").points,e=[];for(let n=0;ni.querySelector(".a9s-inner").getBBox();class qE extends Hh{constructor(e,n,r,o){super(e,n,r,o);P(this,"onScaleChanged",()=>this.handles.map(this.scaleHandle));P(this,"setPoints",e=>{const n=h=>Math.round(10*h)/10,r=e.map(h=>`${n(h.x)},${n(h.y)}`).join(" ");this.shape.querySelector(".a9s-inner").setAttribute("points",r);const s=this.shape.querySelector(".a9s-outer");s.setAttribute("points",r),this.mask.redraw();const{x:a,y:l,width:u,height:c}=s.getBBox();Vh(this.elementGroup,a,l,u,c)});P(this,"onGrab",e=>n=>{n.button===0&&(this.grabbedElem=e,this.grabbedAt=this.getSVGPoint(n))});P(this,"onMouseMove",e=>{const n=(r,o,s)=>r+o<0?-r:r+o>s?s-r:o;if(this.grabbedElem){const r=this.getSVGPoint(e);if(this.grabbedElem===this.shape){const{x:o,y:s,width:a,height:l}=GE(this.shape),{naturalWidth:u,naturalHeight:c}=this.env.image,h=n(o,r.x-this.grabbedAt.x,u-a),d=n(s,r.y-this.grabbedAt.y,c-l),g=cs(this.shape).map(y=>({x:y.x+h,y:y.y+d}));this.grabbedAt=r,this.setPoints(g),g.forEach((y,x)=>this.setHandleXY(this.handles[x],y.x,y.y)),this.emit("update",us(this.shape,this.env.image))}else{const o=this.handles.indexOf(this.grabbedElem),s=cs(this.shape).map((a,l)=>l===o?r:a);this.setPoints(s),this.setHandleXY(this.handles[o],r.x,r.y),this.emit("update",us(this.shape,this.env.image))}}});P(this,"onMouseUp",e=>{this.grabbedElem=null,this.grabbedAt=null});P(this,"updateState",e=>{const n=Wt(e).getAttribute("points").split(" ").map(r=>{const[o,s]=r.split(",").map(a=>parseFloat(a.trim()));return{x:o,y:s}});this.setPoints(n),n.forEach((r,o)=>this.setHandleXY(this.handles[o],r.x,r.y))});P(this,"destroy",()=>{this.containerGroup.parentNode.removeChild(this.containerGroup),super.destroy()});this.svg.addEventListener("mousemove",this.onMouseMove),this.svg.addEventListener("mouseup",this.onMouseUp),this.containerGroup=document.createElementNS(ce,"g"),this.shape=jh(e),this.shape.querySelector(".a9s-inner").addEventListener("mousedown",this.onGrab(this.shape)),this.mask=new Gh(o.image,this.shape.querySelector(".a9s-inner")),this.containerGroup.appendChild(this.mask.element),this.elementGroup=document.createElementNS(ce,"g"),this.elementGroup.setAttribute("class","a9s-annotation editable selected"),this.elementGroup.setAttribute("data-id",e.id),this.elementGroup.appendChild(this.shape),this.handles=cs(this.shape).map(s=>{const a=this.drawHandle(s.x,s.y);return a.addEventListener("mousedown",this.onGrab(a)),this.elementGroup.appendChild(a),a}),this.containerGroup.appendChild(this.elementGroup),n.appendChild(this.containerGroup),nr(this.shape,e,r.formatters),this.grabbedElem=null,this.grabbedAt=null}get element(){return this.elementGroup}}class hs extends as{constructor(e,n,r){super(e,n,r);P(this,"startDrawing",(e,n,r)=>{this._isDrawing=!0,this._startOnSingleClick=r,this.attachListeners({mouseMove:this.onMouseMove,mouseUp:this.onMouseUp,dblClick:this.onDblClick}),this.rubberband=new jE([e,n],this.g,this.env)});P(this,"stop",()=>{this.detachListeners(),this._isDrawing=!1,this.rubberband&&(this.rubberband.destroy(),this.rubberband=null)});P(this,"onMouseMove",(e,n)=>this.rubberband.dragTo([e,n]));P(this,"onMouseUp",()=>{const{width:e,height:n}=this.rubberband.getBoundingClientRect(),r=this.config.minSelectionWidth||4,o=this.config.minSelectionHeight||4;e>=r||n>=o?this.rubberband.addPoint():this._startOnSingleClick||(this.emit("cancel"),this.stop())});P(this,"onDblClick",()=>{this._isDrawing=!1;const e=this.rubberband.element;e.annotation=this.rubberband.toSelection(),this.emit("complete",e),this.stop()});P(this,"createEditableShape",(e,n)=>new qE(e,this.g,{...this.config,formatters:n},this.env));this._isDrawing=!1,this._startOnSingleClick=!1}get isDrawing(){return this._isDrawing}}hs.identifier="polygon",hs.supports=i=>{var e;const t=i.selector("SvgSelector");if(t)return(e=t.value)==null?void 0:e.match(/^this._registered.map(e=>e.identifier));P(this,"registerTool",e=>{const n=e.identifier;this.listTools().includes(n)&&this.unregisterTool(n),this._registered.unshift(e)});P(this,"unregisterTool",e=>this._registered=this._registered.filter(n=>n.identifier!==e));P(this,"setCurrent",e=>{this._current&&this._current.destroy();const n=typeof e=="string"||e instanceof String?this._registered.find(r=>r.identifier===e):e;this._current=new n(this._g,this._config,this._env),this._current.on("startSelection",r=>this.emit("startSelection",r)),this._current.on("complete",r=>this.emit("complete",r)),this._current.on("cancel",r=>this.emit("cancel",r))});P(this,"forAnnotation",e=>{var a;const[n,...r]=e.targets,o=(a=n.renderedVia)==null?void 0:a.name,s=o?this._registered.find(l=>l.identifier===o):this._registered.find(l=>l.supports(e));return s?new s(this._g,this._config,this._env):null});this._g=e,this._config=n,this._env=r,this._registered=[rr,hs],this.setCurrent(rr)}get current(){return this._current}}const YE={FragmentSelector:rs,SvgSelector:jh},ZE={FragmentSelector:CE,SvgSelector:HE},qh=i=>{const t=i.targets[0];if(t)return Array.isArray(t.selector)?t.selector[0]:t.selector},ds=(i,t)=>YE[qh(i).type](i,t),Xh=(i,t)=>ZE[qh(i).type](i,t);class KE{constructor(t){const e=document.createElementNS(ce,"svg");e.setAttribute("class","a9s-osd-crosshair-container");const n=document.createElementNS(ce,"g");n.setAttribute("class","a9s-crosshair"),e.appendChild(n);const r=document.createElementNS(ce,"line"),o=document.createElementNS(ce,"line");n.appendChild(r),n.appendChild(o),t.parentElement.appendChild(e);const s=a=>{const{offsetX:l,offsetY:u}=a,c=t.parentElement.offsetWidth,h=t.parentElement.offsetHeight;r.setAttribute("x1",0),r.setAttribute("y1",u),r.setAttribute("x2",c),r.setAttribute("y2",u),o.setAttribute("x1",l),o.setAttribute("y1",0),o.setAttribute("x2",l),o.setAttribute("y2",h)};t.addEventListener("pointermove",s),t.parentElement.addEventListener("pointermove",s)}}function JE(i,t,e,n,r){Yh(i,t,e||0,n||i.length-1,r||QE)}function Yh(i,t,e,n,r){for(;n>e;){if(n-e>600){var o=n-e+1,s=t-e+1,a=Math.log(o),l=.5*Math.exp(2*a/3),u=.5*Math.sqrt(a*l*(o-l)/o)*(s-o/2<0?-1:1),c=Math.max(e,Math.floor(t-s*l/o+u)),h=Math.min(n,Math.floor(t+(o-s)*l/o+u));Yh(i,t,c,h,r)}var d=i[t],g=e,y=n;for(Gn(i,e,t),r(i[n],d)>0&&Gn(i,e,n);g0;)y--}r(i[e],d)===0?Gn(i,e,y):(y++,Gn(i,y,n)),y<=t&&(e=y+1),t<=y&&(n=y-1)}}function Gn(i,t,e){var n=i[t];i[t]=i[e],i[e]=n}function QE(i,t){return it?1:0}class $E{constructor(t=9){this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(this._maxEntries*.4)),this.clear()}all(){return this._all(this.data,[])}search(t){let e=this.data;const n=[];if(!ar(t,e))return n;const r=this.toBBox,o=[];for(;e;){for(let s=0;s=0&&o[e].children.length>this._maxEntries;)this._split(o,e),e--;this._adjustParentBBoxes(r,o,e)}_split(t,e){const n=t[e],r=n.children.length,o=this._minEntries;this._chooseSplitAxis(n,o,r);const s=this._chooseSplitIndex(n,o,r),a=gn(n.children.splice(s,n.children.length-s));a.height=n.height,a.leaf=n.leaf,mn(n,this.toBBox),mn(a,this.toBBox),e?t[e-1].children.push(a):this._splitRoot(n,a)}_splitRoot(t,e){this.data=gn([t,e]),this.data.height=t.height+1,this.data.leaf=!1,mn(this.data,this.toBBox)}_chooseSplitIndex(t,e,n){let r,o=1/0,s=1/0;for(let a=e;a<=n-e;a++){const l=qn(t,0,a,this.toBBox),u=qn(t,a,n,this.toBBox),c=rx(l,u),h=fs(l)+fs(u);c=e;u--){const c=t.children[u];Xn(a,t.leaf?o(c):c),l+=sr(a)}return l}_adjustParentBBoxes(t,e,n){for(let r=n;r>=0;r--)Xn(e[r],t)}_condense(t){for(let e=t.length-1,n;e>=0;e--)t[e].children.length===0?e>0?(n=t[e-1].children,n.splice(n.indexOf(t[e]),1)):this.clear():mn(t[e],this.toBBox)}}function ex(i,t,e){if(!e)return t.indexOf(i);for(let n=0;n=i.minX&&t.maxY>=i.minY}function gn(i){return{children:i,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function Zh(i,t,e,n,r){const o=[t,e];for(;o.length;){if(e=o.pop(),t=o.pop(),e-t<=n)continue;const s=t+Math.ceil((e-t)/n/2)*n;JE(i,s,t,e,r),o.push(t,s,s,e)}}const ms=(i,t)=>{if(i.targets[0].selector.type==="FragmentSelector"){const{x:n,y:r,w:o,h:s}=Rt(i,t);return{minX:n,minY:r,maxX:n+o,maxY:r+s}}else{const n=ds(i,t),r=document.createElementNS(ce,"svg");r.style.position="absolute",r.style.opacity=0,r.style.top=0,r.style.left=0,r.appendChild(n),document.body.appendChild(r);const{x:o,y:s,width:a,height:l}=n.getBBox();return document.body.removeChild(r),{minX:o,minY:s,maxX:o+a,maxY:s+l}}},ox=i=>{var e;const t=i.targets[0];return Array.isArray(t.selector)?t.selector[0].type:(e=t.selector)==null?void 0:e.type},sx=(i,t,e,n)=>{const r=Wt(e),o=r.nodeName.toLowerCase(),s=[i,t];if(o==="polygon"){const a=Array.from(r.points).map(l=>[l.x,l.y]);return ls(s,a)}else if(o==="circle"){const a=r.getAttribute("cx"),l=r.getAttribute("cy"),u=r.getAttribute("r");return kE(s,a,l,u)}else if(o==="ellipse"){const a=r.getAttribute("cx"),l=r.getAttribute("cy"),u=r.getAttribute("rx"),c=r.getAttribute("ry");return LE(s,a,l,u,c)}else{if(o==="path")return Uh(r).find(l=>ls(s,l));if(o==="line"){const a=parseInt(r.getAttribute("x1")),l=parseInt(r.getAttribute("y1")),u=parseInt(r.getAttribute("x2")),c=parseInt(r.getAttribute("y2"));return IE(s,a,l,u,c,n)}else throw`Unsupported SVG shape type: ${o}`}};class ax{constructor(t){P(this,"clear",()=>this.spatial_index.clear());P(this,"getAnnotationAt",(t,e,n)=>{const r=n?5/n:5,s=this.spatial_index.search({minX:t-r,minY:e-r,maxX:t+r,maxY:e+r}).map(a=>a.annotation).filter(a=>{const l=ox(a);if(l==="FragmentSelector")return!0;if(l==="SvgSelector")return sx(t,e,a,r);throw`Unsupported selector type: ${l}`});if(s.length>0)return s.sort((a,l)=>Xh(a,this.env.image)-Xh(l,this.env.image)),s[0]});P(this,"getAnnotationsIntersecting",t=>{const e=t.minX,n=e?t:ms(t,this.env.image),r=this.spatial_index.search(n).map(o=>o.annotation);return e?r:r.filter(o=>!o.isEqual(t))});P(this,"insert",t=>{(Array.isArray(t)?t:[t]).forEach(n=>{this.spatial_index.insert({...ms(n,this.env.image),annotation:n})})});P(this,"getBounds",t=>this.getBounds(t,this.env.image));P(this,"remove",t=>{const e={...ms(t,this.env.image),annotation:t};this.spatial_index.remove(e,(n,r)=>n.annotation.id===r.annotation.id)});this.env=t,t.store=this,this.spatial_index=new $E}}const Kh=(i,t)=>{const r=(is(t,".a9s-annotation")?t:t.closest(".a9s-annotation")).querySelector(".a9s-outer").getBoundingClientRect(),{canvas:o}=i.drawer,s=o.getBoundingClientRect(),a=o.width/s.width,l=o.height/s.height,u=r.x-s.x,c=r.y-s.y,{width:h,height:d}=r,g=document.createElement("CANVAS"),y=g.getContext("2d");g.width=h,g.height=d,y.drawImage(o,u*a,c*l,h*a,d*l,0,0,h,d);const x=i.viewport.viewerElementToImageCoordinates(new OpenSeadragon.Point(u,c)),b=i.viewport.viewportToImageZoom(i.viewport.getZoom());return{snippet:g,transform:T=>{const f=x.x+T[0]/a/b,E=x.y+T[1]/l/b;return[f,E]}}},lx=ss();class Jh extends Qn{constructor(e){super();P(this,"_getShapeAt",e=>{const n=a=>{const l=this.svg.createSVGPoint();if(window.TouchEvent&&a instanceof TouchEvent){const u=this.svg.getBoundingClientRect(),c=a.touches[0],h=c.clientX-u.x,d=c.clientY-u.y,{left:g,top:y}=this.svg.getBoundingClientRect();return l.x=h+g,l.y=d+y,l.matrixTransform(this.g.getScreenCTM().inverse())}else return l.x=a.offsetX,l.y=a.offsetY,l.matrixTransform(this.g.getCTM().inverse())},{x:r,y:o}=n(e),s=this.store.getAnnotationAt(r,o,this.currentScale());if(s)return this.findShape(s)});P(this,"_initDrawingTools",e=>{var l;let n=!1,r=!1,o=!1;this.tools=new XE(this.g,this.config,this.env),this.tools.on("complete",u=>{r=!1,this.onDrawingComplete(u)}),this.mouseTracker=new Dt.MouseTracker({element:this.svg,preProcessEventHandler:u=>{this.mouseTracker.enabled||(u.preventDefault=!1,u.preventGesture=!0),this.selectedShape&&u.eventType==="wheel"&&(u.preventDefault=!1,this.viewer.canvas.dispatchEvent(new u.originalEvent.constructor(u.eventType,u.originalEvent)))},pressHandler:u=>{this.tools.current.isDrawing||(this.tools.current.start(u.originalEvent,this.drawOnSingleClick&&!this.hoveredShape),e||this.scaleTool(this.tools.current))},moveHandler:u=>{if(this.tools.current.isDrawing){const{x:c,y:h}=this.tools.current.getSVGPoint(u.originalEvent);!u.buttons||!r?(u.originalEvent.stopPropagation(),this.tools.current.onMouseMove(c,h,u.originalEvent),n||(this.emit("startSelection",{x:c,y:h}),n=!0)):(!o&&this.tools.current.onDragStart&&this.tools.current.onDragStart(c,h,u.originalEvent),o=!0)}},releaseHandler:u=>{if(this.tools.current.isDrawing){r=!0;const{x:c,y:h}=this.tools.current.getSVGPoint(u.originalEvent);n&&this.emit("endSelection",{x:c,y:h}),this.tools.current.onMouseUp(c,h,u.originalEvent),o&&this.tools.current.onDragEnd&&this.tools.current.onDragEnd()}n=!1,o=!1}});const s=this.config.hotkey?this.config.hotkey.key?this.config.hotkey.key.toLowerCase():this.config.hotkey.toLowerCase():"shift",a=(l=this.config.hotkey)==null?void 0:l.inverted;this.mouseTracker.enabled=a,this.onKeyDown&&document.removeEventListener("keydown",this.onKeyDown),this.onKeyUp&&document.removeEventListener("keydown",this.onKeyDown),this.onKeyDown=u=>{if(u.key.toLowerCase()===s&&!this.selectedShape){const c=!this.readOnly&&!a;this.mouseTracker.enabled=c,this.tools.current.enabled=c}},this.onKeyUp=u=>{u.key.toLowerCase()===s&&!this.tools.current.isDrawing&&(this.mouseTracker.enabled=a,this.tools.current.enabled=a)},document.addEventListener("keydown",this.onKeyDown),document.addEventListener("keyup",this.onKeyUp)});P(this,"_initMouseEvents",()=>{this.svg.addEventListener("mousemove",n=>{var r,o;if(!((r=this.tools)!=null&&r.current.isDrawing)&&!n.target.closest(".a9s-annotation.editable.selected")){const a=this._getShapeAt(n);if((a==null?void 0:a.annotation)!==((o=this.hoveredShape)==null?void 0:o.annotation)){if(this.hoveredShape){const l=this.hoveredShape.element||this.hoveredShape;Qi(l,"hover"),this.emit("mouseLeaveAnnotation",this.hoveredShape.annotation,this.hoveredShape)}a&&(Et(a,"hover"),this.emit("mouseEnterAnnotation",a.annotation,a))}this.hoveredShape=a}}),this.svg.parentElement.addEventListener("mouseleave",()=>{this.hoveredShape&&(Qi(this.hoveredShape,"hover"),this.emit("mouseLeaveAnnotation",this.hoveredShape.annotation,this.hoveredShape),this.hoveredShape=null)});let e=null;this.viewer.addHandler("canvas-press",()=>e=new Date().getTime()),this.viewer.addHandler("canvas-click",n=>{var o;const{originalEvent:r}=n;if(!(((o=this.tools.current)==null?void 0:o.isDrawing)||this.disableSelect)&&new Date().getTime()-e<250){const l=r.target.closest(".a9s-annotation.editable.selected")?this.selectedShape:this._getShapeAt(r);l?(n.preventDefaultAction=!0,this.selectShape(l)):l||(this.deselect(),this.emit("select",{}))}this.disableSelect&&this.hoveredShape&&this.emit("clickAnnotation",this.hoveredShape.annotation,this.hoveredShape)})});P(this,"_lazy",e=>{if(this.viewer.world.getItemAt(0))e();else{const n=()=>{e(),this.viewer.removeHandler("open",n),this.viewer.world.removeHandler("add-item",n)};this.viewer.addHandler("open",n),this.viewer.world.addHandler("add-item",n)}});P(this,"_refreshNonScalingAnnotations",()=>{const e=this.currentScale();Array.from(this.svg.querySelectorAll(".a9s-non-scaling")).forEach(n=>n.setAttribute("transform",`scale(${1/e})`))});P(this,"addAnnotation",(e,n)=>{const r=n||this.g,o=ds(e,this.env.image);return Et(o,"a9s-annotation"),o.setAttribute("data-id",e.id),o.annotation=e,r.appendChild(o),nr(o,e,this.formatters),this.scaleFormatterElements(o),o});P(this,"addDrawingTool",e=>this.tools.registerTool(e));P(this,"addOrUpdateAnnotation",(e,n)=>{var s;const r=(s=this.selectedShape)==null?void 0:s.annotation;(r===e||(r==null?void 0:r.isSelection)||r==n)&&this.deselect(),n&&this.removeAnnotation(e),this.removeAnnotation(e);const o=this.addAnnotation(e);is(o,"a9s-non-scaling")&&o.setAttribute("transform",`scale(${1/this.currentScale()})`),this.store.insert(e)});P(this,"currentScale",()=>{const e=this.viewer.viewport.getContainerSize().x;return this.viewer.viewport.getZoom(!0)*e/this.viewer.world.getContentFactor()});P(this,"deselect",()=>{var e;if((e=this.tools)==null||e.current.stop(),this.selectedShape){const{annotation:n}=this.selectedShape;if(this.selectedShape.destroy){if(this.selectedShape.mouseTracker.destroy(),this.selectedShape.destroy(),!n.isSelection){const r=this.addAnnotation(n);is(r,"a9s-non-scaling")&&r.setAttribute("transform",`scale(${1/this.currentScale()})`)}}else Qi(this.selectedShape,"selected");this.selectedShape=null}});P(this,"destroy",()=>{this.deselect(),this.svg.parentNode.removeChild(this.svg)});P(this,"findShape",e=>{const n=e!=null&&e.id?e.id:e;return this.g.querySelector(`.a9s-annotation[data-id="${n}"]`)});P(this,"_fit",(e,n,r)=>{const o=this.findShape(e);if(o){const s=n?typeof n=="boolean"?n:n.immediately:!1,a=(n==null?void 0:n.padding)||0,l=this.viewer.container.getBoundingClientRect(),u=Math.min(2*a/l.width,2*a/l.height),{x:c,y:h,width:d,height:g}=o.getBBox(),y=c-u*d,x=h-u*g,b=d+2*u*d,T=g+2*u*g,f=this.viewer.viewport.imageToViewportRectangle(y,x,b,T);this.viewer.viewport[r](f,s)}});P(this,"fitBounds",(e,n)=>this._fit(e,n,"fitBounds"));P(this,"fitBoundsWithConstraints",(e,n)=>this._fit(e,n,"fitBoundsWithConstraints"));P(this,"getAnnotations",()=>Array.from(this.g.querySelectorAll(".a9s-annotation")).map(n=>n.annotation));P(this,"getAnnotationsIntersecting",e=>{const n=e.id?e:this.findShape(e).annotation;return this.store.getAnnotationsIntersecting(n)});P(this,"getImageSnippetById",e=>{const n=this.findShape(e);if(n)return Kh(this.viewer,n)});P(this,"getSelectedImageSnippet",()=>{var e;if(this.selectedShape){const n=(e=this.selectedShape.element)!=null?e:this.selectedShape;return Kh(this.viewer,n)}});P(this,"init",e=>{this.deselect(),Array.from(this.g.querySelectorAll(".a9s-annotation")).forEach(r=>this.g.removeChild(r)),this.store.clear(),this._lazy(()=>{console.time("Took"),console.log("Drawing..."),this.loaded||(this.g.style.display="none"),e.forEach(r=>this.addAnnotation(r)),console.log("Indexing..."),this.store.insert(e),console.timeEnd("Took"),this.resize()})});P(this,"listDrawingTools",()=>this.tools.listTools());P(this,"overrideId",(e,n)=>{const r=this.findShape(e);r.setAttribute("data-id",n);const{annotation:o}=r,s=o.clone({id:n});return r.annotation=s,this.store.remove(o),this.store.insert(s),s});P(this,"panTo",(e,n)=>{const r=this.findShape(e);if(r){const{top:o,left:s,width:a,height:l}=r.getBoundingClientRect(),u=s+a/2+window.scrollX,c=o+l/2+window.scrollY,h=this.viewer.viewport.windowToViewportCoordinates(new Dt.Point(u,c));this.viewer.viewport.panTo(h,n)}});P(this,"removeAnnotation",e=>{var o,s;const n=e.type?e.id:e;((o=this.selectedShape)==null?void 0:o.annotation.id)===n&&this.deselect();const r=this.findShape(e);if(r){const{annotation:a}=r;((s=this.selectedShape)==null?void 0:s.annotation)===a&&this.deselect(),r.parentNode.removeChild(r),this.store.remove(a)}});P(this,"removeDrawingTool",e=>{var n;return(n=this.tools)==null?void 0:n.unregisterTool(e)});P(this,"scaleFormatterElements",e=>{const n=1/this.currentScale();if(e){const r=e.querySelector(".a9s-formatter-el");r&&r.firstChild.setAttribute("transform",`scale(${n})`)}else Array.from(this.g.querySelectorAll(".a9s-formatter-el")).forEach(o=>o.firstChild.setAttribute("transform",`scale(${n})`))});P(this,"scaleTool",e=>{if(e){const n=1/this.currentScale();e.scale=n,e.onScaleChanged&&e.onScaleChanged(n)}});P(this,"selectAnnotation",(e,n)=>{this.selectedShape&&this.deselect();const r=this.findShape(e);if(r){this.selectShape(r,n);const o=this.selectedShape.element?this.selectedShape.element:this.selectedShape;return{annotation:r.annotation,element:o}}else this.deselect()});P(this,"selectShape",(e,n)=>{var s;if(!n&&!e.annotation.isSelection&&this.emit("clickAnnotation",e.annotation,e),((s=this.selectedShape)==null?void 0:s.annotation)===e.annotation)return;this.selectedShape&&this.selectedShape.annotation!==e.annotation&&this.deselect();const{annotation:r}=e;if(this.readOnly||r.readOnly||this.headless)this.selectedShape=e,Et(e,"selected"),n||this.emit("select",{annotation:r,element:e,skipEvent:n});else{const a=this.tools.forAnnotation(r);if(a){setTimeout(()=>{e.parentNode.removeChild(e),n||this.emit("select",{annotation:r,element:this.selectedShape.element})},1),this.selectedShape=a.createEditableShape(r,this.formatters),this.scaleTool(this.selectedShape),this.scaleFormatterElements(this.selectedShape.element),this.selectedShape.element.annotation=r;const l=new Dt.MouseTracker({element:this.svg,preProcessEventHandler:u=>{u.stopPropagation=!0,u.preventDefault=!1,u.preventGesture=!0}}).setTracking(!1);this.selectedShape.element.addEventListener("mouseenter",()=>{this.hoveredShape=this.selectedShape,l.setTracking(!0)}),this.selectedShape.element.addEventListener("mouseleave",()=>{this.hoveredShape=null,l.setTracking(!1)}),this.selectedShape.mouseTracker=l,this.selectedShape.on("update",u=>this.emit("updateTarget",this.selectedShape.element,u))}else this.selectedShape=e,n||this.emit("select",{annotation:r,element:this.selectedShape})}});P(this,"setDrawingEnabled",e=>{if(this.mouseTracker){const n=e&&!this.readOnly;this.mouseTracker.enabled=n,this.mouseTracker.setTracking(n),this.tools.current&&(this.tools.current.enabled=n)}});P(this,"setDrawingTool",e=>{var n;this.tools&&((n=this.tools.current)==null||n.stop(),this.tools.setCurrent(e))});P(this,"setVisible",e=>{e?this.svg.style.display=null:(this.deselect(),this.svg.style.display="none")});P(this,"stopDrawing",()=>{var e;(e=this.tools)!=null&&e.current&&(this.tools.current.isDrawing&&this.tools.current.stop(),this.mouseTracker.enabled=!1,this.tools.current.enabled=!1)});this.viewer=e.viewer,this.config=e.config,this.env=e.env,this.readOnly=e.config.readOnly,this.headless=e.config.headless,e.config.formatter?this.formatters=[e.config.formatter]:e.config.formatters&&(this.formatters=Array.isArray(e.config.formatters)?e.config.formatters:[e.config.formatters]),this.disableSelect=e.config.disableSelect,this.drawOnSingleClick=e.config.drawOnSingleClick,this.svg=document.createElementNS(ce,"svg"),lx?(this.svg.setAttribute("class","a9s-annotationlayer a9s-osd-annotationlayer touch"),OE(this.svg)):this.svg.setAttribute("class","a9s-annotationlayer a9s-osd-annotationlayer"),this.g=document.createElementNS(ce,"g"),this.svg.appendChild(this.g),this.viewer.canvas.appendChild(this.svg),this.viewer.addHandler("animation",()=>this.resize()),this.viewer.addHandler("rotate",()=>this.resize()),this.viewer.addHandler("resize",()=>this.resize()),this.viewer.addHandler("flip",()=>this.resize()),this.loaded=!1;const n=()=>{const{x:r,y:o}=this.viewer.world.getItemAt(0).source.dimensions,s=this.viewer.world.getItemAt(0).source["@id"]||new URL(this.viewer.world.getItemAt(0).source.url,document.baseURI).href;this.env.image={src:s,naturalWidth:r,naturalHeight:o},e.config.crosshair&&(this.crosshair||(this.crosshair=new KE(this.svg),Et(this.svg,"no-cursor"))),this.loaded||this.emit("load",s),this.loaded=!0,this.g.style.display="inline",this.resize()};this.viewer.addHandler("open",n),this.viewer.world.addHandler("add-item",n),this.viewer.world.getItemAt(0)&&n(),this.store=new ax(this.env),this.selectedShape=null,this.hoveredShape=null,this._initMouseEvents()}resize(){var a;const e=this.viewer.viewport.getFlip(),n=this.viewer.viewport.pixelFromPoint(new Dt.Point(0,0),!0);e&&(n.x=this.viewer.viewport._containerInnerSize.x-n.x);const r=this.currentScale(),o=e?-r:r,s=this.viewer.viewport.getRotation();this.g.setAttribute("transform",`translate(${n.x}, ${n.y}) scale(${o}, ${r}) rotate(${s})`),this._refreshNonScalingAnnotations(),this.scaleFormatterElements(),this.selectedShape&&(this.selectedShape.element?(this.scaleTool(this.selectedShape),this.emit("viewportChange",this.selectedShape.element)):this.emit("viewportChange",this.selectedShape)),(a=this.tools)!=null&&a.current&&this.scaleTool(this.tools.current)}}class ux extends Jh{constructor(e){super(e);P(this,"onDrawingComplete",e=>{var n;this.mouseTracker.enabled=(n=this.config.hotkey)==null?void 0:n.inverted,this.selectShape(e),this.emit("createSelection",e.annotation)});this._initDrawingTools()}}const gs=i=>{const t=i.viewport.viewportToImageRectangle(i.viewport.getBounds(!0)),e=i.viewport.getContainerSize().x,r=i.viewport.getZoom(!0)*e/i.world.getContentFactor();return{extent:t,scale:r}},cx=i=>{var e;const t=i.targets[0];return t?Array.isArray(t.selector)?t.selector[0].type:(e=t.selector)==null?void 0:e.type:null},Qh=(i,t)=>{const{extent:e,scale:n}=gs(i),{selector:r}=t,o=St.create({target:t});if(r.type==="SvgSelector"){const s=Wt(o),a=s.nodeName.toLowerCase();let l=null;if(a==="polygon")l=hx(s,e,n);else if(a==="circle")l=dx(s,e,n);else if(a==="ellipse")l=fx(s,e,n);else if(a==="path")l=px(s,e,n);else throw`Unsupported SVG shape type: ${a}`;let u=l.outerHTML||new XMLSerializer().serializeToString(l);return u=u.replace(` xmlns="${ce}"`,""),{...t,selector:{type:"SvgSelector",value:`${u}`}}}else if(r.type==="FragmentSelector"){const{x:s,y:a,w:l,h:u}=Rt(o),c=e.x+s/n,h=e.y+a/n,d=l/n,g=u/n;return l===0&&u===0?{...pn(c,h,d,g),renderedVia:{name:"point"}}:pn(c,h,d,g)}else throw`Unsupported selector type: ${r.type}`},hx=(i,t,e)=>{const r=Array.from(i.points).map(o=>{const s=t.x+o.x/e,a=t.y+o.y/e;return s+","+a}).join(" ");return i.setAttribute("points",r),i},dx=(i,t,e)=>{const n=parseFloat(i.getAttribute("cx")),r=parseFloat(i.getAttribute("cy")),o=parseFloat(i.getAttribute("r"));return i.setAttribute("cx",t.x+n/e),i.setAttribute("cy",t.y+r/e),i.setAttribute("r",o/e),i},fx=(i,t,e)=>{const n=parseFloat(i.getAttribute("cx")),r=parseFloat(i.getAttribute("cy")),o=parseFloat(i.getAttribute("rx")),s=parseFloat(i.getAttribute("ry"));return i.setAttribute("cx",t.x+n/e),i.setAttribute("cy",t.y+r/e),i.setAttribute("rx",o/e),i.setAttribute("ry",s/e),i},px=(i,t,e)=>{const r=i.getAttribute("d").split(/(?=M|m|L|l|H|h|V|v|Z|z)/g).map(o=>o.trim()).map(o=>{const s=o.substring(0,1);if(s.toLowerCase()==="z")return s;{const a=o.substring(1).split(" ").map(h=>parseFloat(h.trim())),l=s===s.toUpperCase(),u=l?t.x+a[0]/e:a[0]/e,c=l?t.y+a[1]/e:a[1]/e;return s+" "+u+" "+c}}).join(" ");return i.setAttribute("d",r),i},$h=(i,t)=>{const{extent:e,scale:n}=gs(i),r=t.selector("FragmentSelector");if(t.selector("SvgSelector")){const s=Wt(t),a=s.nodeName.toLowerCase();let l=null;if(a==="polygon")l=mx(s,e,n);else if(a==="circle")l=gx(s,e,n);else if(a==="ellipse")l=vx(s,e,n);else if(a==="path")l=yx(s,e,n);else throw`Unsupported SVG shape type: ${a}`;let u=l.outerHTML||new XMLSerializer().serializeToString(l);u=u.replace(` xmlns="${ce}"`,"");const c={selector:{type:"SvgSelector",value:`${u}`}};return t.clone({target:c})}else if(r){const{x:s,y:a,w:l,h:u}=Rt(t),c=(s-e.x)*n,h=(a-e.y)*n,d=pn(c,h,l*n,u*n);return t.clone({target:d})}},mx=(i,t,e)=>{const r=Array.from(i.points).map(o=>{const s=e*(o.x-t.x),a=e*(o.y-t.y);return s+","+a}).join(" ");return i.setAttribute("points",r),i},gx=(i,t,e)=>{const n=i.getAttribute("cx"),r=i.getAttribute("cy"),o=i.getAttribute("r");return i.setAttribute("cx",e*(n-t.x)),i.setAttribute("cy",e*(r-t.y)),i.setAttribute("r",o*e),i},vx=(i,t,e)=>{const n=i.getAttribute("cx"),r=i.getAttribute("cy"),o=i.getAttribute("rx"),s=i.getAttribute("ry");return i.setAttribute("cx",e*(n-t.x)),i.setAttribute("cy",e*(r-t.y)),i.setAttribute("rx",o*e),i.setAttribute("ry",s*e),i},yx=(i,t,e)=>{const r=i.getAttribute("d").split(/(?=M|m|L|l|H|h|V|v|Z|z)/g).map(o=>o.trim()).map(o=>{const s=o.substring(0,1);if(s.toLowerCase()==="z")return s;{const a=o.substring(1).split(" ").filter(h=>h).map(h=>parseFloat(h.trim())),l=s===s.toUpperCase(),u=l?e*(a[0]-t.x):e*a[0],c=l?e*(a[1]-t.y):e*a[1];return s+" "+u+" "+c}}).join(" ");return i.setAttribute("d",r),i},ed=(i,t)=>{const{extent:e,scale:n}=gs(i),r=cx(t.annotation);if(r==="FragmentSelector")wx(t,e,n);else if(r==="SvgSelector")bx(t,e,n);else throw`Unsupported selector type type: ${r}`;const o=t.querySelector(".a9s-formatter-el");if(o){const{x:s,y:a}=t.querySelector(".a9s-inner").getBBox();o.setAttribute("x",s),o.setAttribute("y",a)}},wx=(i,t,e)=>{const{x:n,y:r,w:o,h:s}=Rt(i.annotation),a=i.querySelector(".a9s-outer"),l=i.querySelector(".a9s-inner"),u=e*(n-t.x),c=e*(r-t.y);o===0&&s===0?[a,l].forEach(h=>{h.setAttribute("cx",u),h.setAttribute("cy",c)}):[a,l].forEach(h=>{h.setAttribute("x",u),h.setAttribute("y",c),h.setAttribute("width",o*e),h.setAttribute("height",s*e)})},bx=(i,t,e)=>{const n=Wt(i.annotation),r=n.nodeName.toLowerCase();if(r==="polygon")Sx(i,n,t,e);else if(r==="circle")Ex(i,n,t,e);else if(r==="ellipse")xx(i,n,t,e);else if(r==="path")_x(i,n,t,e);else throw`Unsupported SVG shape type: ${r}`},Sx=(i,t,e,n)=>{const o=Array.from(t.points).map(l=>{const u=n*(l.x-e.x),c=n*(l.y-e.y);return u+","+c}).join(" ");i.querySelector(".a9s-outer").setAttribute("points",o),i.querySelector(".a9s-inner").setAttribute("points",o)},Ex=(i,t,e,n)=>{const r=n*(t.getAttribute("cx")-e.x),o=n*(t.getAttribute("cy")-e.y),s=n*t.getAttribute("r"),a=i.querySelector(".a9s-outer");a.setAttribute("cx",r),a.setAttribute("cy",o),a.setAttribute("r",s);const l=i.querySelector(".a9s-inner");l.setAttribute("cx",r),l.setAttribute("cy",o),l.setAttribute("r",s)},xx=(i,t,e,n)=>{const r=n*(t.getAttribute("cx")-e.x),o=n*(t.getAttribute("cy")-e.y),s=n*t.getAttribute("rx"),a=n*t.getAttribute("ry"),l=i.querySelector(".a9s-outer");l.setAttribute("cx",r),l.setAttribute("cy",o),l.setAttribute("rx",s),l.setAttribute("ry",a);const u=i.querySelector(".a9s-inner");u.setAttribute("cx",r),u.setAttribute("cy",o),u.setAttribute("rx",s),u.setAttribute("ry",a)},_x=(i,t,e,n)=>{const o=t.getAttribute("d").split(/(?=M|m|L|l|H|h|V|v|Z|z)/g).map(s=>s.trim()).map(s=>{const a=s.substring(0,1);if(a.toLowerCase()==="z")return a;{const l=s.substring(1).split(" ").filter(d=>d).map(d=>parseFloat(d.trim())),u=a===a.toUpperCase(),c=u?n*(l[0]-e.x):n*l[0],h=u?n*(l[1]-e.y):n*l[1];return a+" "+c+" "+h}}).join(" ");i.querySelector(".a9s-inner").setAttribute("d",o),i.querySelector(".a9s-outer").setAttribute("d",o)},Tx=ss();class Cx extends Jh{constructor(e){super(e);P(this,"_fit",(e,n,r)=>{const o=n?typeof n=="boolean"?n:n.immediately:!1,s=(n==null?void 0:n.padding)||0,a=this.findShape(e);if(a){const l=this.viewer.container.getBoundingClientRect(),u=a.getBoundingClientRect(),c=u.x-l.x,h=u.y-l.y,{width:d,height:g}=u,y=c-s,x=h-s,b=d+2*s,T=g+2*s,f=this.viewer.viewport.viewerElementToViewportRectangle(new Dt.Rect(y,x,b,T));this.viewer.viewport[r](f,o)}});P(this,"_getShapeAt",e=>{const n=l=>{if(Tx){const u=this.svg.getBoundingClientRect(),c=l.clientX-u.x,h=l.clientY-u.y;return new Dt.Point(c,h)}else return new Dt.Point(l.offsetX,l.offsetY)},r=this.viewer.viewport.viewerElementToViewportCoordinates(n(e)),{x:o,y:s}=this.viewer.viewport.viewportToImageCoordinates(r.x,r.y),a=this.store.getAnnotationAt(o,s,this.currentScale());if(a)return this.findShape(a)});P(this,"_refreshNonScalingAnnotations",()=>{});P(this,"addAnnotation",(e,n)=>{const r=n||this.g,o=ds(e,this.env.image);return Et(o,"a9s-annotation"),o.setAttribute("data-id",e.id),o.annotation=e,ed(this.viewer,o),r.appendChild(o),nr(o,e,this.formatters),o});P(this,"addOrUpdateAnnotation",(e,n)=>{var o;const r=(o=this.selectedShape)==null?void 0:o.annotation;(r===e||(r==null?void 0:r.isSelection)||r==n)&&this.deselect(),n&&this.removeAnnotation(e),this.removeAnnotation(e),this.addAnnotation(e),this.store.insert(e)});P(this,"deselect",()=>{var e;if((e=this.tools)==null||e.current.stop(),this.selectedShape){const{annotation:n}=this.selectedShape;this.selectedShape.destroy?(this.selectedShape.mouseTracker.destroy(),this.selectedShape.destroy(),n.isSelection||this.addAnnotation(n)):Qi(this.selectedShape,"selected"),this.selectedShape=null}});P(this,"onDrawingComplete",e=>{const n=e.annotation.clone({target:Qh(this.viewer,e.annotation.target)});e.annotation=n,this.selectShape(e),this.emit("createSelection",e.annotation),this.mouseTracker.enabled=!1});P(this,"selectShape",(e,n)=>{var s;if(!n&&!e.annotation.isSelection&&this.emit("clickAnnotation",e.annotation,e),((s=this.selectedShape)==null?void 0:s.annotation)===e.annotation)return;this.selectedShape&&this.selectedShape.annotation!==e.annotation&&this.deselect(!0);const{annotation:r}=e;if(this.readOnly||r.readOnly||this.headless)this.selectedShape=e,Et(e,"selected"),n||this.emit("select",{annotation:r,element:e,skipEvent:n});else{setTimeout(()=>{e.parentNode.removeChild(e),n||this.emit("select",{annotation:r,element:this.selectedShape.element})},1);const a=this.tools.forAnnotation(r);this.selectedShape=a.createEditableShape(r),this.selectedShape.element.annotation=r;const l=$h(this.viewer,r);this.selectedShape.updateState(l);const u=new Dt.MouseTracker({element:this.svg,preProcessEventHandler:c=>{c.stopPropagation=!0,c.preventDefault=!1,c.preventGesture=!0}}).setTracking(!1);this.selectedShape.element.addEventListener("mouseenter",()=>{this.hoveredShape=this.selectedShape,u.setTracking(!0)}),this.selectedShape.element.addEventListener("mouseleave",()=>{this.hoveredShape=null,u.setTracking(!1)}),this.selectedShape.mouseTracker=u,this.selectedShape.on("update",c=>{const h=Qh(this.viewer,c);this.selectedShape.element.annotation=this.selectedShape.annotation.clone({target:h}),this.emit("updateTarget",this.selectedShape.element,h)})}});this._initDrawingTools(!0)}resize(){if(!this.store)return;if(Array.from(this.g.querySelectorAll(".a9s-annotation:not(.selected)")).forEach(n=>ed(this.viewer,n)),this.selectedShape)if(this.selectedShape.element){const n=$h(this.viewer,this.selectedShape.element.annotation);this.selectedShape.updateState&&this.selectedShape.updateState(n),this.emit("viewportChange",this.selectedShape.element)}else this.emit("viewportChange",this.selectedShape)}}var Px=0;function td(i,t,e,n,r){var o,s,a={};for(s in t)s=="ref"?o=t[s]:a[s]=t[s];var l={type:i,props:a,key:e,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:--Px,__source:n,__self:r};if(typeof i=="function"&&(o=i.defaultProps))for(s in o)a[s]===void 0&&(a[s]=o[s]);return X.vnode&&X.vnode(l),l}class Ax extends Pe{constructor(e){super(e);P(this,"clearState",e=>this.setState({selectedAnnotation:null,selectedDOMElement:null,modifiedTarget:null,beforeHeadlessModify:null},e));P(this,"forwardEvent",(e,n)=>{this.annotationLayer.on(e,(r,o)=>{this.props[n](r.clone(),o)})});P(this,"onKeyUp",e=>{if(e.which===27){this.annotationLayer.stopDrawing();const{selectedAnnotation:n}=this.state;n&&(this.cancelSelected(),this.props.onCancelSelected(n))}else if(e.which===46){const{disableDeleteKey:n}=this.props.config;if(!n){const{selectedAnnotation:r}=this.state;r&&(r.isSelection?this.onCancelAnnotation(r):this.onDeleteAnnotation(r))}}});P(this,"handleStartSelect",e=>this.props.onSelectionStarted(e));P(this,"handleEndSelect",e=>this.props.onSelectionEnded(e));P(this,"handleSelect",(e,n)=>{this.state.editorDisabled?this.onHeadlessSelect(e,n):this.onNormalSelect(e,n)});P(this,"onNormalSelect",(e,n)=>{const{annotation:r,element:o}=e;if(r){const s=()=>{this.setState({selectedAnnotation:r,selectedDOMElement:o,modifiedTarget:null},()=>{n||(r.isSelection?this.props.onSelectionCreated(r.clone()):this.props.onAnnotationSelected(r.clone(),o))})},{selectedAnnotation:a}=this.state;a&&!a.isEqual(r)?this.clearState(()=>{this.props.onCancelSelected(a),s()}):s()}else{const{selectedAnnotation:s}=this.state;s?this.clearState(()=>this.props.onCancelSelected(s)):this.clearState()}});P(this,"onHeadlessSelect",(e,n)=>{this.saveSelected().then(()=>{this.onNormalSelect(e,n)})});P(this,"handleUpdateTarget",(e,n)=>{this.setState({selectedDOMElement:e,modifiedTarget:n});const r=JSON.parse(JSON.stringify(n));this.props.onSelectionTargetChanged(r)});P(this,"handleViewportChange",e=>this.setState({selectedDOMElement:e}));P(this,"overrideAnnotationId",e=>n=>{const{id:r}=e;this.state.selectedAnnotation?this.setState({selectedAnnotation:null,selectedDOMElement:null,modifiedTarget:null},()=>{this.annotationLayer.overrideId(r,n)}):this.annotationLayer.overrideId(r,n)});P(this,"onCreateOrUpdateAnnotation",(e,n)=>(r,o)=>{let s=r.isSelection?r.toAnnotation():r;s=this.state.modifiedTarget?s.clone({target:this.state.modifiedTarget}):s.clone(),this.clearState(()=>{this.annotationLayer.addOrUpdateAnnotation(s,o),o?this.props[e](s,o.clone()):this.props[e](s,this.overrideAnnotationId(s)),n&&n()})});P(this,"onDeleteAnnotation",e=>{this.clearState(),this.annotationLayer.removeAnnotation(e),this.props.onAnnotationDeleted(e)});P(this,"onCancelAnnotation",(e,n)=>{this.state.editorDisabled||this.annotationLayer.deselect(),this.props.onCancelSelected(e),this.clearState(n)});P(this,"addAnnotation",e=>{var n;e.id===((n=this.state.selectedAnnotation)==null?void 0:n.id)&&(this.annotationLayer.deselect(),this.clearState()),this.annotationLayer.addOrUpdateAnnotation(e.clone())});P(this,"addDrawingTool",e=>this.annotationLayer.addDrawingTool(e));P(this,"cancelSelected",()=>new Promise(e=>{this.annotationLayer.deselect(),this.state.selectedAnnotation?this.clearState(e):e()}));P(this,"fitBounds",(e,n)=>this.annotationLayer.fitBounds(e,n));P(this,"fitBoundsWithConstraints",(e,n)=>this.annotationLayer.fitBoundsWithConstraints(e,n));P(this,"getAnnotationById",e=>{var n;return(n=this.annotationLayer.findShape(e))==null?void 0:n.annotation});P(this,"getAnnotations",()=>this.annotationLayer.getAnnotations().map(e=>e.clone()));P(this,"getAnnotationsIntersecting",e=>this.annotationLayer.getAnnotationsIntersecting(e));P(this,"getImageSnippetById",e=>this.annotationLayer.getImageSnippetById(e));P(this,"getSelected",()=>{var e;if(this.state.selectedAnnotation)return this.state.editorDisabled?this.state.selectedAnnotation:(e=this._editor.current)==null?void 0:e.getCurrentAnnotation()});P(this,"getSelectedImageSnippet",()=>this.annotationLayer.getSelectedImageSnippet());P(this,"listDrawingTools",()=>this.annotationLayer.listDrawingTools());P(this,"panTo",(e,n)=>this.annotationLayer.panTo(e,n));P(this,"removeAnnotation",e=>this.annotationLayer.removeAnnotation(e));P(this,"removeDrawingTool",e=>this.annotationLayer.removeDrawingTool(e));P(this,"saveSelected",()=>new Promise(e=>{const n=this.state.selectedAnnotation;if(n)if(this._editor.current)this._editor.current.onOk(),e();else if(n.isSelection)n.bodies.length>0||this.props.config.allowEmpty?this.onCreateOrUpdateAnnotation("onAnnotationCreated",e)(n):(this.annotationLayer.deselect(),e());else{const{beforeHeadlessModify:r,modifiedTarget:o}=this.state;r?this.onCreateOrUpdateAnnotation("onAnnotationUpdated",e)(n,r):o?this.onCreateOrUpdateAnnotation("onAnnotationUpdated",e)(n,n):this.onCancelAnnotation(n,e)}else e()}));P(this,"selectAnnotation",e=>{const n=this.annotationLayer.selectAnnotation(e,!0);if(n)return this.handleSelect(n,!0),n.annotation.clone();this.clearState()});P(this,"setAnnotations",e=>this.annotationLayer.init(e.map(n=>n.clone())));P(this,"setDrawingEnabled",e=>this.annotationLayer.setDrawingEnabled(e));P(this,"setDrawingTool",e=>this.annotationLayer.setDrawingTool(e));P(this,"setVisible",e=>{this.annotationLayer.setVisible(e),e||this.clearState()});P(this,"updateSelected",(e,n)=>new Promise(r=>{this.state.selectedAnnotation&&(n?this.state.selectedAnnotation.isSelection?this.onCreateOrUpdateAnnotation("onAnnotationCreated",r)(e):this.onCreateOrUpdateAnnotation("onAnnotationUpdated",r)(e,this.state.selectedAnnotation):this.setState({selectedAnnotation:e,beforeHeadlessModify:this.state.beforeHeadlessModify||this.state.selectedAnnotation},r))}));this.state={selectedAnnotation:null,selectedDOMElement:null,modifiedTarget:null,readOnly:e.config.readOnly,editorDisabled:e.config.disableEditor,widgets:e.config.widgets,beforeHeadlessModify:null},this._editor=k.createRef()}componentDidMount(){this.annotationLayer=this.props.config.gigapixelMode?new Cx(this.props):new ux(this.props),this.annotationLayer.on("load",this.props.onLoad),this.annotationLayer.on("startSelection",this.handleStartSelect),this.annotationLayer.on("endSelection",this.handleEndSelect),this.annotationLayer.on("select",this.handleSelect),this.annotationLayer.on("updateTarget",this.handleUpdateTarget),this.annotationLayer.on("viewportChange",this.handleViewportChange),this.forwardEvent("clickAnnotation","onClickAnnotation"),this.forwardEvent("mouseEnterAnnotation","onMouseEnterAnnotation"),this.forwardEvent("mouseLeaveAnnotation","onMouseLeaveAnnotation"),document.addEventListener("keyup",this.onKeyUp)}componentWillUnmount(){this.annotationLayer.destroy(),document.removeEventListener("keyup",this.onKeyUp)}get disableEditor(){return this.state.editorDisabled}set disableEditor(e){this.setState({editorDisabled:e})}get disableSelect(){return this.annotationLayer.disableSelect}set disableSelect(e){this.annotationLayer.disableSelect=e}get formatters(){return this.annotationLayer.formatters}set formatters(e){this.annotationLayer.formatters=e}get readOnly(){return this.state.readOnly}set readOnly(e){this.annotationLayer.readOnly=e,this.setState({readOnly:e})}get widgets(){return this.state.widgets}set widgets(e){this.setState({widgets:e})}render(){var r;const e=this.state.selectedAnnotation&&!this.state.editorDisabled,n=this.state.readOnly||((r=this.state.selectedAnnotation)==null?void 0:r.readOnly);return e&&td(mE,{ref:this._editor,detachable:!0,wrapperEl:this.props.wrapperEl,annotation:this.state.selectedAnnotation,modifiedTarget:this.state.modifiedTarget,selectedElement:this.state.selectedDOMElement,readOnly:n,allowEmpty:this.props.config.allowEmpty,widgets:this.state.widgets,env:this.props.env,onAnnotationCreated:this.onCreateOrUpdateAnnotation("onAnnotationCreated"),onAnnotationUpdated:this.onCreateOrUpdateAnnotation("onAnnotationUpdated"),onAnnotationDeleted:this.onDeleteAnnotation,onCancel:this.onCancelAnnotation})}}var I1="",N1="",H1="";class Ox{constructor(t,e){P(this,"handleAnnotationCreated",(t,e)=>this._emitter.emit("createAnnotation",t.underlying,e));P(this,"handleAnnotationDeleted",t=>this._emitter.emit("deleteAnnotation",t.underlying));P(this,"handleAnnotationSelected",(t,e)=>this._emitter.emit("selectAnnotation",t.underlying,e));P(this,"handleAnnotationUpdated",(t,e)=>this._emitter.emit("updateAnnotation",t.underlying,e.underlying));P(this,"handleCancelSelected",t=>this._emitter.emit("cancelSelected",t.underlying));P(this,"handleClickAnnotation",(t,e)=>this._emitter.emit("clickAnnotation",t.underlying,e));P(this,"handleLoad",t=>this._emitter.emit("load",t));P(this,"handleSelectionCreated",t=>this._emitter.emit("createSelection",t.underlying));P(this,"handleSelectionStarted",t=>this._emitter.emit("startSelection",t));P(this,"handleSelectionEnded",t=>this._emitter.emit("endSelection",t));P(this,"handleSelectionTargetChanged",t=>this._emitter.emit("changeSelectionTarget",t));P(this,"handleMouseEnterAnnotation",(t,e)=>this._emitter.emit("mouseEnterAnnotation",t.underlying,e));P(this,"handleMouseLeaveAnnotation",(t,e)=>this._emitter.emit("mouseLeaveAnnotation",t.underlying,e));P(this,"_wrap",t=>(t==null?void 0:t.type)==="Annotation"?new St(t):t);P(this,"addAnnotation",t=>this._app.current.addAnnotation(new St(t)));P(this,"addDrawingTool",t=>this._app.current.addDrawingTool(t));P(this,"cancelSelected",()=>this._app.current.cancelSelected());P(this,"clearAnnotations",()=>this.setAnnotations([]));P(this,"clearAuthInfo",()=>this._env.user=null);P(this,"destroy",()=>k.unmountComponentAtNode(this.appContainerEl));P(this,"fitBounds",(t,e)=>this._app.current.fitBounds(this._wrap(t),e));P(this,"fitBoundsWithConstraints",(t,e)=>this._app.current.fitBoundsWithConstraints(this._wrap(t),e));P(this,"getAnnotationById",t=>{const e=this._app.current.getAnnotationById(t);return e==null?void 0:e.underlying});P(this,"getAnnotations",()=>this._app.current.getAnnotations().map(e=>e.underlying));P(this,"getAnnotationsIntersecting",t=>this._app.current.getAnnotationsIntersecting(this._wrap(t)));P(this,"getImageSnippetById",t=>this._app.current.getImageSnippetById(t));P(this,"getSelected",()=>{const t=this._app.current.getSelected();return t==null?void 0:t.underlying});P(this,"getSelectedImageSnippet",()=>this._app.current.getSelectedImageSnippet());P(this,"listDrawingTools",()=>this._app.current.listDrawingTools());P(this,"loadAnnotations",t=>fetch(t).then(e=>e.json()).then(e=>(this.setAnnotations(e),e)));P(this,"off",(t,e)=>this._emitter.off(t,e));P(this,"on",(t,e)=>this._emitter.on(t,e));P(this,"once",(t,e)=>this._emitter.once(t,e));P(this,"panTo",(t,e)=>this._app.current.panTo(this._wrap(t),e));P(this,"removeAnnotation",t=>this._app.current.removeAnnotation(this._wrap(t)));P(this,"removeDrawingTool",t=>this._app.current.removeDrawingTool(t));P(this,"saveSelected",()=>this._app.current.saveSelected());P(this,"selectAnnotation",t=>{const e=this._app.current.selectAnnotation(this._wrap(t));return e==null?void 0:e.underlying});P(this,"setAnnotations",t=>{const n=(t||[]).map(r=>new St(r));this._app.current.setAnnotations(n)});P(this,"setAuthInfo",t=>this._env.user=t);P(this,"setDrawingEnabled",t=>this._app.current.setDrawingEnabled(t));P(this,"setDrawingTool",t=>this._app.current.setDrawingTool(t));P(this,"setServerTime",t=>this._env.setServerTime(t));P(this,"setVisible",t=>this._app.current.setVisible(t));P(this,"updateSelected",(t,e)=>{let n=null;t.type==="Annotation"?n=new St(t):t.type==="Selection"&&(n=new Wn(t.target,t.body)),n&&this._app.current.updateSelected(n,e)});const n=e||{};this._app=k.createRef(),this._emitter=new Qn,this._env=EE(),this._element=t.element,window.getComputedStyle(this._element).getPropertyValue("position")==="static"&&(this._element.style.position="relative"),xE(n.locale,n.messages),this.appContainerEl=document.createElement("DIV"),this._element.appendChild(this.appContainerEl),k.render(td(Ax,{ref:this._app,viewer:t,wrapperEl:this._element,config:n,env:this._env,onSelectionStarted:this.handleSelectionStarted,onSelectionEnded:this.handleSelectionEnded,onSelectionCreated:this.handleSelectionCreated,onSelectionTargetChanged:this.handleSelectionTargetChanged,onAnnotationCreated:this.handleAnnotationCreated,onAnnotationSelected:this.handleAnnotationSelected,onAnnotationUpdated:this.handleAnnotationUpdated,onAnnotationDeleted:this.handleAnnotationDeleted,onCancelSelected:this.handleCancelSelected,onClickAnnotation:this.handleClickAnnotation,onLoad:this.handleLoad,onMouseEnterAnnotation:this.handleMouseEnterAnnotation,onMouseLeaveAnnotation:this.handleMouseLeaveAnnotation}),this.appContainerEl)}get disableEditor(){return this._app.current.disableEditor}set disableEditor(t){this._app.current.disableEditor=t}get disableSelect(){return this._app.current.disableSelect}set disableSelect(t){this._app.current.disableSelect=t}get formatters(){return this._app.current.formatters||[]}set formatters(t){if(t){const e=Array.isArray(t)?t:[t];this._app.current.formatters=e}else this._app.current.formatters=null}get readOnly(){return this._app.current.readOnly}set readOnly(t){this._app.current.readOnly=t}get widgets(){return this._app.current.widgets}set widgets(t){this._app.current.widgets=t}}var Dx=(i,t)=>new Ox(i,t);return Dx}); +//# sourceMappingURL=annotorious-openseadragon.umd.js.map diff --git a/script/openseadragon/openseadragon-filtering.js b/script/openseadragon/openseadragon-filtering.js new file mode 100644 index 0000000..aabbb9d --- /dev/null +++ b/script/openseadragon/openseadragon-filtering.js @@ -0,0 +1,493 @@ +/* + * This software was developed at the National Institute of Standards and + * Technology by employees of the Federal Government in the course of + * their official duties. Pursuant to title 17 Section 105 of the United + * States Code this software is not subject to copyright protection and is + * in the public domain. This software is an experimental system. NIST assumes + * no responsibility whatsoever for its use by other parties, and makes no + * guarantees, expressed or implied, about its quality, reliability, or + * any other characteristic. We would appreciate acknowledgement if the + * software is used. + */ + +/** + * + * @author Antoine Vandecreme + */ +(function() { + + 'use strict'; + + var $ = window.OpenSeadragon; + if (!$) { + $ = require('openseadragon'); + if (!$) { + throw new Error('OpenSeadragon is missing.'); + } + } + // Requires OpenSeadragon >=2.1 + if (!$.version || $.version.major < 2 || + $.version.major === 2 && $.version.minor < 1) { + throw new Error( + 'Filtering plugin requires OpenSeadragon version >= 2.1'); + } + + $.Viewer.prototype.setFilterOptions = function(options) { + if (!this.filterPluginInstance) { + options = options || {}; + options.viewer = this; + this.filterPluginInstance = new $.FilterPlugin(options); + } else { + setOptions(this.filterPluginInstance, options); + } + }; + + /** + * @class FilterPlugin + * @param {Object} options The options + * @param {OpenSeadragon.Viewer} options.viewer The viewer to attach this + * plugin to. + * @param {String} [options.loadMode='async'] Set to sync to have the filters + * applied synchronously. It will only work if the filters are all synchronous. + * Note that depending on how complex the filters are, it may also hang the browser. + * @param {Object[]} options.filters The filters to apply to the images. + * @param {OpenSeadragon.TiledImage[]} options.filters[x].items The tiled images + * on which to apply the filter. + * @param {function|function[]} options.filters[x].processors The processing + * function(s) to apply to the images. The parameters of this function are + * the context to modify and a callback to call upon completion. + */ + $.FilterPlugin = function(options) { + options = options || {}; + if (!options.viewer) { + throw new Error('A viewer must be specified.'); + } + var self = this; + this.viewer = options.viewer; + + this.viewer.addHandler('tile-loaded', tileLoadedHandler); + this.viewer.addHandler('tile-drawing', tileDrawingHandler); + + // filterIncrement allows to determine whether a tile contains the + // latest filters results. + this.filterIncrement = 0; + + setOptions(this, options); + + + function tileLoadedHandler(event) { + var processors = getFiltersProcessors(self, event.tiledImage); + if (processors.length === 0) { + return; + } + var tile = event.tile; + var image = event.data; + if (image !== null && image !== undefined) { + var canvas = window.document.createElement('canvas'); + canvas.width = image.width; + canvas.height = image.height; + var context = canvas.getContext('2d'); + context.drawImage(image, 0, 0); + tile._renderedContext = context; + var callback = event.getCompletionCallback(); + applyFilters(context, processors, callback); + tile._filterIncrement = self.filterIncrement; + } + } + + + function applyFilters(context, filtersProcessors, callback) { + if (callback) { + var currentIncrement = self.filterIncrement; + var callbacks = []; + for (var i = 0; i < filtersProcessors.length - 1; i++) { + (function(i) { + callbacks[i] = function() { + // If the increment has changed, stop the computation + // chain immediately. + if (self.filterIncrement !== currentIncrement) { + return; + } + filtersProcessors[i + 1](context, callbacks[i + 1]); + }; + })(i); + } + callbacks[filtersProcessors.length - 1] = function() { + // If the increment has changed, do not call the callback. + // (We don't want OSD to draw an outdated tile in the canvas). + if (self.filterIncrement !== currentIncrement) { + return; + } + callback(); + }; + filtersProcessors[0](context, callbacks[0]); + } else { + for (var i = 0; i < filtersProcessors.length; i++) { + filtersProcessors[i](context, function() { + }); + } + } + } + + function tileDrawingHandler(event) { + var tile = event.tile; + var rendered = event.rendered; + if (rendered._filterIncrement === self.filterIncrement) { + return; + } + var processors = getFiltersProcessors(self, event.tiledImage); + if (processors.length === 0) { + if (rendered._originalImageData) { + // Restore initial data. + rendered.putImageData(rendered._originalImageData, 0, 0); + delete rendered._originalImageData; + } + rendered._filterIncrement = self.filterIncrement; + return; + } + + if (rendered._originalImageData) { + // The tile has been previously filtered (by another filter), + // restore it first. + rendered.putImageData(rendered._originalImageData, 0, 0); + } else { + rendered._originalImageData = rendered.getImageData( + 0, 0, rendered.canvas.width, rendered.canvas.height); + } + + if (tile._renderedContext) { + if (tile._filterIncrement === self.filterIncrement) { + var imgData = tile._renderedContext.getImageData(0, 0, + tile._renderedContext.canvas.width, + tile._renderedContext.canvas.height); + rendered.putImageData(imgData, 0, 0); + delete tile._renderedContext; + delete tile._filterIncrement; + rendered._filterIncrement = self.filterIncrement; + return; + } + delete tile._renderedContext; + delete tile._filterIncrement; + } + applyFilters(rendered, processors); + rendered._filterIncrement = self.filterIncrement; + } + }; + + function setOptions(instance, options) { + options = options || {}; + var filters = options.filters; + instance.filters = !filters ? [] : + $.isArray(filters) ? filters : [filters]; + for (var i = 0; i < instance.filters.length; i++) { + var filter = instance.filters[i]; + if (!filter.processors) { + throw new Error('Filter processors must be specified.'); + } + filter.processors = $.isArray(filter.processors) ? + filter.processors : [filter.processors]; + } + instance.filterIncrement++; + + if (options.loadMode === 'sync') { + instance.viewer.forceRedraw(); + } else { + var itemsToReset = []; + for (var i = 0; i < instance.filters.length; i++) { + var filter = instance.filters[i]; + if (!filter.items) { + itemsToReset = getAllItems(instance.viewer.world); + break; + } + if ($.isArray(filter.items)) { + for (var j = 0; j < filter.items.length; j++) { + addItemToReset(filter.items[j], itemsToReset); + } + } else { + addItemToReset(filter.items, itemsToReset); + } + } + for (var i = 0; i < itemsToReset.length; i++) { + itemsToReset[i].reset(); + } + } + } + + function addItemToReset(item, itemsToReset) { + if (itemsToReset.indexOf(item) >= 0) { + throw new Error('An item can not have filters ' + + 'assigned multiple times.'); + } + itemsToReset.push(item); + } + + function getAllItems(world) { + var result = []; + for (var i = 0; i < world.getItemCount(); i++) { + result.push(world.getItemAt(i)); + } + return result; + } + + function getFiltersProcessors(instance, item) { + if (instance.filters.length === 0) { + return []; + } + + var globalProcessors = null; + for (var i = 0; i < instance.filters.length; i++) { + var filter = instance.filters[i]; + if (!filter.items) { + globalProcessors = filter.processors; + } else if (filter.items === item || + $.isArray(filter.items) && filter.items.indexOf(item) >= 0) { + return filter.processors; + } + } + return globalProcessors ? globalProcessors : []; + } + + $.Filters = { + THRESHOLDING: function(threshold) { + if (threshold < 0 || threshold > 255) { + throw new Error('Threshold must be between 0 and 255.'); + } + return function(context, callback) { + var imgData = context.getImageData( + 0, 0, context.canvas.width, context.canvas.height); + var pixels = imgData.data; + for (var i = 0; i < pixels.length; i += 4) { + var r = pixels[i]; + var g = pixels[i + 1]; + var b = pixels[i + 2]; + var v = (r + g + b) / 3; + pixels[i] = pixels[i + 1] = pixels[i + 2] = + v < threshold ? 0 : 255; + } + context.putImageData(imgData, 0, 0); + callback(); + }; + }, + BRIGHTNESS: function(adjustment) { + if (adjustment < -255 || adjustment > 255) { + throw new Error( + 'Brightness adjustment must be between -255 and 255.'); + } + var precomputedBrightness = []; + for (var i = 0; i < 256; i++) { + precomputedBrightness[i] = i + adjustment; + } + return function(context, callback) { + var imgData = context.getImageData( + 0, 0, context.canvas.width, context.canvas.height); + var pixels = imgData.data; + for (var i = 0; i < pixels.length; i += 4) { + pixels[i] = precomputedBrightness[pixels[i]]; + pixels[i + 1] = precomputedBrightness[pixels[i + 1]]; + pixels[i + 2] = precomputedBrightness[pixels[i + 2]]; + } + context.putImageData(imgData, 0, 0); + callback(); + }; + }, + CONTRAST: function(adjustment) { + if (adjustment < 0) { + throw new Error('Contrast adjustment must be positive.'); + } + var precomputedContrast = []; + for (var i = 0; i < 256; i++) { + precomputedContrast[i] = i * adjustment; + } + return function(context, callback) { + var imgData = context.getImageData( + 0, 0, context.canvas.width, context.canvas.height); + var pixels = imgData.data; + for (var i = 0; i < pixels.length; i += 4) { + pixels[i] = precomputedContrast[pixels[i]]; + pixels[i + 1] = precomputedContrast[pixels[i + 1]]; + pixels[i + 2] = precomputedContrast[pixels[i + 2]]; + } + context.putImageData(imgData, 0, 0); + callback(); + }; + }, + GAMMA: function(adjustment) { + if (adjustment < 0) { + throw new Error('Gamma adjustment must be positive.'); + } + var precomputedGamma = []; + for (var i = 0; i < 256; i++) { + precomputedGamma[i] = Math.pow(i / 255, adjustment) * 255; + } + return function(context, callback) { + var imgData = context.getImageData( + 0, 0, context.canvas.width, context.canvas.height); + var pixels = imgData.data; + for (var i = 0; i < pixels.length; i += 4) { + pixels[i] = precomputedGamma[pixels[i]]; + pixels[i + 1] = precomputedGamma[pixels[i + 1]]; + pixels[i + 2] = precomputedGamma[pixels[i + 2]]; + } + context.putImageData(imgData, 0, 0); + callback(); + }; + }, + GREYSCALE: function() { + return function(context, callback) { + var imgData = context.getImageData( + 0, 0, context.canvas.width, context.canvas.height); + var pixels = imgData.data; + for (var i = 0; i < pixels.length; i += 4) { + var val = (pixels[i] + pixels[i + 1] + pixels[i + 2]) / 3; + pixels[i] = val; + pixels[i + 1] = val; + pixels[i + 2] = val; + } + context.putImageData(imgData, 0, 0); + callback(); + }; + }, + INVERT: function() { + var precomputedInvert = []; + for (var i = 0; i < 256; i++) { + precomputedInvert[i] = 255 - i; + } + return function(context, callback) { + var imgData = context.getImageData( + 0, 0, context.canvas.width, context.canvas.height); + var pixels = imgData.data; + for (var i = 0; i < pixels.length; i += 4) { + pixels[i] = precomputedInvert[pixels[i]]; + pixels[i + 1] = precomputedInvert[pixels[i + 1]]; + pixels[i + 2] = precomputedInvert[pixels[i + 2]]; + } + context.putImageData(imgData, 0, 0); + callback(); + }; + }, + MORPHOLOGICAL_OPERATION: function(kernelSize, comparator) { + if (kernelSize % 2 === 0) { + throw new Error('The kernel size must be an odd number.'); + } + var kernelHalfSize = Math.floor(kernelSize / 2); + + if (!comparator) { + throw new Error('A comparator must be defined.'); + } + + return function(context, callback) { + var width = context.canvas.width; + var height = context.canvas.height; + var imgData = context.getImageData(0, 0, width, height); + var originalPixels = context.getImageData(0, 0, width, height) + .data; + var offset; + + for (var y = 0; y < height; y++) { + for (var x = 0; x < width; x++) { + offset = (y * width + x) * 4; + var r = originalPixels[offset]; + var g = originalPixels[offset + 1]; + var b = originalPixels[offset + 2]; + for (var j = 0; j < kernelSize; j++) { + for (var i = 0; i < kernelSize; i++) { + var pixelX = x + i - kernelHalfSize; + var pixelY = y + j - kernelHalfSize; + if (pixelX >= 0 && pixelX < width && + pixelY >= 0 && pixelY < height) { + offset = (pixelY * width + pixelX) * 4; + r = comparator(originalPixels[offset], r); + g = comparator( + originalPixels[offset + 1], g); + b = comparator( + originalPixels[offset + 2], b); + } + } + } + imgData.data[offset] = r; + imgData.data[offset + 1] = g; + imgData.data[offset + 2] = b; + } + } + context.putImageData(imgData, 0, 0); + callback(); + }; + }, + CONVOLUTION: function(kernel) { + if (!$.isArray(kernel)) { + throw new Error('The kernel must be an array.'); + } + var kernelSize = Math.sqrt(kernel.length); + if ((kernelSize + 1) % 2 !== 0) { + throw new Error('The kernel must be a square matrix with odd' + + 'width and height.'); + } + var kernelHalfSize = (kernelSize - 1) / 2; + + return function(context, callback) { + var width = context.canvas.width; + var height = context.canvas.height; + var imgData = context.getImageData(0, 0, width, height); + var originalPixels = context.getImageData(0, 0, width, height) + .data; + var offset; + + for (var y = 0; y < height; y++) { + for (var x = 0; x < width; x++) { + var r = 0; + var g = 0; + var b = 0; + for (var j = 0; j < kernelSize; j++) { + for (var i = 0; i < kernelSize; i++) { + var pixelX = x + i - kernelHalfSize; + var pixelY = y + j - kernelHalfSize; + if (pixelX >= 0 && pixelX < width && + pixelY >= 0 && pixelY < height) { + offset = (pixelY * width + pixelX) * 4; + var weight = kernel[j * kernelSize + i]; + r += originalPixels[offset] * weight; + g += originalPixels[offset + 1] * weight; + b += originalPixels[offset + 2] * weight; + } + } + } + offset = (y * width + x) * 4; + imgData.data[offset] = r; + imgData.data[offset + 1] = g; + imgData.data[offset + 2] = b; + } + } + context.putImageData(imgData, 0, 0); + callback(); + }; + }, + COLORMAP: function(cmap, ctr) { + var resampledCmap = cmap.slice(0); + var diff = 255 - ctr; + for(var i = 0; i < 256; i++) { + var position = 0; + if(i > ctr) { + position = Math.min((i - ctr) / diff * 128 + 128,255) | 0; + }else{ + position = Math.max(0, i / (ctr / 128)) | 0; + } + resampledCmap[i] = cmap[position]; + } + return function(context, callback) { + var imgData = context.getImageData( + 0, 0, context.canvas.width, context.canvas.height); + var pxl = imgData.data; + for (var i = 0; i < pxl.length; i += 4) { + var v = (pxl[i] + pxl[i + 1] + pxl[i + 2]) / 3 | 0; + var c = resampledCmap[v]; + pxl[i] = c[0]; + pxl[i + 1] = c[1]; + pxl[i + 2] = c[2]; + } + context.putImageData(imgData, 0, 0); + callback(); + }; + } + }; + +}()); diff --git a/script/openseadragon/openseadragon-smartScrollZoom.js b/script/openseadragon/openseadragon-smartScrollZoom.js new file mode 100644 index 0000000..7ae57c9 --- /dev/null +++ b/script/openseadragon/openseadragon-smartScrollZoom.js @@ -0,0 +1,147 @@ +/** + * @file OpenSeadragon plugin that allows for adjustment of zoom speed based upon the speed that the user scrolls the mouse wheel + * @author Bassil Virk + * @version 1.0.0 + */ + + (function($){ + + $.Viewer.prototype.smartScrollZoom = function (options) { + if (!this.smartScrollZoomInstance) { + options = options || {}; + options.viewer = this; + this.smartScrollZoomInstance = new $.SmartScrollZoom(options); + } else { + this.smartScrollZoomInstance.setOptions(options); + } + }; + + /** + * @class SmartScrollZoom + * @classdesc Changes zoom speed based on scrolling speed + * @memberof OpenSeadragon + * @param {Object} options + * @param {Number} options.timeThreshold - Amount of time, in milliseconds, that the minimum number of scrolls must occur within + * before logic begins + * @param {Number} options.minScrolls - Required number of consecutive scrolls that must take place within the specified time + * threshold of each other before logic begins + * @param {Number} options.minZoomPerScroll - Minimum factor to zoom by with a single scroll. Setting this to 1 will affectively + * result in no zoom while logic is not being executing + * @param {Number} options.maxZoomPerScroll - Maximum zoom factor that can be reached + * @param {Number} options.zoomIncrement - Amount to increment zoom factor by with every scroll after minScrolls + * @param {Boolean} options.enabled - Whether or not the scroll zoom logic is currently active + */ + $.SmartScrollZoom = function (options) { + //If this was not set to a viewer, throw an error + if (!options.viewer) { + throw new Error("SmartScrollZoom must be set to a viewer"); + } + + this.viewer = options.viewer; //Set viewer + this.timeThreshold = options.timeThreshold || 400; + this.minScrolls = options.minScrolls || 2; + this.minZoomPerScroll = options.minZoomPerScroll || 1.2; //OpenSeadragon has a default of 1.2 + this.maxZoomPerScroll = options.maxZoomPerScroll || 2.5; + this.zoomIncrement = options.zoomIncrement || 0.2; + this.enabled = options.enabled ? true : false; + + var self = this; + + //Create handler for logic + this.viewer.addHandler("canvas-scroll", function () { + //Do nothing if not enabled + if (!self.enabled) { + return; + } + + //Create var to count number of consecutive scrolls that have taken place within the specified time limit of each other + if (typeof self.scrollNum == 'undefined') { + self.scrollNum = 0; + } + + //Create var to store the time of the previous scroll that occurred + if (typeof self.lastScroll == 'undefined') { + self.lastScroll = new Date(); + } + + self.currentScroll = new Date(); //Time that this scroll occurred at + + //If the last scroll was less than 400 ms ago, increase the scroll count + if (self.currentScroll - self.lastScroll < self.timeThreshold) { + self.scrollNum++; + } + //Otherwise, reset the count and zoom speed + else { + self.scrollNum = 0; + self.viewer.zoomPerScroll = self.minZoomPerScroll; + } + + //If user has scrolled more than twice consecutively within 400 ms, increase the scroll speed with each consecutive scroll afterwards + if (self.scrollNum > self.minScrolls) { + //Limit maximum scroll speed to 2.5 + if (self.viewer.zoomPerScroll <= self.maxZoomPerScroll) { + self.viewer.zoomPerScroll += self.zoomIncrement; + } + } + + self.lastScroll = self.currentScroll; //Set last scroll to now + }); + }; + + $.SmartScrollZoom.prototype = { + + /** + * Set new options + * + * @function + * @memberof OpenSeadragon.SmartScrollZoom + * @since 1.0.0 + * @version 1.0.0 + * @param {Object} options + */ + setOptions: function (options) { + + //If no new options were specifed, do nothing + if (!options) { + return; + } + + //Set time threshold + if (options.timeThreshold !== undefined) { + this.timeThreshold = options.timeThreshold; + } + + //Set minimum scroll number + if (options.minScrolls !== undefined) { + this.minScrolls = options.minScrolls; + } + + //Set minimum zoom per scroll + if (options.minZoomPerScroll !== undefined) { + this.minZoomPerScroll = options.minZoomPerScroll; + } + + //Set maximum zoom per scroll + if (options.maxZoomPerScroll !== undefined) { + this.maxZoomPerScroll = options.maxZoomPerScroll; + } + + //Set zoom increment + if (options.zoomIncrement !== undefined) { + this.zoomIncrement = options.zoomIncrement; + } + }, + + /** + * Toggle the enabled option + * + * @function + * @memberof OpenSeadragon.SmartScrollZoom + * @since 1.0.0 + * @version 1.0.0 + */ + toggleEnable: function () { + this.enabled = !this.enabled; + } + }; + })(OpenSeadragon); \ No newline at end of file diff --git a/script/openseadragon/openseadragon.js b/script/openseadragon/openseadragon.js new file mode 100644 index 0000000..cd41170 --- /dev/null +++ b/script/openseadragon/openseadragon.js @@ -0,0 +1,24826 @@ +//! openseadragon 4.1.0 +//! Built on 2023-05-25 +//! Git commit: v4.1.0-0-8849681 +//! http://openseadragon.github.io +//! License: http://openseadragon.github.io/license/ + +/* + * OpenSeadragon + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Portions of this source file taken from jQuery: + * + * Copyright 2011 John Resig + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Portions of this source file taken from mattsnider.com: + * + * Copyright (c) 2006-2022 Matt Snider + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/** + * @namespace OpenSeadragon + * @version openseadragon 4.1.0 + * @classdesc The root namespace for OpenSeadragon. All utility methods + * and classes are defined on or below this namespace. + * + */ + + +// Typedefs + + /** + * All required and optional settings for instantiating a new instance of an OpenSeadragon image viewer. + * + * @typedef {Object} Options + * @memberof OpenSeadragon + * + * @property {String} id + * Id of the element to append the viewer's container element to. If not provided, the 'element' property must be provided. + * If both the element and id properties are specified, the viewer is appended to the element provided in the element property. + * + * @property {Element} element + * The element to append the viewer's container element to. If not provided, the 'id' property must be provided. + * If both the element and id properties are specified, the viewer is appended to the element provided in the element property. + * + * @property {Array|String|Function|Object} [tileSources=null] + * Tile source(s) to open initially. This is a complex parameter; see + * {@link OpenSeadragon.Viewer#open} for details. + * + * @property {Number} [tabIndex=0] + * Tabbing order index to assign to the viewer element. Positive values are selected in increasing order. When tabIndex is 0 + * source order is used. A negative value omits the viewer from the tabbing order. + * + * @property {Array} overlays Array of objects defining permanent overlays of + * the viewer. The overlays added via this option and later removed with + * {@link OpenSeadragon.Viewer#removeOverlay} will be added back when a new + * image is opened. + * To add overlays which can be definitively removed, one must use + * {@link OpenSeadragon.Viewer#addOverlay} + * If displaying a sequence of images, the overlays can be associated + * with a specific page by passing the overlays array to the page's + * tile source configuration. + * Expected properties: + * * x, y, (or px, py for pixel coordinates) to define the location. + * * width, height in point if using x,y or in pixels if using px,py. If width + * and height are specified, the overlay size is adjusted when zooming, + * otherwise the size stays the size of the content (or the size defined by CSS). + * * className to associate a class to the overlay + * * id to set the overlay element. If an element with this id already exists, + * it is reused, otherwise it is created. If not specified, a new element is + * created. + * * placement a string to define the relative position to the viewport. + * Only used if no width and height are specified. Default: 'TOP_LEFT'. + * See {@link OpenSeadragon.Placement} for possible values. + * + * @property {String} [xmlPath=null] + * DEPRECATED. A relative path to load a DZI file from the server. + * Prefer the newer Options.tileSources. + * + * @property {String} [prefixUrl='/images/'] + * Prepends the prefixUrl to navImages paths, which is very useful + * since the default paths are rarely useful for production + * environments. + * + * @property {OpenSeadragon.NavImages} [navImages] + * An object with a property for each button or other built-in navigation + * control, eg the current 'zoomIn', 'zoomOut', 'home', and 'fullpage'. + * Each of those in turn provides an image path for each state of the button + * or navigation control, eg 'REST', 'GROUP', 'HOVER', 'PRESS'. Finally the + * image paths, by default assume there is a folder on the servers root path + * called '/images', eg '/images/zoomin_rest.png'. If you need to adjust + * these paths, prefer setting the option.prefixUrl rather than overriding + * every image path directly through this setting. + * + * @property {Boolean} [debugMode=false] + * TODO: provide an in-screen panel providing event detail feedback. + * + * @property {String} [debugGridColor=['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']] + * The colors of grids in debug mode. Each tiled image's grid uses a consecutive color. + * If there are more tiled images than provided colors, the color vector is recycled. + * + * @property {Boolean} [silenceMultiImageWarnings=false] + * Silences warnings when calling viewport coordinate functions with multi-image. + * Useful when you're overlaying multiple images on top of one another. + * + * @property {Number} [blendTime=0] + * Specifies the duration of animation as higher or lower level tiles are + * replacing the existing tile. + * + * @property {Boolean} [alwaysBlend=false] + * Forces the tile to always blend. By default the tiles skip blending + * when the blendTime is surpassed and the current animation frame would + * not complete the blend. + * + * @property {Boolean} [autoHideControls=true] + * If the user stops interacting with the viewport, fade the navigation + * controls. Useful for presentation since the controls are by default + * floated on top of the image the user is viewing. + * + * @property {Boolean} [immediateRender=false] + * Render the best closest level first, ignoring the lowering levels which + * provide the effect of very blurry to sharp. It is recommended to change + * setting to true for mobile devices. + * + * @property {Number} [defaultZoomLevel=0] + * Zoom level to use when image is first opened or the home button is clicked. + * If 0, adjusts to fit viewer. + * + * @property {Number} [opacity=1] + * Default proportional opacity of the tiled images (1=opaque, 0=hidden) + * Hidden images do not draw and only load when preloading is allowed. + * + * @property {Boolean} [preload=false] + * Default switch for loading hidden images (true loads, false blocks) + * + * @property {String} [compositeOperation=null] + * Valid values are 'source-over', 'source-atop', 'source-in', 'source-out', + * 'destination-over', 'destination-atop', 'destination-in', 'destination-out', + * 'lighter', 'difference', 'copy', 'xor', etc. + * For complete list of modes, please @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation/ globalCompositeOperation} + * + * @property {Boolean} [imageSmoothingEnabled=true] + * Image smoothing for canvas rendering (only if canvas is used). Note: Ignored + * by some (especially older) browsers which do not support this canvas property. + * This property can be changed in {@link Viewer.Drawer.setImageSmoothingEnabled}. + * + * @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null] + * Draws a colored rectangle behind the tile if it is not loaded yet. + * You can pass a CSS color value like "#FF8800". + * When passing a function the tiledImage and canvas context are available as argument which is useful when you draw a gradient or pattern. + * + * @property {Object} [subPixelRoundingForTransparency=null] + * Determines when subpixel rounding should be applied for tiles when rendering images that support transparency. + * This property is a subpixel rounding enum values dictionary [{@link BROWSERS}] --> {@link SUBPIXEL_ROUNDING_OCCURRENCES}. + * The key is a {@link BROWSERS} value, and the value is one of {@link SUBPIXEL_ROUNDING_OCCURRENCES}, + * indicating, for a given browser, when to apply subpixel rounding. + * Key '*' is the fallback value for any browser not specified in the dictionary. + * This property has a simple mode, and one can set it directly to + * {@link SUBPIXEL_ROUNDING_OCCURRENCES.NEVER}, {@link SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST} or {@link SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS} + * in order to apply this rule for all browser. The values {@link SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS} would be equivalent to { '*', SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS }. + * The default is {@link SUBPIXEL_ROUNDING_OCCURRENCES.NEVER} for all browsers, for backward compatibility reason. + * + * @property {Number} [degrees=0] + * Initial rotation. + * + * @property {Boolean} [flipped=false] + * Initial flip state. + * + * @property {Number} [minZoomLevel=null] + * + * @property {Number} [maxZoomLevel=null] + * + * @property {Boolean} [homeFillsViewer=false] + * Make the 'home' button fill the viewer and clip the image, instead + * of fitting the image to the viewer and letterboxing. + * + * @property {Boolean} [panHorizontal=true] + * Allow horizontal pan. + * + * @property {Boolean} [panVertical=true] + * Allow vertical pan. + * + * @property {Boolean} [constrainDuringPan=false] + * + * @property {Boolean} [wrapHorizontal=false] + * Set to true to force the image to wrap horizontally within the viewport. + * Useful for maps or images representing the surface of a sphere or cylinder. + * + * @property {Boolean} [wrapVertical=false] + * Set to true to force the image to wrap vertically within the viewport. + * Useful for maps or images representing the surface of a sphere or cylinder. + * + * @property {Number} [minZoomImageRatio=0.9] + * The minimum percentage ( expressed as a number between 0 and 1 ) of + * the viewport height or width at which the zoom out will be constrained. + * Setting it to 0, for example will allow you to zoom out infinity. + * + * @property {Number} [maxZoomPixelRatio=1.1] + * The maximum ratio to allow a zoom-in to affect the highest level pixel + * ratio. This can be set to Infinity to allow 'infinite' zooming into the + * image though it is less effective visually if the HTML5 Canvas is not + * available on the viewing device. + * + * @property {Number} [smoothTileEdgesMinZoom=1.1] + * A zoom percentage ( where 1 is 100% ) of the highest resolution level. + * When zoomed in beyond this value alternative compositing will be used to + * smooth out the edges between tiles. This will have a performance impact. + * Can be set to Infinity to turn it off. + * Note: This setting is ignored on iOS devices due to a known bug (See {@link https://github.com/openseadragon/openseadragon/issues/952}) + * + * @property {Boolean} [iOSDevice=?] + * True if running on an iOS device, false otherwise. + * Used to disable certain features that behave differently on iOS devices. + * + * @property {Boolean} [autoResize=true] + * Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior. + * + * @property {Boolean} [preserveImageSizeOnResize=false] + * Set to true to have the image size preserved when the viewer is resized. This requires autoResize=true (default). + * + * @property {Number} [minScrollDeltaTime=50] + * Number of milliseconds between canvas-scroll events. This value helps normalize the rate of canvas-scroll + * events between different devices, causing the faster devices to slow down enough to make the zoom control + * more manageable. + * + * @property {Number} [rotationIncrement=90] + * The number of degrees to rotate right or left when the rotate buttons or keyboard shortcuts are activated. + * + * @property {Number} [pixelsPerWheelLine=40] + * For pixel-resolution scrolling devices, the number of pixels equal to one scroll line. + * + * @property {Number} [pixelsPerArrowPress=40] + * The number of pixels viewport moves when an arrow key is pressed. + * + * @property {Number} [visibilityRatio=0.5] + * The percentage ( as a number from 0 to 1 ) of the source image which + * must be kept within the viewport. If the image is dragged beyond that + * limit, it will 'bounce' back until the minimum visibility ratio is + * achieved. Setting this to 0 and wrapHorizontal ( or wrapVertical ) to + * true will provide the effect of an infinitely scrolling viewport. + * + * @property {Object} [viewportMargins={}] + * Pushes the "home" region in from the sides by the specified amounts. + * Possible subproperties (Numbers, in screen coordinates): left, top, right, bottom. + * + * @property {Number} [imageLoaderLimit=0] + * The maximum number of image requests to make concurrently. By default + * it is set to 0 allowing the browser to make the maximum number of + * image requests in parallel as allowed by the browsers policy. + * + * @property {Number} [clickTimeThreshold=300] + * The number of milliseconds within which a pointer down-up event combination + * will be treated as a click gesture. + * + * @property {Number} [clickDistThreshold=5] + * The maximum distance allowed between a pointer down event and a pointer up event + * to be treated as a click gesture. + * + * @property {Number} [dblClickTimeThreshold=300] + * The number of milliseconds within which two pointer down-up event combinations + * will be treated as a double-click gesture. + * + * @property {Number} [dblClickDistThreshold=20] + * The maximum distance allowed between two pointer click events + * to be treated as a double-click gesture. + * + * @property {Number} [springStiffness=6.5] + * + * @property {Number} [animationTime=1.2] + * Specifies the animation duration per each {@link OpenSeadragon.Spring} + * which occur when the image is dragged, zoomed or rotated. + * + * @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse] + * Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings}) + * @property {Boolean} [gestureSettingsMouse.dragToPan=true] - Pan on drag gesture + * @property {Boolean} [gestureSettingsMouse.scrollToZoom=true] - Zoom on scroll gesture + * @property {Boolean} [gestureSettingsMouse.clickToZoom=true] - Zoom on click gesture + * @property {Boolean} [gestureSettingsMouse.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsMouse.dblClickDragToZoom=false] - Zoom on dragging through + * double-click gesture ( single click and next click to drag). Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsMouse.pinchToZoom=false] - Zoom on pinch gesture + * @property {Boolean} [gestureSettingsMouse.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise, + * the zoom is centered at the canvas center. + * @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture + * @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second) + * @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture + * @property {Boolean} [gestureSettingsMouse.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers. + * + * @property {OpenSeadragon.GestureSettings} [gestureSettingsTouch] + * Settings for gestures generated by a touch pointer device. (See {@link OpenSeadragon.GestureSettings}) + * @property {Boolean} [gestureSettingsTouch.dragToPan=true] - Pan on drag gesture + * @property {Boolean} [gestureSettingsTouch.scrollToZoom=false] - Zoom on scroll gesture + * @property {Boolean} [gestureSettingsTouch.clickToZoom=false] - Zoom on click gesture + * @property {Boolean} [gestureSettingsTouch.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsTouch.dblClickDragToZoom=true] - Zoom on dragging through + * double-click gesture ( single click and next click to drag). Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + + * @property {Boolean} [gestureSettingsTouch.pinchToZoom=true] - Zoom on pinch gesture + * @property {Boolean} [gestureSettingsTouch.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise, + * the zoom is centered at the canvas center. + * @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture + * @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second) + * @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture + * @property {Boolean} [gestureSettingsTouch.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers. + * + * @property {OpenSeadragon.GestureSettings} [gestureSettingsPen] + * Settings for gestures generated by a pen pointer device. (See {@link OpenSeadragon.GestureSettings}) + * @property {Boolean} [gestureSettingsPen.dragToPan=true] - Pan on drag gesture + * @property {Boolean} [gestureSettingsPen.scrollToZoom=false] - Zoom on scroll gesture + * @property {Boolean} [gestureSettingsPen.clickToZoom=true] - Zoom on click gesture + * @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture + * @property {Boolean} [gestureSettingsPen.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise, + * the zoom is centered at the canvas center. + * @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture + * @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second) + * @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture + * @property {Boolean} [gestureSettingsPen.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers. + * + * @property {OpenSeadragon.GestureSettings} [gestureSettingsUnknown] + * Settings for gestures generated by unknown pointer devices. (See {@link OpenSeadragon.GestureSettings}) + * @property {Boolean} [gestureSettingsUnknown.dragToPan=true] - Pan on drag gesture + * @property {Boolean} [gestureSettingsUnknown.scrollToZoom=true] - Zoom on scroll gesture + * @property {Boolean} [gestureSettingsUnknown.clickToZoom=false] - Zoom on click gesture + * @property {Boolean} [gestureSettingsUnknown.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsUnknown.dblClickDragToZoom=false] - Zoom on dragging through + * double-click gesture ( single click and next click to drag). Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * @property {Boolean} [gestureSettingsUnknown.pinchToZoom=true] - Zoom on pinch gesture + * @property {Boolean} [gestureSettingsUnknown.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise, + * the zoom is centered at the canvas center. + * @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture + * @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second) + * @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture + * @property {Boolean} [gestureSettingsUnknown.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers. + * + * @property {Number} [zoomPerClick=2.0] + * The "zoom distance" per mouse click or touch tap. Note: Setting this to 1.0 effectively disables the click-to-zoom feature (also see gestureSettings[Mouse|Touch|Pen].clickToZoom/dblClickToZoom). + * + * @property {Number} [zoomPerScroll=1.2] + * The "zoom distance" per mouse scroll or touch pinch. Note: Setting this to 1.0 effectively disables the mouse-wheel zoom feature (also see gestureSettings[Mouse|Touch|Pen].scrollToZoom}). + * + * @property {Number} [zoomPerDblClickDrag=1.2] + * The "zoom distance" per double-click mouse drag. Note: Setting this to 1.0 effectively disables the double-click-drag-to-Zoom feature (also see gestureSettings[Mouse|Touch|Pen].dblClickDragToZoom). + * + * @property {Number} [zoomPerSecond=1.0] + * Sets the zoom amount per second when zoomIn/zoomOut buttons are pressed and held. + * The value is a factor of the current zoom, so 1.0 (the default) disables zooming when the zoomIn/zoomOut buttons + * are held. Higher values will increase the rate of zoom when the zoomIn/zoomOut buttons are held. Note that values + * < 1.0 will reverse the operation of the zoomIn/zoomOut buttons (zoomIn button will decrease the zoom, zoomOut will + * increase the zoom). + * + * @property {Boolean} [showNavigator=false] + * Set to true to make the navigator minimap appear. + * + * @property {Element} [navigatorElement=null] + * The element to hold the navigator minimap. + * If an element is specified, the Id option (see navigatorId) is ignored. + * If no element nor ID is specified, a div element will be generated accordingly. + * + * @property {String} [navigatorId=navigator-GENERATED DATE] + * The ID of a div to hold the navigator minimap. + * If an ID is specified, the navigatorPosition, navigatorSizeRatio, navigatorMaintainSizeRatio, navigator[Top|Left|Height|Width] and navigatorAutoFade options will be ignored. + * If an ID is not specified, a div element will be generated and placed on top of the main image. + * + * @property {String} [navigatorPosition='TOP_RIGHT'] + * Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', 'BOTTOM_RIGHT', or 'ABSOLUTE'.
    + * If 'ABSOLUTE' is specified, then navigator[Top|Left|Height|Width] determines the size and position of the navigator minimap in the viewer, and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.
    + * For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT', the navigatorSizeRatio or navigator[Height|Width] values determine the size of the navigator minimap. + * + * @property {Number} [navigatorSizeRatio=0.2] + * Ratio of navigator size to viewer size. Ignored if navigator[Height|Width] are specified. + * + * @property {Boolean} [navigatorMaintainSizeRatio=false] + * If true, the navigator minimap is resized (using navigatorSizeRatio) when the viewer size changes. + * + * @property {Number|String} [navigatorTop=null] + * Specifies the location of the navigator minimap (see navigatorPosition). + * + * @property {Number|String} [navigatorLeft=null] + * Specifies the location of the navigator minimap (see navigatorPosition). + * + * @property {Number|String} [navigatorHeight=null] + * Specifies the size of the navigator minimap (see navigatorPosition). + * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored. + * + * @property {Number|String} [navigatorWidth=null] + * Specifies the size of the navigator minimap (see navigatorPosition). + * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored. + * + * @property {Boolean} [navigatorAutoResize=true] + * Set to false to prevent polling for navigator size changes. Useful for providing custom resize behavior. + * Setting to false can also improve performance when the navigator is configured to a fixed size. + * + * @property {Boolean} [navigatorAutoFade=true] + * If the user stops interacting with the viewport, fade the navigator minimap. + * Setting to false will make the navigator minimap always visible. + * + * @property {Boolean} [navigatorRotate=true] + * If true, the navigator will be rotated together with the viewer. + * + * @property {String} [navigatorBackground='#000'] + * Specifies the background color of the navigator minimap + * + * @property {Number} [navigatorOpacity=0.8] + * Specifies the opacity of the navigator minimap. + * + * @property {String} [navigatorBorderColor='#555'] + * Specifies the border color of the navigator minimap + * + * @property {String} [navigatorDisplayRegionColor='#900'] + * Specifies the border color of the display region rectangle of the navigator minimap + * + * @property {Number} [controlsFadeDelay=2000] + * The number of milliseconds to wait once the user has stopped interacting + * with the interface before beginning to fade the controls. Assumes + * showNavigationControl and autoHideControls are both true. + * + * @property {Number} [controlsFadeLength=1500] + * The number of milliseconds to animate the controls fading out. + * + * @property {Number} [maxImageCacheCount=200] + * The max number of images we should keep in memory (per drawer). + * + * @property {Number} [timeout=30000] + * The max number of milliseconds that an image job may take to complete. + * + * @property {Number} [tileRetryMax=0] + * The max number of retries when a tile download fails. By default it's 0, so retries are disabled. + * + * @property {Number} [tileRetryDelay=2500] + * Milliseconds to wait after each tile retry if tileRetryMax is set. + * + * @property {Boolean} [useCanvas=true] + * Set to false to not use an HTML canvas element for image rendering even if canvas is supported. + * + * @property {Number} [minPixelRatio=0.5] + * The higher the minPixelRatio, the lower the quality of the image that + * is considered sufficient to stop rendering a given zoom level. For + * example, if you are targeting mobile devices with less bandwidth you may + * try setting this to 1.5 or higher. + * + * @property {Boolean} [mouseNavEnabled=true] + * Is the user able to interact with the image via mouse or touch. Default + * interactions include draging the image in a plane, and zooming in toward + * and away from the image. + * + * @property {Boolean} [showNavigationControl=true] + * Set to false to prevent the appearance of the default navigation controls.
    + * Note that if set to false, the customs buttons set by the options + * zoomInButton, zoomOutButton etc, are rendered inactive. + * + * @property {OpenSeadragon.ControlAnchor} [navigationControlAnchor=TOP_LEFT] + * Placement of the default navigation controls. + * To set the placement of the sequence controls, see the + * sequenceControlAnchor option. + * + * @property {Boolean} [showZoomControl=true] + * If true then + and - buttons to zoom in and out are displayed.
    + * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding + * this setting when set to false. + * + * @property {Boolean} [showHomeControl=true] + * If true then the 'Go home' button is displayed to go back to the original + * zoom and pan.
    + * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding + * this setting when set to false. + * + * @property {Boolean} [showFullPageControl=true] + * If true then the 'Toggle full page' button is displayed to switch + * between full page and normal mode.
    + * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding + * this setting when set to false. + * + * @property {Boolean} [showRotationControl=false] + * If true then the rotate left/right controls will be displayed as part of the + * standard controls. This is also subject to the browser support for rotate + * (e.g. viewer.drawer.canRotate()).
    + * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding + * this setting when set to false. + * + * @property {Boolean} [showFlipControl=false] + * If true then the flip controls will be displayed as part of the + * standard controls. + * + * @property {Boolean} [showSequenceControl=true] + * If sequenceMode is true, then provide buttons for navigating forward and + * backward through the images. + * + * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT] + * Placement of the default sequence controls. + * + * @property {Boolean} [navPrevNextWrap=false] + * If true then the 'previous' button will wrap to the last image when + * viewing the first image and the 'next' button will wrap to the first + * image when viewing the last image. + * + *@property {String|Element} zoomInButton + * Set the id or element of the custom 'Zoom in' button to use. + * This is useful to have a custom button anywhere in the web page.
    + * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String|Element} zoomOutButton + * Set the id or element of the custom 'Zoom out' button to use. + * This is useful to have a custom button anywhere in the web page.
    + * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String|Element} homeButton + * Set the id or element of the custom 'Go home' button to use. + * This is useful to have a custom button anywhere in the web page.
    + * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String|Element} fullPageButton + * Set the id or element of the custom 'Toggle full page' button to use. + * This is useful to have a custom button anywhere in the web page.
    + * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String|Element} rotateLeftButton + * Set the id or element of the custom 'Rotate left' button to use. + * This is useful to have a custom button anywhere in the web page.
    + * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String|Element} rotateRightButton + * Set the id or element of the custom 'Rotate right' button to use. + * This is useful to have a custom button anywhere in the web page.
    + * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String|Element} previousButton + * Set the id or element of the custom 'Previous page' button to use. + * This is useful to have a custom button anywhere in the web page.
    + * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {String|Element} nextButton + * Set the id or element of the custom 'Next page' button to use. + * This is useful to have a custom button anywhere in the web page.
    + * To only change the button images, consider using + * {@link OpenSeadragon.Options.navImages} + * + * @property {Boolean} [sequenceMode=false] + * Set to true to have the viewer treat your tilesources as a sequence of images to + * be opened one at a time rather than all at once. + * + * @property {Number} [initialPage=0] + * If sequenceMode is true, display this page initially. + * + * @property {Boolean} [preserveViewport=false] + * If sequenceMode is true, then normally navigating through each image resets the + * viewport to 'home' position. If preserveViewport is set to true, then the viewport + * position is preserved when navigating between images in the sequence. + * + * @property {Boolean} [preserveOverlays=false] + * If sequenceMode is true, then normally navigating through each image + * resets the overlays. + * If preserveOverlays is set to true, then the overlays added with {@link OpenSeadragon.Viewer#addOverlay} + * are preserved when navigating between images in the sequence. + * Note: setting preserveOverlays overrides any overlays specified in the global + * "overlays" option for the Viewer. It's also not compatible with specifying + * per-tileSource overlays via the options, as those overlays will persist + * even after the tileSource is closed. + * + * @property {Boolean} [showReferenceStrip=false] + * If sequenceMode is true, then display a scrolling strip of image thumbnails for + * navigating through the images. + * + * @property {String} [referenceStripScroll='horizontal'] + * + * @property {Element} [referenceStripElement=null] + * + * @property {Number} [referenceStripHeight=null] + * + * @property {Number} [referenceStripWidth=null] + * + * @property {String} [referenceStripPosition='BOTTOM_LEFT'] + * + * @property {Number} [referenceStripSizeRatio=0.2] + * + * @property {Boolean} [collectionMode=false] + * Set to true to have the viewer arrange your TiledImages in a grid or line. + * + * @property {Number} [collectionRows=3] + * If collectionMode is true, specifies how many rows the grid should have. Use 1 to make a line. + * If collectionLayout is 'vertical', specifies how many columns instead. + * + * @property {Number} [collectionColumns=0] + * If collectionMode is true, specifies how many columns the grid should have. Use 1 to make a line. + * If collectionLayout is 'vertical', specifies how many rows instead. Ignored if collectionRows is not set to a falsy value. + * + * @property {String} [collectionLayout='horizontal'] + * If collectionMode is true, specifies whether to arrange vertically or horizontally. + * + * @property {Number} [collectionTileSize=800] + * If collectionMode is true, specifies the size, in viewport coordinates, for each TiledImage to fit into. + * The TiledImage will be centered within a square of the specified size. + * + * @property {Number} [collectionTileMargin=80] + * If collectionMode is true, specifies the margin, in viewport coordinates, between each TiledImage. + * + * @property {String|Boolean} [crossOriginPolicy=false] + * Valid values are 'Anonymous', 'use-credentials', and false. If false, canvas requests will + * not use CORS, and the canvas will be tainted. + * + * @property {Boolean} [ajaxWithCredentials=false] + * Whether to set the withCredentials XHR flag for AJAX requests. + * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level. + * + * @property {Boolean} [loadTilesWithAjax=false] + * Whether to load tile data using AJAX requests. + * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level. + * + * @property {Object} [ajaxHeaders={}] + * A set of headers to include when making AJAX requests for tile sources or tiles. + * + * @property {Boolean} [splitHashDataForPost=false] + * Allows to treat _first_ hash ('#') symbol as a separator for POST data: + * URL to be opened by a {@link OpenSeadragon.TileSource} can thus look like: http://some.url#postdata=here. + * The whole URL is used to fetch image info metadata and it is then split to 'http://some.url' and + * 'postdata=here'; post data is given to the {@link OpenSeadragon.TileSource} of the choice and can be further + * used within tile requests (see TileSource methods). + * NOTE: {@link OpenSeadragon.TileSource.prototype.configure} return value should contain the post data + * if you want to use it later - so that it is given to your constructor later. + * NOTE: usually, post data is expected to be ampersand-separated (just like GET parameters), and is NOT USED + * to fetch tile image data unless explicitly programmed, or if loadTilesWithAjax=false 4 + * (but it is still used for the initial image info request). + * NOTE: passing POST data from URL by this feature only supports string values, however, + * TileSource can send any data using POST as long as the header is correct + * (@see OpenSeadragon.TileSource.prototype.getTilePostData) + */ + + /** + * Settings for gestures generated by a pointer device. + * + * @typedef {Object} GestureSettings + * @memberof OpenSeadragon + * + * @property {Boolean} dragToPan + * Set to false to disable panning on drag gestures. + * + * @property {Boolean} scrollToZoom + * Set to false to disable zooming on scroll gestures. + * + * @property {Boolean} clickToZoom + * Set to false to disable zooming on click gestures. + * + * @property {Boolean} dblClickToZoom + * Set to false to disable zooming on double-click gestures. Note: If set to true + * then clickToZoom should be set to false to prevent multiple zooms. + * + * @property {Boolean} pinchToZoom + * Set to false to disable zooming on pinch gestures. + * + * @property {Boolean} flickEnabled + * Set to false to disable the kinetic panning effect (flick) at the end of a drag gesture. + * + * @property {Number} flickMinSpeed + * If flickEnabled is true, the minimum speed (in pixels-per-second) required to cause the kinetic panning effect (flick) at the end of a drag gesture. + * + * @property {Number} flickMomentum + * If flickEnabled is true, a constant multiplied by the velocity to determine the distance of the kinetic panning effect (flick) at the end of a drag gesture. + * A larger value will make the flick feel "lighter", while a smaller value will make the flick feel "heavier". + * Note: springStiffness and animationTime also affect the "spring" used to stop the flick animation. + * + */ + +/** + * The names for the image resources used for the image navigation buttons. + * + * @typedef {Object} NavImages + * @memberof OpenSeadragon + * + * @property {Object} zoomIn - Images for the zoom-in button. + * @property {String} zoomIn.REST + * @property {String} zoomIn.GROUP + * @property {String} zoomIn.HOVER + * @property {String} zoomIn.DOWN + * + * @property {Object} zoomOut - Images for the zoom-out button. + * @property {String} zoomOut.REST + * @property {String} zoomOut.GROUP + * @property {String} zoomOut.HOVER + * @property {String} zoomOut.DOWN + * + * @property {Object} home - Images for the home button. + * @property {String} home.REST + * @property {String} home.GROUP + * @property {String} home.HOVER + * @property {String} home.DOWN + * + * @property {Object} fullpage - Images for the full-page button. + * @property {String} fullpage.REST + * @property {String} fullpage.GROUP + * @property {String} fullpage.HOVER + * @property {String} fullpage.DOWN + * + * @property {Object} rotateleft - Images for the rotate left button. + * @property {String} rotateleft.REST + * @property {String} rotateleft.GROUP + * @property {String} rotateleft.HOVER + * @property {String} rotateleft.DOWN + * + * @property {Object} rotateright - Images for the rotate right button. + * @property {String} rotateright.REST + * @property {String} rotateright.GROUP + * @property {String} rotateright.HOVER + * @property {String} rotateright.DOWN + * + * @property {Object} flip - Images for the flip button. + * @property {String} flip.REST + * @property {String} flip.GROUP + * @property {String} flip.HOVER + * @property {String} flip.DOWN + * + * @property {Object} previous - Images for the previous button. + * @property {String} previous.REST + * @property {String} previous.GROUP + * @property {String} previous.HOVER + * @property {String} previous.DOWN + * + * @property {Object} next - Images for the next button. + * @property {String} next.REST + * @property {String} next.GROUP + * @property {String} next.HOVER + * @property {String} next.DOWN + * + */ + +/* eslint-disable no-redeclare */ +function OpenSeadragon( options ){ + return new OpenSeadragon.Viewer( options ); +} + +(function( $ ){ + + + /** + * The OpenSeadragon version. + * + * @member {Object} OpenSeadragon.version + * @property {String} versionStr - The version number as a string ('major.minor.revision'). + * @property {Number} major - The major version number. + * @property {Number} minor - The minor version number. + * @property {Number} revision - The revision number. + * @since 1.0.0 + */ + $.version = { + versionStr: '4.1.0', + major: parseInt('4', 10), + minor: parseInt('1', 10), + revision: parseInt('0', 10) + }; + + + /** + * Taken from jquery 1.6.1 + * [[Class]] -> type pairs + * @private + */ + var class2type = { + '[object Boolean]': 'boolean', + '[object Number]': 'number', + '[object String]': 'string', + '[object Function]': 'function', + '[object AsyncFunction]': 'function', + '[object Promise]': 'promise', + '[object Array]': 'array', + '[object Date]': 'date', + '[object RegExp]': 'regexp', + '[object Object]': 'object' + }, + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty; + + /** + * Taken from jQuery 1.6.1 + * @function isFunction + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isFunction = function( obj ) { + return $.type(obj) === "function"; + }; + + /** + * Taken from jQuery 1.6.1 + * @function isArray + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isArray = Array.isArray || function( obj ) { + return $.type(obj) === "array"; + }; + + + /** + * A crude way of determining if an object is a window. + * Taken from jQuery 1.6.1 + * @function isWindow + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isWindow = function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }; + + + /** + * Taken from jQuery 1.6.1 + * @function type + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.type = function( obj ) { + return ( obj === null ) || ( obj === undefined ) ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }; + + + /** + * Taken from jQuery 1.6.1 + * @function isPlainObject + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isPlainObject = function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || OpenSeadragon.type(obj) !== "object" || obj.nodeType || $.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var lastKey; + for (var key in obj ) { + lastKey = key; + } + + return lastKey === undefined || hasOwn.call( obj, lastKey ); + }; + + + /** + * Taken from jQuery 1.6.1 + * @function isEmptyObject + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.isEmptyObject = function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }; + + /** + * Shim around Object.freeze. Does nothing if Object.freeze is not supported. + * @param {Object} obj The object to freeze. + * @returns {Object} obj The frozen object. + */ + $.freezeObject = function(obj) { + if (Object.freeze) { + $.freezeObject = Object.freeze; + } else { + $.freezeObject = function(obj) { + return obj; + }; + } + return $.freezeObject(obj); + }; + + /** + * True if the browser supports the HTML5 canvas element + * @member {Boolean} supportsCanvas + * @memberof OpenSeadragon + */ + $.supportsCanvas = (function () { + var canvasElement = document.createElement( 'canvas' ); + return !!( $.isFunction( canvasElement.getContext ) && + canvasElement.getContext( '2d' ) ); + }()); + + /** + * Test whether the submitted canvas is tainted or not. + * @argument {Canvas} canvas The canvas to test. + * @returns {Boolean} True if the canvas is tainted. + */ + $.isCanvasTainted = function(canvas) { + var isTainted = false; + try { + // We test if the canvas is tainted by retrieving data from it. + // An exception will be raised if the canvas is tainted. + canvas.getContext('2d').getImageData(0, 0, 1, 1); + } catch (e) { + isTainted = true; + } + return isTainted; + }; + + /** + * True if the browser supports the EventTarget.addEventListener() method + * @member {Boolean} supportsAddEventListener + * @memberof OpenSeadragon + */ + $.supportsAddEventListener = (function () { + return !!(document.documentElement.addEventListener && document.addEventListener); + }()); + + /** + * True if the browser supports the EventTarget.removeEventListener() method + * @member {Boolean} supportsRemoveEventListener + * @memberof OpenSeadragon + */ + $.supportsRemoveEventListener = (function () { + return !!(document.documentElement.removeEventListener && document.removeEventListener); + }()); + + /** + * True if the browser supports the newer EventTarget.addEventListener options argument + * @member {Boolean} supportsEventListenerOptions + * @memberof OpenSeadragon + */ + $.supportsEventListenerOptions = (function () { + var supported = 0; + + if ( $.supportsAddEventListener ) { + try { + var options = { + get capture() { + supported++; + return false; + }, + get once() { + supported++; + return false; + }, + get passive() { + supported++; + return false; + } + }; + window.addEventListener("test", null, options); + window.removeEventListener("test", null, options); + } catch ( e ) { + supported = 0; + } + } + + return supported >= 3; + }()); + + /** + * A ratio comparing the device screen's pixel density to the canvas's backing store pixel density, + * clamped to a minimum of 1. Defaults to 1 if canvas isn't supported by the browser. + * @member {Number} pixelDensityRatio + * @memberof OpenSeadragon + */ + $.getCurrentPixelDensityRatio = function() { + if ( $.supportsCanvas ) { + var context = document.createElement('canvas').getContext('2d'); + var devicePixelRatio = window.devicePixelRatio || 1; + var backingStoreRatio = context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; + return Math.max(devicePixelRatio, 1) / backingStoreRatio; + } else { + return 1; + } + }; + + /** + * @member {Number} pixelDensityRatio + * @memberof OpenSeadragon + */ + $.pixelDensityRatio = $.getCurrentPixelDensityRatio(); + +}( OpenSeadragon )); + +/** + * This closure defines all static methods available to the OpenSeadragon + * namespace. Many, if not most, are taken directly from jQuery for use + * to simplify and reduce common programming patterns. More static methods + * from jQuery may eventually make their way into this though we are + * attempting to avoid an explicit dependency on jQuery only because + * OpenSeadragon is a broadly useful code base and would be made less broad + * by requiring jQuery fully. + * + * Some static methods have also been refactored from the original OpenSeadragon + * project. + */ +(function( $ ){ + + /** + * Taken from jQuery 1.6.1 + * @function extend + * @memberof OpenSeadragon + * @see {@link http://www.jquery.com/ jQuery} + */ + $.extend = function() { + var options, + name, + src, + copy, + copyIsArray, + clone, + target = arguments[ 0 ] || {}, + length = arguments.length, + deep = false, + i = 1; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[ 1 ] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !OpenSeadragon.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + options = arguments[ i ]; + if ( options !== null || options !== undefined ) { + // Extend the base object + for ( name in options ) { + var descriptor = Object.getOwnPropertyDescriptor(options, name); + + if (descriptor !== undefined) { + if (descriptor.get || descriptor.set) { + Object.defineProperty(target, name, descriptor); + continue; + } + + copy = descriptor.value; + } else { + $.console.warn('Could not copy inherited property "' + name + '".'); + continue; + } + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( OpenSeadragon.isPlainObject( copy ) || ( copyIsArray = OpenSeadragon.isArray( copy ) ) ) ) { + src = target[ name ]; + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && OpenSeadragon.isArray( src ) ? src : []; + + } else { + clone = src && OpenSeadragon.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = OpenSeadragon.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; + }; + + var isIOSDevice = function () { + if (typeof navigator !== 'object') { + return false; + } + var userAgent = navigator.userAgent; + if (typeof userAgent !== 'string') { + return false; + } + return userAgent.indexOf('iPhone') !== -1 || + userAgent.indexOf('iPad') !== -1 || + userAgent.indexOf('iPod') !== -1; + }; + + $.extend( $, /** @lends OpenSeadragon */{ + /** + * The default values for the optional settings documented at {@link OpenSeadragon.Options}. + * @static + * @type {Object} + */ + DEFAULT_SETTINGS: { + //DATA SOURCE DETAILS + xmlPath: null, + tileSources: null, + tileHost: null, + initialPage: 0, + crossOriginPolicy: false, + ajaxWithCredentials: false, + loadTilesWithAjax: false, + ajaxHeaders: {}, + splitHashDataForPost: false, + + //PAN AND ZOOM SETTINGS AND CONSTRAINTS + panHorizontal: true, + panVertical: true, + constrainDuringPan: false, + wrapHorizontal: false, + wrapVertical: false, + visibilityRatio: 0.5, //-> how much of the viewer can be negative space + minPixelRatio: 0.5, //->closer to 0 draws tiles meant for a higher zoom at this zoom + defaultZoomLevel: 0, + minZoomLevel: null, + maxZoomLevel: null, + homeFillsViewer: false, + + //UI RESPONSIVENESS AND FEEL + clickTimeThreshold: 300, + clickDistThreshold: 5, + dblClickTimeThreshold: 300, + dblClickDistThreshold: 20, + springStiffness: 6.5, + animationTime: 1.2, + gestureSettingsMouse: { + dragToPan: true, + scrollToZoom: true, + clickToZoom: true, + dblClickToZoom: false, + dblClickDragToZoom: false, + pinchToZoom: false, + zoomToRefPoint: true, + flickEnabled: false, + flickMinSpeed: 120, + flickMomentum: 0.25, + pinchRotate: false + }, + gestureSettingsTouch: { + dragToPan: true, + scrollToZoom: false, + clickToZoom: false, + dblClickToZoom: true, + dblClickDragToZoom: true, + pinchToZoom: true, + zoomToRefPoint: true, + flickEnabled: true, + flickMinSpeed: 120, + flickMomentum: 0.25, + pinchRotate: false + }, + gestureSettingsPen: { + dragToPan: true, + scrollToZoom: false, + clickToZoom: true, + dblClickToZoom: false, + dblClickDragToZoom: false, + pinchToZoom: false, + zoomToRefPoint: true, + flickEnabled: false, + flickMinSpeed: 120, + flickMomentum: 0.25, + pinchRotate: false + }, + gestureSettingsUnknown: { + dragToPan: true, + scrollToZoom: false, + clickToZoom: false, + dblClickToZoom: true, + dblClickDragToZoom: false, + pinchToZoom: true, + zoomToRefPoint: true, + flickEnabled: true, + flickMinSpeed: 120, + flickMomentum: 0.25, + pinchRotate: false + }, + zoomPerClick: 2, + zoomPerScroll: 1.2, + zoomPerDblClickDrag: 1.2, + zoomPerSecond: 1.0, + blendTime: 0, + alwaysBlend: false, + autoHideControls: true, + immediateRender: false, + minZoomImageRatio: 0.9, //-> closer to 0 allows zoom out to infinity + maxZoomPixelRatio: 1.1, //-> higher allows 'over zoom' into pixels + smoothTileEdgesMinZoom: 1.1, //-> higher than maxZoomPixelRatio disables it + iOSDevice: isIOSDevice(), + pixelsPerWheelLine: 40, + pixelsPerArrowPress: 40, + autoResize: true, + preserveImageSizeOnResize: false, // requires autoResize=true + minScrollDeltaTime: 50, + rotationIncrement: 90, + + //DEFAULT CONTROL SETTINGS + showSequenceControl: true, //SEQUENCE + sequenceControlAnchor: null, //SEQUENCE + preserveViewport: false, //SEQUENCE + preserveOverlays: false, //SEQUENCE + navPrevNextWrap: false, //SEQUENCE + showNavigationControl: true, //ZOOM/HOME/FULL/ROTATION + navigationControlAnchor: null, //ZOOM/HOME/FULL/ROTATION + showZoomControl: true, //ZOOM + showHomeControl: true, //HOME + showFullPageControl: true, //FULL + showRotationControl: false, //ROTATION + showFlipControl: false, //FLIP + controlsFadeDelay: 2000, //ZOOM/HOME/FULL/SEQUENCE + controlsFadeLength: 1500, //ZOOM/HOME/FULL/SEQUENCE + mouseNavEnabled: true, //GENERAL MOUSE INTERACTIVITY + + //VIEWPORT NAVIGATOR SETTINGS + showNavigator: false, + navigatorElement: null, + navigatorId: null, + navigatorPosition: null, + navigatorSizeRatio: 0.2, + navigatorMaintainSizeRatio: false, + navigatorTop: null, + navigatorLeft: null, + navigatorHeight: null, + navigatorWidth: null, + navigatorAutoResize: true, + navigatorAutoFade: true, + navigatorRotate: true, + navigatorBackground: '#000', + navigatorOpacity: 0.8, + navigatorBorderColor: '#555', + navigatorDisplayRegionColor: '#900', + + // INITIAL ROTATION + degrees: 0, + + // INITIAL FLIP STATE + flipped: false, + + // APPEARANCE + opacity: 1, + preload: false, + compositeOperation: null, + imageSmoothingEnabled: true, + placeholderFillStyle: null, + subPixelRoundingForTransparency: null, + + //REFERENCE STRIP SETTINGS + showReferenceStrip: false, + referenceStripScroll: 'horizontal', + referenceStripElement: null, + referenceStripHeight: null, + referenceStripWidth: null, + referenceStripPosition: 'BOTTOM_LEFT', + referenceStripSizeRatio: 0.2, + + //COLLECTION VISUALIZATION SETTINGS + collectionRows: 3, //or columns depending on layout + collectionColumns: 0, //columns in horizontal layout, rows in vertical layout + collectionLayout: 'horizontal', //vertical + collectionMode: false, + collectionTileSize: 800, + collectionTileMargin: 80, + + //PERFORMANCE SETTINGS + imageLoaderLimit: 0, + maxImageCacheCount: 200, + timeout: 30000, + useCanvas: true, // Use canvas element for drawing if available + tileRetryMax: 0, + tileRetryDelay: 2500, + + //INTERFACE RESOURCE SETTINGS + prefixUrl: "/images/", + navImages: { + zoomIn: { + REST: 'zoomin_rest.png', + GROUP: 'zoomin_grouphover.png', + HOVER: 'zoomin_hover.png', + DOWN: 'zoomin_pressed.png' + }, + zoomOut: { + REST: 'zoomout_rest.png', + GROUP: 'zoomout_grouphover.png', + HOVER: 'zoomout_hover.png', + DOWN: 'zoomout_pressed.png' + }, + home: { + REST: 'home_rest.png', + GROUP: 'home_grouphover.png', + HOVER: 'home_hover.png', + DOWN: 'home_pressed.png' + }, + fullpage: { + REST: 'fullpage_rest.png', + GROUP: 'fullpage_grouphover.png', + HOVER: 'fullpage_hover.png', + DOWN: 'fullpage_pressed.png' + }, + rotateleft: { + REST: 'rotateleft_rest.png', + GROUP: 'rotateleft_grouphover.png', + HOVER: 'rotateleft_hover.png', + DOWN: 'rotateleft_pressed.png' + }, + rotateright: { + REST: 'rotateright_rest.png', + GROUP: 'rotateright_grouphover.png', + HOVER: 'rotateright_hover.png', + DOWN: 'rotateright_pressed.png' + }, + flip: { // Flip icon designed by Yaroslav Samoylov from the Noun Project and modified by Nelson Campos ncampos@criteriamarathon.com, https://thenounproject.com/term/flip/136289/ + REST: 'flip_rest.png', + GROUP: 'flip_grouphover.png', + HOVER: 'flip_hover.png', + DOWN: 'flip_pressed.png' + }, + previous: { + REST: 'previous_rest.png', + GROUP: 'previous_grouphover.png', + HOVER: 'previous_hover.png', + DOWN: 'previous_pressed.png' + }, + next: { + REST: 'next_rest.png', + GROUP: 'next_grouphover.png', + HOVER: 'next_hover.png', + DOWN: 'next_pressed.png' + } + }, + + //DEVELOPER SETTINGS + debugMode: false, + debugGridColor: ['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666'], + silenceMultiImageWarnings: false + + }, + + + /** + * TODO: get rid of this. I can't see how it's required at all. Looks + * like an early legacy code artifact. + * @static + * @ignore + */ + SIGNAL: "----seadragon----", + + + /** + * Returns a function which invokes the method as if it were a method belonging to the object. + * @function + * @param {Object} object + * @param {Function} method + * @returns {Function} + */ + delegate: function( object, method ) { + return function(){ + var args = arguments; + if ( args === undefined ){ + args = []; + } + return method.apply( object, args ); + }; + }, + + + /** + * An enumeration of Browser vendors. + * @static + * @type {Object} + * @property {Number} UNKNOWN + * @property {Number} IE + * @property {Number} FIREFOX + * @property {Number} SAFARI + * @property {Number} CHROME + * @property {Number} OPERA + * @property {Number} EDGE + * @property {Number} CHROMEEDGE + */ + BROWSERS: { + UNKNOWN: 0, + IE: 1, + FIREFOX: 2, + SAFARI: 3, + CHROME: 4, + OPERA: 5, + EDGE: 6, + CHROMEEDGE: 7 + }, + + /** + * An enumeration of when subpixel rounding should occur. + * @static + * @type {Object} + * @property {Number} NEVER Never apply subpixel rounding for transparency. + * @property {Number} ONLY_AT_REST Do not apply subpixel rounding for transparency during animation (panning, zoom, rotation) and apply it once animation is over. + * @property {Number} ALWAYS Apply subpixel rounding for transparency during animation and when animation is over. + */ + SUBPIXEL_ROUNDING_OCCURRENCES: { + NEVER: 0, + ONLY_AT_REST: 1, + ALWAYS: 2 + }, + + /** + * Keep track of which {@link Viewer}s have been created. + * - Key: {@link Element} to which a Viewer is attached. + * - Value: {@link Viewer} of the element defined by the key. + * @private + * @static + * @type {Object} + */ + _viewers: new Map(), + + /** + * Returns the {@link Viewer} attached to a given DOM element. If there is + * no viewer attached to the provided element, undefined is returned. + * @function + * @param {String|Element} element Accepts an id or element. + * @returns {Viewer} The viewer attached to the given element, or undefined. + */ + getViewer: function(element) { + return $._viewers.get(this.getElement(element)); + }, + + /** + * Returns a DOM Element for the given id or element. + * @function + * @param {String|Element} element Accepts an id or element. + * @returns {Element} The element with the given id, null, or the element itself. + */ + getElement: function( element ) { + if ( typeof ( element ) === "string" ) { + element = document.getElementById( element ); + } + return element; + }, + + + /** + * Determines the position of the upper-left corner of the element. + * @function + * @param {Element|String} element - the element we want the position for. + * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element. + */ + getElementPosition: function( element ) { + var result = new $.Point(), + isFixed, + offsetParent; + + element = $.getElement( element ); + isFixed = $.getElementStyle( element ).position === "fixed"; + offsetParent = getOffsetParent( element, isFixed ); + + while ( offsetParent ) { + + result.x += element.offsetLeft; + result.y += element.offsetTop; + + if ( isFixed ) { + result = result.plus( $.getPageScroll() ); + } + + element = offsetParent; + isFixed = $.getElementStyle( element ).position === "fixed"; + offsetParent = getOffsetParent( element, isFixed ); + } + + return result; + }, + + + /** + * Determines the position of the upper-left corner of the element adjusted for current page and/or element scroll. + * @function + * @param {Element|String} element - the element we want the position for. + * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element adjusted for current page and/or element scroll. + */ + getElementOffset: function( element ) { + element = $.getElement( element ); + + var doc = element && element.ownerDocument, + docElement, + win, + boundingRect = { top: 0, left: 0 }; + + if ( !doc ) { + return new $.Point(); + } + + docElement = doc.documentElement; + + if ( typeof element.getBoundingClientRect !== typeof undefined ) { + boundingRect = element.getBoundingClientRect(); + } + + win = ( doc === doc.window ) ? + doc : + ( doc.nodeType === 9 ) ? + doc.defaultView || doc.parentWindow : + false; + + return new $.Point( + boundingRect.left + ( win.pageXOffset || docElement.scrollLeft ) - ( docElement.clientLeft || 0 ), + boundingRect.top + ( win.pageYOffset || docElement.scrollTop ) - ( docElement.clientTop || 0 ) + ); + }, + + + /** + * Determines the height and width of the given element. + * @function + * @param {Element|String} element + * @returns {OpenSeadragon.Point} + */ + getElementSize: function( element ) { + element = $.getElement( element ); + + return new $.Point( + element.clientWidth, + element.clientHeight + ); + }, + + + /** + * Returns the CSSStyle object for the given element. + * @function + * @param {Element|String} element + * @returns {CSSStyle} + */ + getElementStyle: + document.documentElement.currentStyle ? + function( element ) { + element = $.getElement( element ); + return element.currentStyle; + } : + function( element ) { + element = $.getElement( element ); + return window.getComputedStyle( element, "" ); + }, + + /** + * Returns the property with the correct vendor prefix appended. + * @param {String} property the property name + * @returns {String} the property with the correct prefix or null if not + * supported. + */ + getCssPropertyWithVendorPrefix: function(property) { + var memo = {}; + + $.getCssPropertyWithVendorPrefix = function(property) { + if (memo[property] !== undefined) { + return memo[property]; + } + var style = document.createElement('div').style; + var result = null; + if (style[property] !== undefined) { + result = property; + } else { + var prefixes = ['Webkit', 'Moz', 'MS', 'O', + 'webkit', 'moz', 'ms', 'o']; + var suffix = $.capitalizeFirstLetter(property); + for (var i = 0; i < prefixes.length; i++) { + var prop = prefixes[i] + suffix; + if (style[prop] !== undefined) { + result = prop; + break; + } + } + } + memo[property] = result; + return result; + }; + return $.getCssPropertyWithVendorPrefix(property); + }, + + /** + * Capitalizes the first letter of a string + * @param {String} string + * @returns {String} The string with the first letter capitalized + */ + capitalizeFirstLetter: function(string) { + return string.charAt(0).toUpperCase() + string.slice(1); + }, + + /** + * Compute the modulo of a number but makes sure to always return + * a positive value (also known as Euclidean modulo). + * @param {Number} number the number to compute the modulo of + * @param {Number} modulo the modulo + * @returns {Number} the result of the modulo of number + */ + positiveModulo: function(number, modulo) { + var result = number % modulo; + if (result < 0) { + result += modulo; + } + return result; + }, + + + /** + * Determines if a point is within the bounding rectangle of the given element (hit-test). + * @function + * @param {Element|String} element + * @param {OpenSeadragon.Point} point + * @returns {Boolean} + */ + pointInElement: function( element, point ) { + element = $.getElement( element ); + var offset = $.getElementOffset( element ), + size = $.getElementSize( element ); + return point.x >= offset.x && point.x < offset.x + size.x && point.y < offset.y + size.y && point.y >= offset.y; + }, + + + /** + * Gets the position of the mouse on the screen for a given event. + * @function + * @param {Event} [event] + * @returns {OpenSeadragon.Point} + */ + getMousePosition: function( event ) { + + if ( typeof ( event.pageX ) === "number" ) { + $.getMousePosition = function( event ){ + var result = new $.Point(); + + result.x = event.pageX; + result.y = event.pageY; + + return result; + }; + } else if ( typeof ( event.clientX ) === "number" ) { + $.getMousePosition = function( event ){ + var result = new $.Point(); + + result.x = + event.clientX + + document.body.scrollLeft + + document.documentElement.scrollLeft; + result.y = + event.clientY + + document.body.scrollTop + + document.documentElement.scrollTop; + + return result; + }; + } else { + throw new Error( + "Unknown event mouse position, no known technique." + ); + } + + return $.getMousePosition( event ); + }, + + + /** + * Determines the page's current scroll position. + * @function + * @returns {OpenSeadragon.Point} + */ + getPageScroll: function() { + var docElement = document.documentElement || {}, + body = document.body || {}; + + if ( typeof ( window.pageXOffset ) === "number" ) { + $.getPageScroll = function(){ + return new $.Point( + window.pageXOffset, + window.pageYOffset + ); + }; + } else if ( body.scrollLeft || body.scrollTop ) { + $.getPageScroll = function(){ + return new $.Point( + document.body.scrollLeft, + document.body.scrollTop + ); + }; + } else if ( docElement.scrollLeft || docElement.scrollTop ) { + $.getPageScroll = function(){ + return new $.Point( + document.documentElement.scrollLeft, + document.documentElement.scrollTop + ); + }; + } else { + // We can't reassign the function yet, as there was no scroll. + return new $.Point(0, 0); + } + + return $.getPageScroll(); + }, + + /** + * Set the page scroll position. + * @function + * @returns {OpenSeadragon.Point} + */ + setPageScroll: function( scroll ) { + if ( typeof ( window.scrollTo ) !== "undefined" ) { + $.setPageScroll = function( scroll ) { + window.scrollTo( scroll.x, scroll.y ); + }; + } else { + var originalScroll = $.getPageScroll(); + if ( originalScroll.x === scroll.x && + originalScroll.y === scroll.y ) { + // We are already correctly positioned and there + // is no way to detect the correct method. + return; + } + + document.body.scrollLeft = scroll.x; + document.body.scrollTop = scroll.y; + var currentScroll = $.getPageScroll(); + if ( currentScroll.x !== originalScroll.x && + currentScroll.y !== originalScroll.y ) { + $.setPageScroll = function( scroll ) { + document.body.scrollLeft = scroll.x; + document.body.scrollTop = scroll.y; + }; + return; + } + + document.documentElement.scrollLeft = scroll.x; + document.documentElement.scrollTop = scroll.y; + currentScroll = $.getPageScroll(); + if ( currentScroll.x !== originalScroll.x && + currentScroll.y !== originalScroll.y ) { + $.setPageScroll = function( scroll ) { + document.documentElement.scrollLeft = scroll.x; + document.documentElement.scrollTop = scroll.y; + }; + return; + } + + // We can't find anything working, so we do nothing. + $.setPageScroll = function( scroll ) { + }; + } + + $.setPageScroll( scroll ); + }, + + /** + * Determines the size of the browsers window. + * @function + * @returns {OpenSeadragon.Point} + */ + getWindowSize: function() { + var docElement = document.documentElement || {}, + body = document.body || {}; + + if ( typeof ( window.innerWidth ) === 'number' ) { + $.getWindowSize = function(){ + return new $.Point( + window.innerWidth, + window.innerHeight + ); + }; + } else if ( docElement.clientWidth || docElement.clientHeight ) { + $.getWindowSize = function(){ + return new $.Point( + document.documentElement.clientWidth, + document.documentElement.clientHeight + ); + }; + } else if ( body.clientWidth || body.clientHeight ) { + $.getWindowSize = function(){ + return new $.Point( + document.body.clientWidth, + document.body.clientHeight + ); + }; + } else { + throw new Error("Unknown window size, no known technique."); + } + + return $.getWindowSize(); + }, + + + /** + * Wraps the given element in a nest of divs so that the element can + * be easily centered using CSS tables + * @function + * @param {Element|String} element + * @returns {Element} outermost wrapper element + */ + makeCenteredNode: function( element ) { + // Convert a possible ID to an actual HTMLElement + element = $.getElement( element ); + + /* + CSS tables require you to have a display:table/row/cell hierarchy so we need to create + three nested wrapper divs: + */ + + var wrappers = [ + $.makeNeutralElement( 'div' ), + $.makeNeutralElement( 'div' ), + $.makeNeutralElement( 'div' ) + ]; + + // It feels like we should be able to pass style dicts to makeNeutralElement: + $.extend(wrappers[0].style, { + display: "table", + height: "100%", + width: "100%" + }); + + $.extend(wrappers[1].style, { + display: "table-row" + }); + + $.extend(wrappers[2].style, { + display: "table-cell", + verticalAlign: "middle", + textAlign: "center" + }); + + wrappers[0].appendChild(wrappers[1]); + wrappers[1].appendChild(wrappers[2]); + wrappers[2].appendChild(element); + + return wrappers[0]; + }, + + + /** + * Creates an easily positionable element of the given type that therefor + * serves as an excellent container element. + * @function + * @param {String} tagName + * @returns {Element} + */ + makeNeutralElement: function( tagName ) { + var element = document.createElement( tagName ), + style = element.style; + + style.background = "transparent none"; + style.border = "none"; + style.margin = "0px"; + style.padding = "0px"; + style.position = "static"; + + return element; + }, + + + /** + * Returns the current milliseconds, using Date.now() if available + * @function + */ + now: function( ) { + if (Date.now) { + $.now = Date.now; + } else { + $.now = function() { + return new Date().getTime(); + }; + } + + return $.now(); + }, + + + /** + * Ensures an image is loaded correctly to support alpha transparency. + * @function + * @param {String} src + * @returns {Element} + */ + makeTransparentImage: function( src ) { + var img = $.makeNeutralElement( "img" ); + + img.src = src; + + return img; + }, + + + /** + * Sets the opacity of the specified element. + * @function + * @param {Element|String} element + * @param {Number} opacity + * @param {Boolean} [usesAlpha] + */ + setElementOpacity: function( element, opacity, usesAlpha ) { + + var ieOpacity, + ieFilter; + + element = $.getElement( element ); + + if ( usesAlpha && !$.Browser.alpha ) { + opacity = Math.round( opacity ); + } + + if ( $.Browser.opacity ) { + element.style.opacity = opacity < 1 ? opacity : ""; + } else { + if ( opacity < 1 ) { + ieOpacity = Math.round( 100 * opacity ); + ieFilter = "alpha(opacity=" + ieOpacity + ")"; + element.style.filter = ieFilter; + } else { + element.style.filter = ""; + } + } + }, + + + /** + * Sets the specified element's touch-action style attribute to 'none'. + * @function + * @param {Element|String} element + */ + setElementTouchActionNone: function( element ) { + element = $.getElement( element ); + if ( typeof element.style.touchAction !== 'undefined' ) { + element.style.touchAction = 'none'; + } else if ( typeof element.style.msTouchAction !== 'undefined' ) { + element.style.msTouchAction = 'none'; + } + }, + + + /** + * Sets the specified element's pointer-events style attribute to the passed value. + * @function + * @param {Element|String} element + * @param {String} value + */ + setElementPointerEvents: function( element, value ) { + element = $.getElement( element ); + if (typeof element.style !== 'undefined' && typeof element.style.pointerEvents !== 'undefined' ) { + element.style.pointerEvents = value; + } + }, + + + /** + * Sets the specified element's pointer-events style attribute to 'none'. + * @function + * @param {Element|String} element + */ + setElementPointerEventsNone: function( element ) { + $.setElementPointerEvents( element, 'none' ); + }, + + + /** + * Add the specified CSS class to the element if not present. + * @function + * @param {Element|String} element + * @param {String} className + */ + addClass: function( element, className ) { + element = $.getElement( element ); + + if (!element.className) { + element.className = className; + } else if ( ( ' ' + element.className + ' ' ). + indexOf( ' ' + className + ' ' ) === -1 ) { + element.className += ' ' + className; + } + }, + + /** + * Find the first index at which an element is found in an array or -1 + * if not present. + * + * Code taken and adapted from + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility + * + * @function + * @param {Array} array The array from which to find the element + * @param {Object} searchElement The element to find + * @param {Number} [fromIndex=0] Index to start research. + * @returns {Number} The index of the element in the array. + */ + indexOf: function( array, searchElement, fromIndex ) { + if ( Array.prototype.indexOf ) { + this.indexOf = function( array, searchElement, fromIndex ) { + return array.indexOf( searchElement, fromIndex ); + }; + } else { + this.indexOf = function( array, searchElement, fromIndex ) { + var i, + pivot = ( fromIndex ) ? fromIndex : 0, + length; + if ( !array ) { + throw new TypeError( ); + } + + length = array.length; + if ( length === 0 || pivot >= length ) { + return -1; + } + + if ( pivot < 0 ) { + pivot = length - Math.abs( pivot ); + } + + for ( i = pivot; i < length; i++ ) { + if ( array[i] === searchElement ) { + return i; + } + } + return -1; + }; + } + return this.indexOf( array, searchElement, fromIndex ); + }, + + /** + * Remove the specified CSS class from the element. + * @function + * @param {Element|String} element + * @param {String} className + */ + removeClass: function( element, className ) { + var oldClasses, + newClasses = [], + i; + + element = $.getElement( element ); + oldClasses = element.className.split( /\s+/ ); + for ( i = 0; i < oldClasses.length; i++ ) { + if ( oldClasses[ i ] && oldClasses[ i ] !== className ) { + newClasses.push( oldClasses[ i ] ); + } + } + element.className = newClasses.join(' '); + }, + + /** + * Convert passed addEventListener() options to boolean or options object, + * depending on browser support. + * @function + * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object + * @param {Boolean} [options.capture] + * @param {Boolean} [options.passive] + * @param {Boolean} [options.once] + * @returns {String} The protocol (http:, https:, file:, ftp: ...) + */ + normalizeEventListenerOptions: function (options) { + var opts; + if ( typeof options !== 'undefined' ) { + if ( typeof options === 'boolean' ) { + // Legacy Boolean useCapture + opts = $.supportsEventListenerOptions ? { capture: options } : options; + } else { + // Options object + opts = $.supportsEventListenerOptions ? options : + ( ( typeof options.capture !== 'undefined' ) ? options.capture : false ); + } + } else { + // No options specified - Legacy optional useCapture argument + // (for IE, first supported on version 9, so we'll pass a Boolean) + opts = $.supportsEventListenerOptions ? { capture: false } : false; + } + return opts; + }, + + /** + * Adds an event listener for the given element, eventName and handler. + * @function + * @param {Element|String} element + * @param {String} eventName + * @param {Function} handler + * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object + * @param {Boolean} [options.capture] + * @param {Boolean} [options.passive] + * @param {Boolean} [options.once] + */ + addEvent: (function () { + if ( $.supportsAddEventListener ) { + return function ( element, eventName, handler, options ) { + options = $.normalizeEventListenerOptions(options); + element = $.getElement( element ); + element.addEventListener( eventName, handler, options ); + }; + } else if ( document.documentElement.attachEvent && document.attachEvent ) { + return function ( element, eventName, handler ) { + element = $.getElement( element ); + element.attachEvent( 'on' + eventName, handler ); + }; + } else { + throw new Error( "No known event model." ); + } + }()), + + + /** + * Remove a given event listener for the given element, event type and + * handler. + * @function + * @param {Element|String} element + * @param {String} eventName + * @param {Function} handler + * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object + * @param {Boolean} [options.capture] + */ + removeEvent: (function () { + if ( $.supportsRemoveEventListener ) { + return function ( element, eventName, handler, options ) { + options = $.normalizeEventListenerOptions(options); + element = $.getElement( element ); + element.removeEventListener( eventName, handler, options ); + }; + } else if ( document.documentElement.detachEvent && document.detachEvent ) { + return function( element, eventName, handler ) { + element = $.getElement( element ); + element.detachEvent( 'on' + eventName, handler ); + }; + } else { + throw new Error( "No known event model." ); + } + }()), + + + /** + * Cancels the default browser behavior had the event propagated all + * the way up the DOM to the window object. + * @function + * @param {Event} [event] + */ + cancelEvent: function( event ) { + event.preventDefault(); + }, + + + /** + * Returns true if {@link OpenSeadragon.cancelEvent|cancelEvent} has been called on + * the event, otherwise returns false. + * @function + * @param {Event} [event] + */ + eventIsCanceled: function( event ) { + return event.defaultPrevented; + }, + + + /** + * Stops the propagation of the event through the DOM in the capturing and bubbling phases. + * @function + * @param {Event} [event] + */ + stopEvent: function( event ) { + event.stopPropagation(); + }, + + + /** + * Similar to OpenSeadragon.delegate, but it does not immediately call + * the method on the object, returning a function which can be called + * repeatedly to delegate the method. It also allows additional arguments + * to be passed during construction which will be added during each + * invocation, and each invocation can add additional arguments as well. + * + * @function + * @param {Object} object + * @param {Function} method + * @param [args] any additional arguments are passed as arguments to the + * created callback + * @returns {Function} + */ + createCallback: function( object, method ) { + //TODO: This pattern is painful to use and debug. It's much cleaner + // to use pinning plus anonymous functions. Get rid of this + // pattern! + var initialArgs = [], + i; + for ( i = 2; i < arguments.length; i++ ) { + initialArgs.push( arguments[ i ] ); + } + + return function() { + var args = initialArgs.concat( [] ), + i; + for ( i = 0; i < arguments.length; i++ ) { + args.push( arguments[ i ] ); + } + + return method.apply( object, args ); + }; + }, + + + /** + * Retrieves the value of a url parameter from the window.location string. + * @function + * @param {String} key + * @returns {String} The value of the url parameter or null if no param matches. + */ + getUrlParameter: function( key ) { + // eslint-disable-next-line no-use-before-define + var value = URLPARAMS[ key ]; + return value ? value : null; + }, + + /** + * Retrieves the protocol used by the url. The url can either be absolute + * or relative. + * @function + * @private + * @param {String} url The url to retrieve the protocol from. + * @returns {String} The protocol (http:, https:, file:, ftp: ...) + */ + getUrlProtocol: function( url ) { + var match = url.match(/^([a-z]+:)\/\//i); + if ( match === null ) { + // Relative URL, retrive the protocol from window.location + return window.location.protocol; + } + return match[1].toLowerCase(); + }, + + /** + * Create an XHR object + * @private + * @param {type} [local] If set to true, the XHR will be file: protocol + * compatible if possible (but may raise a warning in the browser). + * @returns {XMLHttpRequest} + */ + createAjaxRequest: function( local ) { + // IE11 does not support window.ActiveXObject so we just try to + // create one to see if it is supported. + // See: http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx + var supportActiveX; + try { + /* global ActiveXObject:true */ + supportActiveX = !!new ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) { + supportActiveX = false; + } + + if ( supportActiveX ) { + if ( window.XMLHttpRequest ) { + $.createAjaxRequest = function( local ) { + if ( local ) { + return new ActiveXObject( "Microsoft.XMLHTTP" ); + } + return new XMLHttpRequest(); + }; + } else { + $.createAjaxRequest = function() { + return new ActiveXObject( "Microsoft.XMLHTTP" ); + }; + } + } else if ( window.XMLHttpRequest ) { + $.createAjaxRequest = function() { + return new XMLHttpRequest(); + }; + } else { + throw new Error( "Browser doesn't support XMLHttpRequest." ); + } + return $.createAjaxRequest( local ); + }, + + /** + * Makes an AJAX request. + * @param {Object} options + * @param {String} options.url - the url to request + * @param {Function} options.success - a function to call on a successful response + * @param {Function} options.error - a function to call on when an error occurs + * @param {Object} options.headers - headers to add to the AJAX request + * @param {String} options.responseType - the response type of the AJAX request + * @param {String} options.postData - HTTP POST data (usually but not necessarily in k=v&k2=v2... form, + * see TileSource::getPostData), GET method used if null + * @param {Boolean} [options.withCredentials=false] - whether to set the XHR's withCredentials + * @throws {Error} + * @returns {XMLHttpRequest} + */ + makeAjaxRequest: function( url, onSuccess, onError ) { + var withCredentials; + var headers; + var responseType; + var postData; + + // Note that our preferred API is that you pass in a single object; the named + // arguments are for legacy support. + if( $.isPlainObject( url ) ){ + onSuccess = url.success; + onError = url.error; + withCredentials = url.withCredentials; + headers = url.headers; + responseType = url.responseType || null; + postData = url.postData || null; + url = url.url; + } + + var protocol = $.getUrlProtocol( url ); + var request = $.createAjaxRequest( protocol === "file:" ); + + if ( !$.isFunction( onSuccess ) ) { + throw new Error( "makeAjaxRequest requires a success callback" ); + } + + request.onreadystatechange = function() { + // 4 = DONE (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties) + if ( request.readyState === 4 ) { + request.onreadystatechange = function(){}; + + // With protocols other than http/https, a successful request status is in + // the 200's on Firefox and 0 on other browsers + if ( (request.status >= 200 && request.status < 300) || + ( request.status === 0 && + protocol !== "http:" && + protocol !== "https:" )) { + onSuccess( request ); + } else { + if ( $.isFunction( onError ) ) { + onError( request ); + } else { + $.console.error( "AJAX request returned %d: %s", request.status, url ); + } + } + } + }; + + var method = postData ? "POST" : "GET"; + try { + request.open( method, url, true ); + + if (responseType) { + request.responseType = responseType; + } + + if (headers) { + for (var headerName in headers) { + if (Object.prototype.hasOwnProperty.call(headers, headerName) && headers[headerName]) { + request.setRequestHeader(headerName, headers[headerName]); + } + } + } + + if (withCredentials) { + request.withCredentials = true; + } + + request.send(postData); + } catch (e) { + $.console.error( "%s while making AJAX request: %s", e.name, e.message ); + + request.onreadystatechange = function(){}; + + if ( $.isFunction( onError ) ) { + onError( request, e ); + } + } + + return request; + }, + + /** + * Taken from jQuery 1.6.1 + * @function + * @param {Object} options + * @param {String} options.url + * @param {Function} options.callback + * @param {String} [options.param='callback'] The name of the url parameter + * to request the jsonp provider with. + * @param {String} [options.callbackName=] The name of the callback to + * request the jsonp provider with. + */ + jsonp: function( options ){ + var script, + url = options.url, + head = document.head || + document.getElementsByTagName( "head" )[ 0 ] || + document.documentElement, + jsonpCallback = options.callbackName || 'openseadragon' + $.now(), + previous = window[ jsonpCallback ], + replace = "$1" + jsonpCallback + "$2", + callbackParam = options.param || 'callback', + callback = options.callback; + + url = url.replace( /(=)\?(&|$)|\?\?/i, replace ); + // Add callback manually + url += (/\?/.test( url ) ? "&" : "?") + callbackParam + "=" + jsonpCallback; + + // Install callback + window[ jsonpCallback ] = function( response ) { + if ( !previous ){ + try{ + delete window[ jsonpCallback ]; + }catch(e){ + //swallow + } + } else { + window[ jsonpCallback ] = previous; + } + if( callback && $.isFunction( callback ) ){ + callback( response ); + } + }; + + script = document.createElement( "script" ); + + //TODO: having an issue with async info requests + if( undefined !== options.async || false !== options.async ){ + script.async = "async"; + } + + if ( options.scriptCharset ) { + script.charset = options.scriptCharset; + } + + script.src = url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + + }, + + + /** + * Fully deprecated. Will throw an error. + * @function + * @deprecated use {@link OpenSeadragon.Viewer#open} + */ + createFromDZI: function() { + throw "OpenSeadragon.createFromDZI is deprecated, use Viewer.open."; + }, + + /** + * Parses an XML string into a DOM Document. + * @function + * @param {String} string + * @returns {Document} + */ + parseXml: function( string ) { + if ( window.DOMParser ) { + + $.parseXml = function( string ) { + var xmlDoc = null, + parser; + + parser = new DOMParser(); + xmlDoc = parser.parseFromString( string, "text/xml" ); + return xmlDoc; + }; + + } else if ( window.ActiveXObject ) { + + $.parseXml = function( string ) { + var xmlDoc = null; + + xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" ); + xmlDoc.async = false; + xmlDoc.loadXML( string ); + return xmlDoc; + }; + + } else { + throw new Error( "Browser doesn't support XML DOM." ); + } + + return $.parseXml( string ); + }, + + /** + * Parses a JSON string into a Javascript object. + * @function + * @param {String} string + * @returns {Object} + */ + parseJSON: function(string) { + $.parseJSON = window.JSON.parse; + return $.parseJSON(string); + }, + + /** + * Reports whether the image format is supported for tiling in this + * version. + * @function + * @param {String} [extension] + * @returns {Boolean} + */ + imageFormatSupported: function( extension ) { + extension = extension ? extension : ""; + // eslint-disable-next-line no-use-before-define + return !!FILEFORMATS[ extension.toLowerCase() ]; + }, + + /** + * Updates supported image formats with user-specified values. + * Preexisting formats that are not being updated are left unchanged. + * By default, the defined formats are + *
    {
    +         *      bmp:  false,
    +         *      jpeg: true,
    +         *      jpg:  true,
    +         *      png:  true,
    +         *      tif:  false,
    +         *      wdp:  false
    +         * }
    +         * 
    + * @function + * @example + * // sets webp as supported and png as unsupported + * setImageFormatsSupported({webp: true, png: false}); + * @param {Object} formats An object containing format extensions as + * keys and booleans as values. + */ + setImageFormatsSupported: function(formats) { + // eslint-disable-next-line no-use-before-define + $.extend(FILEFORMATS, formats); + } + + }); + + + //TODO: $.console is often used inside a try/catch block which generally + // prevents allowings errors to occur with detection until a debugger + // is attached. Although I've been guilty of the same anti-pattern + // I eventually was convinced that errors should naturally propagate in + // all but the most special cases. + /** + * A convenient alias for console when available, and a simple null + * function when console is unavailable. + * @static + * @private + */ + var nullfunction = function( msg ){ + //document.location.hash = msg; + }; + + $.console = window.console || { + log: nullfunction, + debug: nullfunction, + info: nullfunction, + warn: nullfunction, + error: nullfunction, + assert: nullfunction + }; + + + /** + * The current browser vendor, version, and related information regarding detected features. + * @member {Object} Browser + * @memberof OpenSeadragon + * @static + * @type {Object} + * @property {OpenSeadragon.BROWSERS} vendor - One of the {@link OpenSeadragon.BROWSERS} enumeration values. + * @property {Number} version + * @property {Boolean} alpha - Does the browser support image alpha transparency. + */ + $.Browser = { + vendor: $.BROWSERS.UNKNOWN, + version: 0, + alpha: true + }; + + + var FILEFORMATS = { + bmp: false, + jpeg: true, + jpg: true, + png: true, + tif: false, + wdp: false + }, + URLPARAMS = {}; + + (function() { + //A small auto-executing routine to determine the browser vendor, + //version and supporting feature sets. + var ver = navigator.appVersion, + ua = navigator.userAgent, + regex; + + //console.error( 'appName: ' + navigator.appName ); + //console.error( 'appVersion: ' + navigator.appVersion ); + //console.error( 'userAgent: ' + navigator.userAgent ); + + switch( navigator.appName ){ + case "Microsoft Internet Explorer": + if( !!window.attachEvent && + !!window.ActiveXObject ) { + + $.Browser.vendor = $.BROWSERS.IE; + $.Browser.version = parseFloat( + ua.substring( + ua.indexOf( "MSIE" ) + 5, + ua.indexOf( ";", ua.indexOf( "MSIE" ) ) ) + ); + } + break; + case "Netscape": + if (window.addEventListener) { + if ( ua.indexOf( "Edge" ) >= 0 ) { + $.Browser.vendor = $.BROWSERS.EDGE; + $.Browser.version = parseFloat( + ua.substring( ua.indexOf( "Edge" ) + 5 ) + ); + } else if ( ua.indexOf( "Edg" ) >= 0 ) { + $.Browser.vendor = $.BROWSERS.CHROMEEDGE; + $.Browser.version = parseFloat( + ua.substring( ua.indexOf( "Edg" ) + 4 ) + ); + } else if ( ua.indexOf( "Firefox" ) >= 0 ) { + $.Browser.vendor = $.BROWSERS.FIREFOX; + $.Browser.version = parseFloat( + ua.substring( ua.indexOf( "Firefox" ) + 8 ) + ); + } else if ( ua.indexOf( "Safari" ) >= 0 ) { + $.Browser.vendor = ua.indexOf( "Chrome" ) >= 0 ? + $.BROWSERS.CHROME : + $.BROWSERS.SAFARI; + $.Browser.version = parseFloat( + ua.substring( + ua.substring( 0, ua.indexOf( "Safari" ) ).lastIndexOf( "/" ) + 1, + ua.indexOf( "Safari" ) + ) + ); + } else { + regex = new RegExp( "Trident/.*rv:([0-9]{1,}[.0-9]{0,})"); + if ( regex.exec( ua ) !== null ) { + $.Browser.vendor = $.BROWSERS.IE; + $.Browser.version = parseFloat( RegExp.$1 ); + } + } + } + break; + case "Opera": + $.Browser.vendor = $.BROWSERS.OPERA; + $.Browser.version = parseFloat( ver ); + break; + } + + // ignore '?' portion of query string + var query = window.location.search.substring( 1 ), + parts = query.split('&'), + part, + sep, + i; + + for ( i = 0; i < parts.length; i++ ) { + part = parts[ i ]; + sep = part.indexOf( '=' ); + + if ( sep > 0 ) { + var key = part.substring( 0, sep ), + value = part.substring( sep + 1 ); + try { + URLPARAMS[ key ] = decodeURIComponent( value ); + } catch (e) { + $.console.error( "Ignoring malformed URL parameter: %s=%s", key, value ); + } + } + } + + //determine if this browser supports image alpha transparency + $.Browser.alpha = !( + $.Browser.vendor === $.BROWSERS.CHROME && $.Browser.version < 2 + ); + + //determine if this browser supports element.style.opacity + $.Browser.opacity = true; + + if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 11 ) { + $.console.error('Internet Explorer versions < 11 are not supported by OpenSeadragon'); + } + })(); + + + // Adding support for HTML5's requestAnimationFrame as suggested by acdha. + // Implementation taken from matt synder's post here: + // http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation/ + (function( w ) { + + // most browsers have an implementation + var requestAnimationFrame = w.requestAnimationFrame || + w.mozRequestAnimationFrame || + w.webkitRequestAnimationFrame || + w.msRequestAnimationFrame; + + var cancelAnimationFrame = w.cancelAnimationFrame || + w.mozCancelAnimationFrame || + w.webkitCancelAnimationFrame || + w.msCancelAnimationFrame; + + // polyfill, when necessary + if ( requestAnimationFrame && cancelAnimationFrame ) { + // We can't assign these window methods directly to $ because they + // expect their "this" to be "window", so we call them in wrappers. + $.requestAnimationFrame = function(){ + return requestAnimationFrame.apply( w, arguments ); + }; + $.cancelAnimationFrame = function(){ + return cancelAnimationFrame.apply( w, arguments ); + }; + } else { + var aAnimQueue = [], + processing = [], + iRequestId = 0, + iIntervalId; + + // create a mock requestAnimationFrame function + $.requestAnimationFrame = function( callback ) { + aAnimQueue.push( [ ++iRequestId, callback ] ); + + if ( !iIntervalId ) { + iIntervalId = setInterval( function() { + if ( aAnimQueue.length ) { + var time = $.now(); + // Process all of the currently outstanding frame + // requests, but none that get added during the + // processing. + // Swap the arrays so we don't have to create a new + // array every frame. + var temp = processing; + processing = aAnimQueue; + aAnimQueue = temp; + while ( processing.length ) { + processing.shift()[ 1 ]( time ); + } + } else { + // don't continue the interval, if unnecessary + clearInterval( iIntervalId ); + iIntervalId = undefined; + } + }, 1000 / 50); // estimating support for 50 frames per second + } + + return iRequestId; + }; + + // create a mock cancelAnimationFrame function + $.cancelAnimationFrame = function( requestId ) { + // find the request ID and remove it + var i, j; + for ( i = 0, j = aAnimQueue.length; i < j; i += 1 ) { + if ( aAnimQueue[ i ][ 0 ] === requestId ) { + aAnimQueue.splice( i, 1 ); + return; + } + } + + // If it's not in the queue, it may be in the set we're currently + // processing (if cancelAnimationFrame is called from within a + // requestAnimationFrame callback). + for ( i = 0, j = processing.length; i < j; i += 1 ) { + if ( processing[ i ][ 0 ] === requestId ) { + processing.splice( i, 1 ); + return; + } + } + }; + } + })( window ); + + /** + * @private + * @inner + * @function + * @param {Element} element + * @param {Boolean} [isFixed] + * @returns {Element} + */ + function getOffsetParent( element, isFixed ) { + if ( isFixed && element !== document.body ) { + return document.body; + } else { + return element.offsetParent; + } + } + +}(OpenSeadragon)); + + +// Universal Module Definition, supports CommonJS, AMD and simple script tag +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // expose as amd module + define([], factory); + } else if (typeof module === 'object' && module.exports) { + // expose as commonjs module + module.exports = factory(); + } else { + // expose as window.OpenSeadragon + root.OpenSeadragon = factory(); + } +}(this, function () { + return OpenSeadragon; +})); + +/* + * OpenSeadragon - full-screen support functions + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ) { + /** + * Determine native full screen support we can get from the browser. + * @member fullScreenApi + * @memberof OpenSeadragon + * @type {object} + * @property {Boolean} supportsFullScreen Return true if full screen API is supported. + * @property {Function} isFullScreen Return true if currently in full screen mode. + * @property {Function} getFullScreenElement Return the element currently in full screen mode. + * @property {Function} requestFullScreen Make a request to go in full screen mode. + * @property {Function} exitFullScreen Make a request to exit full screen mode. + * @property {Function} cancelFullScreen Deprecated, use exitFullScreen instead. + * @property {String} fullScreenEventName Event fired when the full screen mode change. + * @property {String} fullScreenErrorEventName Event fired when a request to go + * in full screen mode failed. + */ + var fullScreenApi = { + supportsFullScreen: false, + isFullScreen: function() { return false; }, + getFullScreenElement: function() { return null; }, + requestFullScreen: function() {}, + exitFullScreen: function() {}, + cancelFullScreen: function() {}, + fullScreenEventName: '', + fullScreenErrorEventName: '' + }; + + // check for native support + if ( document.exitFullscreen ) { + // W3C standard + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.fullscreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.requestFullscreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.exitFullscreen(); + }; + fullScreenApi.fullScreenEventName = "fullscreenchange"; + fullScreenApi.fullScreenErrorEventName = "fullscreenerror"; + } else if ( document.msExitFullscreen ) { + // IE 11 + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.msFullscreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.msRequestFullscreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.msExitFullscreen(); + }; + fullScreenApi.fullScreenEventName = "MSFullscreenChange"; + fullScreenApi.fullScreenErrorEventName = "MSFullscreenError"; + } else if ( document.webkitExitFullscreen ) { + // Recent webkit + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.webkitFullscreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.webkitRequestFullscreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.webkitExitFullscreen(); + }; + fullScreenApi.fullScreenEventName = "webkitfullscreenchange"; + fullScreenApi.fullScreenErrorEventName = "webkitfullscreenerror"; + } else if ( document.webkitCancelFullScreen ) { + // Old webkit + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.webkitCurrentFullScreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.webkitRequestFullScreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.webkitCancelFullScreen(); + }; + fullScreenApi.fullScreenEventName = "webkitfullscreenchange"; + fullScreenApi.fullScreenErrorEventName = "webkitfullscreenerror"; + } else if ( document.mozCancelFullScreen ) { + // Firefox + fullScreenApi.supportsFullScreen = true; + fullScreenApi.getFullScreenElement = function() { + return document.mozFullScreenElement; + }; + fullScreenApi.requestFullScreen = function( element ) { + return element.mozRequestFullScreen(); + }; + fullScreenApi.exitFullScreen = function() { + document.mozCancelFullScreen(); + }; + fullScreenApi.fullScreenEventName = "mozfullscreenchange"; + fullScreenApi.fullScreenErrorEventName = "mozfullscreenerror"; + } + fullScreenApi.isFullScreen = function() { + return fullScreenApi.getFullScreenElement() !== null; + }; + fullScreenApi.cancelFullScreen = function() { + $.console.error("cancelFullScreen is deprecated. Use exitFullScreen instead."); + fullScreenApi.exitFullScreen(); + }; + + // export api + $.extend( $, fullScreenApi ); + +})( OpenSeadragon ); + +/* + * OpenSeadragon - EventSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($){ + +/** + * Event handler method signature used by all OpenSeadragon events. + * + * @callback EventHandler + * @memberof OpenSeadragon + * @param {Object} event - See individual events for event-specific properties. + */ + + +/** + * @class EventSource + * @classdesc For use by classes which want to support custom, non-browser events. + * + * @memberof OpenSeadragon + */ +$.EventSource = function() { + this.events = {}; +}; + +/** @lends OpenSeadragon.EventSource.prototype */ +$.EventSource.prototype = { + + /** + * Add an event handler to be triggered only once (or a given number of times) + * for a given event. It is not removable with removeHandler(). + * @function + * @param {String} eventName - Name of event to register. + * @param {OpenSeadragon.EventHandler} handler - Function to call when event + * is triggered. + * @param {Object} [userData=null] - Arbitrary object to be passed unchanged + * to the handler. + * @param {Number} [times=1] - The number of times to handle the event + * before removing it. + * @param {Number} [priority=0] - Handler priority. By default, all priorities are 0. Higher number = priority. + */ + addOnceHandler: function(eventName, handler, userData, times, priority) { + var self = this; + times = times || 1; + var count = 0; + var onceHandler = function(event) { + count++; + if (count === times) { + self.removeHandler(eventName, onceHandler); + } + return handler(event); + }; + this.addHandler(eventName, onceHandler, userData, priority); + }, + + /** + * Add an event handler for a given event. + * @function + * @param {String} eventName - Name of event to register. + * @param {OpenSeadragon.EventHandler} handler - Function to call when event is triggered. + * @param {Object} [userData=null] - Arbitrary object to be passed unchanged to the handler. + * @param {Number} [priority=0] - Handler priority. By default, all priorities are 0. Higher number = priority. + */ + addHandler: function ( eventName, handler, userData, priority ) { + var events = this.events[ eventName ]; + if ( !events ) { + this.events[ eventName ] = events = []; + } + if ( handler && $.isFunction( handler ) ) { + var index = events.length, + event = { handler: handler, userData: userData || null, priority: priority || 0 }; + events[ index ] = event; + while ( index > 0 && events[ index - 1 ].priority < events[ index ].priority ) { + events[ index ] = events[ index - 1 ]; + events[ index - 1 ] = event; + index--; + } + } + }, + + /** + * Remove a specific event handler for a given event. + * @function + * @param {String} eventName - Name of event for which the handler is to be removed. + * @param {OpenSeadragon.EventHandler} handler - Function to be removed. + */ + removeHandler: function ( eventName, handler ) { + var events = this.events[ eventName ], + handlers = [], + i; + if ( !events ) { + return; + } + if ( $.isArray( events ) ) { + for ( i = 0; i < events.length; i++ ) { + if ( events[i].handler !== handler ) { + handlers.push( events[ i ] ); + } + } + this.events[ eventName ] = handlers; + } + }, + + /** + * Get the amount of handlers registered for a given event. + * @param {String} eventName - Name of event to inspect. + * @returns {number} amount of events + */ + numberOfHandlers: function (eventName) { + var events = this.events[ eventName ]; + if ( !events ) { + return 0; + } + return events.length; + }, + + /** + * Remove all event handlers for a given event type. If no type is given all + * event handlers for every event type are removed. + * @function + * @param {String} eventName - Name of event for which all handlers are to be removed. + */ + removeAllHandlers: function( eventName ) { + if ( eventName ){ + this.events[ eventName ] = []; + } else{ + for ( var eventType in this.events ) { + this.events[ eventType ] = []; + } + } + }, + + /** + * Get a function which iterates the list of all handlers registered for a given event, calling the handler for each. + * @function + * @param {String} eventName - Name of event to get handlers for. + */ + getHandler: function ( eventName) { + var events = this.events[ eventName ]; + if ( !events || !events.length ) { + return null; + } + events = events.length === 1 ? + [ events[ 0 ] ] : + Array.apply( null, events ); + return function ( source, args ) { + var i, + length = events.length; + for ( i = 0; i < length; i++ ) { + if ( events[ i ] ) { + args.eventSource = source; + args.userData = events[ i ].userData; + events[ i ].handler( args ); + } + } + }; + }, + + /** + * Trigger an event, optionally passing additional information. + * @function + * @param {String} eventName - Name of event to register. + * @param {Object} eventArgs - Event-specific data. + */ + raiseEvent: function( eventName, eventArgs ) { + //uncomment if you want to get a log of all events + //$.console.log( eventName ); + + var handler = this.getHandler( eventName ); + if ( handler ) { + return handler( this, eventArgs || {} ); + } + return undefined; + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - MouseTracker + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function ( $ ) { + + // All MouseTracker instances + var MOUSETRACKERS = []; + + // dictionary from hash to private properties + var THIS = {}; + + + /** + * @class MouseTracker + * @classdesc Provides simplified handling of common pointer device (mouse, touch, pen, etc.) gestures + * and keyboard events on a specified element. + * @memberof OpenSeadragon + * @param {Object} options + * Allows configurable properties to be entirely specified by passing + * an options object to the constructor. The constructor also supports + * the original positional arguments 'element', 'clickTimeThreshold', + * and 'clickDistThreshold' in that order. + * @param {Element|String} options.element + * A reference to an element or an element id for which the pointer/key + * events will be monitored. + * @param {Boolean} [options.startDisabled=false] + * If true, event tracking on the element will not start until + * {@link OpenSeadragon.MouseTracker.setTracking|setTracking} is called. + * @param {Number} options.clickTimeThreshold + * The number of milliseconds within which a pointer down-up event combination + * will be treated as a click gesture. + * @param {Number} options.clickDistThreshold + * The maximum distance allowed between a pointer down event and a pointer up event + * to be treated as a click gesture. + * @param {Number} options.dblClickTimeThreshold + * The number of milliseconds within which two pointer down-up event combinations + * will be treated as a double-click gesture. + * @param {Number} options.dblClickDistThreshold + * The maximum distance allowed between two pointer click events + * to be treated as a click gesture. + * @param {Number} [options.stopDelay=50] + * The number of milliseconds without pointer move before the stop + * event is fired. + * @param {OpenSeadragon.EventHandler} [options.preProcessEventHandler=null] + * An optional handler for controlling DOM event propagation and processing. + * @param {OpenSeadragon.EventHandler} [options.contextMenuHandler=null] + * An optional handler for contextmenu. + * @param {OpenSeadragon.EventHandler} [options.enterHandler=null] + * An optional handler for pointer enter. + * @param {OpenSeadragon.EventHandler} [options.leaveHandler=null] + * An optional handler for pointer leave. + * @param {OpenSeadragon.EventHandler} [options.exitHandler=null] + * An optional handler for pointer leave. Deprecated. Use leaveHandler instead. + * @param {OpenSeadragon.EventHandler} [options.overHandler=null] + * An optional handler for pointer over. + * @param {OpenSeadragon.EventHandler} [options.outHandler=null] + * An optional handler for pointer out. + * @param {OpenSeadragon.EventHandler} [options.pressHandler=null] + * An optional handler for pointer press. + * @param {OpenSeadragon.EventHandler} [options.nonPrimaryPressHandler=null] + * An optional handler for pointer non-primary button press. + * @param {OpenSeadragon.EventHandler} [options.releaseHandler=null] + * An optional handler for pointer release. + * @param {OpenSeadragon.EventHandler} [options.nonPrimaryReleaseHandler=null] + * An optional handler for pointer non-primary button release. + * @param {OpenSeadragon.EventHandler} [options.moveHandler=null] + * An optional handler for pointer move. + * @param {OpenSeadragon.EventHandler} [options.scrollHandler=null] + * An optional handler for mouse wheel scroll. + * @param {OpenSeadragon.EventHandler} [options.clickHandler=null] + * An optional handler for pointer click. + * @param {OpenSeadragon.EventHandler} [options.dblClickHandler=null] + * An optional handler for pointer double-click. + * @param {OpenSeadragon.EventHandler} [options.dragHandler=null] + * An optional handler for the drag gesture. + * @param {OpenSeadragon.EventHandler} [options.dragEndHandler=null] + * An optional handler for after a drag gesture. + * @param {OpenSeadragon.EventHandler} [options.pinchHandler=null] + * An optional handler for the pinch gesture. + * @param {OpenSeadragon.EventHandler} [options.keyDownHandler=null] + * An optional handler for keydown. + * @param {OpenSeadragon.EventHandler} [options.keyUpHandler=null] + * An optional handler for keyup. + * @param {OpenSeadragon.EventHandler} [options.keyHandler=null] + * An optional handler for keypress. + * @param {OpenSeadragon.EventHandler} [options.focusHandler=null] + * An optional handler for focus. + * @param {OpenSeadragon.EventHandler} [options.blurHandler=null] + * An optional handler for blur. + * @param {Object} [options.userData=null] + * Arbitrary object to be passed unchanged to any attached handler methods. + */ + $.MouseTracker = function ( options ) { + + MOUSETRACKERS.push( this ); + + var args = arguments; + + if ( !$.isPlainObject( options ) ) { + options = { + element: args[ 0 ], + clickTimeThreshold: args[ 1 ], + clickDistThreshold: args[ 2 ] + }; + } + + this.hash = Math.random(); // An unique hash for this tracker. + /** + * The element for which pointer events are being monitored. + * @member {Element} element + * @memberof OpenSeadragon.MouseTracker# + */ + this.element = $.getElement( options.element ); + /** + * The number of milliseconds within which a pointer down-up event combination + * will be treated as a click gesture. + * @member {Number} clickTimeThreshold + * @memberof OpenSeadragon.MouseTracker# + */ + this.clickTimeThreshold = options.clickTimeThreshold || $.DEFAULT_SETTINGS.clickTimeThreshold; + /** + * The maximum distance allowed between a pointer down event and a pointer up event + * to be treated as a click gesture. + * @member {Number} clickDistThreshold + * @memberof OpenSeadragon.MouseTracker# + */ + this.clickDistThreshold = options.clickDistThreshold || $.DEFAULT_SETTINGS.clickDistThreshold; + /** + * The number of milliseconds within which two pointer down-up event combinations + * will be treated as a double-click gesture. + * @member {Number} dblClickTimeThreshold + * @memberof OpenSeadragon.MouseTracker# + */ + this.dblClickTimeThreshold = options.dblClickTimeThreshold || $.DEFAULT_SETTINGS.dblClickTimeThreshold; + /** + * The maximum distance allowed between two pointer click events + * to be treated as a double-click gesture. + * @member {Number} dblClickDistThreshold + * @memberof OpenSeadragon.MouseTracker# + */ + this.dblClickDistThreshold = options.dblClickDistThreshold || $.DEFAULT_SETTINGS.dblClickDistThreshold; + /*eslint-disable no-multi-spaces*/ + this.userData = options.userData || null; + this.stopDelay = options.stopDelay || 50; + + this.preProcessEventHandler = options.preProcessEventHandler || null; + this.contextMenuHandler = options.contextMenuHandler || null; + this.enterHandler = options.enterHandler || null; + this.leaveHandler = options.leaveHandler || null; + this.exitHandler = options.exitHandler || null; // Deprecated v2.5.0 + this.overHandler = options.overHandler || null; + this.outHandler = options.outHandler || null; + this.pressHandler = options.pressHandler || null; + this.nonPrimaryPressHandler = options.nonPrimaryPressHandler || null; + this.releaseHandler = options.releaseHandler || null; + this.nonPrimaryReleaseHandler = options.nonPrimaryReleaseHandler || null; + this.moveHandler = options.moveHandler || null; + this.scrollHandler = options.scrollHandler || null; + this.clickHandler = options.clickHandler || null; + this.dblClickHandler = options.dblClickHandler || null; + this.dragHandler = options.dragHandler || null; + this.dragEndHandler = options.dragEndHandler || null; + this.pinchHandler = options.pinchHandler || null; + this.stopHandler = options.stopHandler || null; + this.keyDownHandler = options.keyDownHandler || null; + this.keyUpHandler = options.keyUpHandler || null; + this.keyHandler = options.keyHandler || null; + this.focusHandler = options.focusHandler || null; + this.blurHandler = options.blurHandler || null; + /*eslint-enable no-multi-spaces*/ + + //Store private properties in a scope sealed hash map + var _this = this; + + /** + * @private + * @property {Boolean} tracking + * Are we currently tracking pointer events for this element. + */ + THIS[ this.hash ] = { + click: function ( event ) { onClick( _this, event ); }, + dblclick: function ( event ) { onDblClick( _this, event ); }, + keydown: function ( event ) { onKeyDown( _this, event ); }, + keyup: function ( event ) { onKeyUp( _this, event ); }, + keypress: function ( event ) { onKeyPress( _this, event ); }, + focus: function ( event ) { onFocus( _this, event ); }, + blur: function ( event ) { onBlur( _this, event ); }, + contextmenu: function ( event ) { onContextMenu( _this, event ); }, + + wheel: function ( event ) { onWheel( _this, event ); }, + mousewheel: function ( event ) { onMouseWheel( _this, event ); }, + DOMMouseScroll: function ( event ) { onMouseWheel( _this, event ); }, + MozMousePixelScroll: function ( event ) { onMouseWheel( _this, event ); }, + + losecapture: function ( event ) { onLoseCapture( _this, event ); }, + + mouseenter: function ( event ) { onPointerEnter( _this, event ); }, + mouseleave: function ( event ) { onPointerLeave( _this, event ); }, + mouseover: function ( event ) { onPointerOver( _this, event ); }, + mouseout: function ( event ) { onPointerOut( _this, event ); }, + mousedown: function ( event ) { onPointerDown( _this, event ); }, + mouseup: function ( event ) { onPointerUp( _this, event ); }, + mousemove: function ( event ) { onPointerMove( _this, event ); }, + + touchstart: function ( event ) { onTouchStart( _this, event ); }, + touchend: function ( event ) { onTouchEnd( _this, event ); }, + touchmove: function ( event ) { onTouchMove( _this, event ); }, + touchcancel: function ( event ) { onTouchCancel( _this, event ); }, + + gesturestart: function ( event ) { onGestureStart( _this, event ); }, // Safari/Safari iOS + gesturechange: function ( event ) { onGestureChange( _this, event ); }, // Safari/Safari iOS + + gotpointercapture: function ( event ) { onGotPointerCapture( _this, event ); }, + lostpointercapture: function ( event ) { onLostPointerCapture( _this, event ); }, + pointerenter: function ( event ) { onPointerEnter( _this, event ); }, + pointerleave: function ( event ) { onPointerLeave( _this, event ); }, + pointerover: function ( event ) { onPointerOver( _this, event ); }, + pointerout: function ( event ) { onPointerOut( _this, event ); }, + pointerdown: function ( event ) { onPointerDown( _this, event ); }, + pointerup: function ( event ) { onPointerUp( _this, event ); }, + pointermove: function ( event ) { onPointerMove( _this, event ); }, + pointercancel: function ( event ) { onPointerCancel( _this, event ); }, + pointerupcaptured: function ( event ) { onPointerUpCaptured( _this, event ); }, + pointermovecaptured: function ( event ) { onPointerMoveCaptured( _this, event ); }, + + tracking: false, + + // Active pointers lists. Array of GesturePointList objects, one for each pointer device type. + // GesturePointList objects are added each time a pointer is tracked by a new pointer device type (see getActivePointersListByType()). + // Active pointers are any pointer being tracked for this element which are in the hit-test area + // of the element (for hover-capable devices) and/or have contact or a button press initiated in the element. + activePointersLists: [], + + // Tracking for double-click gesture + lastClickPos: null, + dblClickTimeOut: null, + + // Tracking for pinch gesture + pinchGPoints: [], + lastPinchDist: 0, + currentPinchDist: 0, + lastPinchCenter: null, + currentPinchCenter: null, + + // Tracking for drag + sentDragEvent: false + }; + + this.hasGestureHandlers = !!( this.pressHandler || this.nonPrimaryPressHandler || + this.releaseHandler || this.nonPrimaryReleaseHandler || + this.clickHandler || this.dblClickHandler || + this.dragHandler || this.dragEndHandler || + this.pinchHandler ); + this.hasScrollHandler = !!this.scrollHandler; + + if ( $.MouseTracker.havePointerEvents ) { + $.setElementPointerEvents( this.element, 'auto' ); + } + + if (this.exitHandler) { + $.console.error("MouseTracker.exitHandler is deprecated. Use MouseTracker.leaveHandler instead."); + } + + if ( !options.startDisabled ) { + this.setTracking( true ); + } + }; + + /** @lends OpenSeadragon.MouseTracker.prototype */ + $.MouseTracker.prototype = { + + /** + * Clean up any events or objects created by the tracker. + * @function + */ + destroy: function () { + var i; + + stopTracking( this ); + this.element = null; + + for ( i = 0; i < MOUSETRACKERS.length; i++ ) { + if ( MOUSETRACKERS[ i ] === this ) { + MOUSETRACKERS.splice( i, 1 ); + break; + } + } + + THIS[ this.hash ] = null; + delete THIS[ this.hash ]; + }, + + /** + * Are we currently tracking events on this element. + * @deprecated Just use this.tracking + * @function + * @returns {Boolean} Are we currently tracking events on this element. + */ + isTracking: function () { + return THIS[ this.hash ].tracking; + }, + + /** + * Enable or disable whether or not we are tracking events on this element. + * @function + * @param {Boolean} track True to start tracking, false to stop tracking. + * @returns {OpenSeadragon.MouseTracker} Chainable. + */ + setTracking: function ( track ) { + if ( track ) { + startTracking( this ); + } else { + stopTracking( this ); + } + //chain + return this; + }, + + /** + * Returns the {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} for the given pointer device type, + * creating and caching a new {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} if one doesn't already exist for the type. + * @function + * @param {String} type - The pointer device type: "mouse", "touch", "pen", etc. + * @returns {OpenSeadragon.MouseTracker.GesturePointList} + */ + getActivePointersListByType: function ( type ) { + var delegate = THIS[ this.hash ], + i, + len = delegate.activePointersLists.length, + list; + + for ( i = 0; i < len; i++ ) { + if ( delegate.activePointersLists[ i ].type === type ) { + return delegate.activePointersLists[ i ]; + } + } + + list = new $.MouseTracker.GesturePointList( type ); + delegate.activePointersLists.push( list ); + return list; + }, + + /** + * Returns the total number of pointers currently active on the tracked element. + * @function + * @returns {Number} + */ + getActivePointerCount: function () { + var delegate = THIS[ this.hash ], + i, + len = delegate.activePointersLists.length, + count = 0; + + for ( i = 0; i < len; i++ ) { + count += delegate.activePointersLists[ i ].getLength(); + } + + return count; + }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + */ + preProcessEventHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefault + * Set to true to prevent the default user-agent's handling of the contextmenu event. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + contextMenuHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Number} event.pointers + * Number of pointers (all types) active in the tracked element. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.buttonDownAny + * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + enterHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @since v2.5.0 + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Number} event.pointers + * Number of pointers (all types) active in the tracked element. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.buttonDownAny + * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + leaveHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @deprecated v2.5.0 Use leaveHandler instead + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Number} event.pointers + * Number of pointers (all types) active in the tracked element. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.buttonDownAny + * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + exitHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @since v2.5.0 + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Number} event.pointers + * Number of pointers (all types) active in the tracked element. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.buttonDownAny + * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + overHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @since v2.5.0 + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Number} event.pointers + * Number of pointers (all types) active in the tracked element. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.buttonDownAny + * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + outHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + pressHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.button + * Button which caused the event. + * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + nonPrimaryPressHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.insideElementPressed + * True if the left mouse button is currently being pressed and was + * initiated inside the tracked element, otherwise false. + * @param {Boolean} event.insideElementReleased + * True if the cursor inside the tracked element when the button was released. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + releaseHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.button + * Button which caused the event. + * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + nonPrimaryReleaseHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + moveHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.scroll + * The scroll delta for the event. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. Touch devices no longer generate scroll event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefault + * Set to true to prevent the default user-agent's handling of the wheel event. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + scrollHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Boolean} event.quick + * True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for ignoring drag events. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Element} event.originalTarget + * The DOM element clicked on. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + clickHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + dblClickHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {OpenSeadragon.Point} event.delta + * The x,y components of the difference between the current position and the last drag event position. Useful for ignoring or weighting the events. + * @param {Number} event.speed + * Current computed speed, in pixels per second. + * @param {Number} event.direction + * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + dragHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.speed + * Speed at the end of a drag gesture, in pixels per second. + * @param {Number} event.direction + * Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + dragEndHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {Array.} event.gesturePoints + * Gesture points associated with the gesture. Velocity data can be found here. + * @param {OpenSeadragon.Point} event.lastCenter + * The previous center point of the two pinch contact points relative to the tracked element. + * @param {OpenSeadragon.Point} event.center + * The center point of the two pinch contact points relative to the tracked element. + * @param {Number} event.lastDistance + * The previous distance between the two pinch contact points in CSS pixels. + * @param {Number} event.distance + * The distance between the two pinch contact points in CSS pixels. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + pinchHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {String} event.pointerType + * "mouse", "touch", "pen", etc. + * @param {OpenSeadragon.Point} event.position + * The position of the event relative to the tracked element. + * @param {Number} event.buttons + * Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @param {Boolean} event.isTouchEvent + * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + stopHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Number} event.keyCode + * The key code that was pressed. + * @param {Boolean} event.ctrl + * True if the ctrl key was pressed during this event. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.alt + * True if the alt key was pressed during this event. + * @param {Boolean} event.meta + * True if the meta key was pressed during this event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefault + * Set to true to prevent the default user-agent's handling of the keydown event. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + keyDownHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Number} event.keyCode + * The key code that was pressed. + * @param {Boolean} event.ctrl + * True if the ctrl key was pressed during this event. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.alt + * True if the alt key was pressed during this event. + * @param {Boolean} event.meta + * True if the meta key was pressed during this event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefault + * Set to true to prevent the default user-agent's handling of the keyup event. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + keyUpHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Number} event.keyCode + * The key code that was pressed. + * @param {Boolean} event.ctrl + * True if the ctrl key was pressed during this event. + * @param {Boolean} event.shift + * True if the shift key was pressed during this event. + * @param {Boolean} event.alt + * True if the alt key was pressed during this event. + * @param {Boolean} event.meta + * True if the meta key was pressed during this event. + * @param {Object} event.originalEvent + * The original event object. + * @param {Boolean} event.preventDefault + * Set to true to prevent the default user-agent's handling of the keypress event. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + keyHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + focusHandler: function () { }, + + /** + * Implement or assign implementation to these handlers during or after + * calling the constructor. + * @function + * @param {Object} event + * @param {OpenSeadragon.MouseTracker} event.eventSource + * A reference to the tracker instance. + * @param {Object} event.originalEvent + * The original event object. + * @param {Object} event.userData + * Arbitrary user-defined object. + */ + blurHandler: function () { } + }; + + // https://github.com/openseadragon/openseadragon/pull/790 + /** + * True if inside an iframe, otherwise false. + * @member {Boolean} isInIframe + * @private + * @inner + */ + var isInIframe = (function() { + try { + return window.self !== window.top; + } catch (e) { + return true; + } + })(); + + // https://github.com/openseadragon/openseadragon/pull/790 + /** + * @function + * @private + * @inner + * @returns {Boolean} True if the target supports DOM Level 2 event subscription methods, otherwise false. + */ + function canAccessEvents (target) { + try { + return target.addEventListener && target.removeEventListener; + } catch (e) { + return false; + } + } + + /** + * Provides continuous computation of velocity (speed and direction) of active pointers. + * This is a singleton, used by all MouseTracker instances, as it is unlikely there will ever be more than + * two active gesture pointers at a time. + * + * @private + * @member gesturePointVelocityTracker + * @memberof OpenSeadragon.MouseTracker + */ + $.MouseTracker.gesturePointVelocityTracker = (function () { + var trackerPoints = [], + intervalId = 0, + lastTime = 0; + + // Generates a unique identifier for a tracked gesture point + var _generateGuid = function ( tracker, gPoint ) { + return tracker.hash.toString() + gPoint.type + gPoint.id.toString(); + }; + + // Interval timer callback. Computes velocity for all tracked gesture points. + var _doTracking = function () { + var i, + len = trackerPoints.length, + trackPoint, + gPoint, + now = $.now(), + elapsedTime, + distance, + speed; + + elapsedTime = now - lastTime; + lastTime = now; + + for ( i = 0; i < len; i++ ) { + trackPoint = trackerPoints[ i ]; + gPoint = trackPoint.gPoint; + // Math.atan2 gives us just what we need for a velocity vector, as we can simply + // use cos()/sin() to extract the x/y velocity components. + gPoint.direction = Math.atan2( gPoint.currentPos.y - trackPoint.lastPos.y, gPoint.currentPos.x - trackPoint.lastPos.x ); + // speed = distance / elapsed time + distance = trackPoint.lastPos.distanceTo( gPoint.currentPos ); + trackPoint.lastPos = gPoint.currentPos; + speed = 1000 * distance / ( elapsedTime + 1 ); + // Simple biased average, favors the most recent speed computation. Smooths out erratic gestures a bit. + gPoint.speed = 0.75 * speed + 0.25 * gPoint.speed; + } + }; + + // Public. Add a gesture point to be tracked + var addPoint = function ( tracker, gPoint ) { + var guid = _generateGuid( tracker, gPoint ); + + trackerPoints.push( + { + guid: guid, + gPoint: gPoint, + lastPos: gPoint.currentPos + } ); + + // Only fire up the interval timer when there's gesture pointers to track + if ( trackerPoints.length === 1 ) { + lastTime = $.now(); + intervalId = window.setInterval( _doTracking, 50 ); + } + }; + + // Public. Stop tracking a gesture point + var removePoint = function ( tracker, gPoint ) { + var guid = _generateGuid( tracker, gPoint ), + i, + len = trackerPoints.length; + for ( i = 0; i < len; i++ ) { + if ( trackerPoints[ i ].guid === guid ) { + trackerPoints.splice( i, 1 ); + // Only run the interval timer if theres gesture pointers to track + len--; + if ( len === 0 ) { + window.clearInterval( intervalId ); + } + break; + } + } + }; + + return { + addPoint: addPoint, + removePoint: removePoint + }; + } )(); + + +/////////////////////////////////////////////////////////////////////////////// +// Pointer event model and feature detection +/////////////////////////////////////////////////////////////////////////////// + + $.MouseTracker.captureElement = document; + + /** + * Detect available mouse wheel event name. + */ + $.MouseTracker.wheelEventName = ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version > 8 ) || + ( 'onwheel' in document.createElement( 'div' ) ) ? 'wheel' : // Modern browsers support 'wheel' + document.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least 'mousewheel' + 'DOMMouseScroll'; // Assume old Firefox + + /** + * Detect browser pointer device event model(s) and build appropriate list of events to subscribe to. + */ + $.MouseTracker.subscribeEvents = [ "click", "dblclick", "keydown", "keyup", "keypress", "focus", "blur", "contextmenu", $.MouseTracker.wheelEventName ]; + + if( $.MouseTracker.wheelEventName === "DOMMouseScroll" ) { + // Older Firefox + $.MouseTracker.subscribeEvents.push( "MozMousePixelScroll" ); + } + + if ( window.PointerEvent ) { + // IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents) + $.MouseTracker.havePointerEvents = true; + $.MouseTracker.subscribeEvents.push( "pointerenter", "pointerleave", "pointerover", "pointerout", "pointerdown", "pointerup", "pointermove", "pointercancel" ); + // Pointer events capture support + $.MouseTracker.havePointerCapture = (function () { + var divElement = document.createElement( 'div' ); + return $.isFunction( divElement.setPointerCapture ) && $.isFunction( divElement.releasePointerCapture ); + }()); + if ( $.MouseTracker.havePointerCapture ) { + $.MouseTracker.subscribeEvents.push( "gotpointercapture", "lostpointercapture" ); + } + } else { + // Legacy W3C mouse events + $.MouseTracker.havePointerEvents = false; + $.MouseTracker.subscribeEvents.push( "mouseenter", "mouseleave", "mouseover", "mouseout", "mousedown", "mouseup", "mousemove" ); + $.MouseTracker.mousePointerId = "legacy-mouse"; + // Legacy mouse events capture support (IE/Firefox only?) + $.MouseTracker.havePointerCapture = (function () { + var divElement = document.createElement( 'div' ); + return $.isFunction( divElement.setCapture ) && $.isFunction( divElement.releaseCapture ); + }()); + if ( $.MouseTracker.havePointerCapture ) { + $.MouseTracker.subscribeEvents.push( "losecapture" ); + } + // Legacy touch events + if ( 'ontouchstart' in window ) { + // iOS, Android, and other W3c Touch Event implementations + // (see http://www.w3.org/TR/touch-events/) + // (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html) + // (see https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html) + $.MouseTracker.subscribeEvents.push( "touchstart", "touchend", "touchmove", "touchcancel" ); + } + if ( 'ongesturestart' in window ) { + // iOS (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html) + // Subscribe to these to prevent default gesture handling + $.MouseTracker.subscribeEvents.push( "gesturestart", "gesturechange" ); + } + } + + +/////////////////////////////////////////////////////////////////////////////// +// Classes and typedefs +/////////////////////////////////////////////////////////////////////////////// + + /** + * Used for the processing/disposition of DOM events (propagation, default handling, capture, etc.) + * + * @typedef {Object} EventProcessInfo + * @memberof OpenSeadragon.MouseTracker + * @since v2.5.0 + * + * @property {OpenSeadragon.MouseTracker} eventSource + * A reference to the tracker instance. + * @property {Object} originalEvent + * The original DOM event object. + * @property {Number} eventPhase + * 0 == NONE, 1 == CAPTURING_PHASE, 2 == AT_TARGET, 3 == BUBBLING_PHASE. + * @property {String} eventType + * "keydown", "keyup", "keypress", "focus", "blur", "contextmenu", "gotpointercapture", "lostpointercapture", "pointerenter", "pointerleave", "pointerover", "pointerout", "pointerdown", "pointerup", "pointermove", "pointercancel", "wheel", "click", "dblclick". + * @property {String} pointerType + * "mouse", "touch", "pen", etc. + * @property {Boolean} isEmulated + * True if this is an emulated event. If true, originalEvent is either the event that caused + * the emulated event, a synthetic event object created with values from the actual DOM event, + * or null if no DOM event applies. Emulated events can occur on eventType "wheel" on legacy mouse-scroll + * event emitting user agents. + * @property {Boolean} isStoppable + * True if propagation of the event (e.g. bubbling) can be stopped with stopPropagation/stopImmediatePropagation. + * @property {Boolean} isCancelable + * True if the event's default handling by the browser can be prevented with preventDefault. + * @property {Boolean} defaultPrevented + * True if the event's default handling has already been prevented by a descendent element. + * @property {Boolean} preventDefault + * Set to true to prevent the event's default handling by the browser. + * @property {Boolean} preventGesture + * Set to true to prevent this MouseTracker from generating a gesture from the event. + * Valid on eventType "pointerdown". + * @property {Boolean} stopPropagation + * Set to true prevent the event from propagating to ancestor/descendent elements on capture/bubble phase. + * @property {Boolean} shouldCapture + * (Internal Use) Set to true if the pointer should be captured (events (re)targeted to tracker element). + * @property {Boolean} shouldReleaseCapture + * (Internal Use) Set to true if the captured pointer should be released. + * @property {Object} userData + * Arbitrary user-defined object. + */ + + + /** + * Represents a point of contact on the screen made by a mouse cursor, pen, touch, or other pointer device. + * + * @typedef {Object} GesturePoint + * @memberof OpenSeadragon.MouseTracker + * + * @property {Number} id + * Identifier unique from all other active GesturePoints for a given pointer device. + * @property {String} type + * The pointer device type: "mouse", "touch", "pen", etc. + * @property {Boolean} captured + * True if events for the gesture point are captured to the tracked element. + * @property {Boolean} isPrimary + * True if the gesture point is a master pointer amongst the set of active pointers for each pointer type. True for mouse and primary (first) touch/pen pointers. + * @property {Boolean} insideElementPressed + * True if button pressed or contact point initiated inside the screen area of the tracked element. + * @property {Boolean} insideElement + * True if pointer or contact point is currently inside the bounds of the tracked element. + * @property {Number} speed + * Current computed speed, in pixels per second. + * @property {Number} direction + * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @property {OpenSeadragon.Point} contactPos + * The initial pointer contact position, relative to the page including any scrolling. Only valid if the pointer has contact (pressed, touch contact, pen contact). + * @property {Number} contactTime + * The initial pointer contact time, in milliseconds. Only valid if the pointer has contact (pressed, touch contact, pen contact). + * @property {OpenSeadragon.Point} lastPos + * The last pointer position, relative to the page including any scrolling. + * @property {Number} lastTime + * The last pointer contact time, in milliseconds. + * @property {OpenSeadragon.Point} currentPos + * The current pointer position, relative to the page including any scrolling. + * @property {Number} currentTime + * The current pointer contact time, in milliseconds. + */ + + + /** + * @class GesturePointList + * @classdesc Provides an abstraction for a set of active {@link OpenSeadragon.MouseTracker.GesturePoint|GesturePoint} objects for a given pointer device type. + * Active pointers are any pointer being tracked for this element which are in the hit-test area + * of the element (for hover-capable devices) and/or have contact or a button press initiated in the element. + * @memberof OpenSeadragon.MouseTracker + * @param {String} type - The pointer device type: "mouse", "touch", "pen", etc. + */ + $.MouseTracker.GesturePointList = function ( type ) { + this._gPoints = []; + /** + * The pointer device type: "mouse", "touch", "pen", etc. + * @member {String} type + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.type = type; + /** + * Current buttons pressed for the device. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @member {Number} buttons + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.buttons = 0; + /** + * Current number of contact points (touch points, mouse down, etc.) for the device. + * @member {Number} contacts + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.contacts = 0; + /** + * Current number of clicks for the device. Used for multiple click gesture tracking. + * @member {Number} clicks + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.clicks = 0; + /** + * Current number of captured pointers for the device. + * @member {Number} captureCount + * @memberof OpenSeadragon.MouseTracker.GesturePointList# + */ + this.captureCount = 0; + }; + + /** @lends OpenSeadragon.MouseTracker.GesturePointList.prototype */ + $.MouseTracker.GesturePointList.prototype = { + /** + * @function + * @returns {Number} Number of gesture points in the list. + */ + getLength: function () { + return this._gPoints.length; + }, + /** + * @function + * @returns {Array.} The list of gesture points in the list as an array (read-only). + */ + asArray: function () { + return this._gPoints; + }, + /** + * @function + * @param {OpenSeadragon.MouseTracker.GesturePoint} gesturePoint - A gesture point to add to the list. + * @returns {Number} Number of gesture points in the list. + */ + add: function ( gp ) { + return this._gPoints.push( gp ); + }, + /** + * @function + * @param {Number} id - The id of the gesture point to remove from the list. + * @returns {Number} Number of gesture points in the list. + */ + removeById: function ( id ) { + var i, + len = this._gPoints.length; + for ( i = 0; i < len; i++ ) { + if ( this._gPoints[ i ].id === id ) { + this._gPoints.splice( i, 1 ); + break; + } + } + return this._gPoints.length; + }, + /** + * @function + * @param {Number} index - The index of the gesture point to retrieve from the list. + * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point at the given index, or null if not found. + */ + getByIndex: function ( index ) { + if ( index < this._gPoints.length) { + return this._gPoints[ index ]; + } + + return null; + }, + /** + * @function + * @param {Number} id - The id of the gesture point to retrieve from the list. + * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point with the given id, or null if not found. + */ + getById: function ( id ) { + var i, + len = this._gPoints.length; + for ( i = 0; i < len; i++ ) { + if ( this._gPoints[ i ].id === id ) { + return this._gPoints[ i ]; + } + } + return null; + }, + /** + * @function + * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The primary gesture point in the list, or null if not found. + */ + getPrimary: function ( id ) { + var i, + len = this._gPoints.length; + for ( i = 0; i < len; i++ ) { + if ( this._gPoints[ i ].isPrimary ) { + return this._gPoints[ i ]; + } + } + return null; + }, + + /** + * Increment this pointer list's contact count. + * It will evaluate whether this pointer type is allowed to have multiple contacts. + * @function + */ + addContact: function() { + ++this.contacts; + + if (this.contacts > 1 && (this.type === "mouse" || this.type === "pen")) { + $.console.warn('GesturePointList.addContact() Implausible contacts value'); + this.contacts = 1; + } + }, + + /** + * Decrement this pointer list's contact count. + * It will make sure the count does not go below 0. + * @function + */ + removeContact: function() { + --this.contacts; + + if (this.contacts < 0) { + this.contacts = 0; + } + } + }; + + +/////////////////////////////////////////////////////////////////////////////// +// Utility functions +/////////////////////////////////////////////////////////////////////////////// + + /** + * Removes all tracked pointers. + * @private + * @inner + */ + function clearTrackedPointers( tracker ) { + var delegate = THIS[ tracker.hash ], + i, j, + pointsList, + gPoints, + gPointsToRemove, + pointerListCount = delegate.activePointersLists.length; + + for ( i = 0; i < pointerListCount; i++ ) { + pointsList = delegate.activePointersLists[ i ]; + + if ( pointsList.getLength() > 0 ) { + // Make an array containing references to the gPoints in the pointer list + // (because calls to stopTrackingPointer() are going to modify the pointer list) + gPointsToRemove = []; + gPoints = pointsList.asArray(); + for ( j = 0; j < gPoints.length; j++ ) { + gPointsToRemove.push( gPoints[ j ] ); + } + + // Release and remove all gPoints from the pointer list + for ( j = 0; j < gPointsToRemove.length; j++ ) { + stopTrackingPointer( tracker, pointsList, gPointsToRemove[ j ] ); + } + } + } + + for ( i = 0; i < pointerListCount; i++ ) { + delegate.activePointersLists.pop(); + } + + delegate.sentDragEvent = false; + } + + /** + * Starts tracking pointer events on the tracked element. + * @private + * @inner + */ + function startTracking( tracker ) { + var delegate = THIS[ tracker.hash ], + event, + i; + + if ( !delegate.tracking ) { + for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) { + event = $.MouseTracker.subscribeEvents[ i ]; + $.addEvent( + tracker.element, + event, + delegate[ event ], + event === $.MouseTracker.wheelEventName ? { passive: false, capture: false } : false + ); + } + + clearTrackedPointers( tracker ); + + delegate.tracking = true; + } + } + + /** + * Stops tracking pointer events on the tracked element. + * @private + * @inner + */ + function stopTracking( tracker ) { + var delegate = THIS[ tracker.hash ], + event, + i; + + if ( delegate.tracking ) { + for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) { + event = $.MouseTracker.subscribeEvents[ i ]; + $.removeEvent( + tracker.element, + event, + delegate[ event ], + false + ); + } + + clearTrackedPointers( tracker ); + + delegate.tracking = false; + } + } + + /** + * @private + * @inner + */ + function getCaptureEventParams( tracker, pointerType ) { + var delegate = THIS[ tracker.hash ]; + + if ( pointerType === 'pointerevent' ) { + return { + upName: 'pointerup', + upHandler: delegate.pointerupcaptured, + moveName: 'pointermove', + moveHandler: delegate.pointermovecaptured + }; + } else if ( pointerType === 'mouse' ) { + return { + upName: 'pointerup', + upHandler: delegate.pointerupcaptured, + moveName: 'pointermove', + moveHandler: delegate.pointermovecaptured + }; + } else if ( pointerType === 'touch' ) { + return { + upName: 'touchend', + upHandler: delegate.touchendcaptured, + moveName: 'touchmove', + moveHandler: delegate.touchmovecaptured + }; + } else { + throw new Error( "MouseTracker.getCaptureEventParams: Unknown pointer type." ); + } + } + + /** + * Begin capturing pointer events to the tracked element. + * @private + * @inner + */ + function capturePointer( tracker, gPoint ) { + var eventParams; + + if ( $.MouseTracker.havePointerCapture ) { + if ( $.MouseTracker.havePointerEvents ) { + // Can throw NotFoundError (InvalidPointerId Firefox < 82) + // (should never happen so we'll log a warning) + try { + tracker.element.setPointerCapture( gPoint.id ); + //$.console.log('element.setPointerCapture() called'); + } catch ( e ) { + $.console.warn('setPointerCapture() called on invalid pointer ID'); + return; + } + } else { + tracker.element.setCapture( true ); + //$.console.log('element.setCapture() called'); + } + } else { + // Emulate mouse capture by hanging listeners on the document object. + // (Note we listen on the capture phase so the captured handlers will get called first) + // eslint-disable-next-line no-use-before-define + //$.console.log('Emulated mouse capture set'); + eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : gPoint.type ); + // https://github.com/openseadragon/openseadragon/pull/790 + if (isInIframe && canAccessEvents(window.top)) { + $.addEvent( + window.top, + eventParams.upName, + eventParams.upHandler, + true + ); + } + $.addEvent( + $.MouseTracker.captureElement, + eventParams.upName, + eventParams.upHandler, + true + ); + $.addEvent( + $.MouseTracker.captureElement, + eventParams.moveName, + eventParams.moveHandler, + true + ); + } + + updatePointerCaptured( tracker, gPoint, true ); + } + + + /** + * Stop capturing pointer events to the tracked element. + * @private + * @inner + */ + function releasePointer( tracker, gPoint ) { + var eventParams; + var pointsList; + var cachedGPoint; + + if ( $.MouseTracker.havePointerCapture ) { + if ( $.MouseTracker.havePointerEvents ) { + pointsList = tracker.getActivePointersListByType( gPoint.type ); + cachedGPoint = pointsList.getById( gPoint.id ); + if ( !cachedGPoint || !cachedGPoint.captured ) { + return; + } + // Can throw NotFoundError (InvalidPointerId Firefox < 82) + // (should never happen, but it does on Firefox 79 touch so we won't log a warning) + try { + tracker.element.releasePointerCapture( gPoint.id ); + //$.console.log('element.releasePointerCapture() called'); + } catch ( e ) { + //$.console.warn('releasePointerCapture() called on invalid pointer ID'); + } + } else { + tracker.element.releaseCapture(); + //$.console.log('element.releaseCapture() called'); + } + } else { + // Emulate mouse capture by hanging listeners on the document object. + // (Note we listen on the capture phase so the captured handlers will get called first) + //$.console.log('Emulated mouse capture release'); + eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : gPoint.type ); + // https://github.com/openseadragon/openseadragon/pull/790 + if (isInIframe && canAccessEvents(window.top)) { + $.removeEvent( + window.top, + eventParams.upName, + eventParams.upHandler, + true + ); + } + $.removeEvent( + $.MouseTracker.captureElement, + eventParams.moveName, + eventParams.moveHandler, + true + ); + $.removeEvent( + $.MouseTracker.captureElement, + eventParams.upName, + eventParams.upHandler, + true + ); + } + + updatePointerCaptured( tracker, gPoint, false ); + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * @private + * @inner + */ + function getPointerId( event ) { + return ( $.MouseTracker.havePointerEvents ) ? event.pointerId : $.MouseTracker.mousePointerId; + } + + + /** + * Gets a W3C Pointer Events model compatible pointer type string from a DOM pointer event. + * IE10 used a long integer value, but the W3C specification (and IE11+) use a string "mouse", "touch", "pen", etc. + * + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * @private + * @inner + */ + function getPointerType( event ) { + if ( $.MouseTracker.havePointerEvents ) { + // Note: IE pointer events bug - sends invalid pointerType on lostpointercapture events + // and possibly other events. We rely on sane, valid property values in DOM events, so for + // IE, when the pointerType is missing, we'll default to 'mouse'...should be right most of the time + return event.pointerType || (( $.Browser.vendor === $.BROWSERS.IE ) ? 'mouse' : ''); + } else { + return 'mouse'; + } + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * @private + * @inner + */ + function getIsPrimary( event ) { + return ( $.MouseTracker.havePointerEvents ) ? event.isPrimary : true; + } + + + /** + * @private + * @inner + */ + function getMouseAbsolute( event ) { + return $.getMousePosition( event ); + } + + /** + * @private + * @inner + */ + function getMouseRelative( event, element ) { + return getPointRelativeToAbsolute( getMouseAbsolute( event ), element ); + } + + /** + * @private + * @inner + */ + function getPointRelativeToAbsolute( point, element ) { + var offset = $.getElementOffset( element ); + return point.minus( offset ); + } + + /** + * @private + * @inner + */ + function getCenterPoint( point1, point2 ) { + return new $.Point( ( point1.x + point2.x ) / 2, ( point1.y + point2.y ) / 2 ); + } + + +/////////////////////////////////////////////////////////////////////////////// +// Device-specific DOM event handlers +/////////////////////////////////////////////////////////////////////////////// + + /** + * @private + * @inner + */ + function onClick( tracker, event ) { + //$.console.log('click ' + (tracker.userData ? tracker.userData.toString() : '')); + + var eventInfo = { + originalEvent: event, + eventType: 'click', + pointerType: 'mouse', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onDblClick( tracker, event ) { + //$.console.log('dblclick ' + (tracker.userData ? tracker.userData.toString() : '')); + + var eventInfo = { + originalEvent: event, + eventType: 'dblclick', + pointerType: 'mouse', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onKeyDown( tracker, event ) { + //$.console.log( "keydown %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); + var eventArgs = null; + + var eventInfo = { + originalEvent: event, + eventType: 'keydown', + pointerType: '', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( tracker.keyDownHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + eventArgs = { + eventSource: tracker, + keyCode: event.keyCode ? event.keyCode : event.charCode, + ctrl: event.ctrlKey, + shift: event.shiftKey, + alt: event.altKey, + meta: event.metaKey, + originalEvent: event, + preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented, + userData: tracker.userData + }; + + tracker.keyDownHandler( eventArgs ); + } + + if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onKeyUp( tracker, event ) { + //$.console.log( "keyup %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); + + var eventArgs = null; + + var eventInfo = { + originalEvent: event, + eventType: 'keyup', + pointerType: '', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( tracker.keyUpHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + eventArgs = { + eventSource: tracker, + keyCode: event.keyCode ? event.keyCode : event.charCode, + ctrl: event.ctrlKey, + shift: event.shiftKey, + alt: event.altKey, + meta: event.metaKey, + originalEvent: event, + preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented, + userData: tracker.userData + }; + + tracker.keyUpHandler( eventArgs ); + } + + if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onKeyPress( tracker, event ) { + //$.console.log( "keypress %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey ); + + var eventArgs = null; + + var eventInfo = { + originalEvent: event, + eventType: 'keypress', + pointerType: '', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( tracker.keyHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + eventArgs = { + eventSource: tracker, + keyCode: event.keyCode ? event.keyCode : event.charCode, + ctrl: event.ctrlKey, + shift: event.shiftKey, + alt: event.altKey, + meta: event.metaKey, + originalEvent: event, + preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented, + userData: tracker.userData + }; + + tracker.keyHandler( eventArgs ); + } + + if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onFocus( tracker, event ) { + //$.console.log('focus ' + (tracker.userData ? tracker.userData.toString() : '')); + + // focus doesn't bubble and is not cancelable, but we call + // preProcessEvent() so it's dispatched to preProcessEventHandler + // if necessary + var eventInfo = { + originalEvent: event, + eventType: 'focus', + pointerType: '', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( tracker.focusHandler && !eventInfo.preventGesture ) { + tracker.focusHandler( + { + eventSource: tracker, + originalEvent: event, + userData: tracker.userData + } + ); + } + } + + + /** + * @private + * @inner + */ + function onBlur( tracker, event ) { + //$.console.log('blur ' + (tracker.userData ? tracker.userData.toString() : '')); + + // blur doesn't bubble and is not cancelable, but we call + // preProcessEvent() so it's dispatched to preProcessEventHandler + // if necessary + var eventInfo = { + originalEvent: event, + eventType: 'blur', + pointerType: '', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( tracker.blurHandler && !eventInfo.preventGesture ) { + tracker.blurHandler( + { + eventSource: tracker, + originalEvent: event, + userData: tracker.userData + } + ); + } + } + + + /** + * @private + * @inner + */ + function onContextMenu( tracker, event ) { + //$.console.log('contextmenu ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var eventArgs = null; + + var eventInfo = { + originalEvent: event, + eventType: 'contextmenu', + pointerType: 'mouse', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + // ContextMenu + if ( tracker.contextMenuHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + eventArgs = { + eventSource: tracker, + position: getPointRelativeToAbsolute( getMouseAbsolute( event ), tracker.element ), + originalEvent: eventInfo.originalEvent, + preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented, + userData: tracker.userData + }; + + tracker.contextMenuHandler( eventArgs ); + } + + if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * Handler for 'wheel' events + * + * @private + * @inner + */ + function onWheel( tracker, event ) { + handleWheelEvent( tracker, event, event ); + } + + + /** + * Handler for 'mousewheel', 'DOMMouseScroll', and 'MozMousePixelScroll' events + * + * @private + * @inner + */ + function onMouseWheel( tracker, event ) { + // Simulate a 'wheel' event + var simulatedEvent = { + target: event.target || event.srcElement, + type: "wheel", + shiftKey: event.shiftKey || false, + clientX: event.clientX, + clientY: event.clientY, + pageX: event.pageX ? event.pageX : event.clientX, + pageY: event.pageY ? event.pageY : event.clientY, + deltaMode: event.type === "MozMousePixelScroll" ? 0 : 1, // 0=pixel, 1=line, 2=page + deltaX: 0, + deltaZ: 0 + }; + + // Calculate deltaY + if ( $.MouseTracker.wheelEventName === "mousewheel" ) { + simulatedEvent.deltaY = -event.wheelDelta / $.DEFAULT_SETTINGS.pixelsPerWheelLine; + } else { + simulatedEvent.deltaY = event.detail; + } + + handleWheelEvent( tracker, simulatedEvent, event ); + } + + + /** + * Handles 'wheel' events. + * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()). + * + * @private + * @inner + */ + function handleWheelEvent( tracker, event, originalEvent ) { + var nDelta = 0, + eventInfo; + + var eventArgs = null; + + // The nDelta variable is gated to provide smooth z-index scrolling + // since the mouse wheel allows for substantial deltas meant for rapid + // y-index scrolling. + // event.deltaMode: 0=pixel, 1=line, 2=page + // TODO: Deltas in pixel mode should be accumulated then a scroll value computed after $.DEFAULT_SETTINGS.pixelsPerWheelLine threshold reached + nDelta = event.deltaY < 0 ? 1 : -1; + + eventInfo = { + originalEvent: event, + eventType: 'wheel', + pointerType: 'mouse', + isEmulated: event !== originalEvent + }; + preProcessEvent( tracker, eventInfo ); + + if ( tracker.scrollHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + eventArgs = { + eventSource: tracker, + pointerType: 'mouse', + position: getMouseRelative( event, tracker.element ), + scroll: nDelta, + shift: event.shiftKey, + isTouchEvent: false, + originalEvent: originalEvent, + preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented, + userData: tracker.userData + }; + + + tracker.scrollHandler( eventArgs ); + } + + if ( eventInfo.stopPropagation ) { + $.stopEvent( originalEvent ); + } + if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) { + $.cancelEvent( originalEvent ); + } +} + + + /** + * TODO Never actually seen this event fired, and documentation is tough to find + * @private + * @inner + */ + function onLoseCapture( tracker, event ) { + //$.console.log('losecapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var gPoint = { + id: $.MouseTracker.mousePointerId, + type: 'mouse' + }; + + var eventInfo = { + originalEvent: event, + eventType: 'lostpointercapture', + pointerType: 'mouse', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( event.target === tracker.element ) { + updatePointerCaptured( tracker, gPoint, false ); + } + + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onTouchStart( tracker, event ) { + var time, + i, + touchCount = event.changedTouches.length, + gPoint, + pointsList = tracker.getActivePointersListByType( 'touch' ); + + time = $.now(); + + //$.console.log('touchstart ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + if ( pointsList.getLength() > event.touches.length - touchCount ) { + $.console.warn('Tracked touch contact count doesn\'t match event.touches.length'); + } + + var eventInfo = { + originalEvent: event, + eventType: 'pointerdown', + pointerType: 'touch', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + for ( i = 0; i < touchCount; i++ ) { + gPoint = { + id: event.changedTouches[ i ].identifier, + type: 'touch', + // Simulate isPrimary + isPrimary: pointsList.getLength() === 0, + currentPos: getMouseAbsolute( event.changedTouches[ i ] ), + currentTime: time + }; + + // simulate touchenter on our tracked element + updatePointerEnter( tracker, eventInfo, gPoint ); + + updatePointerDown( tracker, eventInfo, gPoint, 0 ); + + updatePointerCaptured( tracker, gPoint, true ); + } + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onTouchEnd( tracker, event ) { + var time, + i, + touchCount = event.changedTouches.length, + gPoint; + + time = $.now(); + + //$.console.log('touchend ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var eventInfo = { + originalEvent: event, + eventType: 'pointerup', + pointerType: 'touch', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + for ( i = 0; i < touchCount; i++ ) { + gPoint = { + id: event.changedTouches[ i ].identifier, + type: 'touch', + currentPos: getMouseAbsolute( event.changedTouches[ i ] ), + currentTime: time + }; + + updatePointerUp( tracker, eventInfo, gPoint, 0 ); + + updatePointerCaptured( tracker, gPoint, false ); + + // simulate touchleave on our tracked element + updatePointerLeave( tracker, eventInfo, gPoint ); + } + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onTouchMove( tracker, event ) { + var time, + i, + touchCount = event.changedTouches.length, + gPoint; + + time = $.now(); + + var eventInfo = { + originalEvent: event, + eventType: 'pointermove', + pointerType: 'touch', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + for ( i = 0; i < touchCount; i++ ) { + gPoint = { + id: event.changedTouches[ i ].identifier, + type: 'touch', + currentPos: getMouseAbsolute( event.changedTouches[ i ] ), + currentTime: time + }; + + updatePointerMove( tracker, eventInfo, gPoint ); + } + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onTouchCancel( tracker, event ) { + var touchCount = event.changedTouches.length, + i, + gPoint; + + //$.console.log('touchcancel ' + (tracker.userData ? tracker.userData.toString() : '')); + + var eventInfo = { + originalEvent: event, + eventType: 'pointercancel', + pointerType: 'touch', + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + for ( i = 0; i < touchCount; i++ ) { + gPoint = { + id: event.changedTouches[ i ].identifier, + type: 'touch' + }; + + //TODO need to only do this if our element is target? + updatePointerCancel( tracker, eventInfo, gPoint ); + } + + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onGestureStart( tracker, event ) { + if ( !$.eventIsCanceled( event ) ) { + event.preventDefault(); + } + return false; + } + + + /** + * @private + * @inner + */ + function onGestureChange( tracker, event ) { + if ( !$.eventIsCanceled( event ) ) { + event.preventDefault(); + } + return false; + } + + + /** + * @private + * @inner + */ + function onGotPointerCapture( tracker, event ) { + //$.console.log('gotpointercapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var eventInfo = { + originalEvent: event, + eventType: 'gotpointercapture', + pointerType: getPointerType( event ), + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( event.target === tracker.element ) { + //$.console.log('gotpointercapture ' + (tracker.userData ? tracker.userData.toString() : '')); + updatePointerCaptured( tracker, { + id: event.pointerId, + type: getPointerType( event ) + }, true ); + } + + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onLostPointerCapture( tracker, event ) { + //$.console.log('lostpointercapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var eventInfo = { + originalEvent: event, + eventType: 'lostpointercapture', + pointerType: getPointerType( event ), + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + if ( event.target === tracker.element ) { + //$.console.log('lostpointercapture ' + (tracker.userData ? tracker.userData.toString() : '')); + updatePointerCaptured( tracker, { + id: event.pointerId, + type: getPointerType( event ) + }, false ); + } + + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function onPointerEnter( tracker, event ) { + //$.console.log('pointerenter ' + (tracker.userData ? tracker.userData.toString() : '')); + + var gPoint = { + id: getPointerId( event ), + type: getPointerType( event ), + isPrimary: getIsPrimary( event ), + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + // pointerenter doesn't bubble and is not cancelable, but we call + // preProcessEvent() so it's dispatched to preProcessEventHandler + // if necessary + var eventInfo = { + originalEvent: event, + eventType: 'pointerenter', + pointerType: gPoint.type, + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + updatePointerEnter( tracker, eventInfo, gPoint ); + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function onPointerLeave( tracker, event ) { + //$.console.log('pointerleave ' + (tracker.userData ? tracker.userData.toString() : '')); + + var gPoint = { + id: getPointerId( event ), + type: getPointerType( event ), + isPrimary: getIsPrimary( event ), + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + // pointerleave doesn't bubble and is not cancelable, but we call + // preProcessEvent() so it's dispatched to preProcessEventHandler + // if necessary + var eventInfo = { + originalEvent: event, + eventType: 'pointerleave', + pointerType: gPoint.type, + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + updatePointerLeave( tracker, eventInfo, gPoint ); + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function onPointerOver( tracker, event ) { + //$.console.log('pointerover ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var gPoint = { + id: getPointerId( event ), + type: getPointerType( event ), + isPrimary: getIsPrimary( event ), + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + var eventInfo = { + originalEvent: event, + eventType: 'pointerover', + pointerType: gPoint.type, + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + updatePointerOver( tracker, eventInfo, gPoint ); + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function onPointerOut( tracker, event ) { + //$.console.log('pointerout ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var gPoint = { + id: getPointerId( event ), + type: getPointerType( event ), + isPrimary: getIsPrimary( event ), + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + var eventInfo = { + originalEvent: event, + eventType: 'pointerout', + pointerType: gPoint.type, + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + updatePointerOut( tracker, eventInfo, gPoint ); + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function onPointerDown( tracker, event ) { + var gPoint = { + id: getPointerId( event ), + type: getPointerType( event ), + isPrimary: getIsPrimary( event ), + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + // Most browsers implicitly capture touch pointer events + // Note no IE versions have element.hasPointerCapture() so no implicit + // pointer capture possible + // var implicitlyCaptured = ($.MouseTracker.havePointerEvents && + // event.target.hasPointerCapture && + // $.Browser.vendor !== $.BROWSERS.IE) ? + // event.target.hasPointerCapture(event.pointerId) : false; + var implicitlyCaptured = $.MouseTracker.havePointerEvents && + gPoint.type === 'touch' && + $.Browser.vendor !== $.BROWSERS.IE; + + //$.console.log('pointerdown ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var eventInfo = { + originalEvent: event, + eventType: 'pointerdown', + pointerType: gPoint.type, + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + updatePointerDown( tracker, eventInfo, gPoint, event.button ); + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + if ( eventInfo.shouldCapture ) { + if ( implicitlyCaptured ) { + updatePointerCaptured( tracker, gPoint, true ); + } else { + capturePointer( tracker, gPoint ); + } + } + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function onPointerUp( tracker, event ) { + handlePointerUp( tracker, event ); + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * This handler is attached to the window object (on the capture phase) to emulate mouse capture. + * onPointerUp is still attached to the tracked element, so stop propagation to avoid processing twice. + * + * @private + * @inner + */ + function onPointerUpCaptured( tracker, event ) { + var pointsList = tracker.getActivePointersListByType( getPointerType( event ) ); + if ( pointsList.getById( event.pointerId ) ) { + handlePointerUp( tracker, event ); + } + $.stopEvent( event ); + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function handlePointerUp( tracker, event ) { + var gPoint; + + //$.console.log('pointerup ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + gPoint = { + id: getPointerId( event ), + type: getPointerType( event ), + isPrimary: getIsPrimary( event ), + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + var eventInfo = { + originalEvent: event, + eventType: 'pointerup', + pointerType: gPoint.type, + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + updatePointerUp( tracker, eventInfo, gPoint, event.button ); + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + + // Per spec, pointerup events are supposed to release capture. Not all browser + // versions have adhered to the spec, and there's no harm in releasing + // explicitly + if ( eventInfo.shouldReleaseCapture ) { + if ( event.target === tracker.element ) { + releasePointer( tracker, gPoint ); + } else { + updatePointerCaptured( tracker, gPoint, false ); + } + } + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function onPointerMove( tracker, event ) { + handlePointerMove( tracker, event ); + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * This handler is attached to the window object (on the capture phase) to emulate mouse capture. + * onPointerMove is still attached to the tracked element, so stop propagation to avoid processing twice. + * + * @private + * @inner + */ + function onPointerMoveCaptured( tracker, event ) { + var pointsList = tracker.getActivePointersListByType( getPointerType( event ) ); + if ( pointsList.getById( event.pointerId ) ) { + handlePointerMove( tracker, event ); + } + $.stopEvent( event ); + } + + + /** + * Note: Called for both pointer events and legacy mouse events + * ($.MouseTracker.havePointerEvents determines which) + * + * @private + * @inner + */ + function handlePointerMove( tracker, event ) { + // Pointer changed coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height) + + var gPoint = { + id: getPointerId( event ), + type: getPointerType( event ), + isPrimary: getIsPrimary( event ), + currentPos: getMouseAbsolute( event ), + currentTime: $.now() + }; + + var eventInfo = { + originalEvent: event, + eventType: 'pointermove', + pointerType: gPoint.type, + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + updatePointerMove( tracker, eventInfo, gPoint ); + + if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) { + $.cancelEvent( event ); + } + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + + /** + * @private + * @inner + */ + function onPointerCancel( tracker, event ) { + //$.console.log('pointercancel ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : '')); + + var gPoint = { + id: event.pointerId, + type: getPointerType( event ) + }; + + var eventInfo = { + originalEvent: event, + eventType: 'pointercancel', + pointerType: gPoint.type, + isEmulated: false + }; + preProcessEvent( tracker, eventInfo ); + + //TODO need to only do this if our element is target? + updatePointerCancel( tracker, eventInfo, gPoint ); + + if ( eventInfo.stopPropagation ) { + $.stopEvent( event ); + } + } + + +/////////////////////////////////////////////////////////////////////////////// +// Device-agnostic DOM event handlers +/////////////////////////////////////////////////////////////////////////////// + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList + * The GesturePointList to track the pointer in. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point to track. + * @returns {Number} Number of gesture points in pointsList. + */ + function startTrackingPointer( pointsList, gPoint ) { + //$.console.log('startTrackingPointer *** ' + pointsList.type + ' ' + gPoint.id.toString()); + gPoint.speed = 0; + gPoint.direction = 0; + gPoint.contactPos = gPoint.currentPos; + gPoint.contactTime = gPoint.currentTime; + gPoint.lastPos = gPoint.currentPos; + gPoint.lastTime = gPoint.currentTime; + + return pointsList.add( gPoint ); + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList + * The GesturePointList to stop tracking the pointer on. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point to stop tracking. + * @returns {Number} Number of gesture points in pointsList. + */ + function stopTrackingPointer( tracker, pointsList, gPoint ) { + //$.console.log('stopTrackingPointer *** ' + pointsList.type + ' ' + gPoint.id.toString()); + var listLength; + + var trackedGPoint = pointsList.getById( gPoint.id ); + + if ( trackedGPoint ) { + if ( trackedGPoint.captured ) { + $.console.warn('stopTrackingPointer() called on captured pointer'); + releasePointer( tracker, trackedGPoint ); + } + + // If child element relinquishes capture to a parent we may get here + // from a pointerleave event while a pointerup event will never be received. + // In that case, we'll clean up the contact count + pointsList.removeContact(); + + listLength = pointsList.removeById( gPoint.id ); + } else { + listLength = pointsList.getLength(); + } + + return listLength; + } + + + /** + * @function + * @private + * @inner + */ + function getEventProcessDefaults( tracker, eventInfo ) { + switch ( eventInfo.eventType ) { + case 'pointermove': + eventInfo.isStoppable = true; + eventInfo.isCancelable = true; + eventInfo.preventDefault = false; + eventInfo.preventGesture = !tracker.hasGestureHandlers; + eventInfo.stopPropagation = false; + break; + case 'pointerover': + case 'pointerout': + case 'contextmenu': + case 'keydown': + case 'keyup': + case 'keypress': + eventInfo.isStoppable = true; + eventInfo.isCancelable = true; + eventInfo.preventDefault = false; // onContextMenu(), onKeyDown(), onKeyUp(), onKeyPress() may set true + eventInfo.preventGesture = false; + eventInfo.stopPropagation = false; + break; + case 'pointerdown': + eventInfo.isStoppable = true; + eventInfo.isCancelable = true; + eventInfo.preventDefault = false; // updatePointerDown() may set true (tracker.hasGestureHandlers) + eventInfo.preventGesture = !tracker.hasGestureHandlers; + eventInfo.stopPropagation = false; + break; + case 'pointerup': + eventInfo.isStoppable = true; + eventInfo.isCancelable = true; + eventInfo.preventDefault = false; + eventInfo.preventGesture = !tracker.hasGestureHandlers; + eventInfo.stopPropagation = false; + break; + case 'wheel': + eventInfo.isStoppable = true; + eventInfo.isCancelable = true; + eventInfo.preventDefault = false; // handleWheelEvent() may set true + eventInfo.preventGesture = !tracker.hasScrollHandler; + eventInfo.stopPropagation = false; + break; + case 'gotpointercapture': + case 'lostpointercapture': + case 'pointercancel': + eventInfo.isStoppable = true; + eventInfo.isCancelable = false; + eventInfo.preventDefault = false; + eventInfo.preventGesture = false; + eventInfo.stopPropagation = false; + break; + case 'click': + eventInfo.isStoppable = true; + eventInfo.isCancelable = true; + eventInfo.preventDefault = !!tracker.clickHandler; + eventInfo.preventGesture = false; + eventInfo.stopPropagation = false; + break; + case 'dblclick': + eventInfo.isStoppable = true; + eventInfo.isCancelable = true; + eventInfo.preventDefault = !!tracker.dblClickHandler; + eventInfo.preventGesture = false; + eventInfo.stopPropagation = false; + break; + case 'focus': + case 'blur': + case 'pointerenter': + case 'pointerleave': + default: + eventInfo.isStoppable = false; + eventInfo.isCancelable = false; + eventInfo.preventDefault = false; + eventInfo.preventGesture = false; + eventInfo.stopPropagation = false; + break; + } + } + + + /** + * Sets up for and calls preProcessEventHandler. Call with the following parameters - + * this function will fill in the rest of the preProcessEventHandler event object + * properties + * + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * @param {Object} eventInfo.originalEvent + * @param {String} eventInfo.eventType + * @param {String} eventInfo.pointerType + * @param {Boolean} eventInfo.isEmulated + */ + function preProcessEvent( tracker, eventInfo ) { + eventInfo.eventSource = tracker; + eventInfo.eventPhase = eventInfo.originalEvent ? + ((typeof eventInfo.originalEvent.eventPhase !== 'undefined') ? + eventInfo.originalEvent.eventPhase : 0) : 0; + eventInfo.defaultPrevented = $.eventIsCanceled( eventInfo.originalEvent ); + eventInfo.shouldCapture = false; + eventInfo.shouldReleaseCapture = false; + eventInfo.userData = tracker.userData; + + getEventProcessDefaults( tracker, eventInfo ); + + if ( tracker.preProcessEventHandler ) { + tracker.preProcessEventHandler( eventInfo ); + } + } + + + /** + * Sets or resets the captured property on the tracked pointer matching the passed gPoint's id/type + * + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {Object} gPoint + * An object with id and type properties describing the pointer to update. + * @param {Boolean} isCaptured + * Value to set the captured property to. + */ + function updatePointerCaptured( tracker, gPoint, isCaptured ) { + var pointsList = tracker.getActivePointersListByType( gPoint.type ); + var updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + if ( isCaptured && !updateGPoint.captured ) { + updateGPoint.captured = true; + pointsList.captureCount++; + } else if ( !isCaptured && updateGPoint.captured ) { + updateGPoint.captured = false; + pointsList.captureCount--; + if ( pointsList.captureCount < 0 ) { + pointsList.captureCount = 0; + $.console.warn('updatePointerCaptured() - pointsList.captureCount went negative'); + } + } + } else { + $.console.warn('updatePointerCaptured() called on untracked pointer'); + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * Processing info for originating DOM event. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point associated with the event. + */ + function updatePointerEnter( tracker, eventInfo, gPoint ) { + var pointsList = tracker.getActivePointersListByType( gPoint.type ), + updateGPoint; + + updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + // Already tracking the pointer...update it + updateGPoint.insideElement = true; + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = gPoint.currentPos; + updateGPoint.currentTime = gPoint.currentTime; + + gPoint = updateGPoint; + } else { + // Initialize for tracking and add to the tracking list + gPoint.captured = false; // Handled by updatePointerCaptured() + gPoint.insideElementPressed = false; + gPoint.insideElement = true; + startTrackingPointer( pointsList, gPoint ); + } + + // Enter (doesn't bubble and not cancelable) + if ( tracker.enterHandler ) { + tracker.enterHandler( + { + eventSource: tracker, + pointerType: gPoint.type, + position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + pointers: tracker.getActivePointerCount(), + insideElementPressed: gPoint.insideElementPressed, + buttonDownAny: pointsList.buttons !== 0, + isTouchEvent: gPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * Processing info for originating DOM event. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point associated with the event. + */ + function updatePointerLeave( tracker, eventInfo, gPoint ) { + var pointsList = tracker.getActivePointersListByType(gPoint.type), + updateGPoint, + dispatchEventObj; + + updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + // Already tracking the pointer. If captured then update it, else stop tracking it + if ( updateGPoint.captured ) { + updateGPoint.insideElement = false; + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = gPoint.currentPos; + updateGPoint.currentTime = gPoint.currentTime; + } else { + stopTrackingPointer( tracker, pointsList, updateGPoint ); + } + + gPoint = updateGPoint; + } else { + gPoint.captured = false; // Handled by updatePointerCaptured() + gPoint.insideElementPressed = false; + } + + // Leave (doesn't bubble and not cancelable) + // Note: exitHandler is deprecated (v2.5.0), replaced by leaveHandler + if ( tracker.leaveHandler || tracker.exitHandler ) { + dispatchEventObj = { + eventSource: tracker, + pointerType: gPoint.type, + // GitHub PR: https://github.com/openseadragon/openseadragon/pull/1754 (gPoint.currentPos && ) + position: gPoint.currentPos && getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + pointers: tracker.getActivePointerCount(), + insideElementPressed: gPoint.insideElementPressed, + buttonDownAny: pointsList.buttons !== 0, + isTouchEvent: gPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + }; + + if ( tracker.leaveHandler ) { + tracker.leaveHandler( dispatchEventObj ); + } + // Deprecated + if ( tracker.exitHandler ) { + tracker.exitHandler( dispatchEventObj ); + } + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * Processing info for originating DOM event. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point associated with the event. + */ + function updatePointerOver( tracker, eventInfo, gPoint ) { + var pointsList, + updateGPoint; + + pointsList = tracker.getActivePointersListByType( gPoint.type ); + + updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + gPoint = updateGPoint; + } else { + gPoint.captured = false; + gPoint.insideElementPressed = false; + //gPoint.insideElement = true; // Tracked by updatePointerEnter + } + + if ( tracker.overHandler ) { + // Over + tracker.overHandler( + { + eventSource: tracker, + pointerType: gPoint.type, + position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + pointers: tracker.getActivePointerCount(), + insideElementPressed: gPoint.insideElementPressed, + buttonDownAny: pointsList.buttons !== 0, + isTouchEvent: gPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + } + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * Processing info for originating DOM event. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point associated with the event. + */ + function updatePointerOut( tracker, eventInfo, gPoint ) { + var pointsList, + updateGPoint; + + pointsList = tracker.getActivePointersListByType(gPoint.type); + + updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + gPoint = updateGPoint; + } else { + gPoint.captured = false; + gPoint.insideElementPressed = false; + //gPoint.insideElement = true; // Tracked by updatePointerEnter + } + + if ( tracker.outHandler ) { + // Out + tracker.outHandler( { + eventSource: tracker, + pointerType: gPoint.type, + position: gPoint.currentPos && getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + pointers: tracker.getActivePointerCount(), + insideElementPressed: gPoint.insideElementPressed, + buttonDownAny: pointsList.buttons !== 0, + isTouchEvent: gPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } ); + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * Processing info for originating DOM event. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture point associated with the event. + * @param {Number} buttonChanged + * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model, + * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events. + */ + function updatePointerDown( tracker, eventInfo, gPoint, buttonChanged ) { + var delegate = THIS[ tracker.hash ], + pointsList = tracker.getActivePointersListByType( gPoint.type ), + updateGPoint; + + if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) { + pointsList.buttons = eventInfo.originalEvent.buttons; + } else { + if ( buttonChanged === 0 ) { + // Primary + pointsList.buttons |= 1; + } else if ( buttonChanged === 1 ) { + // Aux + pointsList.buttons |= 4; + } else if ( buttonChanged === 2 ) { + // Secondary + pointsList.buttons |= 2; + } else if ( buttonChanged === 3 ) { + // X1 (Back) + pointsList.buttons |= 8; + } else if ( buttonChanged === 4 ) { + // X2 (Forward) + pointsList.buttons |= 16; + } else if ( buttonChanged === 5 ) { + // Pen Eraser + pointsList.buttons |= 32; + } + } + + // Only capture and track primary button, pen, and touch contacts + if ( buttonChanged !== 0 ) { + eventInfo.shouldCapture = false; + eventInfo.shouldReleaseCapture = false; + + // Aux Press + if ( tracker.nonPrimaryPressHandler && + !eventInfo.preventGesture && + !eventInfo.defaultPrevented ) { + eventInfo.preventDefault = true; + + tracker.nonPrimaryPressHandler( + { + eventSource: tracker, + pointerType: gPoint.type, + position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ), + button: buttonChanged, + buttons: pointsList.buttons, + isTouchEvent: gPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + + return; + } + + updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + // Already tracking the pointer...update it + //updateGPoint.captured = true; // Handled by updatePointerCaptured() + updateGPoint.insideElementPressed = true; + updateGPoint.insideElement = true; + updateGPoint.originalTarget = eventInfo.originalEvent.target; + updateGPoint.contactPos = gPoint.currentPos; + updateGPoint.contactTime = gPoint.currentTime; + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = gPoint.currentPos; + updateGPoint.currentTime = gPoint.currentTime; + + gPoint = updateGPoint; + } else { + // Initialize for tracking and add to the tracking list (no pointerenter event occurred before this) + // NOTE: pointerdown event on untracked pointer + gPoint.captured = false; // Handled by updatePointerCaptured() + gPoint.insideElementPressed = true; + gPoint.insideElement = true; + gPoint.originalTarget = eventInfo.originalEvent.target; + startTrackingPointer( pointsList, gPoint ); + } + + pointsList.addContact(); + //$.console.log('contacts++ ', pointsList.contacts); + + if ( !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + eventInfo.shouldCapture = true; + eventInfo.shouldReleaseCapture = false; + eventInfo.preventDefault = true; + + if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) { + $.MouseTracker.gesturePointVelocityTracker.addPoint( tracker, gPoint ); + } + + if ( pointsList.contacts === 1 ) { + // Press + if ( tracker.pressHandler && !eventInfo.preventGesture ) { + tracker.pressHandler( + { + eventSource: tracker, + pointerType: gPoint.type, + position: getPointRelativeToAbsolute( gPoint.contactPos, tracker.element ), + buttons: pointsList.buttons, + isTouchEvent: gPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + } else if ( pointsList.contacts === 2 ) { + if ( tracker.pinchHandler && gPoint.type === 'touch' ) { + // Initialize for pinch + delegate.pinchGPoints = pointsList.asArray(); + delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos ); + delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos ); + } + } + } else { + eventInfo.shouldCapture = false; + eventInfo.shouldReleaseCapture = false; + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * Processing info for originating DOM event. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture points associated with the event. + * @param {Number} buttonChanged + * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model, + * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events. + */ + function updatePointerUp( tracker, eventInfo, gPoint, buttonChanged ) { + var delegate = THIS[ tracker.hash ], + pointsList = tracker.getActivePointersListByType( gPoint.type ), + releasePoint, + releaseTime, + updateGPoint, + wasCaptured = false, + quick; + + if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) { + pointsList.buttons = eventInfo.originalEvent.buttons; + } else { + if ( buttonChanged === 0 ) { + // Primary + pointsList.buttons ^= ~1; + } else if ( buttonChanged === 1 ) { + // Aux + pointsList.buttons ^= ~4; + } else if ( buttonChanged === 2 ) { + // Secondary + pointsList.buttons ^= ~2; + } else if ( buttonChanged === 3 ) { + // X1 (Back) + pointsList.buttons ^= ~8; + } else if ( buttonChanged === 4 ) { + // X2 (Forward) + pointsList.buttons ^= ~16; + } else if ( buttonChanged === 5 ) { + // Pen Eraser + pointsList.buttons ^= ~32; + } + } + + eventInfo.shouldCapture = false; + + // Only capture and track primary button, pen, and touch contacts + if ( buttonChanged !== 0 ) { + eventInfo.shouldReleaseCapture = false; + + // Aux Release + if ( tracker.nonPrimaryReleaseHandler && + !eventInfo.preventGesture && + !eventInfo.defaultPrevented ) { + eventInfo.preventDefault = true; + + tracker.nonPrimaryReleaseHandler( + { + eventSource: tracker, + pointerType: gPoint.type, + position: getPointRelativeToAbsolute(gPoint.currentPos, tracker.element), + button: buttonChanged, + buttons: pointsList.buttons, + isTouchEvent: gPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + + return; + } + + updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + pointsList.removeContact(); + //$.console.log('contacts-- ', pointsList.contacts); + + // Update the pointer, stop tracking it if not still in this element + if ( updateGPoint.captured ) { + //updateGPoint.captured = false; // Handled by updatePointerCaptured() + wasCaptured = true; + } + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = gPoint.currentPos; + updateGPoint.currentTime = gPoint.currentTime; + if ( !updateGPoint.insideElement ) { + stopTrackingPointer( tracker, pointsList, updateGPoint ); + } + + releasePoint = updateGPoint.currentPos; + releaseTime = updateGPoint.currentTime; + } else { + // NOTE: updatePointerUp(): pointerup on untracked gPoint + // ...we'll start to track pointer again + gPoint.captured = false; // Handled by updatePointerCaptured() + gPoint.insideElementPressed = false; + gPoint.insideElement = true; + startTrackingPointer( pointsList, gPoint ); + + updateGPoint = gPoint; + } + + if ( !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + if ( wasCaptured ) { + // Pointer was activated in our element but could have been removed in any element since events are captured to our element + + eventInfo.shouldReleaseCapture = true; + eventInfo.preventDefault = true; + + if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) { + $.MouseTracker.gesturePointVelocityTracker.removePoint( tracker, updateGPoint ); + } + + if ( pointsList.contacts === 0 ) { + + // Release (pressed in our element) + if ( tracker.releaseHandler && releasePoint ) { + tracker.releaseHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( releasePoint, tracker.element ), + buttons: pointsList.buttons, + insideElementPressed: updateGPoint.insideElementPressed, + insideElementReleased: updateGPoint.insideElement, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + + // Drag End + if ( tracker.dragEndHandler && delegate.sentDragEvent ) { + tracker.dragEndHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + speed: updateGPoint.speed, + direction: updateGPoint.direction, + shift: eventInfo.originalEvent.shiftKey, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + + // We want to clear this flag regardless of whether we fired the dragEndHandler + delegate.sentDragEvent = false; + + // Click / Double-Click + if ( ( tracker.clickHandler || tracker.dblClickHandler ) && updateGPoint.insideElement ) { + quick = releaseTime - updateGPoint.contactTime <= tracker.clickTimeThreshold && + updateGPoint.contactPos.distanceTo( releasePoint ) <= tracker.clickDistThreshold; + + // Click + if ( tracker.clickHandler ) { + tracker.clickHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + quick: quick, + shift: eventInfo.originalEvent.shiftKey, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + originalTarget: updateGPoint.originalTarget, + userData: tracker.userData + } + ); + } + + // Double-Click + if ( tracker.dblClickHandler && quick ) { + pointsList.clicks++; + if ( pointsList.clicks === 1 ) { + delegate.lastClickPos = releasePoint; + /*jshint loopfunc:true*/ + delegate.dblClickTimeOut = setTimeout( function() { + pointsList.clicks = 0; + }, tracker.dblClickTimeThreshold ); + /*jshint loopfunc:false*/ + } else if ( pointsList.clicks === 2 ) { + clearTimeout( delegate.dblClickTimeOut ); + pointsList.clicks = 0; + if ( delegate.lastClickPos.distanceTo( releasePoint ) <= tracker.dblClickDistThreshold ) { + tracker.dblClickHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + shift: eventInfo.originalEvent.shiftKey, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + delegate.lastClickPos = null; + } + } + } + } else if ( pointsList.contacts === 2 ) { + if ( tracker.pinchHandler && updateGPoint.type === 'touch' ) { + // Reset for pinch + delegate.pinchGPoints = pointsList.asArray(); + delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos ); + delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos ); + } + } + } else { + // Pointer was activated in another element but removed in our element + + eventInfo.shouldReleaseCapture = false; + + // Release (pressed in another element) + if ( tracker.releaseHandler && releasePoint ) { + tracker.releaseHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( releasePoint, tracker.element ), + buttons: pointsList.buttons, + insideElementPressed: updateGPoint.insideElementPressed, + insideElementReleased: updateGPoint.insideElement, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + eventInfo.preventDefault = true; + } + } + } + } + + + /** + * Call when pointer(s) change coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height) + * + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * Processing info for originating DOM event. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture points associated with the event. + */ + function updatePointerMove( tracker, eventInfo, gPoint ) { + var delegate = THIS[ tracker.hash ], + pointsList = tracker.getActivePointersListByType( gPoint.type ), + updateGPoint, + gPointArray, + delta; + + if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) { + pointsList.buttons = eventInfo.originalEvent.buttons; + } + + updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + // Already tracking the pointer...update it + updateGPoint.lastPos = updateGPoint.currentPos; + updateGPoint.lastTime = updateGPoint.currentTime; + updateGPoint.currentPos = gPoint.currentPos; + updateGPoint.currentTime = gPoint.currentTime; + } else { + // Should never get here, but due to user agent bugs (e.g. legacy touch) it sometimes happens + return; + } + + eventInfo.shouldCapture = false; + eventInfo.shouldReleaseCapture = false; + + // Stop (mouse only) + if ( tracker.stopHandler && gPoint.type === 'mouse' ) { + clearTimeout( tracker.stopTimeOut ); + tracker.stopTimeOut = setTimeout( function() { + handlePointerStop( tracker, eventInfo.originalEvent, gPoint.type ); + }, tracker.stopDelay ); + } + + if ( pointsList.contacts === 0 ) { + // Move (no contacts: hovering mouse or other hover-capable device) + if ( tracker.moveHandler ) { + tracker.moveHandler( + { + eventSource: tracker, + pointerType: gPoint.type, + position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + isTouchEvent: gPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + } else if ( pointsList.contacts === 1 ) { + // Move (1 contact) + if ( tracker.moveHandler ) { + updateGPoint = pointsList.asArray()[ 0 ]; + tracker.moveHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + + // Drag + if ( tracker.dragHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + updateGPoint = pointsList.asArray()[ 0 ]; + delta = updateGPoint.currentPos.minus( updateGPoint.lastPos ); + tracker.dragHandler( + { + eventSource: tracker, + pointerType: updateGPoint.type, + position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ), + buttons: pointsList.buttons, + delta: delta, + speed: updateGPoint.speed, + direction: updateGPoint.direction, + shift: eventInfo.originalEvent.shiftKey, + isTouchEvent: updateGPoint.type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + eventInfo.preventDefault = true; + delegate.sentDragEvent = true; + } + } else if ( pointsList.contacts === 2 ) { + // Move (2 contacts, use center) + if ( tracker.moveHandler ) { + gPointArray = pointsList.asArray(); + tracker.moveHandler( + { + eventSource: tracker, + pointerType: gPointArray[ 0 ].type, + position: getPointRelativeToAbsolute( getCenterPoint( gPointArray[ 0 ].currentPos, gPointArray[ 1 ].currentPos ), tracker.element ), + buttons: pointsList.buttons, + isTouchEvent: gPointArray[ 0 ].type === 'touch', + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + } + + // Pinch + if ( tracker.pinchHandler && gPoint.type === 'touch' && + !eventInfo.preventGesture && !eventInfo.defaultPrevented ) { + delta = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos ); + if ( delta !== delegate.currentPinchDist ) { + delegate.lastPinchDist = delegate.currentPinchDist; + delegate.currentPinchDist = delta; + delegate.lastPinchCenter = delegate.currentPinchCenter; + delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos ); + tracker.pinchHandler( + { + eventSource: tracker, + pointerType: 'touch', + gesturePoints: delegate.pinchGPoints, + lastCenter: getPointRelativeToAbsolute( delegate.lastPinchCenter, tracker.element ), + center: getPointRelativeToAbsolute( delegate.currentPinchCenter, tracker.element ), + lastDistance: delegate.lastPinchDist, + distance: delegate.currentPinchDist, + shift: eventInfo.originalEvent.shiftKey, + originalEvent: eventInfo.originalEvent, + userData: tracker.userData + } + ); + eventInfo.preventDefault = true; + } + } + } + } + + + /** + * @function + * @private + * @inner + * @param {OpenSeadragon.MouseTracker} tracker + * A reference to the MouseTracker instance. + * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo + * Processing info for originating DOM event. + * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint + * Gesture points associated with the event. + */ + function updatePointerCancel( tracker, eventInfo, gPoint ) { + var pointsList = tracker.getActivePointersListByType( gPoint.type ), + updateGPoint; + + updateGPoint = pointsList.getById( gPoint.id ); + + if ( updateGPoint ) { + stopTrackingPointer( tracker, pointsList, updateGPoint ); + } + } + + + /** + * @private + * @inner + */ + function handlePointerStop( tracker, originalMoveEvent, pointerType ) { + if ( tracker.stopHandler ) { + tracker.stopHandler( { + eventSource: tracker, + pointerType: pointerType, + position: getMouseRelative( originalMoveEvent, tracker.element ), + buttons: tracker.getActivePointersListByType( pointerType ).buttons, + isTouchEvent: pointerType === 'touch', + originalEvent: originalMoveEvent, + userData: tracker.userData + } ); + } + } + +}(OpenSeadragon)); + +/* + * OpenSeadragon - Control + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * An enumeration of supported locations where controls can be anchored. + * The anchoring is always relative to the container. + * @member ControlAnchor + * @memberof OpenSeadragon + * @static + * @type {Object} + * @property {Number} NONE + * @property {Number} TOP_LEFT + * @property {Number} TOP_RIGHT + * @property {Number} BOTTOM_LEFT + * @property {Number} BOTTOM_RIGHT + * @property {Number} ABSOLUTE + */ +$.ControlAnchor = { + NONE: 0, + TOP_LEFT: 1, + TOP_RIGHT: 2, + BOTTOM_RIGHT: 3, + BOTTOM_LEFT: 4, + ABSOLUTE: 5 +}; + +/** + * @class Control + * @classdesc A Control represents any interface element which is meant to allow the user + * to interact with the zoomable interface. Any control can be anchored to any + * element. + * + * @memberof OpenSeadragon + * @param {Element} element - the control element to be anchored in the container. + * @param {Object } options - All required and optional settings for configuring a control element. + * @param {OpenSeadragon.ControlAnchor} [options.anchor=OpenSeadragon.ControlAnchor.NONE] - the position of the control + * relative to the container. + * @param {Boolean} [options.attachToViewer=true] - Whether the control should be added directly to the viewer, or + * directly to the container + * @param {Boolean} [options.autoFade=true] - Whether the control should have the autofade behavior + * @param {Element} container - the element to control will be anchored too. + */ +$.Control = function ( element, options, container ) { + + var parent = element.parentNode; + if (typeof options === 'number') + { + $.console.error("Passing an anchor directly into the OpenSeadragon.Control constructor is deprecated; " + + "please use an options object instead. " + + "Support for this deprecated variant is scheduled for removal in December 2013"); + options = {anchor: options}; + } + options.attachToViewer = (typeof options.attachToViewer === 'undefined') ? true : options.attachToViewer; + /** + * True if the control should have autofade behavior. + * @member {Boolean} autoFade + * @memberof OpenSeadragon.Control# + */ + this.autoFade = (typeof options.autoFade === 'undefined') ? true : options.autoFade; + /** + * The element providing the user interface with some type of control (e.g. a zoom-in button). + * @member {Element} element + * @memberof OpenSeadragon.Control# + */ + this.element = element; + /** + * The position of the Control relative to its container. + * @member {OpenSeadragon.ControlAnchor} anchor + * @memberof OpenSeadragon.Control# + */ + this.anchor = options.anchor; + /** + * The Control's containing element. + * @member {Element} container + * @memberof OpenSeadragon.Control# + */ + this.container = container; + /** + * A neutral element surrounding the control element. + * @member {Element} wrapper + * @memberof OpenSeadragon.Control# + */ + if ( this.anchor === $.ControlAnchor.ABSOLUTE ) { + this.wrapper = $.makeNeutralElement( "div" ); + this.wrapper.style.position = "absolute"; + this.wrapper.style.top = typeof (options.top) === "number" ? (options.top + 'px') : options.top; + this.wrapper.style.left = typeof (options.left) === "number" ? (options.left + 'px') : options.left; + this.wrapper.style.height = typeof (options.height) === "number" ? (options.height + 'px') : options.height; + this.wrapper.style.width = typeof (options.width) === "number" ? (options.width + 'px') : options.width; + this.wrapper.style.margin = "0px"; + this.wrapper.style.padding = "0px"; + + this.element.style.position = "relative"; + this.element.style.top = "0px"; + this.element.style.left = "0px"; + this.element.style.height = "100%"; + this.element.style.width = "100%"; + } else { + this.wrapper = $.makeNeutralElement( "div" ); + this.wrapper.style.display = "inline-block"; + if ( this.anchor === $.ControlAnchor.NONE ) { + // IE6 fix + this.wrapper.style.width = this.wrapper.style.height = "100%"; + } + } + this.wrapper.appendChild( this.element ); + + if (options.attachToViewer ) { + if ( this.anchor === $.ControlAnchor.TOP_RIGHT || + this.anchor === $.ControlAnchor.BOTTOM_RIGHT ) { + this.container.insertBefore( + this.wrapper, + this.container.firstChild + ); + } else { + this.container.appendChild( this.wrapper ); + } + } else { + parent.appendChild( this.wrapper ); + } + +}; + +/** @lends OpenSeadragon.Control.prototype */ +$.Control.prototype = { + + /** + * Removes the control from the container. + * @function + */ + destroy: function() { + this.wrapper.removeChild( this.element ); + if (this.anchor !== $.ControlAnchor.NONE) { + this.container.removeChild(this.wrapper); + } + }, + + /** + * Determines if the control is currently visible. + * @function + * @returns {Boolean} true if currently visible, false otherwise. + */ + isVisible: function() { + return this.wrapper.style.display !== "none"; + }, + + /** + * Toggles the visibility of the control. + * @function + * @param {Boolean} visible - true to make visible, false to hide. + */ + setVisible: function( visible ) { + this.wrapper.style.display = visible ? + ( this.anchor === $.ControlAnchor.ABSOLUTE ? 'block' : 'inline-block' ) : + "none"; + }, + + /** + * Sets the opacity level for the control. + * @function + * @param {Number} opactiy - a value between 1 and 0 inclusively. + */ + setOpacity: function( opacity ) { + if ( this.element[ $.SIGNAL ] && $.Browser.vendor === $.BROWSERS.IE ) { + $.setElementOpacity( this.element, opacity, true ); + } else { + $.setElementOpacity( this.wrapper, opacity, true ); + } + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - ControlDock + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + /** + * @class ControlDock + * @classdesc Provides a container element (a <form> element) with support for the layout of control elements. + * + * @memberof OpenSeadragon + */ + $.ControlDock = function( options ){ + var layouts = [ 'topleft', 'topright', 'bottomright', 'bottomleft'], + layout, + i; + + $.extend( true, this, { + id: 'controldock-' + $.now() + '-' + Math.floor(Math.random() * 1000000), + container: $.makeNeutralElement( 'div' ), + controls: [] + }, options ); + + // Disable the form's submit; otherwise button clicks and return keys + // can trigger it. + this.container.onsubmit = function() { + return false; + }; + + if( this.element ){ + this.element = $.getElement( this.element ); + this.element.appendChild( this.container ); + this.element.style.position = 'relative'; + this.container.style.width = '100%'; + this.container.style.height = '100%'; + } + + for( i = 0; i < layouts.length; i++ ){ + layout = layouts[ i ]; + this.controls[ layout ] = $.makeNeutralElement( "div" ); + this.controls[ layout ].style.position = 'absolute'; + if ( layout.match( 'left' ) ){ + this.controls[ layout ].style.left = '0px'; + } + if ( layout.match( 'right' ) ){ + this.controls[ layout ].style.right = '0px'; + } + if ( layout.match( 'top' ) ){ + this.controls[ layout ].style.top = '0px'; + } + if ( layout.match( 'bottom' ) ){ + this.controls[ layout ].style.bottom = '0px'; + } + } + + this.container.appendChild( this.controls.topleft ); + this.container.appendChild( this.controls.topright ); + this.container.appendChild( this.controls.bottomright ); + this.container.appendChild( this.controls.bottomleft ); + }; + + /** @lends OpenSeadragon.ControlDock.prototype */ + $.ControlDock.prototype = { + + /** + * @function + */ + addControl: function ( element, controlOptions ) { + element = $.getElement( element ); + var div = null; + + if ( getControlIndex( this, element ) >= 0 ) { + return; // they're trying to add a duplicate control + } + + switch ( controlOptions.anchor ) { + case $.ControlAnchor.TOP_RIGHT: + div = this.controls.topright; + element.style.position = "relative"; + element.style.paddingRight = "0px"; + element.style.paddingTop = "0px"; + break; + case $.ControlAnchor.BOTTOM_RIGHT: + div = this.controls.bottomright; + element.style.position = "relative"; + element.style.paddingRight = "0px"; + element.style.paddingBottom = "0px"; + break; + case $.ControlAnchor.BOTTOM_LEFT: + div = this.controls.bottomleft; + element.style.position = "relative"; + element.style.paddingLeft = "0px"; + element.style.paddingBottom = "0px"; + break; + case $.ControlAnchor.TOP_LEFT: + div = this.controls.topleft; + element.style.position = "relative"; + element.style.paddingLeft = "0px"; + element.style.paddingTop = "0px"; + break; + case $.ControlAnchor.ABSOLUTE: + div = this.container; + element.style.margin = "0px"; + element.style.padding = "0px"; + break; + default: + case $.ControlAnchor.NONE: + div = this.container; + element.style.margin = "0px"; + element.style.padding = "0px"; + break; + } + + this.controls.push( + new $.Control( element, controlOptions, div ) + ); + element.style.display = "inline-block"; + }, + + + /** + * @function + * @returns {OpenSeadragon.ControlDock} Chainable. + */ + removeControl: function ( element ) { + element = $.getElement( element ); + var i = getControlIndex( this, element ); + + if ( i >= 0 ) { + this.controls[ i ].destroy(); + this.controls.splice( i, 1 ); + } + + return this; + }, + + /** + * @function + * @returns {OpenSeadragon.ControlDock} Chainable. + */ + clearControls: function () { + while ( this.controls.length > 0 ) { + this.controls.pop().destroy(); + } + + return this; + }, + + + /** + * @function + * @returns {Boolean} + */ + areControlsEnabled: function () { + var i; + + for ( i = this.controls.length - 1; i >= 0; i-- ) { + if ( this.controls[ i ].isVisible() ) { + return true; + } + } + + return false; + }, + + + /** + * @function + * @returns {OpenSeadragon.ControlDock} Chainable. + */ + setControlsEnabled: function( enabled ) { + var i; + + for ( i = this.controls.length - 1; i >= 0; i-- ) { + this.controls[ i ].setVisible( enabled ); + } + + return this; + } + + }; + + + /////////////////////////////////////////////////////////////////////////////// + // Utility methods + /////////////////////////////////////////////////////////////////////////////// + function getControlIndex( dock, element ) { + var controls = dock.controls, + i; + + for ( i = controls.length - 1; i >= 0; i-- ) { + if ( controls[ i ].element === element ) { + return i; + } + } + + return -1; + } + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Placement + * + * Copyright (C) 2010-2016 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($) { + + /** + * An enumeration of positions to anchor an element. + * @member Placement + * @memberOf OpenSeadragon + * @static + * @readonly + * @property {OpenSeadragon.Placement} CENTER + * @property {OpenSeadragon.Placement} TOP_LEFT + * @property {OpenSeadragon.Placement} TOP + * @property {OpenSeadragon.Placement} TOP_RIGHT + * @property {OpenSeadragon.Placement} RIGHT + * @property {OpenSeadragon.Placement} BOTTOM_RIGHT + * @property {OpenSeadragon.Placement} BOTTOM + * @property {OpenSeadragon.Placement} BOTTOM_LEFT + * @property {OpenSeadragon.Placement} LEFT + */ + $.Placement = $.freezeObject({ + CENTER: 0, + TOP_LEFT: 1, + TOP: 2, + TOP_RIGHT: 3, + RIGHT: 4, + BOTTOM_RIGHT: 5, + BOTTOM: 6, + BOTTOM_LEFT: 7, + LEFT: 8, + properties: { + 0: { + isLeft: false, + isHorizontallyCentered: true, + isRight: false, + isTop: false, + isVerticallyCentered: true, + isBottom: false + }, + 1: { + isLeft: true, + isHorizontallyCentered: false, + isRight: false, + isTop: true, + isVerticallyCentered: false, + isBottom: false + }, + 2: { + isLeft: false, + isHorizontallyCentered: true, + isRight: false, + isTop: true, + isVerticallyCentered: false, + isBottom: false + }, + 3: { + isLeft: false, + isHorizontallyCentered: false, + isRight: true, + isTop: true, + isVerticallyCentered: false, + isBottom: false + }, + 4: { + isLeft: false, + isHorizontallyCentered: false, + isRight: true, + isTop: false, + isVerticallyCentered: true, + isBottom: false + }, + 5: { + isLeft: false, + isHorizontallyCentered: false, + isRight: true, + isTop: false, + isVerticallyCentered: false, + isBottom: true + }, + 6: { + isLeft: false, + isHorizontallyCentered: true, + isRight: false, + isTop: false, + isVerticallyCentered: false, + isBottom: true + }, + 7: { + isLeft: true, + isHorizontallyCentered: false, + isRight: false, + isTop: false, + isVerticallyCentered: false, + isBottom: true + }, + 8: { + isLeft: true, + isHorizontallyCentered: false, + isRight: false, + isTop: false, + isVerticallyCentered: true, + isBottom: false + } + } + }); + +}(OpenSeadragon)); + +/* + * OpenSeadragon - Viewer + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +// dictionary from hash to private properties +var THIS = {}; +var nextHash = 1; + +/** + * + * The main point of entry into creating a zoomable image on the page.
    + *
    + * We have provided an idiomatic javascript constructor which takes + * a single object, but still support the legacy positional arguments.
    + *
    + * The options below are given in order that they appeared in the constructor + * as arguments and we translate a positional call into an idiomatic call.
    + *
    + * To create a viewer, you can use either of this methods:
    + *
      + *
    • var viewer = new OpenSeadragon.Viewer(options);
    • + *
    • var viewer = OpenSeadragon(options);
    • + *
    + * @class Viewer + * @classdesc The main OpenSeadragon viewer class. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @extends OpenSeadragon.ControlDock + * @param {OpenSeadragon.Options} options - Viewer options. + * + **/ +$.Viewer = function( options ) { + + var args = arguments, + _this = this, + i; + + + //backward compatibility for positional args while preferring more + //idiomatic javascript options object as the only argument + if( !$.isPlainObject( options ) ){ + options = { + id: args[ 0 ], + xmlPath: args.length > 1 ? args[ 1 ] : undefined, + prefixUrl: args.length > 2 ? args[ 2 ] : undefined, + controls: args.length > 3 ? args[ 3 ] : undefined, + overlays: args.length > 4 ? args[ 4 ] : undefined + }; + } + + //options.config and the general config argument are deprecated + //in favor of the more direct specification of optional settings + //being pass directly on the options object + if ( options.config ){ + $.extend( true, options, options.config ); + delete options.config; + } + + //Public properties + //Allow the options object to override global defaults + $.extend( true, this, { + + //internal state and dom identifiers + id: options.id, + hash: options.hash || nextHash++, + /** + * Index for page to be shown first next time open() is called (only used in sequenceMode). + * @member {Number} initialPage + * @memberof OpenSeadragon.Viewer# + */ + initialPage: 0, + + //dom nodes + /** + * The parent element of this Viewer instance, passed in when the Viewer was created. + * @member {Element} element + * @memberof OpenSeadragon.Viewer# + */ + element: null, + /** + * A <div> element (provided by {@link OpenSeadragon.ControlDock}), the base element of this Viewer instance.

    + * Child element of {@link OpenSeadragon.Viewer#element}. + * @member {Element} container + * @memberof OpenSeadragon.Viewer# + */ + container: null, + /** + * A <div> element, the element where user-input events are handled for panning and zooming.

    + * Child element of {@link OpenSeadragon.Viewer#container}, + * positioned on top of {@link OpenSeadragon.Viewer#keyboardCommandArea}.

    + * The parent of {@link OpenSeadragon.Drawer#canvas} instances. + * @member {Element} canvas + * @memberof OpenSeadragon.Viewer# + */ + canvas: null, + + // Overlays list. An overlay allows to add html on top of the viewer. + overlays: [], + // Container inside the canvas where overlays are drawn. + overlaysContainer: null, + + //private state properties + previousBody: [], + + //This was originally initialized in the constructor and so could never + //have anything in it. now it can because we allow it to be specified + //in the options and is only empty by default if not specified. Also + //this array was returned from get_controls which I find confusing + //since this object has a controls property which is treated in other + //functions like clearControls. I'm removing the accessors. + customControls: [], + + //These are originally not part options but declared as members + //in initialize. It's still considered idiomatic to put them here + //source is here for backwards compatibility. It is not an official + //part of the API and should not be relied upon. + source: null, + /** + * Handles rendering of tiles in the viewer. Created for each TileSource opened. + * @member {OpenSeadragon.Drawer} drawer + * @memberof OpenSeadragon.Viewer# + */ + drawer: null, + /** + * Keeps track of all of the tiled images in the scene. + * @member {OpenSeadragon.World} world + * @memberof OpenSeadragon.Viewer# + */ + world: null, + /** + * Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened. + * @member {OpenSeadragon.Viewport} viewport + * @memberof OpenSeadragon.Viewer# + */ + viewport: null, + /** + * @member {OpenSeadragon.Navigator} navigator + * @memberof OpenSeadragon.Viewer# + */ + navigator: null, + + //A collection viewport is a separate viewport used to provide + //simultaneous rendering of sets of tiles + collectionViewport: null, + collectionDrawer: null, + + //UI image resources + //TODO: rename navImages to uiImages + navImages: null, + + //interface button controls + buttonGroup: null, + + //TODO: this is defunct so safely remove it + profiler: null + + }, $.DEFAULT_SETTINGS, options ); + + if ( typeof ( this.hash) === "undefined" ) { + throw new Error("A hash must be defined, either by specifying options.id or options.hash."); + } + if ( typeof ( THIS[ this.hash ] ) !== "undefined" ) { + // We don't want to throw an error here, as the user might have discarded + // the previous viewer with the same hash and now want to recreate it. + $.console.warn("Hash " + this.hash + " has already been used."); + } + + //Private state properties + THIS[ this.hash ] = { + fsBoundsDelta: new $.Point( 1, 1 ), + prevContainerSize: null, + animating: false, + forceRedraw: false, + needsResize: false, + forceResize: false, + mouseInside: false, + group: null, + // whether we should be continuously zooming + zooming: false, + // how much we should be continuously zooming by + zoomFactor: null, + lastZoomTime: null, + fullPage: false, + onfullscreenchange: null, + lastClickTime: null, + draggingToZoom: false, + }; + + this._sequenceIndex = 0; + this._firstOpen = true; + this._updateRequestId = null; + this._loadQueue = []; + this.currentOverlays = []; + this._updatePixelDensityRatioBind = null; + + this._lastScrollTime = $.now(); // variable used to help normalize the scroll event speed of different devices + + //Inherit some behaviors and properties + $.EventSource.call( this ); + + this.addHandler( 'open-failed', function ( event ) { + var msg = $.getString( "Errors.OpenFailed", event.eventSource, event.message); + _this._showMessage( msg ); + }); + + $.ControlDock.call( this, options ); + + //Deal with tile sources + if (this.xmlPath) { + //Deprecated option. Now it is preferred to use the tileSources option + this.tileSources = [ this.xmlPath ]; + } + + this.element = this.element || document.getElementById( this.id ); + this.canvas = $.makeNeutralElement( "div" ); + + this.canvas.className = "openseadragon-canvas"; + (function( style ){ + style.width = "100%"; + style.height = "100%"; + style.overflow = "hidden"; + style.position = "absolute"; + style.top = "0px"; + style.left = "0px"; + }(this.canvas.style)); + $.setElementTouchActionNone( this.canvas ); + if (options.tabIndex !== "") { + this.canvas.tabIndex = (options.tabIndex === undefined ? 0 : options.tabIndex); + } + + //the container is created through applying the ControlDock constructor above + this.container.className = "openseadragon-container"; + (function( style ){ + style.width = "100%"; + style.height = "100%"; + style.position = "relative"; + style.overflow = "hidden"; + style.left = "0px"; + style.top = "0px"; + style.textAlign = "left"; // needed to protect against + }( this.container.style )); + $.setElementTouchActionNone( this.container ); + + this.container.insertBefore( this.canvas, this.container.firstChild ); + this.element.appendChild( this.container ); + + //Used for toggling between fullscreen and default container size + //TODO: these can be closure private and shared across Viewer + // instances. + this.bodyWidth = document.body.style.width; + this.bodyHeight = document.body.style.height; + this.bodyOverflow = document.body.style.overflow; + this.docOverflow = document.documentElement.style.overflow; + + this.innerTracker = new $.MouseTracker({ + userData: 'Viewer.innerTracker', + element: this.canvas, + startDisabled: !this.mouseNavEnabled, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + dblClickTimeThreshold: this.dblClickTimeThreshold, + dblClickDistThreshold: this.dblClickDistThreshold, + contextMenuHandler: $.delegate( this, onCanvasContextMenu ), + keyDownHandler: $.delegate( this, onCanvasKeyDown ), + keyHandler: $.delegate( this, onCanvasKeyPress ), + clickHandler: $.delegate( this, onCanvasClick ), + dblClickHandler: $.delegate( this, onCanvasDblClick ), + dragHandler: $.delegate( this, onCanvasDrag ), + dragEndHandler: $.delegate( this, onCanvasDragEnd ), + enterHandler: $.delegate( this, onCanvasEnter ), + leaveHandler: $.delegate( this, onCanvasLeave ), + pressHandler: $.delegate( this, onCanvasPress ), + releaseHandler: $.delegate( this, onCanvasRelease ), + nonPrimaryPressHandler: $.delegate( this, onCanvasNonPrimaryPress ), + nonPrimaryReleaseHandler: $.delegate( this, onCanvasNonPrimaryRelease ), + scrollHandler: $.delegate( this, onCanvasScroll ), + pinchHandler: $.delegate( this, onCanvasPinch ), + focusHandler: $.delegate( this, onCanvasFocus ), + blurHandler: $.delegate( this, onCanvasBlur ), + }); + + this.outerTracker = new $.MouseTracker({ + userData: 'Viewer.outerTracker', + element: this.container, + startDisabled: !this.mouseNavEnabled, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + dblClickTimeThreshold: this.dblClickTimeThreshold, + dblClickDistThreshold: this.dblClickDistThreshold, + enterHandler: $.delegate( this, onContainerEnter ), + leaveHandler: $.delegate( this, onContainerLeave ) + }); + + if( this.toolbar ){ + this.toolbar = new $.ControlDock({ element: this.toolbar }); + } + + this.bindStandardControls(); + + THIS[ this.hash ].prevContainerSize = _getSafeElemSize( this.container ); + + if(window.ResizeObserver){ + this._autoResizePolling = false; + this._resizeObserver = new ResizeObserver(function(){ + THIS[_this.hash].needsResize = true; + }); + + this._resizeObserver.observe(this.container, {}); + } else { + this._autoResizePolling = true; + } + + // Create the world + this.world = new $.World({ + viewer: this + }); + + this.world.addHandler('add-item', function(event) { + // For backwards compatibility, we maintain the source property + _this.source = _this.world.getItemAt(0).source; + + THIS[ _this.hash ].forceRedraw = true; + + if (!_this._updateRequestId) { + _this._updateRequestId = scheduleUpdate( _this, updateMulti ); + } + }); + + this.world.addHandler('remove-item', function(event) { + // For backwards compatibility, we maintain the source property + if (_this.world.getItemCount()) { + _this.source = _this.world.getItemAt(0).source; + } else { + _this.source = null; + } + + THIS[ _this.hash ].forceRedraw = true; + }); + + this.world.addHandler('metrics-change', function(event) { + if (_this.viewport) { + _this.viewport._setContentBounds(_this.world.getHomeBounds(), _this.world.getContentFactor()); + } + }); + + this.world.addHandler('item-index-change', function(event) { + // For backwards compatibility, we maintain the source property + _this.source = _this.world.getItemAt(0).source; + }); + + // Create the viewport + this.viewport = new $.Viewport({ + containerSize: THIS[ this.hash ].prevContainerSize, + springStiffness: this.springStiffness, + animationTime: this.animationTime, + minZoomImageRatio: this.minZoomImageRatio, + maxZoomPixelRatio: this.maxZoomPixelRatio, + visibilityRatio: this.visibilityRatio, + wrapHorizontal: this.wrapHorizontal, + wrapVertical: this.wrapVertical, + defaultZoomLevel: this.defaultZoomLevel, + minZoomLevel: this.minZoomLevel, + maxZoomLevel: this.maxZoomLevel, + viewer: this, + degrees: this.degrees, + flipped: this.flipped, + navigatorRotate: this.navigatorRotate, + homeFillsViewer: this.homeFillsViewer, + margins: this.viewportMargins, + silenceMultiImageWarnings: this.silenceMultiImageWarnings + }); + + this.viewport._setContentBounds(this.world.getHomeBounds(), this.world.getContentFactor()); + + // Create the image loader + this.imageLoader = new $.ImageLoader({ + jobLimit: this.imageLoaderLimit, + timeout: options.timeout, + tileRetryMax: this.tileRetryMax, + tileRetryDelay: this.tileRetryDelay + }); + + // Create the tile cache + this.tileCache = new $.TileCache({ + maxImageCacheCount: this.maxImageCacheCount + }); + + // Create the drawer + this.drawer = new $.Drawer({ + viewer: this, + viewport: this.viewport, + element: this.canvas, + debugGridColor: this.debugGridColor + }); + + // Overlay container + this.overlaysContainer = $.makeNeutralElement( "div" ); + this.canvas.appendChild( this.overlaysContainer ); + + // Now that we have a drawer, see if it supports rotate. If not we need to remove the rotate buttons + if (!this.drawer.canRotate()) { + // Disable/remove the rotate left/right buttons since they aren't supported + if (this.rotateLeft) { + i = this.buttonGroup.buttons.indexOf(this.rotateLeft); + this.buttonGroup.buttons.splice(i, 1); + this.buttonGroup.element.removeChild(this.rotateLeft.element); + } + if (this.rotateRight) { + i = this.buttonGroup.buttons.indexOf(this.rotateRight); + this.buttonGroup.buttons.splice(i, 1); + this.buttonGroup.element.removeChild(this.rotateRight.element); + } + } + + this._addUpdatePixelDensityRatioEvent(); + + //Instantiate a navigator if configured + if ( this.showNavigator){ + this.navigator = new $.Navigator({ + element: this.navigatorElement, + id: this.navigatorId, + position: this.navigatorPosition, + sizeRatio: this.navigatorSizeRatio, + maintainSizeRatio: this.navigatorMaintainSizeRatio, + top: this.navigatorTop, + left: this.navigatorLeft, + width: this.navigatorWidth, + height: this.navigatorHeight, + autoResize: this.navigatorAutoResize, + autoFade: this.navigatorAutoFade, + prefixUrl: this.prefixUrl, + viewer: this, + navigatorRotate: this.navigatorRotate, + background: this.navigatorBackground, + opacity: this.navigatorOpacity, + borderColor: this.navigatorBorderColor, + displayRegionColor: this.navigatorDisplayRegionColor, + crossOriginPolicy: this.crossOriginPolicy, + animationTime: this.animationTime, + }); + } + + // Sequence mode + if (this.sequenceMode) { + this.bindSequenceControls(); + } + + // Open initial tilesources + if (this.tileSources) { + this.open( this.tileSources ); + } + + // Add custom controls + for ( i = 0; i < this.customControls.length; i++ ) { + this.addControl( + this.customControls[ i ].id, + {anchor: this.customControls[ i ].anchor} + ); + } + + // Initial fade out + $.requestAnimationFrame( function(){ + beginControlsAutoHide( _this ); + } ); + + // Initial canvas options + if ( this.imageSmoothingEnabled !== undefined && !this.imageSmoothingEnabled){ + this.drawer.setImageSmoothingEnabled(this.imageSmoothingEnabled); + } + + // Register the viewer + $._viewers.set(this.element, this); +}; + +$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{ + + + /** + * @function + * @returns {Boolean} + */ + isOpen: function () { + return !!this.world.getItemCount(); + }, + + // deprecated + openDzi: function ( dzi ) { + $.console.error( "[Viewer.openDzi] this function is deprecated; use Viewer.open() instead." ); + return this.open( dzi ); + }, + + // deprecated + openTileSource: function ( tileSource ) { + $.console.error( "[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead." ); + return this.open( tileSource ); + }, + + //deprecated + get buttons () { + $.console.warn('Viewer.buttons is deprecated; Please use Viewer.buttonGroup'); + return this.buttonGroup; + }, + + /** + * Open tiled images into the viewer, closing any others. + * To get the TiledImage instance created by open, add an event listener for + * {@link OpenSeadragon.Viewer.html#.event:open}, which when fired can be used to get access + * to the instance, i.e., viewer.world.getItemAt(0). + * @function + * @param {Array|String|Object|Function} tileSources - This can be a TiledImage + * specifier, a TileSource specifier, or an array of either. A TiledImage specifier + * is the same as the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}, + * except for the index property; images are added in sequence. + * A TileSource specifier is anything you could pass as the tileSource property + * of the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}. + * @param {Number} initialPage - If sequenceMode is true, display this page initially + * for the given tileSources. If specified, will overwrite the Viewer's existing initialPage property. + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:open + * @fires OpenSeadragon.Viewer.event:open-failed + */ + open: function (tileSources, initialPage) { + var _this = this; + + this.close(); + + if (!tileSources) { + return this; + } + + if (this.sequenceMode && $.isArray(tileSources)) { + if (this.referenceStrip) { + this.referenceStrip.destroy(); + this.referenceStrip = null; + } + + if (typeof initialPage !== 'undefined' && !isNaN(initialPage)) { + this.initialPage = initialPage; + } + + this.tileSources = tileSources; + this._sequenceIndex = Math.max(0, Math.min(this.tileSources.length - 1, this.initialPage)); + if (this.tileSources.length) { + this.open(this.tileSources[this._sequenceIndex]); + + if ( this.showReferenceStrip ){ + this.addReferenceStrip(); + } + } + + this._updateSequenceButtons( this._sequenceIndex ); + return this; + } + + if (!$.isArray(tileSources)) { + tileSources = [tileSources]; + } + + if (!tileSources.length) { + return this; + } + + this._opening = true; + + var expected = tileSources.length; + var successes = 0; + var failures = 0; + var failEvent; + + var checkCompletion = function() { + if (successes + failures === expected) { + if (successes) { + if (_this._firstOpen || !_this.preserveViewport) { + _this.viewport.goHome( true ); + _this.viewport.update(); + } + + _this._firstOpen = false; + + var source = tileSources[0]; + if (source.tileSource) { + source = source.tileSource; + } + + // Global overlays + if( _this.overlays && !_this.preserveOverlays ){ + for ( var i = 0; i < _this.overlays.length; i++ ) { + _this.currentOverlays[ i ] = getOverlayObject( _this, _this.overlays[ i ] ); + } + } + + _this._drawOverlays(); + _this._opening = false; + + /** + * Raised when the viewer has opened and loaded one or more TileSources. + * + * @event open + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.TileSource} source - The tile source that was opened. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + // TODO: what if there are multiple sources? + _this.raiseEvent( 'open', { source: source } ); + } else { + _this._opening = false; + + /** + * Raised when an error occurs loading a TileSource. + * + * @event open-failed + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {String} message - Information about what failed. + * @property {String} source - The tile source that failed. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'open-failed', failEvent ); + } + } + }; + + var doOne = function(options) { + if (!$.isPlainObject(options) || !options.tileSource) { + options = { + tileSource: options + }; + } + + if (options.index !== undefined) { + $.console.error('[Viewer.open] setting indexes here is not supported; use addTiledImage instead'); + delete options.index; + } + + if (options.collectionImmediately === undefined) { + options.collectionImmediately = true; + } + + var originalSuccess = options.success; + options.success = function(event) { + successes++; + + // TODO: now that options has other things besides tileSource, the overlays + // should probably be at the options level, not the tileSource level. + if (options.tileSource.overlays) { + for (var i = 0; i < options.tileSource.overlays.length; i++) { + _this.addOverlay(options.tileSource.overlays[i]); + } + } + + if (originalSuccess) { + originalSuccess(event); + } + + checkCompletion(); + }; + + var originalError = options.error; + options.error = function(event) { + failures++; + + if (!failEvent) { + failEvent = event; + } + + if (originalError) { + originalError(event); + } + + checkCompletion(); + }; + + _this.addTiledImage(options); + }; + + // TileSources + for (var i = 0; i < tileSources.length; i++) { + doOne(tileSources[i]); + } + + return this; + }, + + + /** + * @function + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:close + */ + close: function ( ) { + if ( !THIS[ this.hash ] ) { + //this viewer has already been destroyed: returning immediately + return this; + } + + this._opening = false; + + if ( this.navigator ) { + this.navigator.close(); + } + + if (!this.preserveOverlays) { + this.clearOverlays(); + this.overlaysContainer.innerHTML = ""; + } + + THIS[ this.hash ].animating = false; + + this.world.removeAll(); + this.imageLoader.clear(); + + /** + * Raised when the viewer is closed (see {@link OpenSeadragon.Viewer#close}). + * + * @event close + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'close' ); + + return this; + }, + + + /** + * Function to destroy the viewer and clean up everything created by OpenSeadragon. + * + * Example: + * var viewer = OpenSeadragon({ + * [...] + * }); + * + * //when you are done with the viewer: + * viewer.destroy(); + * viewer = null; //important + * + * @function + * @fires OpenSeadragon.Viewer.event:before-destroy + * @fires OpenSeadragon.Viewer.event:destroy + */ + destroy: function( ) { + if ( !THIS[ this.hash ] ) { + //this viewer has already been destroyed: returning immediately + return; + } + + /** + * Raised when the viewer is about to be destroyed (see {@link OpenSeadragon.Viewer#before-destroy}). + * + * @event before-destroy + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'before-destroy' ); + + this._removeUpdatePixelDensityRatioEvent(); + + this.close(); + + this.clearOverlays(); + this.overlaysContainer.innerHTML = ""; + + //TODO: implement this... + //this.unbindSequenceControls() + //this.unbindStandardControls() + if (this._resizeObserver){ + this._resizeObserver.disconnect(); + } + + if (this.referenceStrip) { + this.referenceStrip.destroy(); + this.referenceStrip = null; + } + + if ( this._updateRequestId !== null ) { + $.cancelAnimationFrame( this._updateRequestId ); + this._updateRequestId = null; + } + + if ( this.drawer ) { + this.drawer.destroy(); + } + + if ( this.navigator ) { + this.navigator.destroy(); + THIS[ this.navigator.hash ] = null; + delete THIS[ this.navigator.hash ]; + this.navigator = null; + } + + + if (this.buttonGroup) { + this.buttonGroup.destroy(); + } else if (this.customButtons) { + while (this.customButtons.length) { + this.customButtons.pop().destroy(); + } + } + + if (this.paging) { + this.paging.destroy(); + } + + // Go through top element (passed to us) and remove all children + // Use removeChild to make sure it handles SVG or any non-html + // also it performs better - http://jsperf.com/innerhtml-vs-removechild/15 + if (this.element){ + while (this.element.firstChild) { + this.element.removeChild(this.element.firstChild); + } + } + + this.container.onsubmit = null; + this.clearControls(); + + // destroy the mouse trackers + if (this.innerTracker){ + this.innerTracker.destroy(); + } + if (this.outerTracker){ + this.outerTracker.destroy(); + } + + THIS[ this.hash ] = null; + delete THIS[ this.hash ]; + + // clear all our references to dom objects + this.canvas = null; + this.container = null; + + // Unregister the viewer + $._viewers.delete(this.element); + + // clear our reference to the main element - they will need to pass it in again, creating a new viewer + this.element = null; + + /** + * Raised when the viewer is destroyed (see {@link OpenSeadragon.Viewer#destroy}). + * + * @event destroy + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'destroy' ); + + this.removeAllHandlers(); + }, + + /** + * @function + * @returns {Boolean} + */ + isMouseNavEnabled: function () { + return this.innerTracker.isTracking(); + }, + + /** + * @function + * @param {Boolean} enabled - true to enable, false to disable + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:mouse-enabled + */ + setMouseNavEnabled: function( enabled ){ + this.innerTracker.setTracking( enabled ); + this.outerTracker.setTracking( enabled ); + /** + * Raised when mouse/touch navigation is enabled or disabled (see {@link OpenSeadragon.Viewer#setMouseNavEnabled}). + * + * @event mouse-enabled + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} enabled + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'mouse-enabled', { enabled: enabled } ); + return this; + }, + + + /** + * @function + * @returns {Boolean} + */ + areControlsEnabled: function () { + var enabled = this.controls.length, + i; + for( i = 0; i < this.controls.length; i++ ){ + enabled = enabled && this.controls[ i ].isVisible(); + } + return enabled; + }, + + + /** + * Shows or hides the controls (e.g. the default navigation buttons). + * + * @function + * @param {Boolean} true to show, false to hide. + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:controls-enabled + */ + setControlsEnabled: function( enabled ) { + if( enabled ){ + abortControlsAutoHide( this ); + } else { + beginControlsAutoHide( this ); + } + /** + * Raised when the navigation controls are shown or hidden (see {@link OpenSeadragon.Viewer#setControlsEnabled}). + * + * @event controls-enabled + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} enabled + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'controls-enabled', { enabled: enabled } ); + return this; + }, + + /** + * Turns debugging mode on or off for this viewer. + * + * @function + * @param {Boolean} debugMode true to turn debug on, false to turn debug off. + */ + setDebugMode: function(debugMode){ + + for (var i = 0; i < this.world.getItemCount(); i++) { + this.world.getItemAt(i).debugMode = debugMode; + } + + this.debugMode = debugMode; + this.forceRedraw(); + }, + + /** + * Update headers to include when making AJAX requests. + * + * Unless `propagate` is set to false (which is likely only useful in rare circumstances), + * the updated headers are propagated to all tiled images, each of which will subsequently + * propagate the changed headers to all their tiles. + * If applicable, the headers of the viewer's navigator and reference strip will also be updated. + * + * Note that the rules for merging headers still apply, i.e. headers returned by + * {@link OpenSeadragon.TileSource#getTileAjaxHeaders} take precedence over + * `TiledImage.ajaxHeaders`, which take precedence over the headers here in the viewer. + * + * @function + * @param {Object} ajaxHeaders Updated AJAX headers. + * @param {Boolean} [propagate=true] Whether to propagate updated headers to tiled images, etc. + */ + setAjaxHeaders: function(ajaxHeaders, propagate) { + if (ajaxHeaders === null) { + ajaxHeaders = {}; + } + if (!$.isPlainObject(ajaxHeaders)) { + console.error('[Viewer.setAjaxHeaders] Ignoring invalid headers, must be a plain object'); + return; + } + if (propagate === undefined) { + propagate = true; + } + + this.ajaxHeaders = ajaxHeaders; + + if (propagate) { + for (var i = 0; i < this.world.getItemCount(); i++) { + this.world.getItemAt(i)._updateAjaxHeaders(true); + } + + if (this.navigator) { + this.navigator.setAjaxHeaders(this.ajaxHeaders, true); + } + + if (this.referenceStrip && this.referenceStrip.miniViewers) { + for (var key in this.referenceStrip.miniViewers) { + this.referenceStrip.miniViewers[key].setAjaxHeaders(this.ajaxHeaders, true); + } + } + } + }, + + /** + * Adds the given button to this viewer. + * + * @function + * @param {OpenSeadragon.Button} button + */ + addButton: function( button ){ + this.buttonGroup.addButton(button); + }, + + /** + * @function + * @returns {Boolean} + */ + isFullPage: function () { + return THIS[ this.hash ].fullPage; + }, + + + /** + * Toggle full page mode. + * @function + * @param {Boolean} fullPage + * If true, enter full page mode. If false, exit full page mode. + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:pre-full-page + * @fires OpenSeadragon.Viewer.event:full-page + */ + setFullPage: function( fullPage ) { + + var body = document.body, + bodyStyle = body.style, + docStyle = document.documentElement.style, + _this = this, + nodes, + i; + + //don't bother modifying the DOM if we are already in full page mode. + if ( fullPage === this.isFullPage() ) { + return this; + } + + var fullPageEventArgs = { + fullPage: fullPage, + preventDefaultAction: false + }; + /** + * Raised when the viewer is about to change to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}). + * + * @event pre-full-page + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} fullPage - True if entering full-page mode, false if exiting full-page mode. + * @property {Boolean} preventDefaultAction - Set to true to prevent full-page mode change. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'pre-full-page', fullPageEventArgs ); + if ( fullPageEventArgs.preventDefaultAction ) { + return this; + } + + if ( fullPage ) { + + this.elementSize = $.getElementSize( this.element ); + this.pageScroll = $.getPageScroll(); + + this.elementMargin = this.element.style.margin; + this.element.style.margin = "0"; + this.elementPadding = this.element.style.padding; + this.element.style.padding = "0"; + + this.bodyMargin = bodyStyle.margin; + this.docMargin = docStyle.margin; + bodyStyle.margin = "0"; + docStyle.margin = "0"; + + this.bodyPadding = bodyStyle.padding; + this.docPadding = docStyle.padding; + bodyStyle.padding = "0"; + docStyle.padding = "0"; + + this.bodyWidth = bodyStyle.width; + this.docWidth = docStyle.width; + bodyStyle.width = "100%"; + docStyle.width = "100%"; + + this.bodyHeight = bodyStyle.height; + this.docHeight = docStyle.height; + bodyStyle.height = "100%"; + docStyle.height = "100%"; + + this.bodyDisplay = bodyStyle.display; + bodyStyle.display = "block"; + + //when entering full screen on the ipad it wasn't sufficient to leave + //the body intact as only only the top half of the screen would + //respond to touch events on the canvas, while the bottom half treated + //them as touch events on the document body. Thus we remove and store + //the bodies elements and replace them when we leave full screen. + this.previousBody = []; + THIS[ this.hash ].prevElementParent = this.element.parentNode; + THIS[ this.hash ].prevNextSibling = this.element.nextSibling; + THIS[ this.hash ].prevElementWidth = this.element.style.width; + THIS[ this.hash ].prevElementHeight = this.element.style.height; + nodes = body.childNodes.length; + for ( i = 0; i < nodes; i++ ) { + this.previousBody.push( body.childNodes[ 0 ] ); + body.removeChild( body.childNodes[ 0 ] ); + } + + //If we've got a toolbar, we need to enable the user to use css to + //preserve it in fullpage mode + if ( this.toolbar && this.toolbar.element ) { + //save a reference to the parent so we can put it back + //in the long run we need a better strategy + this.toolbar.parentNode = this.toolbar.element.parentNode; + this.toolbar.nextSibling = this.toolbar.element.nextSibling; + body.appendChild( this.toolbar.element ); + + //Make sure the user has some ability to style the toolbar based + //on the mode + $.addClass( this.toolbar.element, 'fullpage' ); + } + + $.addClass( this.element, 'fullpage' ); + body.appendChild( this.element ); + + this.element.style.height = '100vh'; + this.element.style.width = '100vw'; + + if ( this.toolbar && this.toolbar.element ) { + this.element.style.height = ( + $.getElementSize( this.element ).y - $.getElementSize( this.toolbar.element ).y + ) + 'px'; + } + + THIS[ this.hash ].fullPage = true; + + // mouse will be inside container now + $.delegate( this, onContainerEnter )( {} ); + + } else { + + this.element.style.margin = this.elementMargin; + this.element.style.padding = this.elementPadding; + + bodyStyle.margin = this.bodyMargin; + docStyle.margin = this.docMargin; + + bodyStyle.padding = this.bodyPadding; + docStyle.padding = this.docPadding; + + bodyStyle.width = this.bodyWidth; + docStyle.width = this.docWidth; + + bodyStyle.height = this.bodyHeight; + docStyle.height = this.docHeight; + + bodyStyle.display = this.bodyDisplay; + + body.removeChild( this.element ); + nodes = this.previousBody.length; + for ( i = 0; i < nodes; i++ ) { + body.appendChild( this.previousBody.shift() ); + } + + $.removeClass( this.element, 'fullpage' ); + THIS[ this.hash ].prevElementParent.insertBefore( + this.element, + THIS[ this.hash ].prevNextSibling + ); + + //If we've got a toolbar, we need to enable the user to use css to + //reset it to its original state + if ( this.toolbar && this.toolbar.element ) { + body.removeChild( this.toolbar.element ); + + //Make sure the user has some ability to style the toolbar based + //on the mode + $.removeClass( this.toolbar.element, 'fullpage' ); + + this.toolbar.parentNode.insertBefore( + this.toolbar.element, + this.toolbar.nextSibling + ); + delete this.toolbar.parentNode; + delete this.toolbar.nextSibling; + } + + this.element.style.width = THIS[ this.hash ].prevElementWidth; + this.element.style.height = THIS[ this.hash ].prevElementHeight; + + // After exiting fullPage or fullScreen, it can take some time + // before the browser can actually set the scroll. + var restoreScrollCounter = 0; + var restoreScroll = function() { + $.setPageScroll( _this.pageScroll ); + var pageScroll = $.getPageScroll(); + restoreScrollCounter++; + if (restoreScrollCounter < 10 && + (pageScroll.x !== _this.pageScroll.x || + pageScroll.y !== _this.pageScroll.y)) { + $.requestAnimationFrame( restoreScroll ); + } + }; + $.requestAnimationFrame( restoreScroll ); + + THIS[ this.hash ].fullPage = false; + + // mouse will likely be outside now + $.delegate( this, onContainerLeave )( { } ); + + } + + if ( this.navigator && this.viewport ) { + this.navigator.update( this.viewport ); + } + + /** + * Raised when the viewer has changed to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}). + * + * @event full-page + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} fullPage - True if changed to full-page mode, false if exited full-page mode. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'full-page', { fullPage: fullPage } ); + + return this; + }, + + /** + * Toggle full screen mode if supported. Toggle full page mode otherwise. + * @function + * @param {Boolean} fullScreen + * If true, enter full screen mode. If false, exit full screen mode. + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:pre-full-screen + * @fires OpenSeadragon.Viewer.event:full-screen + */ + setFullScreen: function( fullScreen ) { + var _this = this; + + if ( !$.supportsFullScreen ) { + return this.setFullPage( fullScreen ); + } + + if ( $.isFullScreen() === fullScreen ) { + return this; + } + + var fullScreeEventArgs = { + fullScreen: fullScreen, + preventDefaultAction: false + }; + /** + * Raised when the viewer is about to change to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}). + * Note: the pre-full-screen event is not raised when the user is exiting + * full-screen mode by pressing the Esc key. In that case, consider using + * the full-screen, pre-full-page or full-page events. + * + * @event pre-full-screen + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} fullScreen - True if entering full-screen mode, false if exiting full-screen mode. + * @property {Boolean} preventDefaultAction - Set to true to prevent full-screen mode change. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'pre-full-screen', fullScreeEventArgs ); + if ( fullScreeEventArgs.preventDefaultAction ) { + return this; + } + + if ( fullScreen ) { + + this.setFullPage( true ); + // If the full page mode is not actually entered, we need to prevent + // the full screen mode. + if ( !this.isFullPage() ) { + return this; + } + + this.fullPageStyleWidth = this.element.style.width; + this.fullPageStyleHeight = this.element.style.height; + this.element.style.width = '100%'; + this.element.style.height = '100%'; + + var onFullScreenChange = function() { + var isFullScreen = $.isFullScreen(); + if ( !isFullScreen ) { + $.removeEvent( document, $.fullScreenEventName, onFullScreenChange ); + $.removeEvent( document, $.fullScreenErrorEventName, onFullScreenChange ); + + _this.setFullPage( false ); + if ( _this.isFullPage() ) { + _this.element.style.width = _this.fullPageStyleWidth; + _this.element.style.height = _this.fullPageStyleHeight; + } + } + if ( _this.navigator && _this.viewport ) { + //09/08/2018 - Fabroh : Fix issue #1504 : Ensure to get the navigator updated on fullscreen out with custom location with a timeout + setTimeout(function(){ + _this.navigator.update( _this.viewport ); + }); + } + /** + * Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}). + * + * @event full-screen + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} fullScreen - True if changed to full-screen mode, false if exited full-screen mode. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'full-screen', { fullScreen: isFullScreen } ); + }; + $.addEvent( document, $.fullScreenEventName, onFullScreenChange ); + $.addEvent( document, $.fullScreenErrorEventName, onFullScreenChange ); + + $.requestFullScreen( document.body ); + + } else { + $.exitFullScreen(); + } + return this; + }, + + /** + * @function + * @returns {Boolean} + */ + isVisible: function () { + return this.container.style.visibility !== "hidden"; + }, + + + // + /** + * @function + * @returns {Boolean} returns true if the viewer is in fullscreen + */ + isFullScreen: function () { + return $.isFullScreen() && this.isFullPage(); + }, + + /** + * @function + * @param {Boolean} visible + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:visible + */ + setVisible: function( visible ){ + this.container.style.visibility = visible ? "" : "hidden"; + /** + * Raised when the viewer is shown or hidden (see {@link OpenSeadragon.Viewer#setVisible}). + * + * @event visible + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Boolean} visible + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'visible', { visible: visible } ); + return this; + }, + + /** + * Add a tiled image to the viewer. + * options.tileSource can be anything that {@link OpenSeadragon.Viewer#open} + * supports except arrays of images. + * Note that you can specify options.width or options.height, but not both. + * The other dimension will be calculated according to the item's aspect ratio. + * If collectionMode is on (see {@link OpenSeadragon.Options}), the new image is + * automatically arranged with the others. + * @function + * @param {Object} options + * @param {String|Object|Function} options.tileSource - The TileSource specifier. + * A String implies a url used to determine the tileSource implementation + * based on the file extension of url. JSONP is implied by *.js, + * otherwise the url is retrieved as text and the resulting text is + * introspected to determine if its json, xml, or text and parsed. + * An Object implies an inline configuration which has a single + * property sufficient for being able to determine tileSource + * implementation. If the object has a property which is a function + * named 'getTileUrl', it is treated as a custom TileSource. + * @param {Number} [options.index] The index of the item. Added on top of + * all other items if not specified. + * @param {Boolean} [options.replace=false] If true, the item at options.index will be + * removed and the new item is added in its place. options.tileSource will be + * interpreted and fetched if necessary before the old item is removed to avoid leaving + * a gap in the world. + * @param {Number} [options.x=0] The X position for the image in viewport coordinates. + * @param {Number} [options.y=0] The Y position for the image in viewport coordinates. + * @param {Number} [options.width=1] The width for the image in viewport coordinates. + * @param {Number} [options.height] The height for the image in viewport coordinates. + * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates + * to fit the image into. If specified, x, y, width and height get ignored. + * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER] + * How to anchor the image in the bounds if options.fitBounds is set. + * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to + * (portions of the image outside of this area will not be visible). Only works on + * browsers that support the HTML5 canvas. + * @param {Number} [options.opacity=1] Proportional opacity of the tiled images (1=opaque, 0=hidden) + * @param {Boolean} [options.preload=false] Default switch for loading hidden images (true loads, false blocks) + * @param {Number} [options.degrees=0] Initial rotation of the tiled image around + * its top left corner in degrees. + * @param {Boolean} [options.flipped=false] Whether to horizontally flip the image. + * @param {String} [options.compositeOperation] How the image is composited onto other images. + * @param {String} [options.crossOriginPolicy] The crossOriginPolicy for this specific image, + * overriding viewer.crossOriginPolicy. + * @param {Boolean} [options.ajaxWithCredentials] Whether to set withCredentials on tile AJAX + * @param {Boolean} [options.loadTilesWithAjax] + * Whether to load tile data using AJAX requests. + * Defaults to the setting in {@link OpenSeadragon.Options}. + * @param {Object} [options.ajaxHeaders] + * A set of headers to include when making tile AJAX requests. + * Note that these headers will be merged over any headers specified in {@link OpenSeadragon.Options}. + * Specifying a falsy value for a header will clear its existing value set at the Viewer level (if any). + * @param {Function} [options.success] A function that gets called when the image is + * successfully added. It's passed the event object which contains a single property: + * "item", which is the resulting instance of TiledImage. + * @param {Function} [options.error] A function that gets called if the image is + * unable to be added. It's passed the error event object, which contains "message" + * and "source" properties. + * @param {Boolean} [options.collectionImmediately=false] If collectionMode is on, + * specifies whether to snap to the new arrangement immediately or to animate to it. + * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}. + * @fires OpenSeadragon.World.event:add-item + * @fires OpenSeadragon.Viewer.event:add-item-failed + */ + addTiledImage: function( options ) { + $.console.assert(options, "[Viewer.addTiledImage] options is required"); + $.console.assert(options.tileSource, "[Viewer.addTiledImage] options.tileSource is required"); + $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()), + "[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world"); + + var _this = this; + + if (options.replace) { + options.replaceItem = _this.world.getItemAt(options.index); + } + + this._hideMessage(); + + if (options.placeholderFillStyle === undefined) { + options.placeholderFillStyle = this.placeholderFillStyle; + } + if (options.opacity === undefined) { + options.opacity = this.opacity; + } + if (options.preload === undefined) { + options.preload = this.preload; + } + if (options.compositeOperation === undefined) { + options.compositeOperation = this.compositeOperation; + } + if (options.crossOriginPolicy === undefined) { + options.crossOriginPolicy = options.tileSource.crossOriginPolicy !== undefined ? options.tileSource.crossOriginPolicy : this.crossOriginPolicy; + } + if (options.ajaxWithCredentials === undefined) { + options.ajaxWithCredentials = this.ajaxWithCredentials; + } + if (options.loadTilesWithAjax === undefined) { + options.loadTilesWithAjax = this.loadTilesWithAjax; + } + if (!$.isPlainObject(options.ajaxHeaders)) { + options.ajaxHeaders = {}; + } + + var myQueueItem = { + options: options + }; + + function raiseAddItemFailed( event ) { + for (var i = 0; i < _this._loadQueue.length; i++) { + if (_this._loadQueue[i] === myQueueItem) { + _this._loadQueue.splice(i, 1); + break; + } + } + + if (_this._loadQueue.length === 0) { + refreshWorld(myQueueItem); + } + + /** + * Raised when an error occurs while adding a item. + * @event add-item-failed + * @memberOf OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {String} message + * @property {String} source + * @property {Object} options The options passed to the addTiledImage method. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'add-item-failed', event ); + + if (options.error) { + options.error(event); + } + } + + function refreshWorld(theItem) { + if (_this.collectionMode) { + _this.world.arrange({ + immediately: theItem.options.collectionImmediately, + rows: _this.collectionRows, + columns: _this.collectionColumns, + layout: _this.collectionLayout, + tileSize: _this.collectionTileSize, + tileMargin: _this.collectionTileMargin + }); + _this.world.setAutoRefigureSizes(true); + } + } + + if ($.isArray(options.tileSource)) { + setTimeout(function() { + raiseAddItemFailed({ + message: "[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.", + source: options.tileSource, + options: options + }); + }); + return; + } + + this._loadQueue.push(myQueueItem); + + function processReadyItems() { + var queueItem, tiledImage, optionsClone; + while (_this._loadQueue.length) { + queueItem = _this._loadQueue[0]; + if (!queueItem.tileSource) { + break; + } + + _this._loadQueue.splice(0, 1); + + if (queueItem.options.replace) { + var newIndex = _this.world.getIndexOfItem(queueItem.options.replaceItem); + if (newIndex !== -1) { + queueItem.options.index = newIndex; + } + _this.world.removeItem(queueItem.options.replaceItem); + } + + tiledImage = new $.TiledImage({ + viewer: _this, + source: queueItem.tileSource, + viewport: _this.viewport, + drawer: _this.drawer, + tileCache: _this.tileCache, + imageLoader: _this.imageLoader, + x: queueItem.options.x, + y: queueItem.options.y, + width: queueItem.options.width, + height: queueItem.options.height, + fitBounds: queueItem.options.fitBounds, + fitBoundsPlacement: queueItem.options.fitBoundsPlacement, + clip: queueItem.options.clip, + placeholderFillStyle: queueItem.options.placeholderFillStyle, + opacity: queueItem.options.opacity, + preload: queueItem.options.preload, + degrees: queueItem.options.degrees, + flipped: queueItem.options.flipped, + compositeOperation: queueItem.options.compositeOperation, + springStiffness: _this.springStiffness, + animationTime: _this.animationTime, + minZoomImageRatio: _this.minZoomImageRatio, + wrapHorizontal: _this.wrapHorizontal, + wrapVertical: _this.wrapVertical, + immediateRender: _this.immediateRender, + blendTime: _this.blendTime, + alwaysBlend: _this.alwaysBlend, + minPixelRatio: _this.minPixelRatio, + smoothTileEdgesMinZoom: _this.smoothTileEdgesMinZoom, + iOSDevice: _this.iOSDevice, + crossOriginPolicy: queueItem.options.crossOriginPolicy, + ajaxWithCredentials: queueItem.options.ajaxWithCredentials, + loadTilesWithAjax: queueItem.options.loadTilesWithAjax, + ajaxHeaders: queueItem.options.ajaxHeaders, + debugMode: _this.debugMode, + subPixelRoundingForTransparency: _this.subPixelRoundingForTransparency + }); + + if (_this.collectionMode) { + _this.world.setAutoRefigureSizes(false); + } + + if (_this.navigator) { + optionsClone = $.extend({}, queueItem.options, { + replace: false, // navigator already removed the layer, nothing to replace + originalTiledImage: tiledImage, + tileSource: queueItem.tileSource + }); + + _this.navigator.addTiledImage(optionsClone); + } + + _this.world.addItem( tiledImage, { + index: queueItem.options.index + }); + + if (_this._loadQueue.length === 0) { + //this restores the autoRefigureSizes flag to true. + refreshWorld(queueItem); + } + + if (_this.world.getItemCount() === 1 && !_this.preserveViewport) { + _this.viewport.goHome(true); + } + + if (queueItem.options.success) { + queueItem.options.success({ + item: tiledImage + }); + } + } + } + + getTileSourceImplementation( this, options.tileSource, options, function( tileSource ) { + + myQueueItem.tileSource = tileSource; + + // add everybody at the front of the queue that's ready to go + processReadyItems(); + }, function( event ) { + event.options = options; + raiseAddItemFailed(event); + + // add everybody at the front of the queue that's ready to go + processReadyItems(); + } ); + }, + + /** + * Add a simple image to the viewer. + * The options are the same as the ones in {@link OpenSeadragon.Viewer#addTiledImage} + * except for options.tileSource which is replaced by options.url. + * @function + * @param {Object} options - See {@link OpenSeadragon.Viewer#addTiledImage} + * for all the options + * @param {String} options.url - The URL of the image to add. + * @fires OpenSeadragon.World.event:add-item + * @fires OpenSeadragon.Viewer.event:add-item-failed + */ + addSimpleImage: function(options) { + $.console.assert(options, "[Viewer.addSimpleImage] options is required"); + $.console.assert(options.url, "[Viewer.addSimpleImage] options.url is required"); + + var opts = $.extend({}, options, { + tileSource: { + type: 'image', + url: options.url + } + }); + delete opts.url; + this.addTiledImage(opts); + }, + + // deprecated + addLayer: function( options ) { + var _this = this; + + $.console.error( "[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead." ); + + var optionsClone = $.extend({}, options, { + success: function(event) { + _this.raiseEvent("add-layer", { + options: options, + drawer: event.item + }); + }, + error: function(event) { + _this.raiseEvent("add-layer-failed", event); + } + }); + + this.addTiledImage(optionsClone); + return this; + }, + + // deprecated + getLayerAtLevel: function( level ) { + $.console.error( "[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead." ); + return this.world.getItemAt(level); + }, + + // deprecated + getLevelOfLayer: function( drawer ) { + $.console.error( "[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead." ); + return this.world.getIndexOfItem(drawer); + }, + + // deprecated + getLayersCount: function() { + $.console.error( "[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead." ); + return this.world.getItemCount(); + }, + + // deprecated + setLayerLevel: function( drawer, level ) { + $.console.error( "[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead." ); + return this.world.setItemIndex(drawer, level); + }, + + // deprecated + removeLayer: function( drawer ) { + $.console.error( "[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead." ); + return this.world.removeItem(drawer); + }, + + /** + * Force the viewer to redraw its contents. + * @returns {OpenSeadragon.Viewer} Chainable. + */ + forceRedraw: function() { + THIS[ this.hash ].forceRedraw = true; + return this; + }, + + /** + * Force the viewer to reset its size to match its container. + */ + forceResize: function() { + THIS[this.hash].needsResize = true; + THIS[this.hash].forceResize = true; + }, + + /** + * @function + * @returns {OpenSeadragon.Viewer} Chainable. + */ + bindSequenceControls: function(){ + + ////////////////////////////////////////////////////////////////////////// + // Image Sequence Controls + ////////////////////////////////////////////////////////////////////////// + var onFocusHandler = $.delegate( this, onFocus ), + onBlurHandler = $.delegate( this, onBlur ), + onNextHandler = $.delegate( this, this.goToNextPage ), + onPreviousHandler = $.delegate( this, this.goToPreviousPage ), + navImages = this.navImages, + useGroup = true; + + if( this.showSequenceControl ){ + + if( this.previousButton || this.nextButton ){ + //if we are binding to custom buttons then layout and + //grouping is the responsibility of the page author + useGroup = false; + } + + this.previousButton = new $.Button({ + element: this.previousButton ? $.getElement( this.previousButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.PreviousPage" ), + srcRest: resolveUrl( this.prefixUrl, navImages.previous.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.previous.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.previous.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.previous.DOWN ), + onRelease: onPreviousHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + }); + + this.nextButton = new $.Button({ + element: this.nextButton ? $.getElement( this.nextButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.NextPage" ), + srcRest: resolveUrl( this.prefixUrl, navImages.next.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.next.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.next.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.next.DOWN ), + onRelease: onNextHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + }); + + if( !this.navPrevNextWrap ){ + this.previousButton.disable(); + } + + if (!this.tileSources || !this.tileSources.length) { + this.nextButton.disable(); + } + + if( useGroup ){ + this.paging = new $.ButtonGroup({ + buttons: [ + this.previousButton, + this.nextButton + ], + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold + }); + + this.pagingControl = this.paging.element; + + if( this.toolbar ){ + this.toolbar.addControl( + this.pagingControl, + {anchor: $.ControlAnchor.BOTTOM_RIGHT} + ); + }else{ + this.addControl( + this.pagingControl, + {anchor: this.sequenceControlAnchor || $.ControlAnchor.TOP_LEFT} + ); + } + } + } + return this; + }, + + + /** + * @function + * @returns {OpenSeadragon.Viewer} Chainable. + */ + bindStandardControls: function(){ + ////////////////////////////////////////////////////////////////////////// + // Navigation Controls + ////////////////////////////////////////////////////////////////////////// + var beginZoomingInHandler = $.delegate( this, beginZoomingIn ), + endZoomingHandler = $.delegate( this, endZooming ), + doSingleZoomInHandler = $.delegate( this, doSingleZoomIn ), + beginZoomingOutHandler = $.delegate( this, beginZoomingOut ), + doSingleZoomOutHandler = $.delegate( this, doSingleZoomOut ), + onHomeHandler = $.delegate( this, onHome ), + onFullScreenHandler = $.delegate( this, onFullScreen ), + onRotateLeftHandler = $.delegate( this, onRotateLeft ), + onRotateRightHandler = $.delegate( this, onRotateRight ), + onFlipHandler = $.delegate( this, onFlip), + onFocusHandler = $.delegate( this, onFocus ), + onBlurHandler = $.delegate( this, onBlur ), + navImages = this.navImages, + buttons = [], + useGroup = true; + + + if ( this.showNavigationControl ) { + + if( this.zoomInButton || this.zoomOutButton || + this.homeButton || this.fullPageButton || + this.rotateLeftButton || this.rotateRightButton || + this.flipButton ) { + //if we are binding to custom buttons then layout and + //grouping is the responsibility of the page author + useGroup = false; + } + + if ( this.showZoomControl ) { + buttons.push( this.zoomInButton = new $.Button({ + element: this.zoomInButton ? $.getElement( this.zoomInButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.ZoomIn" ), + srcRest: resolveUrl( this.prefixUrl, navImages.zoomIn.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.zoomIn.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.zoomIn.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.zoomIn.DOWN ), + onPress: beginZoomingInHandler, + onRelease: endZoomingHandler, + onClick: doSingleZoomInHandler, + onEnter: beginZoomingInHandler, + onExit: endZoomingHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + + buttons.push( this.zoomOutButton = new $.Button({ + element: this.zoomOutButton ? $.getElement( this.zoomOutButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.ZoomOut" ), + srcRest: resolveUrl( this.prefixUrl, navImages.zoomOut.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.zoomOut.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.zoomOut.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.zoomOut.DOWN ), + onPress: beginZoomingOutHandler, + onRelease: endZoomingHandler, + onClick: doSingleZoomOutHandler, + onEnter: beginZoomingOutHandler, + onExit: endZoomingHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + } + + if ( this.showHomeControl ) { + buttons.push( this.homeButton = new $.Button({ + element: this.homeButton ? $.getElement( this.homeButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.Home" ), + srcRest: resolveUrl( this.prefixUrl, navImages.home.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.home.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.home.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.home.DOWN ), + onRelease: onHomeHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + } + + if ( this.showFullPageControl ) { + buttons.push( this.fullPageButton = new $.Button({ + element: this.fullPageButton ? $.getElement( this.fullPageButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.FullPage" ), + srcRest: resolveUrl( this.prefixUrl, navImages.fullpage.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.fullpage.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.fullpage.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.fullpage.DOWN ), + onRelease: onFullScreenHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + } + + if ( this.showRotationControl ) { + buttons.push( this.rotateLeftButton = new $.Button({ + element: this.rotateLeftButton ? $.getElement( this.rotateLeftButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.RotateLeft" ), + srcRest: resolveUrl( this.prefixUrl, navImages.rotateleft.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.rotateleft.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.rotateleft.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.rotateleft.DOWN ), + onRelease: onRotateLeftHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + + buttons.push( this.rotateRightButton = new $.Button({ + element: this.rotateRightButton ? $.getElement( this.rotateRightButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.RotateRight" ), + srcRest: resolveUrl( this.prefixUrl, navImages.rotateright.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.rotateright.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.rotateright.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.rotateright.DOWN ), + onRelease: onRotateRightHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + } + + if ( this.showFlipControl ) { + buttons.push( this.flipButton = new $.Button({ + element: this.flipButton ? $.getElement( this.flipButton ) : null, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + tooltip: $.getString( "Tooltips.Flip" ), + srcRest: resolveUrl( this.prefixUrl, navImages.flip.REST ), + srcGroup: resolveUrl( this.prefixUrl, navImages.flip.GROUP ), + srcHover: resolveUrl( this.prefixUrl, navImages.flip.HOVER ), + srcDown: resolveUrl( this.prefixUrl, navImages.flip.DOWN ), + onRelease: onFlipHandler, + onFocus: onFocusHandler, + onBlur: onBlurHandler + })); + } + + if ( useGroup ) { + this.buttonGroup = new $.ButtonGroup({ + buttons: buttons, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold + }); + + this.navControl = this.buttonGroup.element; + this.addHandler( 'open', $.delegate( this, lightUp ) ); + + if( this.toolbar ){ + this.toolbar.addControl( + this.navControl, + {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT} + ); + } else { + this.addControl( + this.navControl, + {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT} + ); + } + } else { + this.customButtons = buttons; + } + + } + return this; + }, + + /** + * Gets the active page of a sequence + * @function + * @returns {Number} + */ + currentPage: function() { + return this._sequenceIndex; + }, + + /** + * @function + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:page + */ + goToPage: function( page ){ + if( this.tileSources && page >= 0 && page < this.tileSources.length ){ + this._sequenceIndex = page; + + this._updateSequenceButtons( page ); + + this.open( this.tileSources[ page ] ); + + if( this.referenceStrip ){ + this.referenceStrip.setFocus( page ); + } + + /** + * Raised when the page is changed on a viewer configured with multiple image sources (see {@link OpenSeadragon.Viewer#goToPage}). + * + * @event page + * @memberof OpenSeadragon.Viewer + * @type {Object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Number} page - The page index. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'page', { page: page } ); + } + + return this; + }, + + /** + * Adds an html element as an overlay to the current viewport. Useful for + * highlighting words or areas of interest on an image or other zoomable + * interface. The overlays added via this method are removed when the viewport + * is closed which include when changing page. + * @method + * @param {Element|String|Object} element - A reference to an element or an id for + * the element which will be overlaid. Or an Object specifying the configuration for the overlay. + * If using an object, see {@link OpenSeadragon.Overlay} for a list of + * all available options. + * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or + * rectangle which will be overlaid. This is a viewport relative location. + * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the + * viewport which the location coordinates will be treated as relative + * to. + * @param {function} [onDraw] - If supplied the callback is called when the overlay + * needs to be drawn. It it the responsibility of the callback to do any drawing/positioning. + * It is passed position, size and element. + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:add-overlay + */ + addOverlay: function( element, location, placement, onDraw ) { + var options; + if( $.isPlainObject( element ) ){ + options = element; + } else { + options = { + element: element, + location: location, + placement: placement, + onDraw: onDraw + }; + } + + element = $.getElement( options.element ); + + if ( getOverlayIndex( this.currentOverlays, element ) >= 0 ) { + // they're trying to add a duplicate overlay + return this; + } + + var overlay = getOverlayObject( this, options); + this.currentOverlays.push(overlay); + overlay.drawHTML( this.overlaysContainer, this.viewport ); + + /** + * Raised when an overlay is added to the viewer (see {@link OpenSeadragon.Viewer#addOverlay}). + * + * @event add-overlay + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Element} element - The overlay element. + * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location + * @property {OpenSeadragon.Placement} placement + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'add-overlay', { + element: element, + location: options.location, + placement: options.placement + }); + return this; + }, + + /** + * Updates the overlay represented by the reference to the element or + * element id moving it to the new location, relative to the new placement. + * @method + * @param {Element|String} element - A reference to an element or an id for + * the element which is overlaid. + * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or + * rectangle which will be overlaid. This is a viewport relative location. + * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the + * viewport which the location coordinates will be treated as relative + * to. + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:update-overlay + */ + updateOverlay: function( element, location, placement ) { + var i; + + element = $.getElement( element ); + i = getOverlayIndex( this.currentOverlays, element ); + + if ( i >= 0 ) { + this.currentOverlays[ i ].update( location, placement ); + THIS[ this.hash ].forceRedraw = true; + /** + * Raised when an overlay's location or placement changes + * (see {@link OpenSeadragon.Viewer#updateOverlay}). + * + * @event update-overlay + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the + * Viewer which raised the event. + * @property {Element} element + * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location + * @property {OpenSeadragon.Placement} placement + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'update-overlay', { + element: element, + location: location, + placement: placement + }); + } + return this; + }, + + /** + * Removes an overlay identified by the reference element or element id + * and schedules an update. + * @method + * @param {Element|String} element - A reference to the element or an + * element id which represent the ovelay content to be removed. + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:remove-overlay + */ + removeOverlay: function( element ) { + var i; + + element = $.getElement( element ); + i = getOverlayIndex( this.currentOverlays, element ); + + if ( i >= 0 ) { + this.currentOverlays[ i ].destroy(); + this.currentOverlays.splice( i, 1 ); + THIS[ this.hash ].forceRedraw = true; + /** + * Raised when an overlay is removed from the viewer + * (see {@link OpenSeadragon.Viewer#removeOverlay}). + * + * @event remove-overlay + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the + * Viewer which raised the event. + * @property {Element} element - The overlay element. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'remove-overlay', { + element: element + }); + } + return this; + }, + + /** + * Removes all currently configured Overlays from this Viewer and schedules + * an update. + * @method + * @returns {OpenSeadragon.Viewer} Chainable. + * @fires OpenSeadragon.Viewer.event:clear-overlay + */ + clearOverlays: function() { + while ( this.currentOverlays.length > 0 ) { + this.currentOverlays.pop().destroy(); + } + THIS[ this.hash ].forceRedraw = true; + /** + * Raised when all overlays are removed from the viewer (see {@link OpenSeadragon.Drawer#clearOverlays}). + * + * @event clear-overlay + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'clear-overlay', {} ); + return this; + }, + + /** + * Finds an overlay identified by the reference element or element id + * and returns it as an object, return null if not found. + * @method + * @param {Element|String} element - A reference to the element or an + * element id which represents the overlay content. + * @returns {OpenSeadragon.Overlay} the matching overlay or null if none found. + */ + getOverlayById: function( element ) { + var i; + + element = $.getElement( element ); + i = getOverlayIndex( this.currentOverlays, element ); + + if (i >= 0) { + return this.currentOverlays[i]; + } else { + return null; + } + }, + + /** + * Updates the sequence buttons. + * @function OpenSeadragon.Viewer.prototype._updateSequenceButtons + * @private + * @param {Number} Sequence Value + */ + _updateSequenceButtons: function( page ) { + + if ( this.nextButton ) { + if(!this.tileSources || this.tileSources.length - 1 === page) { + //Disable next button + if ( !this.navPrevNextWrap ) { + this.nextButton.disable(); + } + } else { + this.nextButton.enable(); + } + } + if ( this.previousButton ) { + if ( page > 0 ) { + //Enable previous button + this.previousButton.enable(); + } else { + if ( !this.navPrevNextWrap ) { + this.previousButton.disable(); + } + } + } + }, + + /** + * Display a message in the viewport + * @function OpenSeadragon.Viewer.prototype._showMessage + * @private + * @param {String} text message + */ + _showMessage: function ( message ) { + this._hideMessage(); + + var div = $.makeNeutralElement( "div" ); + div.appendChild( document.createTextNode( message ) ); + + this.messageDiv = $.makeCenteredNode( div ); + + $.addClass(this.messageDiv, "openseadragon-message"); + + this.container.appendChild( this.messageDiv ); + }, + + /** + * Hide any currently displayed viewport message + * @function OpenSeadragon.Viewer.prototype._hideMessage + * @private + */ + _hideMessage: function () { + var div = this.messageDiv; + if (div) { + div.parentNode.removeChild(div); + delete this.messageDiv; + } + }, + + /** + * Gets this viewer's gesture settings for the given pointer device type. + * @method + * @param {String} type - The pointer device type to get the gesture settings for ("mouse", "touch", "pen", etc.). + * @returns {OpenSeadragon.GestureSettings} + */ + gestureSettingsByDeviceType: function ( type ) { + switch ( type ) { + case 'mouse': + return this.gestureSettingsMouse; + case 'touch': + return this.gestureSettingsTouch; + case 'pen': + return this.gestureSettingsPen; + default: + return this.gestureSettingsUnknown; + } + }, + + // private + _drawOverlays: function() { + var i, + length = this.currentOverlays.length; + for ( i = 0; i < length; i++ ) { + this.currentOverlays[ i ].drawHTML( this.overlaysContainer, this.viewport ); + } + }, + + /** + * Cancel the "in flight" images. + */ + _cancelPendingImages: function() { + this._loadQueue = []; + }, + + /** + * Removes the reference strip and disables displaying it. + * @function + */ + removeReferenceStrip: function() { + this.showReferenceStrip = false; + + if (this.referenceStrip) { + this.referenceStrip.destroy(); + this.referenceStrip = null; + } + }, + + /** + * Enables and displays the reference strip based on the currently set tileSources. + * Works only when the Viewer has sequenceMode set to true. + * @function + */ + addReferenceStrip: function() { + this.showReferenceStrip = true; + + if (this.sequenceMode) { + if (this.referenceStrip) { + return; + } + + if (this.tileSources.length && this.tileSources.length > 1) { + this.referenceStrip = new $.ReferenceStrip({ + id: this.referenceStripElement, + position: this.referenceStripPosition, + sizeRatio: this.referenceStripSizeRatio, + scroll: this.referenceStripScroll, + height: this.referenceStripHeight, + width: this.referenceStripWidth, + tileSources: this.tileSources, + prefixUrl: this.prefixUrl, + useCanvas: this.useCanvas, + viewer: this + }); + + this.referenceStrip.setFocus( this._sequenceIndex ); + } + } else { + $.console.warn('Attempting to display a reference strip while "sequenceMode" is off.'); + } + }, + + /** + * Adds _updatePixelDensityRatio to the window resize event. + * @private + */ + _addUpdatePixelDensityRatioEvent: function() { + this._updatePixelDensityRatioBind = this._updatePixelDensityRatio.bind(this); + $.addEvent( window, 'resize', this._updatePixelDensityRatioBind ); + }, + + /** + * Removes _updatePixelDensityRatio from the window resize event. + * @private + */ + _removeUpdatePixelDensityRatioEvent: function() { + $.removeEvent( window, 'resize', this._updatePixelDensityRatioBind ); + }, + + /** + * Update pixel density ratio, clears all tiles and triggers updates for + * all items if the ratio has changed. + * @private + */ + _updatePixelDensityRatio: function() { + var previusPixelDensityRatio = $.pixelDensityRatio; + var currentPixelDensityRatio = $.getCurrentPixelDensityRatio(); + if (previusPixelDensityRatio !== currentPixelDensityRatio) { + $.pixelDensityRatio = currentPixelDensityRatio; + this.world.resetItems(); + this.forceRedraw(); + } + }, + + /** + * Sets the image source to the source with index equal to + * currentIndex - 1. Changes current image in sequence mode. + * If specified, wraps around (see navPrevNextWrap in + * {@link OpenSeadragon.Options}) + * + * @method + */ + + goToPreviousPage: function () { + var previous = this._sequenceIndex - 1; + if(this.navPrevNextWrap && previous < 0){ + previous += this.tileSources.length; + } + this.goToPage( previous ); + }, + + /** + * Sets the image source to the source with index equal to + * currentIndex + 1. Changes current image in sequence mode. + * If specified, wraps around (see navPrevNextWrap in + * {@link OpenSeadragon.Options}) + * + * @method + */ + goToNextPage: function () { + var next = this._sequenceIndex + 1; + if(this.navPrevNextWrap && next >= this.tileSources.length){ + next = 0; + } + this.goToPage( next ); + }, + + isAnimating: function () { + return THIS[ this.hash ].animating; + }, +}); + + +/** + * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y, + * which was causing some calling operations to return NaN. + * @returns {Point} + * @private + */ +function _getSafeElemSize (oElement) { + oElement = $.getElement( oElement ); + + return new $.Point( + (oElement.clientWidth === 0 ? 1 : oElement.clientWidth), + (oElement.clientHeight === 0 ? 1 : oElement.clientHeight) + ); +} + + +/** + * @function + * @private + */ +function getTileSourceImplementation( viewer, tileSource, imgOptions, successCallback, + failCallback ) { + var _this = viewer; + + //allow plain xml strings or json strings to be parsed here + if ( $.type( tileSource ) === 'string' ) { + //xml should start with "<" and end with ">" + if ( tileSource.match( /^\s*<.*>\s*$/ ) ) { + tileSource = $.parseXml( tileSource ); + //json should start with "{" or "[" and end with "}" or "]" + } else if ( tileSource.match(/^\s*[{[].*[}\]]\s*$/ ) ) { + try { + var tileSourceJ = $.parseJSON(tileSource); + tileSource = tileSourceJ; + } catch (e) { + //tileSource = tileSource; + } + } + } + + function waitUntilReady(tileSource, originalTileSource) { + if (tileSource.ready) { + successCallback(tileSource); + } else { + tileSource.addHandler('ready', function () { + successCallback(tileSource); + }); + tileSource.addHandler('open-failed', function (event) { + failCallback({ + message: event.message, + source: originalTileSource + }); + }); + } + } + + setTimeout( function() { + if ( $.type( tileSource ) === 'string' ) { + //If its still a string it means it must be a url at this point + tileSource = new $.TileSource({ + url: tileSource, + crossOriginPolicy: imgOptions.crossOriginPolicy !== undefined ? + imgOptions.crossOriginPolicy : viewer.crossOriginPolicy, + ajaxWithCredentials: viewer.ajaxWithCredentials, + ajaxHeaders: imgOptions.ajaxHeaders ? + imgOptions.ajaxHeaders : viewer.ajaxHeaders, + splitHashDataForPost: viewer.splitHashDataForPost, + useCanvas: viewer.useCanvas, + success: function( event ) { + successCallback( event.tileSource ); + } + }); + tileSource.addHandler( 'open-failed', function( event ) { + failCallback( event ); + } ); + + } else if ($.isPlainObject(tileSource) || tileSource.nodeType) { + if (tileSource.crossOriginPolicy === undefined && + (imgOptions.crossOriginPolicy !== undefined || viewer.crossOriginPolicy !== undefined)) { + tileSource.crossOriginPolicy = imgOptions.crossOriginPolicy !== undefined ? + imgOptions.crossOriginPolicy : viewer.crossOriginPolicy; + } + if (tileSource.ajaxWithCredentials === undefined) { + tileSource.ajaxWithCredentials = viewer.ajaxWithCredentials; + } + if (tileSource.useCanvas === undefined) { + tileSource.useCanvas = viewer.useCanvas; + } + + if ( $.isFunction( tileSource.getTileUrl ) ) { + //Custom tile source + var customTileSource = new $.TileSource( tileSource ); + customTileSource.getTileUrl = tileSource.getTileUrl; + successCallback( customTileSource ); + } else { + //inline configuration + var $TileSource = $.TileSource.determineType( _this, tileSource ); + if ( !$TileSource ) { + failCallback( { + message: "Unable to load TileSource", + source: tileSource + }); + return; + } + var options = $TileSource.prototype.configure.apply( _this, [ tileSource ] ); + waitUntilReady(new $TileSource(options), tileSource); + } + } else { + //can assume it's already a tile source implementation + waitUntilReady(tileSource, tileSource); + } + }); +} + +function getOverlayObject( viewer, overlay ) { + if ( overlay instanceof $.Overlay ) { + return overlay; + } + + var element = null; + if ( overlay.element ) { + element = $.getElement( overlay.element ); + } else { + var id = overlay.id ? + overlay.id : + "openseadragon-overlay-" + Math.floor( Math.random() * 10000000 ); + + element = $.getElement( overlay.id ); + if ( !element ) { + element = document.createElement( "a" ); + element.href = "#/overlay/" + id; + } + element.id = id; + $.addClass( element, overlay.className ? + overlay.className : + "openseadragon-overlay" + ); + } + + var location = overlay.location; + var width = overlay.width; + var height = overlay.height; + if (!location) { + var x = overlay.x; + var y = overlay.y; + if (overlay.px !== undefined) { + var rect = viewer.viewport.imageToViewportRectangle(new $.Rect( + overlay.px, + overlay.py, + width || 0, + height || 0)); + x = rect.x; + y = rect.y; + width = width !== undefined ? rect.width : undefined; + height = height !== undefined ? rect.height : undefined; + } + location = new $.Point(x, y); + } + + var placement = overlay.placement; + if (placement && $.type(placement) === "string") { + placement = $.Placement[overlay.placement.toUpperCase()]; + } + + return new $.Overlay({ + element: element, + location: location, + placement: placement, + onDraw: overlay.onDraw, + checkResize: overlay.checkResize, + width: width, + height: height, + rotationMode: overlay.rotationMode + }); +} + +/** + * @private + * @inner + * Determines the index of the given overlay in the given overlays array. + */ +function getOverlayIndex( overlays, element ) { + var i; + for ( i = overlays.length - 1; i >= 0; i-- ) { + if ( overlays[ i ].element === element ) { + return i; + } + } + + return -1; +} + +/////////////////////////////////////////////////////////////////////////////// +// Schedulers provide the general engine for animation +/////////////////////////////////////////////////////////////////////////////// +function scheduleUpdate( viewer, updateFunc ){ + return $.requestAnimationFrame( function(){ + updateFunc( viewer ); + } ); +} + + +//provides a sequence in the fade animation +function scheduleControlsFade( viewer ) { + $.requestAnimationFrame( function(){ + updateControlsFade( viewer ); + }); +} + + +//initiates an animation to hide the controls +function beginControlsAutoHide( viewer ) { + if ( !viewer.autoHideControls ) { + return; + } + viewer.controlsShouldFade = true; + viewer.controlsFadeBeginTime = + $.now() + + viewer.controlsFadeDelay; + + window.setTimeout( function(){ + scheduleControlsFade( viewer ); + }, viewer.controlsFadeDelay ); +} + + +//determines if fade animation is done or continues the animation +function updateControlsFade( viewer ) { + var currentTime, + deltaTime, + opacity, + i; + if ( viewer.controlsShouldFade ) { + currentTime = $.now(); + deltaTime = currentTime - viewer.controlsFadeBeginTime; + opacity = 1.0 - deltaTime / viewer.controlsFadeLength; + + opacity = Math.min( 1.0, opacity ); + opacity = Math.max( 0.0, opacity ); + + for ( i = viewer.controls.length - 1; i >= 0; i--) { + if (viewer.controls[ i ].autoFade) { + viewer.controls[ i ].setOpacity( opacity ); + } + } + + if ( opacity > 0 ) { + // fade again + scheduleControlsFade( viewer ); + } + } +} + + +//stop the fade animation on the controls and show them +function abortControlsAutoHide( viewer ) { + var i; + viewer.controlsShouldFade = false; + for ( i = viewer.controls.length - 1; i >= 0; i-- ) { + viewer.controls[ i ].setOpacity( 1.0 ); + } +} + + + +/////////////////////////////////////////////////////////////////////////////// +// Default view event handlers. +/////////////////////////////////////////////////////////////////////////////// +function onFocus(){ + abortControlsAutoHide( this ); +} + +function onBlur(){ + beginControlsAutoHide( this ); + +} + +function onCanvasContextMenu( event ) { + var eventArgs = { + tracker: event.eventSource, + position: event.position, + originalEvent: event.originalEvent, + preventDefault: event.preventDefault + }; + + /** + * Raised when a contextmenu event occurs in the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-contextmenu + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the contextmenu event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-contextmenu', eventArgs ); + + event.preventDefault = eventArgs.preventDefault; +} + +function onCanvasKeyDown( event ) { + var canvasKeyDownEventArgs = { + originalEvent: event.originalEvent, + preventDefaultAction: false, + preventVerticalPan: event.preventVerticalPan || !this.panVertical, + preventHorizontalPan: event.preventHorizontalPan || !this.panHorizontal + }; + + /** + * Raised when a keyboard key is pressed and the focus is on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-key + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefaultAction - Set to true to prevent default keyboard behaviour. Default: false. + * @property {Boolean} preventVerticalPan - Set to true to prevent keyboard vertical panning. Default: false. + * @property {Boolean} preventHorizontalPan - Set to true to prevent keyboard horizontal panning. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + + this.raiseEvent('canvas-key', canvasKeyDownEventArgs); + + if ( !canvasKeyDownEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) { + switch( event.keyCode ){ + case 38://up arrow/shift uparrow + if (!canvasKeyDownEventArgs.preventVerticalPan) { + if ( event.shift ) { + this.viewport.zoomBy(1.1); + } else { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -this.pixelsPerArrowPress))); + } + this.viewport.applyConstraints(); + } + event.preventDefault = true; + break; + case 40://down arrow/shift downarrow + if (!canvasKeyDownEventArgs.preventVerticalPan) { + if ( event.shift ) { + this.viewport.zoomBy(0.9); + } else { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, this.pixelsPerArrowPress))); + } + this.viewport.applyConstraints(); + } + event.preventDefault = true; + break; + case 37://left arrow + if (!canvasKeyDownEventArgs.preventHorizontalPan) { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-this.pixelsPerArrowPress, 0))); + this.viewport.applyConstraints(); + } + event.preventDefault = true; + break; + case 39://right arrow + if (!canvasKeyDownEventArgs.preventHorizontalPan) { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(this.pixelsPerArrowPress, 0))); + this.viewport.applyConstraints(); + } + event.preventDefault = true; + break; + case 187://=|+ + this.viewport.zoomBy(1.1); + this.viewport.applyConstraints(); + event.preventDefault = true; + break; + case 189://-|_ + this.viewport.zoomBy(0.9); + this.viewport.applyConstraints(); + event.preventDefault = true; + break; + case 48://0|) + this.viewport.goHome(); + this.viewport.applyConstraints(); + event.preventDefault = true; + break; + case 87://W/w + if (!canvasKeyDownEventArgs.preventVerticalPan) { + if ( event.shift ) { + this.viewport.zoomBy(1.1); + } else { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40))); + } + this.viewport.applyConstraints(); + } + event.preventDefault = true; + break; + case 83://S/s + if (!canvasKeyDownEventArgs.preventVerticalPan) { + if ( event.shift ) { + this.viewport.zoomBy(0.9); + } else { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40))); + } + this.viewport.applyConstraints(); + } + event.preventDefault = true; + break; + case 65://a/A + if (!canvasKeyDownEventArgs.preventHorizontalPan) { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0))); + this.viewport.applyConstraints(); + } + event.preventDefault = true; + break; + case 68://d/D + if (!canvasKeyDownEventArgs.preventHorizontalPan) { + this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0))); + this.viewport.applyConstraints(); + } + event.preventDefault = true; + break; + case 82: //r - clockwise rotation/R - counterclockwise rotation + if(event.shift){ + if(this.viewport.flipped){ + this.viewport.setRotation(this.viewport.getRotation() + this.rotationIncrement); + } else{ + this.viewport.setRotation(this.viewport.getRotation() - this.rotationIncrement); + } + }else{ + if(this.viewport.flipped){ + this.viewport.setRotation(this.viewport.getRotation() - this.rotationIncrement); + } else{ + this.viewport.setRotation(this.viewport.getRotation() + this.rotationIncrement); + } + } + this.viewport.applyConstraints(); + event.preventDefault = true; + break; + case 70: //f/F + this.viewport.toggleFlip(); + event.preventDefault = true; + break; + case 74: //j - previous image source + this.goToPreviousPage(); + break; + case 75: //k - next image source + this.goToNextPage(); + break; + default: + //console.log( 'navigator keycode %s', event.keyCode ); + event.preventDefault = false; + break; + } + } else { + event.preventDefault = false; + } +} + +function onCanvasKeyPress( event ) { + var canvasKeyPressEventArgs = { + originalEvent: event.originalEvent, + }; + + /** + * Raised when a keyboard key is pressed and the focus is on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-key-press + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + + this.raiseEvent('canvas-key-press', canvasKeyPressEventArgs); +} + +function onCanvasClick( event ) { + var gestureSettings; + + var haveKeyboardFocus = document.activeElement === this.canvas; + + // If we don't have keyboard focus, request it. + if ( !haveKeyboardFocus ) { + this.canvas.focus(); + } + if(this.viewport.flipped){ + event.position.x = this.viewport.getContainerSize().x - event.position.x; + } + + var canvasClickEventArgs = { + tracker: event.eventSource, + position: event.position, + quick: event.quick, + shift: event.shift, + originalEvent: event.originalEvent, + originalTarget: event.originalTarget, + preventDefaultAction: false + }; + + /** + * Raised when a mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-click + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {Element} originalTarget - The DOM element clicked on. + * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + + this.raiseEvent( 'canvas-click', canvasClickEventArgs); + + + if ( !canvasClickEventArgs.preventDefaultAction && this.viewport && event.quick ) { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + + if (gestureSettings.clickToZoom === true){ + this.viewport.zoomBy( + event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick, + gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null + ); + this.viewport.applyConstraints(); + } + + if( gestureSettings.dblClickDragToZoom){ + if(THIS[ this.hash ].draggingToZoom === true){ + THIS[ this.hash ].lastClickTime = null; + THIS[ this.hash ].draggingToZoom = false; + } + else{ + THIS[ this.hash ].lastClickTime = $.now(); + } + } + + } +} + +function onCanvasDblClick( event ) { + var gestureSettings; + + var canvasDblClickEventArgs = { + tracker: event.eventSource, + position: event.position, + shift: event.shift, + originalEvent: event.originalEvent, + preventDefaultAction: false + }; + + /** + * Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-double-click + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefaultAction - Set to true to prevent default double tap to zoom behaviour. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-double-click', canvasDblClickEventArgs); + + if ( !canvasDblClickEventArgs.preventDefaultAction && this.viewport ) { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if ( gestureSettings.dblClickToZoom ) { + this.viewport.zoomBy( + event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick, + gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null + ); + this.viewport.applyConstraints(); + } + } +} + +function onCanvasDrag( event ) { + var gestureSettings; + + var canvasDragEventArgs = { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + delta: event.delta, + speed: event.speed, + direction: event.direction, + shift: event.shift, + originalEvent: event.originalEvent, + preventDefaultAction: false + }; + + /** + * Raised when a mouse or touch drag operation occurs on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-drag + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag. + * @property {Number} speed - Current computed speed, in pixels per second. + * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefaultAction - Set to true to prevent default drag to pan behaviour. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-drag', canvasDragEventArgs); + + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + + if(!canvasDragEventArgs.preventDefaultAction && this.viewport){ + + if (gestureSettings.dblClickDragToZoom && THIS[ this.hash ].draggingToZoom){ + var factor = Math.pow( this.zoomPerDblClickDrag, event.delta.y / 50); + this.viewport.zoomBy(factor); + } + else if (gestureSettings.dragToPan && !THIS[ this.hash ].draggingToZoom) { + if( !this.panHorizontal ){ + event.delta.x = 0; + } + if( !this.panVertical ){ + event.delta.y = 0; + } + if(this.viewport.flipped){ + event.delta.x = -event.delta.x; + } + + if( this.constrainDuringPan ){ + var delta = this.viewport.deltaPointsFromPixels( event.delta.negate() ); + + this.viewport.centerSpringX.target.value += delta.x; + this.viewport.centerSpringY.target.value += delta.y; + + var constrainedBounds = this.viewport.getConstrainedBounds(); + + this.viewport.centerSpringX.target.value -= delta.x; + this.viewport.centerSpringY.target.value -= delta.y; + + if (constrainedBounds.xConstrained) { + event.delta.x = 0; + } + + if (constrainedBounds.yConstrained) { + event.delta.y = 0; + } + } + this.viewport.panBy( this.viewport.deltaPointsFromPixels( event.delta.negate() ), gestureSettings.flickEnabled && !this.constrainDuringPan); + } + + } + +} + +function onCanvasDragEnd( event ) { + var gestureSettings; + var canvasDragEndEventArgs = { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + speed: event.speed, + direction: event.direction, + shift: event.shift, + originalEvent: event.originalEvent, + preventDefaultAction: false + }; + + /** + * Raised when a mouse or touch drag operation ends on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-drag-end + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} speed - Speed at the end of a drag gesture, in pixels per second. + * @property {Number} direction - Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefaultAction - Set to true to prevent default drag-end flick behaviour. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('canvas-drag-end', canvasDragEndEventArgs); + + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + + if (!canvasDragEndEventArgs.preventDefaultAction && this.viewport) { + if ( !THIS[ this.hash ].draggingToZoom && + gestureSettings.flickEnabled && + event.speed >= gestureSettings.flickMinSpeed) { + var amplitudeX = 0; + if (this.panHorizontal) { + amplitudeX = gestureSettings.flickMomentum * event.speed * + Math.cos(event.direction); + } + var amplitudeY = 0; + if (this.panVertical) { + amplitudeY = gestureSettings.flickMomentum * event.speed * + Math.sin(event.direction); + } + var center = this.viewport.pixelFromPoint( + this.viewport.getCenter(true)); + var target = this.viewport.pointFromPixel( + new $.Point(center.x - amplitudeX, center.y - amplitudeY)); + this.viewport.panTo(target, false); + } + this.viewport.applyConstraints(); + } + + + if( gestureSettings.dblClickDragToZoom && THIS[ this.hash ].draggingToZoom === true ){ + THIS[ this.hash ].draggingToZoom = false; + } + + +} + +function onCanvasEnter( event ) { + /** + * Raised when a pointer enters the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-enter + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Number} pointers - Number of pointers (all types) active in the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-enter', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + buttons: event.buttons, + pointers: event.pointers, + insideElementPressed: event.insideElementPressed, + buttonDownAny: event.buttonDownAny, + originalEvent: event.originalEvent + }); +} + +function onCanvasLeave( event ) { + /** + * Raised when a pointer leaves the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-exit + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Number} pointers - Number of pointers (all types) active in the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-exit', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + buttons: event.buttons, + pointers: event.pointers, + insideElementPressed: event.insideElementPressed, + buttonDownAny: event.buttonDownAny, + originalEvent: event.originalEvent + }); +} + +function onCanvasPress( event ) { + var gestureSettings; + + /** + * Raised when the primary mouse button is pressed or touch starts on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-press + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-press', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + insideElementPressed: event.insideElementPressed, + insideElementReleased: event.insideElementReleased, + originalEvent: event.originalEvent + }); + + + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if ( gestureSettings.dblClickDragToZoom ){ + var lastClickTime = THIS[ this.hash ].lastClickTime; + var currClickTime = $.now(); + + if ( lastClickTime === null) { + return; + } + + if ((currClickTime - lastClickTime) < this.dblClickTimeThreshold) { + THIS[ this.hash ].draggingToZoom = true; + } + + THIS[ this.hash ].lastClickTime = null; + } + +} + +function onCanvasRelease( event ) { + /** + * Raised when the primary mouse button is released or touch ends on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-release + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-release', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + insideElementPressed: event.insideElementPressed, + insideElementReleased: event.insideElementReleased, + originalEvent: event.originalEvent + }); +} + +function onCanvasNonPrimaryPress( event ) { + /** + * Raised when any non-primary pointer button is pressed on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-nonprimary-press + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {Number} button - Button which caused the event. + * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * @property {Number} buttons - Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-nonprimary-press', { + tracker: event.eventSource, + position: event.position, + pointerType: event.pointerType, + button: event.button, + buttons: event.buttons, + originalEvent: event.originalEvent + }); +} + +function onCanvasNonPrimaryRelease( event ) { + /** + * Raised when any non-primary pointer button is released on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-nonprimary-release + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {Number} button - Button which caused the event. + * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser. + * @property {Number} buttons - Current buttons pressed. + * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-nonprimary-release', { + tracker: event.eventSource, + position: event.position, + pointerType: event.pointerType, + button: event.button, + buttons: event.buttons, + originalEvent: event.originalEvent + }); +} + +function onCanvasPinch( event ) { + var gestureSettings, + centerPt, + lastCenterPt, + panByPt; + + var canvasPinchEventArgs = { + tracker: event.eventSource, + pointerType: event.pointerType, + gesturePoints: event.gesturePoints, + lastCenter: event.lastCenter, + center: event.center, + lastDistance: event.lastDistance, + distance: event.distance, + shift: event.shift, + originalEvent: event.originalEvent, + preventDefaultPanAction: false, + preventDefaultZoomAction: false, + preventDefaultRotateAction: false + }; + + /** + * Raised when a pinch event occurs on the {@link OpenSeadragon.Viewer#canvas} element. + * + * @event canvas-pinch + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {Array.} gesturePoints - Gesture points associated with the gesture. Velocity data can be found here. + * @property {OpenSeadragon.Point} lastCenter - The previous center point of the two pinch contact points relative to the tracked element. + * @property {OpenSeadragon.Point} center - The center point of the two pinch contact points relative to the tracked element. + * @property {Number} lastDistance - The previous distance between the two pinch contact points in CSS pixels. + * @property {Number} distance - The distance between the two pinch contact points in CSS pixels. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefaultPanAction - Set to true to prevent default pinch to pan behaviour. Default: false. + * @property {Boolean} preventDefaultZoomAction - Set to true to prevent default pinch to zoom behaviour. Default: false. + * @property {Boolean} preventDefaultRotateAction - Set to true to prevent default pinch to rotate behaviour. Default: false. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('canvas-pinch', canvasPinchEventArgs); + + if ( this.viewport ) { + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if ( gestureSettings.pinchToZoom && + (!canvasPinchEventArgs.preventDefaultPanAction || !canvasPinchEventArgs.preventDefaultZoomAction) ) { + centerPt = this.viewport.pointFromPixel( event.center, true ); + if ( gestureSettings.zoomToRefPoint && !canvasPinchEventArgs.preventDefaultPanAction ) { + lastCenterPt = this.viewport.pointFromPixel( event.lastCenter, true ); + panByPt = lastCenterPt.minus( centerPt ); + if( !this.panHorizontal ) { + panByPt.x = 0; + } + if( !this.panVertical ) { + panByPt.y = 0; + } + this.viewport.panBy(panByPt, true); + } + if ( !canvasPinchEventArgs.preventDefaultZoomAction ) { + this.viewport.zoomBy( event.distance / event.lastDistance, centerPt, true ); + } + this.viewport.applyConstraints(); + } + if ( gestureSettings.pinchRotate && !canvasPinchEventArgs.preventDefaultRotateAction ) { + // Pinch rotate + var angle1 = Math.atan2(event.gesturePoints[0].currentPos.y - event.gesturePoints[1].currentPos.y, + event.gesturePoints[0].currentPos.x - event.gesturePoints[1].currentPos.x); + var angle2 = Math.atan2(event.gesturePoints[0].lastPos.y - event.gesturePoints[1].lastPos.y, + event.gesturePoints[0].lastPos.x - event.gesturePoints[1].lastPos.x); + centerPt = this.viewport.pointFromPixel( event.center, true ); + this.viewport.rotateTo(this.viewport.getRotation(true) + ((angle1 - angle2) * (180 / Math.PI)), centerPt, true); + } + } +} + +function onCanvasFocus( event ) { + + /** + * Raised when the {@link OpenSeadragon.Viewer#canvas} element gets keyboard focus. + * + * @event canvas-focus + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-focus', { + tracker: event.eventSource, + originalEvent: event.originalEvent + }); +} + +function onCanvasBlur( event ) { + /** + * Raised when the {@link OpenSeadragon.Viewer#canvas} element loses keyboard focus. + * + * @event canvas-blur + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'canvas-blur', { + tracker: event.eventSource, + originalEvent: event.originalEvent + }); +} + +function onCanvasScroll( event ) { + var canvasScrollEventArgs, + gestureSettings, + factor, + thisScrollTime, + deltaScrollTime; + + /* Certain scroll devices fire the scroll event way too fast so we are injecting a simple adjustment to keep things + * partially normalized. If we have already fired an event within the last 'minScrollDelta' milliseconds we skip + * this one and wait for the next event. */ + thisScrollTime = $.now(); + deltaScrollTime = thisScrollTime - this._lastScrollTime; + if (deltaScrollTime > this.minScrollDeltaTime) { + this._lastScrollTime = thisScrollTime; + + canvasScrollEventArgs = { + tracker: event.eventSource, + position: event.position, + scroll: event.scroll, + shift: event.shift, + originalEvent: event.originalEvent, + preventDefaultAction: false, + preventDefault: true + }; + + /** + * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#canvas} element (mouse wheel). + * + * @event canvas-scroll + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} scroll - The scroll delta for the event. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefaultAction - Set to true to prevent default scroll to zoom behaviour. Default: false. + * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the wheel event. Default: true. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('canvas-scroll', canvasScrollEventArgs ); + + if ( !canvasScrollEventArgs.preventDefaultAction && this.viewport ) { + if(this.viewport.flipped){ + event.position.x = this.viewport.getContainerSize().x - event.position.x; + } + + gestureSettings = this.gestureSettingsByDeviceType( event.pointerType ); + if ( gestureSettings.scrollToZoom ) { + factor = Math.pow( this.zoomPerScroll, event.scroll ); + this.viewport.zoomBy( + factor, + gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null + ); + this.viewport.applyConstraints(); + } + } + + event.preventDefault = canvasScrollEventArgs.preventDefault; + } else { + event.preventDefault = true; + } +} + +function onContainerEnter( event ) { + THIS[ this.hash ].mouseInside = true; + abortControlsAutoHide( this ); + /** + * Raised when the cursor enters the {@link OpenSeadragon.Viewer#container} element. + * + * @event container-enter + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Number} pointers - Number of pointers (all types) active in the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'container-enter', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + buttons: event.buttons, + pointers: event.pointers, + insideElementPressed: event.insideElementPressed, + buttonDownAny: event.buttonDownAny, + originalEvent: event.originalEvent + }); +} + +function onContainerLeave( event ) { + if ( event.pointers < 1 ) { + THIS[ this.hash ].mouseInside = false; + if ( !THIS[ this.hash ].animating ) { + beginControlsAutoHide( this ); + } + } + /** + * Raised when the cursor leaves the {@link OpenSeadragon.Viewer#container} element. + * + * @event container-exit + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {String} pointerType - "mouse", "touch", "pen", etc. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser. + * @property {Number} pointers - Number of pointers (all types) active in the tracked element. + * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false. + * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'container-exit', { + tracker: event.eventSource, + pointerType: event.pointerType, + position: event.position, + buttons: event.buttons, + pointers: event.pointers, + insideElementPressed: event.insideElementPressed, + buttonDownAny: event.buttonDownAny, + originalEvent: event.originalEvent + }); +} + + +/////////////////////////////////////////////////////////////////////////////// +// Page update routines ( aka Views - for future reference ) +/////////////////////////////////////////////////////////////////////////////// + +function updateMulti( viewer ) { + updateOnce( viewer ); + + // Request the next frame, unless we've been closed + if ( viewer.isOpen() ) { + viewer._updateRequestId = scheduleUpdate( viewer, updateMulti ); + } else { + viewer._updateRequestId = false; + } +} + +function doViewerResize(viewer, containerSize){ + var viewport = viewer.viewport; + var zoom = viewport.getZoom(); + var center = viewport.getCenter(); + viewport.resize(containerSize, viewer.preserveImageSizeOnResize); + viewport.panTo(center, true); + var resizeRatio; + if (viewer.preserveImageSizeOnResize) { + resizeRatio = THIS[viewer.hash].prevContainerSize.x / containerSize.x; + } else { + var origin = new $.Point(0, 0); + var prevDiag = new $.Point(THIS[viewer.hash].prevContainerSize.x, THIS[viewer.hash].prevContainerSize.y).distanceTo(origin); + var newDiag = new $.Point(containerSize.x, containerSize.y).distanceTo(origin); + resizeRatio = newDiag / prevDiag * THIS[viewer.hash].prevContainerSize.x / containerSize.x; + } + viewport.zoomTo(zoom * resizeRatio, null, true); + THIS[viewer.hash].prevContainerSize = containerSize; + THIS[viewer.hash].forceRedraw = true; + THIS[viewer.hash].needsResize = false; + THIS[viewer.hash].forceResize = false; +} +function updateOnce( viewer ) { + + //viewer.profiler.beginUpdate(); + + if (viewer._opening || !THIS[viewer.hash]) { + return; + } + if (viewer.autoResize || THIS[viewer.hash].forceResize){ + var containerSize; + if(viewer._autoResizePolling){ + containerSize = _getSafeElemSize(viewer.container); + var prevContainerSize = THIS[viewer.hash].prevContainerSize; + if (!containerSize.equals(prevContainerSize)) { + THIS[viewer.hash].needsResize = true; + } + } + if(THIS[viewer.hash].needsResize){ + doViewerResize(viewer, containerSize || _getSafeElemSize(viewer.container)); + } + + } + + + + var viewportChange = viewer.viewport.update(); + var animated = viewer.world.update() || viewportChange; + + if (viewportChange) { + /** + * Raised when any spring animation update occurs (zoom, pan, etc.), + * before the viewer has drawn the new location. + * + * @event viewport-change + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent('viewport-change'); + } + + if( viewer.referenceStrip ){ + animated = viewer.referenceStrip.update( viewer.viewport ) || animated; + } + + var currentAnimating = THIS[ viewer.hash ].animating; + + if ( !currentAnimating && animated ) { + /** + * Raised when any spring animation starts (zoom, pan, etc.). + * + * @event animation-start + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent( "animation-start" ); + abortControlsAutoHide( viewer ); + } + + var isAnimationFinished = currentAnimating && !animated; + + if ( isAnimationFinished ) { + THIS[ viewer.hash ].animating = false; + } + + if ( animated || isAnimationFinished || THIS[ viewer.hash ].forceRedraw || viewer.world.needsDraw() ) { + drawWorld( viewer ); + viewer._drawOverlays(); + if( viewer.navigator ){ + viewer.navigator.update( viewer.viewport ); + } + + THIS[ viewer.hash ].forceRedraw = false; + + if (animated) { + /** + * Raised when any spring animation update occurs (zoom, pan, etc.), + * after the viewer has drawn the new location. + * + * @event animation + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent( "animation" ); + } + } + + if ( isAnimationFinished ) { + /** + * Raised when any spring animation ends (zoom, pan, etc.). + * + * @event animation-finish + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent( "animation-finish" ); + + if ( !THIS[ viewer.hash ].mouseInside ) { + beginControlsAutoHide( viewer ); + } + } + + THIS[ viewer.hash ].animating = animated; + + //viewer.profiler.endUpdate(); +} + +function drawWorld( viewer ) { + viewer.imageLoader.clear(); + viewer.drawer.clear(); + viewer.world.draw(); + + /** + * - Needs documentation - + * + * @event update-viewport + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + viewer.raiseEvent( 'update-viewport', {} ); +} + +/////////////////////////////////////////////////////////////////////////////// +// Navigation Controls +/////////////////////////////////////////////////////////////////////////////// +function resolveUrl( prefix, url ) { + return prefix ? prefix + url : url; +} + + + +function beginZoomingIn() { + THIS[ this.hash ].lastZoomTime = $.now(); + THIS[ this.hash ].zoomFactor = this.zoomPerSecond; + THIS[ this.hash ].zooming = true; + scheduleZoom( this ); +} + + +function beginZoomingOut() { + THIS[ this.hash ].lastZoomTime = $.now(); + THIS[ this.hash ].zoomFactor = 1.0 / this.zoomPerSecond; + THIS[ this.hash ].zooming = true; + scheduleZoom( this ); +} + + +function endZooming() { + THIS[ this.hash ].zooming = false; +} + + +function scheduleZoom( viewer ) { + $.requestAnimationFrame( $.delegate( viewer, doZoom ) ); +} + + +function doZoom() { + var currentTime, + deltaTime, + adjustedFactor; + + if ( THIS[ this.hash ].zooming && this.viewport) { + currentTime = $.now(); + deltaTime = currentTime - THIS[ this.hash ].lastZoomTime; + adjustedFactor = Math.pow( THIS[ this.hash ].zoomFactor, deltaTime / 1000 ); + + this.viewport.zoomBy( adjustedFactor ); + this.viewport.applyConstraints(); + THIS[ this.hash ].lastZoomTime = currentTime; + scheduleZoom( this ); + } +} + + +function doSingleZoomIn() { + if ( this.viewport ) { + THIS[ this.hash ].zooming = false; + this.viewport.zoomBy( + this.zoomPerClick / 1.0 + ); + this.viewport.applyConstraints(); + } +} + + +function doSingleZoomOut() { + if ( this.viewport ) { + THIS[ this.hash ].zooming = false; + this.viewport.zoomBy( + 1.0 / this.zoomPerClick + ); + this.viewport.applyConstraints(); + } +} + + +function lightUp() { + if (this.buttonGroup) { + this.buttonGroup.emulateEnter(); + this.buttonGroup.emulateLeave(); + } +} + + +function onHome() { + if ( this.viewport ) { + this.viewport.goHome(); + } +} + + +function onFullScreen() { + if ( this.isFullPage() && !$.isFullScreen() ) { + // Is fullPage but not fullScreen + this.setFullPage( false ); + } else { + this.setFullScreen( !this.isFullPage() ); + } + // correct for no mouseout event on change + if ( this.buttonGroup ) { + this.buttonGroup.emulateLeave(); + } + this.fullPageButton.element.focus(); + if ( this.viewport ) { + this.viewport.applyConstraints(); + } +} + +function onRotateLeft() { + if ( this.viewport ) { + var currRotation = this.viewport.getRotation(); + + if ( this.viewport.flipped ){ + currRotation += this.rotationIncrement; + } else { + currRotation -= this.rotationIncrement; + } + this.viewport.setRotation(currRotation); + } +} + +function onRotateRight() { + if ( this.viewport ) { + var currRotation = this.viewport.getRotation(); + + if ( this.viewport.flipped ){ + currRotation -= this.rotationIncrement; + } else { + currRotation += this.rotationIncrement; + } + this.viewport.setRotation(currRotation); + } +} +/** + * Note: When pressed flip control button + */ +function onFlip() { + this.viewport.toggleFlip(); +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Navigator + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Navigator + * @classdesc The Navigator provides a small view of the current image as fixed + * while representing the viewport as a moving box serving as a frame + * of reference in the larger viewport as to which portion of the image + * is currently being examined. The navigator's viewport can be interacted + * with using the keyboard or the mouse. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.Viewer + * @extends OpenSeadragon.EventSource + * @param {Object} options - Navigator options + * @param {Element} [options.element] - An element to use for the navigator. + * @param {String} [options.id] - Id of the element to use for the navigator. However, this is ignored if {@link options.element} is provided. + */ +$.Navigator = function( options ){ + + var viewer = options.viewer, + _this = this, + viewerSize, + navigatorSize; + + //We may need to create a new element and id if they did not + //provide the id for the existing element or the element itself + if( options.element || options.id ){ + if ( options.element ) { + if ( options.id ){ + $.console.warn("Given option.id for Navigator was ignored since option.element was provided and is being used instead."); + } + + // Don't overwrite the element's id if it has one already + if ( options.element.id ) { + options.id = options.element.id; + } else { + options.id = 'navigator-' + $.now(); + } + + this.element = options.element; + } else { + this.element = document.getElementById( options.id ); + } + + options.controlOptions = { + anchor: $.ControlAnchor.NONE, + attachToViewer: false, + autoFade: false + }; + } else { + options.id = 'navigator-' + $.now(); + this.element = $.makeNeutralElement( "div" ); + options.controlOptions = { + anchor: $.ControlAnchor.TOP_RIGHT, + attachToViewer: true, + autoFade: options.autoFade + }; + + if( options.position ){ + if( 'BOTTOM_RIGHT' === options.position ){ + options.controlOptions.anchor = $.ControlAnchor.BOTTOM_RIGHT; + } else if( 'BOTTOM_LEFT' === options.position ){ + options.controlOptions.anchor = $.ControlAnchor.BOTTOM_LEFT; + } else if( 'TOP_RIGHT' === options.position ){ + options.controlOptions.anchor = $.ControlAnchor.TOP_RIGHT; + } else if( 'TOP_LEFT' === options.position ){ + options.controlOptions.anchor = $.ControlAnchor.TOP_LEFT; + } else if( 'ABSOLUTE' === options.position ){ + options.controlOptions.anchor = $.ControlAnchor.ABSOLUTE; + options.controlOptions.top = options.top; + options.controlOptions.left = options.left; + options.controlOptions.height = options.height; + options.controlOptions.width = options.width; + } + } + } + this.element.id = options.id; + this.element.className += ' navigator'; + + options = $.extend( true, { + sizeRatio: $.DEFAULT_SETTINGS.navigatorSizeRatio + }, options, { + element: this.element, + tabIndex: -1, // No keyboard navigation, omit from tab order + //These need to be overridden to prevent recursion since + //the navigator is a viewer and a viewer has a navigator + showNavigator: false, + mouseNavEnabled: false, + showNavigationControl: false, + showSequenceControl: false, + immediateRender: true, + blendTime: 0, + animationTime: options.animationTime, + // disable autoResize since resize behavior is implemented differently by the navigator + autoResize: false, + // prevent resizing the navigator from adding unwanted space around the image + minZoomImageRatio: 1.0, + background: options.background, + opacity: options.opacity, + borderColor: options.borderColor, + displayRegionColor: options.displayRegionColor + }); + + options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio; + + $.setElementTouchActionNone( this.element ); + + this.borderWidth = 2; + //At some browser magnification levels the display regions lines up correctly, but at some there appears to + //be a one pixel gap. + this.fudge = new $.Point(1, 1); + this.totalBorderWidths = new $.Point(this.borderWidth * 2, this.borderWidth * 2).minus(this.fudge); + + + if ( options.controlOptions.anchor !== $.ControlAnchor.NONE ) { + (function( style, borderWidth ){ + style.margin = '0px'; + style.border = borderWidth + 'px solid ' + options.borderColor; + style.padding = '0px'; + style.background = options.background; + style.opacity = options.opacity; + style.overflow = 'hidden'; + }( this.element.style, this.borderWidth)); + } + + this.displayRegion = $.makeNeutralElement( "div" ); + this.displayRegion.id = this.element.id + '-displayregion'; + this.displayRegion.className = 'displayregion'; + + (function( style, borderWidth ){ + style.position = 'relative'; + style.top = '0px'; + style.left = '0px'; + style.fontSize = '0px'; + style.overflow = 'hidden'; + style.border = borderWidth + 'px solid ' + options.displayRegionColor; + style.margin = '0px'; + style.padding = '0px'; + //TODO: IE doesn't like this property being set + //try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/} + + style.background = 'transparent'; + + // We use square bracket notation on the statement below, because float is a keyword. + // This is important for the Google Closure compiler, if nothing else. + /*jshint sub:true */ + style['float'] = 'left'; //Webkit + + style.cssFloat = 'left'; //Firefox + style.styleFloat = 'left'; //IE + style.zIndex = 999999999; + style.cursor = 'default'; + style.boxSizing = 'content-box'; + }( this.displayRegion.style, this.borderWidth )); + $.setElementPointerEventsNone( this.displayRegion ); + $.setElementTouchActionNone( this.displayRegion ); + + this.displayRegionContainer = $.makeNeutralElement("div"); + this.displayRegionContainer.id = this.element.id + '-displayregioncontainer'; + this.displayRegionContainer.className = "displayregioncontainer"; + this.displayRegionContainer.style.width = "100%"; + this.displayRegionContainer.style.height = "100%"; + $.setElementPointerEventsNone( this.displayRegionContainer ); + $.setElementTouchActionNone( this.displayRegionContainer ); + + viewer.addControl( + this.element, + options.controlOptions + ); + + this._resizeWithViewer = options.controlOptions.anchor !== $.ControlAnchor.ABSOLUTE && + options.controlOptions.anchor !== $.ControlAnchor.NONE; + + if (options.width && options.height) { + this.setWidth(options.width); + this.setHeight(options.height); + } else if ( this._resizeWithViewer ) { + viewerSize = $.getElementSize( viewer.element ); + this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px'; + this.element.style.width = Math.round( viewerSize.x * options.sizeRatio ) + 'px'; + this.oldViewerSize = viewerSize; + navigatorSize = $.getElementSize( this.element ); + this.elementArea = navigatorSize.x * navigatorSize.y; + } + + this.oldContainerSize = new $.Point( 0, 0 ); + + $.Viewer.apply( this, [ options ] ); + + this.displayRegionContainer.appendChild(this.displayRegion); + this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer); + + function rotate(degrees, immediately) { + _setTransformRotate(_this.displayRegionContainer, degrees); + _setTransformRotate(_this.displayRegion, -degrees); + _this.viewport.setRotation(degrees, immediately); + } + if (options.navigatorRotate) { + var degrees = options.viewer.viewport ? + options.viewer.viewport.getRotation() : + options.viewer.degrees || 0; + + rotate(degrees, true); + options.viewer.addHandler("rotate", function (args) { + rotate(args.degrees, args.immediately); + }); + } + + + // Remove the base class' (Viewer's) innerTracker and replace it with our own + this.innerTracker.destroy(); + this.innerTracker = new $.MouseTracker({ + userData: 'Navigator.innerTracker', + element: this.element, //this.canvas, + dragHandler: $.delegate( this, onCanvasDrag ), + clickHandler: $.delegate( this, onCanvasClick ), + releaseHandler: $.delegate( this, onCanvasRelease ), + scrollHandler: $.delegate( this, onCanvasScroll ), + preProcessEventHandler: function (eventInfo) { + if (eventInfo.eventType === 'wheel') { + //don't scroll the page up and down if the user is scrolling + //in the navigator + eventInfo.preventDefault = true; + } + } + }); + this.outerTracker.userData = 'Navigator.outerTracker'; + + // this.innerTracker is attached to this.element...we need to allow pointer + // events to pass through this Viewer's canvas/container elements so implicit + // pointer capture works on touch devices + //TODO an alternative is to attach the new MouseTracker to this.canvas...not + // sure why it isn't already (see MouseTracker constructor call above) + $.setElementPointerEventsNone( this.canvas ); + $.setElementPointerEventsNone( this.container ); + + this.addHandler("reset-size", function() { + if (_this.viewport) { + _this.viewport.goHome(true); + } + }); + + viewer.world.addHandler("item-index-change", function(event) { + window.setTimeout(function(){ + var item = _this.world.getItemAt(event.previousIndex); + _this.world.setItemIndex(item, event.newIndex); + }, 1); + }); + + viewer.world.addHandler("remove-item", function(event) { + var theirItem = event.item; + var myItem = _this._getMatchingItem(theirItem); + if (myItem) { + _this.world.removeItem(myItem); + } + }); + + this.update(viewer.viewport); +}; + +$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{ + + /** + * Used to notify the navigator when its size has changed. + * Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable. + * @function + */ + updateSize: function () { + if ( this.viewport ) { + var containerSize = new $.Point( + (this.container.clientWidth === 0 ? 1 : this.container.clientWidth), + (this.container.clientHeight === 0 ? 1 : this.container.clientHeight) + ); + + if ( !containerSize.equals( this.oldContainerSize ) ) { + this.viewport.resize( containerSize, true ); + this.viewport.goHome(true); + this.oldContainerSize = containerSize; + this.drawer.clear(); + this.world.draw(); + } + } + }, + + /** + * Explicitly sets the width of the navigator, in web coordinates. Disables automatic resizing. + * @param {Number|String} width - the new width, either a number of pixels or a CSS string, such as "100%" + */ + setWidth: function(width) { + this.width = width; + this.element.style.width = typeof (width) === "number" ? (width + 'px') : width; + this._resizeWithViewer = false; + this.updateSize(); + }, + + /** + * Explicitly sets the height of the navigator, in web coordinates. Disables automatic resizing. + * @param {Number|String} height - the new height, either a number of pixels or a CSS string, such as "100%" + */ + setHeight: function(height) { + this.height = height; + this.element.style.height = typeof (height) === "number" ? (height + 'px') : height; + this._resizeWithViewer = false; + this.updateSize(); + }, + + /** + * Flip navigator element + * @param {Boolean} state - Flip state to set. + */ + setFlip: function(state) { + this.viewport.setFlip(state); + + this.setDisplayTransform(this.viewer.viewport.getFlip() ? "scale(-1,1)" : "scale(1,1)"); + return this; + }, + + setDisplayTransform: function(rule) { + setElementTransform(this.displayRegion, rule); + setElementTransform(this.canvas, rule); + setElementTransform(this.element, rule); + }, + + /** + * Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs. + * @function + * @param {OpenSeadragon.Viewport} The viewport this navigator is tracking. + */ + update: function( viewport ) { + + var viewerSize, + newWidth, + newHeight, + bounds, + topleft, + bottomright; + + viewerSize = $.getElementSize( this.viewer.element ); + if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) { + this.oldViewerSize = viewerSize; + + if ( this.maintainSizeRatio || !this.elementArea) { + newWidth = viewerSize.x * this.sizeRatio; + newHeight = viewerSize.y * this.sizeRatio; + } else { + newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y)); + newHeight = this.elementArea / newWidth; + } + + this.element.style.width = Math.round( newWidth ) + 'px'; + this.element.style.height = Math.round( newHeight ) + 'px'; + + if (!this.elementArea) { + this.elementArea = newWidth * newHeight; + } + + this.updateSize(); + } + + if (viewport && this.viewport) { + bounds = viewport.getBoundsNoRotate(true); + topleft = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false); + bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false) + .minus( this.totalBorderWidths ); + + if (!this.navigatorRotate) { + var degrees = viewport.getRotation(true); + _setTransformRotate(this.displayRegion, -degrees); + } + + //update style for navigator-box + var style = this.displayRegion.style; + style.display = this.world.getItemCount() ? 'block' : 'none'; + + style.top = topleft.y.toFixed(2) + "px"; + style.left = topleft.x.toFixed(2) + "px"; + + var width = bottomright.x - topleft.x; + var height = bottomright.y - topleft.y; + // make sure width and height are non-negative so IE doesn't throw + style.width = Math.round( Math.max( width, 0 ) ) + 'px'; + style.height = Math.round( Math.max( height, 0 ) ) + 'px'; + } + + }, + + // overrides Viewer.addTiledImage + addTiledImage: function(options) { + var _this = this; + + var original = options.originalTiledImage; + delete options.original; + + var optionsClone = $.extend({}, options, { + success: function(event) { + var myItem = event.item; + myItem._originalForNavigator = original; + _this._matchBounds(myItem, original, true); + _this._matchOpacity(myItem, original); + _this._matchCompositeOperation(myItem, original); + + function matchBounds() { + _this._matchBounds(myItem, original); + } + + function matchOpacity() { + _this._matchOpacity(myItem, original); + } + + function matchCompositeOperation() { + _this._matchCompositeOperation(myItem, original); + } + + original.addHandler('bounds-change', matchBounds); + original.addHandler('clip-change', matchBounds); + original.addHandler('opacity-change', matchOpacity); + original.addHandler('composite-operation-change', matchCompositeOperation); + } + }); + + return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]); + }, + + destroy: function() { + return $.Viewer.prototype.destroy.apply(this); + }, + + // private + _getMatchingItem: function(theirItem) { + var count = this.world.getItemCount(); + var item; + for (var i = 0; i < count; i++) { + item = this.world.getItemAt(i); + if (item._originalForNavigator === theirItem) { + return item; + } + } + + return null; + }, + + // private + _matchBounds: function(myItem, theirItem, immediately) { + var bounds = theirItem.getBoundsNoRotate(); + myItem.setPosition(bounds.getTopLeft(), immediately); + myItem.setWidth(bounds.width, immediately); + myItem.setRotation(theirItem.getRotation(), immediately); + myItem.setClip(theirItem.getClip()); + myItem.setFlip(theirItem.getFlip()); + }, + + // private + _matchOpacity: function(myItem, theirItem) { + myItem.setOpacity(theirItem.opacity); + }, + + // private + _matchCompositeOperation: function(myItem, theirItem) { + myItem.setCompositeOperation(theirItem.compositeOperation); + } +}); + + +/** + * @private + * @inner + * @function + */ +function onCanvasClick( event ) { + var canvasClickEventArgs = { + tracker: event.eventSource, + position: event.position, + quick: event.quick, + shift: event.shift, + originalEvent: event.originalEvent, + preventDefaultAction: false + }; + /** + * Raised when a click event occurs on the {@link OpenSeadragon.Viewer#navigator} element. + * + * @event navigator-click + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false. + */ + + this.viewer.raiseEvent('navigator-click', canvasClickEventArgs); + + if ( !canvasClickEventArgs.preventDefaultAction && event.quick && this.viewer.viewport && (this.panVertical || this.panHorizontal)) { + if(this.viewer.viewport.flipped) { + event.position.x = this.viewport.getContainerSize().x - event.position.x; + } + var target = this.viewport.pointFromPixel(event.position); + if (!this.panVertical) { + // perform only horizonal pan + target.y = this.viewer.viewport.getCenter(true).y; + } else if (!this.panHorizontal) { + // perform only vertical pan + target.x = this.viewer.viewport.getCenter(true).x; + } + this.viewer.viewport.panTo(target); + this.viewer.viewport.applyConstraints(); + } + +} + +/** + * @private + * @inner + * @function + */ +function onCanvasDrag( event ) { + var canvasDragEventArgs = { + tracker: event.eventSource, + position: event.position, + delta: event.delta, + speed: event.speed, + direction: event.direction, + shift: event.shift, + originalEvent: event.originalEvent, + preventDefaultAction: false + }; + /** + * Raised when a drag event occurs on the {@link OpenSeadragon.Viewer#navigator} element. + * + * @event navigator-drag + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag. + * @property {Number} speed - Current computed speed, in pixels per second. + * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + * @property {Boolean} preventDefaultAction - Set to true to prevent default drag to pan behaviour. Default: false. + */ + this.viewer.raiseEvent('navigator-drag', canvasDragEventArgs); + + if ( !canvasDragEventArgs.preventDefaultAction && this.viewer.viewport ) { + if( !this.panHorizontal ){ + event.delta.x = 0; + } + if( !this.panVertical ){ + event.delta.y = 0; + } + + if(this.viewer.viewport.flipped){ + event.delta.x = -event.delta.x; + } + + this.viewer.viewport.panBy( + this.viewport.deltaPointsFromPixels( + event.delta + ) + ); + if( this.viewer.constrainDuringPan ){ + this.viewer.viewport.applyConstraints(); + } + } +} + + +/** + * @private + * @inner + * @function + */ +function onCanvasRelease( event ) { + if ( event.insideElementPressed && this.viewer.viewport ) { + this.viewer.viewport.applyConstraints(); + } +} + + +/** + * @private + * @inner + * @function + */ +function onCanvasScroll( event ) { + var eventArgs = { + tracker: event.eventSource, + position: event.position, + scroll: event.scroll, + shift: event.shift, + originalEvent: event.originalEvent, + preventDefault: event.preventDefault + }; + + /** + * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#navigator} element (mouse wheel, touch pinch, etc.). + * + * @event navigator-scroll + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event. + * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element. + * @property {Number} scroll - The scroll delta for the event. + * @property {Boolean} shift - True if the shift key was pressed during this event. + * @property {Object} originalEvent - The original DOM event. + * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the wheel event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'navigator-scroll', eventArgs ); + + event.preventDefault = eventArgs.preventDefault; +} + +/** + * @function + * @private + * @param {Object} element + * @param {Number} degrees + */ +function _setTransformRotate( element, degrees ) { + setElementTransform(element, "rotate(" + degrees + "deg)"); +} + +function setElementTransform( element, rule ) { + element.style.webkitTransform = rule; + element.style.mozTransform = rule; + element.style.msTransform = rule; + element.style.oTransform = rule; + element.style.transform = rule; +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - getString/setString + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +//TODO: I guess this is where the i18n needs to be reimplemented. I'll look +// into existing patterns for i18n in javascript but i think that mimicking +// pythons gettext might be a reasonable approach. +var I18N = { + Errors: { + Dzc: "Sorry, we don't support Deep Zoom Collections!", + Dzi: "Hmm, this doesn't appear to be a valid Deep Zoom Image.", + Xml: "Hmm, this doesn't appear to be a valid Deep Zoom Image.", + ImageFormat: "Sorry, we don't support {0}-based Deep Zoom Images.", + Security: "It looks like a security restriction stopped us from " + + "loading this Deep Zoom Image.", + Status: "This space unintentionally left blank ({0} {1}).", + OpenFailed: "Unable to open {0}: {1}" + }, + + Tooltips: { + FullPage: "Toggle full page", + Home: "Go home", + ZoomIn: "Zoom in", + ZoomOut: "Zoom out", + NextPage: "Next page", + PreviousPage: "Previous page", + RotateLeft: "Rotate left", + RotateRight: "Rotate right", + Flip: "Flip Horizontally" + } +}; + +$.extend( $, /** @lends OpenSeadragon */{ + + /** + * @function + * @param {String} property + */ + getString: function( prop ) { + + var props = prop.split('.'), + string = null, + args = arguments, + container = I18N, + i; + + for (i = 0; i < props.length - 1; i++) { + // in case not a subproperty + container = container[ props[ i ] ] || {}; + } + string = container[ props[ i ] ]; + + if ( typeof ( string ) !== "string" ) { + $.console.error( "Untranslated source string:", prop ); + string = ""; // FIXME: this breaks gettext()-style convention, which would return source + } + + return string.replace(/\{\d+\}/g, function(capture) { + var i = parseInt( capture.match( /\d+/ ), 10 ) + 1; + return i < args.length ? + args[ i ] : + ""; + }); + }, + + /** + * @function + * @param {String} property + * @param {*} value + */ + setString: function( prop, value ) { + + var props = prop.split('.'), + container = I18N, + i; + + for ( i = 0; i < props.length - 1; i++ ) { + if ( !container[ props[ i ] ] ) { + container[ props[ i ] ] = {}; + } + container = container[ props[ i ] ]; + } + + container[ props[ i ] ] = value; + } + +}); + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Point + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Point + * @classdesc A Point is really used as a 2-dimensional vector, equally useful for + * representing a point on a plane, or the height and width of a plane + * not requiring any other frame of reference. + * + * @memberof OpenSeadragon + * @param {Number} [x] The vector component 'x'. Defaults to the origin at 0. + * @param {Number} [y] The vector component 'y'. Defaults to the origin at 0. + */ +$.Point = function( x, y ) { + /** + * The vector component 'x'. + * @member {Number} x + * @memberof OpenSeadragon.Point# + */ + this.x = typeof ( x ) === "number" ? x : 0; + /** + * The vector component 'y'. + * @member {Number} y + * @memberof OpenSeadragon.Point# + */ + this.y = typeof ( y ) === "number" ? y : 0; +}; + +/** @lends OpenSeadragon.Point.prototype */ +$.Point.prototype = { + /** + * @function + * @returns {OpenSeadragon.Point} a duplicate of this Point + */ + clone: function() { + return new $.Point(this.x, this.y); + }, + + /** + * Add another Point to this point and return a new Point. + * @function + * @param {OpenSeadragon.Point} point The point to add vector components. + * @returns {OpenSeadragon.Point} A new point representing the sum of the + * vector components + */ + plus: function( point ) { + return new $.Point( + this.x + point.x, + this.y + point.y + ); + }, + + /** + * Subtract another Point to this point and return a new Point. + * @function + * @param {OpenSeadragon.Point} point The point to subtract vector components. + * @returns {OpenSeadragon.Point} A new point representing the subtraction of the + * vector components + */ + minus: function( point ) { + return new $.Point( + this.x - point.x, + this.y - point.y + ); + }, + + /** + * Multiply this point by a factor and return a new Point. + * @function + * @param {Number} factor The factor to multiply vector components. + * @returns {OpenSeadragon.Point} A new point representing the multiplication + * of the vector components by the factor + */ + times: function( factor ) { + return new $.Point( + this.x * factor, + this.y * factor + ); + }, + + /** + * Divide this point by a factor and return a new Point. + * @function + * @param {Number} factor The factor to divide vector components. + * @returns {OpenSeadragon.Point} A new point representing the division of the + * vector components by the factor + */ + divide: function( factor ) { + return new $.Point( + this.x / factor, + this.y / factor + ); + }, + + /** + * Compute the opposite of this point and return a new Point. + * @function + * @returns {OpenSeadragon.Point} A new point representing the opposite of the + * vector components + */ + negate: function() { + return new $.Point( -this.x, -this.y ); + }, + + /** + * Compute the distance between this point and another point. + * @function + * @param {OpenSeadragon.Point} point The point to compute the distance with. + * @returns {Number} The distance between the 2 points + */ + distanceTo: function( point ) { + return Math.sqrt( + Math.pow( this.x - point.x, 2 ) + + Math.pow( this.y - point.y, 2 ) + ); + }, + + /** + * Compute the squared distance between this point and another point. + * Useful for optimizing things like comparing distances. + * @function + * @param {OpenSeadragon.Point} point The point to compute the squared distance with. + * @returns {Number} The squared distance between the 2 points + */ + squaredDistanceTo: function( point ) { + return Math.pow( this.x - point.x, 2 ) + + Math.pow( this.y - point.y, 2 ); + }, + + /** + * Apply a function to each coordinate of this point and return a new point. + * @function + * @param {function} func The function to apply to each coordinate. + * @returns {OpenSeadragon.Point} A new point with the coordinates computed + * by the specified function + */ + apply: function( func ) { + return new $.Point( func( this.x ), func( this.y ) ); + }, + + /** + * Check if this point is equal to another one. + * @function + * @param {OpenSeadragon.Point} point The point to compare this point with. + * @returns {Boolean} true if they are equal, false otherwise. + */ + equals: function( point ) { + return ( + point instanceof $.Point + ) && ( + this.x === point.x + ) && ( + this.y === point.y + ); + }, + + /** + * Rotates the point around the specified pivot + * From http://stackoverflow.com/questions/4465931/rotate-rectangle-around-a-point + * @function + * @param {Number} degress to rotate around the pivot. + * @param {OpenSeadragon.Point} [pivot=(0,0)] Point around which to rotate. + * Defaults to the origin. + * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot + */ + rotate: function (degrees, pivot) { + pivot = pivot || new $.Point(0, 0); + var cos; + var sin; + // Avoid float computations when possible + if (degrees % 90 === 0) { + var d = $.positiveModulo(degrees, 360); + switch (d) { + case 0: + cos = 1; + sin = 0; + break; + case 90: + cos = 0; + sin = 1; + break; + case 180: + cos = -1; + sin = 0; + break; + case 270: + cos = 0; + sin = -1; + break; + } + } else { + var angle = degrees * Math.PI / 180.0; + cos = Math.cos(angle); + sin = Math.sin(angle); + } + var x = cos * (this.x - pivot.x) - sin * (this.y - pivot.y) + pivot.x; + var y = sin * (this.x - pivot.x) + cos * (this.y - pivot.y) + pivot.y; + return new $.Point(x, y); + }, + + /** + * Convert this point to a string in the format (x,y) where x and y are + * rounded to the nearest integer. + * @function + * @returns {String} A string representation of this point. + */ + toString: function() { + return "(" + (Math.round(this.x * 100) / 100) + "," + (Math.round(this.y * 100) / 100) + ")"; + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - TileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + + +/** + * @class TileSource + * @classdesc The TileSource contains the most basic implementation required to create a + * smooth transition between layers in an image pyramid. It has only a single key + * interface that must be implemented to complete its key functionality: + * 'getTileUrl'. It also has several optional interfaces that can be + * implemented if a new TileSource wishes to support configuration via a simple + * object or array ('configure') and if the tile source supports or requires + * configuration via retrieval of a document on the network ala AJAX or JSONP, + * ('getImageInfo'). + *
    + * By default the image pyramid is split into N layers where the image's longest + * side in M (in pixels), where N is the smallest integer which satisfies + * 2^(N+1) >= M. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @param {Object} options + * You can either specify a URL, or literally define the TileSource (by specifying + * width, height, tileSize, tileOverlap, minLevel, and maxLevel). For the former, + * the extending class is expected to implement 'getImageInfo' and 'configure'. + * For the latter, the construction is assumed to occur through + * the extending classes implementation of 'configure'. + * @param {String} [options.url] + * The URL for the data necessary for this TileSource. + * @param {String} [options.referenceStripThumbnailUrl] + * The URL for a thumbnail image to be used by the reference strip + * @param {Function} [options.success] + * A function to be called upon successful creation. + * @param {Boolean} [options.ajaxWithCredentials] + * If this TileSource needs to make an AJAX call, this specifies whether to set + * the XHR's withCredentials (for accessing secure data). + * @param {Object} [options.ajaxHeaders] + * A set of headers to include in AJAX requests. + * @param {Boolean} [options.splitHashDataForPost] + * First occurrence of '#' in the options.url is used to split URL + * and the latter part is treated as POST data (applies to getImageInfo(...)) + * @param {Number} [options.width] + * Width of the source image at max resolution in pixels. + * @param {Number} [options.height] + * Height of the source image at max resolution in pixels. + * @param {Number} [options.tileSize] + * The size of the tiles to assumed to make up each pyramid layer in pixels. + * Tile size determines the point at which the image pyramid must be + * divided into a matrix of smaller images. + * Use options.tileWidth and options.tileHeight to support non-square tiles. + * @param {Number} [options.tileWidth] + * The width of the tiles to assumed to make up each pyramid layer in pixels. + * @param {Number} [options.tileHeight] + * The height of the tiles to assumed to make up each pyramid layer in pixels. + * @param {Number} [options.tileOverlap] + * The number of pixels each tile is expected to overlap touching tiles. + * @param {Number} [options.minLevel] + * The minimum level to attempt to load. + * @param {Number} [options.maxLevel] + * The maximum level to attempt to load. + */ +$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) { + var _this = this; + + var args = arguments, + options, + i; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: args[0], + height: args[1], + tileSize: args[2], + tileOverlap: args[3], + minLevel: args[4], + maxLevel: args[5] + }; + } + + //Tile sources supply some events, namely 'ready' when they must be configured + //by asynchronously fetching their configuration data. + $.EventSource.call( this ); + + //we allow options to override anything we don't treat as + //required via idiomatic options or which is functionally + //set depending on the state of the readiness of this tile + //source + $.extend( true, this, options ); + + if (!this.success) { + //Any functions that are passed as arguments are bound to the ready callback + for ( i = 0; i < arguments.length; i++ ) { + if ( $.isFunction( arguments[ i ] ) ) { + this.success = arguments[ i ]; + //only one callback per constructor + break; + } + } + } + + if (this.success) { + this.addHandler( 'ready', function ( event ) { + _this.success( event ); + } ); + } + + /** + * Ratio of width to height + * @member {Number} aspectRatio + * @memberof OpenSeadragon.TileSource# + */ + /** + * Vector storing x and y dimensions ( width and height respectively ). + * @member {OpenSeadragon.Point} dimensions + * @memberof OpenSeadragon.TileSource# + */ + /** + * The overlap in pixels each tile shares with its adjacent neighbors. + * @member {Number} tileOverlap + * @memberof OpenSeadragon.TileSource# + */ + /** + * The minimum pyramid level this tile source supports or should attempt to load. + * @member {Number} minLevel + * @memberof OpenSeadragon.TileSource# + */ + /** + * The maximum pyramid level this tile source supports or should attempt to load. + * @member {Number} maxLevel + * @memberof OpenSeadragon.TileSource# + */ + /** + * + * @member {Boolean} ready + * @memberof OpenSeadragon.TileSource# + */ + + if( 'string' === $.type( arguments[ 0 ] ) ){ + this.url = arguments[0]; + } + + if (this.url) { + //in case the getImageInfo method is overridden and/or implies an + //async mechanism set some safe defaults first + this.aspectRatio = 1; + this.dimensions = new $.Point( 10, 10 ); + this._tileWidth = 0; + this._tileHeight = 0; + this.tileOverlap = 0; + this.minLevel = 0; + this.maxLevel = 0; + this.ready = false; + //configuration via url implies the extending class + //implements and 'configure' + this.getImageInfo( this.url ); + + } else { + + //explicit configuration via positional args in constructor + //or the more idiomatic 'options' object + this.ready = true; + this.aspectRatio = (options.width && options.height) ? + (options.width / options.height) : 1; + this.dimensions = new $.Point( options.width, options.height ); + + if ( this.tileSize ){ + this._tileWidth = this._tileHeight = this.tileSize; + delete this.tileSize; + } else { + if( this.tileWidth ){ + // We were passed tileWidth in options, but we want to rename it + // with a leading underscore to make clear that it is not safe to directly modify it + this._tileWidth = this.tileWidth; + delete this.tileWidth; + } else { + this._tileWidth = 0; + } + + if( this.tileHeight ){ + // See note above about renaming this.tileWidth + this._tileHeight = this.tileHeight; + delete this.tileHeight; + } else { + this._tileHeight = 0; + } + } + + this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0; + this.minLevel = options.minLevel ? options.minLevel : 0; + this.maxLevel = ( undefined !== options.maxLevel && null !== options.maxLevel ) ? + options.maxLevel : ( + ( options.width && options.height ) ? Math.ceil( + Math.log( Math.max( options.width, options.height ) ) / + Math.log( 2 ) + ) : 0 + ); + if( this.success && $.isFunction( this.success ) ){ + this.success( this ); + } + } + + +}; + +/** @lends OpenSeadragon.TileSource.prototype */ +$.TileSource.prototype = { + + getTileSize: function( level ) { + $.console.error( + "[TileSource.getTileSize] is deprecated. " + + "Use TileSource.getTileWidth() and TileSource.getTileHeight() instead" + ); + return this._tileWidth; + }, + + /** + * Return the tileWidth for a given level. + * Subclasses should override this if tileWidth can be different at different levels + * such as in IIIFTileSource. Code should use this function rather than reading + * from ._tileWidth directly. + * @function + * @param {Number} level + */ + getTileWidth: function( level ) { + if (!this._tileWidth) { + return this.getTileSize(level); + } + return this._tileWidth; + }, + + /** + * Return the tileHeight for a given level. + * Subclasses should override this if tileHeight can be different at different levels + * such as in IIIFTileSource. Code should use this function rather than reading + * from ._tileHeight directly. + * @function + * @param {Number} level + */ + getTileHeight: function( level ) { + if (!this._tileHeight) { + return this.getTileSize(level); + } + return this._tileHeight; + }, + + /** + * Set the maxLevel to the given level, and perform the memoization of + * getLevelScale with the new maxLevel. This function can be useful if the + * memoization is required before the first call of getLevelScale, or both + * memoized getLevelScale and maxLevel should be changed accordingly. + * @function + * @param {Number} level + */ + setMaxLevel: function( level ) { + this.maxLevel = level; + this._memoizeLevelScale(); + }, + + /** + * @function + * @param {Number} level + */ + getLevelScale: function( level ) { + // if getLevelScale is not memoized, we generate the memoized version + // at the first call and return the result + this._memoizeLevelScale(); + return this.getLevelScale( level ); + }, + + // private + _memoizeLevelScale: function() { + // see https://github.com/openseadragon/openseadragon/issues/22 + // we use the tilesources implementation of getLevelScale to generate + // a memoized re-implementation + var levelScaleCache = {}, + i; + for( i = 0; i <= this.maxLevel; i++ ){ + levelScaleCache[ i ] = 1 / Math.pow(2, this.maxLevel - i); + } + this.getLevelScale = function( _level ){ + return levelScaleCache[ _level ]; + }; + }, + + /** + * @function + * @param {Number} level + */ + getNumTiles: function( level ) { + var scale = this.getLevelScale( level ), + x = Math.ceil( scale * this.dimensions.x / this.getTileWidth(level) ), + y = Math.ceil( scale * this.dimensions.y / this.getTileHeight(level) ); + + return new $.Point( x, y ); + }, + + /** + * @function + * @param {Number} level + */ + getPixelRatio: function( level ) { + var imageSizeScaled = this.dimensions.times( this.getLevelScale( level ) ), + rx = 1.0 / imageSizeScaled.x * $.pixelDensityRatio, + ry = 1.0 / imageSizeScaled.y * $.pixelDensityRatio; + + return new $.Point(rx, ry); + }, + + + /** + * @function + * @returns {Number} The highest level in this tile source that can be contained in a single tile. + */ + getClosestLevel: function() { + var i, + tiles; + + for (i = this.minLevel + 1; i <= this.maxLevel; i++){ + tiles = this.getNumTiles(i); + if (tiles.x > 1 || tiles.y > 1) { + break; + } + } + + return i - 1; + }, + + /** + * @function + * @param {Number} level + * @param {OpenSeadragon.Point} point + */ + getTileAtPoint: function(level, point) { + var validPoint = point.x >= 0 && point.x <= 1 && + point.y >= 0 && point.y <= 1 / this.aspectRatio; + $.console.assert(validPoint, "[TileSource.getTileAtPoint] must be called with a valid point."); + + var widthScaled = this.dimensions.x * this.getLevelScale(level); + var pixelX = point.x * widthScaled; + var pixelY = point.y * widthScaled; + + var x = Math.floor(pixelX / this.getTileWidth(level)); + var y = Math.floor(pixelY / this.getTileHeight(level)); + + // When point.x == 1 or point.y == 1 / this.aspectRatio we want to + // return the last tile of the row/column + if (point.x >= 1) { + x = this.getNumTiles(level).x - 1; + } + var EPSILON = 1e-15; + if (point.y >= 1 / this.aspectRatio - EPSILON) { + y = this.getNumTiles(level).y - 1; + } + + return new $.Point(x, y); + }, + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + * @param {Boolean} [isSource=false] Whether to return the source bounds of the tile. + * @returns {OpenSeadragon.Rect} Either where this tile fits (in normalized coordinates) or the + * portion of the tile to use as the source of the drawing operation (in pixels), depending on + * the isSource parameter. + */ + getTileBounds: function( level, x, y, isSource ) { + var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ), + tileWidth = this.getTileWidth(level), + tileHeight = this.getTileHeight(level), + px = ( x === 0 ) ? 0 : tileWidth * x - this.tileOverlap, + py = ( y === 0 ) ? 0 : tileHeight * y - this.tileOverlap, + sx = tileWidth + ( x === 0 ? 1 : 2 ) * this.tileOverlap, + sy = tileHeight + ( y === 0 ? 1 : 2 ) * this.tileOverlap, + scale = 1.0 / dimensionsScaled.x; + + sx = Math.min( sx, dimensionsScaled.x - px ); + sy = Math.min( sy, dimensionsScaled.y - py ); + + if (isSource) { + return new $.Rect(0, 0, sx, sy); + } + + return new $.Rect( px * scale, py * scale, sx * scale, sy * scale ); + }, + + + /** + * Responsible for retrieving, and caching the + * image metadata pertinent to this TileSources implementation. + * @function + * @param {String} url + * @throws {Error} + */ + getImageInfo: function( url ) { + var _this = this, + callbackName, + callback, + readySource, + options, + urlParts, + filename, + lastDot; + + + if( url ) { + urlParts = url.split( '/' ); + filename = urlParts[ urlParts.length - 1 ]; + lastDot = filename.lastIndexOf( '.' ); + if ( lastDot > -1 ) { + urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot ); + } + } + + var postData = null; + if (this.splitHashDataForPost) { + var hashIdx = url.indexOf("#"); + if (hashIdx !== -1) { + postData = url.substring(hashIdx + 1); + url = url.substr(0, hashIdx); + } + } + + callback = function( data ){ + if( typeof (data) === "string" ) { + data = $.parseXml( data ); + } + var $TileSource = $.TileSource.determineType( _this, data, url ); + if ( !$TileSource ) { + /** + * Raised when an error occurs loading a TileSource. + * + * @event open-failed + * @memberof OpenSeadragon.TileSource + * @type {object} + * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event. + * @property {String} message + * @property {String} source + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'open-failed', { message: "Unable to load TileSource", source: url } ); + return; + } + + options = $TileSource.prototype.configure.apply( _this, [ data, url, postData ]); + if (options.ajaxWithCredentials === undefined) { + options.ajaxWithCredentials = _this.ajaxWithCredentials; + } + + readySource = new $TileSource( options ); + _this.ready = true; + /** + * Raised when a TileSource is opened and initialized. + * + * @event ready + * @memberof OpenSeadragon.TileSource + * @type {object} + * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event. + * @property {Object} tileSource + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'ready', { tileSource: readySource } ); + }; + + if( url.match(/\.js$/) ){ + //TODO: Its not very flexible to require tile sources to end jsonp + // request for info with a url that ends with '.js' but for + // now it's the only way I see to distinguish uniformly. + callbackName = url.split('/').pop().replace('.js', ''); + $.jsonp({ + url: url, + async: false, + callbackName: callbackName, + callback: callback + }); + } else { + // request info via xhr asynchronously. + $.makeAjaxRequest( { + url: url, + postData: postData, + withCredentials: this.ajaxWithCredentials, + headers: this.ajaxHeaders, + success: function( xhr ) { + var data = processResponse( xhr ); + callback( data ); + }, + error: function ( xhr, exc ) { + var msg; + + /* + IE < 10 will block XHR requests to different origins. Any property access on the request + object will raise an exception which we'll attempt to handle by formatting the original + exception rather than the second one raised when we try to access xhr.status + */ + try { + msg = "HTTP " + xhr.status + " attempting to load TileSource: " + url; + } catch ( e ) { + var formattedExc; + if ( typeof ( exc ) === "undefined" || !exc.toString ) { + formattedExc = "Unknown error"; + } else { + formattedExc = exc.toString(); + } + + msg = formattedExc + " attempting to load TileSource: " + url; + } + + $.console.error(msg); + + /*** + * Raised when an error occurs loading a TileSource. + * + * @event open-failed + * @memberof OpenSeadragon.TileSource + * @type {object} + * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event. + * @property {String} message + * @property {String} source + * @property {String} postData - HTTP POST data (usually but not necessarily in k=v&k2=v2... form, + * see TileSource::getPostData) or null + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( 'open-failed', { + message: msg, + source: url, + postData: postData + }); + } + }); + } + + }, + + /** + * Responsible determining if a the particular TileSource supports the + * data format ( and allowed to apply logic against the url the data was + * loaded from, if any ). Overriding implementations are expected to do + * something smart with data and / or url to determine support. Also + * understand that iteration order of TileSources is not guarunteed so + * please make sure your data or url is expressive enough to ensure a simple + * and sufficient mechanisim for clear determination. + * @function + * @param {String|Object|Array|Document} data + * @param {String} url - the url the data was loaded + * from if any. + * @returns {Boolean} + */ + supports: function( data, url ) { + return false; + }, + + /** + * Responsible for parsing and configuring the + * image metadata pertinent to this TileSources implementation. + * This method is not implemented by this class other than to throw an Error + * announcing you have to implement it. Because of the variety of tile + * server technologies, and various specifications for building image + * pyramids, this method is here to allow easy integration. + * @function + * @param {String|Object|Array|Document} data + * @param {String} url - the url the data was loaded + * from if any. + * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null value obtained from + * the protocol URL after '#' sign if flag splitHashDataForPost set to 'true' + * @returns {Object} options - A dictionary of keyword arguments sufficient + * to configure the tile source constructor (include all values you want to + * instantiate the TileSource subclass with - what _options_ object should contain). + * @throws {Error} + */ + configure: function( data, url, postData ) { + throw new Error( "Method not implemented." ); + }, + + /** + * Responsible for retrieving the url which will return an image for the + * region specified by the given x, y, and level components. + * This method is not implemented by this class other than to throw an Error + * announcing you have to implement it. Because of the variety of tile + * server technologies, and various specifications for building image + * pyramids, this method is here to allow easy integration. + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + * @returns {String|Function} url - A string for the url or a function that returns a url string. + * @throws {Error} + */ + getTileUrl: function( level, x, y ) { + throw new Error( "Method not implemented." ); + }, + + /** + * Must use AJAX in order to work, i.e. loadTilesWithAjax = true is set. + * If a value is returned, ajax issues POST request to the tile url. + * If null is returned, ajax issues GET request. + * The return value must comply to the header 'content type'. + * + * Examples (USED HEADER --> getTilePostData CODE): + * 'Content-type': 'application/x-www-form-urlencoded' --> + * return "key1=value=1&key2=value2"; + * + * 'Content-type': 'application/x-www-form-urlencoded' --> + * return JSON.stringify({key: "value", number: 5}); + * + * 'Content-type': 'multipart/form-data' --> + * let result = new FormData(); + * result.append("data", myData); + * return result; + * + * IMPORTANT: in case you move all the logic on image fetching + * to post data, you must re-define 'getTileHashKey(...)' to + * stay unique for different tile images. + * + * @param {Number} level + * @param {Number} x + * @param {Number} y + * @returns {*|null} post data to send with tile configuration request + */ + getTilePostData: function( level, x, y ) { + return null; + }, + + /** + * Responsible for retrieving the headers which will be attached to the image request for the + * region specified by the given x, y, and level components. + * This option is only relevant if {@link OpenSeadragon.Options}.loadTilesWithAjax is set to true. + * The headers returned here will override headers specified at the Viewer or TiledImage level. + * Specifying a falsy value for a header will clear its existing value set at the Viewer or + * TiledImage level (if any). + * + * Note that the headers of existing tiles don't automatically change when this function + * returns updated headers. To do that, you need to call {@link OpenSeadragon.Viewer#setAjaxHeaders} + * and propagate the changes. + * + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + * @returns {Object} + */ + getTileAjaxHeaders: function( level, x, y ) { + return {}; + }, + + /** + * The tile cache object is uniquely determined by this key and used to lookup + * the image data in cache: keys should be different if images are different. + * + * In case a tile has context2D property defined (TileSource.prototype.getContext2D) + * or its context2D is set manually; the cache is not used and this function + * is irrelevant. + * Note: default behaviour does not take into account post data. + * @param {Number} level tile level it was fetched with + * @param {Number} x x-coordinate in the pyramid level + * @param {Number} y y-coordinate in the pyramid level + * @param {String} url the tile was fetched with + * @param {Object} ajaxHeaders the tile was fetched with + * @param {*} postData data the tile was fetched with (type depends on getTilePostData(..) return type) + */ + getTileHashKey: function(level, x, y, url, ajaxHeaders, postData) { + function withHeaders(hash) { + return ajaxHeaders ? hash + "+" + JSON.stringify(ajaxHeaders) : hash; + } + + if (typeof url !== "string") { + return withHeaders(level + "/" + x + "_" + y); + } + return withHeaders(url); + }, + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + tileExists: function( level, x, y ) { + var numTiles = this.getNumTiles( level ); + return level >= this.minLevel && + level <= this.maxLevel && + x >= 0 && + y >= 0 && + x < numTiles.x && + y < numTiles.y; + }, + + /** + * Decide whether tiles have transparency: this is crucial for correct images blending. + * @returns {boolean} true if the image has transparency + */ + hasTransparency: function(context2D, url, ajaxHeaders, post) { + return !!context2D || url.match('.png'); + }, + + /** + * Download tile data. + * Note that if you override this function, you should override also downloadTileAbort(). + * @param {ImageJob} context job context that you have to call finish(...) on. + * @param {String} [context.src] - URL of image to download. + * @param {String} [context.loadWithAjax] - Whether to load this image with AJAX. + * @param {String} [context.ajaxHeaders] - Headers to add to the image request if using AJAX. + * @param {Boolean} [context.ajaxWithCredentials] - Whether to set withCredentials on AJAX requests. + * @param {String} [context.crossOriginPolicy] - CORS policy to use for downloads + * @param {String} [context.postData] - HTTP POST data (usually but not necessarily in k=v&k2=v2... form, + * see TileSource::getPostData) or null + * @param {*} [context.userData] - Empty object to attach your own data and helper variables to. + * @param {Function} [context.finish] - Should be called unless abort() was executed, e.g. on all occasions, + * be it successful or unsuccessful request. + * Usage: context.finish(data, request, errMessage). Pass the downloaded data object or null upon failure. + * Add also reference to an ajax request if used. Provide error message in case of failure. + * @param {Function} [context.abort] - Called automatically when the job times out. + * Usage: context.abort(). + * @param {Function} [context.callback] @private - Called automatically once image has been downloaded + * (triggered by finish). + * @param {Number} [context.timeout] @private - The max number of milliseconds that + * this image job may take to complete. + * @param {string} [context.errorMsg] @private - The final error message, default null (set by finish). + */ + downloadTileStart: function (context) { + var dataStore = context.userData, + image = new Image(); + + dataStore.image = image; + dataStore.request = null; + + var finish = function(error) { + if (!image) { + context.finish(null, dataStore.request, "Image load failed: undefined Image instance."); + return; + } + image.onload = image.onerror = image.onabort = null; + context.finish(error ? null : image, dataStore.request, error); + }; + image.onload = function () { + finish(); + }; + image.onabort = image.onerror = function() { + finish("Image load aborted."); + }; + + // Load the tile with an AJAX request if the loadWithAjax option is + // set. Otherwise load the image by setting the source proprety of the image object. + if (context.loadWithAjax) { + dataStore.request = $.makeAjaxRequest({ + url: context.src, + withCredentials: context.ajaxWithCredentials, + headers: context.ajaxHeaders, + responseType: "arraybuffer", + postData: context.postData, + success: function(request) { + var blb; + // Make the raw data into a blob. + // BlobBuilder fallback adapted from + // http://stackoverflow.com/questions/15293694/blob-constructor-browser-compatibility + try { + blb = new window.Blob([request.response]); + } catch (e) { + var BlobBuilder = ( + window.BlobBuilder || + window.WebKitBlobBuilder || + window.MozBlobBuilder || + window.MSBlobBuilder + ); + if (e.name === 'TypeError' && BlobBuilder) { + var bb = new BlobBuilder(); + bb.append(request.response); + blb = bb.getBlob(); + } + } + // If the blob is empty for some reason consider the image load a failure. + if (blb.size === 0) { + finish("Empty image response."); + } else { + // Create a URL for the blob data and make it the source of the image object. + // This will still trigger Image.onload to indicate a successful tile load. + image.src = (window.URL || window.webkitURL).createObjectURL(blb); + } + }, + error: function(request) { + finish("Image load aborted - XHR error"); + } + }); + } else { + if (context.crossOriginPolicy !== false) { + image.crossOrigin = context.crossOriginPolicy; + } + image.src = context.src; + } + }, + + /** + * Provide means of aborting the execution. + * Note that if you override this function, you should override also downloadTileStart(). + * @param {ImageJob} context job, the same object as with downloadTileStart(..) + * @param {*} [context.userData] - Empty object to attach (and mainly read) your own data. + */ + downloadTileAbort: function (context) { + if (context.userData.request) { + context.userData.request.abort(); + } + var image = context.userData.image; + if (context.userData.image) { + image.onload = image.onerror = image.onabort = null; + } + }, + + /** + * Create cache object from the result of the download process. The + * cacheObject parameter should be used to attach the data to, there are no + * conventions on how it should be stored - all the logic is implemented within *TileCache() functions. + * + * Note that if you override any of *TileCache() functions, you should override all of them. + * @param {object} cacheObject context cache object + * @param {*} data image data, the data sent to ImageJob.prototype.finish(), by default an Image object + * @param {Tile} tile instance the cache was created with + */ + createTileCache: function(cacheObject, data, tile) { + cacheObject._data = data; + }, + + /** + * Cache object destructor, unset all properties you created to allow GC collection. + * Note that if you override any of *TileCache() functions, you should override all of them. + * @param {object} cacheObject context cache object + */ + destroyTileCache: function (cacheObject) { + cacheObject._data = null; + cacheObject._renderedContext = null; + }, + + /** + * Raw data getter + * Note that if you override any of *TileCache() functions, you should override all of them. + * @param {object} cacheObject context cache object + * @returns {*} cache data + */ + getTileCacheData: function(cacheObject) { + return cacheObject._data; + }, + + /** + * Compatibility image element getter + * - plugins might need image representation of the data + * - div HTML rendering relies on image element presence + * Note that if you override any of *TileCache() functions, you should override all of them. + * @param {object} cacheObject context cache object + * @returns {Image} cache data as an Image + */ + getTileCacheDataAsImage: function(cacheObject) { + return cacheObject._data; //the data itself by default is Image + }, + + /** + * Compatibility context 2D getter + * - most heavily used rendering method is a canvas-based approach, + * convert the data to a canvas and return it's 2D context + * Note that if you override any of *TileCache() functions, you should override all of them. + * @param {object} cacheObject context cache object + * @returns {CanvasRenderingContext2D} context of the canvas representation of the cache data + */ + getTileCacheDataAsContext2D: function(cacheObject) { + if (!cacheObject._renderedContext) { + var canvas = document.createElement( 'canvas' ); + canvas.width = cacheObject._data.width; + canvas.height = cacheObject._data.height; + cacheObject._renderedContext = canvas.getContext('2d'); + cacheObject._renderedContext.drawImage( cacheObject._data, 0, 0 ); + //since we are caching the prerendered image on a canvas + //allow the image to not be held in memory + cacheObject._data = null; + } + return cacheObject._renderedContext; + } +}; + + +$.extend( true, $.TileSource.prototype, $.EventSource.prototype ); + + +/** + * Decides whether to try to process the response as xml, json, or hand back + * the text + * @private + * @inner + * @function + * @param {XMLHttpRequest} xhr - the completed network request + */ +function processResponse( xhr ){ + var responseText = xhr.responseText, + status = xhr.status, + statusText, + data; + + if ( !xhr ) { + throw new Error( $.getString( "Errors.Security" ) ); + } else if ( xhr.status !== 200 && xhr.status !== 0 ) { + status = xhr.status; + statusText = ( status === 404 ) ? + "Not Found" : + xhr.statusText; + throw new Error( $.getString( "Errors.Status", status, statusText ) ); + } + + if( responseText.match(/^\s*<.*/) ){ + try{ + data = ( xhr.responseXML && xhr.responseXML.documentElement ) ? + xhr.responseXML : + $.parseXml( responseText ); + } catch (e){ + data = xhr.responseText; + } + }else if( responseText.match(/\s*[{[].*/) ){ + try{ + data = $.parseJSON(responseText); + } catch(e){ + data = responseText; + } + }else{ + data = responseText; + } + return data; +} + + +/** + * Determines the TileSource Implementation by introspection of OpenSeadragon + * namespace, calling each TileSource implementation of 'isType' + * @private + * @inner + * @function + * @param {Object|Array|Document} data - the tile source configuration object + * @param {String} url - the url where the tile source configuration object was + * loaded from, if any. + */ +$.TileSource.determineType = function( tileSource, data, url ){ + var property; + for( property in OpenSeadragon ){ + if( property.match(/.+TileSource$/) && + $.isFunction( OpenSeadragon[ property ] ) && + $.isFunction( OpenSeadragon[ property ].prototype.supports ) && + OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url ) + ){ + return OpenSeadragon[ property ]; + } + } + + $.console.error( "No TileSource was able to open %s %s", url, data ); + + return null; +}; + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - DziTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class DziTileSource + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Number|Object} width - the pixel width of the image or the idiomatic + * options object which is used instead of positional arguments. + * @param {Number} height + * @param {Number} tileSize + * @param {Number} tileOverlap + * @param {String} tilesUrl + * @param {String} fileFormat + * @param {OpenSeadragon.DisplayRect[]} displayRects + * @property {String} tilesUrl + * @property {String} fileFormat + * @property {OpenSeadragon.DisplayRect[]} displayRects + */ +$.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, fileFormat, displayRects, minLevel, maxLevel ) { + var i, + rect, + level, + options; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: arguments[ 0 ], + height: arguments[ 1 ], + tileSize: arguments[ 2 ], + tileOverlap: arguments[ 3 ], + tilesUrl: arguments[ 4 ], + fileFormat: arguments[ 5 ], + displayRects: arguments[ 6 ], + minLevel: arguments[ 7 ], + maxLevel: arguments[ 8 ] + }; + } + + this._levelRects = {}; + this.tilesUrl = options.tilesUrl; + this.fileFormat = options.fileFormat; + this.displayRects = options.displayRects; + + if ( this.displayRects ) { + for ( i = this.displayRects.length - 1; i >= 0; i-- ) { + rect = this.displayRects[ i ]; + for ( level = rect.minLevel; level <= rect.maxLevel; level++ ) { + if ( !this._levelRects[ level ] ) { + this._levelRects[ level ] = []; + } + this._levelRects[ level ].push( rect ); + } + } + } + + $.TileSource.apply( this, [ options ] ); + +}; + +$.extend( $.DziTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.DziTileSource.prototype */{ + + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + var ns; + if ( data.Image ) { + ns = data.Image.xmlns; + } else if ( data.documentElement) { + if ("Image" === data.documentElement.localName || "Image" === data.documentElement.tagName) { + ns = data.documentElement.namespaceURI; + } + } + + ns = (ns || '').toLowerCase(); + + return (ns.indexOf('schemas.microsoft.com/deepzoom/2008') !== -1 || + ns.indexOf('schemas.microsoft.com/deepzoom/2009') !== -1); + }, + + /** + * + * @function + * @param {Object|XMLDocument} data - the raw configuration + * @param {String} url - the url the data was retrieved from if any. + * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null + * @returns {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function( data, url, postData ){ + + var options; + + if( !$.isPlainObject(data) ){ + + options = configureFromXML( this, data ); + + }else{ + + options = configureFromObject( this, data ); + } + + if (url && !options.tilesUrl) { + options.tilesUrl = url.replace( + /([^/]+?)(\.(dzi|xml|js)?(\?[^/]*)?)?\/?$/, '$1_files/'); + + if (url.search(/\.(dzi|xml|js)\?/) !== -1) { + options.queryParams = url.match(/\?.*/); + }else{ + options.queryParams = ''; + } + } + + return options; + }, + + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + getTileUrl: function( level, x, y ) { + return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat, this.queryParams ].join( '' ); + }, + + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + tileExists: function( level, x, y ) { + var rects = this._levelRects[ level ], + rect, + scale, + xMin, + yMin, + xMax, + yMax, + i; + + if ((this.minLevel && level < this.minLevel) || (this.maxLevel && level > this.maxLevel)) { + return false; + } + + if ( !rects || !rects.length ) { + return true; + } + + for ( i = rects.length - 1; i >= 0; i-- ) { + rect = rects[ i ]; + + if ( level < rect.minLevel || level > rect.maxLevel ) { + continue; + } + + scale = this.getLevelScale( level ); + xMin = rect.x * scale; + yMin = rect.y * scale; + xMax = xMin + rect.width * scale; + yMax = yMin + rect.height * scale; + + xMin = Math.floor( xMin / this._tileWidth ); + yMin = Math.floor( yMin / this._tileWidth ); // DZI tiles are square, so we just use _tileWidth + xMax = Math.ceil( xMax / this._tileWidth ); + yMax = Math.ceil( yMax / this._tileWidth ); + + if ( xMin <= x && x < xMax && yMin <= y && y < yMax ) { + return true; + } + } + + return false; + } +}); + + +/** + * @private + * @inner + * @function + */ +function configureFromXML( tileSource, xmlDoc ){ + + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.localName || root.tagName, + ns = xmlDoc.documentElement.namespaceURI, + configuration = null, + displayRects = [], + dispRectNodes, + dispRectNode, + rectNode, + sizeNode, + i; + + if ( rootName === "Image" ) { + + try { + sizeNode = root.getElementsByTagName("Size" )[ 0 ]; + if (sizeNode === undefined) { + sizeNode = root.getElementsByTagNameNS(ns, "Size" )[ 0 ]; + } + + configuration = { + Image: { + xmlns: "http://schemas.microsoft.com/deepzoom/2008", + Url: root.getAttribute( "Url" ), + Format: root.getAttribute( "Format" ), + DisplayRect: null, + Overlap: parseInt( root.getAttribute( "Overlap" ), 10 ), + TileSize: parseInt( root.getAttribute( "TileSize" ), 10 ), + Size: { + Height: parseInt( sizeNode.getAttribute( "Height" ), 10 ), + Width: parseInt( sizeNode.getAttribute( "Width" ), 10 ) + } + } + }; + + if ( !$.imageFormatSupported( configuration.Image.Format ) ) { + throw new Error( + $.getString( "Errors.ImageFormat", configuration.Image.Format.toUpperCase() ) + ); + } + + dispRectNodes = root.getElementsByTagName("DisplayRect" ); + if (dispRectNodes === undefined) { + dispRectNodes = root.getElementsByTagNameNS(ns, "DisplayRect" )[ 0 ]; + } + + for ( i = 0; i < dispRectNodes.length; i++ ) { + dispRectNode = dispRectNodes[ i ]; + rectNode = dispRectNode.getElementsByTagName("Rect" )[ 0 ]; + if (rectNode === undefined) { + rectNode = dispRectNode.getElementsByTagNameNS(ns, "Rect" )[ 0 ]; + } + + displayRects.push({ + Rect: { + X: parseInt( rectNode.getAttribute( "X" ), 10 ), + Y: parseInt( rectNode.getAttribute( "Y" ), 10 ), + Width: parseInt( rectNode.getAttribute( "Width" ), 10 ), + Height: parseInt( rectNode.getAttribute( "Height" ), 10 ), + MinLevel: parseInt( dispRectNode.getAttribute( "MinLevel" ), 10 ), + MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 ) + } + }); + } + + if( displayRects.length ){ + configuration.Image.DisplayRect = displayRects; + } + + return configureFromObject( tileSource, configuration ); + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( $.getString("Errors.Dzi") ); + } + } else if ( rootName === "Collection" ) { + throw new Error( $.getString( "Errors.Dzc" ) ); + } else if ( rootName === "Error" ) { + var messageNode = root.getElementsByTagName("Message")[0]; + var message = messageNode.firstChild.nodeValue; + throw new Error(message); + } + + throw new Error( $.getString( "Errors.Dzi" ) ); +} + +/** + * @private + * @inner + * @function + */ +function configureFromObject( tileSource, configuration ){ + var imageData = configuration.Image, + tilesUrl = imageData.Url, + fileFormat = imageData.Format, + sizeData = imageData.Size, + dispRectData = imageData.DisplayRect || [], + width = parseInt( sizeData.Width, 10 ), + height = parseInt( sizeData.Height, 10 ), + tileSize = parseInt( imageData.TileSize, 10 ), + tileOverlap = parseInt( imageData.Overlap, 10 ), + displayRects = [], + rectData, + i; + + //TODO: need to figure out out to better handle image format compatibility + // which actually includes additional file formats like xml and pdf + // and plain text for various tilesource implementations to avoid low + // level errors. + // + // For now, just don't perform the check. + // + /*if ( !imageFormatSupported( fileFormat ) ) { + throw new Error( + $.getString( "Errors.ImageFormat", fileFormat.toUpperCase() ) + ); + }*/ + + for ( i = 0; i < dispRectData.length; i++ ) { + rectData = dispRectData[ i ].Rect; + + displayRects.push( new $.DisplayRect( + parseInt( rectData.X, 10 ), + parseInt( rectData.Y, 10 ), + parseInt( rectData.Width, 10 ), + parseInt( rectData.Height, 10 ), + parseInt( rectData.MinLevel, 10 ), + parseInt( rectData.MaxLevel, 10 ) + )); + } + + return $.extend(true, { + width: width, /* width *required */ + height: height, /* height *required */ + tileSize: tileSize, /* tileSize *required */ + tileOverlap: tileOverlap, /* tileOverlap *required */ + minLevel: null, /* minLevel */ + maxLevel: null, /* maxLevel */ + tilesUrl: tilesUrl, /* tilesUrl */ + fileFormat: fileFormat, /* fileFormat */ + displayRects: displayRects /* displayRects */ + }, configuration ); + +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - IIIFTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2023 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class IIIFTileSource + * @classdesc A client implementation of the International Image Interoperability Framework + * Format: Image API 1.0 - 2.1 + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @see http://iiif.io/api/image/ + * @param {String} [options.tileFormat='jpg'] + * The extension that will be used when requiring tiles. + */ +$.IIIFTileSource = function( options ){ + + /* eslint-disable camelcase */ + + $.extend( true, this, options ); + + /* Normalizes v3-style 'id' keys to an "_id" internal property */ + this._id = this["@id"] || this["id"] || this['identifier'] || null; + + if ( !( this.height && this.width && this._id) ) { + throw new Error( 'IIIF required parameters (width, height, or id) not provided.' ); + } + + options.tileSizePerScaleFactor = {}; + + this.tileFormat = this.tileFormat || 'jpg'; + + this.version = options.version; + + // N.B. 2.0 renamed scale_factors to scaleFactors + if ( this.tile_width && this.tile_height ) { + options.tileWidth = this.tile_width; + options.tileHeight = this.tile_height; + } else if ( this.tile_width ) { + options.tileSize = this.tile_width; + } else if ( this.tile_height ) { + options.tileSize = this.tile_height; + } else if ( this.tiles ) { + // Version 2.0 forwards + if ( this.tiles.length === 1 ) { + options.tileWidth = this.tiles[0].width; + // Use height if provided, otherwise assume square tiles and use width. + options.tileHeight = this.tiles[0].height || this.tiles[0].width; + this.scale_factors = this.tiles[0].scaleFactors; + } else { + // Multiple tile sizes at different levels + this.scale_factors = []; + for (var t = 0; t < this.tiles.length; t++ ) { + for (var sf = 0; sf < this.tiles[t].scaleFactors.length; sf++) { + var scaleFactor = this.tiles[t].scaleFactors[sf]; + this.scale_factors.push(scaleFactor); + options.tileSizePerScaleFactor[scaleFactor] = { + width: this.tiles[t].width, + height: this.tiles[t].height || this.tiles[t].width + }; + } + } + } + } else if ( canBeTiled(options) ) { + // use the largest of tileOptions that is smaller than the short dimension + var shortDim = Math.min( this.height, this.width ), + tileOptions = [256, 512, 1024], + smallerTiles = []; + + for ( var c = 0; c < tileOptions.length; c++ ) { + if ( tileOptions[c] <= shortDim ) { + smallerTiles.push( tileOptions[c] ); + } + } + + if ( smallerTiles.length > 0 ) { + options.tileSize = Math.max.apply( null, smallerTiles ); + } else { + // If we're smaller than 256, just use the short side. + options.tileSize = shortDim; + } + } else if (this.sizes && this.sizes.length > 0) { + // This info.json can't be tiled, but we can still construct a legacy pyramid from the sizes array. + // In this mode, IIIFTileSource will call functions from the abstract baseTileSource or the + // LegacyTileSource instead of performing IIIF tiling. + this.emulateLegacyImagePyramid = true; + + options.levels = constructLevels( this ); + // use the largest available size to define tiles + $.extend( true, options, { + width: options.levels[ options.levels.length - 1 ].width, + height: options.levels[ options.levels.length - 1 ].height, + tileSize: Math.max( options.height, options.width ), + tileOverlap: 0, + minLevel: 0, + maxLevel: options.levels.length - 1 + }); + this.levels = options.levels; + } else { + $.console.error("Nothing in the info.json to construct image pyramids from"); + } + + if (!options.maxLevel && !this.emulateLegacyImagePyramid) { + if (!this.scale_factors) { + options.maxLevel = Number(Math.round(Math.log(Math.max(this.width, this.height), 2))); + } else { + var maxScaleFactor = Math.max.apply(null, this.scale_factors); + options.maxLevel = Math.round(Math.log(maxScaleFactor) * Math.LOG2E); + } + } + + // Create an array with our exact resolution sizes if these have been supplied + if( this.sizes ) { + var sizeLength = this.sizes.length; + if ( (sizeLength === options.maxLevel) || (sizeLength === options.maxLevel + 1) ) { + this.levelSizes = this.sizes; + // Need to take into account that the list may or may not include the full resolution size + if( sizeLength === options.maxLevel ) { + this.levelSizes.push( {width: this.width, height: this.height} ); + } + } + } + + $.TileSource.apply( this, [ options ] ); +}; + +$.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.IIIFTileSource.prototype */{ + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} [url] - url + */ + + supports: function( data, url ) { + // Version 2.0 and forwards + if (data.protocol && data.protocol === 'http://iiif.io/api/image') { + return true; + // Version 1.1 + } else if ( data['@context'] && ( + data['@context'] === "http://library.stanford.edu/iiif/image-api/1.1/context.json" || + data['@context'] === "http://iiif.io/api/image/1/context.json") ) { + // N.B. the iiif.io context is wrong, but where the representation lives so likely to be used + return true; + + // Version 1.0 + } else if ( data.profile && + data.profile.indexOf("http://library.stanford.edu/iiif/image-api/compliance.html") === 0) { + return true; + } else if ( data.identifier && data.width && data.height ) { + return true; + } else if ( data.documentElement && + "info" === data.documentElement.tagName && + "http://library.stanford.edu/iiif/image-api/ns/" === + data.documentElement.namespaceURI) { + return true; + + // Not IIIF + } else { + return false; + } + }, + + /** + * A static function used to prepare an incoming IIIF Image API info.json + * response for processing by the tile handler. Normalizes data for all + * versions of IIIF (1.0, 1.1, 2.x, 3.x) and returns a data object that + * may be passed to the IIIFTileSource. + * + * @function + * @static + * @param {Object} data - the raw configuration + * @param {String} url - the url configuration was retrieved from + * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null + * @returns {Object} A normalized IIIF data object + * @example IIIF 2.x Info Looks like this + * { + * "@context": "http://iiif.io/api/image/2/context.json", + * "@id": "http://iiif.example.com/prefix/1E34750D-38DB-4825-A38A-B60A345E591C", + * "protocol": "http://iiif.io/api/image", + * "height": 1024, + * "width": 775, + * "tiles" : [{"width":256, "scaleFactors":[1,2,4,8]}], + * "profile": ["http://iiif.io/api/image/2/level1.json", { + * "qualities": [ "native", "bitonal", "grey", "color" ], + * "formats": [ "jpg", "png", "gif" ] + * }] + * } + */ + configure: function( data, url, postData ){ + // Try to deduce our version and fake it upwards if needed + if ( !$.isPlainObject(data) ) { + var options = configureFromXml10( data ); + options['@context'] = "http://iiif.io/api/image/1.0/context.json"; + options["@id"] = url.replace('/info.xml', ''); + options.version = 1; + return options; + } else { + if ( !data['@context'] ) { + data['@context'] = 'http://iiif.io/api/image/1.0/context.json'; + data["@id"] = url.replace('/info.json', ''); + data.version = 1; + } else { + var context = data['@context']; + if (Array.isArray(context)) { + for (var i = 0; i < context.length; i++) { + if (typeof context[i] === 'string' && + ( /^http:\/\/iiif\.io\/api\/image\/[1-3]\/context\.json$/.test(context[i]) || + context[i] === 'http://library.stanford.edu/iiif/image-api/1.1/context.json' ) ) { + context = context[i]; + break; + } + } + } + switch (context) { + case 'http://iiif.io/api/image/1/context.json': + case 'http://library.stanford.edu/iiif/image-api/1.1/context.json': + data.version = 1; + break; + case 'http://iiif.io/api/image/2/context.json': + data.version = 2; + break; + case 'http://iiif.io/api/image/3/context.json': + data.version = 3; + break; + default: + $.console.error('Data has a @context property which contains no known IIIF context URI.'); + } + } + + if (data.preferredFormats) { + for (var f = 0; f < data.preferredFormats.length; f++ ) { + if ( OpenSeadragon.imageFormatSupported(data.preferredFormats[f]) ) { + data.tileFormat = data.preferredFormats[f]; + break; + } + } + } + return data; + } + }, + + /** + * Return the tileWidth for the given level. + * @function + * @param {Number} level + */ + getTileWidth: function( level ) { + + if(this.emulateLegacyImagePyramid) { + return $.TileSource.prototype.getTileWidth.call(this, level); + } + + var scaleFactor = Math.pow(2, this.maxLevel - level); + + if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) { + return this.tileSizePerScaleFactor[scaleFactor].width; + } + return this._tileWidth; + }, + + /** + * Return the tileHeight for the given level. + * @function + * @param {Number} level + */ + getTileHeight: function( level ) { + + if(this.emulateLegacyImagePyramid) { + return $.TileSource.prototype.getTileHeight.call(this, level); + } + + var scaleFactor = Math.pow(2, this.maxLevel - level); + + if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) { + return this.tileSizePerScaleFactor[scaleFactor].height; + } + return this._tileHeight; + }, + + /** + * @function + * @param {Number} level + */ + getLevelScale: function ( level ) { + + if(this.emulateLegacyImagePyramid) { + var levelScale = NaN; + if (this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel) { + levelScale = + this.levels[level].width / + this.levels[this.maxLevel].width; + } + return levelScale; + } + + return $.TileSource.prototype.getLevelScale.call(this, level); + }, + + /** + * @function + * @param {Number} level + */ + getNumTiles: function( level ) { + + if(this.emulateLegacyImagePyramid) { + var scale = this.getLevelScale(level); + if (scale) { + return new $.Point(1, 1); + } else { + return new $.Point(0, 0); + } + } + + // Use supplied list of scaled resolution sizes if these exist + if( this.levelSizes ) { + var levelSize = this.levelSizes[level]; + var x = Math.ceil( levelSize.width / this.getTileWidth(level) ), + y = Math.ceil( levelSize.height / this.getTileHeight(level) ); + return new $.Point( x, y ); + } + // Otherwise call default TileSource->getNumTiles() function + else { + return $.TileSource.prototype.getNumTiles.call(this, level); + } + }, + + + /** + * @function + * @param {Number} level + * @param {OpenSeadragon.Point} point + */ + getTileAtPoint: function( level, point ) { + + if(this.emulateLegacyImagePyramid) { + return new $.Point(0, 0); + } + + // Use supplied list of scaled resolution sizes if these exist + if( this.levelSizes ) { + + var validPoint = point.x >= 0 && point.x <= 1 && + point.y >= 0 && point.y <= 1 / this.aspectRatio; + $.console.assert(validPoint, "[TileSource.getTileAtPoint] must be called with a valid point."); + + var widthScaled = this.levelSizes[level].width; + var pixelX = point.x * widthScaled; + var pixelY = point.y * widthScaled; + + var x = Math.floor(pixelX / this.getTileWidth(level)); + var y = Math.floor(pixelY / this.getTileHeight(level)); + + // When point.x == 1 or point.y == 1 / this.aspectRatio we want to + // return the last tile of the row/column + if (point.x >= 1) { + x = this.getNumTiles(level).x - 1; + } + var EPSILON = 1e-15; + if (point.y >= 1 / this.aspectRatio - EPSILON) { + y = this.getNumTiles(level).y - 1; + } + + return new $.Point(x, y); + } + + // Otherwise call default TileSource->getTileAtPoint() function + return $.TileSource.prototype.getTileAtPoint.call(this, level, point); + }, + + + /** + * Responsible for retrieving the url which will return an image for the + * region specified by the given x, y, and level components. + * @function + * @param {Number} level - z index + * @param {Number} x + * @param {Number} y + * @throws {Error} + */ + getTileUrl: function( level, x, y ){ + + if(this.emulateLegacyImagePyramid) { + var url = null; + if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) { + url = this.levels[ level ].url; + } + return url; + } + + //# constants + var IIIF_ROTATION = '0', + //## get the scale (level as a decimal) + scale = Math.pow( 0.5, this.maxLevel - level ), + //# image dimensions at this level + levelWidth, + levelHeight, + + //## iiif region + tileWidth, + tileHeight, + iiifTileSizeWidth, + iiifTileSizeHeight, + iiifRegion, + iiifTileX, + iiifTileY, + iiifTileW, + iiifTileH, + iiifSize, + iiifSizeW, + iiifSizeH, + iiifQuality, + uri; + + // Use supplied list of scaled resolution sizes if these exist + if( this.levelSizes ) { + levelWidth = this.levelSizes[level].width; + levelHeight = this.levelSizes[level].height; + } + // Otherwise calculate the sizes ourselves + else { + levelWidth = Math.ceil( this.width * scale ); + levelHeight = Math.ceil( this.height * scale ); + } + + tileWidth = this.getTileWidth(level); + tileHeight = this.getTileHeight(level); + iiifTileSizeWidth = Math.round( tileWidth / scale ); + iiifTileSizeHeight = Math.round( tileHeight / scale ); + if (this.version === 1) { + iiifQuality = "native." + this.tileFormat; + } else { + iiifQuality = "default." + this.tileFormat; + } + if ( levelWidth < tileWidth && levelHeight < tileHeight ){ + if ( this.version === 2 && levelWidth === this.width ) { + iiifSize = "full"; + } else if ( this.version === 3 && levelWidth === this.width && levelHeight === this.height ) { + iiifSize = "max"; + } else if ( this.version === 3 ) { + iiifSize = levelWidth + "," + levelHeight; + } else { + iiifSize = levelWidth + ","; + } + iiifRegion = 'full'; + } else { + iiifTileX = x * iiifTileSizeWidth; + iiifTileY = y * iiifTileSizeHeight; + iiifTileW = Math.min( iiifTileSizeWidth, this.width - iiifTileX ); + iiifTileH = Math.min( iiifTileSizeHeight, this.height - iiifTileY ); + if ( x === 0 && y === 0 && iiifTileW === this.width && iiifTileH === this.height ) { + iiifRegion = "full"; + } else { + iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' ); + } + iiifSizeW = Math.min( tileWidth, levelWidth - (x * tileWidth) ); + iiifSizeH = Math.min( tileHeight, levelHeight - (y * tileHeight) ); + if ( this.version === 2 && iiifSizeW === this.width ) { + iiifSize = "full"; + } else if ( this.version === 3 && iiifSizeW === this.width && iiifSizeH === this.height ) { + iiifSize = "max"; + } else if (this.version === 3) { + iiifSize = iiifSizeW + "," + iiifSizeH; + } else { + iiifSize = iiifSizeW + ","; + } + } + uri = [ this._id, iiifRegion, iiifSize, IIIF_ROTATION, iiifQuality ].join( '/' ); + + return uri; + }, + + __testonly__: { + canBeTiled: canBeTiled, + constructLevels: constructLevels + } + + }); + + /** + * Determine whether arbitrary tile requests can be made against a service with the given profile + * @function + * @param {Object} options + * @param {Array|String} options.profile + * @param {Number} options.version + * @param {String[]} options.extraFeatures + * @returns {Boolean} + */ + function canBeTiled ( options ) { + var level0Profiles = [ + "http://library.stanford.edu/iiif/image-api/compliance.html#level0", + "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0", + "http://iiif.io/api/image/2/level0.json", + "level0", + "https://iiif.io/api/image/3/level0.json" + ]; + var profileLevel = Array.isArray(options.profile) ? options.profile[0] : options.profile; + var isLevel0 = (level0Profiles.indexOf(profileLevel) !== -1); + var hasCanoncicalSizeFeature = false; + if ( options.version === 2 && options.profile.length > 1 && options.profile[1].supports ) { + hasCanoncicalSizeFeature = options.profile[1].supports.indexOf( "sizeByW" ) !== -1; + } + if ( options.version === 3 && options.extraFeatures ) { + hasCanoncicalSizeFeature = options.extraFeatures.indexOf( "sizeByWh" ) !== -1; + } + return !isLevel0 || hasCanoncicalSizeFeature; + } + + /** + * Build the legacy pyramid URLs (one tile per level) + * @function + * @param {object} options - infoJson + * @throws {Error} + */ + function constructLevels(options) { + var levels = []; + for(var i = 0; i < options.sizes.length; i++) { + levels.push({ + url: options._id + '/full/' + options.sizes[i].width + ',' + + (options.version === 3 ? options.sizes[i].height : '') + + '/0/default.' + options.tileFormat, + width: options.sizes[i].width, + height: options.sizes[i].height + }); + } + return levels.sort(function(a, b) { + return a.width - b.width; + }); + } + + + function configureFromXml10(xmlDoc) { + //parse the xml + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.tagName, + configuration = null; + + if ( rootName === "info" ) { + try { + configuration = {}; + parseXML10( root, configuration ); + return configuration; + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( $.getString("Errors.IIIF") ); + } + } + throw new Error( $.getString( "Errors.IIIF" ) ); + } + + function parseXML10( node, configuration, property ) { + var i, + value; + if ( node.nodeType === 3 && property ) {//text node + value = node.nodeValue.trim(); + if( value.match(/^\d*$/)){ + value = Number( value ); + } + if( !configuration[ property ] ){ + configuration[ property ] = value; + }else{ + if( !$.isArray( configuration[ property ] ) ){ + configuration[ property ] = [ configuration[ property ] ]; + } + configuration[ property ].push( value ); + } + } else if( node.nodeType === 1 ){ + for( i = 0; i < node.childNodes.length; i++ ){ + parseXML10( node.childNodes[ i ], configuration, node.nodeName ); + } + } + } + + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - OsmTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Derived from the OSM tile source in Rainer Simon's seajax-utils project + * . Rainer Simon has contributed + * the included code to the OpenSeadragon project under the New BSD license; + * see . + */ + + +(function( $ ){ + +/** + * @class OsmTileSource + * @classdesc A tilesource implementation for OpenStreetMap.

    + * + * Note 1. Zoomlevels. Deep Zoom and OSM define zoom levels differently. In Deep + * Zoom, level 0 equals an image of 1x1 pixels. In OSM, level 0 equals an image of + * 256x256 levels (see http://gasi.ch/blog/inside-deep-zoom-2). I.e. there is a + * difference of log2(256)=8 levels.

    + * + * Note 2. Image dimension. According to the OSM Wiki + * (http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Zoom_levels) + * the highest Mapnik zoom level has 256.144x256.144 tiles, with a 256x256 + * pixel size. I.e. the Deep Zoom image dimension is 65.572.864x65.572.864 + * pixels. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Number|Object} width - the pixel width of the image or the idiomatic + * options object which is used instead of positional arguments. + * @param {Number} height + * @param {Number} tileSize + * @param {Number} tileOverlap + * @param {String} tilesUrl + */ +$.OsmTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) { + var options; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: arguments[0], + height: arguments[1], + tileSize: arguments[2], + tileOverlap: arguments[3], + tilesUrl: arguments[4] + }; + } + //apply default setting for standard public OpenStreatMaps service + //but allow them to be specified so fliks can host there own instance + //or apply against other services supportting the same standard + if( !options.width || !options.height ){ + options.width = 65572864; + options.height = 65572864; + } + if( !options.tileSize ){ + options.tileSize = 256; + options.tileOverlap = 0; + } + if( !options.tilesUrl ){ + options.tilesUrl = "http://tile.openstreetmap.org/"; + } + options.minLevel = 8; + + $.TileSource.apply( this, [ options ] ); + +}; + +$.extend( $.OsmTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.OsmTileSource.prototype */{ + + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( + data.type && + "openstreetmaps" === data.type + ); + }, + + /** + * + * @function + * @param {Object} data - the raw configuration + * @param {String} url - the url the data was retrieved from if any. + * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null + * @returns {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function( data, url, postData ){ + return data; + }, + + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + getTileUrl: function( level, x, y ) { + return this.tilesUrl + (level - 8) + "/" + x + "/" + y + ".png"; + } +}); + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - TmsTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Derived from the TMS tile source in Rainer Simon's seajax-utils project + * . Rainer Simon has contributed + * the included code to the OpenSeadragon project under the New BSD license; + * see . + */ + + +(function( $ ){ + +/** + * @class TmsTileSource + * @classdesc A tilesource implementation for Tiled Map Services (TMS). + * TMS tile scheme ( [ as supported by OpenLayers ] is described here + * ( http://openlayers.org/dev/examples/tms.html ). + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Number|Object} width - the pixel width of the image or the idiomatic + * options object which is used instead of positional arguments. + * @param {Number} height + * @param {Number} tileSize + * @param {Number} tileOverlap + * @param {String} tilesUrl + */ +$.TmsTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) { + var options; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: arguments[0], + height: arguments[1], + tileSize: arguments[2], + tileOverlap: arguments[3], + tilesUrl: arguments[4] + }; + } + // TMS has integer multiples of 256 for width/height and adds buffer + // if necessary -> account for this! + var bufferedWidth = Math.ceil(options.width / 256) * 256, + bufferedHeight = Math.ceil(options.height / 256) * 256, + max; + + // Compute number of zoomlevels in this tileset + if (bufferedWidth > bufferedHeight) { + max = bufferedWidth / 256; + } else { + max = bufferedHeight / 256; + } + options.maxLevel = Math.ceil(Math.log(max) / Math.log(2)) - 1; + options.tileSize = 256; + options.width = bufferedWidth; + options.height = bufferedHeight; + + $.TileSource.apply( this, [ options ] ); + +}; + +$.extend( $.TmsTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.TmsTileSource.prototype */{ + + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( data.type && "tiledmapservice" === data.type ); + }, + + /** + * + * @function + * @param {Object} data - the raw configuration + * @param {String} url - the url the data was retrieved from if any. + * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null + * @returns {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function( data, url, postData ){ + return data; + }, + + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + getTileUrl: function( level, x, y ) { + // Convert from Deep Zoom definition to TMS zoom definition + var yTiles = this.getNumTiles( level ).y - 1; + + return this.tilesUrl + level + "/" + x + "/" + (yTiles - y) + ".png"; + } +}); + + +}( OpenSeadragon )); + +(function($) { + + /** + * @class ZoomifyTileSource + * @classdesc A tilesource implementation for the zoomify format. + * + * A description of the format can be found here: + * https://ecommons.cornell.edu/bitstream/handle/1813/5410/Introducing_Zoomify_Image.pdf + * + * There are two ways of creating a zoomify tilesource for openseadragon + * + * 1) Supplying all necessary information in the tilesource object. A minimal example object for this method looks like this: + * + * { + * type: "zoomifytileservice", + * width: 1000, + * height: 1000, + * tilesUrl: "/test/data/zoomify/" + * } + * + * The tileSize is set to 256 (the usual Zoomify default) when it is not defined. The tileUrl must the path to the image _directory_. + * + * 2) Loading image metadata from xml file: (CURRENTLY NOT SUPPORTED) + * + * When creating zoomify formatted images one "xml" like file with name ImageProperties.xml + * will be created as well. Here is an example of such a file: + * + * + * + * To use this xml file as metadata source you must supply the path to the ImageProperties.xml file and leave out all other parameters: + * As stated above, this method of loading a zoomify tilesource is currently not supported + * + * { + * type: "zoomifytileservice", + * tilesUrl: "/test/data/zoomify/ImageProperties.xml" + * } + + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Number} width - the pixel width of the image. + * @param {Number} height + * @param {Number} tileSize + * @param {String} tilesUrl + */ + $.ZoomifyTileSource = function(options) { + if(typeof options.tileSize === 'undefined'){ + options.tileSize = 256; + } + + if(typeof options.fileFormat === 'undefined'){ + options.fileFormat = 'jpg'; + this.fileFormat = options.fileFormat; + } + + var currentImageSize = { + x: options.width, + y: options.height + }; + options.imageSizes = [{ + x: options.width, + y: options.height + }]; + options.gridSize = [this._getGridSize(options.width, options.height, options.tileSize)]; + + while (parseInt(currentImageSize.x, 10) > options.tileSize || parseInt(currentImageSize.y, 10) > options.tileSize) { + currentImageSize.x = Math.floor(currentImageSize.x / 2); + currentImageSize.y = Math.floor(currentImageSize.y / 2); + options.imageSizes.push({ + x: currentImageSize.x, + y: currentImageSize.y + }); + options.gridSize.push(this._getGridSize(currentImageSize.x, currentImageSize.y, options.tileSize)); + } + options.imageSizes.reverse(); + options.gridSize.reverse(); + options.minLevel = 0; + options.maxLevel = options.gridSize.length - 1; + + OpenSeadragon.TileSource.apply(this, [options]); + }; + + $.extend($.ZoomifyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ZoomifyTileSource.prototype */ { + + //private + _getGridSize: function(width, height, tileSize) { + return { + x: Math.ceil(width / tileSize), + y: Math.ceil(height / tileSize) + }; + }, + + //private + _calculateAbsoluteTileNumber: function(level, x, y) { + var num = 0; + var size = {}; + + //Sum up all tiles below the level we want the number of tiles + for (var z = 0; z < level; z++) { + size = this.gridSize[z]; + num += size.x * size.y; + } + //Add the tiles of the level + size = this.gridSize[level]; + num += size.x * y + x; + return num; + }, + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function(data, url) { + return (data.type && "zoomifytileservice" === data.type); + }, + + /** + * + * @function + * @param {Object} data - the raw configuration + * @param {String} url - the url the data was retrieved from if any. + * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null + * @returns {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function(data, url, postData) { + return data; + }, + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + */ + getTileUrl: function(level, x, y) { + //console.log(level); + var result = 0; + var num = this._calculateAbsoluteTileNumber(level, x, y); + result = Math.floor(num / 256); + return this.tilesUrl + 'TileGroup' + result + '/' + level + '-' + x + '-' + y + '.' + this.fileFormat; + + } + }); + +}(OpenSeadragon)); + + +/* + * OpenSeadragon - LegacyTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class LegacyTileSource + * @classdesc The LegacyTileSource allows simple, traditional image pyramids to be loaded + * into an OpenSeadragon Viewer. Basically, this translates to the historically + * common practice of starting with a 'master' image, maybe a tiff for example, + * and generating a set of 'service' images like one or more thumbnails, a medium + * resolution image and a high resolution image in standard web formats like + * png or jpg. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Array} levels An array of file descriptions, each is an object with + * a 'url', a 'width', and a 'height'. Overriding classes can expect more + * properties but these properties are sufficient for this implementation. + * Additionally, the levels are required to be listed in order from + * smallest to largest. + * @property {Number} aspectRatio + * @property {Number} dimensions + * @property {Number} tileSize + * @property {Number} tileOverlap + * @property {Number} minLevel + * @property {Number} maxLevel + * @property {Array} levels + */ +$.LegacyTileSource = function( levels ) { + + var options, + width, + height; + + if( $.isArray( levels ) ){ + options = { + type: 'legacy-image-pyramid', + levels: levels + }; + } + + //clean up the levels to make sure we support all formats + options.levels = filterFiles( options.levels ); + + if ( options.levels.length > 0 ) { + width = options.levels[ options.levels.length - 1 ].width; + height = options.levels[ options.levels.length - 1 ].height; + } + else { + width = 0; + height = 0; + $.console.error( "No supported image formats found" ); + } + + $.extend( true, options, { + width: width, + height: height, + tileSize: Math.max( height, width ), + tileOverlap: 0, + minLevel: 0, + maxLevel: options.levels.length > 0 ? options.levels.length - 1 : 0 + } ); + + $.TileSource.apply( this, [ options ] ); + + this.levels = options.levels; +}; + +$.extend( $.LegacyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.LegacyTileSource.prototype */{ + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( + data.type && + "legacy-image-pyramid" === data.type + ) || ( + data.documentElement && + "legacy-image-pyramid" === data.documentElement.getAttribute('type') + ); + }, + + + /** + * + * @function + * @param {Object|XMLDocument} configuration - the raw configuration + * @param {String} dataUrl - the url the data was retrieved from if any. + * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null + * @returns {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function( configuration, dataUrl, postData ){ + + var options; + + if( !$.isPlainObject(configuration) ){ + + options = configureFromXML( this, configuration ); + + }else{ + + options = configureFromObject( this, configuration ); + } + + return options; + + }, + + /** + * @function + * @param {Number} level + */ + getLevelScale: function ( level ) { + var levelScale = NaN; + if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) { + levelScale = + this.levels[ level ].width / + this.levels[ this.maxLevel ].width; + } + return levelScale; + }, + + /** + * @function + * @param {Number} level + */ + getNumTiles: function( level ) { + var scale = this.getLevelScale( level ); + if ( scale ){ + return new $.Point( 1, 1 ); + } else { + return new $.Point( 0, 0 ); + } + }, + + /** + * This method is not implemented by this class other than to throw an Error + * announcing you have to implement it. Because of the variety of tile + * server technologies, and various specifications for building image + * pyramids, this method is here to allow easy integration. + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + * @throws {Error} + */ + getTileUrl: function ( level, x, y ) { + var url = null; + if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) { + url = this.levels[ level ].url; + } + return url; + } +} ); + +/** + * This method removes any files from the Array which don't conform to our + * basic requirements for a 'level' in the LegacyTileSource. + * @private + * @inner + * @function + */ +function filterFiles( files ){ + var filtered = [], + file, + i; + for( i = 0; i < files.length; i++ ){ + file = files[ i ]; + if( file.height && + file.width && + file.url ){ + //This is sufficient to serve as a level + filtered.push({ + url: file.url, + width: Number( file.width ), + height: Number( file.height ) + }); + } + else { + $.console.error( 'Unsupported image format: %s', file.url ? file.url : '' ); + } + } + + return filtered.sort(function(a, b) { + return a.height - b.height; + }); + +} + +/** + * @private + * @inner + * @function + */ +function configureFromXML( tileSource, xmlDoc ){ + + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.tagName, + conf = null, + levels = [], + level, + i; + + if ( rootName === "image" ) { + + try { + conf = { + type: root.getAttribute( "type" ), + levels: [] + }; + + levels = root.getElementsByTagName( "level" ); + for ( i = 0; i < levels.length; i++ ) { + level = levels[ i ]; + + conf.levels.push({ + url: level.getAttribute( "url" ), + width: parseInt( level.getAttribute( "width" ), 10 ), + height: parseInt( level.getAttribute( "height" ), 10 ) + }); + } + + return configureFromObject( tileSource, conf ); + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( 'Unknown error parsing Legacy Image Pyramid XML.' ); + } + } else if ( rootName === "collection" ) { + throw new Error( 'Legacy Image Pyramid Collections not yet supported.' ); + } else if ( rootName === "error" ) { + throw new Error( 'Error: ' + xmlDoc ); + } + + throw new Error( 'Unknown element ' + rootName ); +} + +/** + * @private + * @inner + * @function + */ +function configureFromObject( tileSource, configuration ){ + + return configuration.levels; + +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - ImageTileSource + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function ($) { + + /** + * @class ImageTileSource + * @classdesc The ImageTileSource allows a simple image to be loaded + * into an OpenSeadragon Viewer. + * There are 2 ways to open an ImageTileSource: + * 1. viewer.open({type: 'image', url: fooUrl}); + * 2. viewer.open(new OpenSeadragon.ImageTileSource({url: fooUrl})); + * + * With the first syntax, the crossOriginPolicy, ajaxWithCredentials and + * useCanvas options are inherited from the viewer if they are not + * specified directly in the options object. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.TileSource + * @param {Object} options Options object. + * @param {String} options.url URL of the image + * @param {Boolean} [options.buildPyramid=true] If set to true (default), a + * pyramid will be built internally to provide a better downsampling. + * @param {String|Boolean} [options.crossOriginPolicy=false] Valid values are + * 'Anonymous', 'use-credentials', and false. If false, image requests will + * not use CORS preventing internal pyramid building for images from other + * domains. + * @param {String|Boolean} [options.ajaxWithCredentials=false] Whether to set + * the withCredentials XHR flag for AJAX requests (when loading tile sources). + * @param {Boolean} [options.useCanvas=true] Set to false to prevent any use + * of the canvas API. + */ + $.ImageTileSource = function (options) { + + options = $.extend({ + buildPyramid: true, + crossOriginPolicy: false, + ajaxWithCredentials: false, + useCanvas: true + }, options); + $.TileSource.apply(this, [options]); + + }; + + $.extend($.ImageTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ImageTileSource.prototype */{ + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function (data, url) { + return data.type && data.type === "image"; + }, + /** + * + * @function + * @param {Object} options - the options + * @param {String} dataUrl - the url the image was retrieved from, if any. + * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null + * @returns {Object} options - A dictionary of keyword arguments sufficient + * to configure this tile sources constructor. + */ + configure: function (options, dataUrl, postData) { + return options; + }, + /** + * Responsible for retrieving, and caching the + * image metadata pertinent to this TileSources implementation. + * @function + * @param {String} url + * @throws {Error} + */ + getImageInfo: function (url) { + var image = this._image = new Image(); + var _this = this; + + if (this.crossOriginPolicy) { + image.crossOrigin = this.crossOriginPolicy; + } + if (this.ajaxWithCredentials) { + image.useCredentials = this.ajaxWithCredentials; + } + + $.addEvent(image, 'load', function () { + _this.width = image.naturalWidth; + _this.height = image.naturalHeight; + _this.aspectRatio = _this.width / _this.height; + _this.dimensions = new $.Point(_this.width, _this.height); + _this._tileWidth = _this.width; + _this._tileHeight = _this.height; + _this.tileOverlap = 0; + _this.minLevel = 0; + _this.levels = _this._buildLevels(); + _this.maxLevel = _this.levels.length - 1; + + _this.ready = true; + + // Note: this event is documented elsewhere, in TileSource + _this.raiseEvent('ready', {tileSource: _this}); + }); + + $.addEvent(image, 'error', function () { + // Note: this event is documented elsewhere, in TileSource + _this.raiseEvent('open-failed', { + message: "Error loading image at " + url, + source: url + }); + }); + + image.src = url; + }, + /** + * @function + * @param {Number} level + */ + getLevelScale: function (level) { + var levelScale = NaN; + if (level >= this.minLevel && level <= this.maxLevel) { + levelScale = + this.levels[level].width / + this.levels[this.maxLevel].width; + } + return levelScale; + }, + /** + * @function + * @param {Number} level + */ + getNumTiles: function (level) { + var scale = this.getLevelScale(level); + if (scale) { + return new $.Point(1, 1); + } else { + return new $.Point(0, 0); + } + }, + /** + * Retrieves a tile url + * @function + * @param {Number} level Level of the tile + * @param {Number} x x coordinate of the tile + * @param {Number} y y coordinate of the tile + */ + getTileUrl: function (level, x, y) { + var url = null; + if (level >= this.minLevel && level <= this.maxLevel) { + url = this.levels[level].url; + } + return url; + }, + /** + * Retrieves a tile context 2D + * @function + * @param {Number} level Level of the tile + * @param {Number} x x coordinate of the tile + * @param {Number} y y coordinate of the tile + */ + getContext2D: function (level, x, y) { + var context = null; + if (level >= this.minLevel && level <= this.maxLevel) { + context = this.levels[level].context2D; + } + return context; + }, + /** + * Destroys ImageTileSource + * @function + */ + destroy: function () { + this._freeupCanvasMemory(); + }, + + // private + // + // Builds the different levels of the pyramid if possible + // (i.e. if canvas API enabled and no canvas tainting issue). + _buildLevels: function () { + var levels = [{ + url: this._image.src, + width: this._image.naturalWidth, + height: this._image.naturalHeight + }]; + + if (!this.buildPyramid || !$.supportsCanvas || !this.useCanvas) { + // We don't need the image anymore. Allows it to be GC. + delete this._image; + return levels; + } + + var currentWidth = this._image.naturalWidth; + var currentHeight = this._image.naturalHeight; + + + var bigCanvas = document.createElement("canvas"); + var bigContext = bigCanvas.getContext("2d"); + + bigCanvas.width = currentWidth; + bigCanvas.height = currentHeight; + bigContext.drawImage(this._image, 0, 0, currentWidth, currentHeight); + // We cache the context of the highest level because the browser + // is a lot faster at downsampling something it already has + // downsampled before. + levels[0].context2D = bigContext; + // We don't need the image anymore. Allows it to be GC. + delete this._image; + + if ($.isCanvasTainted(bigCanvas)) { + // If the canvas is tainted, we can't compute the pyramid. + return levels; + } + + // We build smaller levels until either width or height becomes + // 1 pixel wide. + while (currentWidth >= 2 && currentHeight >= 2) { + currentWidth = Math.floor(currentWidth / 2); + currentHeight = Math.floor(currentHeight / 2); + var smallCanvas = document.createElement("canvas"); + var smallContext = smallCanvas.getContext("2d"); + smallCanvas.width = currentWidth; + smallCanvas.height = currentHeight; + smallContext.drawImage(bigCanvas, 0, 0, currentWidth, currentHeight); + + levels.splice(0, 0, { + context2D: smallContext, + width: currentWidth, + height: currentHeight + }); + + bigCanvas = smallCanvas; + bigContext = smallContext; + } + return levels; + }, + /** + * Free up canvas memory + * (iOS 12 or higher on 2GB RAM device has only 224MB canvas memory, + * and Safari keeps canvas until its height and width will be set to 0). + * @function + */ + _freeupCanvasMemory: function () { + for (var i = 0; i < this.levels.length; i++) { + if(this.levels[i].context2D){ + this.levels[i].context2D.canvas.height = 0; + this.levels[i].context2D.canvas.width = 0; + } + } + }, + }); + +}(OpenSeadragon)); + +/* + * OpenSeadragon - TileSourceCollection + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($) { + +// deprecated +$.TileSourceCollection = function(tileSize, tileSources, rows, layout) { + $.console.error('TileSourceCollection is deprecated; use World instead'); +}; + +}(OpenSeadragon)); + +/* + * OpenSeadragon - Button + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * An enumeration of button states + * @member ButtonState + * @memberof OpenSeadragon + * @static + * @type {Object} + * @property {Number} REST + * @property {Number} GROUP + * @property {Number} HOVER + * @property {Number} DOWN + */ +$.ButtonState = { + REST: 0, + GROUP: 1, + HOVER: 2, + DOWN: 3 +}; + +/** + * @class Button + * @classdesc Manages events, hover states for individual buttons, tool-tips, as well + * as fading the buttons out when the user has not interacted with them + * for a specified period. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @param {Object} options + * @param {Element} [options.element=null] Element to use as the button. If not specified, an HTML <div> element is created. + * @param {String} [options.tooltip=null] Provides context help for the button when the + * user hovers over it. + * @param {String} [options.srcRest=null] URL of image to use in 'rest' state. + * @param {String} [options.srcGroup=null] URL of image to use in 'up' state. + * @param {String} [options.srcHover=null] URL of image to use in 'hover' state. + * @param {String} [options.srcDown=null] URL of image to use in 'down' state. + * @param {Number} [options.fadeDelay=0] How long to wait before fading. + * @param {Number} [options.fadeLength=2000] How long should it take to fade the button. + * @param {OpenSeadragon.EventHandler} [options.onPress=null] Event handler callback for {@link OpenSeadragon.Button.event:press}. + * @param {OpenSeadragon.EventHandler} [options.onRelease=null] Event handler callback for {@link OpenSeadragon.Button.event:release}. + * @param {OpenSeadragon.EventHandler} [options.onClick=null] Event handler callback for {@link OpenSeadragon.Button.event:click}. + * @param {OpenSeadragon.EventHandler} [options.onEnter=null] Event handler callback for {@link OpenSeadragon.Button.event:enter}. + * @param {OpenSeadragon.EventHandler} [options.onExit=null] Event handler callback for {@link OpenSeadragon.Button.event:exit}. + * @param {OpenSeadragon.EventHandler} [options.onFocus=null] Event handler callback for {@link OpenSeadragon.Button.event:focus}. + * @param {OpenSeadragon.EventHandler} [options.onBlur=null] Event handler callback for {@link OpenSeadragon.Button.event:blur}. + * @param {Object} [options.userData=null] Arbitrary object to be passed unchanged to any attached handler methods. + */ +$.Button = function( options ) { + + var _this = this; + + $.EventSource.call( this ); + + $.extend( true, this, { + + tooltip: null, + srcRest: null, + srcGroup: null, + srcHover: null, + srcDown: null, + clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold, + clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold, + /** + * How long to wait before fading. + * @member {Number} fadeDelay + * @memberof OpenSeadragon.Button# + */ + fadeDelay: 0, + /** + * How long should it take to fade the button. + * @member {Number} fadeLength + * @memberof OpenSeadragon.Button# + */ + fadeLength: 2000, + onPress: null, + onRelease: null, + onClick: null, + onEnter: null, + onExit: null, + onFocus: null, + onBlur: null, + userData: null + + }, options ); + + /** + * The button element. + * @member {Element} element + * @memberof OpenSeadragon.Button# + */ + this.element = options.element || $.makeNeutralElement("div"); + + //if the user has specified the element to bind the control to explicitly + //then do not add the default control images + if ( !options.element ) { + this.imgRest = $.makeTransparentImage( this.srcRest ); + this.imgGroup = $.makeTransparentImage( this.srcGroup ); + this.imgHover = $.makeTransparentImage( this.srcHover ); + this.imgDown = $.makeTransparentImage( this.srcDown ); + + this.imgRest.alt = + this.imgGroup.alt = + this.imgHover.alt = + this.imgDown.alt = + this.tooltip; + + // Allow pointer events to pass through the img elements so implicit + // pointer capture works on touch devices + $.setElementPointerEventsNone( this.imgRest ); + $.setElementPointerEventsNone( this.imgGroup ); + $.setElementPointerEventsNone( this.imgHover ); + $.setElementPointerEventsNone( this.imgDown ); + + this.element.style.position = "relative"; + $.setElementTouchActionNone( this.element ); + + this.imgGroup.style.position = + this.imgHover.style.position = + this.imgDown.style.position = + "absolute"; + + this.imgGroup.style.top = + this.imgHover.style.top = + this.imgDown.style.top = + "0px"; + + this.imgGroup.style.left = + this.imgHover.style.left = + this.imgDown.style.left = + "0px"; + + this.imgHover.style.visibility = + this.imgDown.style.visibility = + "hidden"; + + if ($.Browser.vendor === $.BROWSERS.FIREFOX && $.Browser.version < 3) { + this.imgGroup.style.top = + this.imgHover.style.top = + this.imgDown.style.top = + ""; + } + + this.element.appendChild( this.imgRest ); + this.element.appendChild( this.imgGroup ); + this.element.appendChild( this.imgHover ); + this.element.appendChild( this.imgDown ); + } + + + this.addHandler("press", this.onPress); + this.addHandler("release", this.onRelease); + this.addHandler("click", this.onClick); + this.addHandler("enter", this.onEnter); + this.addHandler("exit", this.onExit); + this.addHandler("focus", this.onFocus); + this.addHandler("blur", this.onBlur); + + /** + * The button's current state. + * @member {OpenSeadragon.ButtonState} currentState + * @memberof OpenSeadragon.Button# + */ + this.currentState = $.ButtonState.GROUP; + + // When the button last began to fade. + this.fadeBeginTime = null; + // Whether this button should fade after user stops interacting with the viewport. + this.shouldFade = false; + + this.element.style.display = "inline-block"; + this.element.style.position = "relative"; + this.element.title = this.tooltip; + + /** + * Tracks mouse/touch/key events on the button. + * @member {OpenSeadragon.MouseTracker} tracker + * @memberof OpenSeadragon.Button# + */ + this.tracker = new $.MouseTracker({ + + userData: 'Button.tracker', + element: this.element, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + + enterHandler: function( event ) { + if ( event.insideElementPressed ) { + inTo( _this, $.ButtonState.DOWN ); + /** + * Raised when the cursor enters the Button element. + * + * @event enter + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "enter", { originalEvent: event.originalEvent } ); + } else if ( !event.buttonDownAny ) { + inTo( _this, $.ButtonState.HOVER ); + } + }, + + focusHandler: function ( event ) { + _this.tracker.enterHandler( event ); + /** + * Raised when the Button element receives focus. + * + * @event focus + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "focus", { originalEvent: event.originalEvent } ); + }, + + leaveHandler: function( event ) { + outTo( _this, $.ButtonState.GROUP ); + if ( event.insideElementPressed ) { + /** + * Raised when the cursor leaves the Button element. + * + * @event exit + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "exit", { originalEvent: event.originalEvent } ); + } + }, + + blurHandler: function ( event ) { + _this.tracker.leaveHandler( event ); + /** + * Raised when the Button element loses focus. + * + * @event blur + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "blur", { originalEvent: event.originalEvent } ); + }, + + pressHandler: function ( event ) { + inTo( _this, $.ButtonState.DOWN ); + /** + * Raised when a mouse button is pressed or touch occurs in the Button element. + * + * @event press + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "press", { originalEvent: event.originalEvent } ); + }, + + releaseHandler: function( event ) { + if ( event.insideElementPressed && event.insideElementReleased ) { + outTo( _this, $.ButtonState.HOVER ); + /** + * Raised when the mouse button is released or touch ends in the Button element. + * + * @event release + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "release", { originalEvent: event.originalEvent } ); + } else if ( event.insideElementPressed ) { + outTo( _this, $.ButtonState.GROUP ); + } else { + inTo( _this, $.ButtonState.HOVER ); + } + }, + + clickHandler: function( event ) { + if ( event.quick ) { + /** + * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold. + * + * @event click + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent("click", { originalEvent: event.originalEvent }); + } + }, + + keyHandler: function( event ){ + //console.log( "%s : handling key %s!", _this.tooltip, event.keyCode); + if( 13 === event.keyCode ){ + /*** + * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold. + * + * @event click + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "click", { originalEvent: event.originalEvent } ); + /*** + * Raised when the mouse button is released or touch ends in the Button element. + * + * @event release + * @memberof OpenSeadragon.Button + * @type {object} + * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event. + * @property {Object} originalEvent - The original DOM event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.raiseEvent( "release", { originalEvent: event.originalEvent } ); + + event.preventDefault = true; + } else{ + event.preventDefault = false; + } + } + + }); + + outTo( this, $.ButtonState.REST ); +}; + +$.extend( $.Button.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.Button.prototype */{ + + /** + * Used by a button container element (e.g. a ButtonGroup) to transition the button state + * to ButtonState.GROUP. + * @function + */ + notifyGroupEnter: function() { + inTo( this, $.ButtonState.GROUP ); + }, + + /** + * Used by a button container element (e.g. a ButtonGroup) to transition the button state + * to ButtonState.REST. + * @function + */ + notifyGroupExit: function() { + outTo( this, $.ButtonState.REST ); + }, + + /** + * @function + */ + disable: function(){ + this.notifyGroupExit(); + this.element.disabled = true; + this.tracker.setTracking(false); + $.setElementOpacity( this.element, 0.2, true ); + }, + + /** + * @function + */ + enable: function(){ + this.element.disabled = false; + this.tracker.setTracking(true); + $.setElementOpacity( this.element, 1.0, true ); + this.notifyGroupEnter(); + }, + + destroy: function() { + if (this.imgRest) { + this.element.removeChild(this.imgRest); + this.imgRest = null; + } + if (this.imgGroup) { + this.element.removeChild(this.imgGroup); + this.imgGroup = null; + } + if (this.imgHover) { + this.element.removeChild(this.imgHover); + this.imgHover = null; + } + if (this.imgDown) { + this.element.removeChild(this.imgDown); + this.imgDown = null; + } + this.removeAllHandlers(); + this.tracker.destroy(); + this.element = null; + } + +}); + + +function scheduleFade( button ) { + $.requestAnimationFrame(function(){ + updateFade( button ); + }); +} + +function updateFade( button ) { + var currentTime, + deltaTime, + opacity; + + if ( button.shouldFade ) { + currentTime = $.now(); + deltaTime = currentTime - button.fadeBeginTime; + opacity = 1.0 - deltaTime / button.fadeLength; + opacity = Math.min( 1.0, opacity ); + opacity = Math.max( 0.0, opacity ); + + if( button.imgGroup ){ + $.setElementOpacity( button.imgGroup, opacity, true ); + } + if ( opacity > 0 ) { + // fade again + scheduleFade( button ); + } + } +} + +function beginFading( button ) { + button.shouldFade = true; + button.fadeBeginTime = $.now() + button.fadeDelay; + window.setTimeout( function(){ + scheduleFade( button ); + }, button.fadeDelay ); +} + +function stopFading( button ) { + button.shouldFade = false; + if( button.imgGroup ){ + $.setElementOpacity( button.imgGroup, 1.0, true ); + } +} + +function inTo( button, newState ) { + + if( button.element.disabled ){ + return; + } + + if ( newState >= $.ButtonState.GROUP && + button.currentState === $.ButtonState.REST ) { + stopFading( button ); + button.currentState = $.ButtonState.GROUP; + } + + if ( newState >= $.ButtonState.HOVER && + button.currentState === $.ButtonState.GROUP ) { + if( button.imgHover ){ + button.imgHover.style.visibility = ""; + } + button.currentState = $.ButtonState.HOVER; + } + + if ( newState >= $.ButtonState.DOWN && + button.currentState === $.ButtonState.HOVER ) { + if( button.imgDown ){ + button.imgDown.style.visibility = ""; + } + button.currentState = $.ButtonState.DOWN; + } +} + + +function outTo( button, newState ) { + + if( button.element.disabled ){ + return; + } + + if ( newState <= $.ButtonState.HOVER && + button.currentState === $.ButtonState.DOWN ) { + if( button.imgDown ){ + button.imgDown.style.visibility = "hidden"; + } + button.currentState = $.ButtonState.HOVER; + } + + if ( newState <= $.ButtonState.GROUP && + button.currentState === $.ButtonState.HOVER ) { + if( button.imgHover ){ + button.imgHover.style.visibility = "hidden"; + } + button.currentState = $.ButtonState.GROUP; + } + + if ( newState <= $.ButtonState.REST && + button.currentState === $.ButtonState.GROUP ) { + beginFading( button ); + button.currentState = $.ButtonState.REST; + } +} + + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - ButtonGroup + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ +/** + * @class ButtonGroup + * @classdesc Manages events on groups of buttons. + * + * @memberof OpenSeadragon + * @param {Object} options - A dictionary of settings applied against the entire group of buttons. + * @param {Array} options.buttons Array of buttons + * @param {Element} [options.element] Element to use as the container + **/ +$.ButtonGroup = function( options ) { + + $.extend( true, this, { + /** + * An array containing the buttons themselves. + * @member {Array} buttons + * @memberof OpenSeadragon.ButtonGroup# + */ + buttons: [], + clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold, + clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold, + labelText: "" + }, options ); + + // copy the button elements TODO: Why? + var buttons = this.buttons.concat([]), + _this = this, + i; + + /** + * The shared container for the buttons. + * @member {Element} element + * @memberof OpenSeadragon.ButtonGroup# + */ + this.element = options.element || $.makeNeutralElement( "div" ); + + // TODO What if there IS an options.group specified? + if( !options.group ){ + this.element.style.display = "inline-block"; + //this.label = $.makeNeutralElement( "label" ); + //TODO: support labels for ButtonGroups + //this.label.innerHTML = this.labelText; + //this.element.appendChild( this.label ); + for ( i = 0; i < buttons.length; i++ ) { + this.element.appendChild( buttons[ i ].element ); + } + } + + $.setElementTouchActionNone( this.element ); + + /** + * Tracks mouse/touch/key events across the group of buttons. + * @member {OpenSeadragon.MouseTracker} tracker + * @memberof OpenSeadragon.ButtonGroup# + */ + this.tracker = new $.MouseTracker({ + userData: 'ButtonGroup.tracker', + element: this.element, + clickTimeThreshold: this.clickTimeThreshold, + clickDistThreshold: this.clickDistThreshold, + enterHandler: function ( event ) { + var i; + for ( i = 0; i < _this.buttons.length; i++ ) { + _this.buttons[ i ].notifyGroupEnter(); + } + }, + leaveHandler: function ( event ) { + var i; + if ( !event.insideElementPressed ) { + for ( i = 0; i < _this.buttons.length; i++ ) { + _this.buttons[ i ].notifyGroupExit(); + } + } + }, + }); +}; + +/** @lends OpenSeadragon.ButtonGroup.prototype */ +$.ButtonGroup.prototype = { + + /** + * Adds the given button to this button group. + * + * @function + * @param {OpenSeadragon.Button} button + */ + addButton: function( button ){ + this.buttons.push(button); + this.element.appendChild(button.element); + }, + + /** + * TODO: Figure out why this is used on the public API and if a more useful + * api can be created. + * @function + * @private + */ + emulateEnter: function() { + this.tracker.enterHandler( { eventSource: this.tracker } ); + }, + + /** + * TODO: Figure out why this is used on the public API and if a more useful + * api can be created. + * @function + * @private + */ + emulateLeave: function() { + this.tracker.leaveHandler( { eventSource: this.tracker } ); + }, + + destroy: function() { + while (this.buttons.length) { + var button = this.buttons.pop(); + this.element.removeChild(button.element); + button.destroy(); + } + this.tracker.destroy(); + this.element = null; + } +}; + + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Rect + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($) { + +/** + * @class Rect + * @classdesc A Rectangle is described by it top left coordinates (x, y), width, + * height and degrees of rotation around (x, y). + * Note that the coordinate system used is the one commonly used with images: + * x increases when going to the right + * y increases when going to the bottom + * degrees increases clockwise with 0 being the horizontal + * + * The constructor normalizes the rectangle to always have 0 <= degrees < 90 + * + * @memberof OpenSeadragon + * @param {Number} [x=0] The vector component 'x'. + * @param {Number} [y=0] The vector component 'y'. + * @param {Number} [width=0] The vector component 'width'. + * @param {Number} [height=0] The vector component 'height'. + * @param {Number} [degrees=0] Rotation of the rectangle around (x,y) in degrees. + */ +$.Rect = function(x, y, width, height, degrees) { + /** + * The vector component 'x'. + * @member {Number} x + * @memberof OpenSeadragon.Rect# + */ + this.x = typeof (x) === "number" ? x : 0; + /** + * The vector component 'y'. + * @member {Number} y + * @memberof OpenSeadragon.Rect# + */ + this.y = typeof (y) === "number" ? y : 0; + /** + * The vector component 'width'. + * @member {Number} width + * @memberof OpenSeadragon.Rect# + */ + this.width = typeof (width) === "number" ? width : 0; + /** + * The vector component 'height'. + * @member {Number} height + * @memberof OpenSeadragon.Rect# + */ + this.height = typeof (height) === "number" ? height : 0; + + /** + * The rotation of the rectangle, in degrees. + * @member {Number} degrees + * @memberof OpenSeadragon.Rect# + */ + this.degrees = typeof (degrees) === "number" ? degrees : 0; + + // Normalizes the rectangle. + this.degrees = $.positiveModulo(this.degrees, 360); + var newTopLeft, newWidth; + if (this.degrees >= 270) { + newTopLeft = this.getTopRight(); + this.x = newTopLeft.x; + this.y = newTopLeft.y; + newWidth = this.height; + this.height = this.width; + this.width = newWidth; + this.degrees -= 270; + } else if (this.degrees >= 180) { + newTopLeft = this.getBottomRight(); + this.x = newTopLeft.x; + this.y = newTopLeft.y; + this.degrees -= 180; + } else if (this.degrees >= 90) { + newTopLeft = this.getBottomLeft(); + this.x = newTopLeft.x; + this.y = newTopLeft.y; + newWidth = this.height; + this.height = this.width; + this.width = newWidth; + this.degrees -= 90; + } +}; + +/** + * Builds a rectangle having the 3 specified points as summits. + * @static + * @memberof OpenSeadragon.Rect + * @param {OpenSeadragon.Point} topLeft + * @param {OpenSeadragon.Point} topRight + * @param {OpenSeadragon.Point} bottomLeft + * @returns {OpenSeadragon.Rect} + */ +$.Rect.fromSummits = function(topLeft, topRight, bottomLeft) { + var width = topLeft.distanceTo(topRight); + var height = topLeft.distanceTo(bottomLeft); + var diff = topRight.minus(topLeft); + var radians = Math.atan(diff.y / diff.x); + if (diff.x < 0) { + radians += Math.PI; + } else if (diff.y < 0) { + radians += 2 * Math.PI; + } + return new $.Rect( + topLeft.x, + topLeft.y, + width, + height, + radians / Math.PI * 180); +}; + +/** @lends OpenSeadragon.Rect.prototype */ +$.Rect.prototype = { + /** + * @function + * @returns {OpenSeadragon.Rect} a duplicate of this Rect + */ + clone: function() { + return new $.Rect( + this.x, + this.y, + this.width, + this.height, + this.degrees); + }, + + /** + * The aspect ratio is simply the ratio of width to height. + * @function + * @returns {Number} The ratio of width to height. + */ + getAspectRatio: function() { + return this.width / this.height; + }, + + /** + * Provides the coordinates of the upper-left corner of the rectangle as a + * point. + * @function + * @returns {OpenSeadragon.Point} The coordinate of the upper-left corner of + * the rectangle. + */ + getTopLeft: function() { + return new $.Point( + this.x, + this.y + ); + }, + + /** + * Provides the coordinates of the bottom-right corner of the rectangle as a + * point. + * @function + * @returns {OpenSeadragon.Point} The coordinate of the bottom-right corner of + * the rectangle. + */ + getBottomRight: function() { + return new $.Point(this.x + this.width, this.y + this.height) + .rotate(this.degrees, this.getTopLeft()); + }, + + /** + * Provides the coordinates of the top-right corner of the rectangle as a + * point. + * @function + * @returns {OpenSeadragon.Point} The coordinate of the top-right corner of + * the rectangle. + */ + getTopRight: function() { + return new $.Point(this.x + this.width, this.y) + .rotate(this.degrees, this.getTopLeft()); + }, + + /** + * Provides the coordinates of the bottom-left corner of the rectangle as a + * point. + * @function + * @returns {OpenSeadragon.Point} The coordinate of the bottom-left corner of + * the rectangle. + */ + getBottomLeft: function() { + return new $.Point(this.x, this.y + this.height) + .rotate(this.degrees, this.getTopLeft()); + }, + + /** + * Computes the center of the rectangle. + * @function + * @returns {OpenSeadragon.Point} The center of the rectangle as represented + * as represented by a 2-dimensional vector (x,y) + */ + getCenter: function() { + return new $.Point( + this.x + this.width / 2.0, + this.y + this.height / 2.0 + ).rotate(this.degrees, this.getTopLeft()); + }, + + /** + * Returns the width and height component as a vector OpenSeadragon.Point + * @function + * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the + * width and height of the rectangle. + */ + getSize: function() { + return new $.Point(this.width, this.height); + }, + + /** + * Determines if two Rectangles have equivalent components. + * @function + * @param {OpenSeadragon.Rect} rectangle The Rectangle to compare to. + * @returns {Boolean} 'true' if all components are equal, otherwise 'false'. + */ + equals: function(other) { + return (other instanceof $.Rect) && + this.x === other.x && + this.y === other.y && + this.width === other.width && + this.height === other.height && + this.degrees === other.degrees; + }, + + /** + * Multiply all dimensions (except degrees) in this Rect by a factor and + * return a new Rect. + * @function + * @param {Number} factor The factor to multiply vector components. + * @returns {OpenSeadragon.Rect} A new rect representing the multiplication + * of the vector components by the factor + */ + times: function(factor) { + return new $.Rect( + this.x * factor, + this.y * factor, + this.width * factor, + this.height * factor, + this.degrees); + }, + + /** + * Translate/move this Rect by a vector and return new Rect. + * @function + * @param {OpenSeadragon.Point} delta The translation vector. + * @returns {OpenSeadragon.Rect} A new rect with altered position + */ + translate: function(delta) { + return new $.Rect( + this.x + delta.x, + this.y + delta.y, + this.width, + this.height, + this.degrees); + }, + + /** + * Returns the smallest rectangle that will contain this and the given + * rectangle bounding boxes. + * @param {OpenSeadragon.Rect} rect + * @returns {OpenSeadragon.Rect} The new rectangle. + */ + union: function(rect) { + var thisBoundingBox = this.getBoundingBox(); + var otherBoundingBox = rect.getBoundingBox(); + + var left = Math.min(thisBoundingBox.x, otherBoundingBox.x); + var top = Math.min(thisBoundingBox.y, otherBoundingBox.y); + var right = Math.max( + thisBoundingBox.x + thisBoundingBox.width, + otherBoundingBox.x + otherBoundingBox.width); + var bottom = Math.max( + thisBoundingBox.y + thisBoundingBox.height, + otherBoundingBox.y + otherBoundingBox.height); + + return new $.Rect( + left, + top, + right - left, + bottom - top); + }, + + /** + * Returns the bounding box of the intersection of this rectangle with the + * given rectangle. + * @param {OpenSeadragon.Rect} rect + * @returns {OpenSeadragon.Rect} the bounding box of the intersection + * or null if the rectangles don't intersect. + */ + intersection: function(rect) { + // Simplified version of Weiler Atherton clipping algorithm + // https://en.wikipedia.org/wiki/Weiler%E2%80%93Atherton_clipping_algorithm + // Because we just want the bounding box of the intersection, + // we can just compute the bounding box of: + // 1. all the summits of this which are inside rect + // 2. all the summits of rect which are inside this + // 3. all the intersections of rect and this + var EPSILON = 0.0000000001; + + var intersectionPoints = []; + + var thisTopLeft = this.getTopLeft(); + if (rect.containsPoint(thisTopLeft, EPSILON)) { + intersectionPoints.push(thisTopLeft); + } + var thisTopRight = this.getTopRight(); + if (rect.containsPoint(thisTopRight, EPSILON)) { + intersectionPoints.push(thisTopRight); + } + var thisBottomLeft = this.getBottomLeft(); + if (rect.containsPoint(thisBottomLeft, EPSILON)) { + intersectionPoints.push(thisBottomLeft); + } + var thisBottomRight = this.getBottomRight(); + if (rect.containsPoint(thisBottomRight, EPSILON)) { + intersectionPoints.push(thisBottomRight); + } + + var rectTopLeft = rect.getTopLeft(); + if (this.containsPoint(rectTopLeft, EPSILON)) { + intersectionPoints.push(rectTopLeft); + } + var rectTopRight = rect.getTopRight(); + if (this.containsPoint(rectTopRight, EPSILON)) { + intersectionPoints.push(rectTopRight); + } + var rectBottomLeft = rect.getBottomLeft(); + if (this.containsPoint(rectBottomLeft, EPSILON)) { + intersectionPoints.push(rectBottomLeft); + } + var rectBottomRight = rect.getBottomRight(); + if (this.containsPoint(rectBottomRight, EPSILON)) { + intersectionPoints.push(rectBottomRight); + } + + var thisSegments = this._getSegments(); + var rectSegments = rect._getSegments(); + for (var i = 0; i < thisSegments.length; i++) { + var thisSegment = thisSegments[i]; + for (var j = 0; j < rectSegments.length; j++) { + var rectSegment = rectSegments[j]; + var intersect = getIntersection(thisSegment[0], thisSegment[1], + rectSegment[0], rectSegment[1]); + if (intersect) { + intersectionPoints.push(intersect); + } + } + } + + // Get intersection point of segments [a,b] and [c,d] + function getIntersection(a, b, c, d) { + // http://stackoverflow.com/a/1968345/1440403 + var abVector = b.minus(a); + var cdVector = d.minus(c); + + var denom = -cdVector.x * abVector.y + abVector.x * cdVector.y; + if (denom === 0) { + return null; + } + + var s = (abVector.x * (a.y - c.y) - abVector.y * (a.x - c.x)) / denom; + var t = (cdVector.x * (a.y - c.y) - cdVector.y * (a.x - c.x)) / denom; + + if (-EPSILON <= s && s <= 1 - EPSILON && + -EPSILON <= t && t <= 1 - EPSILON) { + return new $.Point(a.x + t * abVector.x, a.y + t * abVector.y); + } + return null; + } + + if (intersectionPoints.length === 0) { + return null; + } + + var minX = intersectionPoints[0].x; + var maxX = intersectionPoints[0].x; + var minY = intersectionPoints[0].y; + var maxY = intersectionPoints[0].y; + for (var k = 1; k < intersectionPoints.length; k++) { + var point = intersectionPoints[k]; + if (point.x < minX) { + minX = point.x; + } + if (point.x > maxX) { + maxX = point.x; + } + if (point.y < minY) { + minY = point.y; + } + if (point.y > maxY) { + maxY = point.y; + } + } + return new $.Rect(minX, minY, maxX - minX, maxY - minY); + }, + + // private + _getSegments: function() { + var topLeft = this.getTopLeft(); + var topRight = this.getTopRight(); + var bottomLeft = this.getBottomLeft(); + var bottomRight = this.getBottomRight(); + return [[topLeft, topRight], + [topRight, bottomRight], + [bottomRight, bottomLeft], + [bottomLeft, topLeft]]; + }, + + /** + * Rotates a rectangle around a point. + * @function + * @param {Number} degrees The angle in degrees to rotate. + * @param {OpenSeadragon.Point} [pivot] The point about which to rotate. + * Defaults to the center of the rectangle. + * @returns {OpenSeadragon.Rect} + */ + rotate: function(degrees, pivot) { + degrees = $.positiveModulo(degrees, 360); + if (degrees === 0) { + return this.clone(); + } + + pivot = pivot || this.getCenter(); + var newTopLeft = this.getTopLeft().rotate(degrees, pivot); + var newTopRight = this.getTopRight().rotate(degrees, pivot); + + var diff = newTopRight.minus(newTopLeft); + // Handle floating point error + diff = diff.apply(function(x) { + var EPSILON = 1e-15; + return Math.abs(x) < EPSILON ? 0 : x; + }); + var radians = Math.atan(diff.y / diff.x); + if (diff.x < 0) { + radians += Math.PI; + } else if (diff.y < 0) { + radians += 2 * Math.PI; + } + return new $.Rect( + newTopLeft.x, + newTopLeft.y, + this.width, + this.height, + radians / Math.PI * 180); + }, + + /** + * Retrieves the smallest horizontal (degrees=0) rectangle which contains + * this rectangle. + * @returns {OpenSeadragon.Rect} + */ + getBoundingBox: function() { + if (this.degrees === 0) { + return this.clone(); + } + var topLeft = this.getTopLeft(); + var topRight = this.getTopRight(); + var bottomLeft = this.getBottomLeft(); + var bottomRight = this.getBottomRight(); + var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x); + var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x); + var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y); + var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y); + return new $.Rect( + minX, + minY, + maxX - minX, + maxY - minY); + }, + + /** + * Retrieves the smallest horizontal (degrees=0) rectangle which contains + * this rectangle and has integers x, y, width and height + * @returns {OpenSeadragon.Rect} + */ + getIntegerBoundingBox: function() { + var boundingBox = this.getBoundingBox(); + var x = Math.floor(boundingBox.x); + var y = Math.floor(boundingBox.y); + var width = Math.ceil(boundingBox.width + boundingBox.x - x); + var height = Math.ceil(boundingBox.height + boundingBox.y - y); + return new $.Rect(x, y, width, height); + }, + + /** + * Determines whether a point is inside this rectangle (edge included). + * @function + * @param {OpenSeadragon.Point} point + * @param {Number} [epsilon=0] the margin of error allowed + * @returns {Boolean} true if the point is inside this rectangle, false + * otherwise. + */ + containsPoint: function(point, epsilon) { + epsilon = epsilon || 0; + + // See http://stackoverflow.com/a/2752754/1440403 for explanation + var topLeft = this.getTopLeft(); + var topRight = this.getTopRight(); + var bottomLeft = this.getBottomLeft(); + var topDiff = topRight.minus(topLeft); + var leftDiff = bottomLeft.minus(topLeft); + + return ((point.x - topLeft.x) * topDiff.x + + (point.y - topLeft.y) * topDiff.y >= -epsilon) && + + ((point.x - topRight.x) * topDiff.x + + (point.y - topRight.y) * topDiff.y <= epsilon) && + + ((point.x - topLeft.x) * leftDiff.x + + (point.y - topLeft.y) * leftDiff.y >= -epsilon) && + + ((point.x - bottomLeft.x) * leftDiff.x + + (point.y - bottomLeft.y) * leftDiff.y <= epsilon); + }, + + /** + * Provides a string representation of the rectangle which is useful for + * debugging. + * @function + * @returns {String} A string representation of the rectangle. + */ + toString: function() { + return "[" + + (Math.round(this.x * 100) / 100) + ", " + + (Math.round(this.y * 100) / 100) + ", " + + (Math.round(this.width * 100) / 100) + "x" + + (Math.round(this.height * 100) / 100) + ", " + + (Math.round(this.degrees * 100) / 100) + "deg" + + "]"; + } +}; + + +}(OpenSeadragon)); + +/* + * OpenSeadragon - ReferenceStrip + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function ( $ ) { + +// dictionary from id to private properties +var THIS = {}; + +/** + * The CollectionDrawer is a reimplementation if the Drawer API that + * focuses on allowing a viewport to be redefined as a collection + * of smaller viewports, defined by a clear number of rows and / or + * columns of which each item in the matrix of viewports has its own + * source. + * + * This idea is a reexpression of the idea of dzi collections + * which allows a clearer algorithm to reuse the tile sources already + * supported by OpenSeadragon, in heterogenious or homogenious + * sequences just like mixed groups already supported by the viewer + * for the purpose of image sequnces. + * + * TODO: The difficult part of this feature is figuring out how to express + * this functionality as a combination of the functionality already + * provided by Drawer, Viewport, TileSource, and Navigator. It may + * require better abstraction at those points in order to efficiently + * reuse those paradigms. + */ +/** + * @class ReferenceStrip + * @memberof OpenSeadragon + * @param {Object} options + */ +$.ReferenceStrip = function ( options ) { + + var _this = this, + viewer = options.viewer, + viewerSize = $.getElementSize( viewer.element ), + element, + style, + i; + + //We may need to create a new element and id if they did not + //provide the id for the existing element + if ( !options.id ) { + options.id = 'referencestrip-' + $.now(); + this.element = $.makeNeutralElement( "div" ); + this.element.id = options.id; + this.element.className = 'referencestrip'; + } + + options = $.extend( true, { + sizeRatio: $.DEFAULT_SETTINGS.referenceStripSizeRatio, + position: $.DEFAULT_SETTINGS.referenceStripPosition, + scroll: $.DEFAULT_SETTINGS.referenceStripScroll, + clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold + }, options, { + element: this.element + } ); + + $.extend( this, options ); + //Private state properties + THIS[this.id] = { + animating: false + }; + + this.minPixelRatio = this.viewer.minPixelRatio; + + this.element.tabIndex = 0; + + style = this.element.style; + style.marginTop = '0px'; + style.marginRight = '0px'; + style.marginBottom = '0px'; + style.marginLeft = '0px'; + style.left = '0px'; + style.bottom = '0px'; + style.border = '0px'; + style.background = '#000'; + style.position = 'relative'; + + $.setElementTouchActionNone( this.element ); + + $.setElementOpacity( this.element, 0.8 ); + + this.viewer = viewer; + this.tracker = new $.MouseTracker( { + userData: 'ReferenceStrip.tracker', + element: this.element, + clickHandler: $.delegate( this, onStripClick ), + dragHandler: $.delegate( this, onStripDrag ), + scrollHandler: $.delegate( this, onStripScroll ), + enterHandler: $.delegate( this, onStripEnter ), + leaveHandler: $.delegate( this, onStripLeave ), + keyDownHandler: $.delegate( this, onKeyDown ), + keyHandler: $.delegate( this, onKeyPress ), + preProcessEventHandler: function (eventInfo) { + if (eventInfo.eventType === 'wheel') { + eventInfo.preventDefault = true; + } + } + } ); + + //Controls the position and orientation of the reference strip and sets the + //appropriate width and height + if ( options.width && options.height ) { + this.element.style.width = options.width + 'px'; + this.element.style.height = options.height + 'px'; + viewer.addControl( + this.element, + { anchor: $.ControlAnchor.BOTTOM_LEFT } + ); + } else { + if ( "horizontal" === options.scroll ) { + this.element.style.width = ( + viewerSize.x * + options.sizeRatio * + viewer.tileSources.length + ) + ( 12 * viewer.tileSources.length ) + 'px'; + + this.element.style.height = ( + viewerSize.y * + options.sizeRatio + ) + 'px'; + + viewer.addControl( + this.element, + { anchor: $.ControlAnchor.BOTTOM_LEFT } + ); + } else { + this.element.style.height = ( + viewerSize.y * + options.sizeRatio * + viewer.tileSources.length + ) + ( 12 * viewer.tileSources.length ) + 'px'; + + this.element.style.width = ( + viewerSize.x * + options.sizeRatio + ) + 'px'; + + viewer.addControl( + this.element, + { anchor: $.ControlAnchor.TOP_LEFT } + ); + + } + } + + this.panelWidth = ( viewerSize.x * this.sizeRatio ) + 8; + this.panelHeight = ( viewerSize.y * this.sizeRatio ) + 8; + this.panels = []; + this.miniViewers = {}; + + /*jshint loopfunc:true*/ + for ( i = 0; i < viewer.tileSources.length; i++ ) { + + element = $.makeNeutralElement( 'div' ); + element.id = this.element.id + "-" + i; + + element.style.width = _this.panelWidth + 'px'; + element.style.height = _this.panelHeight + 'px'; + element.style.display = 'inline'; + element.style['float'] = 'left'; //Webkit + element.style.cssFloat = 'left'; //Firefox + element.style.styleFloat = 'left'; //IE + element.style.padding = '2px'; + $.setElementTouchActionNone( element ); + $.setElementPointerEventsNone( element ); + + this.element.appendChild( element ); + + element.activePanel = false; + + this.panels.push( element ); + + } + loadPanels( this, this.scroll === 'vertical' ? viewerSize.y : viewerSize.x, 0 ); + this.setFocus( 0 ); + +}; + +/** @lends OpenSeadragon.ReferenceStrip.prototype */ +$.ReferenceStrip.prototype = { + + /** + * @function + */ + setFocus: function ( page ) { + var element = this.element.querySelector('#' + this.element.id + '-' + page ), + viewerSize = $.getElementSize( this.viewer.canvas ), + scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ), + scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ), + offsetLeft = -Number( this.element.style.marginLeft.replace( 'px', '' ) ), + offsetTop = -Number( this.element.style.marginTop.replace( 'px', '' ) ), + offset; + + if ( this.currentSelected !== element ) { + if ( this.currentSelected ) { + this.currentSelected.style.background = '#000'; + } + this.currentSelected = element; + this.currentSelected.style.background = '#999'; + + if ( 'horizontal' === this.scroll ) { + //right left + offset = ( Number( page ) ) * ( this.panelWidth + 3 ); + if ( offset > offsetLeft + viewerSize.x - this.panelWidth ) { + offset = Math.min( offset, ( scrollWidth - viewerSize.x ) ); + this.element.style.marginLeft = -offset + 'px'; + loadPanels( this, viewerSize.x, -offset ); + } else if ( offset < offsetLeft ) { + offset = Math.max( 0, offset - viewerSize.x / 2 ); + this.element.style.marginLeft = -offset + 'px'; + loadPanels( this, viewerSize.x, -offset ); + } + } else { + offset = ( Number( page ) ) * ( this.panelHeight + 3 ); + if ( offset > offsetTop + viewerSize.y - this.panelHeight ) { + offset = Math.min( offset, ( scrollHeight - viewerSize.y ) ); + this.element.style.marginTop = -offset + 'px'; + loadPanels( this, viewerSize.y, -offset ); + } else if ( offset < offsetTop ) { + offset = Math.max( 0, offset - viewerSize.y / 2 ); + this.element.style.marginTop = -offset + 'px'; + loadPanels( this, viewerSize.y, -offset ); + } + } + + this.currentPage = page; + onStripEnter.call( this, { eventSource: this.tracker } ); + } + }, + + /** + * @function + */ + update: function () { + if ( THIS[this.id].animating ) { + // $.console.log( 'image reference strip update' ); + return true; + } + return false; + }, + + destroy: function() { + if (this.miniViewers) { + for (var key in this.miniViewers) { + this.miniViewers[key].destroy(); + } + } + + this.tracker.destroy(); + + if (this.element) { + this.viewer.removeControl( this.element ); + } + } + +}; + + +/** + * @private + * @inner + * @function + */ +function onStripClick( event ) { + if ( event.quick ) { + var page; + + if ( 'horizontal' === this.scroll ) { + // +4px fix to solve problem with precision on thumbnail selection if there is a lot of them + page = Math.floor(event.position.x / (this.panelWidth + 4)); + } else { + page = Math.floor(event.position.y / this.panelHeight); + } + + this.viewer.goToPage( page ); + } + + this.element.focus(); +} + + +/** + * @private + * @inner + * @function + */ +function onStripDrag( event ) { + + this.dragging = true; + if ( this.element ) { + var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ), + offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ), + scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ), + scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ), + viewerSize = $.getElementSize( this.viewer.canvas ); + + if ( 'horizontal' === this.scroll ) { + if ( -event.delta.x > 0 ) { + //forward + if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) { + this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px'; + loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) ); + } + } else if ( -event.delta.x < 0 ) { + //reverse + if ( offsetLeft < 0 ) { + this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px'; + loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) ); + } + } + } else { + if ( -event.delta.y > 0 ) { + //forward + if ( offsetTop > -( scrollHeight - viewerSize.y ) ) { + this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px'; + loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) ); + } + } else if ( -event.delta.y < 0 ) { + //reverse + if ( offsetTop < 0 ) { + this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px'; + loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) ); + } + } + } + } + +} + + + +/** + * @private + * @inner + * @function + */ +function onStripScroll( event ) { + if ( this.element ) { + var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ), + offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ), + scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ), + scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ), + viewerSize = $.getElementSize( this.viewer.canvas ); + + if ( 'horizontal' === this.scroll ) { + if ( event.scroll > 0 ) { + //forward + if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) { + this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px'; + loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) ); + } + } else if ( event.scroll < 0 ) { + //reverse + if ( offsetLeft < 0 ) { + this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px'; + loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) ); + } + } + } else { + if ( event.scroll < 0 ) { + //scroll up + if ( offsetTop > viewerSize.y - scrollHeight ) { + this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px'; + loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) ); + } + } else if ( event.scroll > 0 ) { + //scroll dowm + if ( offsetTop < 0 ) { + this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px'; + loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) ); + } + } + } + + event.preventDefault = true; + } +} + + +function loadPanels( strip, viewerSize, scroll ) { + var panelSize, + activePanelsStart, + activePanelsEnd, + miniViewer, + i, + element; + if ( 'horizontal' === strip.scroll ) { + panelSize = strip.panelWidth; + } else { + panelSize = strip.panelHeight; + } + activePanelsStart = Math.ceil( viewerSize / panelSize ) + 5; + activePanelsEnd = Math.ceil( ( Math.abs( scroll ) + viewerSize ) / panelSize ) + 1; + activePanelsStart = activePanelsEnd - activePanelsStart; + activePanelsStart = activePanelsStart < 0 ? 0 : activePanelsStart; + + for ( i = activePanelsStart; i < activePanelsEnd && i < strip.panels.length; i++ ) { + element = strip.panels[i]; + if ( !element.activePanel ) { + var miniTileSource; + var originalTileSource = strip.viewer.tileSources[i]; + if (originalTileSource.referenceStripThumbnailUrl) { + miniTileSource = { + type: 'image', + url: originalTileSource.referenceStripThumbnailUrl + }; + } else { + miniTileSource = originalTileSource; + } + miniViewer = new $.Viewer( { + id: element.id, + tileSources: [miniTileSource], + element: element, + navigatorSizeRatio: strip.sizeRatio, + showNavigator: false, + mouseNavEnabled: false, + showNavigationControl: false, + showSequenceControl: false, + immediateRender: true, + blendTime: 0, + animationTime: 0, + loadTilesWithAjax: strip.viewer.loadTilesWithAjax, + ajaxHeaders: strip.viewer.ajaxHeaders, + useCanvas: strip.useCanvas + } ); + // Allow pointer events to pass through miniViewer's canvas/container + // elements so implicit pointer capture works on touch devices + $.setElementPointerEventsNone( miniViewer.canvas ); + $.setElementPointerEventsNone( miniViewer.container ); + // We'll use event delegation from the reference strip element instead of + // handling events on every miniViewer + miniViewer.innerTracker.setTracking( false ); + miniViewer.outerTracker.setTracking( false ); + + strip.miniViewers[element.id] = miniViewer; + + element.activePanel = true; + } + } +} + + +/** + * @private + * @inner + * @function + */ +function onStripEnter( event ) { + var element = event.eventSource.element; + + //$.setElementOpacity(element, 0.8); + + //element.style.border = '1px solid #555'; + //element.style.background = '#000'; + + if ( 'horizontal' === this.scroll ) { + + //element.style.paddingTop = "0px"; + element.style.marginBottom = "0px"; + + } else { + + //element.style.paddingRight = "0px"; + element.style.marginLeft = "0px"; + + } +} + + +/** + * @private + * @inner + * @function + */ +function onStripLeave( event ) { + var element = event.eventSource.element; + + if ( 'horizontal' === this.scroll ) { + + //element.style.paddingTop = "10px"; + element.style.marginBottom = "-" + ( $.getElementSize( element ).y / 2 ) + "px"; + + } else { + + //element.style.paddingRight = "10px"; + element.style.marginLeft = "-" + ( $.getElementSize( element ).x / 2 ) + "px"; + + } +} + + +/** + * @private + * @inner + * @function + */ +function onKeyDown( event ) { + //console.log( event.keyCode ); + + if ( !event.ctrl && !event.alt && !event.meta ) { + switch ( event.keyCode ) { + case 38: //up arrow + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + event.preventDefault = true; + break; + case 40: //down arrow + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + event.preventDefault = true; + break; + case 37: //left arrow + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + event.preventDefault = true; + break; + case 39: //right arrow + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + event.preventDefault = true; + break; + default: + //console.log( 'navigator keycode %s', event.keyCode ); + event.preventDefault = false; + break; + } + } else { + event.preventDefault = false; + } +} + + +/** + * @private + * @inner + * @function + */ +function onKeyPress( event ) { + //console.log( event.keyCode ); + + if ( !event.ctrl && !event.alt && !event.meta ) { + switch ( event.keyCode ) { + case 61: //=|+ + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + event.preventDefault = true; + break; + case 45: //-|_ + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + event.preventDefault = true; + break; + case 48: //0|) + case 119: //w + case 87: //W + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + event.preventDefault = true; + break; + case 115: //s + case 83: //S + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + event.preventDefault = true; + break; + case 97: //a + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } ); + event.preventDefault = true; + break; + case 100: //d + onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } ); + event.preventDefault = true; + break; + default: + //console.log( 'navigator keycode %s', event.keyCode ); + event.preventDefault = false; + break; + } + } else { + event.preventDefault = false; + } +} + +}(OpenSeadragon)); + +/* + * OpenSeadragon - DisplayRect + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class DisplayRect + * @classdesc A display rectangle is very similar to {@link OpenSeadragon.Rect} but adds two + * fields, 'minLevel' and 'maxLevel' which denote the supported zoom levels + * for this rectangle. + * + * @memberof OpenSeadragon + * @extends OpenSeadragon.Rect + * @param {Number} x The vector component 'x'. + * @param {Number} y The vector component 'y'. + * @param {Number} width The vector component 'height'. + * @param {Number} height The vector component 'width'. + * @param {Number} minLevel The lowest zoom level supported. + * @param {Number} maxLevel The highest zoom level supported. + */ +$.DisplayRect = function( x, y, width, height, minLevel, maxLevel ) { + $.Rect.apply( this, [ x, y, width, height ] ); + + /** + * The lowest zoom level supported. + * @member {Number} minLevel + * @memberof OpenSeadragon.DisplayRect# + */ + this.minLevel = minLevel; + /** + * The highest zoom level supported. + * @member {Number} maxLevel + * @memberof OpenSeadragon.DisplayRect# + */ + this.maxLevel = maxLevel; +}; + +$.extend( $.DisplayRect.prototype, $.Rect.prototype ); + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Spring + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Spring + * @memberof OpenSeadragon + * @param {Object} options - Spring configuration settings. + * @param {Number} options.springStiffness - Spring stiffness. Must be greater than zero. + * The closer to zero, the closer to linear animation. + * @param {Number} options.animationTime - Animation duration per spring, in seconds. + * Must be zero or greater. + * @param {Number} [options.initial=0] - Initial value of spring. + * @param {Boolean} [options.exponential=false] - Whether this spring represents + * an exponential scale (such as zoom) and should be animated accordingly. Note that + * exponential springs must have non-zero values. + */ +$.Spring = function( options ) { + var args = arguments; + + if( typeof ( options ) !== 'object' ){ + //allows backward compatible use of ( initialValue, config ) as + //constructor parameters + options = { + initial: args.length && typeof ( args[ 0 ] ) === "number" ? + args[ 0 ] : + undefined, + /** + * Spring stiffness. + * @member {Number} springStiffness + * @memberof OpenSeadragon.Spring# + */ + springStiffness: args.length > 1 ? + args[ 1 ].springStiffness : + 5.0, + /** + * Animation duration per spring. + * @member {Number} animationTime + * @memberof OpenSeadragon.Spring# + */ + animationTime: args.length > 1 ? + args[ 1 ].animationTime : + 1.5 + }; + } + + $.console.assert(typeof options.springStiffness === "number" && options.springStiffness !== 0, + "[OpenSeadragon.Spring] options.springStiffness must be a non-zero number"); + + $.console.assert(typeof options.animationTime === "number" && options.animationTime >= 0, + "[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0"); + + if (options.exponential) { + this._exponential = true; + delete options.exponential; + } + + $.extend( true, this, options); + + /** + * @member {Object} current + * @memberof OpenSeadragon.Spring# + * @property {Number} value + * @property {Number} time + */ + this.current = { + value: typeof ( this.initial ) === "number" ? + this.initial : + (this._exponential ? 0 : 1), + time: $.now() // always work in milliseconds + }; + + $.console.assert(!this._exponential || this.current.value !== 0, + "[OpenSeadragon.Spring] value must be non-zero for exponential springs"); + + /** + * @member {Object} start + * @memberof OpenSeadragon.Spring# + * @property {Number} value + * @property {Number} time + */ + this.start = { + value: this.current.value, + time: this.current.time + }; + + /** + * @member {Object} target + * @memberof OpenSeadragon.Spring# + * @property {Number} value + * @property {Number} time + */ + this.target = { + value: this.current.value, + time: this.current.time + }; + + if (this._exponential) { + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + this.current._logValue = Math.log(this.current.value); + } +}; + +/** @lends OpenSeadragon.Spring.prototype */ +$.Spring.prototype = { + + /** + * @function + * @param {Number} target + */ + resetTo: function( target ) { + $.console.assert(!this._exponential || target !== 0, + "[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs"); + + this.start.value = this.target.value = this.current.value = target; + this.start.time = this.target.time = this.current.time = $.now(); + + if (this._exponential) { + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + this.current._logValue = Math.log(this.current.value); + } + }, + + /** + * @function + * @param {Number} target + */ + springTo: function( target ) { + $.console.assert(!this._exponential || target !== 0, + "[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs"); + + this.start.value = this.current.value; + this.start.time = this.current.time; + this.target.value = target; + this.target.time = this.start.time + 1000 * this.animationTime; + + if (this._exponential) { + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + } + }, + + /** + * @function + * @param {Number} delta + */ + shiftBy: function( delta ) { + this.start.value += delta; + this.target.value += delta; + + if (this._exponential) { + $.console.assert(this.target.value !== 0 && this.start.value !== 0, + "[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs"); + + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + } + }, + + setExponential: function(value) { + this._exponential = value; + + if (this._exponential) { + $.console.assert(this.current.value !== 0 && this.target.value !== 0 && this.start.value !== 0, + "[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs"); + + this.start._logValue = Math.log(this.start.value); + this.target._logValue = Math.log(this.target.value); + this.current._logValue = Math.log(this.current.value); + } + }, + + /** + * @function + * @returns true if the value got updated, false otherwise + */ + update: function() { + this.current.time = $.now(); + + var startValue, targetValue; + if (this._exponential) { + startValue = this.start._logValue; + targetValue = this.target._logValue; + } else { + startValue = this.start.value; + targetValue = this.target.value; + } + + var currentValue = (this.current.time >= this.target.time) ? + targetValue : + startValue + + ( targetValue - startValue ) * + transform( + this.springStiffness, + ( this.current.time - this.start.time ) / + ( this.target.time - this.start.time ) + ); + + var oldValue = this.current.value; + if (this._exponential) { + this.current.value = Math.exp(currentValue); + } else { + this.current.value = currentValue; + } + + return oldValue !== this.current.value; + }, + + /** + * Returns whether the spring is at the target value + * @function + * @returns {Boolean} True if at target value, false otherwise + */ + isAtTargetValue: function() { + return this.current.value === this.target.value; + } +}; + +/** + * @private + */ +function transform( stiffness, x ) { + return ( 1.0 - Math.exp( stiffness * -x ) ) / + ( 1.0 - Math.exp( -stiffness ) ); +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - ImageLoader + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($){ + +/** + * @class ImageJob + * @classdesc Handles downloading of a single image. + * @param {Object} options - Options for this ImageJob. + * @param {String} [options.src] - URL of image to download. + * @param {Tile} [options.tile] - Tile that belongs the data to. + * @param {TileSource} [options.source] - Image loading strategy + * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX. + * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX. + * @param {Boolean} [options.ajaxWithCredentials] - Whether to set withCredentials on AJAX requests. + * @param {String} [options.crossOriginPolicy] - CORS policy to use for downloads + * @param {String} [options.postData] - HTTP POST data (usually but not necessarily in k=v&k2=v2... form, + * see TileSource::getPostData) or null + * @param {Function} [options.callback] - Called once image has been downloaded. + * @param {Function} [options.abort] - Called when this image job is aborted. + * @param {Number} [options.timeout] - The max number of milliseconds that this image job may take to complete. + * @param {Number} [options.tries] - Actual number of the current try. + */ +$.ImageJob = function(options) { + + $.extend(true, this, { + timeout: $.DEFAULT_SETTINGS.timeout, + jobId: null, + tries: 0 + }, options); + + /** + * Data object which will contain downloaded image data. + * @member {Image|*} data data object, by default an Image object (depends on TileSource) + * @memberof OpenSeadragon.ImageJob# + */ + this.data = null; + + /** + * User workspace to populate with helper variables + * @member {*} userData to append custom data and avoid namespace collision + * @memberof OpenSeadragon.ImageJob# + */ + this.userData = {}; + + /** + * Error message holder + * @member {string} error message + * @memberof OpenSeadragon.ImageJob# + * @private + */ + this.errorMsg = null; +}; + +$.ImageJob.prototype = { + /** + * Starts the image job. + * @method + */ + start: function() { + this.tries++; + + var self = this; + var selfAbort = this.abort; + + this.jobId = window.setTimeout(function () { + self.finish(null, null, "Image load exceeded timeout (" + self.timeout + " ms)"); + }, this.timeout); + + this.abort = function() { + self.source.downloadTileAbort(self); + if (typeof selfAbort === "function") { + selfAbort(); + } + }; + + this.source.downloadTileStart(this); + }, + + /** + * Finish this job. + * @param {*} data data that has been downloaded + * @param {XMLHttpRequest} request reference to the request if used + * @param {string} errorMessage description upon failure + */ + finish: function(data, request, errorMessage ) { + this.data = data; + this.request = request; + this.errorMsg = errorMessage; + + if (this.jobId) { + window.clearTimeout(this.jobId); + } + + this.callback(this); + } +}; + +/** + * @class ImageLoader + * @memberof OpenSeadragon + * @classdesc Handles downloading of a set of images using asynchronous queue pattern. + * You generally won't have to interact with the ImageLoader directly. + * @param {Object} options - Options for this ImageLoader. + * @param {Number} [options.jobLimit] - The number of concurrent image requests. See imageLoaderLimit in {@link OpenSeadragon.Options} for details. + * @param {Number} [options.timeout] - The max number of milliseconds that an image job may take to complete. + */ +$.ImageLoader = function(options) { + + $.extend(true, this, { + jobLimit: $.DEFAULT_SETTINGS.imageLoaderLimit, + timeout: $.DEFAULT_SETTINGS.timeout, + jobQueue: [], + failedTiles: [], + jobsInProgress: 0 + }, options); + +}; + +/** @lends OpenSeadragon.ImageLoader.prototype */ +$.ImageLoader.prototype = { + + /** + * Add an unloaded image to the loader queue. + * @method + * @param {Object} options - Options for this job. + * @param {String} [options.src] - URL of image to download. + * @param {Tile} [options.tile] - Tile that belongs the data to. The tile instance + * is not internally used and serves for custom TileSources implementations. + * @param {TileSource} [options.source] - Image loading strategy + * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX. + * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX. + * @param {String|Boolean} [options.crossOriginPolicy] - CORS policy to use for downloads + * @param {String} [options.postData] - POST parameters (usually but not necessarily in k=v&k2=v2... form, + * see TileSource::getPostData) or null + * @param {Boolean} [options.ajaxWithCredentials] - Whether to set withCredentials on AJAX + * requests. + * @param {Function} [options.callback] - Called once image has been downloaded. + * @param {Function} [options.abort] - Called when this image job is aborted. + */ + addJob: function(options) { + if (!options.source) { + $.console.error('ImageLoader.prototype.addJob() requires [options.source]. ' + + 'TileSource since new API defines how images are fetched. Creating a dummy TileSource.'); + var implementation = $.TileSource.prototype; + options.source = { + downloadTileStart: implementation.downloadTileStart, + downloadTileAbort: implementation.downloadTileAbort + }; + } + + var _this = this, + complete = function(job) { + completeJob(_this, job, options.callback); + }, + jobOptions = { + src: options.src, + tile: options.tile || {}, + source: options.source, + loadWithAjax: options.loadWithAjax, + ajaxHeaders: options.loadWithAjax ? options.ajaxHeaders : null, + crossOriginPolicy: options.crossOriginPolicy, + ajaxWithCredentials: options.ajaxWithCredentials, + postData: options.postData, + callback: complete, + abort: options.abort, + timeout: this.timeout + }, + newJob = new $.ImageJob(jobOptions); + + if ( !this.jobLimit || this.jobsInProgress < this.jobLimit ) { + newJob.start(); + this.jobsInProgress++; + } + else { + this.jobQueue.push( newJob ); + } + }, + + /** + * Clear any unstarted image loading jobs from the queue. + * @method + */ + clear: function() { + for( var i = 0; i < this.jobQueue.length; i++ ) { + var job = this.jobQueue[i]; + if ( typeof job.abort === "function" ) { + job.abort(); + } + } + + this.jobQueue = []; + } +}; + +/** + * Cleans up ImageJob once completed. Restarts job after tileRetryDelay seconds if failed + * but max tileRetryMax times + * @method + * @private + * @param loader - ImageLoader used to start job. + * @param job - The ImageJob that has completed. + * @param callback - Called once cleanup is finished. + */ +function completeJob(loader, job, callback) { + if (job.errorMsg !== '' && (job.data === null || job.data === undefined) && job.tries < 1 + loader.tileRetryMax) { + loader.failedTiles.push(job); + } + var nextJob; + + loader.jobsInProgress--; + + if ((!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.jobQueue.length > 0) { + nextJob = loader.jobQueue.shift(); + nextJob.start(); + loader.jobsInProgress++; + } + + if (loader.tileRetryMax > 0 && loader.jobQueue.length === 0) { + if ((!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.failedTiles.length > 0) { + nextJob = loader.failedTiles.shift(); + setTimeout(function () { + nextJob.start(); + }, loader.tileRetryDelay); + loader.jobsInProgress++; + } + } + + callback(job.data, job.errorMsg, job.request); +} + +}(OpenSeadragon)); + +/* + * OpenSeadragon - Tile + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Tile + * @memberof OpenSeadragon + * @param {Number} level The zoom level this tile belongs to. + * @param {Number} x The vector component 'x'. + * @param {Number} y The vector component 'y'. + * @param {OpenSeadragon.Rect} bounds Where this tile fits, in normalized + * coordinates. + * @param {Boolean} exists Is this tile a part of a sparse image? ( Also has + * this tile failed to load? ) + * @param {String|Function} url The URL of this tile's image or a function that returns a url. + * @param {CanvasRenderingContext2D} context2D The context2D of this tile if it + * is provided directly by the tile source. + * @param {Boolean} loadWithAjax Whether this tile image should be loaded with an AJAX request . + * @param {Object} ajaxHeaders The headers to send with this tile's AJAX request (if applicable). + * @param {OpenSeadragon.Rect} sourceBounds The portion of the tile to use as the source of the + * drawing operation, in pixels. Note that this only works when drawing with canvas; when drawing + * with HTML the entire tile is always used. + * @param {String} postData HTTP POST data (usually but not necessarily in k=v&k2=v2... form, + * see TileSource::getPostData) or null + * @param {String} cacheKey key to act as a tile cache, must be unique for tiles with unique image data + */ +$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders, sourceBounds, postData, cacheKey) { + /** + * The zoom level this tile belongs to. + * @member {Number} level + * @memberof OpenSeadragon.Tile# + */ + this.level = level; + /** + * The vector component 'x'. + * @member {Number} x + * @memberof OpenSeadragon.Tile# + */ + this.x = x; + /** + * The vector component 'y'. + * @member {Number} y + * @memberof OpenSeadragon.Tile# + */ + this.y = y; + /** + * Where this tile fits, in normalized coordinates + * @member {OpenSeadragon.Rect} bounds + * @memberof OpenSeadragon.Tile# + */ + this.bounds = bounds; + /** + * The portion of the tile to use as the source of the drawing operation, in pixels. Note that + * this only works when drawing with canvas; when drawing with HTML the entire tile is always used. + * @member {OpenSeadragon.Rect} sourceBounds + * @memberof OpenSeadragon.Tile# + */ + this.sourceBounds = sourceBounds; + /** + * Is this tile a part of a sparse image? Also has this tile failed to load? + * @member {Boolean} exists + * @memberof OpenSeadragon.Tile# + */ + this.exists = exists; + /** + * Private property to hold string url or url retriever function. + * Consumers should access via Tile.getUrl() + * @private + * @member {String|Function} url + * @memberof OpenSeadragon.Tile# + */ + this._url = url; + /** + * Post parameters for this tile. For example, it can be an URL-encoded string + * in k1=v1&k2=v2... format, or a JSON, or a FormData instance... or null if no POST request used + * @member {String} postData HTTP POST data (usually but not necessarily in k=v&k2=v2... form, + * see TileSource::getPostData) or null + * @memberof OpenSeadragon.Tile# + */ + this.postData = postData; + /** + * The context2D of this tile if it is provided directly by the tile source. + * @member {CanvasRenderingContext2D} context2D + * @memberOf OpenSeadragon.Tile# + */ + this.context2D = context2D; + /** + * Whether to load this tile's image with an AJAX request. + * @member {Boolean} loadWithAjax + * @memberof OpenSeadragon.Tile# + */ + this.loadWithAjax = loadWithAjax; + /** + * The headers to be used in requesting this tile's image. + * Only used if loadWithAjax is set to true. + * @member {Object} ajaxHeaders + * @memberof OpenSeadragon.Tile# + */ + this.ajaxHeaders = ajaxHeaders; + + if (cacheKey === undefined) { + $.console.warn("Tile constructor needs 'cacheKey' variable: creation tile cache" + + " in Tile class is deprecated. TileSource.prototype.getTileHashKey will be used."); + cacheKey = $.TileSource.prototype.getTileHashKey(level, x, y, url, ajaxHeaders, postData); + } + /** + * The unique cache key for this tile. + * @member {String} cacheKey + * @memberof OpenSeadragon.Tile# + */ + this.cacheKey = cacheKey; + /** + * Is this tile loaded? + * @member {Boolean} loaded + * @memberof OpenSeadragon.Tile# + */ + this.loaded = false; + /** + * Is this tile loading? + * @member {Boolean} loading + * @memberof OpenSeadragon.Tile# + */ + this.loading = false; + + /** + * The HTML div element for this tile + * @member {Element} element + * @memberof OpenSeadragon.Tile# + */ + this.element = null; + /** + * The HTML img element for this tile. + * @member {Element} imgElement + * @memberof OpenSeadragon.Tile# + */ + this.imgElement = null; + + /** + * The alias of this.element.style. + * @member {String} style + * @memberof OpenSeadragon.Tile# + */ + this.style = null; + /** + * This tile's position on screen, in pixels. + * @member {OpenSeadragon.Point} position + * @memberof OpenSeadragon.Tile# + */ + this.position = null; + /** + * This tile's size on screen, in pixels. + * @member {OpenSeadragon.Point} size + * @memberof OpenSeadragon.Tile# + */ + this.size = null; + /** + * Whether to flip the tile when rendering. + * @member {Boolean} flipped + * @memberof OpenSeadragon.Tile# + */ + this.flipped = false; + /** + * The start time of this tile's blending. + * @member {Number} blendStart + * @memberof OpenSeadragon.Tile# + */ + this.blendStart = null; + /** + * The current opacity this tile should be. + * @member {Number} opacity + * @memberof OpenSeadragon.Tile# + */ + this.opacity = null; + /** + * The squared distance of this tile to the viewport center. + * Use for comparing tiles. + * @private + * @member {Number} squaredDistance + * @memberof OpenSeadragon.Tile# + */ + this.squaredDistance = null; + /** + * The visibility score of this tile. + * @member {Number} visibility + * @memberof OpenSeadragon.Tile# + */ + this.visibility = null; + + /** + * The transparency indicator of this tile. + * @member {Boolean} hasTransparency true if tile contains transparency for correct rendering + * @memberof OpenSeadragon.Tile# + */ + this.hasTransparency = false; + + /** + * Whether this tile is currently being drawn. + * @member {Boolean} beingDrawn + * @memberof OpenSeadragon.Tile# + */ + this.beingDrawn = false; + + /** + * Timestamp the tile was last touched. + * @member {Number} lastTouchTime + * @memberof OpenSeadragon.Tile# + */ + this.lastTouchTime = 0; + + /** + * Whether this tile is in the right-most column for its level. + * @member {Boolean} isRightMost + * @memberof OpenSeadragon.Tile# + */ + this.isRightMost = false; + + /** + * Whether this tile is in the bottom-most row for its level. + * @member {Boolean} isBottomMost + * @memberof OpenSeadragon.Tile# + */ + this.isBottomMost = false; +}; + +/** @lends OpenSeadragon.Tile.prototype */ +$.Tile.prototype = { + + /** + * Provides a string representation of this tiles level and (x,y) + * components. + * @function + * @returns {String} + */ + toString: function() { + return this.level + "/" + this.x + "_" + this.y; + }, + + // private + _hasTransparencyChannel: function() { + console.warn("Tile.prototype._hasTransparencyChannel() has been " + + "deprecated and will be removed in the future. Use TileSource.prototype.hasTransparency() instead."); + return !!this.context2D || this.getUrl().match('.png'); + }, + + /** + * Renders the tile in an html container. + * @function + * @param {Element} container + */ + drawHTML: function( container ) { + if (!this.cacheImageRecord) { + $.console.warn( + '[Tile.drawHTML] attempting to draw tile %s when it\'s not cached', + this.toString()); + return; + } + + if ( !this.loaded ) { + $.console.warn( + "Attempting to draw tile %s when it's not yet loaded.", + this.toString() + ); + return; + } + + //EXPERIMENTAL - trying to figure out how to scale the container + // content during animation of the container size. + + if ( !this.element ) { + var image = this.getImage(); + if (!image) { + return; + } + + this.element = $.makeNeutralElement( "div" ); + this.imgElement = image.cloneNode(); + this.imgElement.style.msInterpolationMode = "nearest-neighbor"; + this.imgElement.style.width = "100%"; + this.imgElement.style.height = "100%"; + + this.style = this.element.style; + this.style.position = "absolute"; + } + if ( this.element.parentNode !== container ) { + container.appendChild( this.element ); + } + if ( this.imgElement.parentNode !== this.element ) { + this.element.appendChild( this.imgElement ); + } + + this.style.top = this.position.y + "px"; + this.style.left = this.position.x + "px"; + this.style.height = this.size.y + "px"; + this.style.width = this.size.x + "px"; + + if (this.flipped) { + this.style.transform = "scaleX(-1)"; + } + + $.setElementOpacity( this.element, this.opacity ); + }, + + /** + * The Image object for this tile. + * @member {Object} image + * @memberof OpenSeadragon.Tile# + * @deprecated + * @returns {Image} + */ + get image() { + $.console.error("[Tile.image] property has been deprecated. Use [Tile.prototype.getImage] instead."); + return this.getImage(); + }, + + /** + * The URL of this tile's image. + * @member {String} url + * @memberof OpenSeadragon.Tile# + * @deprecated + * @returns {String} + */ + get url() { + $.console.error("[Tile.url] property has been deprecated. Use [Tile.prototype.getUrl] instead."); + return this.getUrl(); + }, + + /** + * Get the Image object for this tile. + * @returns {Image} + */ + getImage: function() { + return this.cacheImageRecord.getImage(); + }, + + /** + * Get the url string for this tile. + * @returns {String} + */ + getUrl: function() { + if (typeof this._url === 'function') { + return this._url(); + } + + return this._url; + }, + + /** + * Get the CanvasRenderingContext2D instance for tile image data drawn + * onto Canvas if enabled and available + * @returns {CanvasRenderingContext2D} + */ + getCanvasContext: function() { + return this.context2D || this.cacheImageRecord.getRenderedContext(); + }, + + /** + * Renders the tile in a canvas-based context. + * @function + * @param {Canvas} context + * @param {Function} drawingHandler - Method for firing the drawing event. + * drawingHandler({context, tile, rendered}) + * where rendered is the context with the pre-drawn image. + * @param {Number} [scale=1] - Apply a scale to position and size + * @param {OpenSeadragon.Point} [translate] - A translation vector + * @param {Boolean} [shouldRoundPositionAndSize] - Tells whether to round + * position and size of tiles supporting alpha channel in non-transparency + * context. + * @param {OpenSeadragon.TileSource} source - The source specification of the tile. + */ + drawCanvas: function( context, drawingHandler, scale, translate, shouldRoundPositionAndSize, source) { + + var position = this.position.times($.pixelDensityRatio), + size = this.size.times($.pixelDensityRatio), + rendered; + + if (!this.context2D && !this.cacheImageRecord) { + $.console.warn( + '[Tile.drawCanvas] attempting to draw tile %s when it\'s not cached', + this.toString()); + return; + } + + rendered = this.getCanvasContext(); + + if ( !this.loaded || !rendered ){ + $.console.warn( + "Attempting to draw tile %s when it's not yet loaded.", + this.toString() + ); + + return; + } + + context.save(); + context.globalAlpha = this.opacity; + + if (typeof scale === 'number' && scale !== 1) { + // draw tile at a different scale + position = position.times(scale); + size = size.times(scale); + } + + if (translate instanceof $.Point) { + // shift tile position slightly + position = position.plus(translate); + } + + //if we are supposed to be rendering fully opaque rectangle, + //ie its done fading or fading is turned off, and if we are drawing + //an image with an alpha channel, then the only way + //to avoid seeing the tile underneath is to clear the rectangle + if (context.globalAlpha === 1 && this.hasTransparency) { + if (shouldRoundPositionAndSize) { + // Round to the nearest whole pixel so we don't get seams from overlap. + position.x = Math.round(position.x); + position.y = Math.round(position.y); + size.x = Math.round(size.x); + size.y = Math.round(size.y); + } + + //clearing only the inside of the rectangle occupied + //by the png prevents edge flikering + context.clearRect( + position.x, + position.y, + size.x, + size.y + ); + } + + // This gives the application a chance to make image manipulation + // changes as we are rendering the image + drawingHandler({context: context, tile: this, rendered: rendered}); + + var sourceWidth, sourceHeight; + if (this.sourceBounds) { + sourceWidth = Math.min(this.sourceBounds.width, rendered.canvas.width); + sourceHeight = Math.min(this.sourceBounds.height, rendered.canvas.height); + } else { + sourceWidth = rendered.canvas.width; + sourceHeight = rendered.canvas.height; + } + + context.translate(position.x + size.x / 2, 0); + if (this.flipped) { + context.scale(-1, 1); + } + context.drawImage( + rendered.canvas, + 0, + 0, + sourceWidth, + sourceHeight, + -size.x / 2, + position.y, + size.x, + size.y + ); + + context.restore(); + }, + + /** + * Get the ratio between current and original size. + * @function + * @returns {Float} + */ + getScaleForEdgeSmoothing: function() { + var context; + if (this.cacheImageRecord) { + context = this.cacheImageRecord.getRenderedContext(); + } else if (this.context2D) { + context = this.context2D; + } else { + $.console.warn( + '[Tile.drawCanvas] attempting to get tile scale %s when tile\'s not cached', + this.toString()); + return 1; + } + return context.canvas.width / (this.size.x * $.pixelDensityRatio); + }, + + /** + * Get a translation vector that when applied to the tile position produces integer coordinates. + * Needed to avoid swimming and twitching. + * @function + * @param {Number} [scale=1] - Scale to be applied to position. + * @returns {OpenSeadragon.Point} + */ + getTranslationForEdgeSmoothing: function(scale, canvasSize, sketchCanvasSize) { + // The translation vector must have positive values, otherwise the image goes a bit off + // the sketch canvas to the top and left and we must use negative coordinates to repaint it + // to the main canvas. In that case, some browsers throw: + // INDEX_SIZE_ERR: DOM Exception 1: Index or size was negative, or greater than the allowed value. + var x = Math.max(1, Math.ceil((sketchCanvasSize.x - canvasSize.x) / 2)); + var y = Math.max(1, Math.ceil((sketchCanvasSize.y - canvasSize.y) / 2)); + return new $.Point(x, y).minus( + this.position + .times($.pixelDensityRatio) + .times(scale || 1) + .apply(function(x) { + return x % 1; + }) + ); + }, + + /** + * Removes tile from its container. + * @function + */ + unload: function() { + if ( this.imgElement && this.imgElement.parentNode ) { + this.imgElement.parentNode.removeChild( this.imgElement ); + } + if ( this.element && this.element.parentNode ) { + this.element.parentNode.removeChild( this.element ); + } + + this.element = null; + this.imgElement = null; + this.loaded = false; + this.loading = false; + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Overlay + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function($) { + + /** + * An enumeration of positions that an overlay may be assigned relative to + * the viewport. + * It is identical to OpenSeadragon.Placement but is kept for backward + * compatibility. + * @member OverlayPlacement + * @memberof OpenSeadragon + * @see OpenSeadragon.Placement + * @static + * @readonly + * @type {Object} + * @property {Number} CENTER + * @property {Number} TOP_LEFT + * @property {Number} TOP + * @property {Number} TOP_RIGHT + * @property {Number} RIGHT + * @property {Number} BOTTOM_RIGHT + * @property {Number} BOTTOM + * @property {Number} BOTTOM_LEFT + * @property {Number} LEFT + */ + $.OverlayPlacement = $.Placement; + + /** + * An enumeration of possible ways to handle overlays rotation + * @member OverlayRotationMode + * @memberOf OpenSeadragon + * @static + * @readonly + * @property {Number} NO_ROTATION The overlay ignore the viewport rotation. + * @property {Number} EXACT The overlay use CSS 3 transforms to rotate with + * the viewport. If the overlay contains text, it will get rotated as well. + * @property {Number} BOUNDING_BOX The overlay adjusts for rotation by + * taking the size of the bounding box of the rotated bounds. + * Only valid for overlays with Rect location and scalable in both directions. + */ + $.OverlayRotationMode = $.freezeObject({ + NO_ROTATION: 1, + EXACT: 2, + BOUNDING_BOX: 3 + }); + + /** + * @class Overlay + * @classdesc Provides a way to float an HTML element on top of the viewer element. + * + * @memberof OpenSeadragon + * @param {Object} options + * @param {Element} options.element + * @param {OpenSeadragon.Point|OpenSeadragon.Rect} options.location - The + * location of the overlay on the image. If a {@link OpenSeadragon.Point} + * is specified, the overlay will be located at this location with respect + * to the placement option. If a {@link OpenSeadragon.Rect} is specified, + * the overlay will be placed at this location with the corresponding width + * and height and placement TOP_LEFT. + * @param {OpenSeadragon.Placement} [options.placement=OpenSeadragon.Placement.TOP_LEFT] + * Defines what part of the overlay should be at the specified options.location + * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw] + * @param {Boolean} [options.checkResize=true] Set to false to avoid to + * check the size of the overlay every time it is drawn in the directions + * which are not scaled. It will improve performances but will cause a + * misalignment if the overlay size changes. + * @param {Number} [options.width] The width of the overlay in viewport + * coordinates. If specified, the width of the overlay will be adjusted when + * the zoom changes. + * @param {Number} [options.height] The height of the overlay in viewport + * coordinates. If specified, the height of the overlay will be adjusted when + * the zoom changes. + * @param {Boolean} [options.rotationMode=OpenSeadragon.OverlayRotationMode.EXACT] + * How to handle the rotation of the viewport. + */ + $.Overlay = function(element, location, placement) { + + /** + * onDraw callback signature used by {@link OpenSeadragon.Overlay}. + * + * @callback OnDrawCallback + * @memberof OpenSeadragon.Overlay + * @param {OpenSeadragon.Point} position + * @param {OpenSeadragon.Point} size + * @param {Element} element + */ + + var options; + if ($.isPlainObject(element)) { + options = element; + } else { + options = { + element: element, + location: location, + placement: placement + }; + } + + this.element = options.element; + this.style = options.element.style; + this._init(options); + }; + + /** @lends OpenSeadragon.Overlay.prototype */ + $.Overlay.prototype = { + + // private + _init: function(options) { + this.location = options.location; + this.placement = options.placement === undefined ? + $.Placement.TOP_LEFT : options.placement; + this.onDraw = options.onDraw; + this.checkResize = options.checkResize === undefined ? + true : options.checkResize; + + // When this.width is not null, the overlay get scaled horizontally + this.width = options.width === undefined ? null : options.width; + + // When this.height is not null, the overlay get scaled vertically + this.height = options.height === undefined ? null : options.height; + + this.rotationMode = options.rotationMode || $.OverlayRotationMode.EXACT; + + // Having a rect as location is a syntactic sugar + if (this.location instanceof $.Rect) { + this.width = this.location.width; + this.height = this.location.height; + this.location = this.location.getTopLeft(); + this.placement = $.Placement.TOP_LEFT; + } + + // Deprecated properties kept for backward compatibility. + this.scales = this.width !== null && this.height !== null; + this.bounds = new $.Rect( + this.location.x, this.location.y, this.width, this.height); + this.position = this.location; + }, + + /** + * Internal function to adjust the position of an overlay + * depending on it size and placement. + * @function + * @param {OpenSeadragon.Point} position + * @param {OpenSeadragon.Point} size + */ + adjust: function(position, size) { + var properties = $.Placement.properties[this.placement]; + if (!properties) { + return; + } + if (properties.isHorizontallyCentered) { + position.x -= size.x / 2; + } else if (properties.isRight) { + position.x -= size.x; + } + if (properties.isVerticallyCentered) { + position.y -= size.y / 2; + } else if (properties.isBottom) { + position.y -= size.y; + } + }, + + /** + * @function + */ + destroy: function() { + var element = this.element; + var style = this.style; + + if (element.parentNode) { + element.parentNode.removeChild(element); + //this should allow us to preserve overlays when required between + //pages + if (element.prevElementParent) { + style.display = 'none'; + //element.prevElementParent.insertBefore( + // element, + // element.prevNextSibling + //); + document.body.appendChild(element); + } + } + + // clear the onDraw callback + this.onDraw = null; + + style.top = ""; + style.left = ""; + style.position = ""; + + if (this.width !== null) { + style.width = ""; + } + if (this.height !== null) { + style.height = ""; + } + var transformOriginProp = $.getCssPropertyWithVendorPrefix( + 'transformOrigin'); + var transformProp = $.getCssPropertyWithVendorPrefix( + 'transform'); + if (transformOriginProp && transformProp) { + style[transformOriginProp] = ""; + style[transformProp] = ""; + } + }, + + /** + * @function + * @param {Element} container + */ + drawHTML: function(container, viewport) { + var element = this.element; + if (element.parentNode !== container) { + //save the source parent for later if we need it + element.prevElementParent = element.parentNode; + element.prevNextSibling = element.nextSibling; + container.appendChild(element); + + // have to set position before calculating size, fix #1116 + this.style.position = "absolute"; + // this.size is used by overlays which don't get scaled in at + // least one direction when this.checkResize is set to false. + this.size = $.getElementSize(element); + } + + var positionAndSize = this._getOverlayPositionAndSize(viewport); + + var position = positionAndSize.position; + var size = this.size = positionAndSize.size; + var rotate = positionAndSize.rotate; + + // call the onDraw callback if it exists to allow one to overwrite + // the drawing/positioning/sizing of the overlay + if (this.onDraw) { + this.onDraw(position, size, this.element); + } else { + var style = this.style; + style.left = position.x + "px"; + style.top = position.y + "px"; + if (this.width !== null) { + style.width = size.x + "px"; + } + if (this.height !== null) { + style.height = size.y + "px"; + } + var transformOriginProp = $.getCssPropertyWithVendorPrefix( + 'transformOrigin'); + var transformProp = $.getCssPropertyWithVendorPrefix( + 'transform'); + if (transformOriginProp && transformProp) { + if (rotate) { + style[transformOriginProp] = this._getTransformOrigin(); + style[transformProp] = "rotate(" + rotate + "deg)"; + } else { + style[transformOriginProp] = ""; + style[transformProp] = ""; + } + } + style.display = 'block'; + } + }, + + // private + _getOverlayPositionAndSize: function(viewport) { + var position = viewport.pixelFromPoint(this.location, true); + var size = this._getSizeInPixels(viewport); + this.adjust(position, size); + + var rotate = 0; + if (viewport.getRotation(true) && + this.rotationMode !== $.OverlayRotationMode.NO_ROTATION) { + // BOUNDING_BOX is only valid if both directions get scaled. + // Get replaced by EXACT otherwise. + if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX && + this.width !== null && this.height !== null) { + var rect = new $.Rect(position.x, position.y, size.x, size.y); + var boundingBox = this._getBoundingBox(rect, viewport.getRotation(true)); + position = boundingBox.getTopLeft(); + size = boundingBox.getSize(); + } else { + rotate = viewport.getRotation(true); + } + } + + return { + position: position, + size: size, + rotate: rotate + }; + }, + + // private + _getSizeInPixels: function(viewport) { + var width = this.size.x; + var height = this.size.y; + if (this.width !== null || this.height !== null) { + var scaledSize = viewport.deltaPixelsFromPointsNoRotate( + new $.Point(this.width || 0, this.height || 0), true); + if (this.width !== null) { + width = scaledSize.x; + } + if (this.height !== null) { + height = scaledSize.y; + } + } + if (this.checkResize && + (this.width === null || this.height === null)) { + var eltSize = this.size = $.getElementSize(this.element); + if (this.width === null) { + width = eltSize.x; + } + if (this.height === null) { + height = eltSize.y; + } + } + return new $.Point(width, height); + }, + + // private + _getBoundingBox: function(rect, degrees) { + var refPoint = this._getPlacementPoint(rect); + return rect.rotate(degrees, refPoint).getBoundingBox(); + }, + + // private + _getPlacementPoint: function(rect) { + var result = new $.Point(rect.x, rect.y); + var properties = $.Placement.properties[this.placement]; + if (properties) { + if (properties.isHorizontallyCentered) { + result.x += rect.width / 2; + } else if (properties.isRight) { + result.x += rect.width; + } + if (properties.isVerticallyCentered) { + result.y += rect.height / 2; + } else if (properties.isBottom) { + result.y += rect.height; + } + } + return result; + }, + + // private + _getTransformOrigin: function() { + var result = ""; + var properties = $.Placement.properties[this.placement]; + if (!properties) { + return result; + } + if (properties.isLeft) { + result = "left"; + } else if (properties.isRight) { + result = "right"; + } + if (properties.isTop) { + result += " top"; + } else if (properties.isBottom) { + result += " bottom"; + } + return result; + }, + + /** + * Changes the overlay settings. + * @function + * @param {OpenSeadragon.Point|OpenSeadragon.Rect|Object} location + * If an object is specified, the options are the same than the constructor + * except for the element which can not be changed. + * @param {OpenSeadragon.Placement} placement + */ + update: function(location, placement) { + var options = $.isPlainObject(location) ? location : { + location: location, + placement: placement + }; + this._init({ + location: options.location || this.location, + placement: options.placement !== undefined ? + options.placement : this.placement, + onDraw: options.onDraw || this.onDraw, + checkResize: options.checkResize || this.checkResize, + width: options.width !== undefined ? options.width : this.width, + height: options.height !== undefined ? options.height : this.height, + rotationMode: options.rotationMode || this.rotationMode + }); + }, + + /** + * Returns the current bounds of the overlay in viewport coordinates + * @function + * @param {OpenSeadragon.Viewport} viewport the viewport + * @returns {OpenSeadragon.Rect} overlay bounds + */ + getBounds: function(viewport) { + $.console.assert(viewport, + 'A viewport must now be passed to Overlay.getBounds.'); + var width = this.width; + var height = this.height; + if (width === null || height === null) { + var size = viewport.deltaPointsFromPixelsNoRotate(this.size, true); + if (width === null) { + width = size.x; + } + if (height === null) { + height = size.y; + } + } + var location = this.location.clone(); + this.adjust(location, new $.Point(width, height)); + return this._adjustBoundsForRotation( + viewport, new $.Rect(location.x, location.y, width, height)); + }, + + // private + _adjustBoundsForRotation: function(viewport, bounds) { + if (!viewport || + viewport.getRotation(true) === 0 || + this.rotationMode === $.OverlayRotationMode.EXACT) { + return bounds; + } + if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX) { + // If overlay not fully scalable, BOUNDING_BOX falls back to EXACT + if (this.width === null || this.height === null) { + return bounds; + } + // It is easier to just compute the position and size and + // convert to viewport coordinates. + var positionAndSize = this._getOverlayPositionAndSize(viewport); + return viewport.viewerElementToViewportRectangle(new $.Rect( + positionAndSize.position.x, + positionAndSize.position.y, + positionAndSize.size.x, + positionAndSize.size.y)); + } + + // NO_ROTATION case + return bounds.rotate(-viewport.getRotation(true), + this._getPlacementPoint(bounds)); + } + }; + +}(OpenSeadragon)); + +/* + * OpenSeadragon - Drawer + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class Drawer + * @memberof OpenSeadragon + * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}. + * @param {Object} options - Options for this Drawer. + * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this Drawer. + * @param {OpenSeadragon.Viewport} options.viewport - Reference to Viewer viewport. + * @param {Element} options.element - Parent element. + * @param {Number} [options.debugGridColor] - See debugGridColor in {@link OpenSeadragon.Options} for details. + */ +$.Drawer = function( options ) { + + $.console.assert( options.viewer, "[Drawer] options.viewer is required" ); + + //backward compatibility for positional args while preferring more + //idiomatic javascript options object as the only argument + var args = arguments; + + if( !$.isPlainObject( options ) ){ + options = { + source: args[ 0 ], // Reference to Viewer tile source. + viewport: args[ 1 ], // Reference to Viewer viewport. + element: args[ 2 ] // Parent element. + }; + } + + $.console.assert( options.viewport, "[Drawer] options.viewport is required" ); + $.console.assert( options.element, "[Drawer] options.element is required" ); + + if ( options.source ) { + $.console.error( "[Drawer] options.source is no longer accepted; use TiledImage instead" ); + } + + this.viewer = options.viewer; + this.viewport = options.viewport; + this.debugGridColor = typeof options.debugGridColor === 'string' ? [options.debugGridColor] : options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor; + if (options.opacity) { + $.console.error( "[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead" ); + } + + this.useCanvas = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true ); + /** + * The parent element of this Drawer instance, passed in when the Drawer was created. + * The parent of {@link OpenSeadragon.Drawer#canvas}. + * @member {Element} container + * @memberof OpenSeadragon.Drawer# + */ + this.container = $.getElement( options.element ); + /** + * A <canvas> element if the browser supports them, otherwise a <div> element. + * Child element of {@link OpenSeadragon.Drawer#container}. + * @member {Element} canvas + * @memberof OpenSeadragon.Drawer# + */ + this.canvas = $.makeNeutralElement( this.useCanvas ? "canvas" : "div" ); + /** + * 2d drawing context for {@link OpenSeadragon.Drawer#canvas} if it's a <canvas> element, otherwise null. + * @member {Object} context + * @memberof OpenSeadragon.Drawer# + */ + this.context = this.useCanvas ? this.canvas.getContext( "2d" ) : null; + + /** + * Sketch canvas used to temporarily draw tiles which cannot be drawn directly + * to the main canvas due to opacity. Lazily initialized. + */ + this.sketchCanvas = null; + this.sketchContext = null; + + /** + * @member {Element} element + * @memberof OpenSeadragon.Drawer# + * @deprecated Alias for {@link OpenSeadragon.Drawer#container}. + */ + this.element = this.container; + + // We force our container to ltr because our drawing math doesn't work in rtl. + // This issue only affects our canvas renderer, but we do it always for consistency. + // Note that this means overlays you want to be rtl need to be explicitly set to rtl. + this.container.dir = 'ltr'; + + // check canvas available width and height, set canvas width and height such that the canvas backing store is set to the proper pixel density + if (this.useCanvas) { + var viewportSize = this._calculateCanvasSize(); + this.canvas.width = viewportSize.x; + this.canvas.height = viewportSize.y; + } + + this.canvas.style.width = "100%"; + this.canvas.style.height = "100%"; + this.canvas.style.position = "absolute"; + $.setElementOpacity( this.canvas, this.opacity, true ); + // Allow pointer events to pass through the canvas element so implicit + // pointer capture works on touch devices + $.setElementPointerEventsNone( this.canvas ); + $.setElementTouchActionNone( this.canvas ); + + // explicit left-align + this.container.style.textAlign = "left"; + this.container.appendChild( this.canvas ); + + // Image smoothing for canvas rendering (only if canvas is used). + // Canvas default is "true", so this will only be changed if user specified "false". + this._imageSmoothingEnabled = true; +}; + +/** @lends OpenSeadragon.Drawer.prototype */ +$.Drawer.prototype = { + // deprecated + addOverlay: function( element, location, placement, onDraw ) { + $.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead."); + this.viewer.addOverlay( element, location, placement, onDraw ); + return this; + }, + + // deprecated + updateOverlay: function( element, location, placement ) { + $.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead."); + this.viewer.updateOverlay( element, location, placement ); + return this; + }, + + // deprecated + removeOverlay: function( element ) { + $.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead."); + this.viewer.removeOverlay( element ); + return this; + }, + + // deprecated + clearOverlays: function() { + $.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead."); + this.viewer.clearOverlays(); + return this; + }, + + /** + * This function converts the given point from to the drawer coordinate by + * multiplying it with the pixel density. + * This function does not take rotation into account, thus assuming provided + * point is at 0 degree. + * @param {OpenSeadragon.Point} point - the pixel point to convert + * @returns {OpenSeadragon.Point} Point in drawer coordinate system. + */ + viewportCoordToDrawerCoord: function(point) { + var vpPoint = this.viewport.pixelFromPointNoRotate(point, true); + return new $.Point( + vpPoint.x * $.pixelDensityRatio, + vpPoint.y * $.pixelDensityRatio + ); + }, + + /** + * This function will create multiple polygon paths on the drawing context by provided polygons, + * then clip the context to the paths. + * @param {OpenSeadragon.Point[][]} polygons - an array of polygons. A polygon is an array of OpenSeadragon.Point + * @param {Boolean} useSketch - Whether to use the sketch canvas or not. + */ + clipWithPolygons: function (polygons, useSketch) { + if (!this.useCanvas) { + return; + } + var context = this._getContext(useSketch); + context.beginPath(); + polygons.forEach(function (polygon) { + polygon.forEach(function (coord, i) { + context[i === 0 ? 'moveTo' : 'lineTo'](coord.x, coord.y); + }); + }); + context.clip(); + }, + + /** + * Set the opacity of the drawer. + * @param {Number} opacity + * @returns {OpenSeadragon.Drawer} Chainable. + */ + setOpacity: function( opacity ) { + $.console.error("drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead."); + var world = this.viewer.world; + for (var i = 0; i < world.getItemCount(); i++) { + world.getItemAt( i ).setOpacity( opacity ); + } + return this; + }, + + /** + * Get the opacity of the drawer. + * @returns {Number} + */ + getOpacity: function() { + $.console.error("drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead."); + var world = this.viewer.world; + var maxOpacity = 0; + for (var i = 0; i < world.getItemCount(); i++) { + var opacity = world.getItemAt( i ).getOpacity(); + if ( opacity > maxOpacity ) { + maxOpacity = opacity; + } + } + return maxOpacity; + }, + + // deprecated + needsUpdate: function() { + $.console.error( "[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead." ); + return this.viewer.world.needsDraw(); + }, + + // deprecated + numTilesLoaded: function() { + $.console.error( "[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead." ); + return this.viewer.tileCache.numTilesLoaded(); + }, + + // deprecated + reset: function() { + $.console.error( "[Drawer.reset] this function is deprecated. Use World.resetItems instead." ); + this.viewer.world.resetItems(); + return this; + }, + + // deprecated + update: function() { + $.console.error( "[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead." ); + this.clear(); + this.viewer.world.draw(); + return this; + }, + + /** + * @returns {Boolean} True if rotation is supported. + */ + canRotate: function() { + return this.useCanvas; + }, + + /** + * Destroy the drawer (unload current loaded tiles) + */ + destroy: function() { + //force unloading of current canvas (1x1 will be gc later, trick not necessarily needed) + this.canvas.width = 1; + this.canvas.height = 1; + this.sketchCanvas = null; + this.sketchContext = null; + }, + + /** + * Clears the Drawer so it's ready to draw another frame. + */ + clear: function() { + this.canvas.innerHTML = ""; + if ( this.useCanvas ) { + var viewportSize = this._calculateCanvasSize(); + if( this.canvas.width !== viewportSize.x || + this.canvas.height !== viewportSize.y ) { + this.canvas.width = viewportSize.x; + this.canvas.height = viewportSize.y; + this._updateImageSmoothingEnabled(this.context); + if ( this.sketchCanvas !== null ) { + var sketchCanvasSize = this._calculateSketchCanvasSize(); + this.sketchCanvas.width = sketchCanvasSize.x; + this.sketchCanvas.height = sketchCanvasSize.y; + this._updateImageSmoothingEnabled(this.sketchContext); + } + } + this._clear(); + } + }, + + _clear: function (useSketch, bounds) { + if (!this.useCanvas) { + return; + } + var context = this._getContext(useSketch); + if (bounds) { + context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height); + } else { + var canvas = context.canvas; + context.clearRect(0, 0, canvas.width, canvas.height); + } + }, + + /** + * Scale from OpenSeadragon viewer rectangle to drawer rectangle + * (ignoring rotation) + * @param {OpenSeadragon.Rect} rectangle - The rectangle in viewport coordinate system. + * @returns {OpenSeadragon.Rect} Rectangle in drawer coordinate system. + */ + viewportToDrawerRectangle: function(rectangle) { + var topLeft = this.viewport.pixelFromPointNoRotate(rectangle.getTopLeft(), true); + var size = this.viewport.deltaPixelsFromPointsNoRotate(rectangle.getSize(), true); + + return new $.Rect( + topLeft.x * $.pixelDensityRatio, + topLeft.y * $.pixelDensityRatio, + size.x * $.pixelDensityRatio, + size.y * $.pixelDensityRatio + ); + }, + + /** + * Draws the given tile. + * @param {OpenSeadragon.Tile} tile - The tile to draw. + * @param {Function} drawingHandler - Method for firing the drawing event if using canvas. + * drawingHandler({context, tile, rendered}) + * @param {Boolean} useSketch - Whether to use the sketch canvas or not. + * where rendered is the context with the pre-drawn image. + * @param {Float} [scale=1] - Apply a scale to tile position and size. Defaults to 1. + * @param {OpenSeadragon.Point} [translate] A translation vector to offset tile position + * @param {Boolean} [shouldRoundPositionAndSize] - Tells whether to round + * position and size of tiles supporting alpha channel in non-transparency + * context. + * @param {OpenSeadragon.TileSource} source - The source specification of the tile. + */ + drawTile: function( tile, drawingHandler, useSketch, scale, translate, shouldRoundPositionAndSize, source) { + $.console.assert(tile, '[Drawer.drawTile] tile is required'); + $.console.assert(drawingHandler, '[Drawer.drawTile] drawingHandler is required'); + + if (this.useCanvas) { + var context = this._getContext(useSketch); + scale = scale || 1; + tile.drawCanvas(context, drawingHandler, scale, translate, shouldRoundPositionAndSize, source); + } else { + tile.drawHTML( this.canvas ); + } + }, + + _getContext: function( useSketch ) { + var context = this.context; + if ( useSketch ) { + if (this.sketchCanvas === null) { + this.sketchCanvas = document.createElement( "canvas" ); + var sketchCanvasSize = this._calculateSketchCanvasSize(); + this.sketchCanvas.width = sketchCanvasSize.x; + this.sketchCanvas.height = sketchCanvasSize.y; + this.sketchContext = this.sketchCanvas.getContext( "2d" ); + + // If the viewport is not currently rotated, the sketchCanvas + // will have the same size as the main canvas. However, if + // the viewport get rotated later on, we will need to resize it. + if (this.viewport.getRotation() === 0) { + var self = this; + this.viewer.addHandler('rotate', function resizeSketchCanvas() { + if (self.viewport.getRotation() === 0) { + return; + } + self.viewer.removeHandler('rotate', resizeSketchCanvas); + var sketchCanvasSize = self._calculateSketchCanvasSize(); + self.sketchCanvas.width = sketchCanvasSize.x; + self.sketchCanvas.height = sketchCanvasSize.y; + }); + } + this._updateImageSmoothingEnabled(this.sketchContext); + } + context = this.sketchContext; + } + return context; + }, + + // private + saveContext: function( useSketch ) { + if (!this.useCanvas) { + return; + } + + this._getContext( useSketch ).save(); + }, + + // private + restoreContext: function( useSketch ) { + if (!this.useCanvas) { + return; + } + + this._getContext( useSketch ).restore(); + }, + + // private + setClip: function(rect, useSketch) { + if (!this.useCanvas) { + return; + } + + var context = this._getContext( useSketch ); + context.beginPath(); + context.rect(rect.x, rect.y, rect.width, rect.height); + context.clip(); + }, + + // private + drawRectangle: function(rect, fillStyle, useSketch) { + if (!this.useCanvas) { + return; + } + + var context = this._getContext( useSketch ); + context.save(); + context.fillStyle = fillStyle; + context.fillRect(rect.x, rect.y, rect.width, rect.height); + context.restore(); + }, + + /** + * Blends the sketch canvas in the main canvas. + * @param {Object} options The options + * @param {Float} options.opacity The opacity of the blending. + * @param {Float} [options.scale=1] The scale at which tiles were drawn on + * the sketch. Default is 1. + * Use scale to draw at a lower scale and then enlarge onto the main canvas. + * @param {OpenSeadragon.Point} [options.translate] A translation vector + * that was used to draw the tiles + * @param {String} [options.compositeOperation] - How the image is + * composited onto other images; see compositeOperation in + * {@link OpenSeadragon.Options} for possible values. + * @param {OpenSeadragon.Rect} [options.bounds] The part of the sketch + * canvas to blend in the main canvas. If specified, options.scale and + * options.translate get ignored. + */ + blendSketch: function(opacity, scale, translate, compositeOperation) { + var options = opacity; + if (!$.isPlainObject(options)) { + options = { + opacity: opacity, + scale: scale, + translate: translate, + compositeOperation: compositeOperation + }; + } + if (!this.useCanvas || !this.sketchCanvas) { + return; + } + opacity = options.opacity; + compositeOperation = options.compositeOperation; + var bounds = options.bounds; + + this.context.save(); + this.context.globalAlpha = opacity; + if (compositeOperation) { + this.context.globalCompositeOperation = compositeOperation; + } + if (bounds) { + // Internet Explorer, Microsoft Edge, and Safari have problems + // when you call context.drawImage with negative x or y + // or x + width or y + height greater than the canvas width or height respectively. + if (bounds.x < 0) { + bounds.width += bounds.x; + bounds.x = 0; + } + if (bounds.x + bounds.width > this.canvas.width) { + bounds.width = this.canvas.width - bounds.x; + } + if (bounds.y < 0) { + bounds.height += bounds.y; + bounds.y = 0; + } + if (bounds.y + bounds.height > this.canvas.height) { + bounds.height = this.canvas.height - bounds.y; + } + + this.context.drawImage( + this.sketchCanvas, + bounds.x, + bounds.y, + bounds.width, + bounds.height, + bounds.x, + bounds.y, + bounds.width, + bounds.height + ); + } else { + scale = options.scale || 1; + translate = options.translate; + var position = translate instanceof $.Point ? + translate : new $.Point(0, 0); + + var widthExt = 0; + var heightExt = 0; + if (translate) { + var widthDiff = this.sketchCanvas.width - this.canvas.width; + var heightDiff = this.sketchCanvas.height - this.canvas.height; + widthExt = Math.round(widthDiff / 2); + heightExt = Math.round(heightDiff / 2); + } + this.context.drawImage( + this.sketchCanvas, + position.x - widthExt * scale, + position.y - heightExt * scale, + (this.canvas.width + 2 * widthExt) * scale, + (this.canvas.height + 2 * heightExt) * scale, + -widthExt, + -heightExt, + this.canvas.width + 2 * widthExt, + this.canvas.height + 2 * heightExt + ); + } + this.context.restore(); + }, + + // private + drawDebugInfo: function(tile, count, i, tiledImage) { + if ( !this.useCanvas ) { + return; + } + + var colorIndex = this.viewer.world.getIndexOfItem(tiledImage) % this.debugGridColor.length; + var context = this.context; + context.save(); + context.lineWidth = 2 * $.pixelDensityRatio; + context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial'; + context.strokeStyle = this.debugGridColor[colorIndex]; + context.fillStyle = this.debugGridColor[colorIndex]; + + if (this.viewport.getRotation(true) % 360 !== 0 ) { + this._offsetForRotation({degrees: this.viewport.getRotation(true)}); + } + if (tiledImage.getRotation(true) % 360 !== 0) { + this._offsetForRotation({ + degrees: tiledImage.getRotation(true), + point: tiledImage.viewport.pixelFromPointNoRotate( + tiledImage._getRotationPoint(true), true) + }); + } + if (tiledImage.viewport.getRotation(true) % 360 === 0 && + tiledImage.getRotation(true) % 360 === 0) { + if(tiledImage._drawer.viewer.viewport.getFlip()) { + tiledImage._drawer._flip(); + } + } + + context.strokeRect( + tile.position.x * $.pixelDensityRatio, + tile.position.y * $.pixelDensityRatio, + tile.size.x * $.pixelDensityRatio, + tile.size.y * $.pixelDensityRatio + ); + + var tileCenterX = (tile.position.x + (tile.size.x / 2)) * $.pixelDensityRatio; + var tileCenterY = (tile.position.y + (tile.size.y / 2)) * $.pixelDensityRatio; + + // Rotate the text the right way around. + context.translate( tileCenterX, tileCenterY ); + context.rotate( Math.PI / 180 * -this.viewport.getRotation(true) ); + context.translate( -tileCenterX, -tileCenterY ); + + if( tile.x === 0 && tile.y === 0 ){ + context.fillText( + "Zoom: " + this.viewport.getZoom(), + tile.position.x * $.pixelDensityRatio, + (tile.position.y - 30) * $.pixelDensityRatio + ); + context.fillText( + "Pan: " + this.viewport.getBounds().toString(), + tile.position.x * $.pixelDensityRatio, + (tile.position.y - 20) * $.pixelDensityRatio + ); + } + context.fillText( + "Level: " + tile.level, + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 20) * $.pixelDensityRatio + ); + context.fillText( + "Column: " + tile.x, + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 30) * $.pixelDensityRatio + ); + context.fillText( + "Row: " + tile.y, + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 40) * $.pixelDensityRatio + ); + context.fillText( + "Order: " + i + " of " + count, + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 50) * $.pixelDensityRatio + ); + context.fillText( + "Size: " + tile.size.toString(), + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 60) * $.pixelDensityRatio + ); + context.fillText( + "Position: " + tile.position.toString(), + (tile.position.x + 10) * $.pixelDensityRatio, + (tile.position.y + 70) * $.pixelDensityRatio + ); + + if (this.viewport.getRotation(true) % 360 !== 0 ) { + this._restoreRotationChanges(); + } + if (tiledImage.getRotation(true) % 360 !== 0) { + this._restoreRotationChanges(); + } + + if (tiledImage.viewport.getRotation(true) % 360 === 0 && + tiledImage.getRotation(true) % 360 === 0) { + if(tiledImage._drawer.viewer.viewport.getFlip()) { + tiledImage._drawer._flip(); + } + } + + context.restore(); + }, + + // private + debugRect: function(rect) { + if ( this.useCanvas ) { + var context = this.context; + context.save(); + context.lineWidth = 2 * $.pixelDensityRatio; + context.strokeStyle = this.debugGridColor[0]; + context.fillStyle = this.debugGridColor[0]; + + context.strokeRect( + rect.x * $.pixelDensityRatio, + rect.y * $.pixelDensityRatio, + rect.width * $.pixelDensityRatio, + rect.height * $.pixelDensityRatio + ); + + context.restore(); + } + }, + + /** + * Turns image smoothing on or off for this viewer. Note: Ignored in some (especially older) browsers that do not support this property. + * + * @function + * @param {Boolean} [imageSmoothingEnabled] - Whether or not the image is + * drawn smoothly on the canvas; see imageSmoothingEnabled in + * {@link OpenSeadragon.Options} for more explanation. + */ + setImageSmoothingEnabled: function(imageSmoothingEnabled){ + if ( this.useCanvas ) { + this._imageSmoothingEnabled = imageSmoothingEnabled; + this._updateImageSmoothingEnabled(this.context); + this.viewer.forceRedraw(); + } + }, + + // private + _updateImageSmoothingEnabled: function(context){ + context.msImageSmoothingEnabled = this._imageSmoothingEnabled; + context.imageSmoothingEnabled = this._imageSmoothingEnabled; + }, + + /** + * Get the canvas size + * @param {Boolean} sketch If set to true return the size of the sketch canvas + * @returns {OpenSeadragon.Point} The size of the canvas + */ + getCanvasSize: function(sketch) { + var canvas = this._getContext(sketch).canvas; + return new $.Point(canvas.width, canvas.height); + }, + + getCanvasCenter: function() { + return new $.Point(this.canvas.width / 2, this.canvas.height / 2); + }, + + // private + _offsetForRotation: function(options) { + var point = options.point ? + options.point.times($.pixelDensityRatio) : + this.getCanvasCenter(); + + var context = this._getContext(options.useSketch); + context.save(); + + context.translate(point.x, point.y); + if(this.viewer.viewport.flipped){ + context.rotate(Math.PI / 180 * -options.degrees); + context.scale(-1, 1); + } else{ + context.rotate(Math.PI / 180 * options.degrees); + } + context.translate(-point.x, -point.y); + }, + + // private + _flip: function(options) { + options = options || {}; + var point = options.point ? + options.point.times($.pixelDensityRatio) : + this.getCanvasCenter(); + var context = this._getContext(options.useSketch); + + context.translate(point.x, 0); + context.scale(-1, 1); + context.translate(-point.x, 0); + }, + + // private + _restoreRotationChanges: function(useSketch) { + var context = this._getContext(useSketch); + context.restore(); + }, + + // private + _calculateCanvasSize: function() { + var pixelDensityRatio = $.pixelDensityRatio; + var viewportSize = this.viewport.getContainerSize(); + return { + // canvas width and height are integers + x: Math.round(viewportSize.x * pixelDensityRatio), + y: Math.round(viewportSize.y * pixelDensityRatio) + }; + }, + + // private + _calculateSketchCanvasSize: function() { + var canvasSize = this._calculateCanvasSize(); + if (this.viewport.getRotation() === 0) { + return canvasSize; + } + // If the viewport is rotated, we need a larger sketch canvas in order + // to support edge smoothing. + var sketchCanvasSize = Math.ceil(Math.sqrt( + canvasSize.x * canvasSize.x + + canvasSize.y * canvasSize.y)); + return { + x: sketchCanvasSize, + y: sketchCanvasSize + }; + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - Viewport + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + + +/** + * @class Viewport + * @memberof OpenSeadragon + * @classdesc Handles coordinate-related functionality (zoom, pan, rotation, etc.) + * for an {@link OpenSeadragon.Viewer}. + * @param {Object} options - Options for this Viewport. + * @param {Object} [options.margins] - See viewportMargins in {@link OpenSeadragon.Options}. + * @param {Number} [options.springStiffness] - See springStiffness in {@link OpenSeadragon.Options}. + * @param {Number} [options.animationTime] - See animationTime in {@link OpenSeadragon.Options}. + * @param {Number} [options.minZoomImageRatio] - See minZoomImageRatio in {@link OpenSeadragon.Options}. + * @param {Number} [options.maxZoomPixelRatio] - See maxZoomPixelRatio in {@link OpenSeadragon.Options}. + * @param {Number} [options.visibilityRatio] - See visibilityRatio in {@link OpenSeadragon.Options}. + * @param {Boolean} [options.wrapHorizontal] - See wrapHorizontal in {@link OpenSeadragon.Options}. + * @param {Boolean} [options.wrapVertical] - See wrapVertical in {@link OpenSeadragon.Options}. + * @param {Number} [options.defaultZoomLevel] - See defaultZoomLevel in {@link OpenSeadragon.Options}. + * @param {Number} [options.minZoomLevel] - See minZoomLevel in {@link OpenSeadragon.Options}. + * @param {Number} [options.maxZoomLevel] - See maxZoomLevel in {@link OpenSeadragon.Options}. + * @param {Number} [options.degrees] - See degrees in {@link OpenSeadragon.Options}. + * @param {Boolean} [options.homeFillsViewer] - See homeFillsViewer in {@link OpenSeadragon.Options}. + * @param {Boolean} [options.silenceMultiImageWarnings] - See silenceMultiImageWarnings in {@link OpenSeadragon.Options}. + */ +$.Viewport = function( options ) { + + //backward compatibility for positional args while preferring more + //idiomatic javascript options object as the only argument + var args = arguments; + if (args.length && args[0] instanceof $.Point) { + options = { + containerSize: args[0], + contentSize: args[1], + config: args[2] + }; + } + + //options.config and the general config argument are deprecated + //in favor of the more direct specification of optional settings + //being passed directly on the options object + if ( options.config ){ + $.extend( true, options, options.config ); + delete options.config; + } + + this._margins = $.extend({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, options.margins || {}); + + delete options.margins; + + options.initialDegrees = options.degrees; + delete options.degrees; + + $.extend( true, this, { + + //required settings + containerSize: null, + contentSize: null, + + //internal state properties + zoomPoint: null, + rotationPivot: null, + viewer: null, + + //configurable options + springStiffness: $.DEFAULT_SETTINGS.springStiffness, + animationTime: $.DEFAULT_SETTINGS.animationTime, + minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio, + maxZoomPixelRatio: $.DEFAULT_SETTINGS.maxZoomPixelRatio, + visibilityRatio: $.DEFAULT_SETTINGS.visibilityRatio, + wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal, + wrapVertical: $.DEFAULT_SETTINGS.wrapVertical, + defaultZoomLevel: $.DEFAULT_SETTINGS.defaultZoomLevel, + minZoomLevel: $.DEFAULT_SETTINGS.minZoomLevel, + maxZoomLevel: $.DEFAULT_SETTINGS.maxZoomLevel, + initialDegrees: $.DEFAULT_SETTINGS.degrees, + flipped: $.DEFAULT_SETTINGS.flipped, + homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer, + silenceMultiImageWarnings: $.DEFAULT_SETTINGS.silenceMultiImageWarnings + + }, options ); + + this._updateContainerInnerSize(); + + this.centerSpringX = new $.Spring({ + initial: 0, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + this.centerSpringY = new $.Spring({ + initial: 0, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + this.zoomSpring = new $.Spring({ + exponential: true, + initial: 1, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this.degreesSpring = new $.Spring({ + initial: options.initialDegrees, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._oldCenterX = this.centerSpringX.current.value; + this._oldCenterY = this.centerSpringY.current.value; + this._oldZoom = this.zoomSpring.current.value; + this._oldDegrees = this.degreesSpring.current.value; + + this._setContentBounds(new $.Rect(0, 0, 1, 1), 1); + + this.goHome(true); + this.update(); +}; + +/** @lends OpenSeadragon.Viewport.prototype */ +$.Viewport.prototype = { + + // deprecated + get degrees () { + $.console.warn('Accessing [Viewport.degrees] is deprecated. Use viewport.getRotation instead.'); + return this.getRotation(); + }, + + // deprecated + set degrees (degrees) { + $.console.warn('Setting [Viewport.degrees] is deprecated. Use viewport.rotateTo, viewport.rotateBy, or viewport.setRotation instead.'); + this.rotateTo(degrees); + }, + + /** + * Updates the viewport's home bounds and constraints for the given content size. + * @function + * @param {OpenSeadragon.Point} contentSize - size of the content in content units + * @returns {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:reset-size + */ + resetContentSize: function(contentSize) { + $.console.assert(contentSize, "[Viewport.resetContentSize] contentSize is required"); + $.console.assert(contentSize instanceof $.Point, "[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point"); + $.console.assert(contentSize.x > 0, "[Viewport.resetContentSize] contentSize.x must be greater than 0"); + $.console.assert(contentSize.y > 0, "[Viewport.resetContentSize] contentSize.y must be greater than 0"); + + this._setContentBounds(new $.Rect(0, 0, 1, contentSize.y / contentSize.x), contentSize.x); + return this; + }, + + // deprecated + setHomeBounds: function(bounds, contentFactor) { + $.console.error("[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually."); + this._setContentBounds(bounds, contentFactor); + }, + + // Set the viewport's content bounds + // @param {OpenSeadragon.Rect} bounds - the new bounds in viewport coordinates + // without rotation + // @param {Number} contentFactor - how many content units per viewport unit + // @fires OpenSeadragon.Viewer.event:reset-size + // @private + _setContentBounds: function(bounds, contentFactor) { + $.console.assert(bounds, "[Viewport._setContentBounds] bounds is required"); + $.console.assert(bounds instanceof $.Rect, "[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect"); + $.console.assert(bounds.width > 0, "[Viewport._setContentBounds] bounds.width must be greater than 0"); + $.console.assert(bounds.height > 0, "[Viewport._setContentBounds] bounds.height must be greater than 0"); + + this._contentBoundsNoRotate = bounds.clone(); + this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times( + contentFactor); + + this._contentBounds = bounds.rotate(this.getRotation()).getBoundingBox(); + this._contentSize = this._contentBounds.getSize().times(contentFactor); + this._contentAspectRatio = this._contentSize.x / this._contentSize.y; + + if (this.viewer) { + /** + * Raised when the viewer's content size or home bounds are reset + * (see {@link OpenSeadragon.Viewport#resetContentSize}). + * + * @event reset-size + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.Point} contentSize + * @property {OpenSeadragon.Rect} contentBounds - Content bounds. + * @property {OpenSeadragon.Rect} homeBounds - Content bounds. + * Deprecated use contentBounds instead. + * @property {Number} contentFactor + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('reset-size', { + contentSize: this._contentSizeNoRotate.clone(), + contentFactor: contentFactor, + homeBounds: this._contentBoundsNoRotate.clone(), + contentBounds: this._contentBounds.clone() + }); + } + }, + + /** + * Returns the home zoom in "viewport zoom" value. + * @function + * @returns {Number} The home zoom in "viewport zoom". + */ + getHomeZoom: function() { + if (this.defaultZoomLevel) { + return this.defaultZoomLevel; + } + + var aspectFactor = this._contentAspectRatio / this.getAspectRatio(); + var output; + if (this.homeFillsViewer) { // fill the viewer and clip the image + output = aspectFactor >= 1 ? aspectFactor : 1; + } else { + output = aspectFactor >= 1 ? 1 : aspectFactor; + } + + return output / this._contentBounds.width; + }, + + /** + * Returns the home bounds in viewport coordinates. + * @function + * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates. + */ + getHomeBounds: function() { + return this.getHomeBoundsNoRotate().rotate(-this.getRotation()); + }, + + /** + * Returns the home bounds in viewport coordinates. + * This method ignores the viewport rotation. Use + * {@link OpenSeadragon.Viewport#getHomeBounds} to take it into account. + * @function + * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates. + */ + getHomeBoundsNoRotate: function() { + var center = this._contentBounds.getCenter(); + var width = 1.0 / this.getHomeZoom(); + var height = width / this.getAspectRatio(); + + return new $.Rect( + center.x - (width / 2.0), + center.y - (height / 2.0), + width, + height + ); + }, + + /** + * @function + * @param {Boolean} immediately + * @fires OpenSeadragon.Viewer.event:home + */ + goHome: function(immediately) { + if (this.viewer) { + /** + * Raised when the "home" operation occurs (see {@link OpenSeadragon.Viewport#goHome}). + * + * @event home + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {Boolean} immediately + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('home', { + immediately: immediately + }); + } + return this.fitBounds(this.getHomeBounds(), immediately); + }, + + /** + * @function + */ + getMinZoom: function() { + var homeZoom = this.getHomeZoom(), + zoom = this.minZoomLevel ? + this.minZoomLevel : + this.minZoomImageRatio * homeZoom; + + return zoom; + }, + + /** + * @function + */ + getMaxZoom: function() { + var zoom = this.maxZoomLevel; + if (!zoom) { + zoom = this._contentSize.x * this.maxZoomPixelRatio / this._containerInnerSize.x; + zoom /= this._contentBounds.width; + } + + return Math.max( zoom, this.getHomeZoom() ); + }, + + /** + * @function + */ + getAspectRatio: function() { + return this._containerInnerSize.x / this._containerInnerSize.y; + }, + + /** + * @function + * @returns {OpenSeadragon.Point} The size of the container, in screen coordinates. + */ + getContainerSize: function() { + return new $.Point( + this.containerSize.x, + this.containerSize.y + ); + }, + + /** + * The margins push the "home" region in from the sides by the specified amounts. + * @function + * @returns {Object} Properties (Numbers, in screen coordinates): left, top, right, bottom. + */ + getMargins: function() { + return $.extend({}, this._margins); // Make a copy so we are not returning our original + }, + + /** + * The margins push the "home" region in from the sides by the specified amounts. + * @function + * @param {Object} margins - Properties (Numbers, in screen coordinates): left, top, right, bottom. + */ + setMargins: function(margins) { + $.console.assert($.type(margins) === 'object', '[Viewport.setMargins] margins must be an object'); + + this._margins = $.extend({ + left: 0, + top: 0, + right: 0, + bottom: 0 + }, margins); + + this._updateContainerInnerSize(); + if (this.viewer) { + this.viewer.forceRedraw(); + } + }, + + /** + * Returns the bounds of the visible area in viewport coordinates. + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates. + */ + getBounds: function(current) { + return this.getBoundsNoRotate(current).rotate(-this.getRotation(current)); + }, + + /** + * Returns the bounds of the visible area in viewport coordinates. + * This method ignores the viewport rotation. Use + * {@link OpenSeadragon.Viewport#getBounds} to take it into account. + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates. + */ + getBoundsNoRotate: function(current) { + var center = this.getCenter(current); + var width = 1.0 / this.getZoom(current); + var height = width / this.getAspectRatio(); + + return new $.Rect( + center.x - (width / 2.0), + center.y - (height / 2.0), + width, + height + ); + }, + + /** + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, + * including the space taken by margins, in viewport coordinates. + */ + getBoundsWithMargins: function(current) { + return this.getBoundsNoRotateWithMargins(current).rotate( + -this.getRotation(current), this.getCenter(current)); + }, + + /** + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, + * including the space taken by margins, in viewport coordinates. + */ + getBoundsNoRotateWithMargins: function(current) { + var bounds = this.getBoundsNoRotate(current); + var factor = this._containerInnerSize.x * this.getZoom(current); + bounds.x -= this._margins.left / factor; + bounds.y -= this._margins.top / factor; + bounds.width += (this._margins.left + this._margins.right) / factor; + bounds.height += (this._margins.top + this._margins.bottom) / factor; + return bounds; + }, + + /** + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + */ + getCenter: function( current ) { + var centerCurrent = new $.Point( + this.centerSpringX.current.value, + this.centerSpringY.current.value + ), + centerTarget = new $.Point( + this.centerSpringX.target.value, + this.centerSpringY.target.value + ), + oldZoomPixel, + zoom, + width, + height, + bounds, + newZoomPixel, + deltaZoomPixels, + deltaZoomPoints; + + if ( current ) { + return centerCurrent; + } else if ( !this.zoomPoint ) { + return centerTarget; + } + + oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true); + + zoom = this.getZoom(); + width = 1.0 / zoom; + height = width / this.getAspectRatio(); + bounds = new $.Rect( + centerCurrent.x - width / 2.0, + centerCurrent.y - height / 2.0, + width, + height + ); + + newZoomPixel = this._pixelFromPoint(this.zoomPoint, bounds); + deltaZoomPixels = newZoomPixel.minus( oldZoomPixel ).rotate(-this.getRotation(true)); + deltaZoomPoints = deltaZoomPixels.divide( this._containerInnerSize.x * zoom ); + + return centerTarget.plus( deltaZoomPoints ); + }, + + /** + * @function + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + */ + getZoom: function( current ) { + if ( current ) { + return this.zoomSpring.current.value; + } else { + return this.zoomSpring.target.value; + } + }, + + // private + _applyZoomConstraints: function(zoom) { + return Math.max( + Math.min(zoom, this.getMaxZoom()), + this.getMinZoom()); + }, + + /** + * @function + * @private + * @param {OpenSeadragon.Rect} bounds + * @returns {OpenSeadragon.Rect} constrained bounds. + */ + _applyBoundaryConstraints: function(bounds) { + var newBounds = this.viewportToViewerElementRectangle(bounds).getBoundingBox(); + var cb = this.viewportToViewerElementRectangle(this._contentBoundsNoRotate).getBoundingBox(); + + var xConstrained = false; + var yConstrained = false; + + if (this.wrapHorizontal) { + //do nothing + } else { + var boundsRight = newBounds.x + newBounds.width; + var contentRight = cb.x + cb.width; + + var horizontalThreshold, leftDx, rightDx; + if (newBounds.width > cb.width) { + horizontalThreshold = this.visibilityRatio * cb.width; + } else { + horizontalThreshold = this.visibilityRatio * newBounds.width; + } + + leftDx = cb.x - boundsRight + horizontalThreshold; + rightDx = contentRight - newBounds.x - horizontalThreshold; + if (horizontalThreshold > cb.width) { + newBounds.x += (leftDx + rightDx) / 2; + xConstrained = true; + } else if (rightDx < 0) { + newBounds.x += rightDx; + xConstrained = true; + } else if (leftDx > 0) { + newBounds.x += leftDx; + xConstrained = true; + } + + } + + if (this.wrapVertical) { + //do nothing + } else { + var boundsBottom = newBounds.y + newBounds.height; + var contentBottom = cb.y + cb.height; + + var verticalThreshold, topDy, bottomDy; + if (newBounds.height > cb.height) { + verticalThreshold = this.visibilityRatio * cb.height; + } else{ + verticalThreshold = this.visibilityRatio * newBounds.height; + } + + topDy = cb.y - boundsBottom + verticalThreshold; + bottomDy = contentBottom - newBounds.y - verticalThreshold; + if (verticalThreshold > cb.height) { + newBounds.y += (topDy + bottomDy) / 2; + yConstrained = true; + } else if (bottomDy < 0) { + newBounds.y += bottomDy; + yConstrained = true; + } else if (topDy > 0) { + newBounds.y += topDy; + yConstrained = true; + } + + } + + var constraintApplied = xConstrained || yConstrained; + var newViewportBounds = constraintApplied ? this.viewerElementToViewportRectangle(newBounds) : bounds.clone(); + newViewportBounds.xConstrained = xConstrained; + newViewportBounds.yConstrained = yConstrained; + newViewportBounds.constraintApplied = constraintApplied; + + return newViewportBounds; + }, + + /** + * @function + * @private + * @param {Boolean} [immediately=false] - whether the function that triggered this event was + * called with the "immediately" flag + */ + _raiseConstraintsEvent: function(immediately) { + if (this.viewer) { + /** + * Raised when the viewport constraints are applied (see {@link OpenSeadragon.Viewport#applyConstraints}). + * + * @event constrain + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {Boolean} immediately - whether the function that triggered this event was + * called with the "immediately" flag + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'constrain', { + immediately: immediately + }); + } + }, + + /** + * Enforces the minZoom, maxZoom and visibilityRatio constraints by + * zooming and panning to the closest acceptable zoom and location. + * @function + * @param {Boolean} [immediately=false] + * @returns {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:constrain if constraints were applied + */ + applyConstraints: function(immediately) { + var actualZoom = this.getZoom(); + var constrainedZoom = this._applyZoomConstraints(actualZoom); + + if (actualZoom !== constrainedZoom) { + this.zoomTo(constrainedZoom, this.zoomPoint, immediately); + } + + var constrainedBounds = this.getConstrainedBounds(false); + + if(constrainedBounds.constraintApplied){ + this.fitBounds(constrainedBounds, immediately); + this._raiseConstraintsEvent(immediately); + } + + return this; + }, + + /** + * Equivalent to {@link OpenSeadragon.Viewport#applyConstraints} + * @function + * @param {Boolean} [immediately=false] + * @returns {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:constrain + */ + ensureVisible: function(immediately) { + return this.applyConstraints(immediately); + }, + + /** + * @function + * @private + * @param {OpenSeadragon.Rect} bounds + * @param {Object} options (immediately=false, constraints=false) + * @returns {OpenSeadragon.Viewport} Chainable. + */ + _fitBounds: function(bounds, options) { + options = options || {}; + var immediately = options.immediately || false; + var constraints = options.constraints || false; + + var aspect = this.getAspectRatio(); + var center = bounds.getCenter(); + + // Compute width and height of bounding box. + var newBounds = new $.Rect( + bounds.x, + bounds.y, + bounds.width, + bounds.height, + bounds.degrees + this.getRotation()) + .getBoundingBox(); + + if (newBounds.getAspectRatio() >= aspect) { + newBounds.height = newBounds.width / aspect; + } else { + newBounds.width = newBounds.height * aspect; + } + + // Compute x and y from width, height and center position + newBounds.x = center.x - newBounds.width / 2; + newBounds.y = center.y - newBounds.height / 2; + var newZoom = 1.0 / newBounds.width; + + if (immediately) { + this.panTo(center, true); + this.zoomTo(newZoom, null, true); + if(constraints){ + this.applyConstraints(true); + } + return this; + } + + var currentCenter = this.getCenter(true); + var currentZoom = this.getZoom(true); + this.panTo(currentCenter, true); + this.zoomTo(currentZoom, null, true); + + var oldBounds = this.getBounds(); + var oldZoom = this.getZoom(); + + if (oldZoom === 0 || Math.abs(newZoom / oldZoom - 1) < 0.00000001) { + this.zoomTo(newZoom, null, true); + this.panTo(center, immediately); + if(constraints){ + this.applyConstraints(false); + } + return this; + } + + if(constraints){ + this.panTo(center, false); + + newZoom = this._applyZoomConstraints(newZoom); + this.zoomTo(newZoom, null, false); + + var constrainedBounds = this.getConstrainedBounds(); + + this.panTo(currentCenter, true); + this.zoomTo(currentZoom, null, true); + + this.fitBounds(constrainedBounds); + } else { + var rotatedNewBounds = newBounds.rotate(-this.getRotation()); + var referencePoint = rotatedNewBounds.getTopLeft().times(newZoom) + .minus(oldBounds.getTopLeft().times(oldZoom)) + .divide(newZoom - oldZoom); + + this.zoomTo(newZoom, referencePoint, immediately); + } + return this; + }, + + /** + * Makes the viewport zoom and pan so that the specified bounds take + * as much space as possible in the viewport. + * Note: this method ignores the constraints (minZoom, maxZoom and + * visibilityRatio). + * Use {@link OpenSeadragon.Viewport#fitBoundsWithConstraints} to enforce + * them. + * @function + * @param {OpenSeadragon.Rect} bounds + * @param {Boolean} [immediately=false] + * @returns {OpenSeadragon.Viewport} Chainable. + */ + fitBounds: function(bounds, immediately) { + return this._fitBounds(bounds, { + immediately: immediately, + constraints: false + }); + }, + + /** + * Makes the viewport zoom and pan so that the specified bounds take + * as much space as possible in the viewport while enforcing the constraints + * (minZoom, maxZoom and visibilityRatio). + * Note: because this method enforces the constraints, part of the + * provided bounds may end up outside of the viewport. + * Use {@link OpenSeadragon.Viewport#fitBounds} to ignore them. + * @function + * @param {OpenSeadragon.Rect} bounds + * @param {Boolean} [immediately=false] + * @returns {OpenSeadragon.Viewport} Chainable. + */ + fitBoundsWithConstraints: function(bounds, immediately) { + return this._fitBounds(bounds, { + immediately: immediately, + constraints: true + }); + }, + + /** + * Zooms so the image just fills the viewer vertically. + * @param {Boolean} immediately + * @returns {OpenSeadragon.Viewport} Chainable. + */ + fitVertically: function(immediately) { + var box = new $.Rect( + this._contentBounds.x + (this._contentBounds.width / 2), + this._contentBounds.y, + 0, + this._contentBounds.height); + return this.fitBounds(box, immediately); + }, + + /** + * Zooms so the image just fills the viewer horizontally. + * @param {Boolean} immediately + * @returns {OpenSeadragon.Viewport} Chainable. + */ + fitHorizontally: function(immediately) { + var box = new $.Rect( + this._contentBounds.x, + this._contentBounds.y + (this._contentBounds.height / 2), + this._contentBounds.width, + 0); + return this.fitBounds(box, immediately); + }, + + + /** + * Returns bounds taking constraints into account + * Added to improve constrained panning + * @param {Boolean} current - Pass true for the current location; defaults to false (target location). + * @returns {OpenSeadragon.Rect} The bounds in viewport coordinates after applying constraints. The returned $.Rect + * contains additional properties constraintsApplied, xConstrained and yConstrained. + * These flags indicate whether the viewport bounds were modified by the constraints + * of the viewer rectangle, and in which dimension(s). + */ + getConstrainedBounds: function(current) { + var bounds, + constrainedBounds; + + bounds = this.getBounds(current); + + constrainedBounds = this._applyBoundaryConstraints(bounds); + + return constrainedBounds; + }, + + /** + * @function + * @param {OpenSeadragon.Point} delta + * @param {Boolean} immediately + * @returns {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:pan + */ + panBy: function( delta, immediately ) { + var center = new $.Point( + this.centerSpringX.target.value, + this.centerSpringY.target.value + ); + return this.panTo( center.plus( delta ), immediately ); + }, + + /** + * @function + * @param {OpenSeadragon.Point} center + * @param {Boolean} immediately + * @returns {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:pan + */ + panTo: function( center, immediately ) { + if ( immediately ) { + this.centerSpringX.resetTo( center.x ); + this.centerSpringY.resetTo( center.y ); + } else { + this.centerSpringX.springTo( center.x ); + this.centerSpringY.springTo( center.y ); + } + + if( this.viewer ){ + /** + * Raised when the viewport is panned (see {@link OpenSeadragon.Viewport#panBy} and {@link OpenSeadragon.Viewport#panTo}). + * + * @event pan + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.Point} center + * @property {Boolean} immediately + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'pan', { + center: center, + immediately: immediately + }); + } + + return this; + }, + + /** + * @function + * @returns {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:zoom + */ + zoomBy: function(factor, refPoint, immediately) { + return this.zoomTo( + this.zoomSpring.target.value * factor, refPoint, immediately); + }, + + /** + * Zooms to the specified zoom level + * @function + * @param {Number} zoom The zoom level to zoom to. + * @param {OpenSeadragon.Point} [refPoint] The point which will stay at + * the same screen location. Defaults to the viewport center. + * @param {Boolean} [immediately=false] + * @returns {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:zoom + */ + zoomTo: function(zoom, refPoint, immediately) { + var _this = this; + + this.zoomPoint = refPoint instanceof $.Point && + !isNaN(refPoint.x) && + !isNaN(refPoint.y) ? + refPoint : + null; + + if (immediately) { + this._adjustCenterSpringsForZoomPoint(function() { + _this.zoomSpring.resetTo(zoom); + }); + } else { + this.zoomSpring.springTo(zoom); + } + + if (this.viewer) { + /** + * Raised when the viewport zoom level changes (see {@link OpenSeadragon.Viewport#zoomBy} and {@link OpenSeadragon.Viewport#zoomTo}). + * + * @event zoom + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {Number} zoom + * @property {OpenSeadragon.Point} refPoint + * @property {Boolean} immediately + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('zoom', { + zoom: zoom, + refPoint: refPoint, + immediately: immediately + }); + } + + return this; + }, + + /** + * Rotates this viewport to the angle specified. + * @function + * @param {Number} degrees The degrees to set the rotation to. + * @param {Boolean} [immediately=false] Whether to animate to the new angle + * or rotate immediately. + * * @returns {OpenSeadragon.Viewport} Chainable. + */ + setRotation: function(degrees, immediately) { + return this.rotateTo(degrees, null, immediately); + }, + + /** + * Gets the current rotation in degrees. + * @function + * @param {Boolean} [current=false] True for current rotation, false for target. + * @returns {Number} The current rotation in degrees. + */ + getRotation: function(current) { + return current ? + this.degreesSpring.current.value : + this.degreesSpring.target.value; + }, + + /** + * Rotates this viewport to the angle specified around a pivot point. Alias for rotateTo. + * @function + * @param {Number} degrees The degrees to set the rotation to. + * @param {OpenSeadragon.Point} [pivot] (Optional) point in viewport coordinates + * around which the rotation should be performed. Defaults to the center of the viewport. + * @param {Boolean} [immediately=false] Whether to animate to the new angle + * or rotate immediately. + * * @returns {OpenSeadragon.Viewport} Chainable. + */ + setRotationWithPivot: function(degrees, pivot, immediately) { + return this.rotateTo(degrees, pivot, immediately); + }, + + /** + * Rotates this viewport to the angle specified. + * @function + * @param {Number} degrees The degrees to set the rotation to. + * @param {OpenSeadragon.Point} [pivot] (Optional) point in viewport coordinates + * around which the rotation should be performed. Defaults to the center of the viewport. + * @param {Boolean} [immediately=false] Whether to animate to the new angle + * or rotate immediately. + * @returns {OpenSeadragon.Viewport} Chainable. + */ + rotateTo: function(degrees, pivot, immediately){ + if (!this.viewer || !this.viewer.drawer.canRotate()) { + return this; + } + + if (this.degreesSpring.target.value === degrees && + this.degreesSpring.isAtTargetValue()) { + return this; + } + this.rotationPivot = pivot instanceof $.Point && + !isNaN(pivot.x) && + !isNaN(pivot.y) ? + pivot : + null; + if (immediately) { + if(this.rotationPivot){ + var changeInDegrees = degrees - this._oldDegrees; + if(!changeInDegrees){ + this.rotationPivot = null; + return this; + } + this._rotateAboutPivot(degrees); + } else{ + this.degreesSpring.resetTo(degrees); + } + } else { + var normalizedFrom = $.positiveModulo(this.degreesSpring.current.value, 360); + var normalizedTo = $.positiveModulo(degrees, 360); + var diff = normalizedTo - normalizedFrom; + if (diff > 180) { + normalizedTo -= 360; + } else if (diff < -180) { + normalizedTo += 360; + } + + var reverseDiff = normalizedFrom - normalizedTo; + this.degreesSpring.resetTo(degrees + reverseDiff); + this.degreesSpring.springTo(degrees); + } + + this._setContentBounds( + this.viewer.world.getHomeBounds(), + this.viewer.world.getContentFactor()); + this.viewer.forceRedraw(); + + /** + * Raised when rotation has been changed. + * + * @event rotate + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Number} degrees - The number of degrees the rotation was set to. + * @property {Boolean} immediately - Whether the rotation happened immediately or was animated + * @property {OpenSeadragon.Point} pivot - The point in viewport coordinates around which the rotation (if any) happened + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('rotate', {degrees: degrees, immediately: !!immediately, pivot: this.rotationPivot || this.getCenter()}); + return this; + }, + + /** + * Rotates this viewport by the angle specified. + * @function + * @param {Number} degrees The degrees by which to rotate the viewport. + * @param {OpenSeadragon.Point} [pivot] (Optional) point in viewport coordinates + * around which the rotation should be performed. Defaults to the center of the viewport. + * * @param {Boolean} [immediately=false] Whether to animate to the new angle + * or rotate immediately. + * @returns {OpenSeadragon.Viewport} Chainable. + */ + rotateBy: function(degrees, pivot, immediately){ + return this.rotateTo(this.degreesSpring.target.value + degrees, pivot, immediately); + }, + + /** + * @function + * @returns {OpenSeadragon.Viewport} Chainable. + * @fires OpenSeadragon.Viewer.event:resize + */ + resize: function( newContainerSize, maintain ) { + var oldBounds = this.getBoundsNoRotate(), + newBounds = oldBounds, + widthDeltaFactor; + + this.containerSize.x = newContainerSize.x; + this.containerSize.y = newContainerSize.y; + + this._updateContainerInnerSize(); + + if ( maintain ) { + // TODO: widthDeltaFactor will always be 1; probably not what's intended + widthDeltaFactor = newContainerSize.x / this.containerSize.x; + newBounds.width = oldBounds.width * widthDeltaFactor; + newBounds.height = newBounds.width / this.getAspectRatio(); + } + + if( this.viewer ){ + /** + * Raised when a viewer resize operation is initiated (see {@link OpenSeadragon.Viewport#resize}). + * This event happens before the viewport bounds have been updated. + * See also {@link OpenSeadragon.Viewer#after-resize} which reflects + * the new viewport bounds following the resize action. + * + * @event resize + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.Point} newContainerSize + * @property {Boolean} maintain + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'resize', { + newContainerSize: newContainerSize, + maintain: maintain + }); + } + + var output = this.fitBounds( newBounds, true ); + + if( this.viewer ){ + /** + * Raised after the viewer is resized (see {@link OpenSeadragon.Viewport#resize}). + * See also {@link OpenSeadragon.Viewer#resize} event which happens + * before the new bounds have been calculated and applied. + * + * @event after-resize + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event. + * @property {OpenSeadragon.Point} newContainerSize + * @property {Boolean} maintain + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'after-resize', { + newContainerSize: newContainerSize, + maintain: maintain + }); + } + + return output; + }, + + // private + _updateContainerInnerSize: function() { + this._containerInnerSize = new $.Point( + Math.max(1, this.containerSize.x - (this._margins.left + this._margins.right)), + Math.max(1, this.containerSize.y - (this._margins.top + this._margins.bottom)) + ); + }, + + /** + * Update the zoom, degrees, and center (X and Y) springs. + * @function + * @returns {Boolean} True if any change has been made, false otherwise. + */ + update: function() { + var _this = this; + this._adjustCenterSpringsForZoomPoint(function() { + _this.zoomSpring.update(); + }); + if(this.degreesSpring.isAtTargetValue()){ + this.rotationPivot = null; + } + this.centerSpringX.update(); + this.centerSpringY.update(); + + if(this.rotationPivot){ + this._rotateAboutPivot(true); + } + else{ + this.degreesSpring.update(); + } + + + var changed = this.centerSpringX.current.value !== this._oldCenterX || + this.centerSpringY.current.value !== this._oldCenterY || + this.zoomSpring.current.value !== this._oldZoom || + this.degreesSpring.current.value !== this._oldDegrees; + + + this._oldCenterX = this.centerSpringX.current.value; + this._oldCenterY = this.centerSpringY.current.value; + this._oldZoom = this.zoomSpring.current.value; + this._oldDegrees = this.degreesSpring.current.value; + + return changed; + }, + + // private - pass true to use spring, or a number for degrees for immediate rotation + _rotateAboutPivot: function(degreesOrUseSpring){ + var useSpring = degreesOrUseSpring === true; + + var delta = this.rotationPivot.minus(this.getCenter()); + this.centerSpringX.shiftBy(delta.x); + this.centerSpringY.shiftBy(delta.y); + + if(useSpring){ + this.degreesSpring.update(); + } else { + this.degreesSpring.resetTo(degreesOrUseSpring); + } + + var changeInDegrees = this.degreesSpring.current.value - this._oldDegrees; + var rdelta = delta.rotate(changeInDegrees * -1).times(-1); + this.centerSpringX.shiftBy(rdelta.x); + this.centerSpringY.shiftBy(rdelta.y); + }, + + // private + _adjustCenterSpringsForZoomPoint: function(zoomSpringHandler) { + if (this.zoomPoint) { + var oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true); + zoomSpringHandler(); + var newZoomPixel = this.pixelFromPoint(this.zoomPoint, true); + + var deltaZoomPixels = newZoomPixel.minus(oldZoomPixel); + var deltaZoomPoints = this.deltaPointsFromPixels( + deltaZoomPixels, true); + + this.centerSpringX.shiftBy(deltaZoomPoints.x); + this.centerSpringY.shiftBy(deltaZoomPoints.y); + + if (this.zoomSpring.isAtTargetValue()) { + this.zoomPoint = null; + } + } else { + zoomSpringHandler(); + } + }, + + /** + * Convert a delta (translation vector) from viewport coordinates to pixels + * coordinates. This method does not take rotation into account. + * Consider using deltaPixelsFromPoints if you need to account for rotation. + * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert. + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + deltaPixelsFromPointsNoRotate: function(deltaPoints, current) { + return deltaPoints.times( + this._containerInnerSize.x * this.getZoom(current) + ); + }, + + /** + * Convert a delta (translation vector) from viewport coordinates to pixels + * coordinates. + * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert. + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + deltaPixelsFromPoints: function(deltaPoints, current) { + return this.deltaPixelsFromPointsNoRotate( + deltaPoints.rotate(this.getRotation(current)), + current); + }, + + /** + * Convert a delta (translation vector) from pixels coordinates to viewport + * coordinates. This method does not take rotation into account. + * Consider using deltaPointsFromPixels if you need to account for rotation. + * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert. + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + deltaPointsFromPixelsNoRotate: function(deltaPixels, current) { + return deltaPixels.divide( + this._containerInnerSize.x * this.getZoom(current) + ); + }, + + /** + * Convert a delta (translation vector) from pixels coordinates to viewport + * coordinates. + * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert. + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + deltaPointsFromPixels: function(deltaPixels, current) { + return this.deltaPointsFromPixelsNoRotate(deltaPixels, current) + .rotate(-this.getRotation(current)); + }, + + /** + * Convert viewport coordinates to pixels coordinates. + * This method does not take rotation into account. + * Consider using pixelFromPoint if you need to account for rotation. + * @param {OpenSeadragon.Point} point the viewport coordinates + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + pixelFromPointNoRotate: function(point, current) { + return this._pixelFromPointNoRotate( + point, this.getBoundsNoRotate(current)); + }, + + /** + * Convert viewport coordinates to pixel coordinates. + * @param {OpenSeadragon.Point} point the viewport coordinates + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + pixelFromPoint: function(point, current) { + return this._pixelFromPoint(point, this.getBoundsNoRotate(current)); + }, + + // private + _pixelFromPointNoRotate: function(point, bounds) { + return point.minus( + bounds.getTopLeft() + ).times( + this._containerInnerSize.x / bounds.width + ).plus( + new $.Point(this._margins.left, this._margins.top) + ); + }, + + // private + _pixelFromPoint: function(point, bounds) { + return this._pixelFromPointNoRotate( + point.rotate(this.getRotation(true), this.getCenter(true)), + bounds); + }, + + /** + * Convert pixel coordinates to viewport coordinates. + * This method does not take rotation into account. + * Consider using pointFromPixel if you need to account for rotation. + * @param {OpenSeadragon.Point} pixel Pixel coordinates + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + pointFromPixelNoRotate: function(pixel, current) { + var bounds = this.getBoundsNoRotate(current); + return pixel.minus( + new $.Point(this._margins.left, this._margins.top) + ).divide( + this._containerInnerSize.x / bounds.width + ).plus( + bounds.getTopLeft() + ); + }, + + /** + * Convert pixel coordinates to viewport coordinates. + * @param {OpenSeadragon.Point} pixel Pixel coordinates + * @param {Boolean} [current=false] - Pass true for the current location; + * defaults to false (target location). + * @returns {OpenSeadragon.Point} + */ + pointFromPixel: function(pixel, current) { + return this.pointFromPixelNoRotate(pixel, current).rotate( + -this.getRotation(current), + this.getCenter(current) + ); + }, + + // private + _viewportToImageDelta: function( viewerX, viewerY ) { + var scale = this._contentBoundsNoRotate.width; + return new $.Point( + viewerX * this._contentSizeNoRotate.x / scale, + viewerY * this._contentSizeNoRotate.x / scale); + }, + + /** + * Translates from OpenSeadragon viewer coordinate system to image coordinate system. + * This method can be called either by passing X,Y coordinates or an + * OpenSeadragon.Point + * Note: not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead. + * @function + * @param {(OpenSeadragon.Point|Number)} viewerX either a point or the X + * coordinate in viewport coordinate system. + * @param {Number} [viewerY] Y coordinate in viewport coordinate system. + * @returns {OpenSeadragon.Point} a point representing the coordinates in the image. + */ + viewportToImageCoordinates: function(viewerX, viewerY) { + if (viewerX instanceof $.Point) { + //they passed a point instead of individual components + return this.viewportToImageCoordinates(viewerX.x, viewerX.y); + } + + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + if (!this.silenceMultiImageWarnings) { + $.console.error('[Viewport.viewportToImageCoordinates] is not accurate ' + + 'with multi-image; use TiledImage.viewportToImageCoordinates instead.'); + } + } else if (count === 1) { + // It is better to use TiledImage.viewportToImageCoordinates + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.viewportToImageCoordinates(viewerX, viewerY, true); + } + } + + return this._viewportToImageDelta( + viewerX - this._contentBoundsNoRotate.x, + viewerY - this._contentBoundsNoRotate.y); + }, + + // private + _imageToViewportDelta: function( imageX, imageY ) { + var scale = this._contentBoundsNoRotate.width; + return new $.Point( + imageX / this._contentSizeNoRotate.x * scale, + imageY / this._contentSizeNoRotate.x * scale); + }, + + /** + * Translates from image coordinate system to OpenSeadragon viewer coordinate system + * This method can be called either by passing X,Y coordinates or an + * OpenSeadragon.Point + * Note: not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead. + * @function + * @param {(OpenSeadragon.Point | Number)} imageX the point or the + * X coordinate in image coordinate system. + * @param {Number} [imageY] Y coordinate in image coordinate system. + * @returns {OpenSeadragon.Point} a point representing the coordinates in the viewport. + */ + imageToViewportCoordinates: function(imageX, imageY) { + if (imageX instanceof $.Point) { + //they passed a point instead of individual components + return this.imageToViewportCoordinates(imageX.x, imageX.y); + } + + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + if (!this.silenceMultiImageWarnings) { + $.console.error('[Viewport.imageToViewportCoordinates] is not accurate ' + + 'with multi-image; use TiledImage.imageToViewportCoordinates instead.'); + } + } else if (count === 1) { + // It is better to use TiledImage.viewportToImageCoordinates + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.imageToViewportCoordinates(imageX, imageY, true); + } + } + + var point = this._imageToViewportDelta(imageX, imageY); + point.x += this._contentBoundsNoRotate.x; + point.y += this._contentBoundsNoRotate.y; + return point; + }, + + /** + * Translates from a rectangle which describes a portion of the image in + * pixel coordinates to OpenSeadragon viewport rectangle coordinates. + * This method can be called either by passing X,Y,width,height or an + * OpenSeadragon.Rect + * Note: not accurate with multi-image; use TiledImage.imageToViewportRectangle instead. + * @function + * @param {(OpenSeadragon.Rect | Number)} imageX the rectangle or the X + * coordinate of the top left corner of the rectangle in image coordinate system. + * @param {Number} [imageY] the Y coordinate of the top left corner of the rectangle + * in image coordinate system. + * @param {Number} [pixelWidth] the width in pixel of the rectangle. + * @param {Number} [pixelHeight] the height in pixel of the rectangle. + * @returns {OpenSeadragon.Rect} This image's bounds in viewport coordinates + */ + imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight) { + var rect = imageX; + if (!(rect instanceof $.Rect)) { + //they passed individual components instead of a rectangle + rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight); + } + + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + if (!this.silenceMultiImageWarnings) { + $.console.error('[Viewport.imageToViewportRectangle] is not accurate ' + + 'with multi-image; use TiledImage.imageToViewportRectangle instead.'); + } + } else if (count === 1) { + // It is better to use TiledImage.imageToViewportRectangle + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.imageToViewportRectangle( + imageX, imageY, pixelWidth, pixelHeight, true); + } + } + + var coordA = this.imageToViewportCoordinates(rect.x, rect.y); + var coordB = this._imageToViewportDelta(rect.width, rect.height); + return new $.Rect( + coordA.x, + coordA.y, + coordB.x, + coordB.y, + rect.degrees + ); + }, + + /** + * Translates from a rectangle which describes a portion of + * the viewport in point coordinates to image rectangle coordinates. + * This method can be called either by passing X,Y,width,height or an + * OpenSeadragon.Rect + * Note: not accurate with multi-image; use TiledImage.viewportToImageRectangle instead. + * @function + * @param {(OpenSeadragon.Rect | Number)} viewerX either a rectangle or + * the X coordinate of the top left corner of the rectangle in viewport + * coordinate system. + * @param {Number} [viewerY] the Y coordinate of the top left corner of the rectangle + * in viewport coordinate system. + * @param {Number} [pointWidth] the width of the rectangle in viewport coordinate system. + * @param {Number} [pointHeight] the height of the rectangle in viewport coordinate system. + */ + viewportToImageRectangle: function(viewerX, viewerY, pointWidth, pointHeight) { + var rect = viewerX; + if (!(rect instanceof $.Rect)) { + //they passed individual components instead of a rectangle + rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight); + } + + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + if (!this.silenceMultiImageWarnings) { + $.console.error('[Viewport.viewportToImageRectangle] is not accurate ' + + 'with multi-image; use TiledImage.viewportToImageRectangle instead.'); + } + } else if (count === 1) { + // It is better to use TiledImage.viewportToImageCoordinates + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.viewportToImageRectangle( + viewerX, viewerY, pointWidth, pointHeight, true); + } + } + + var coordA = this.viewportToImageCoordinates(rect.x, rect.y); + var coordB = this._viewportToImageDelta(rect.width, rect.height); + return new $.Rect( + coordA.x, + coordA.y, + coordB.x, + coordB.y, + rect.degrees + ); + }, + + /** + * Convert pixel coordinates relative to the viewer element to image + * coordinates. + * Note: not accurate with multi-image. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + viewerElementToImageCoordinates: function( pixel ) { + var point = this.pointFromPixel( pixel, true ); + return this.viewportToImageCoordinates( point ); + }, + + /** + * Convert pixel coordinates relative to the image to + * viewer element coordinates. + * Note: not accurate with multi-image. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + imageToViewerElementCoordinates: function( pixel ) { + var point = this.imageToViewportCoordinates( pixel ); + return this.pixelFromPoint( point, true ); + }, + + /** + * Convert pixel coordinates relative to the window to image coordinates. + * Note: not accurate with multi-image. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + windowToImageCoordinates: function(pixel) { + $.console.assert(this.viewer, + "[Viewport.windowToImageCoordinates] the viewport must have a viewer."); + var viewerCoordinates = pixel.minus( + $.getElementPosition(this.viewer.element)); + return this.viewerElementToImageCoordinates(viewerCoordinates); + }, + + /** + * Convert image coordinates to pixel coordinates relative to the window. + * Note: not accurate with multi-image. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + imageToWindowCoordinates: function(pixel) { + $.console.assert(this.viewer, + "[Viewport.imageToWindowCoordinates] the viewport must have a viewer."); + var viewerCoordinates = this.imageToViewerElementCoordinates(pixel); + return viewerCoordinates.plus( + $.getElementPosition(this.viewer.element)); + }, + + /** + * Convert pixel coordinates relative to the viewer element to viewport + * coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + viewerElementToViewportCoordinates: function( pixel ) { + return this.pointFromPixel( pixel, true ); + }, + + /** + * Convert viewport coordinates to pixel coordinates relative to the + * viewer element. + * @param {OpenSeadragon.Point} point + * @returns {OpenSeadragon.Point} + */ + viewportToViewerElementCoordinates: function( point ) { + return this.pixelFromPoint( point, true ); + }, + + /** + * Convert a rectangle in pixel coordinates relative to the viewer element + * to viewport coordinates. + * @param {OpenSeadragon.Rect} rectangle the rectangle to convert + * @returns {OpenSeadragon.Rect} the converted rectangle + */ + viewerElementToViewportRectangle: function(rectangle) { + return $.Rect.fromSummits( + this.pointFromPixel(rectangle.getTopLeft(), true), + this.pointFromPixel(rectangle.getTopRight(), true), + this.pointFromPixel(rectangle.getBottomLeft(), true) + ); + }, + + /** + * Convert a rectangle in viewport coordinates to pixel coordinates relative + * to the viewer element. + * @param {OpenSeadragon.Rect} rectangle the rectangle to convert + * @returns {OpenSeadragon.Rect} the converted rectangle + */ + viewportToViewerElementRectangle: function(rectangle) { + return $.Rect.fromSummits( + this.pixelFromPoint(rectangle.getTopLeft(), true), + this.pixelFromPoint(rectangle.getTopRight(), true), + this.pixelFromPoint(rectangle.getBottomLeft(), true) + ); + }, + + /** + * Convert pixel coordinates relative to the window to viewport coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + windowToViewportCoordinates: function(pixel) { + $.console.assert(this.viewer, + "[Viewport.windowToViewportCoordinates] the viewport must have a viewer."); + var viewerCoordinates = pixel.minus( + $.getElementPosition(this.viewer.element)); + return this.viewerElementToViewportCoordinates(viewerCoordinates); + }, + + /** + * Convert viewport coordinates to pixel coordinates relative to the window. + * @param {OpenSeadragon.Point} point + * @returns {OpenSeadragon.Point} + */ + viewportToWindowCoordinates: function(point) { + $.console.assert(this.viewer, + "[Viewport.viewportToWindowCoordinates] the viewport must have a viewer."); + var viewerCoordinates = this.viewportToViewerElementCoordinates(point); + return viewerCoordinates.plus( + $.getElementPosition(this.viewer.element)); + }, + + /** + * Convert a viewport zoom to an image zoom. + * Image zoom: ratio of the original image size to displayed image size. + * 1 means original image size, 0.5 half size... + * Viewport zoom: ratio of the displayed image's width to viewport's width. + * 1 means identical width, 2 means image's width is twice the viewport's width... + * Note: not accurate with multi-image. + * @function + * @param {Number} viewportZoom The viewport zoom + * target zoom. + * @returns {Number} imageZoom The image zoom + */ + viewportToImageZoom: function(viewportZoom) { + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + if (!this.silenceMultiImageWarnings) { + $.console.error('[Viewport.viewportToImageZoom] is not ' + + 'accurate with multi-image.'); + } + } else if (count === 1) { + // It is better to use TiledImage.viewportToImageZoom + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.viewportToImageZoom(viewportZoom); + } + } + + var imageWidth = this._contentSizeNoRotate.x; + var containerWidth = this._containerInnerSize.x; + var scale = this._contentBoundsNoRotate.width; + var viewportToImageZoomRatio = (containerWidth / imageWidth) * scale; + return viewportZoom * viewportToImageZoomRatio; + }, + + /** + * Convert an image zoom to a viewport zoom. + * Image zoom: ratio of the original image size to displayed image size. + * 1 means original image size, 0.5 half size... + * Viewport zoom: ratio of the displayed image's width to viewport's width. + * 1 means identical width, 2 means image's width is twice the viewport's width... + * Note: not accurate with multi-image. + * @function + * @param {Number} imageZoom The image zoom + * target zoom. + * @returns {Number} viewportZoom The viewport zoom + */ + imageToViewportZoom: function(imageZoom) { + if (this.viewer) { + var count = this.viewer.world.getItemCount(); + if (count > 1) { + if (!this.silenceMultiImageWarnings) { + $.console.error('[Viewport.imageToViewportZoom] is not accurate ' + + 'with multi-image.'); + } + } else if (count === 1) { + // It is better to use TiledImage.imageToViewportZoom + // because this._contentBoundsNoRotate can not be relied on + // with clipping. + var item = this.viewer.world.getItemAt(0); + return item.imageToViewportZoom(imageZoom); + } + } + + var imageWidth = this._contentSizeNoRotate.x; + var containerWidth = this._containerInnerSize.x; + var scale = this._contentBoundsNoRotate.width; + var viewportToImageZoomRatio = (imageWidth / containerWidth) / scale; + return imageZoom * viewportToImageZoomRatio; + }, + + /** + * Toggles flip state and demands a new drawing on navigator and viewer objects. + * @function + * @returns {OpenSeadragon.Viewport} Chainable. + */ + toggleFlip: function() { + this.setFlip(!this.getFlip()); + return this; + }, + + /** + * Get flip state stored on viewport. + * @function + * @returns {Boolean} Flip state. + */ + getFlip: function() { + return this.flipped; + }, + + /** + * Sets flip state according to the state input argument. + * @function + * @param {Boolean} state - Flip state to set. + * @returns {OpenSeadragon.Viewport} Chainable. + */ + setFlip: function( state ) { + if ( this.flipped === state ) { + return this; + } + + this.flipped = state; + if(this.viewer.navigator){ + this.viewer.navigator.setFlip(this.getFlip()); + } + this.viewer.forceRedraw(); + + /** + * Raised when flip state has been changed. + * + * @event flip + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {Number} flipped - The flip state after this change. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('flip', {flipped: state}); + return this; + } + +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - TiledImage + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * You shouldn't have to create a TiledImage instance directly; get it asynchronously by + * using {@link OpenSeadragon.Viewer#open} or {@link OpenSeadragon.Viewer#addTiledImage} instead. + * @class TiledImage + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}. + * A new instance is created for each TileSource opened. + * @param {Object} options - Configuration for this TiledImage. + * @param {OpenSeadragon.TileSource} options.source - The TileSource that defines this TiledImage. + * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this TiledImage. + * @param {OpenSeadragon.TileCache} options.tileCache - The TileCache for this TiledImage to use. + * @param {OpenSeadragon.Drawer} options.drawer - The Drawer for this TiledImage to draw onto. + * @param {OpenSeadragon.ImageLoader} options.imageLoader - The ImageLoader for this TiledImage to use. + * @param {Number} [options.x=0] - Left position, in viewport coordinates. + * @param {Number} [options.y=0] - Top position, in viewport coordinates. + * @param {Number} [options.width=1] - Width, in viewport coordinates. + * @param {Number} [options.height] - Height, in viewport coordinates. + * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates + * to fit the image into. If specified, x, y, width and height get ignored. + * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER] + * How to anchor the image in the bounds if options.fitBounds is set. + * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to + * (portions of the image outside of this area will not be visible). Only works on + * browsers that support the HTML5 canvas. + * @param {Number} [options.springStiffness] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.animationTime] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.minZoomImageRatio] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.wrapHorizontal] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.wrapVertical] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.immediateRender] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.blendTime] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.alwaysBlend] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.minPixelRatio] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.smoothTileEdgesMinZoom] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.iOSDevice] - See {@link OpenSeadragon.Options}. + * @param {Number} [options.opacity=1] - Set to draw at proportional opacity. If zero, images will not draw. + * @param {Boolean} [options.preload=false] - Set true to load even when the image is hidden by zero opacity. + * @param {String} [options.compositeOperation] - How the image is composited onto other images; see compositeOperation in {@link OpenSeadragon.Options} for possible + values. + * @param {Boolean} [options.debugMode] - See {@link OpenSeadragon.Options}. + * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}. + * @param {String|Boolean} [options.crossOriginPolicy] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.ajaxWithCredentials] - See {@link OpenSeadragon.Options}. + * @param {Boolean} [options.loadTilesWithAjax] + * Whether to load tile data using AJAX requests. + * Defaults to the setting in {@link OpenSeadragon.Options}. + * @param {Object} [options.ajaxHeaders={}] + * A set of headers to include when making tile AJAX requests. + */ +$.TiledImage = function( options ) { + var _this = this; + /** + * The {@link OpenSeadragon.TileSource} that defines this TiledImage. + * @member {OpenSeadragon.TileSource} source + * @memberof OpenSeadragon.TiledImage# + */ + $.console.assert( options.tileCache, "[TiledImage] options.tileCache is required" ); + $.console.assert( options.drawer, "[TiledImage] options.drawer is required" ); + $.console.assert( options.viewer, "[TiledImage] options.viewer is required" ); + $.console.assert( options.imageLoader, "[TiledImage] options.imageLoader is required" ); + $.console.assert( options.source, "[TiledImage] options.source is required" ); + $.console.assert(!options.clip || options.clip instanceof $.Rect, + "[TiledImage] options.clip must be an OpenSeadragon.Rect if present"); + + $.EventSource.call( this ); + + this._tileCache = options.tileCache; + delete options.tileCache; + + this._drawer = options.drawer; + delete options.drawer; + + this._imageLoader = options.imageLoader; + delete options.imageLoader; + + if (options.clip instanceof $.Rect) { + this._clip = options.clip.clone(); + } + + delete options.clip; + + var x = options.x || 0; + delete options.x; + var y = options.y || 0; + delete options.y; + + // Ratio of zoomable image height to width. + this.normHeight = options.source.dimensions.y / options.source.dimensions.x; + this.contentAspectX = options.source.dimensions.x / options.source.dimensions.y; + + var scale = 1; + if ( options.width ) { + scale = options.width; + delete options.width; + + if ( options.height ) { + $.console.error( "specifying both width and height to a tiledImage is not supported" ); + delete options.height; + } + } else if ( options.height ) { + scale = options.height / this.normHeight; + delete options.height; + } + + var fitBounds = options.fitBounds; + delete options.fitBounds; + var fitBoundsPlacement = options.fitBoundsPlacement || OpenSeadragon.Placement.CENTER; + delete options.fitBoundsPlacement; + + var degrees = options.degrees || 0; + delete options.degrees; + + var ajaxHeaders = options.ajaxHeaders; + delete options.ajaxHeaders; + + $.extend( true, this, { + + //internal state properties + viewer: null, + tilesMatrix: {}, // A '3d' dictionary [level][x][y] --> Tile. + coverage: {}, // A '3d' dictionary [level][x][y] --> Boolean; shows what areas have been drawn. + loadingCoverage: {}, // A '3d' dictionary [level][x][y] --> Boolean; shows what areas are loaded or are being loaded/blended. + lastDrawn: [], // An unordered list of Tiles drawn last frame. + lastResetTime: 0, // Last time for which the tiledImage was reset. + _midDraw: false, // Is the tiledImage currently updating the viewport? + _needsDraw: true, // Does the tiledImage need to update the viewport again? + _hasOpaqueTile: false, // Do we have even one fully opaque tile? + _tilesLoading: 0, // The number of pending tile requests. + //configurable settings + springStiffness: $.DEFAULT_SETTINGS.springStiffness, + animationTime: $.DEFAULT_SETTINGS.animationTime, + minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio, + wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal, + wrapVertical: $.DEFAULT_SETTINGS.wrapVertical, + immediateRender: $.DEFAULT_SETTINGS.immediateRender, + blendTime: $.DEFAULT_SETTINGS.blendTime, + alwaysBlend: $.DEFAULT_SETTINGS.alwaysBlend, + minPixelRatio: $.DEFAULT_SETTINGS.minPixelRatio, + smoothTileEdgesMinZoom: $.DEFAULT_SETTINGS.smoothTileEdgesMinZoom, + iOSDevice: $.DEFAULT_SETTINGS.iOSDevice, + debugMode: $.DEFAULT_SETTINGS.debugMode, + crossOriginPolicy: $.DEFAULT_SETTINGS.crossOriginPolicy, + ajaxWithCredentials: $.DEFAULT_SETTINGS.ajaxWithCredentials, + placeholderFillStyle: $.DEFAULT_SETTINGS.placeholderFillStyle, + opacity: $.DEFAULT_SETTINGS.opacity, + preload: $.DEFAULT_SETTINGS.preload, + compositeOperation: $.DEFAULT_SETTINGS.compositeOperation, + subPixelRoundingForTransparency: $.DEFAULT_SETTINGS.subPixelRoundingForTransparency + }, options ); + + this._preload = this.preload; + delete this.preload; + + this._fullyLoaded = false; + + this._xSpring = new $.Spring({ + initial: x, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._ySpring = new $.Spring({ + initial: y, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._scaleSpring = new $.Spring({ + initial: scale, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._degreesSpring = new $.Spring({ + initial: degrees, + springStiffness: this.springStiffness, + animationTime: this.animationTime + }); + + this._updateForScale(); + + if (fitBounds) { + this.fitBounds(fitBounds, fitBoundsPlacement, true); + } + + // We need a callback to give image manipulation a chance to happen + this._drawingHandler = function(args) { + /** + * This event is fired just before the tile is drawn giving the application a chance to alter the image. + * + * NOTE: This event is only fired when the drawer is using a <canvas>. + * + * @event tile-drawing + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.Tile} tile - The Tile being drawn. + * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn. + * @property {OpenSeadragon.Tile} context - The HTML canvas context being drawn into. + * @property {OpenSeadragon.Tile} rendered - The HTML canvas context containing the tile imagery. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + _this.viewer.raiseEvent('tile-drawing', $.extend({ + tiledImage: _this + }, args)); + }; + + this._ownAjaxHeaders = {}; + this.setAjaxHeaders(ajaxHeaders, false); +}; + +$.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.TiledImage.prototype */{ + /** + * @returns {Boolean} Whether the TiledImage needs to be drawn. + */ + needsDraw: function() { + return this._needsDraw; + }, + + /** + * @returns {Boolean} Whether all tiles necessary for this TiledImage to draw at the current view have been loaded. + */ + getFullyLoaded: function() { + return this._fullyLoaded; + }, + + // private + _setFullyLoaded: function(flag) { + if (flag === this._fullyLoaded) { + return; + } + + this._fullyLoaded = flag; + + /** + * Fired when the TiledImage's "fully loaded" flag (whether all tiles necessary for this TiledImage + * to draw at the current view have been loaded) changes. + * + * @event fully-loaded-change + * @memberof OpenSeadragon.TiledImage + * @type {object} + * @property {Boolean} fullyLoaded - The new "fully loaded" value. + * @property {OpenSeadragon.TiledImage} eventSource - A reference to the TiledImage which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('fully-loaded-change', { + fullyLoaded: this._fullyLoaded + }); + }, + + /** + * Clears all tiles and triggers an update on the next call to + * {@link OpenSeadragon.TiledImage#update}. + */ + reset: function() { + this._tileCache.clearTilesFor(this); + this.lastResetTime = $.now(); + this._needsDraw = true; + }, + + /** + * Updates the TiledImage's bounds, animating if needed. + * @returns {Boolean} Whether the TiledImage animated. + */ + update: function() { + var xUpdated = this._xSpring.update(); + var yUpdated = this._ySpring.update(); + var scaleUpdated = this._scaleSpring.update(); + var degreesUpdated = this._degreesSpring.update(); + + if (xUpdated || yUpdated || scaleUpdated || degreesUpdated) { + this._updateForScale(); + this._needsDraw = true; + return true; + } + + return false; + }, + + /** + * Draws the TiledImage to its Drawer. + */ + draw: function() { + if (this.opacity !== 0 || this._preload) { + this._midDraw = true; + this._updateViewport(); + this._midDraw = false; + } + // Images with opacity 0 should not need to be drawn in future. this._needsDraw = false is set in this._updateViewport() for other images. + else { + this._needsDraw = false; + } + }, + + /** + * Destroy the TiledImage (unload current loaded tiles). + */ + destroy: function() { + this.reset(); + + if (this.source.destroy) { + this.source.destroy(); + } + }, + + /** + * Get this TiledImage's bounds in viewport coordinates. + * @param {Boolean} [current=false] - Pass true for the current location; + * false for target location. + * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates. + */ + getBounds: function(current) { + return this.getBoundsNoRotate(current) + .rotate(this.getRotation(current), this._getRotationPoint(current)); + }, + + /** + * Get this TiledImage's bounds in viewport coordinates without taking + * rotation into account. + * @param {Boolean} [current=false] - Pass true for the current location; + * false for target location. + * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates. + */ + getBoundsNoRotate: function(current) { + return current ? + new $.Rect( + this._xSpring.current.value, + this._ySpring.current.value, + this._worldWidthCurrent, + this._worldHeightCurrent) : + new $.Rect( + this._xSpring.target.value, + this._ySpring.target.value, + this._worldWidthTarget, + this._worldHeightTarget); + }, + + // deprecated + getWorldBounds: function() { + $.console.error('[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead'); + return this.getBounds(); + }, + + /** + * Get the bounds of the displayed part of the tiled image. + * @param {Boolean} [current=false] Pass true for the current location, + * false for the target location. + * @returns {$.Rect} The clipped bounds in viewport coordinates. + */ + getClippedBounds: function(current) { + var bounds = this.getBoundsNoRotate(current); + if (this._clip) { + var worldWidth = current ? + this._worldWidthCurrent : this._worldWidthTarget; + var ratio = worldWidth / this.source.dimensions.x; + var clip = this._clip.times(ratio); + bounds = new $.Rect( + bounds.x + clip.x, + bounds.y + clip.y, + clip.width, + clip.height); + } + return bounds.rotate(this.getRotation(current), this._getRotationPoint(current)); + }, + + /** + * @function + * @param {Number} level + * @param {Number} x + * @param {Number} y + * @returns {OpenSeadragon.Rect} Where this tile fits (in normalized coordinates). + */ + getTileBounds: function( level, x, y ) { + var numTiles = this.source.getNumTiles(level); + var xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x; + var yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y; + var bounds = this.source.getTileBounds(level, xMod, yMod); + if (this.getFlip()) { + bounds.x = 1 - bounds.x - bounds.width; + } + bounds.x += (x - xMod) / numTiles.x; + bounds.y += (this._worldHeightCurrent / this._worldWidthCurrent) * ((y - yMod) / numTiles.y); + return bounds; + }, + + /** + * @returns {OpenSeadragon.Point} This TiledImage's content size, in original pixels. + */ + getContentSize: function() { + return new $.Point(this.source.dimensions.x, this.source.dimensions.y); + }, + + /** + * @returns {OpenSeadragon.Point} The TiledImage's content size, in window coordinates. + */ + getSizeInWindowCoordinates: function() { + var topLeft = this.imageToWindowCoordinates(new $.Point(0, 0)); + var bottomRight = this.imageToWindowCoordinates(this.getContentSize()); + return new $.Point(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y); + }, + + // private + _viewportToImageDelta: function( viewerX, viewerY, current ) { + var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value); + return new $.Point(viewerX * (this.source.dimensions.x / scale), + viewerY * ((this.source.dimensions.y * this.contentAspectX) / scale)); + }, + + /** + * Translates from OpenSeadragon viewer coordinate system to image coordinate system. + * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}. + * @param {Number|OpenSeadragon.Point} viewerX - The X coordinate or point in viewport coordinate system. + * @param {Number} [viewerY] - The Y coordinate in viewport coordinate system. + * @param {Boolean} [current=false] - Pass true to use the current location; false for target location. + * @returns {OpenSeadragon.Point} A point representing the coordinates in the image. + */ + viewportToImageCoordinates: function(viewerX, viewerY, current) { + var point; + if (viewerX instanceof $.Point) { + //they passed a point instead of individual components + current = viewerY; + point = viewerX; + } else { + point = new $.Point(viewerX, viewerY); + } + + point = point.rotate(-this.getRotation(current), this._getRotationPoint(current)); + return current ? + this._viewportToImageDelta( + point.x - this._xSpring.current.value, + point.y - this._ySpring.current.value) : + this._viewportToImageDelta( + point.x - this._xSpring.target.value, + point.y - this._ySpring.target.value); + }, + + // private + _imageToViewportDelta: function( imageX, imageY, current ) { + var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value); + return new $.Point((imageX / this.source.dimensions.x) * scale, + (imageY / this.source.dimensions.y / this.contentAspectX) * scale); + }, + + /** + * Translates from image coordinate system to OpenSeadragon viewer coordinate system + * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}. + * @param {Number|OpenSeadragon.Point} imageX - The X coordinate or point in image coordinate system. + * @param {Number} [imageY] - The Y coordinate in image coordinate system. + * @param {Boolean} [current=false] - Pass true to use the current location; false for target location. + * @returns {OpenSeadragon.Point} A point representing the coordinates in the viewport. + */ + imageToViewportCoordinates: function(imageX, imageY, current) { + if (imageX instanceof $.Point) { + //they passed a point instead of individual components + current = imageY; + imageY = imageX.y; + imageX = imageX.x; + } + + var point = this._imageToViewportDelta(imageX, imageY); + if (current) { + point.x += this._xSpring.current.value; + point.y += this._ySpring.current.value; + } else { + point.x += this._xSpring.target.value; + point.y += this._ySpring.target.value; + } + + return point.rotate(this.getRotation(current), this._getRotationPoint(current)); + }, + + /** + * Translates from a rectangle which describes a portion of the image in + * pixel coordinates to OpenSeadragon viewport rectangle coordinates. + * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}. + * @param {Number|OpenSeadragon.Rect} imageX - The left coordinate or rectangle in image coordinate system. + * @param {Number} [imageY] - The top coordinate in image coordinate system. + * @param {Number} [pixelWidth] - The width in pixel of the rectangle. + * @param {Number} [pixelHeight] - The height in pixel of the rectangle. + * @param {Boolean} [current=false] - Pass true to use the current location; false for target location. + * @returns {OpenSeadragon.Rect} A rect representing the coordinates in the viewport. + */ + imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight, current) { + var rect = imageX; + if (rect instanceof $.Rect) { + //they passed a rect instead of individual components + current = imageY; + } else { + rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight); + } + + var coordA = this.imageToViewportCoordinates(rect.getTopLeft(), current); + var coordB = this._imageToViewportDelta(rect.width, rect.height, current); + + return new $.Rect( + coordA.x, + coordA.y, + coordB.x, + coordB.y, + rect.degrees + this.getRotation(current) + ); + }, + + /** + * Translates from a rectangle which describes a portion of + * the viewport in point coordinates to image rectangle coordinates. + * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}. + * @param {Number|OpenSeadragon.Rect} viewerX - The left coordinate or rectangle in viewport coordinate system. + * @param {Number} [viewerY] - The top coordinate in viewport coordinate system. + * @param {Number} [pointWidth] - The width in viewport coordinate system. + * @param {Number} [pointHeight] - The height in viewport coordinate system. + * @param {Boolean} [current=false] - Pass true to use the current location; false for target location. + * @returns {OpenSeadragon.Rect} A rect representing the coordinates in the image. + */ + viewportToImageRectangle: function( viewerX, viewerY, pointWidth, pointHeight, current ) { + var rect = viewerX; + if (viewerX instanceof $.Rect) { + //they passed a rect instead of individual components + current = viewerY; + } else { + rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight); + } + + var coordA = this.viewportToImageCoordinates(rect.getTopLeft(), current); + var coordB = this._viewportToImageDelta(rect.width, rect.height, current); + + return new $.Rect( + coordA.x, + coordA.y, + coordB.x, + coordB.y, + rect.degrees - this.getRotation(current) + ); + }, + + /** + * Convert pixel coordinates relative to the viewer element to image + * coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + viewerElementToImageCoordinates: function( pixel ) { + var point = this.viewport.pointFromPixel( pixel, true ); + return this.viewportToImageCoordinates( point ); + }, + + /** + * Convert pixel coordinates relative to the image to + * viewer element coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + imageToViewerElementCoordinates: function( pixel ) { + var point = this.imageToViewportCoordinates( pixel ); + return this.viewport.pixelFromPoint( point, true ); + }, + + /** + * Convert pixel coordinates relative to the window to image coordinates. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + windowToImageCoordinates: function( pixel ) { + var viewerCoordinates = pixel.minus( + OpenSeadragon.getElementPosition( this.viewer.element )); + return this.viewerElementToImageCoordinates( viewerCoordinates ); + }, + + /** + * Convert image coordinates to pixel coordinates relative to the window. + * @param {OpenSeadragon.Point} pixel + * @returns {OpenSeadragon.Point} + */ + imageToWindowCoordinates: function( pixel ) { + var viewerCoordinates = this.imageToViewerElementCoordinates( pixel ); + return viewerCoordinates.plus( + OpenSeadragon.getElementPosition( this.viewer.element )); + }, + + // private + // Convert rectangle in viewport coordinates to this tiled image point + // coordinates (x in [0, 1] and y in [0, aspectRatio]) + _viewportToTiledImageRectangle: function(rect) { + var scale = this._scaleSpring.current.value; + rect = rect.rotate(-this.getRotation(true), this._getRotationPoint(true)); + return new $.Rect( + (rect.x - this._xSpring.current.value) / scale, + (rect.y - this._ySpring.current.value) / scale, + rect.width / scale, + rect.height / scale, + rect.degrees); + }, + + /** + * Convert a viewport zoom to an image zoom. + * Image zoom: ratio of the original image size to displayed image size. + * 1 means original image size, 0.5 half size... + * Viewport zoom: ratio of the displayed image's width to viewport's width. + * 1 means identical width, 2 means image's width is twice the viewport's width... + * @function + * @param {Number} viewportZoom The viewport zoom + * @returns {Number} imageZoom The image zoom + */ + viewportToImageZoom: function( viewportZoom ) { + var ratio = this._scaleSpring.current.value * + this.viewport._containerInnerSize.x / this.source.dimensions.x; + return ratio * viewportZoom; + }, + + /** + * Convert an image zoom to a viewport zoom. + * Image zoom: ratio of the original image size to displayed image size. + * 1 means original image size, 0.5 half size... + * Viewport zoom: ratio of the displayed image's width to viewport's width. + * 1 means identical width, 2 means image's width is twice the viewport's width... + * Note: not accurate with multi-image. + * @function + * @param {Number} imageZoom The image zoom + * @returns {Number} viewportZoom The viewport zoom + */ + imageToViewportZoom: function( imageZoom ) { + var ratio = this._scaleSpring.current.value * + this.viewport._containerInnerSize.x / this.source.dimensions.x; + return imageZoom / ratio; + }, + + /** + * Sets the TiledImage's position in the world. + * @param {OpenSeadragon.Point} position - The new position, in viewport coordinates. + * @param {Boolean} [immediately=false] - Whether to animate to the new position or snap immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + setPosition: function(position, immediately) { + var sameTarget = (this._xSpring.target.value === position.x && + this._ySpring.target.value === position.y); + + if (immediately) { + if (sameTarget && this._xSpring.current.value === position.x && + this._ySpring.current.value === position.y) { + return; + } + + this._xSpring.resetTo(position.x); + this._ySpring.resetTo(position.y); + this._needsDraw = true; + } else { + if (sameTarget) { + return; + } + + this._xSpring.springTo(position.x); + this._ySpring.springTo(position.y); + this._needsDraw = true; + } + + if (!sameTarget) { + this._raiseBoundsChange(); + } + }, + + /** + * Sets the TiledImage's width in the world, adjusting the height to match based on aspect ratio. + * @param {Number} width - The new width, in viewport coordinates. + * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + setWidth: function(width, immediately) { + this._setScale(width, immediately); + }, + + /** + * Sets the TiledImage's height in the world, adjusting the width to match based on aspect ratio. + * @param {Number} height - The new height, in viewport coordinates. + * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + setHeight: function(height, immediately) { + this._setScale(height / this.normHeight, immediately); + }, + + /** + * Sets an array of polygons to crop the TiledImage during draw tiles. + * The render function will use the default non-zero winding rule. + * @param {OpenSeadragon.Point[][]} polygons - represented in an array of point object in image coordinates. + * Example format: [ + * [{x: 197, y:172}, {x: 226, y:172}, {x: 226, y:198}, {x: 197, y:198}], // First polygon + * [{x: 328, y:200}, {x: 330, y:199}, {x: 332, y:201}, {x: 329, y:202}] // Second polygon + * [{x: 321, y:201}, {x: 356, y:205}, {x: 341, y:250}] // Third polygon + * ] + */ + setCroppingPolygons: function( polygons ) { + + var isXYObject = function(obj) { + return obj instanceof $.Point || (typeof obj.x === 'number' && typeof obj.y === 'number'); + }; + + var objectToSimpleXYObject = function(objs) { + return objs.map(function(obj) { + try { + if (isXYObject(obj)) { + return { x: obj.x, y: obj.y }; + } else { + throw new Error(); + } + } catch(e) { + throw new Error('A Provided cropping polygon point is not supported'); + } + }); + }; + + try { + if (!$.isArray(polygons)) { + throw new Error('Provided cropping polygon is not an array'); + } + this._croppingPolygons = polygons.map(function(polygon){ + return objectToSimpleXYObject(polygon); + }); + } catch (e) { + $.console.error('[TiledImage.setCroppingPolygons] Cropping polygon format not supported'); + $.console.error(e); + this._croppingPolygons = null; + } + }, + + /** + * Resets the cropping polygons, thus next render will remove all cropping + * polygon effects. + */ + resetCroppingPolygons: function() { + this._croppingPolygons = null; + }, + + /** + * Positions and scales the TiledImage to fit in the specified bounds. + * Note: this method fires OpenSeadragon.TiledImage.event:bounds-change + * twice + * @param {OpenSeadragon.Rect} bounds The bounds to fit the image into. + * @param {OpenSeadragon.Placement} [anchor=OpenSeadragon.Placement.CENTER] + * How to anchor the image in the bounds. + * @param {Boolean} [immediately=false] Whether to animate to the new size + * or snap immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + fitBounds: function(bounds, anchor, immediately) { + anchor = anchor || $.Placement.CENTER; + var anchorProperties = $.Placement.properties[anchor]; + var aspectRatio = this.contentAspectX; + var xOffset = 0; + var yOffset = 0; + var displayedWidthRatio = 1; + var displayedHeightRatio = 1; + if (this._clip) { + aspectRatio = this._clip.getAspectRatio(); + displayedWidthRatio = this._clip.width / this.source.dimensions.x; + displayedHeightRatio = this._clip.height / this.source.dimensions.y; + if (bounds.getAspectRatio() > aspectRatio) { + xOffset = this._clip.x / this._clip.height * bounds.height; + yOffset = this._clip.y / this._clip.height * bounds.height; + } else { + xOffset = this._clip.x / this._clip.width * bounds.width; + yOffset = this._clip.y / this._clip.width * bounds.width; + } + } + + if (bounds.getAspectRatio() > aspectRatio) { + // We will have margins on the X axis + var height = bounds.height / displayedHeightRatio; + var marginLeft = 0; + if (anchorProperties.isHorizontallyCentered) { + marginLeft = (bounds.width - bounds.height * aspectRatio) / 2; + } else if (anchorProperties.isRight) { + marginLeft = bounds.width - bounds.height * aspectRatio; + } + this.setPosition( + new $.Point(bounds.x - xOffset + marginLeft, bounds.y - yOffset), + immediately); + this.setHeight(height, immediately); + } else { + // We will have margins on the Y axis + var width = bounds.width / displayedWidthRatio; + var marginTop = 0; + if (anchorProperties.isVerticallyCentered) { + marginTop = (bounds.height - bounds.width / aspectRatio) / 2; + } else if (anchorProperties.isBottom) { + marginTop = bounds.height - bounds.width / aspectRatio; + } + this.setPosition( + new $.Point(bounds.x - xOffset, bounds.y - yOffset + marginTop), + immediately); + this.setWidth(width, immediately); + } + }, + + /** + * @returns {OpenSeadragon.Rect|null} The TiledImage's current clip rectangle, + * in image pixels, or null if none. + */ + getClip: function() { + if (this._clip) { + return this._clip.clone(); + } + + return null; + }, + + /** + * @param {OpenSeadragon.Rect|null} newClip - An area, in image pixels, to clip to + * (portions of the image outside of this area will not be visible). Only works on + * browsers that support the HTML5 canvas. + * @fires OpenSeadragon.TiledImage.event:clip-change + */ + setClip: function(newClip) { + $.console.assert(!newClip || newClip instanceof $.Rect, + "[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null"); + + if (newClip instanceof $.Rect) { + this._clip = newClip.clone(); + } else { + this._clip = null; + } + + this._needsDraw = true; + /** + * Raised when the TiledImage's clip is changed. + * @event clip-change + * @memberOf OpenSeadragon.TiledImage + * @type {object} + * @property {OpenSeadragon.TiledImage} eventSource - A reference to the + * TiledImage which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('clip-change'); + }, + + /** + * @returns {Boolean} Whether the TiledImage should be flipped before rendering. + */ + getFlip: function() { + return !!this.flipped; + }, + + /** + * @param {Boolean} flip Whether the TiledImage should be flipped before rendering. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + setFlip: function(flip) { + this.flipped = !!flip; + this._needsDraw = true; + this._raiseBoundsChange(); + }, + + /** + * @returns {Number} The TiledImage's current opacity. + */ + getOpacity: function() { + return this.opacity; + }, + + /** + * @param {Number} opacity Opacity the tiled image should be drawn at. + * @fires OpenSeadragon.TiledImage.event:opacity-change + */ + setOpacity: function(opacity) { + if (opacity === this.opacity) { + return; + } + + this.opacity = opacity; + this._needsDraw = true; + /** + * Raised when the TiledImage's opacity is changed. + * @event opacity-change + * @memberOf OpenSeadragon.TiledImage + * @type {object} + * @property {Number} opacity - The new opacity value. + * @property {OpenSeadragon.TiledImage} eventSource - A reference to the + * TiledImage which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('opacity-change', { + opacity: this.opacity + }); + }, + + /** + * @returns {Boolean} whether the tiledImage can load its tiles even when it has zero opacity. + */ + getPreload: function() { + return this._preload; + }, + + /** + * Set true to load even when hidden. Set false to block loading when hidden. + */ + setPreload: function(preload) { + this._preload = !!preload; + this._needsDraw = true; + }, + + /** + * Get the rotation of this tiled image in degrees. + * @param {Boolean} [current=false] True for current rotation, false for target. + * @returns {Number} the rotation of this tiled image in degrees. + */ + getRotation: function(current) { + return current ? + this._degreesSpring.current.value : + this._degreesSpring.target.value; + }, + + /** + * Set the current rotation of this tiled image in degrees. + * @param {Number} degrees the rotation in degrees. + * @param {Boolean} [immediately=false] Whether to animate to the new angle + * or rotate immediately. + * @fires OpenSeadragon.TiledImage.event:bounds-change + */ + setRotation: function(degrees, immediately) { + if (this._degreesSpring.target.value === degrees && + this._degreesSpring.isAtTargetValue()) { + return; + } + if (immediately) { + this._degreesSpring.resetTo(degrees); + } else { + this._degreesSpring.springTo(degrees); + } + this._needsDraw = true; + this._raiseBoundsChange(); + }, + + /** + * Get the point around which this tiled image is rotated + * @private + * @param {Boolean} current True for current rotation point, false for target. + * @returns {OpenSeadragon.Point} + */ + _getRotationPoint: function(current) { + return this.getBoundsNoRotate(current).getCenter(); + }, + + /** + * @returns {String} The TiledImage's current compositeOperation. + */ + getCompositeOperation: function() { + return this.compositeOperation; + }, + + /** + * @param {String} compositeOperation the tiled image should be drawn with this globalCompositeOperation. + * @fires OpenSeadragon.TiledImage.event:composite-operation-change + */ + setCompositeOperation: function(compositeOperation) { + if (compositeOperation === this.compositeOperation) { + return; + } + + this.compositeOperation = compositeOperation; + this._needsDraw = true; + /** + * Raised when the TiledImage's opacity is changed. + * @event composite-operation-change + * @memberOf OpenSeadragon.TiledImage + * @type {object} + * @property {String} compositeOperation - The new compositeOperation value. + * @property {OpenSeadragon.TiledImage} eventSource - A reference to the + * TiledImage which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('composite-operation-change', { + compositeOperation: this.compositeOperation + }); + }, + + /** + * Update headers to include when making AJAX requests. + * + * Unless `propagate` is set to false (which is likely only useful in rare circumstances), + * the updated headers are propagated to all tiles and queued image loader jobs. + * + * Note that the rules for merging headers still apply, i.e. headers returned by + * {@link OpenSeadragon.TileSource#getTileAjaxHeaders} take precedence over + * the headers here in the tiled image (`TiledImage.ajaxHeaders`). + * + * @function + * @param {Object} ajaxHeaders Updated AJAX headers, which will be merged over any headers specified in {@link OpenSeadragon.Options}. + * @param {Boolean} [propagate=true] Whether to propagate updated headers to existing tiles and queued image loader jobs. + */ + setAjaxHeaders: function(ajaxHeaders, propagate) { + if (ajaxHeaders === null) { + ajaxHeaders = {}; + } + if (!$.isPlainObject(ajaxHeaders)) { + console.error('[TiledImage.setAjaxHeaders] Ignoring invalid headers, must be a plain object'); + return; + } + + this._ownAjaxHeaders = ajaxHeaders; + this._updateAjaxHeaders(propagate); + }, + + /** + * Update headers to include when making AJAX requests. + * + * This function has the same effect as calling {@link OpenSeadragon.TiledImage#setAjaxHeaders}, + * except that the headers for this tiled image do not change. This is especially useful + * for propagating updated headers from {@link OpenSeadragon.TileSource#getTileAjaxHeaders} + * to existing tiles. + * + * @private + * @function + * @param {Boolean} [propagate=true] Whether to propagate updated headers to existing tiles and queued image loader jobs. + */ + _updateAjaxHeaders: function(propagate) { + if (propagate === undefined) { + propagate = true; + } + + // merge with viewer's headers + if ($.isPlainObject(this.viewer.ajaxHeaders)) { + this.ajaxHeaders = $.extend({}, this.viewer.ajaxHeaders, this._ownAjaxHeaders); + } else { + this.ajaxHeaders = this._ownAjaxHeaders; + } + + // propagate header updates to all tiles and queued image loader jobs + if (propagate) { + var numTiles, xMod, yMod, tile; + + for (var level in this.tilesMatrix) { + numTiles = this.source.getNumTiles(level); + + for (var x in this.tilesMatrix[level]) { + xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x; + + for (var y in this.tilesMatrix[level][x]) { + yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y; + tile = this.tilesMatrix[level][x][y]; + + tile.loadWithAjax = this.loadTilesWithAjax; + if (tile.loadWithAjax) { + var tileAjaxHeaders = this.source.getTileAjaxHeaders( level, xMod, yMod ); + tile.ajaxHeaders = $.extend({}, this.ajaxHeaders, tileAjaxHeaders); + } else { + tile.ajaxHeaders = null; + } + } + } + } + + for (var i = 0; i < this._imageLoader.jobQueue.length; i++) { + var job = this._imageLoader.jobQueue[i]; + job.loadWithAjax = job.tile.loadWithAjax; + job.ajaxHeaders = job.tile.loadWithAjax ? job.tile.ajaxHeaders : null; + } + } + }, + + // private + _setScale: function(scale, immediately) { + var sameTarget = (this._scaleSpring.target.value === scale); + if (immediately) { + if (sameTarget && this._scaleSpring.current.value === scale) { + return; + } + + this._scaleSpring.resetTo(scale); + this._updateForScale(); + this._needsDraw = true; + } else { + if (sameTarget) { + return; + } + + this._scaleSpring.springTo(scale); + this._updateForScale(); + this._needsDraw = true; + } + + if (!sameTarget) { + this._raiseBoundsChange(); + } + }, + + // private + _updateForScale: function() { + this._worldWidthTarget = this._scaleSpring.target.value; + this._worldHeightTarget = this.normHeight * this._scaleSpring.target.value; + this._worldWidthCurrent = this._scaleSpring.current.value; + this._worldHeightCurrent = this.normHeight * this._scaleSpring.current.value; + }, + + // private + _raiseBoundsChange: function() { + /** + * Raised when the TiledImage's bounds are changed. + * Note that this event is triggered only when the animation target is changed; + * not for every frame of animation. + * @event bounds-change + * @memberOf OpenSeadragon.TiledImage + * @type {object} + * @property {OpenSeadragon.TiledImage} eventSource - A reference to the + * TiledImage which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('bounds-change'); + }, + + // private + _isBottomItem: function() { + return this.viewer.world.getItemAt(0) === this; + }, + + // private + _getLevelsInterval: function() { + var lowestLevel = Math.max( + this.source.minLevel, + Math.floor(Math.log(this.minZoomImageRatio) / Math.log(2)) + ); + var currentZeroRatio = this.viewport.deltaPixelsFromPointsNoRotate( + this.source.getPixelRatio(0), true).x * + this._scaleSpring.current.value; + var highestLevel = Math.min( + Math.abs(this.source.maxLevel), + Math.abs(Math.floor( + Math.log(currentZeroRatio / this.minPixelRatio) / Math.log(2) + )) + ); + + // Calculations for the interval of levels to draw + // can return invalid intervals; fix that here if necessary + highestLevel = Math.max(highestLevel, this.source.minLevel || 0); + lowestLevel = Math.min(lowestLevel, highestLevel); + return { + lowestLevel: lowestLevel, + highestLevel: highestLevel + }; + }, + + /** + * @private + * @inner + * Pretty much every other line in this needs to be documented so it's clear + * how each piece of this routine contributes to the drawing process. That's + * why there are so many TODO's inside this function. + */ + _updateViewport: function() { + this._needsDraw = false; + this._tilesLoading = 0; + this.loadingCoverage = {}; + + // Reset tile's internal drawn state + while (this.lastDrawn.length > 0) { + var tile = this.lastDrawn.pop(); + tile.beingDrawn = false; + } + + var viewport = this.viewport; + var drawArea = this._viewportToTiledImageRectangle( + viewport.getBoundsWithMargins(true)); + + if (!this.wrapHorizontal && !this.wrapVertical) { + var tiledImageBounds = this._viewportToTiledImageRectangle( + this.getClippedBounds(true)); + drawArea = drawArea.intersection(tiledImageBounds); + if (drawArea === null) { + return; + } + } + + var levelsInterval = this._getLevelsInterval(); + var lowestLevel = levelsInterval.lowestLevel; + var highestLevel = levelsInterval.highestLevel; + var bestTile = null; + var haveDrawn = false; + var currentTime = $.now(); + + // Update any level that will be drawn + for (var level = highestLevel; level >= lowestLevel; level--) { + var drawLevel = false; + + //Avoid calculations for draw if we have already drawn this + var currentRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate( + this.source.getPixelRatio(level), + true + ).x * this._scaleSpring.current.value; + + if (level === lowestLevel || + (!haveDrawn && currentRenderPixelRatio >= this.minPixelRatio)) { + drawLevel = true; + haveDrawn = true; + } else if (!haveDrawn) { + continue; + } + + //Perform calculations for draw if we haven't drawn this + var targetRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate( + this.source.getPixelRatio(level), + false + ).x * this._scaleSpring.current.value; + + var targetZeroRatio = viewport.deltaPixelsFromPointsNoRotate( + this.source.getPixelRatio( + Math.max( + this.source.getClosestLevel(), + 0 + ) + ), + false + ).x * this._scaleSpring.current.value; + + var optimalRatio = this.immediateRender ? 1 : targetZeroRatio; + var levelOpacity = Math.min(1, (currentRenderPixelRatio - 0.5) / 0.5); + var levelVisibility = optimalRatio / Math.abs( + optimalRatio - targetRenderPixelRatio + ); + + // Update the level and keep track of 'best' tile to load + bestTile = this._updateLevel( + haveDrawn, + drawLevel, + level, + levelOpacity, + levelVisibility, + drawArea, + currentTime, + bestTile + ); + + // Stop the loop if lower-res tiles would all be covered by + // already drawn tiles + if (this._providesCoverage(this.coverage, level)) { + break; + } + } + + // Perform the actual drawing + this._drawTiles(this.lastDrawn); + + // Load the new 'best' tile + if (bestTile && !bestTile.context2D) { + this._loadTile(bestTile, currentTime); + this._needsDraw = true; + this._setFullyLoaded(false); + } else { + this._setFullyLoaded(this._tilesLoading === 0); + } + }, + + // private + _getCornerTiles: function(level, topLeftBound, bottomRightBound) { + var leftX; + var rightX; + if (this.wrapHorizontal) { + leftX = $.positiveModulo(topLeftBound.x, 1); + rightX = $.positiveModulo(bottomRightBound.x, 1); + } else { + leftX = Math.max(0, topLeftBound.x); + rightX = Math.min(1, bottomRightBound.x); + } + var topY; + var bottomY; + var aspectRatio = 1 / this.source.aspectRatio; + if (this.wrapVertical) { + topY = $.positiveModulo(topLeftBound.y, aspectRatio); + bottomY = $.positiveModulo(bottomRightBound.y, aspectRatio); + } else { + topY = Math.max(0, topLeftBound.y); + bottomY = Math.min(aspectRatio, bottomRightBound.y); + } + + var topLeftTile = this.source.getTileAtPoint(level, new $.Point(leftX, topY)); + var bottomRightTile = this.source.getTileAtPoint(level, new $.Point(rightX, bottomY)); + var numTiles = this.source.getNumTiles(level); + + if (this.wrapHorizontal) { + topLeftTile.x += numTiles.x * Math.floor(topLeftBound.x); + bottomRightTile.x += numTiles.x * Math.floor(bottomRightBound.x); + } + if (this.wrapVertical) { + topLeftTile.y += numTiles.y * Math.floor(topLeftBound.y / aspectRatio); + bottomRightTile.y += numTiles.y * Math.floor(bottomRightBound.y / aspectRatio); + } + + return { + topLeft: topLeftTile, + bottomRight: bottomRightTile, + }; + }, + + /** + * Updates all tiles at a given resolution level. + * @private + * @param {Boolean} haveDrawn + * @param {Boolean} drawLevel + * @param {Number} level + * @param {Number} levelOpacity + * @param {Number} levelVisibility + * @param {OpenSeadragon.Rect} drawArea + * @param {Number} currentTime + * @param {OpenSeadragon.Tile} best - The current "best" tile to draw. + */ + _updateLevel: function(haveDrawn, drawLevel, level, levelOpacity, + levelVisibility, drawArea, currentTime, best) { + + var topLeftBound = drawArea.getBoundingBox().getTopLeft(); + var bottomRightBound = drawArea.getBoundingBox().getBottomRight(); + + if (this.viewer) { + /** + * - Needs documentation - + * + * @event update-level + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn. + * @property {Object} havedrawn + * @property {Object} level + * @property {Object} opacity + * @property {Object} visibility + * @property {OpenSeadragon.Rect} drawArea + * @property {Object} topleft deprecated, use drawArea instead + * @property {Object} bottomright deprecated, use drawArea instead + * @property {Object} currenttime + * @property {Object} best + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent('update-level', { + tiledImage: this, + havedrawn: haveDrawn, + level: level, + opacity: levelOpacity, + visibility: levelVisibility, + drawArea: drawArea, + topleft: topLeftBound, + bottomright: bottomRightBound, + currenttime: currentTime, + best: best + }); + } + + this._resetCoverage(this.coverage, level); + this._resetCoverage(this.loadingCoverage, level); + + //OK, a new drawing so do your calculations + var cornerTiles = this._getCornerTiles(level, topLeftBound, bottomRightBound); + var topLeftTile = cornerTiles.topLeft; + var bottomRightTile = cornerTiles.bottomRight; + var numberOfTiles = this.source.getNumTiles(level); + + var viewportCenter = this.viewport.pixelFromPoint(this.viewport.getCenter()); + + if (this.getFlip()) { + // The right-most tile can be narrower than the others. When flipped, + // this tile is now on the left. Because it is narrower than the normal + // left-most tile, the subsequent tiles may not be wide enough to completely + // fill the viewport. Fix this by rendering an extra column of tiles. If we + // are not wrapping, make sure we never render more than the number of tiles + // in the image. + bottomRightTile.x += 1; + if (!this.wrapHorizontal) { + bottomRightTile.x = Math.min(bottomRightTile.x, numberOfTiles.x - 1); + } + } + + for (var x = topLeftTile.x; x <= bottomRightTile.x; x++) { + for (var y = topLeftTile.y; y <= bottomRightTile.y; y++) { + + var flippedX; + if (this.getFlip()) { + var xMod = ( numberOfTiles.x + ( x % numberOfTiles.x ) ) % numberOfTiles.x; + flippedX = x + numberOfTiles.x - xMod - xMod - 1; + } else { + flippedX = x; + } + + if (drawArea.intersection(this.getTileBounds(level, flippedX, y)) === null) { + // This tile is outside of the viewport, no need to draw it + continue; + } + + best = this._updateTile( + drawLevel, + haveDrawn, + flippedX, y, + level, + levelOpacity, + levelVisibility, + viewportCenter, + numberOfTiles, + currentTime, + best + ); + } + } + + return best; + }, + + /** + * @private + * @inner + * Update a single tile at a particular resolution level. + * @param {Boolean} haveDrawn + * @param {Boolean} drawLevel + * @param {Number} x + * @param {Number} y + * @param {Number} level + * @param {Number} levelOpacity + * @param {Number} levelVisibility + * @param {OpenSeadragon.Point} viewportCenter + * @param {Number} numberOfTiles + * @param {Number} currentTime + * @param {OpenSeadragon.Tile} best - The current "best" tile to draw. + */ + _updateTile: function( haveDrawn, drawLevel, x, y, level, levelOpacity, + levelVisibility, viewportCenter, numberOfTiles, currentTime, best){ + + var tile = this._getTile( + x, y, + level, + currentTime, + numberOfTiles, + this._worldWidthCurrent, + this._worldHeightCurrent + ), + drawTile = drawLevel; + + if( this.viewer ){ + /** + * - Needs documentation - + * + * @event update-tile + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn. + * @property {OpenSeadragon.Tile} tile + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'update-tile', { + tiledImage: this, + tile: tile + }); + } + + this._setCoverage( this.coverage, level, x, y, false ); + + var loadingCoverage = tile.loaded || tile.loading || this._isCovered(this.loadingCoverage, level, x, y); + this._setCoverage(this.loadingCoverage, level, x, y, loadingCoverage); + + if ( !tile.exists ) { + return best; + } + + if ( haveDrawn && !drawTile ) { + if ( this._isCovered( this.coverage, level, x, y ) ) { + this._setCoverage( this.coverage, level, x, y, true ); + } else { + drawTile = true; + } + } + + if ( !drawTile ) { + return best; + } + + this._positionTile( + tile, + this.source.tileOverlap, + this.viewport, + viewportCenter, + levelVisibility + ); + + if (!tile.loaded) { + if (tile.context2D) { + this._setTileLoaded(tile); + } else { + var imageRecord = this._tileCache.getImageRecord(tile.cacheKey); + if (imageRecord) { + this._setTileLoaded(tile, imageRecord.getData()); + } + } + } + + if ( tile.loaded ) { + var needsDraw = this._blendTile( + tile, + x, y, + level, + levelOpacity, + currentTime + ); + + if ( needsDraw ) { + this._needsDraw = true; + } + } else if ( tile.loading ) { + // the tile is already in the download queue + this._tilesLoading++; + } else if (!loadingCoverage) { + best = this._compareTiles( best, tile ); + } + + return best; + }, + + /** + * @private + * @inner + * Obtains a tile at the given location. + * @param {Number} x + * @param {Number} y + * @param {Number} level + * @param {Number} time + * @param {Number} numTiles + * @param {Number} worldWidth + * @param {Number} worldHeight + * @returns {OpenSeadragon.Tile} + */ + _getTile: function( + x, y, + level, + time, + numTiles, + worldWidth, + worldHeight + ) { + var xMod, + yMod, + bounds, + sourceBounds, + exists, + urlOrGetter, + post, + ajaxHeaders, + context2D, + tile, + tilesMatrix = this.tilesMatrix, + tileSource = this.source; + + if ( !tilesMatrix[ level ] ) { + tilesMatrix[ level ] = {}; + } + if ( !tilesMatrix[ level ][ x ] ) { + tilesMatrix[ level ][ x ] = {}; + } + + if ( !tilesMatrix[ level ][ x ][ y ] || !tilesMatrix[ level ][ x ][ y ].flipped !== !this.flipped ) { + xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x; + yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y; + bounds = this.getTileBounds( level, x, y ); + sourceBounds = tileSource.getTileBounds( level, xMod, yMod, true ); + exists = tileSource.tileExists( level, xMod, yMod ); + urlOrGetter = tileSource.getTileUrl( level, xMod, yMod ); + post = tileSource.getTilePostData( level, xMod, yMod ); + + // Headers are only applicable if loadTilesWithAjax is set + if (this.loadTilesWithAjax) { + ajaxHeaders = tileSource.getTileAjaxHeaders( level, xMod, yMod ); + // Combine tile AJAX headers with tiled image AJAX headers (if applicable) + if ($.isPlainObject(this.ajaxHeaders)) { + ajaxHeaders = $.extend({}, this.ajaxHeaders, ajaxHeaders); + } + } else { + ajaxHeaders = null; + } + + context2D = tileSource.getContext2D ? + tileSource.getContext2D(level, xMod, yMod) : undefined; + + tile = new $.Tile( + level, + x, + y, + bounds, + exists, + urlOrGetter, + context2D, + this.loadTilesWithAjax, + ajaxHeaders, + sourceBounds, + post, + tileSource.getTileHashKey(level, xMod, yMod, urlOrGetter, ajaxHeaders, post) + ); + + if (this.getFlip()) { + if (xMod === 0) { + tile.isRightMost = true; + } + } else { + if (xMod === numTiles.x - 1) { + tile.isRightMost = true; + } + } + + if (yMod === numTiles.y - 1) { + tile.isBottomMost = true; + } + + tile.flipped = this.flipped; + + tilesMatrix[ level ][ x ][ y ] = tile; + } + + tile = tilesMatrix[ level ][ x ][ y ]; + tile.lastTouchTime = time; + + return tile; + }, + + /** + * @private + * @inner + * Dispatch a job to the ImageLoader to load the Image for a Tile. + * @param {OpenSeadragon.Tile} tile + * @param {Number} time + */ + _loadTile: function(tile, time ) { + var _this = this; + tile.loading = true; + this._imageLoader.addJob({ + src: tile.getUrl(), + tile: tile, + source: this.source, + postData: tile.postData, + loadWithAjax: tile.loadWithAjax, + ajaxHeaders: tile.ajaxHeaders, + crossOriginPolicy: this.crossOriginPolicy, + ajaxWithCredentials: this.ajaxWithCredentials, + callback: function( data, errorMsg, tileRequest ){ + _this._onTileLoad( tile, time, data, errorMsg, tileRequest ); + }, + abort: function() { + tile.loading = false; + } + }); + }, + + /** + * @private + * @inner + * Callback fired when a Tile's Image finished downloading. + * @param {OpenSeadragon.Tile} tile + * @param {Number} time + * @param {*} data image data + * @param {String} errorMsg + * @param {XMLHttpRequest} tileRequest + */ + _onTileLoad: function( tile, time, data, errorMsg, tileRequest ) { + if ( !data ) { + $.console.error( "Tile %s failed to load: %s - error: %s", tile, tile.getUrl(), errorMsg ); + /** + * Triggered when a tile fails to load. + * + * @event tile-load-failed + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Tile} tile - The tile that failed to load. + * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image the tile belongs to. + * @property {number} time - The time in milliseconds when the tile load began. + * @property {string} message - The error message. + * @property {XMLHttpRequest} tileRequest - The XMLHttpRequest used to load the tile if available. + */ + this.viewer.raiseEvent("tile-load-failed", { + tile: tile, + tiledImage: this, + time: time, + message: errorMsg, + tileRequest: tileRequest + }); + tile.loading = false; + tile.exists = false; + return; + } else { + tile.exists = true; + } + + if ( time < this.lastResetTime ) { + $.console.warn( "Ignoring tile %s loaded before reset: %s", tile, tile.getUrl() ); + tile.loading = false; + return; + } + + var _this = this, + finish = function() { + var ccc = _this.source; + var cutoff = ccc.getClosestLevel(); + _this._setTileLoaded(tile, data, cutoff, tileRequest); + }; + + // Check if we're mid-update; this can happen on IE8 because image load events for + // cached images happen immediately there + if ( !this._midDraw ) { + finish(); + } else { + // Wait until after the update, in case caching unloads any tiles + window.setTimeout( finish, 1); + } + }, + + /** + * @private + * @inner + * @param {OpenSeadragon.Tile} tile + * @param {*} data image data, the data sent to ImageJob.prototype.finish(), by default an Image object + * @param {Number|undefined} cutoff + * @param {XMLHttpRequest|undefined} tileRequest + */ + _setTileLoaded: function(tile, data, cutoff, tileRequest) { + var increment = 0, + eventFinished = false, + _this = this; + + function getCompletionCallback() { + if (eventFinished) { + $.console.error("Event 'tile-loaded' argument getCompletionCallback must be called synchronously. " + + "Its return value should be called asynchronously."); + } + increment++; + return completionCallback; + } + + function completionCallback() { + increment--; + if (increment === 0) { + tile.loading = false; + tile.loaded = true; + tile.hasTransparency = _this.source.hasTransparency( + tile.context2D, tile.getUrl(), tile.ajaxHeaders, tile.postData + ); + if (!tile.context2D) { + _this._tileCache.cacheTile({ + data: data, + tile: tile, + cutoff: cutoff, + tiledImage: _this + }); + } + _this._needsDraw = true; + } + } + + /** + * Triggered when a tile has just been loaded in memory. That means that the + * image has been downloaded and can be modified before being drawn to the canvas. + * + * @event tile-loaded + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {Image|*} image - The image (data) of the tile. Deprecated. + * @property {*} data image data, the data sent to ImageJob.prototype.finish(), by default an Image object + * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the loaded tile. + * @property {OpenSeadragon.Tile} tile - The tile which has been loaded. + * @property {XMLHttpRequest} tileRequest - The AJAX request that loaded this tile (if applicable). + * @property {function} getCompletionCallback - A function giving a callback to call + * when the asynchronous processing of the image is done. The image will be + * marked as entirely loaded when the callback has been called once for each + * call to getCompletionCallback. + */ + + var fallbackCompletion = getCompletionCallback(); + this.viewer.raiseEvent("tile-loaded", { + tile: tile, + tiledImage: this, + tileRequest: tileRequest, + get image() { + $.console.error("[tile-loaded] event 'image' has been deprecated. Use 'data' property instead."); + return data; + }, + data: data, + getCompletionCallback: getCompletionCallback + }); + eventFinished = true; + // In case the completion callback is never called, we at least force it once. + fallbackCompletion(); + }, + + /** + * @private + * @inner + * @param {OpenSeadragon.Tile} tile + * @param {Boolean} overlap + * @param {OpenSeadragon.Viewport} viewport + * @param {OpenSeadragon.Point} viewportCenter + * @param {Number} levelVisibility + */ + _positionTile: function( tile, overlap, viewport, viewportCenter, levelVisibility ){ + var boundsTL = tile.bounds.getTopLeft(); + + boundsTL.x *= this._scaleSpring.current.value; + boundsTL.y *= this._scaleSpring.current.value; + boundsTL.x += this._xSpring.current.value; + boundsTL.y += this._ySpring.current.value; + + var boundsSize = tile.bounds.getSize(); + + boundsSize.x *= this._scaleSpring.current.value; + boundsSize.y *= this._scaleSpring.current.value; + + var positionC = viewport.pixelFromPointNoRotate(boundsTL, true), + positionT = viewport.pixelFromPointNoRotate(boundsTL, false), + sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true), + sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false), + tileCenter = positionT.plus( sizeT.divide( 2 ) ), + tileSquaredDistance = viewportCenter.squaredDistanceTo( tileCenter ); + + if ( !overlap ) { + sizeC = sizeC.plus( new $.Point( 1, 1 ) ); + } + + if (tile.isRightMost && this.wrapHorizontal) { + sizeC.x += 0.75; // Otherwise Firefox and Safari show seams + } + + if (tile.isBottomMost && this.wrapVertical) { + sizeC.y += 0.75; // Otherwise Firefox and Safari show seams + } + + tile.position = positionC; + tile.size = sizeC; + tile.squaredDistance = tileSquaredDistance; + tile.visibility = levelVisibility; + }, + + /** + * @private + * @inner + * Updates the opacity of a tile according to the time it has been on screen + * to perform a fade-in. + * Updates coverage once a tile is fully opaque. + * Returns whether the fade-in has completed. + * + * @param {OpenSeadragon.Tile} tile + * @param {Number} x + * @param {Number} y + * @param {Number} level + * @param {Number} levelOpacity + * @param {Number} currentTime + * @returns {Boolean} + */ + _blendTile: function( tile, x, y, level, levelOpacity, currentTime ){ + var blendTimeMillis = 1000 * this.blendTime, + deltaTime, + opacity; + + if ( !tile.blendStart ) { + tile.blendStart = currentTime; + } + + deltaTime = currentTime - tile.blendStart; + opacity = blendTimeMillis ? Math.min( 1, deltaTime / ( blendTimeMillis ) ) : 1; + + if ( this.alwaysBlend ) { + opacity *= levelOpacity; + } + + tile.opacity = opacity; + + this.lastDrawn.push( tile ); + + if ( opacity === 1 ) { + this._setCoverage( this.coverage, level, x, y, true ); + this._hasOpaqueTile = true; + } else if ( deltaTime < blendTimeMillis ) { + return true; + } + + return false; + }, + + + /** + * @private + * @inner + * Determines whether the 'last best' tile for the area is better than the + * tile in question. + * + * @param {OpenSeadragon.Tile} previousBest + * @param {OpenSeadragon.Tile} tile + * @returns {OpenSeadragon.Tile} The new best tile. + */ + _compareTiles: function( previousBest, tile ) { + if ( !previousBest ) { + return tile; + } + + if ( tile.visibility > previousBest.visibility ) { + return tile; + } else if ( tile.visibility === previousBest.visibility ) { + if ( tile.squaredDistance < previousBest.squaredDistance ) { + return tile; + } + } + return previousBest; + }, + + /** + * @private + * @inner + * Draws a TiledImage. + * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame. + */ + _drawTiles: function( lastDrawn ) { + if (this.opacity === 0 || (lastDrawn.length === 0 && !this.placeholderFillStyle)) { + return; + } + + var tile = lastDrawn[0]; + var useSketch; + + if (tile) { + useSketch = this.opacity < 1 || + (this.compositeOperation && this.compositeOperation !== 'source-over') || + (!this._isBottomItem() && + this.source.hasTransparency(tile.context2D, tile.getUrl(), tile.ajaxHeaders, tile.postData)); + } + + var sketchScale; + var sketchTranslate; + + var zoom = this.viewport.getZoom(true); + var imageZoom = this.viewportToImageZoom(zoom); + + if (lastDrawn.length > 1 && + imageZoom > this.smoothTileEdgesMinZoom && + !this.iOSDevice && + this.getRotation(true) % 360 === 0 && // TODO: support tile edge smoothing with tiled image rotation. + $.supportsCanvas && this.viewer.useCanvas) { + // When zoomed in a lot (>100%) the tile edges are visible. + // So we have to composite them at ~100% and scale them up together. + // Note: Disabled on iOS devices per default as it causes a native crash + useSketch = true; + sketchScale = tile.getScaleForEdgeSmoothing(); + sketchTranslate = tile.getTranslationForEdgeSmoothing(sketchScale, + this._drawer.getCanvasSize(false), + this._drawer.getCanvasSize(true)); + } + + var bounds; + if (useSketch) { + if (!sketchScale) { + // Except when edge smoothing, we only clean the part of the + // sketch canvas we are going to use for performance reasons. + bounds = this.viewport.viewportToViewerElementRectangle( + this.getClippedBounds(true)) + .getIntegerBoundingBox(); + + if(this._drawer.viewer.viewport.getFlip()) { + if (this.viewport.getRotation(true) % 360 !== 0 || + this.getRotation(true) % 360 !== 0) { + bounds.x = this._drawer.viewer.container.clientWidth - (bounds.x + bounds.width); + } + } + + bounds = bounds.times($.pixelDensityRatio); + } + this._drawer._clear(true, bounds); + } + + // When scaling, we must rotate only when blending the sketch canvas to + // avoid interpolation + if (!sketchScale) { + if (this.viewport.getRotation(true) % 360 !== 0) { + this._drawer._offsetForRotation({ + degrees: this.viewport.getRotation(true), + useSketch: useSketch + }); + } + if (this.getRotation(true) % 360 !== 0) { + this._drawer._offsetForRotation({ + degrees: this.getRotation(true), + point: this.viewport.pixelFromPointNoRotate( + this._getRotationPoint(true), true), + useSketch: useSketch + }); + } + + if (this.viewport.getRotation(true) % 360 === 0 && + this.getRotation(true) % 360 === 0) { + if(this._drawer.viewer.viewport.getFlip()) { + this._drawer._flip(); + } + } + } + + var usedClip = false; + if ( this._clip ) { + this._drawer.saveContext(useSketch); + + var box = this.imageToViewportRectangle(this._clip, true); + box = box.rotate(-this.getRotation(true), this._getRotationPoint(true)); + var clipRect = this._drawer.viewportToDrawerRectangle(box); + if (sketchScale) { + clipRect = clipRect.times(sketchScale); + } + if (sketchTranslate) { + clipRect = clipRect.translate(sketchTranslate); + } + this._drawer.setClip(clipRect, useSketch); + + usedClip = true; + } + + if (this._croppingPolygons) { + var self = this; + this._drawer.saveContext(useSketch); + try { + var polygons = this._croppingPolygons.map(function (polygon) { + return polygon.map(function (coord) { + var point = self + .imageToViewportCoordinates(coord.x, coord.y, true) + .rotate(-self.getRotation(true), self._getRotationPoint(true)); + var clipPoint = self._drawer.viewportCoordToDrawerCoord(point); + if (sketchScale) { + clipPoint = clipPoint.times(sketchScale); + } + if (sketchTranslate) { + clipPoint = clipPoint.plus(sketchTranslate); + } + return clipPoint; + }); + }); + this._drawer.clipWithPolygons(polygons, useSketch); + } catch (e) { + $.console.error(e); + } + usedClip = true; + } + + if ( this.placeholderFillStyle && this._hasOpaqueTile === false ) { + var placeholderRect = this._drawer.viewportToDrawerRectangle(this.getBounds(true)); + if (sketchScale) { + placeholderRect = placeholderRect.times(sketchScale); + } + if (sketchTranslate) { + placeholderRect = placeholderRect.translate(sketchTranslate); + } + + var fillStyle = null; + if ( typeof this.placeholderFillStyle === "function" ) { + fillStyle = this.placeholderFillStyle(this, this._drawer.context); + } + else { + fillStyle = this.placeholderFillStyle; + } + + this._drawer.drawRectangle(placeholderRect, fillStyle, useSketch); + } + + var subPixelRoundingRule = determineSubPixelRoundingRule(this.subPixelRoundingForTransparency); + + var shouldRoundPositionAndSize = false; + + if (subPixelRoundingRule === $.SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS) { + shouldRoundPositionAndSize = true; + } else if (subPixelRoundingRule === $.SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST) { + var isAnimating = this.viewer && this.viewer.isAnimating(); + shouldRoundPositionAndSize = !isAnimating; + } + + for (var i = lastDrawn.length - 1; i >= 0; i--) { + tile = lastDrawn[ i ]; + this._drawer.drawTile( tile, this._drawingHandler, useSketch, sketchScale, + sketchTranslate, shouldRoundPositionAndSize, this.source ); + tile.beingDrawn = true; + + if( this.viewer ){ + /** + * - Needs documentation - + * + * @event tile-drawn + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event. + * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn. + * @property {OpenSeadragon.Tile} tile + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.viewer.raiseEvent( 'tile-drawn', { + tiledImage: this, + tile: tile + }); + } + } + + if ( usedClip ) { + this._drawer.restoreContext( useSketch ); + } + + if (!sketchScale) { + if (this.getRotation(true) % 360 !== 0) { + this._drawer._restoreRotationChanges(useSketch); + } + if (this.viewport.getRotation(true) % 360 !== 0) { + this._drawer._restoreRotationChanges(useSketch); + } + } + + if (useSketch) { + if (sketchScale) { + if (this.viewport.getRotation(true) % 360 !== 0) { + this._drawer._offsetForRotation({ + degrees: this.viewport.getRotation(true), + useSketch: false + }); + } + if (this.getRotation(true) % 360 !== 0) { + this._drawer._offsetForRotation({ + degrees: this.getRotation(true), + point: this.viewport.pixelFromPointNoRotate( + this._getRotationPoint(true), true), + useSketch: false + }); + } + } + this._drawer.blendSketch({ + opacity: this.opacity, + scale: sketchScale, + translate: sketchTranslate, + compositeOperation: this.compositeOperation, + bounds: bounds + }); + if (sketchScale) { + if (this.getRotation(true) % 360 !== 0) { + this._drawer._restoreRotationChanges(false); + } + if (this.viewport.getRotation(true) % 360 !== 0) { + this._drawer._restoreRotationChanges(false); + } + } + } + + if (!sketchScale) { + if (this.viewport.getRotation(true) % 360 === 0 && + this.getRotation(true) % 360 === 0) { + if(this._drawer.viewer.viewport.getFlip()) { + this._drawer._flip(); + } + } + } + + this._drawDebugInfo( lastDrawn ); + }, + + /** + * @private + * @inner + * Draws special debug information for a TiledImage if in debug mode. + * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame. + */ + _drawDebugInfo: function( lastDrawn ) { + if( this.debugMode ) { + for ( var i = lastDrawn.length - 1; i >= 0; i-- ) { + var tile = lastDrawn[ i ]; + try { + this._drawer.drawDebugInfo(tile, lastDrawn.length, i, this); + } catch(e) { + $.console.error(e); + } + } + } + }, + + /** + * @private + * @inner + * Returns true if the given tile provides coverage to lower-level tiles of + * lower resolution representing the same content. If neither x nor y is + * given, returns true if the entire visible level provides coverage. + * + * Note that out-of-bounds tiles provide coverage in this sense, since + * there's no content that they would need to cover. Tiles at non-existent + * levels that are within the image bounds, however, do not. + * + * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean. + * @param {Number} level - The resolution level of the tile. + * @param {Number} x - The X position of the tile. + * @param {Number} y - The Y position of the tile. + * @returns {Boolean} + */ + _providesCoverage: function( coverage, level, x, y ) { + var rows, + cols, + i, j; + + if ( !coverage[ level ] ) { + return false; + } + + if ( x === undefined || y === undefined ) { + rows = coverage[ level ]; + for ( i in rows ) { + if ( Object.prototype.hasOwnProperty.call( rows, i ) ) { + cols = rows[ i ]; + for ( j in cols ) { + if ( Object.prototype.hasOwnProperty.call( cols, j ) && !cols[ j ] ) { + return false; + } + } + } + } + + return true; + } + + return ( + coverage[ level ][ x] === undefined || + coverage[ level ][ x ][ y ] === undefined || + coverage[ level ][ x ][ y ] === true + ); + }, + + /** + * @private + * @inner + * Returns true if the given tile is completely covered by higher-level + * tiles of higher resolution representing the same content. If neither x + * nor y is given, returns true if the entire visible level is covered. + * + * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean. + * @param {Number} level - The resolution level of the tile. + * @param {Number} x - The X position of the tile. + * @param {Number} y - The Y position of the tile. + * @returns {Boolean} + */ + _isCovered: function( coverage, level, x, y ) { + if ( x === undefined || y === undefined ) { + return this._providesCoverage( coverage, level + 1 ); + } else { + return ( + this._providesCoverage( coverage, level + 1, 2 * x, 2 * y ) && + this._providesCoverage( coverage, level + 1, 2 * x, 2 * y + 1 ) && + this._providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y ) && + this._providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y + 1 ) + ); + } + }, + + /** + * @private + * @inner + * Sets whether the given tile provides coverage or not. + * + * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean. + * @param {Number} level - The resolution level of the tile. + * @param {Number} x - The X position of the tile. + * @param {Number} y - The Y position of the tile. + * @param {Boolean} covers - Whether the tile provides coverage. + */ + _setCoverage: function( coverage, level, x, y, covers ) { + if ( !coverage[ level ] ) { + $.console.warn( + "Setting coverage for a tile before its level's coverage has been reset: %s", + level + ); + return; + } + + if ( !coverage[ level ][ x ] ) { + coverage[ level ][ x ] = {}; + } + + coverage[ level ][ x ][ y ] = covers; + }, + + /** + * @private + * @inner + * Resets coverage information for the given level. This should be called + * after every draw routine. Note that at the beginning of the next draw + * routine, coverage for every visible tile should be explicitly set. + * + * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean. + * @param {Number} level - The resolution level of tiles to completely reset. + */ + _resetCoverage: function( coverage, level ) { + coverage[ level ] = {}; + } +}); + + +/** + * @private + * @inner + * Defines the value for subpixel rounding to fallback to in case of missing or + * invalid value. + */ +var DEFAULT_SUBPIXEL_ROUNDING_RULE = $.SUBPIXEL_ROUNDING_OCCURRENCES.NEVER; + +/** + * @private + * @inner + * Checks whether the input value is an invalid subpixel rounding enum value. + * + * @param {SUBPIXEL_ROUNDING_OCCURRENCES} value - The subpixel rounding enum value to check. + * @returns {Boolean} Returns true if the input value is none of the expected + * {@link SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS}, {@link SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST} or {@link SUBPIXEL_ROUNDING_OCCURRENCES.NEVER} value. + */ +function isSubPixelRoundingRuleUnknown(value) { + return value !== $.SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS && + value !== $.SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST && + value !== $.SUBPIXEL_ROUNDING_OCCURRENCES.NEVER; +} + +/** + * @private + * @inner + * Ensures the returned value is always a valid subpixel rounding enum value, + * defaulting to {@link SUBPIXEL_ROUNDING_OCCURRENCES.NEVER} if input is missing or invalid. + * + * @param {SUBPIXEL_ROUNDING_OCCURRENCES} value - The subpixel rounding enum value to normalize. + * @returns {SUBPIXEL_ROUNDING_OCCURRENCES} Returns a valid subpixel rounding enum value. + */ +function normalizeSubPixelRoundingRule(value) { + if (isSubPixelRoundingRuleUnknown(value)) { + return DEFAULT_SUBPIXEL_ROUNDING_RULE; + } + return value; +} + +/** + * @private + * @inner + * Ensures the returned value is always a valid subpixel rounding enum value, + * defaulting to 'NEVER' if input is missing or invalid. + * + * @param {Object} subPixelRoundingRules - A subpixel rounding enum values dictionary [{@link BROWSERS}] --> {@link SUBPIXEL_ROUNDING_OCCURRENCES}. + * @returns {SUBPIXEL_ROUNDING_OCCURRENCES} Returns the determined subpixel rounding enum value for the + * current browser. + */ +function determineSubPixelRoundingRule(subPixelRoundingRules) { + if (typeof subPixelRoundingRules === 'number') { + return normalizeSubPixelRoundingRule(subPixelRoundingRules); + } + + if (!subPixelRoundingRules || !$.Browser) { + return DEFAULT_SUBPIXEL_ROUNDING_RULE; + } + + var subPixelRoundingRule = subPixelRoundingRules[$.Browser.vendor]; + + if (isSubPixelRoundingRuleUnknown(subPixelRoundingRule)) { + subPixelRoundingRule = subPixelRoundingRules['*']; + } + + return normalizeSubPixelRoundingRule(subPixelRoundingRule); +} + +}( OpenSeadragon )); + +/* + * OpenSeadragon - TileCache + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +// private class +var TileRecord = function( options ) { + $.console.assert( options, "[TileCache.cacheTile] options is required" ); + $.console.assert( options.tile, "[TileCache.cacheTile] options.tile is required" ); + $.console.assert( options.tiledImage, "[TileCache.cacheTile] options.tiledImage is required" ); + this.tile = options.tile; + this.tiledImage = options.tiledImage; +}; + +// private class +var ImageRecord = function(options) { + $.console.assert( options, "[ImageRecord] options is required" ); + $.console.assert( options.data, "[ImageRecord] options.data is required" ); + this._tiles = []; + + options.create.apply(null, [this, options.data, options.ownerTile]); + this._destroyImplementation = options.destroy.bind(null, this); + this.getImage = options.getImage.bind(null, this); + this.getData = options.getData.bind(null, this); + this.getRenderedContext = options.getRenderedContext.bind(null, this); +}; + +ImageRecord.prototype = { + destroy: function() { + this._destroyImplementation(); + this._tiles = null; + }, + + addTile: function(tile) { + $.console.assert(tile, '[ImageRecord.addTile] tile is required'); + this._tiles.push(tile); + }, + + removeTile: function(tile) { + for (var i = 0; i < this._tiles.length; i++) { + if (this._tiles[i] === tile) { + this._tiles.splice(i, 1); + return; + } + } + + $.console.warn('[ImageRecord.removeTile] trying to remove unknown tile', tile); + }, + + getTileCount: function() { + return this._tiles.length; + } +}; + +/** + * @class TileCache + * @memberof OpenSeadragon + * @classdesc Stores all the tiles displayed in a {@link OpenSeadragon.Viewer}. + * You generally won't have to interact with the TileCache directly. + * @param {Object} options - Configuration for this TileCache. + * @param {Number} [options.maxImageCacheCount] - See maxImageCacheCount in + * {@link OpenSeadragon.Options} for details. + */ +$.TileCache = function( options ) { + options = options || {}; + + this._maxImageCacheCount = options.maxImageCacheCount || $.DEFAULT_SETTINGS.maxImageCacheCount; + this._tilesLoaded = []; + this._imagesLoaded = []; + this._imagesLoadedCount = 0; +}; + +/** @lends OpenSeadragon.TileCache.prototype */ +$.TileCache.prototype = { + /** + * @returns {Number} The total number of tiles that have been loaded by + * this TileCache. + */ + numTilesLoaded: function() { + return this._tilesLoaded.length; + }, + + /** + * Caches the specified tile, removing an old tile if necessary to stay under the + * maxImageCacheCount specified on construction. Note that if multiple tiles reference + * the same image, there may be more tiles than maxImageCacheCount; the goal is to keep + * the number of images below that number. Note, as well, that even the number of images + * may temporarily surpass that number, but should eventually come back down to the max specified. + * @param {Object} options - Tile info. + * @param {OpenSeadragon.Tile} options.tile - The tile to cache. + * @param {String} options.tile.cacheKey - The unique key used to identify this tile in the cache. + * @param {Image} options.image - The image of the tile to cache. + * @param {OpenSeadragon.TiledImage} options.tiledImage - The TiledImage that owns that tile. + * @param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this + * function will release an old tile. The cutoff option specifies a tile level at or below which + * tiles will not be released. + */ + cacheTile: function( options ) { + $.console.assert( options, "[TileCache.cacheTile] options is required" ); + $.console.assert( options.tile, "[TileCache.cacheTile] options.tile is required" ); + $.console.assert( options.tile.cacheKey, "[TileCache.cacheTile] options.tile.cacheKey is required" ); + $.console.assert( options.tiledImage, "[TileCache.cacheTile] options.tiledImage is required" ); + + var cutoff = options.cutoff || 0; + var insertionIndex = this._tilesLoaded.length; + + var imageRecord = this._imagesLoaded[options.tile.cacheKey]; + if (!imageRecord) { + + if (!options.data) { + $.console.error("[TileCache.cacheTile] options.image was renamed to options.data. '.image' attribute " + + "has been deprecated and will be removed in the future."); + options.data = options.image; + } + + $.console.assert( options.data, "[TileCache.cacheTile] options.data is required to create an ImageRecord" ); + imageRecord = this._imagesLoaded[options.tile.cacheKey] = new ImageRecord({ + data: options.data, + ownerTile: options.tile, + create: options.tiledImage.source.createTileCache, + destroy: options.tiledImage.source.destroyTileCache, + getImage: options.tiledImage.source.getTileCacheDataAsImage, + getData: options.tiledImage.source.getTileCacheData, + getRenderedContext: options.tiledImage.source.getTileCacheDataAsContext2D, + }); + + this._imagesLoadedCount++; + } + + imageRecord.addTile(options.tile); + options.tile.cacheImageRecord = imageRecord; + + // Note that just because we're unloading a tile doesn't necessarily mean + // we're unloading an image. With repeated calls it should sort itself out, though. + if ( this._imagesLoadedCount > this._maxImageCacheCount ) { + var worstTile = null; + var worstTileIndex = -1; + var worstTileRecord = null; + var prevTile, worstTime, worstLevel, prevTime, prevLevel, prevTileRecord; + + for ( var i = this._tilesLoaded.length - 1; i >= 0; i-- ) { + prevTileRecord = this._tilesLoaded[ i ]; + prevTile = prevTileRecord.tile; + + if ( prevTile.level <= cutoff || prevTile.beingDrawn ) { + continue; + } else if ( !worstTile ) { + worstTile = prevTile; + worstTileIndex = i; + worstTileRecord = prevTileRecord; + continue; + } + + prevTime = prevTile.lastTouchTime; + worstTime = worstTile.lastTouchTime; + prevLevel = prevTile.level; + worstLevel = worstTile.level; + + if ( prevTime < worstTime || + ( prevTime === worstTime && prevLevel > worstLevel ) ) { + worstTile = prevTile; + worstTileIndex = i; + worstTileRecord = prevTileRecord; + } + } + + if ( worstTile && worstTileIndex >= 0 ) { + this._unloadTile(worstTileRecord); + insertionIndex = worstTileIndex; + } + } + + this._tilesLoaded[ insertionIndex ] = new TileRecord({ + tile: options.tile, + tiledImage: options.tiledImage + }); + }, + + /** + * Clears all tiles associated with the specified tiledImage. + * @param {OpenSeadragon.TiledImage} tiledImage + */ + clearTilesFor: function( tiledImage ) { + $.console.assert(tiledImage, '[TileCache.clearTilesFor] tiledImage is required'); + var tileRecord; + for ( var i = 0; i < this._tilesLoaded.length; ++i ) { + tileRecord = this._tilesLoaded[ i ]; + if ( tileRecord.tiledImage === tiledImage ) { + this._unloadTile(tileRecord); + this._tilesLoaded.splice( i, 1 ); + i--; + } + } + }, + + // private + getImageRecord: function(cacheKey) { + $.console.assert(cacheKey, '[TileCache.getImageRecord] cacheKey is required'); + return this._imagesLoaded[cacheKey]; + }, + + // private + _unloadTile: function(tileRecord) { + $.console.assert(tileRecord, '[TileCache._unloadTile] tileRecord is required'); + var tile = tileRecord.tile; + var tiledImage = tileRecord.tiledImage; + + tile.unload(); + tile.cacheImageRecord = null; + + var imageRecord = this._imagesLoaded[tile.cacheKey]; + imageRecord.removeTile(tile); + if (!imageRecord.getTileCount()) { + imageRecord.destroy(); + delete this._imagesLoaded[tile.cacheKey]; + this._imagesLoadedCount--; + } + + /** + * Triggered when a tile has just been unloaded from memory. + * + * @event tile-unloaded + * @memberof OpenSeadragon.Viewer + * @type {object} + * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the unloaded tile. + * @property {OpenSeadragon.Tile} tile - The tile which has been unloaded. + */ + tiledImage.viewer.raiseEvent("tile-unloaded", { + tile: tile, + tiledImage: tiledImage + }); + } +}; + +}( OpenSeadragon )); + +/* + * OpenSeadragon - World + * + * Copyright (C) 2009 CodePlex Foundation + * Copyright (C) 2010-2022 OpenSeadragon contributors + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of CodePlex Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function( $ ){ + +/** + * @class World + * @memberof OpenSeadragon + * @extends OpenSeadragon.EventSource + * @classdesc Keeps track of all of the tiled images in the scene. + * @param {Object} options - World options. + * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this World. + **/ +$.World = function( options ) { + var _this = this; + + $.console.assert( options.viewer, "[World] options.viewer is required" ); + + $.EventSource.call( this ); + + this.viewer = options.viewer; + this._items = []; + this._needsDraw = false; + this._autoRefigureSizes = true; + this._needsSizesFigured = false; + this._delegatedFigureSizes = function(event) { + if (_this._autoRefigureSizes) { + _this._figureSizes(); + } else { + _this._needsSizesFigured = true; + } + }; + + this._figureSizes(); +}; + +$.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.World.prototype */{ + /** + * Add the specified item. + * @param {OpenSeadragon.TiledImage} item - The item to add. + * @param {Number} [options.index] - Index for the item. If not specified, goes at the top. + * @fires OpenSeadragon.World.event:add-item + * @fires OpenSeadragon.World.event:metrics-change + */ + addItem: function( item, options ) { + $.console.assert(item, "[World.addItem] item is required"); + $.console.assert(item instanceof $.TiledImage, "[World.addItem] only TiledImages supported at this time"); + + options = options || {}; + if (options.index !== undefined) { + var index = Math.max(0, Math.min(this._items.length, options.index)); + this._items.splice(index, 0, item); + } else { + this._items.push( item ); + } + + if (this._autoRefigureSizes) { + this._figureSizes(); + } else { + this._needsSizesFigured = true; + } + + this._needsDraw = true; + + item.addHandler('bounds-change', this._delegatedFigureSizes); + item.addHandler('clip-change', this._delegatedFigureSizes); + + /** + * Raised when an item is added to the World. + * @event add-item + * @memberOf OpenSeadragon.World + * @type {object} + * @property {OpenSeadragon.Viewer} eventSource - A reference to the World which raised the event. + * @property {OpenSeadragon.TiledImage} item - The item that has been added. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'add-item', { + item: item + } ); + }, + + /** + * Get the item at the specified index. + * @param {Number} index - The item's index. + * @returns {OpenSeadragon.TiledImage} The item at the specified index. + */ + getItemAt: function( index ) { + $.console.assert(index !== undefined, "[World.getItemAt] index is required"); + return this._items[ index ]; + }, + + /** + * Get the index of the given item or -1 if not present. + * @param {OpenSeadragon.TiledImage} item - The item. + * @returns {Number} The index of the item or -1 if not present. + */ + getIndexOfItem: function( item ) { + $.console.assert(item, "[World.getIndexOfItem] item is required"); + return $.indexOf( this._items, item ); + }, + + /** + * @returns {Number} The number of items used. + */ + getItemCount: function() { + return this._items.length; + }, + + /** + * Change the index of a item so that it appears over or under others. + * @param {OpenSeadragon.TiledImage} item - The item to move. + * @param {Number} index - The new index. + * @fires OpenSeadragon.World.event:item-index-change + */ + setItemIndex: function( item, index ) { + $.console.assert(item, "[World.setItemIndex] item is required"); + $.console.assert(index !== undefined, "[World.setItemIndex] index is required"); + + var oldIndex = this.getIndexOfItem( item ); + + if ( index >= this._items.length ) { + throw new Error( "Index bigger than number of layers." ); + } + + if ( index === oldIndex || oldIndex === -1 ) { + return; + } + + this._items.splice( oldIndex, 1 ); + this._items.splice( index, 0, item ); + this._needsDraw = true; + + /** + * Raised when the order of the indexes has been changed. + * @event item-index-change + * @memberOf OpenSeadragon.World + * @type {object} + * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event. + * @property {OpenSeadragon.TiledImage} item - The item whose index has + * been changed + * @property {Number} previousIndex - The previous index of the item + * @property {Number} newIndex - The new index of the item + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'item-index-change', { + item: item, + previousIndex: oldIndex, + newIndex: index + } ); + }, + + /** + * Remove an item. + * @param {OpenSeadragon.TiledImage} item - The item to remove. + * @fires OpenSeadragon.World.event:remove-item + * @fires OpenSeadragon.World.event:metrics-change + */ + removeItem: function( item ) { + $.console.assert(item, "[World.removeItem] item is required"); + + var index = $.indexOf(this._items, item ); + if ( index === -1 ) { + return; + } + + item.removeHandler('bounds-change', this._delegatedFigureSizes); + item.removeHandler('clip-change', this._delegatedFigureSizes); + item.destroy(); + this._items.splice( index, 1 ); + this._figureSizes(); + this._needsDraw = true; + this._raiseRemoveItem(item); + }, + + /** + * Remove all items. + * @fires OpenSeadragon.World.event:remove-item + * @fires OpenSeadragon.World.event:metrics-change + */ + removeAll: function() { + // We need to make sure any pending images are canceled so the world items don't get messed up + this.viewer._cancelPendingImages(); + var item; + var i; + for (i = 0; i < this._items.length; i++) { + item = this._items[i]; + item.removeHandler('bounds-change', this._delegatedFigureSizes); + item.removeHandler('clip-change', this._delegatedFigureSizes); + item.destroy(); + } + + var removedItems = this._items; + this._items = []; + this._figureSizes(); + this._needsDraw = true; + + for (i = 0; i < removedItems.length; i++) { + item = removedItems[i]; + this._raiseRemoveItem(item); + } + }, + + /** + * Clears all tiles and triggers updates for all items. + */ + resetItems: function() { + for ( var i = 0; i < this._items.length; i++ ) { + this._items[i].reset(); + } + }, + + /** + * Updates (i.e. animates bounds of) all items. + */ + update: function() { + var animated = false; + for ( var i = 0; i < this._items.length; i++ ) { + animated = this._items[i].update() || animated; + } + + return animated; + }, + + /** + * Draws all items. + */ + draw: function() { + for ( var i = 0; i < this._items.length; i++ ) { + this._items[i].draw(); + } + + this._needsDraw = false; + }, + + /** + * @returns {Boolean} true if any items need updating. + */ + needsDraw: function() { + for ( var i = 0; i < this._items.length; i++ ) { + if ( this._items[i].needsDraw() ) { + return true; + } + } + return this._needsDraw; + }, + + /** + * @returns {OpenSeadragon.Rect} The smallest rectangle that encloses all items, in viewport coordinates. + */ + getHomeBounds: function() { + return this._homeBounds.clone(); + }, + + /** + * To facilitate zoom constraints, we keep track of the pixel density of the + * densest item in the World (i.e. the item whose content size to viewport size + * ratio is the highest) and save it as this "content factor". + * @returns {Number} the number of content units per viewport unit. + */ + getContentFactor: function() { + return this._contentFactor; + }, + + /** + * As a performance optimization, setting this flag to false allows the bounds-change event handler + * on tiledImages to skip calculations on the world bounds. If a lot of images are going to be positioned in + * rapid succession, this is a good idea. When finished, setAutoRefigureSizes should be called with true + * or the system may behave oddly. + * @param {Boolean} [value] The value to which to set the flag. + */ + setAutoRefigureSizes: function(value) { + this._autoRefigureSizes = value; + if (value & this._needsSizesFigured) { + this._figureSizes(); + this._needsSizesFigured = false; + } + }, + + /** + * Arranges all of the TiledImages with the specified settings. + * @param {Object} options - Specifies how to arrange. + * @param {Boolean} [options.immediately=false] - Whether to animate to the new arrangement. + * @param {String} [options.layout] - See collectionLayout in {@link OpenSeadragon.Options}. + * @param {Number} [options.rows] - See collectionRows in {@link OpenSeadragon.Options}. + * @param {Number} [options.columns] - See collectionColumns in {@link OpenSeadragon.Options}. + * @param {Number} [options.tileSize] - See collectionTileSize in {@link OpenSeadragon.Options}. + * @param {Number} [options.tileMargin] - See collectionTileMargin in {@link OpenSeadragon.Options}. + * @fires OpenSeadragon.World.event:metrics-change + */ + arrange: function(options) { + options = options || {}; + var immediately = options.immediately || false; + var layout = options.layout || $.DEFAULT_SETTINGS.collectionLayout; + var rows = options.rows || $.DEFAULT_SETTINGS.collectionRows; + var columns = options.columns || $.DEFAULT_SETTINGS.collectionColumns; + var tileSize = options.tileSize || $.DEFAULT_SETTINGS.collectionTileSize; + var tileMargin = options.tileMargin || $.DEFAULT_SETTINGS.collectionTileMargin; + var increment = tileSize + tileMargin; + var wrap; + if (!options.rows && columns) { + wrap = columns; + } else { + wrap = Math.ceil(this._items.length / rows); + } + var x = 0; + var y = 0; + var item, box, width, height, position; + + this.setAutoRefigureSizes(false); + for (var i = 0; i < this._items.length; i++) { + if (i && (i % wrap) === 0) { + if (layout === 'horizontal') { + y += increment; + x = 0; + } else { + x += increment; + y = 0; + } + } + + item = this._items[i]; + box = item.getBounds(); + if (box.width > box.height) { + width = tileSize; + } else { + width = tileSize * (box.width / box.height); + } + + height = width * (box.height / box.width); + position = new $.Point(x + ((tileSize - width) / 2), + y + ((tileSize - height) / 2)); + + item.setPosition(position, immediately); + item.setWidth(width, immediately); + + if (layout === 'horizontal') { + x += increment; + } else { + y += increment; + } + } + this.setAutoRefigureSizes(true); + }, + + // private + _figureSizes: function() { + var oldHomeBounds = this._homeBounds ? this._homeBounds.clone() : null; + var oldContentSize = this._contentSize ? this._contentSize.clone() : null; + var oldContentFactor = this._contentFactor || 0; + + if (!this._items.length) { + this._homeBounds = new $.Rect(0, 0, 1, 1); + this._contentSize = new $.Point(1, 1); + this._contentFactor = 1; + } else { + var item = this._items[0]; + var bounds = item.getBounds(); + this._contentFactor = item.getContentSize().x / bounds.width; + var clippedBounds = item.getClippedBounds().getBoundingBox(); + var left = clippedBounds.x; + var top = clippedBounds.y; + var right = clippedBounds.x + clippedBounds.width; + var bottom = clippedBounds.y + clippedBounds.height; + for (var i = 1; i < this._items.length; i++) { + item = this._items[i]; + bounds = item.getBounds(); + this._contentFactor = Math.max(this._contentFactor, + item.getContentSize().x / bounds.width); + clippedBounds = item.getClippedBounds().getBoundingBox(); + left = Math.min(left, clippedBounds.x); + top = Math.min(top, clippedBounds.y); + right = Math.max(right, clippedBounds.x + clippedBounds.width); + bottom = Math.max(bottom, clippedBounds.y + clippedBounds.height); + } + + this._homeBounds = new $.Rect(left, top, right - left, bottom - top); + this._contentSize = new $.Point( + this._homeBounds.width * this._contentFactor, + this._homeBounds.height * this._contentFactor); + } + + if (this._contentFactor !== oldContentFactor || + !this._homeBounds.equals(oldHomeBounds) || + !this._contentSize.equals(oldContentSize)) { + /** + * Raised when the home bounds or content factor change. + * @event metrics-change + * @memberOf OpenSeadragon.World + * @type {object} + * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent('metrics-change', {}); + } + }, + + // private + _raiseRemoveItem: function(item) { + /** + * Raised when an item is removed. + * @event remove-item + * @memberOf OpenSeadragon.World + * @type {object} + * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event. + * @property {OpenSeadragon.TiledImage} item - The item's underlying item. + * @property {?Object} userData - Arbitrary subscriber-defined object. + */ + this.raiseEvent( 'remove-item', { item: item } ); + } +}); + +}( OpenSeadragon )); + +//# sourceMappingURL=openseadragon.js.map \ No newline at end of file diff --git a/script/openseadragon/openseadragon.js.map b/script/openseadragon/openseadragon.js.map new file mode 100644 index 0000000..bbdd2c2 --- /dev/null +++ b/script/openseadragon/openseadragon.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/openseadragon.js","../../src/fullscreen.js","../../src/eventsource.js","../../src/mousetracker.js","../../src/control.js","../../src/controldock.js","../../src/placement.js","../../src/viewer.js","../../src/navigator.js","../../src/strings.js","../../src/point.js","../../src/tilesource.js","../../src/dzitilesource.js","../../src/iiiftilesource.js","../../src/osmtilesource.js","../../src/tmstilesource.js","../../src/zoomifytilesource.js","../../src/legacytilesource.js","../../src/imagetilesource.js","../../src/tilesourcecollection.js","../../src/button.js","../../src/buttongroup.js","../../src/rectangle.js","../../src/referencestrip.js","../../src/displayrectangle.js","../../src/spring.js","../../src/imageloader.js","../../src/tile.js","../../src/overlay.js","../../src/drawer.js","../../src/viewport.js","../../src/tiledimage.js","../../src/tilecache.js","../../src/world.js"],"names":[],"mappings":"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","file":"openseadragon.js","sourcesContent":["/*\n * OpenSeadragon\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Portions of this source file taken from jQuery:\n *\n * Copyright 2011 John Resig\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/*\n * Portions of this source file taken from mattsnider.com:\n *\n * Copyright (c) 2006-2022 Matt Snider\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\n * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR\n * THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n\n/**\n * @namespace OpenSeadragon\n * @version openseadragon 4.1.0\n * @classdesc The root namespace for OpenSeadragon. All utility methods\n * and classes are defined on or below this namespace.\n *\n */\n\n\n// Typedefs\n\n /**\n * All required and optional settings for instantiating a new instance of an OpenSeadragon image viewer.\n *\n * @typedef {Object} Options\n * @memberof OpenSeadragon\n *\n * @property {String} id\n * Id of the element to append the viewer's container element to. If not provided, the 'element' property must be provided.\n * If both the element and id properties are specified, the viewer is appended to the element provided in the element property.\n *\n * @property {Element} element\n * The element to append the viewer's container element to. If not provided, the 'id' property must be provided.\n * If both the element and id properties are specified, the viewer is appended to the element provided in the element property.\n *\n * @property {Array|String|Function|Object} [tileSources=null]\n * Tile source(s) to open initially. This is a complex parameter; see\n * {@link OpenSeadragon.Viewer#open} for details.\n *\n * @property {Number} [tabIndex=0]\n * Tabbing order index to assign to the viewer element. Positive values are selected in increasing order. When tabIndex is 0\n * source order is used. A negative value omits the viewer from the tabbing order.\n *\n * @property {Array} overlays Array of objects defining permanent overlays of\n * the viewer. The overlays added via this option and later removed with\n * {@link OpenSeadragon.Viewer#removeOverlay} will be added back when a new\n * image is opened.\n * To add overlays which can be definitively removed, one must use\n * {@link OpenSeadragon.Viewer#addOverlay}\n * If displaying a sequence of images, the overlays can be associated\n * with a specific page by passing the overlays array to the page's\n * tile source configuration.\n * Expected properties:\n * * x, y, (or px, py for pixel coordinates) to define the location.\n * * width, height in point if using x,y or in pixels if using px,py. If width\n * and height are specified, the overlay size is adjusted when zooming,\n * otherwise the size stays the size of the content (or the size defined by CSS).\n * * className to associate a class to the overlay\n * * id to set the overlay element. If an element with this id already exists,\n * it is reused, otherwise it is created. If not specified, a new element is\n * created.\n * * placement a string to define the relative position to the viewport.\n * Only used if no width and height are specified. Default: 'TOP_LEFT'.\n * See {@link OpenSeadragon.Placement} for possible values.\n *\n * @property {String} [xmlPath=null]\n * DEPRECATED. A relative path to load a DZI file from the server.\n * Prefer the newer Options.tileSources.\n *\n * @property {String} [prefixUrl='/images/']\n * Prepends the prefixUrl to navImages paths, which is very useful\n * since the default paths are rarely useful for production\n * environments.\n *\n * @property {OpenSeadragon.NavImages} [navImages]\n * An object with a property for each button or other built-in navigation\n * control, eg the current 'zoomIn', 'zoomOut', 'home', and 'fullpage'.\n * Each of those in turn provides an image path for each state of the button\n * or navigation control, eg 'REST', 'GROUP', 'HOVER', 'PRESS'. Finally the\n * image paths, by default assume there is a folder on the servers root path\n * called '/images', eg '/images/zoomin_rest.png'. If you need to adjust\n * these paths, prefer setting the option.prefixUrl rather than overriding\n * every image path directly through this setting.\n *\n * @property {Boolean} [debugMode=false]\n * TODO: provide an in-screen panel providing event detail feedback.\n *\n * @property {String} [debugGridColor=['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']]\n * The colors of grids in debug mode. Each tiled image's grid uses a consecutive color.\n * If there are more tiled images than provided colors, the color vector is recycled.\n *\n * @property {Boolean} [silenceMultiImageWarnings=false]\n * Silences warnings when calling viewport coordinate functions with multi-image.\n * Useful when you're overlaying multiple images on top of one another.\n *\n * @property {Number} [blendTime=0]\n * Specifies the duration of animation as higher or lower level tiles are\n * replacing the existing tile.\n *\n * @property {Boolean} [alwaysBlend=false]\n * Forces the tile to always blend. By default the tiles skip blending\n * when the blendTime is surpassed and the current animation frame would\n * not complete the blend.\n *\n * @property {Boolean} [autoHideControls=true]\n * If the user stops interacting with the viewport, fade the navigation\n * controls. Useful for presentation since the controls are by default\n * floated on top of the image the user is viewing.\n *\n * @property {Boolean} [immediateRender=false]\n * Render the best closest level first, ignoring the lowering levels which\n * provide the effect of very blurry to sharp. It is recommended to change\n * setting to true for mobile devices.\n *\n * @property {Number} [defaultZoomLevel=0]\n * Zoom level to use when image is first opened or the home button is clicked.\n * If 0, adjusts to fit viewer.\n *\n * @property {Number} [opacity=1]\n * Default proportional opacity of the tiled images (1=opaque, 0=hidden)\n * Hidden images do not draw and only load when preloading is allowed.\n *\n * @property {Boolean} [preload=false]\n * Default switch for loading hidden images (true loads, false blocks)\n *\n * @property {String} [compositeOperation=null]\n * Valid values are 'source-over', 'source-atop', 'source-in', 'source-out',\n * 'destination-over', 'destination-atop', 'destination-in', 'destination-out',\n * 'lighter', 'difference', 'copy', 'xor', etc.\n * For complete list of modes, please @see {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation/ globalCompositeOperation}\n *\n * @property {Boolean} [imageSmoothingEnabled=true]\n * Image smoothing for canvas rendering (only if canvas is used). Note: Ignored\n * by some (especially older) browsers which do not support this canvas property.\n * This property can be changed in {@link Viewer.Drawer.setImageSmoothingEnabled}.\n *\n * @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null]\n * Draws a colored rectangle behind the tile if it is not loaded yet.\n * You can pass a CSS color value like \"#FF8800\".\n * When passing a function the tiledImage and canvas context are available as argument which is useful when you draw a gradient or pattern.\n *\n * @property {Object} [subPixelRoundingForTransparency=null]\n * Determines when subpixel rounding should be applied for tiles when rendering images that support transparency.\n * This property is a subpixel rounding enum values dictionary [{@link BROWSERS}] --> {@link SUBPIXEL_ROUNDING_OCCURRENCES}.\n * The key is a {@link BROWSERS} value, and the value is one of {@link SUBPIXEL_ROUNDING_OCCURRENCES},\n * indicating, for a given browser, when to apply subpixel rounding.\n * Key '*' is the fallback value for any browser not specified in the dictionary.\n * This property has a simple mode, and one can set it directly to\n * {@link SUBPIXEL_ROUNDING_OCCURRENCES.NEVER}, {@link SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST} or {@link SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS}\n * in order to apply this rule for all browser. The values {@link SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS} would be equivalent to { '*', SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS }.\n * The default is {@link SUBPIXEL_ROUNDING_OCCURRENCES.NEVER} for all browsers, for backward compatibility reason.\n *\n * @property {Number} [degrees=0]\n * Initial rotation.\n *\n * @property {Boolean} [flipped=false]\n * Initial flip state.\n *\n * @property {Number} [minZoomLevel=null]\n *\n * @property {Number} [maxZoomLevel=null]\n *\n * @property {Boolean} [homeFillsViewer=false]\n * Make the 'home' button fill the viewer and clip the image, instead\n * of fitting the image to the viewer and letterboxing.\n *\n * @property {Boolean} [panHorizontal=true]\n * Allow horizontal pan.\n *\n * @property {Boolean} [panVertical=true]\n * Allow vertical pan.\n *\n * @property {Boolean} [constrainDuringPan=false]\n *\n * @property {Boolean} [wrapHorizontal=false]\n * Set to true to force the image to wrap horizontally within the viewport.\n * Useful for maps or images representing the surface of a sphere or cylinder.\n *\n * @property {Boolean} [wrapVertical=false]\n * Set to true to force the image to wrap vertically within the viewport.\n * Useful for maps or images representing the surface of a sphere or cylinder.\n *\n * @property {Number} [minZoomImageRatio=0.9]\n * The minimum percentage ( expressed as a number between 0 and 1 ) of\n * the viewport height or width at which the zoom out will be constrained.\n * Setting it to 0, for example will allow you to zoom out infinity.\n *\n * @property {Number} [maxZoomPixelRatio=1.1]\n * The maximum ratio to allow a zoom-in to affect the highest level pixel\n * ratio. This can be set to Infinity to allow 'infinite' zooming into the\n * image though it is less effective visually if the HTML5 Canvas is not\n * available on the viewing device.\n *\n * @property {Number} [smoothTileEdgesMinZoom=1.1]\n * A zoom percentage ( where 1 is 100% ) of the highest resolution level.\n * When zoomed in beyond this value alternative compositing will be used to\n * smooth out the edges between tiles. This will have a performance impact.\n * Can be set to Infinity to turn it off.\n * Note: This setting is ignored on iOS devices due to a known bug (See {@link https://github.com/openseadragon/openseadragon/issues/952})\n *\n * @property {Boolean} [iOSDevice=?]\n * True if running on an iOS device, false otherwise.\n * Used to disable certain features that behave differently on iOS devices.\n *\n * @property {Boolean} [autoResize=true]\n * Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior.\n *\n * @property {Boolean} [preserveImageSizeOnResize=false]\n * Set to true to have the image size preserved when the viewer is resized. This requires autoResize=true (default).\n *\n * @property {Number} [minScrollDeltaTime=50]\n * Number of milliseconds between canvas-scroll events. This value helps normalize the rate of canvas-scroll\n * events between different devices, causing the faster devices to slow down enough to make the zoom control\n * more manageable.\n *\n * @property {Number} [rotationIncrement=90]\n * The number of degrees to rotate right or left when the rotate buttons or keyboard shortcuts are activated.\n *\n * @property {Number} [pixelsPerWheelLine=40]\n * For pixel-resolution scrolling devices, the number of pixels equal to one scroll line.\n *\n * @property {Number} [pixelsPerArrowPress=40]\n * The number of pixels viewport moves when an arrow key is pressed.\n *\n * @property {Number} [visibilityRatio=0.5]\n * The percentage ( as a number from 0 to 1 ) of the source image which\n * must be kept within the viewport. If the image is dragged beyond that\n * limit, it will 'bounce' back until the minimum visibility ratio is\n * achieved. Setting this to 0 and wrapHorizontal ( or wrapVertical ) to\n * true will provide the effect of an infinitely scrolling viewport.\n *\n * @property {Object} [viewportMargins={}]\n * Pushes the \"home\" region in from the sides by the specified amounts.\n * Possible subproperties (Numbers, in screen coordinates): left, top, right, bottom.\n *\n * @property {Number} [imageLoaderLimit=0]\n * The maximum number of image requests to make concurrently. By default\n * it is set to 0 allowing the browser to make the maximum number of\n * image requests in parallel as allowed by the browsers policy.\n *\n * @property {Number} [clickTimeThreshold=300]\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n *\n * @property {Number} [clickDistThreshold=5]\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n *\n * @property {Number} [dblClickTimeThreshold=300]\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n *\n * @property {Number} [dblClickDistThreshold=20]\n * The maximum distance allowed between two pointer click events\n * to be treated as a double-click gesture.\n *\n * @property {Number} [springStiffness=6.5]\n *\n * @property {Number} [animationTime=1.2]\n * Specifies the animation duration per each {@link OpenSeadragon.Spring}\n * which occur when the image is dragged, zoomed or rotated.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse]\n * Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsMouse.dragToPan=true] - Pan on drag gesture\n * @property {Boolean} [gestureSettingsMouse.scrollToZoom=true] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsMouse.clickToZoom=true] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsMouse.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsMouse.dblClickDragToZoom=false] - Zoom on dragging through\n * double-click gesture ( single click and next click to drag). Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsMouse.pinchToZoom=false] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsMouse.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n * the zoom is centered at the canvas center.\n * @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture\n * @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsMouse.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsTouch]\n * Settings for gestures generated by a touch pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsTouch.dragToPan=true] - Pan on drag gesture\n * @property {Boolean} [gestureSettingsTouch.scrollToZoom=false] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsTouch.clickToZoom=false] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsTouch.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsTouch.dblClickDragToZoom=true] - Zoom on dragging through\n * double-click gesture ( single click and next click to drag). Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n\n * @property {Boolean} [gestureSettingsTouch.pinchToZoom=true] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsTouch.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n * the zoom is centered at the canvas center.\n * @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture\n * @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsTouch.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsPen]\n * Settings for gestures generated by a pen pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsPen.dragToPan=true] - Pan on drag gesture\n * @property {Boolean} [gestureSettingsPen.scrollToZoom=false] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsPen.clickToZoom=true] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsPen.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n * the zoom is centered at the canvas center.\n * @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture\n * @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsPen.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsUnknown]\n * Settings for gestures generated by unknown pointer devices. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsUnknown.dragToPan=true] - Pan on drag gesture\n * @property {Boolean} [gestureSettingsUnknown.scrollToZoom=true] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsUnknown.clickToZoom=false] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsUnknown.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsUnknown.dblClickDragToZoom=false] - Zoom on dragging through\n * double-click gesture ( single click and next click to drag). Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsUnknown.pinchToZoom=true] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsUnknown.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,\n * the zoom is centered at the canvas center.\n * @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture\n * @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsUnknown.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {Number} [zoomPerClick=2.0]\n * The \"zoom distance\" per mouse click or touch tap. Note: Setting this to 1.0 effectively disables the click-to-zoom feature (also see gestureSettings[Mouse|Touch|Pen].clickToZoom/dblClickToZoom).\n *\n * @property {Number} [zoomPerScroll=1.2]\n * The \"zoom distance\" per mouse scroll or touch pinch. Note: Setting this to 1.0 effectively disables the mouse-wheel zoom feature (also see gestureSettings[Mouse|Touch|Pen].scrollToZoom}).\n *\n * @property {Number} [zoomPerDblClickDrag=1.2]\n * The \"zoom distance\" per double-click mouse drag. Note: Setting this to 1.0 effectively disables the double-click-drag-to-Zoom feature (also see gestureSettings[Mouse|Touch|Pen].dblClickDragToZoom).\n *\n * @property {Number} [zoomPerSecond=1.0]\n * Sets the zoom amount per second when zoomIn/zoomOut buttons are pressed and held.\n * The value is a factor of the current zoom, so 1.0 (the default) disables zooming when the zoomIn/zoomOut buttons\n * are held. Higher values will increase the rate of zoom when the zoomIn/zoomOut buttons are held. Note that values\n * < 1.0 will reverse the operation of the zoomIn/zoomOut buttons (zoomIn button will decrease the zoom, zoomOut will\n * increase the zoom).\n *\n * @property {Boolean} [showNavigator=false]\n * Set to true to make the navigator minimap appear.\n *\n * @property {Element} [navigatorElement=null]\n * The element to hold the navigator minimap.\n * If an element is specified, the Id option (see navigatorId) is ignored.\n * If no element nor ID is specified, a div element will be generated accordingly.\n *\n * @property {String} [navigatorId=navigator-GENERATED DATE]\n * The ID of a div to hold the navigator minimap.\n * If an ID is specified, the navigatorPosition, navigatorSizeRatio, navigatorMaintainSizeRatio, navigator[Top|Left|Height|Width] and navigatorAutoFade options will be ignored.\n * If an ID is not specified, a div element will be generated and placed on top of the main image.\n *\n * @property {String} [navigatorPosition='TOP_RIGHT']\n * Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', 'BOTTOM_RIGHT', or 'ABSOLUTE'.
    \n * If 'ABSOLUTE' is specified, then navigator[Top|Left|Height|Width] determines the size and position of the navigator minimap in the viewer, and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.
    \n * For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT', the navigatorSizeRatio or navigator[Height|Width] values determine the size of the navigator minimap.\n *\n * @property {Number} [navigatorSizeRatio=0.2]\n * Ratio of navigator size to viewer size. Ignored if navigator[Height|Width] are specified.\n *\n * @property {Boolean} [navigatorMaintainSizeRatio=false]\n * If true, the navigator minimap is resized (using navigatorSizeRatio) when the viewer size changes.\n *\n * @property {Number|String} [navigatorTop=null]\n * Specifies the location of the navigator minimap (see navigatorPosition).\n *\n * @property {Number|String} [navigatorLeft=null]\n * Specifies the location of the navigator minimap (see navigatorPosition).\n *\n * @property {Number|String} [navigatorHeight=null]\n * Specifies the size of the navigator minimap (see navigatorPosition).\n * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.\n *\n * @property {Number|String} [navigatorWidth=null]\n * Specifies the size of the navigator minimap (see navigatorPosition).\n * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.\n *\n * @property {Boolean} [navigatorAutoResize=true]\n * Set to false to prevent polling for navigator size changes. Useful for providing custom resize behavior.\n * Setting to false can also improve performance when the navigator is configured to a fixed size.\n *\n * @property {Boolean} [navigatorAutoFade=true]\n * If the user stops interacting with the viewport, fade the navigator minimap.\n * Setting to false will make the navigator minimap always visible.\n *\n * @property {Boolean} [navigatorRotate=true]\n * If true, the navigator will be rotated together with the viewer.\n *\n * @property {String} [navigatorBackground='#000']\n * Specifies the background color of the navigator minimap\n *\n * @property {Number} [navigatorOpacity=0.8]\n * Specifies the opacity of the navigator minimap.\n *\n * @property {String} [navigatorBorderColor='#555']\n * Specifies the border color of the navigator minimap\n *\n * @property {String} [navigatorDisplayRegionColor='#900']\n * Specifies the border color of the display region rectangle of the navigator minimap\n *\n * @property {Number} [controlsFadeDelay=2000]\n * The number of milliseconds to wait once the user has stopped interacting\n * with the interface before beginning to fade the controls. Assumes\n * showNavigationControl and autoHideControls are both true.\n *\n * @property {Number} [controlsFadeLength=1500]\n * The number of milliseconds to animate the controls fading out.\n *\n * @property {Number} [maxImageCacheCount=200]\n * The max number of images we should keep in memory (per drawer).\n *\n * @property {Number} [timeout=30000]\n * The max number of milliseconds that an image job may take to complete.\n *\n * @property {Number} [tileRetryMax=0]\n * The max number of retries when a tile download fails. By default it's 0, so retries are disabled.\n *\n * @property {Number} [tileRetryDelay=2500]\n * Milliseconds to wait after each tile retry if tileRetryMax is set.\n *\n * @property {Boolean} [useCanvas=true]\n * Set to false to not use an HTML canvas element for image rendering even if canvas is supported.\n *\n * @property {Number} [minPixelRatio=0.5]\n * The higher the minPixelRatio, the lower the quality of the image that\n * is considered sufficient to stop rendering a given zoom level. For\n * example, if you are targeting mobile devices with less bandwidth you may\n * try setting this to 1.5 or higher.\n *\n * @property {Boolean} [mouseNavEnabled=true]\n * Is the user able to interact with the image via mouse or touch. Default\n * interactions include draging the image in a plane, and zooming in toward\n * and away from the image.\n *\n * @property {Boolean} [showNavigationControl=true]\n * Set to false to prevent the appearance of the default navigation controls.
    \n * Note that if set to false, the customs buttons set by the options\n * zoomInButton, zoomOutButton etc, are rendered inactive.\n *\n * @property {OpenSeadragon.ControlAnchor} [navigationControlAnchor=TOP_LEFT]\n * Placement of the default navigation controls.\n * To set the placement of the sequence controls, see the\n * sequenceControlAnchor option.\n *\n * @property {Boolean} [showZoomControl=true]\n * If true then + and - buttons to zoom in and out are displayed.
    \n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showHomeControl=true]\n * If true then the 'Go home' button is displayed to go back to the original\n * zoom and pan.
    \n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showFullPageControl=true]\n * If true then the 'Toggle full page' button is displayed to switch\n * between full page and normal mode.
    \n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showRotationControl=false]\n * If true then the rotate left/right controls will be displayed as part of the\n * standard controls. This is also subject to the browser support for rotate\n * (e.g. viewer.drawer.canRotate()).
    \n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showFlipControl=false]\n * If true then the flip controls will be displayed as part of the\n * standard controls.\n *\n * @property {Boolean} [showSequenceControl=true]\n * If sequenceMode is true, then provide buttons for navigating forward and\n * backward through the images.\n *\n * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT]\n * Placement of the default sequence controls.\n *\n * @property {Boolean} [navPrevNextWrap=false]\n * If true then the 'previous' button will wrap to the last image when\n * viewing the first image and the 'next' button will wrap to the first\n * image when viewing the last image.\n *\n *@property {String|Element} zoomInButton\n * Set the id or element of the custom 'Zoom in' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String|Element} zoomOutButton\n * Set the id or element of the custom 'Zoom out' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String|Element} homeButton\n * Set the id or element of the custom 'Go home' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String|Element} fullPageButton\n * Set the id or element of the custom 'Toggle full page' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String|Element} rotateLeftButton\n * Set the id or element of the custom 'Rotate left' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String|Element} rotateRightButton\n * Set the id or element of the custom 'Rotate right' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String|Element} previousButton\n * Set the id or element of the custom 'Previous page' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String|Element} nextButton\n * Set the id or element of the custom 'Next page' button to use.\n * This is useful to have a custom button anywhere in the web page.
    \n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {Boolean} [sequenceMode=false]\n * Set to true to have the viewer treat your tilesources as a sequence of images to\n * be opened one at a time rather than all at once.\n *\n * @property {Number} [initialPage=0]\n * If sequenceMode is true, display this page initially.\n *\n * @property {Boolean} [preserveViewport=false]\n * If sequenceMode is true, then normally navigating through each image resets the\n * viewport to 'home' position. If preserveViewport is set to true, then the viewport\n * position is preserved when navigating between images in the sequence.\n *\n * @property {Boolean} [preserveOverlays=false]\n * If sequenceMode is true, then normally navigating through each image\n * resets the overlays.\n * If preserveOverlays is set to true, then the overlays added with {@link OpenSeadragon.Viewer#addOverlay}\n * are preserved when navigating between images in the sequence.\n * Note: setting preserveOverlays overrides any overlays specified in the global\n * \"overlays\" option for the Viewer. It's also not compatible with specifying\n * per-tileSource overlays via the options, as those overlays will persist\n * even after the tileSource is closed.\n *\n * @property {Boolean} [showReferenceStrip=false]\n * If sequenceMode is true, then display a scrolling strip of image thumbnails for\n * navigating through the images.\n *\n * @property {String} [referenceStripScroll='horizontal']\n *\n * @property {Element} [referenceStripElement=null]\n *\n * @property {Number} [referenceStripHeight=null]\n *\n * @property {Number} [referenceStripWidth=null]\n *\n * @property {String} [referenceStripPosition='BOTTOM_LEFT']\n *\n * @property {Number} [referenceStripSizeRatio=0.2]\n *\n * @property {Boolean} [collectionMode=false]\n * Set to true to have the viewer arrange your TiledImages in a grid or line.\n *\n * @property {Number} [collectionRows=3]\n * If collectionMode is true, specifies how many rows the grid should have. Use 1 to make a line.\n * If collectionLayout is 'vertical', specifies how many columns instead.\n *\n * @property {Number} [collectionColumns=0]\n * If collectionMode is true, specifies how many columns the grid should have. Use 1 to make a line.\n * If collectionLayout is 'vertical', specifies how many rows instead. Ignored if collectionRows is not set to a falsy value.\n *\n * @property {String} [collectionLayout='horizontal']\n * If collectionMode is true, specifies whether to arrange vertically or horizontally.\n *\n * @property {Number} [collectionTileSize=800]\n * If collectionMode is true, specifies the size, in viewport coordinates, for each TiledImage to fit into.\n * The TiledImage will be centered within a square of the specified size.\n *\n * @property {Number} [collectionTileMargin=80]\n * If collectionMode is true, specifies the margin, in viewport coordinates, between each TiledImage.\n *\n * @property {String|Boolean} [crossOriginPolicy=false]\n * Valid values are 'Anonymous', 'use-credentials', and false. If false, canvas requests will\n * not use CORS, and the canvas will be tainted.\n *\n * @property {Boolean} [ajaxWithCredentials=false]\n * Whether to set the withCredentials XHR flag for AJAX requests.\n * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.\n *\n * @property {Boolean} [loadTilesWithAjax=false]\n * Whether to load tile data using AJAX requests.\n * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.\n *\n * @property {Object} [ajaxHeaders={}]\n * A set of headers to include when making AJAX requests for tile sources or tiles.\n *\n * @property {Boolean} [splitHashDataForPost=false]\n * Allows to treat _first_ hash ('#') symbol as a separator for POST data:\n * URL to be opened by a {@link OpenSeadragon.TileSource} can thus look like: http://some.url#postdata=here.\n * The whole URL is used to fetch image info metadata and it is then split to 'http://some.url' and\n * 'postdata=here'; post data is given to the {@link OpenSeadragon.TileSource} of the choice and can be further\n * used within tile requests (see TileSource methods).\n * NOTE: {@link OpenSeadragon.TileSource.prototype.configure} return value should contain the post data\n * if you want to use it later - so that it is given to your constructor later.\n * NOTE: usually, post data is expected to be ampersand-separated (just like GET parameters), and is NOT USED\n * to fetch tile image data unless explicitly programmed, or if loadTilesWithAjax=false 4\n * (but it is still used for the initial image info request).\n * NOTE: passing POST data from URL by this feature only supports string values, however,\n * TileSource can send any data using POST as long as the header is correct\n * (@see OpenSeadragon.TileSource.prototype.getTilePostData)\n */\n\n /**\n * Settings for gestures generated by a pointer device.\n *\n * @typedef {Object} GestureSettings\n * @memberof OpenSeadragon\n *\n * @property {Boolean} dragToPan\n * Set to false to disable panning on drag gestures.\n *\n * @property {Boolean} scrollToZoom\n * Set to false to disable zooming on scroll gestures.\n *\n * @property {Boolean} clickToZoom\n * Set to false to disable zooming on click gestures.\n *\n * @property {Boolean} dblClickToZoom\n * Set to false to disable zooming on double-click gestures. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n *\n * @property {Boolean} pinchToZoom\n * Set to false to disable zooming on pinch gestures.\n *\n * @property {Boolean} flickEnabled\n * Set to false to disable the kinetic panning effect (flick) at the end of a drag gesture.\n *\n * @property {Number} flickMinSpeed\n * If flickEnabled is true, the minimum speed (in pixels-per-second) required to cause the kinetic panning effect (flick) at the end of a drag gesture.\n *\n * @property {Number} flickMomentum\n * If flickEnabled is true, a constant multiplied by the velocity to determine the distance of the kinetic panning effect (flick) at the end of a drag gesture.\n * A larger value will make the flick feel \"lighter\", while a smaller value will make the flick feel \"heavier\".\n * Note: springStiffness and animationTime also affect the \"spring\" used to stop the flick animation.\n *\n */\n\n/**\n * The names for the image resources used for the image navigation buttons.\n *\n * @typedef {Object} NavImages\n * @memberof OpenSeadragon\n *\n * @property {Object} zoomIn - Images for the zoom-in button.\n * @property {String} zoomIn.REST\n * @property {String} zoomIn.GROUP\n * @property {String} zoomIn.HOVER\n * @property {String} zoomIn.DOWN\n *\n * @property {Object} zoomOut - Images for the zoom-out button.\n * @property {String} zoomOut.REST\n * @property {String} zoomOut.GROUP\n * @property {String} zoomOut.HOVER\n * @property {String} zoomOut.DOWN\n *\n * @property {Object} home - Images for the home button.\n * @property {String} home.REST\n * @property {String} home.GROUP\n * @property {String} home.HOVER\n * @property {String} home.DOWN\n *\n * @property {Object} fullpage - Images for the full-page button.\n * @property {String} fullpage.REST\n * @property {String} fullpage.GROUP\n * @property {String} fullpage.HOVER\n * @property {String} fullpage.DOWN\n *\n * @property {Object} rotateleft - Images for the rotate left button.\n * @property {String} rotateleft.REST\n * @property {String} rotateleft.GROUP\n * @property {String} rotateleft.HOVER\n * @property {String} rotateleft.DOWN\n *\n * @property {Object} rotateright - Images for the rotate right button.\n * @property {String} rotateright.REST\n * @property {String} rotateright.GROUP\n * @property {String} rotateright.HOVER\n * @property {String} rotateright.DOWN\n *\n * @property {Object} flip - Images for the flip button.\n * @property {String} flip.REST\n * @property {String} flip.GROUP\n * @property {String} flip.HOVER\n * @property {String} flip.DOWN\n *\n * @property {Object} previous - Images for the previous button.\n * @property {String} previous.REST\n * @property {String} previous.GROUP\n * @property {String} previous.HOVER\n * @property {String} previous.DOWN\n *\n * @property {Object} next - Images for the next button.\n * @property {String} next.REST\n * @property {String} next.GROUP\n * @property {String} next.HOVER\n * @property {String} next.DOWN\n *\n */\n\n/* eslint-disable no-redeclare */\nfunction OpenSeadragon( options ){\n return new OpenSeadragon.Viewer( options );\n}\n\n(function( $ ){\n\n\n /**\n * The OpenSeadragon version.\n *\n * @member {Object} OpenSeadragon.version\n * @property {String} versionStr - The version number as a string ('major.minor.revision').\n * @property {Number} major - The major version number.\n * @property {Number} minor - The minor version number.\n * @property {Number} revision - The revision number.\n * @since 1.0.0\n */\n $.version = {\n versionStr: '4.1.0',\n major: parseInt('4', 10),\n minor: parseInt('1', 10),\n revision: parseInt('0', 10)\n };\n\n\n /**\n * Taken from jquery 1.6.1\n * [[Class]] -> type pairs\n * @private\n */\n var class2type = {\n '[object Boolean]': 'boolean',\n '[object Number]': 'number',\n '[object String]': 'string',\n '[object Function]': 'function',\n '[object AsyncFunction]': 'function',\n '[object Promise]': 'promise',\n '[object Array]': 'array',\n '[object Date]': 'date',\n '[object RegExp]': 'regexp',\n '[object Object]': 'object'\n },\n // Save a reference to some core methods\n toString = Object.prototype.toString,\n hasOwn = Object.prototype.hasOwnProperty;\n\n /**\n * Taken from jQuery 1.6.1\n * @function isFunction\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isFunction = function( obj ) {\n return $.type(obj) === \"function\";\n };\n\n /**\n * Taken from jQuery 1.6.1\n * @function isArray\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isArray = Array.isArray || function( obj ) {\n return $.type(obj) === \"array\";\n };\n\n\n /**\n * A crude way of determining if an object is a window.\n * Taken from jQuery 1.6.1\n * @function isWindow\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isWindow = function( obj ) {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function type\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.type = function( obj ) {\n return ( obj === null ) || ( obj === undefined ) ?\n String( obj ) :\n class2type[ toString.call(obj) ] || \"object\";\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function isPlainObject\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isPlainObject = function( obj ) {\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if ( !obj || OpenSeadragon.type(obj) !== \"object\" || obj.nodeType || $.isWindow( obj ) ) {\n return false;\n }\n\n // Not own constructor property must be Object\n if ( obj.constructor &&\n !hasOwn.call(obj, \"constructor\") &&\n !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n return false;\n }\n\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n\n var lastKey;\n for (var key in obj ) {\n lastKey = key;\n }\n\n return lastKey === undefined || hasOwn.call( obj, lastKey );\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function isEmptyObject\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isEmptyObject = function( obj ) {\n for ( var name in obj ) {\n return false;\n }\n return true;\n };\n\n /**\n * Shim around Object.freeze. Does nothing if Object.freeze is not supported.\n * @param {Object} obj The object to freeze.\n * @returns {Object} obj The frozen object.\n */\n $.freezeObject = function(obj) {\n if (Object.freeze) {\n $.freezeObject = Object.freeze;\n } else {\n $.freezeObject = function(obj) {\n return obj;\n };\n }\n return $.freezeObject(obj);\n };\n\n /**\n * True if the browser supports the HTML5 canvas element\n * @member {Boolean} supportsCanvas\n * @memberof OpenSeadragon\n */\n $.supportsCanvas = (function () {\n var canvasElement = document.createElement( 'canvas' );\n return !!( $.isFunction( canvasElement.getContext ) &&\n canvasElement.getContext( '2d' ) );\n }());\n\n /**\n * Test whether the submitted canvas is tainted or not.\n * @argument {Canvas} canvas The canvas to test.\n * @returns {Boolean} True if the canvas is tainted.\n */\n $.isCanvasTainted = function(canvas) {\n var isTainted = false;\n try {\n // We test if the canvas is tainted by retrieving data from it.\n // An exception will be raised if the canvas is tainted.\n canvas.getContext('2d').getImageData(0, 0, 1, 1);\n } catch (e) {\n isTainted = true;\n }\n return isTainted;\n };\n\n /**\n * True if the browser supports the EventTarget.addEventListener() method\n * @member {Boolean} supportsAddEventListener\n * @memberof OpenSeadragon\n */\n $.supportsAddEventListener = (function () {\n return !!(document.documentElement.addEventListener && document.addEventListener);\n }());\n\n /**\n * True if the browser supports the EventTarget.removeEventListener() method\n * @member {Boolean} supportsRemoveEventListener\n * @memberof OpenSeadragon\n */\n $.supportsRemoveEventListener = (function () {\n return !!(document.documentElement.removeEventListener && document.removeEventListener);\n }());\n\n /**\n * True if the browser supports the newer EventTarget.addEventListener options argument\n * @member {Boolean} supportsEventListenerOptions\n * @memberof OpenSeadragon\n */\n $.supportsEventListenerOptions = (function () {\n var supported = 0;\n\n if ( $.supportsAddEventListener ) {\n try {\n var options = {\n get capture() {\n supported++;\n return false;\n },\n get once() {\n supported++;\n return false;\n },\n get passive() {\n supported++;\n return false;\n }\n };\n window.addEventListener(\"test\", null, options);\n window.removeEventListener(\"test\", null, options);\n } catch ( e ) {\n supported = 0;\n }\n }\n\n return supported >= 3;\n }());\n\n /**\n * A ratio comparing the device screen's pixel density to the canvas's backing store pixel density,\n * clamped to a minimum of 1. Defaults to 1 if canvas isn't supported by the browser.\n * @member {Number} pixelDensityRatio\n * @memberof OpenSeadragon\n */\n $.getCurrentPixelDensityRatio = function() {\n if ( $.supportsCanvas ) {\n var context = document.createElement('canvas').getContext('2d');\n var devicePixelRatio = window.devicePixelRatio || 1;\n var backingStoreRatio = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n return Math.max(devicePixelRatio, 1) / backingStoreRatio;\n } else {\n return 1;\n }\n };\n\n /**\n * @member {Number} pixelDensityRatio\n * @memberof OpenSeadragon\n */\n $.pixelDensityRatio = $.getCurrentPixelDensityRatio();\n\n}( OpenSeadragon ));\n\n/**\n * This closure defines all static methods available to the OpenSeadragon\n * namespace. Many, if not most, are taken directly from jQuery for use\n * to simplify and reduce common programming patterns. More static methods\n * from jQuery may eventually make their way into this though we are\n * attempting to avoid an explicit dependency on jQuery only because\n * OpenSeadragon is a broadly useful code base and would be made less broad\n * by requiring jQuery fully.\n *\n * Some static methods have also been refactored from the original OpenSeadragon\n * project.\n */\n(function( $ ){\n\n /**\n * Taken from jQuery 1.6.1\n * @function extend\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.extend = function() {\n var options,\n name,\n src,\n copy,\n copyIsArray,\n clone,\n target = arguments[ 0 ] || {},\n length = arguments.length,\n deep = false,\n i = 1;\n\n // Handle a deep copy situation\n if ( typeof target === \"boolean\" ) {\n deep = target;\n target = arguments[ 1 ] || {};\n // skip the boolean and the target\n i = 2;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if ( typeof target !== \"object\" && !OpenSeadragon.isFunction( target ) ) {\n target = {};\n }\n\n // extend jQuery itself if only one argument is passed\n if ( length === i ) {\n target = this;\n --i;\n }\n\n for ( ; i < length; i++ ) {\n // Only deal with non-null/undefined values\n options = arguments[ i ];\n if ( options !== null || options !== undefined ) {\n // Extend the base object\n for ( name in options ) {\n var descriptor = Object.getOwnPropertyDescriptor(options, name);\n\n if (descriptor !== undefined) {\n if (descriptor.get || descriptor.set) {\n Object.defineProperty(target, name, descriptor);\n continue;\n }\n\n copy = descriptor.value;\n } else {\n $.console.warn('Could not copy inherited property \"' + name + '\".');\n continue;\n }\n\n // Prevent never-ending loop\n if ( target === copy ) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if ( deep && copy && ( OpenSeadragon.isPlainObject( copy ) || ( copyIsArray = OpenSeadragon.isArray( copy ) ) ) ) {\n src = target[ name ];\n\n if ( copyIsArray ) {\n copyIsArray = false;\n clone = src && OpenSeadragon.isArray( src ) ? src : [];\n\n } else {\n clone = src && OpenSeadragon.isPlainObject( src ) ? src : {};\n }\n\n // Never move original objects, clone them\n target[ name ] = OpenSeadragon.extend( deep, clone, copy );\n\n // Don't bring in undefined values\n } else if ( copy !== undefined ) {\n target[ name ] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n\n var isIOSDevice = function () {\n if (typeof navigator !== 'object') {\n return false;\n }\n var userAgent = navigator.userAgent;\n if (typeof userAgent !== 'string') {\n return false;\n }\n return userAgent.indexOf('iPhone') !== -1 ||\n userAgent.indexOf('iPad') !== -1 ||\n userAgent.indexOf('iPod') !== -1;\n };\n\n $.extend( $, /** @lends OpenSeadragon */{\n /**\n * The default values for the optional settings documented at {@link OpenSeadragon.Options}.\n * @static\n * @type {Object}\n */\n DEFAULT_SETTINGS: {\n //DATA SOURCE DETAILS\n xmlPath: null,\n tileSources: null,\n tileHost: null,\n initialPage: 0,\n crossOriginPolicy: false,\n ajaxWithCredentials: false,\n loadTilesWithAjax: false,\n ajaxHeaders: {},\n splitHashDataForPost: false,\n\n //PAN AND ZOOM SETTINGS AND CONSTRAINTS\n panHorizontal: true,\n panVertical: true,\n constrainDuringPan: false,\n wrapHorizontal: false,\n wrapVertical: false,\n visibilityRatio: 0.5, //-> how much of the viewer can be negative space\n minPixelRatio: 0.5, //->closer to 0 draws tiles meant for a higher zoom at this zoom\n defaultZoomLevel: 0,\n minZoomLevel: null,\n maxZoomLevel: null,\n homeFillsViewer: false,\n\n //UI RESPONSIVENESS AND FEEL\n clickTimeThreshold: 300,\n clickDistThreshold: 5,\n dblClickTimeThreshold: 300,\n dblClickDistThreshold: 20,\n springStiffness: 6.5,\n animationTime: 1.2,\n gestureSettingsMouse: {\n dragToPan: true,\n scrollToZoom: true,\n clickToZoom: true,\n dblClickToZoom: false,\n dblClickDragToZoom: false,\n pinchToZoom: false,\n zoomToRefPoint: true,\n flickEnabled: false,\n flickMinSpeed: 120,\n flickMomentum: 0.25,\n pinchRotate: false\n },\n gestureSettingsTouch: {\n dragToPan: true,\n scrollToZoom: false,\n clickToZoom: false,\n dblClickToZoom: true,\n dblClickDragToZoom: true,\n pinchToZoom: true,\n zoomToRefPoint: true,\n flickEnabled: true,\n flickMinSpeed: 120,\n flickMomentum: 0.25,\n pinchRotate: false\n },\n gestureSettingsPen: {\n dragToPan: true,\n scrollToZoom: false,\n clickToZoom: true,\n dblClickToZoom: false,\n dblClickDragToZoom: false,\n pinchToZoom: false,\n zoomToRefPoint: true,\n flickEnabled: false,\n flickMinSpeed: 120,\n flickMomentum: 0.25,\n pinchRotate: false\n },\n gestureSettingsUnknown: {\n dragToPan: true,\n scrollToZoom: false,\n clickToZoom: false,\n dblClickToZoom: true,\n dblClickDragToZoom: false,\n pinchToZoom: true,\n zoomToRefPoint: true,\n flickEnabled: true,\n flickMinSpeed: 120,\n flickMomentum: 0.25,\n pinchRotate: false\n },\n zoomPerClick: 2,\n zoomPerScroll: 1.2,\n zoomPerDblClickDrag: 1.2,\n zoomPerSecond: 1.0,\n blendTime: 0,\n alwaysBlend: false,\n autoHideControls: true,\n immediateRender: false,\n minZoomImageRatio: 0.9, //-> closer to 0 allows zoom out to infinity\n maxZoomPixelRatio: 1.1, //-> higher allows 'over zoom' into pixels\n smoothTileEdgesMinZoom: 1.1, //-> higher than maxZoomPixelRatio disables it\n iOSDevice: isIOSDevice(),\n pixelsPerWheelLine: 40,\n pixelsPerArrowPress: 40,\n autoResize: true,\n preserveImageSizeOnResize: false, // requires autoResize=true\n minScrollDeltaTime: 50,\n rotationIncrement: 90,\n\n //DEFAULT CONTROL SETTINGS\n showSequenceControl: true, //SEQUENCE\n sequenceControlAnchor: null, //SEQUENCE\n preserveViewport: false, //SEQUENCE\n preserveOverlays: false, //SEQUENCE\n navPrevNextWrap: false, //SEQUENCE\n showNavigationControl: true, //ZOOM/HOME/FULL/ROTATION\n navigationControlAnchor: null, //ZOOM/HOME/FULL/ROTATION\n showZoomControl: true, //ZOOM\n showHomeControl: true, //HOME\n showFullPageControl: true, //FULL\n showRotationControl: false, //ROTATION\n showFlipControl: false, //FLIP\n controlsFadeDelay: 2000, //ZOOM/HOME/FULL/SEQUENCE\n controlsFadeLength: 1500, //ZOOM/HOME/FULL/SEQUENCE\n mouseNavEnabled: true, //GENERAL MOUSE INTERACTIVITY\n\n //VIEWPORT NAVIGATOR SETTINGS\n showNavigator: false,\n navigatorElement: null,\n navigatorId: null,\n navigatorPosition: null,\n navigatorSizeRatio: 0.2,\n navigatorMaintainSizeRatio: false,\n navigatorTop: null,\n navigatorLeft: null,\n navigatorHeight: null,\n navigatorWidth: null,\n navigatorAutoResize: true,\n navigatorAutoFade: true,\n navigatorRotate: true,\n navigatorBackground: '#000',\n navigatorOpacity: 0.8,\n navigatorBorderColor: '#555',\n navigatorDisplayRegionColor: '#900',\n\n // INITIAL ROTATION\n degrees: 0,\n\n // INITIAL FLIP STATE\n flipped: false,\n\n // APPEARANCE\n opacity: 1,\n preload: false,\n compositeOperation: null,\n imageSmoothingEnabled: true,\n placeholderFillStyle: null,\n subPixelRoundingForTransparency: null,\n\n //REFERENCE STRIP SETTINGS\n showReferenceStrip: false,\n referenceStripScroll: 'horizontal',\n referenceStripElement: null,\n referenceStripHeight: null,\n referenceStripWidth: null,\n referenceStripPosition: 'BOTTOM_LEFT',\n referenceStripSizeRatio: 0.2,\n\n //COLLECTION VISUALIZATION SETTINGS\n collectionRows: 3, //or columns depending on layout\n collectionColumns: 0, //columns in horizontal layout, rows in vertical layout\n collectionLayout: 'horizontal', //vertical\n collectionMode: false,\n collectionTileSize: 800,\n collectionTileMargin: 80,\n\n //PERFORMANCE SETTINGS\n imageLoaderLimit: 0,\n maxImageCacheCount: 200,\n timeout: 30000,\n useCanvas: true, // Use canvas element for drawing if available\n tileRetryMax: 0,\n tileRetryDelay: 2500,\n\n //INTERFACE RESOURCE SETTINGS\n prefixUrl: \"/images/\",\n navImages: {\n zoomIn: {\n REST: 'zoomin_rest.png',\n GROUP: 'zoomin_grouphover.png',\n HOVER: 'zoomin_hover.png',\n DOWN: 'zoomin_pressed.png'\n },\n zoomOut: {\n REST: 'zoomout_rest.png',\n GROUP: 'zoomout_grouphover.png',\n HOVER: 'zoomout_hover.png',\n DOWN: 'zoomout_pressed.png'\n },\n home: {\n REST: 'home_rest.png',\n GROUP: 'home_grouphover.png',\n HOVER: 'home_hover.png',\n DOWN: 'home_pressed.png'\n },\n fullpage: {\n REST: 'fullpage_rest.png',\n GROUP: 'fullpage_grouphover.png',\n HOVER: 'fullpage_hover.png',\n DOWN: 'fullpage_pressed.png'\n },\n rotateleft: {\n REST: 'rotateleft_rest.png',\n GROUP: 'rotateleft_grouphover.png',\n HOVER: 'rotateleft_hover.png',\n DOWN: 'rotateleft_pressed.png'\n },\n rotateright: {\n REST: 'rotateright_rest.png',\n GROUP: 'rotateright_grouphover.png',\n HOVER: 'rotateright_hover.png',\n DOWN: 'rotateright_pressed.png'\n },\n flip: { // Flip icon designed by Yaroslav Samoylov from the Noun Project and modified by Nelson Campos ncampos@criteriamarathon.com, https://thenounproject.com/term/flip/136289/\n REST: 'flip_rest.png',\n GROUP: 'flip_grouphover.png',\n HOVER: 'flip_hover.png',\n DOWN: 'flip_pressed.png'\n },\n previous: {\n REST: 'previous_rest.png',\n GROUP: 'previous_grouphover.png',\n HOVER: 'previous_hover.png',\n DOWN: 'previous_pressed.png'\n },\n next: {\n REST: 'next_rest.png',\n GROUP: 'next_grouphover.png',\n HOVER: 'next_hover.png',\n DOWN: 'next_pressed.png'\n }\n },\n\n //DEVELOPER SETTINGS\n debugMode: false,\n debugGridColor: ['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666'],\n silenceMultiImageWarnings: false\n\n },\n\n\n /**\n * TODO: get rid of this. I can't see how it's required at all. Looks\n * like an early legacy code artifact.\n * @static\n * @ignore\n */\n SIGNAL: \"----seadragon----\",\n\n\n /**\n * Returns a function which invokes the method as if it were a method belonging to the object.\n * @function\n * @param {Object} object\n * @param {Function} method\n * @returns {Function}\n */\n delegate: function( object, method ) {\n return function(){\n var args = arguments;\n if ( args === undefined ){\n args = [];\n }\n return method.apply( object, args );\n };\n },\n\n\n /**\n * An enumeration of Browser vendors.\n * @static\n * @type {Object}\n * @property {Number} UNKNOWN\n * @property {Number} IE\n * @property {Number} FIREFOX\n * @property {Number} SAFARI\n * @property {Number} CHROME\n * @property {Number} OPERA\n * @property {Number} EDGE\n * @property {Number} CHROMEEDGE\n */\n BROWSERS: {\n UNKNOWN: 0,\n IE: 1,\n FIREFOX: 2,\n SAFARI: 3,\n CHROME: 4,\n OPERA: 5,\n EDGE: 6,\n CHROMEEDGE: 7\n },\n\n /**\n * An enumeration of when subpixel rounding should occur.\n * @static\n * @type {Object}\n * @property {Number} NEVER Never apply subpixel rounding for transparency.\n * @property {Number} ONLY_AT_REST Do not apply subpixel rounding for transparency during animation (panning, zoom, rotation) and apply it once animation is over.\n * @property {Number} ALWAYS Apply subpixel rounding for transparency during animation and when animation is over.\n */\n SUBPIXEL_ROUNDING_OCCURRENCES: {\n NEVER: 0,\n ONLY_AT_REST: 1,\n ALWAYS: 2\n },\n\n /**\n * Keep track of which {@link Viewer}s have been created.\n * - Key: {@link Element} to which a Viewer is attached.\n * - Value: {@link Viewer} of the element defined by the key.\n * @private\n * @static\n * @type {Object}\n */\n _viewers: new Map(),\n\n /**\n * Returns the {@link Viewer} attached to a given DOM element. If there is\n * no viewer attached to the provided element, undefined is returned.\n * @function\n * @param {String|Element} element Accepts an id or element.\n * @returns {Viewer} The viewer attached to the given element, or undefined.\n */\n getViewer: function(element) {\n return $._viewers.get(this.getElement(element));\n },\n\n /**\n * Returns a DOM Element for the given id or element.\n * @function\n * @param {String|Element} element Accepts an id or element.\n * @returns {Element} The element with the given id, null, or the element itself.\n */\n getElement: function( element ) {\n if ( typeof ( element ) === \"string\" ) {\n element = document.getElementById( element );\n }\n return element;\n },\n\n\n /**\n * Determines the position of the upper-left corner of the element.\n * @function\n * @param {Element|String} element - the element we want the position for.\n * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element.\n */\n getElementPosition: function( element ) {\n var result = new $.Point(),\n isFixed,\n offsetParent;\n\n element = $.getElement( element );\n isFixed = $.getElementStyle( element ).position === \"fixed\";\n offsetParent = getOffsetParent( element, isFixed );\n\n while ( offsetParent ) {\n\n result.x += element.offsetLeft;\n result.y += element.offsetTop;\n\n if ( isFixed ) {\n result = result.plus( $.getPageScroll() );\n }\n\n element = offsetParent;\n isFixed = $.getElementStyle( element ).position === \"fixed\";\n offsetParent = getOffsetParent( element, isFixed );\n }\n\n return result;\n },\n\n\n /**\n * Determines the position of the upper-left corner of the element adjusted for current page and/or element scroll.\n * @function\n * @param {Element|String} element - the element we want the position for.\n * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element adjusted for current page and/or element scroll.\n */\n getElementOffset: function( element ) {\n element = $.getElement( element );\n\n var doc = element && element.ownerDocument,\n docElement,\n win,\n boundingRect = { top: 0, left: 0 };\n\n if ( !doc ) {\n return new $.Point();\n }\n\n docElement = doc.documentElement;\n\n if ( typeof element.getBoundingClientRect !== typeof undefined ) {\n boundingRect = element.getBoundingClientRect();\n }\n\n win = ( doc === doc.window ) ?\n doc :\n ( doc.nodeType === 9 ) ?\n doc.defaultView || doc.parentWindow :\n false;\n\n return new $.Point(\n boundingRect.left + ( win.pageXOffset || docElement.scrollLeft ) - ( docElement.clientLeft || 0 ),\n boundingRect.top + ( win.pageYOffset || docElement.scrollTop ) - ( docElement.clientTop || 0 )\n );\n },\n\n\n /**\n * Determines the height and width of the given element.\n * @function\n * @param {Element|String} element\n * @returns {OpenSeadragon.Point}\n */\n getElementSize: function( element ) {\n element = $.getElement( element );\n\n return new $.Point(\n element.clientWidth,\n element.clientHeight\n );\n },\n\n\n /**\n * Returns the CSSStyle object for the given element.\n * @function\n * @param {Element|String} element\n * @returns {CSSStyle}\n */\n getElementStyle:\n document.documentElement.currentStyle ?\n function( element ) {\n element = $.getElement( element );\n return element.currentStyle;\n } :\n function( element ) {\n element = $.getElement( element );\n return window.getComputedStyle( element, \"\" );\n },\n\n /**\n * Returns the property with the correct vendor prefix appended.\n * @param {String} property the property name\n * @returns {String} the property with the correct prefix or null if not\n * supported.\n */\n getCssPropertyWithVendorPrefix: function(property) {\n var memo = {};\n\n $.getCssPropertyWithVendorPrefix = function(property) {\n if (memo[property] !== undefined) {\n return memo[property];\n }\n var style = document.createElement('div').style;\n var result = null;\n if (style[property] !== undefined) {\n result = property;\n } else {\n var prefixes = ['Webkit', 'Moz', 'MS', 'O',\n 'webkit', 'moz', 'ms', 'o'];\n var suffix = $.capitalizeFirstLetter(property);\n for (var i = 0; i < prefixes.length; i++) {\n var prop = prefixes[i] + suffix;\n if (style[prop] !== undefined) {\n result = prop;\n break;\n }\n }\n }\n memo[property] = result;\n return result;\n };\n return $.getCssPropertyWithVendorPrefix(property);\n },\n\n /**\n * Capitalizes the first letter of a string\n * @param {String} string\n * @returns {String} The string with the first letter capitalized\n */\n capitalizeFirstLetter: function(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n },\n\n /**\n * Compute the modulo of a number but makes sure to always return\n * a positive value (also known as Euclidean modulo).\n * @param {Number} number the number to compute the modulo of\n * @param {Number} modulo the modulo\n * @returns {Number} the result of the modulo of number\n */\n positiveModulo: function(number, modulo) {\n var result = number % modulo;\n if (result < 0) {\n result += modulo;\n }\n return result;\n },\n\n\n /**\n * Determines if a point is within the bounding rectangle of the given element (hit-test).\n * @function\n * @param {Element|String} element\n * @param {OpenSeadragon.Point} point\n * @returns {Boolean}\n */\n pointInElement: function( element, point ) {\n element = $.getElement( element );\n var offset = $.getElementOffset( element ),\n size = $.getElementSize( element );\n return point.x >= offset.x && point.x < offset.x + size.x && point.y < offset.y + size.y && point.y >= offset.y;\n },\n\n\n /**\n * Gets the position of the mouse on the screen for a given event.\n * @function\n * @param {Event} [event]\n * @returns {OpenSeadragon.Point}\n */\n getMousePosition: function( event ) {\n\n if ( typeof ( event.pageX ) === \"number\" ) {\n $.getMousePosition = function( event ){\n var result = new $.Point();\n\n result.x = event.pageX;\n result.y = event.pageY;\n\n return result;\n };\n } else if ( typeof ( event.clientX ) === \"number\" ) {\n $.getMousePosition = function( event ){\n var result = new $.Point();\n\n result.x =\n event.clientX +\n document.body.scrollLeft +\n document.documentElement.scrollLeft;\n result.y =\n event.clientY +\n document.body.scrollTop +\n document.documentElement.scrollTop;\n\n return result;\n };\n } else {\n throw new Error(\n \"Unknown event mouse position, no known technique.\"\n );\n }\n\n return $.getMousePosition( event );\n },\n\n\n /**\n * Determines the page's current scroll position.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n getPageScroll: function() {\n var docElement = document.documentElement || {},\n body = document.body || {};\n\n if ( typeof ( window.pageXOffset ) === \"number\" ) {\n $.getPageScroll = function(){\n return new $.Point(\n window.pageXOffset,\n window.pageYOffset\n );\n };\n } else if ( body.scrollLeft || body.scrollTop ) {\n $.getPageScroll = function(){\n return new $.Point(\n document.body.scrollLeft,\n document.body.scrollTop\n );\n };\n } else if ( docElement.scrollLeft || docElement.scrollTop ) {\n $.getPageScroll = function(){\n return new $.Point(\n document.documentElement.scrollLeft,\n document.documentElement.scrollTop\n );\n };\n } else {\n // We can't reassign the function yet, as there was no scroll.\n return new $.Point(0, 0);\n }\n\n return $.getPageScroll();\n },\n\n /**\n * Set the page scroll position.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n setPageScroll: function( scroll ) {\n if ( typeof ( window.scrollTo ) !== \"undefined\" ) {\n $.setPageScroll = function( scroll ) {\n window.scrollTo( scroll.x, scroll.y );\n };\n } else {\n var originalScroll = $.getPageScroll();\n if ( originalScroll.x === scroll.x &&\n originalScroll.y === scroll.y ) {\n // We are already correctly positioned and there\n // is no way to detect the correct method.\n return;\n }\n\n document.body.scrollLeft = scroll.x;\n document.body.scrollTop = scroll.y;\n var currentScroll = $.getPageScroll();\n if ( currentScroll.x !== originalScroll.x &&\n currentScroll.y !== originalScroll.y ) {\n $.setPageScroll = function( scroll ) {\n document.body.scrollLeft = scroll.x;\n document.body.scrollTop = scroll.y;\n };\n return;\n }\n\n document.documentElement.scrollLeft = scroll.x;\n document.documentElement.scrollTop = scroll.y;\n currentScroll = $.getPageScroll();\n if ( currentScroll.x !== originalScroll.x &&\n currentScroll.y !== originalScroll.y ) {\n $.setPageScroll = function( scroll ) {\n document.documentElement.scrollLeft = scroll.x;\n document.documentElement.scrollTop = scroll.y;\n };\n return;\n }\n\n // We can't find anything working, so we do nothing.\n $.setPageScroll = function( scroll ) {\n };\n }\n\n $.setPageScroll( scroll );\n },\n\n /**\n * Determines the size of the browsers window.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n getWindowSize: function() {\n var docElement = document.documentElement || {},\n body = document.body || {};\n\n if ( typeof ( window.innerWidth ) === 'number' ) {\n $.getWindowSize = function(){\n return new $.Point(\n window.innerWidth,\n window.innerHeight\n );\n };\n } else if ( docElement.clientWidth || docElement.clientHeight ) {\n $.getWindowSize = function(){\n return new $.Point(\n document.documentElement.clientWidth,\n document.documentElement.clientHeight\n );\n };\n } else if ( body.clientWidth || body.clientHeight ) {\n $.getWindowSize = function(){\n return new $.Point(\n document.body.clientWidth,\n document.body.clientHeight\n );\n };\n } else {\n throw new Error(\"Unknown window size, no known technique.\");\n }\n\n return $.getWindowSize();\n },\n\n\n /**\n * Wraps the given element in a nest of divs so that the element can\n * be easily centered using CSS tables\n * @function\n * @param {Element|String} element\n * @returns {Element} outermost wrapper element\n */\n makeCenteredNode: function( element ) {\n // Convert a possible ID to an actual HTMLElement\n element = $.getElement( element );\n\n /*\n CSS tables require you to have a display:table/row/cell hierarchy so we need to create\n three nested wrapper divs:\n */\n\n var wrappers = [\n $.makeNeutralElement( 'div' ),\n $.makeNeutralElement( 'div' ),\n $.makeNeutralElement( 'div' )\n ];\n\n // It feels like we should be able to pass style dicts to makeNeutralElement:\n $.extend(wrappers[0].style, {\n display: \"table\",\n height: \"100%\",\n width: \"100%\"\n });\n\n $.extend(wrappers[1].style, {\n display: \"table-row\"\n });\n\n $.extend(wrappers[2].style, {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n textAlign: \"center\"\n });\n\n wrappers[0].appendChild(wrappers[1]);\n wrappers[1].appendChild(wrappers[2]);\n wrappers[2].appendChild(element);\n\n return wrappers[0];\n },\n\n\n /**\n * Creates an easily positionable element of the given type that therefor\n * serves as an excellent container element.\n * @function\n * @param {String} tagName\n * @returns {Element}\n */\n makeNeutralElement: function( tagName ) {\n var element = document.createElement( tagName ),\n style = element.style;\n\n style.background = \"transparent none\";\n style.border = \"none\";\n style.margin = \"0px\";\n style.padding = \"0px\";\n style.position = \"static\";\n\n return element;\n },\n\n\n /**\n * Returns the current milliseconds, using Date.now() if available\n * @function\n */\n now: function( ) {\n if (Date.now) {\n $.now = Date.now;\n } else {\n $.now = function() {\n return new Date().getTime();\n };\n }\n\n return $.now();\n },\n\n\n /**\n * Ensures an image is loaded correctly to support alpha transparency.\n * @function\n * @param {String} src\n * @returns {Element}\n */\n makeTransparentImage: function( src ) {\n var img = $.makeNeutralElement( \"img\" );\n\n img.src = src;\n\n return img;\n },\n\n\n /**\n * Sets the opacity of the specified element.\n * @function\n * @param {Element|String} element\n * @param {Number} opacity\n * @param {Boolean} [usesAlpha]\n */\n setElementOpacity: function( element, opacity, usesAlpha ) {\n\n var ieOpacity,\n ieFilter;\n\n element = $.getElement( element );\n\n if ( usesAlpha && !$.Browser.alpha ) {\n opacity = Math.round( opacity );\n }\n\n if ( $.Browser.opacity ) {\n element.style.opacity = opacity < 1 ? opacity : \"\";\n } else {\n if ( opacity < 1 ) {\n ieOpacity = Math.round( 100 * opacity );\n ieFilter = \"alpha(opacity=\" + ieOpacity + \")\";\n element.style.filter = ieFilter;\n } else {\n element.style.filter = \"\";\n }\n }\n },\n\n\n /**\n * Sets the specified element's touch-action style attribute to 'none'.\n * @function\n * @param {Element|String} element\n */\n setElementTouchActionNone: function( element ) {\n element = $.getElement( element );\n if ( typeof element.style.touchAction !== 'undefined' ) {\n element.style.touchAction = 'none';\n } else if ( typeof element.style.msTouchAction !== 'undefined' ) {\n element.style.msTouchAction = 'none';\n }\n },\n\n\n /**\n * Sets the specified element's pointer-events style attribute to the passed value.\n * @function\n * @param {Element|String} element\n * @param {String} value\n */\n setElementPointerEvents: function( element, value ) {\n element = $.getElement( element );\n if (typeof element.style !== 'undefined' && typeof element.style.pointerEvents !== 'undefined' ) {\n element.style.pointerEvents = value;\n }\n },\n\n\n /**\n * Sets the specified element's pointer-events style attribute to 'none'.\n * @function\n * @param {Element|String} element\n */\n setElementPointerEventsNone: function( element ) {\n $.setElementPointerEvents( element, 'none' );\n },\n\n\n /**\n * Add the specified CSS class to the element if not present.\n * @function\n * @param {Element|String} element\n * @param {String} className\n */\n addClass: function( element, className ) {\n element = $.getElement( element );\n\n if (!element.className) {\n element.className = className;\n } else if ( ( ' ' + element.className + ' ' ).\n indexOf( ' ' + className + ' ' ) === -1 ) {\n element.className += ' ' + className;\n }\n },\n\n /**\n * Find the first index at which an element is found in an array or -1\n * if not present.\n *\n * Code taken and adapted from\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility\n *\n * @function\n * @param {Array} array The array from which to find the element\n * @param {Object} searchElement The element to find\n * @param {Number} [fromIndex=0] Index to start research.\n * @returns {Number} The index of the element in the array.\n */\n indexOf: function( array, searchElement, fromIndex ) {\n if ( Array.prototype.indexOf ) {\n this.indexOf = function( array, searchElement, fromIndex ) {\n return array.indexOf( searchElement, fromIndex );\n };\n } else {\n this.indexOf = function( array, searchElement, fromIndex ) {\n var i,\n pivot = ( fromIndex ) ? fromIndex : 0,\n length;\n if ( !array ) {\n throw new TypeError( );\n }\n\n length = array.length;\n if ( length === 0 || pivot >= length ) {\n return -1;\n }\n\n if ( pivot < 0 ) {\n pivot = length - Math.abs( pivot );\n }\n\n for ( i = pivot; i < length; i++ ) {\n if ( array[i] === searchElement ) {\n return i;\n }\n }\n return -1;\n };\n }\n return this.indexOf( array, searchElement, fromIndex );\n },\n\n /**\n * Remove the specified CSS class from the element.\n * @function\n * @param {Element|String} element\n * @param {String} className\n */\n removeClass: function( element, className ) {\n var oldClasses,\n newClasses = [],\n i;\n\n element = $.getElement( element );\n oldClasses = element.className.split( /\\s+/ );\n for ( i = 0; i < oldClasses.length; i++ ) {\n if ( oldClasses[ i ] && oldClasses[ i ] !== className ) {\n newClasses.push( oldClasses[ i ] );\n }\n }\n element.className = newClasses.join(' ');\n },\n\n /**\n * Convert passed addEventListener() options to boolean or options object,\n * depending on browser support.\n * @function\n * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object\n * @param {Boolean} [options.capture]\n * @param {Boolean} [options.passive]\n * @param {Boolean} [options.once]\n * @returns {String} The protocol (http:, https:, file:, ftp: ...)\n */\n normalizeEventListenerOptions: function (options) {\n var opts;\n if ( typeof options !== 'undefined' ) {\n if ( typeof options === 'boolean' ) {\n // Legacy Boolean useCapture\n opts = $.supportsEventListenerOptions ? { capture: options } : options;\n } else {\n // Options object\n opts = $.supportsEventListenerOptions ? options :\n ( ( typeof options.capture !== 'undefined' ) ? options.capture : false );\n }\n } else {\n // No options specified - Legacy optional useCapture argument\n // (for IE, first supported on version 9, so we'll pass a Boolean)\n opts = $.supportsEventListenerOptions ? { capture: false } : false;\n }\n return opts;\n },\n\n /**\n * Adds an event listener for the given element, eventName and handler.\n * @function\n * @param {Element|String} element\n * @param {String} eventName\n * @param {Function} handler\n * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object\n * @param {Boolean} [options.capture]\n * @param {Boolean} [options.passive]\n * @param {Boolean} [options.once]\n */\n addEvent: (function () {\n if ( $.supportsAddEventListener ) {\n return function ( element, eventName, handler, options ) {\n options = $.normalizeEventListenerOptions(options);\n element = $.getElement( element );\n element.addEventListener( eventName, handler, options );\n };\n } else if ( document.documentElement.attachEvent && document.attachEvent ) {\n return function ( element, eventName, handler ) {\n element = $.getElement( element );\n element.attachEvent( 'on' + eventName, handler );\n };\n } else {\n throw new Error( \"No known event model.\" );\n }\n }()),\n\n\n /**\n * Remove a given event listener for the given element, event type and\n * handler.\n * @function\n * @param {Element|String} element\n * @param {String} eventName\n * @param {Function} handler\n * @param {Boolean|Object} [options] Boolean useCapture, or if [supportsEventListenerOptions]{@link OpenSeadragon.supportsEventListenerOptions}, can be an object\n * @param {Boolean} [options.capture]\n */\n removeEvent: (function () {\n if ( $.supportsRemoveEventListener ) {\n return function ( element, eventName, handler, options ) {\n options = $.normalizeEventListenerOptions(options);\n element = $.getElement( element );\n element.removeEventListener( eventName, handler, options );\n };\n } else if ( document.documentElement.detachEvent && document.detachEvent ) {\n return function( element, eventName, handler ) {\n element = $.getElement( element );\n element.detachEvent( 'on' + eventName, handler );\n };\n } else {\n throw new Error( \"No known event model.\" );\n }\n }()),\n\n\n /**\n * Cancels the default browser behavior had the event propagated all\n * the way up the DOM to the window object.\n * @function\n * @param {Event} [event]\n */\n cancelEvent: function( event ) {\n event.preventDefault();\n },\n\n\n /**\n * Returns true if {@link OpenSeadragon.cancelEvent|cancelEvent} has been called on\n * the event, otherwise returns false.\n * @function\n * @param {Event} [event]\n */\n eventIsCanceled: function( event ) {\n return event.defaultPrevented;\n },\n\n\n /**\n * Stops the propagation of the event through the DOM in the capturing and bubbling phases.\n * @function\n * @param {Event} [event]\n */\n stopEvent: function( event ) {\n event.stopPropagation();\n },\n\n\n /**\n * Similar to OpenSeadragon.delegate, but it does not immediately call\n * the method on the object, returning a function which can be called\n * repeatedly to delegate the method. It also allows additional arguments\n * to be passed during construction which will be added during each\n * invocation, and each invocation can add additional arguments as well.\n *\n * @function\n * @param {Object} object\n * @param {Function} method\n * @param [args] any additional arguments are passed as arguments to the\n * created callback\n * @returns {Function}\n */\n createCallback: function( object, method ) {\n //TODO: This pattern is painful to use and debug. It's much cleaner\n // to use pinning plus anonymous functions. Get rid of this\n // pattern!\n var initialArgs = [],\n i;\n for ( i = 2; i < arguments.length; i++ ) {\n initialArgs.push( arguments[ i ] );\n }\n\n return function() {\n var args = initialArgs.concat( [] ),\n i;\n for ( i = 0; i < arguments.length; i++ ) {\n args.push( arguments[ i ] );\n }\n\n return method.apply( object, args );\n };\n },\n\n\n /**\n * Retrieves the value of a url parameter from the window.location string.\n * @function\n * @param {String} key\n * @returns {String} The value of the url parameter or null if no param matches.\n */\n getUrlParameter: function( key ) {\n // eslint-disable-next-line no-use-before-define\n var value = URLPARAMS[ key ];\n return value ? value : null;\n },\n\n /**\n * Retrieves the protocol used by the url. The url can either be absolute\n * or relative.\n * @function\n * @private\n * @param {String} url The url to retrieve the protocol from.\n * @returns {String} The protocol (http:, https:, file:, ftp: ...)\n */\n getUrlProtocol: function( url ) {\n var match = url.match(/^([a-z]+:)\\/\\//i);\n if ( match === null ) {\n // Relative URL, retrive the protocol from window.location\n return window.location.protocol;\n }\n return match[1].toLowerCase();\n },\n\n /**\n * Create an XHR object\n * @private\n * @param {type} [local] If set to true, the XHR will be file: protocol\n * compatible if possible (but may raise a warning in the browser).\n * @returns {XMLHttpRequest}\n */\n createAjaxRequest: function( local ) {\n // IE11 does not support window.ActiveXObject so we just try to\n // create one to see if it is supported.\n // See: http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx\n var supportActiveX;\n try {\n /* global ActiveXObject:true */\n supportActiveX = !!new ActiveXObject( \"Microsoft.XMLHTTP\" );\n } catch( e ) {\n supportActiveX = false;\n }\n\n if ( supportActiveX ) {\n if ( window.XMLHttpRequest ) {\n $.createAjaxRequest = function( local ) {\n if ( local ) {\n return new ActiveXObject( \"Microsoft.XMLHTTP\" );\n }\n return new XMLHttpRequest();\n };\n } else {\n $.createAjaxRequest = function() {\n return new ActiveXObject( \"Microsoft.XMLHTTP\" );\n };\n }\n } else if ( window.XMLHttpRequest ) {\n $.createAjaxRequest = function() {\n return new XMLHttpRequest();\n };\n } else {\n throw new Error( \"Browser doesn't support XMLHttpRequest.\" );\n }\n return $.createAjaxRequest( local );\n },\n\n /**\n * Makes an AJAX request.\n * @param {Object} options\n * @param {String} options.url - the url to request\n * @param {Function} options.success - a function to call on a successful response\n * @param {Function} options.error - a function to call on when an error occurs\n * @param {Object} options.headers - headers to add to the AJAX request\n * @param {String} options.responseType - the response type of the AJAX request\n * @param {String} options.postData - HTTP POST data (usually but not necessarily in k=v&k2=v2... form,\n * see TileSource::getPostData), GET method used if null\n * @param {Boolean} [options.withCredentials=false] - whether to set the XHR's withCredentials\n * @throws {Error}\n * @returns {XMLHttpRequest}\n */\n makeAjaxRequest: function( url, onSuccess, onError ) {\n var withCredentials;\n var headers;\n var responseType;\n var postData;\n\n // Note that our preferred API is that you pass in a single object; the named\n // arguments are for legacy support.\n if( $.isPlainObject( url ) ){\n onSuccess = url.success;\n onError = url.error;\n withCredentials = url.withCredentials;\n headers = url.headers;\n responseType = url.responseType || null;\n postData = url.postData || null;\n url = url.url;\n }\n\n var protocol = $.getUrlProtocol( url );\n var request = $.createAjaxRequest( protocol === \"file:\" );\n\n if ( !$.isFunction( onSuccess ) ) {\n throw new Error( \"makeAjaxRequest requires a success callback\" );\n }\n\n request.onreadystatechange = function() {\n // 4 = DONE (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties)\n if ( request.readyState === 4 ) {\n request.onreadystatechange = function(){};\n\n // With protocols other than http/https, a successful request status is in\n // the 200's on Firefox and 0 on other browsers\n if ( (request.status >= 200 && request.status < 300) ||\n ( request.status === 0 &&\n protocol !== \"http:\" &&\n protocol !== \"https:\" )) {\n onSuccess( request );\n } else {\n if ( $.isFunction( onError ) ) {\n onError( request );\n } else {\n $.console.error( \"AJAX request returned %d: %s\", request.status, url );\n }\n }\n }\n };\n\n var method = postData ? \"POST\" : \"GET\";\n try {\n request.open( method, url, true );\n\n if (responseType) {\n request.responseType = responseType;\n }\n\n if (headers) {\n for (var headerName in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, headerName) && headers[headerName]) {\n request.setRequestHeader(headerName, headers[headerName]);\n }\n }\n }\n\n if (withCredentials) {\n request.withCredentials = true;\n }\n\n request.send(postData);\n } catch (e) {\n $.console.error( \"%s while making AJAX request: %s\", e.name, e.message );\n\n request.onreadystatechange = function(){};\n\n if ( $.isFunction( onError ) ) {\n onError( request, e );\n }\n }\n\n return request;\n },\n\n /**\n * Taken from jQuery 1.6.1\n * @function\n * @param {Object} options\n * @param {String} options.url\n * @param {Function} options.callback\n * @param {String} [options.param='callback'] The name of the url parameter\n * to request the jsonp provider with.\n * @param {String} [options.callbackName=] The name of the callback to\n * request the jsonp provider with.\n */\n jsonp: function( options ){\n var script,\n url = options.url,\n head = document.head ||\n document.getElementsByTagName( \"head\" )[ 0 ] ||\n document.documentElement,\n jsonpCallback = options.callbackName || 'openseadragon' + $.now(),\n previous = window[ jsonpCallback ],\n replace = \"$1\" + jsonpCallback + \"$2\",\n callbackParam = options.param || 'callback',\n callback = options.callback;\n\n url = url.replace( /(=)\\?(&|$)|\\?\\?/i, replace );\n // Add callback manually\n url += (/\\?/.test( url ) ? \"&\" : \"?\") + callbackParam + \"=\" + jsonpCallback;\n\n // Install callback\n window[ jsonpCallback ] = function( response ) {\n if ( !previous ){\n try{\n delete window[ jsonpCallback ];\n }catch(e){\n //swallow\n }\n } else {\n window[ jsonpCallback ] = previous;\n }\n if( callback && $.isFunction( callback ) ){\n callback( response );\n }\n };\n\n script = document.createElement( \"script\" );\n\n //TODO: having an issue with async info requests\n if( undefined !== options.async || false !== options.async ){\n script.async = \"async\";\n }\n\n if ( options.scriptCharset ) {\n script.charset = options.scriptCharset;\n }\n\n script.src = url;\n\n // Attach handlers for all browsers\n script.onload = script.onreadystatechange = function( _, isAbort ) {\n\n if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n\n // Remove the script\n if ( head && script.parentNode ) {\n head.removeChild( script );\n }\n\n // Dereference the script\n script = undefined;\n }\n };\n // Use insertBefore instead of appendChild to circumvent an IE6 bug.\n // This arises when a base node is used (#2709 and #4378).\n head.insertBefore( script, head.firstChild );\n\n },\n\n\n /**\n * Fully deprecated. Will throw an error.\n * @function\n * @deprecated use {@link OpenSeadragon.Viewer#open}\n */\n createFromDZI: function() {\n throw \"OpenSeadragon.createFromDZI is deprecated, use Viewer.open.\";\n },\n\n /**\n * Parses an XML string into a DOM Document.\n * @function\n * @param {String} string\n * @returns {Document}\n */\n parseXml: function( string ) {\n if ( window.DOMParser ) {\n\n $.parseXml = function( string ) {\n var xmlDoc = null,\n parser;\n\n parser = new DOMParser();\n xmlDoc = parser.parseFromString( string, \"text/xml\" );\n return xmlDoc;\n };\n\n } else if ( window.ActiveXObject ) {\n\n $.parseXml = function( string ) {\n var xmlDoc = null;\n\n xmlDoc = new ActiveXObject( \"Microsoft.XMLDOM\" );\n xmlDoc.async = false;\n xmlDoc.loadXML( string );\n return xmlDoc;\n };\n\n } else {\n throw new Error( \"Browser doesn't support XML DOM.\" );\n }\n\n return $.parseXml( string );\n },\n\n /**\n * Parses a JSON string into a Javascript object.\n * @function\n * @param {String} string\n * @returns {Object}\n */\n parseJSON: function(string) {\n $.parseJSON = window.JSON.parse;\n return $.parseJSON(string);\n },\n\n /**\n * Reports whether the image format is supported for tiling in this\n * version.\n * @function\n * @param {String} [extension]\n * @returns {Boolean}\n */\n imageFormatSupported: function( extension ) {\n extension = extension ? extension : \"\";\n // eslint-disable-next-line no-use-before-define\n return !!FILEFORMATS[ extension.toLowerCase() ];\n },\n\n /**\n * Updates supported image formats with user-specified values.\n * Preexisting formats that are not being updated are left unchanged.\n * By default, the defined formats are\n *
    {\n         *      bmp:  false,\n         *      jpeg: true,\n         *      jpg:  true,\n         *      png:  true,\n         *      tif:  false,\n         *      wdp:  false\n         * }\n         * 
    \n * @function\n * @example\n * // sets webp as supported and png as unsupported\n * setImageFormatsSupported({webp: true, png: false});\n * @param {Object} formats An object containing format extensions as\n * keys and booleans as values.\n */\n setImageFormatsSupported: function(formats) {\n // eslint-disable-next-line no-use-before-define\n $.extend(FILEFORMATS, formats);\n }\n\n });\n\n\n //TODO: $.console is often used inside a try/catch block which generally\n // prevents allowings errors to occur with detection until a debugger\n // is attached. Although I've been guilty of the same anti-pattern\n // I eventually was convinced that errors should naturally propagate in\n // all but the most special cases.\n /**\n * A convenient alias for console when available, and a simple null\n * function when console is unavailable.\n * @static\n * @private\n */\n var nullfunction = function( msg ){\n //document.location.hash = msg;\n };\n\n $.console = window.console || {\n log: nullfunction,\n debug: nullfunction,\n info: nullfunction,\n warn: nullfunction,\n error: nullfunction,\n assert: nullfunction\n };\n\n\n /**\n * The current browser vendor, version, and related information regarding detected features.\n * @member {Object} Browser\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {OpenSeadragon.BROWSERS} vendor - One of the {@link OpenSeadragon.BROWSERS} enumeration values.\n * @property {Number} version\n * @property {Boolean} alpha - Does the browser support image alpha transparency.\n */\n $.Browser = {\n vendor: $.BROWSERS.UNKNOWN,\n version: 0,\n alpha: true\n };\n\n\n var FILEFORMATS = {\n bmp: false,\n jpeg: true,\n jpg: true,\n png: true,\n tif: false,\n wdp: false\n },\n URLPARAMS = {};\n\n (function() {\n //A small auto-executing routine to determine the browser vendor,\n //version and supporting feature sets.\n var ver = navigator.appVersion,\n ua = navigator.userAgent,\n regex;\n\n //console.error( 'appName: ' + navigator.appName );\n //console.error( 'appVersion: ' + navigator.appVersion );\n //console.error( 'userAgent: ' + navigator.userAgent );\n\n switch( navigator.appName ){\n case \"Microsoft Internet Explorer\":\n if( !!window.attachEvent &&\n !!window.ActiveXObject ) {\n\n $.Browser.vendor = $.BROWSERS.IE;\n $.Browser.version = parseFloat(\n ua.substring(\n ua.indexOf( \"MSIE\" ) + 5,\n ua.indexOf( \";\", ua.indexOf( \"MSIE\" ) ) )\n );\n }\n break;\n case \"Netscape\":\n if (window.addEventListener) {\n if ( ua.indexOf( \"Edge\" ) >= 0 ) {\n $.Browser.vendor = $.BROWSERS.EDGE;\n $.Browser.version = parseFloat(\n ua.substring( ua.indexOf( \"Edge\" ) + 5 )\n );\n } else if ( ua.indexOf( \"Edg\" ) >= 0 ) {\n $.Browser.vendor = $.BROWSERS.CHROMEEDGE;\n $.Browser.version = parseFloat(\n ua.substring( ua.indexOf( \"Edg\" ) + 4 )\n );\n } else if ( ua.indexOf( \"Firefox\" ) >= 0 ) {\n $.Browser.vendor = $.BROWSERS.FIREFOX;\n $.Browser.version = parseFloat(\n ua.substring( ua.indexOf( \"Firefox\" ) + 8 )\n );\n } else if ( ua.indexOf( \"Safari\" ) >= 0 ) {\n $.Browser.vendor = ua.indexOf( \"Chrome\" ) >= 0 ?\n $.BROWSERS.CHROME :\n $.BROWSERS.SAFARI;\n $.Browser.version = parseFloat(\n ua.substring(\n ua.substring( 0, ua.indexOf( \"Safari\" ) ).lastIndexOf( \"/\" ) + 1,\n ua.indexOf( \"Safari\" )\n )\n );\n } else {\n regex = new RegExp( \"Trident/.*rv:([0-9]{1,}[.0-9]{0,})\");\n if ( regex.exec( ua ) !== null ) {\n $.Browser.vendor = $.BROWSERS.IE;\n $.Browser.version = parseFloat( RegExp.$1 );\n }\n }\n }\n break;\n case \"Opera\":\n $.Browser.vendor = $.BROWSERS.OPERA;\n $.Browser.version = parseFloat( ver );\n break;\n }\n\n // ignore '?' portion of query string\n var query = window.location.search.substring( 1 ),\n parts = query.split('&'),\n part,\n sep,\n i;\n\n for ( i = 0; i < parts.length; i++ ) {\n part = parts[ i ];\n sep = part.indexOf( '=' );\n\n if ( sep > 0 ) {\n var key = part.substring( 0, sep ),\n value = part.substring( sep + 1 );\n try {\n URLPARAMS[ key ] = decodeURIComponent( value );\n } catch (e) {\n $.console.error( \"Ignoring malformed URL parameter: %s=%s\", key, value );\n }\n }\n }\n\n //determine if this browser supports image alpha transparency\n $.Browser.alpha = !(\n $.Browser.vendor === $.BROWSERS.CHROME && $.Browser.version < 2\n );\n\n //determine if this browser supports element.style.opacity\n $.Browser.opacity = true;\n\n if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 11 ) {\n $.console.error('Internet Explorer versions < 11 are not supported by OpenSeadragon');\n }\n })();\n\n\n // Adding support for HTML5's requestAnimationFrame as suggested by acdha.\n // Implementation taken from matt synder's post here:\n // http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation/\n (function( w ) {\n\n // most browsers have an implementation\n var requestAnimationFrame = w.requestAnimationFrame ||\n w.mozRequestAnimationFrame ||\n w.webkitRequestAnimationFrame ||\n w.msRequestAnimationFrame;\n\n var cancelAnimationFrame = w.cancelAnimationFrame ||\n w.mozCancelAnimationFrame ||\n w.webkitCancelAnimationFrame ||\n w.msCancelAnimationFrame;\n\n // polyfill, when necessary\n if ( requestAnimationFrame && cancelAnimationFrame ) {\n // We can't assign these window methods directly to $ because they\n // expect their \"this\" to be \"window\", so we call them in wrappers.\n $.requestAnimationFrame = function(){\n return requestAnimationFrame.apply( w, arguments );\n };\n $.cancelAnimationFrame = function(){\n return cancelAnimationFrame.apply( w, arguments );\n };\n } else {\n var aAnimQueue = [],\n processing = [],\n iRequestId = 0,\n iIntervalId;\n\n // create a mock requestAnimationFrame function\n $.requestAnimationFrame = function( callback ) {\n aAnimQueue.push( [ ++iRequestId, callback ] );\n\n if ( !iIntervalId ) {\n iIntervalId = setInterval( function() {\n if ( aAnimQueue.length ) {\n var time = $.now();\n // Process all of the currently outstanding frame\n // requests, but none that get added during the\n // processing.\n // Swap the arrays so we don't have to create a new\n // array every frame.\n var temp = processing;\n processing = aAnimQueue;\n aAnimQueue = temp;\n while ( processing.length ) {\n processing.shift()[ 1 ]( time );\n }\n } else {\n // don't continue the interval, if unnecessary\n clearInterval( iIntervalId );\n iIntervalId = undefined;\n }\n }, 1000 / 50); // estimating support for 50 frames per second\n }\n\n return iRequestId;\n };\n\n // create a mock cancelAnimationFrame function\n $.cancelAnimationFrame = function( requestId ) {\n // find the request ID and remove it\n var i, j;\n for ( i = 0, j = aAnimQueue.length; i < j; i += 1 ) {\n if ( aAnimQueue[ i ][ 0 ] === requestId ) {\n aAnimQueue.splice( i, 1 );\n return;\n }\n }\n\n // If it's not in the queue, it may be in the set we're currently\n // processing (if cancelAnimationFrame is called from within a\n // requestAnimationFrame callback).\n for ( i = 0, j = processing.length; i < j; i += 1 ) {\n if ( processing[ i ][ 0 ] === requestId ) {\n processing.splice( i, 1 );\n return;\n }\n }\n };\n }\n })( window );\n\n /**\n * @private\n * @inner\n * @function\n * @param {Element} element\n * @param {Boolean} [isFixed]\n * @returns {Element}\n */\n function getOffsetParent( element, isFixed ) {\n if ( isFixed && element !== document.body ) {\n return document.body;\n } else {\n return element.offsetParent;\n }\n }\n\n}(OpenSeadragon));\n\n\n// Universal Module Definition, supports CommonJS, AMD and simple script tag\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // expose as amd module\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n // expose as commonjs module\n module.exports = factory();\n } else {\n // expose as window.OpenSeadragon\n root.OpenSeadragon = factory();\n }\n}(this, function () {\n return OpenSeadragon;\n}));\n","/*\n * OpenSeadragon - full-screen support functions\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ) {\n /**\n * Determine native full screen support we can get from the browser.\n * @member fullScreenApi\n * @memberof OpenSeadragon\n * @type {object}\n * @property {Boolean} supportsFullScreen Return true if full screen API is supported.\n * @property {Function} isFullScreen Return true if currently in full screen mode.\n * @property {Function} getFullScreenElement Return the element currently in full screen mode.\n * @property {Function} requestFullScreen Make a request to go in full screen mode.\n * @property {Function} exitFullScreen Make a request to exit full screen mode.\n * @property {Function} cancelFullScreen Deprecated, use exitFullScreen instead.\n * @property {String} fullScreenEventName Event fired when the full screen mode change.\n * @property {String} fullScreenErrorEventName Event fired when a request to go\n * in full screen mode failed.\n */\n var fullScreenApi = {\n supportsFullScreen: false,\n isFullScreen: function() { return false; },\n getFullScreenElement: function() { return null; },\n requestFullScreen: function() {},\n exitFullScreen: function() {},\n cancelFullScreen: function() {},\n fullScreenEventName: '',\n fullScreenErrorEventName: ''\n };\n\n // check for native support\n if ( document.exitFullscreen ) {\n // W3C standard\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.fullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.requestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.exitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"fullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"fullscreenerror\";\n } else if ( document.msExitFullscreen ) {\n // IE 11\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.msFullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.msRequestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.msExitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"MSFullscreenChange\";\n fullScreenApi.fullScreenErrorEventName = \"MSFullscreenError\";\n } else if ( document.webkitExitFullscreen ) {\n // Recent webkit\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.webkitFullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.webkitRequestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.webkitExitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"webkitfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"webkitfullscreenerror\";\n } else if ( document.webkitCancelFullScreen ) {\n // Old webkit\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.webkitCurrentFullScreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.webkitRequestFullScreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.webkitCancelFullScreen();\n };\n fullScreenApi.fullScreenEventName = \"webkitfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"webkitfullscreenerror\";\n } else if ( document.mozCancelFullScreen ) {\n // Firefox\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.mozFullScreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.mozRequestFullScreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.mozCancelFullScreen();\n };\n fullScreenApi.fullScreenEventName = \"mozfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"mozfullscreenerror\";\n }\n fullScreenApi.isFullScreen = function() {\n return fullScreenApi.getFullScreenElement() !== null;\n };\n fullScreenApi.cancelFullScreen = function() {\n $.console.error(\"cancelFullScreen is deprecated. Use exitFullScreen instead.\");\n fullScreenApi.exitFullScreen();\n };\n\n // export api\n $.extend( $, fullScreenApi );\n\n})( OpenSeadragon );\n","/*\n * OpenSeadragon - EventSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($){\n\n/**\n * Event handler method signature used by all OpenSeadragon events.\n *\n * @callback EventHandler\n * @memberof OpenSeadragon\n * @param {Object} event - See individual events for event-specific properties.\n */\n\n\n/**\n * @class EventSource\n * @classdesc For use by classes which want to support custom, non-browser events.\n *\n * @memberof OpenSeadragon\n */\n$.EventSource = function() {\n this.events = {};\n};\n\n/** @lends OpenSeadragon.EventSource.prototype */\n$.EventSource.prototype = {\n\n /**\n * Add an event handler to be triggered only once (or a given number of times)\n * for a given event. It is not removable with removeHandler().\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {OpenSeadragon.EventHandler} handler - Function to call when event\n * is triggered.\n * @param {Object} [userData=null] - Arbitrary object to be passed unchanged\n * to the handler.\n * @param {Number} [times=1] - The number of times to handle the event\n * before removing it.\n * @param {Number} [priority=0] - Handler priority. By default, all priorities are 0. Higher number = priority.\n */\n addOnceHandler: function(eventName, handler, userData, times, priority) {\n var self = this;\n times = times || 1;\n var count = 0;\n var onceHandler = function(event) {\n count++;\n if (count === times) {\n self.removeHandler(eventName, onceHandler);\n }\n return handler(event);\n };\n this.addHandler(eventName, onceHandler, userData, priority);\n },\n\n /**\n * Add an event handler for a given event.\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {OpenSeadragon.EventHandler} handler - Function to call when event is triggered.\n * @param {Object} [userData=null] - Arbitrary object to be passed unchanged to the handler.\n * @param {Number} [priority=0] - Handler priority. By default, all priorities are 0. Higher number = priority.\n */\n addHandler: function ( eventName, handler, userData, priority ) {\n var events = this.events[ eventName ];\n if ( !events ) {\n this.events[ eventName ] = events = [];\n }\n if ( handler && $.isFunction( handler ) ) {\n var index = events.length,\n event = { handler: handler, userData: userData || null, priority: priority || 0 };\n events[ index ] = event;\n while ( index > 0 && events[ index - 1 ].priority < events[ index ].priority ) {\n events[ index ] = events[ index - 1 ];\n events[ index - 1 ] = event;\n index--;\n }\n }\n },\n\n /**\n * Remove a specific event handler for a given event.\n * @function\n * @param {String} eventName - Name of event for which the handler is to be removed.\n * @param {OpenSeadragon.EventHandler} handler - Function to be removed.\n */\n removeHandler: function ( eventName, handler ) {\n var events = this.events[ eventName ],\n handlers = [],\n i;\n if ( !events ) {\n return;\n }\n if ( $.isArray( events ) ) {\n for ( i = 0; i < events.length; i++ ) {\n if ( events[i].handler !== handler ) {\n handlers.push( events[ i ] );\n }\n }\n this.events[ eventName ] = handlers;\n }\n },\n\n /**\n * Get the amount of handlers registered for a given event.\n * @param {String} eventName - Name of event to inspect.\n * @returns {number} amount of events\n */\n numberOfHandlers: function (eventName) {\n var events = this.events[ eventName ];\n if ( !events ) {\n return 0;\n }\n return events.length;\n },\n\n /**\n * Remove all event handlers for a given event type. If no type is given all\n * event handlers for every event type are removed.\n * @function\n * @param {String} eventName - Name of event for which all handlers are to be removed.\n */\n removeAllHandlers: function( eventName ) {\n if ( eventName ){\n this.events[ eventName ] = [];\n } else{\n for ( var eventType in this.events ) {\n this.events[ eventType ] = [];\n }\n }\n },\n\n /**\n * Get a function which iterates the list of all handlers registered for a given event, calling the handler for each.\n * @function\n * @param {String} eventName - Name of event to get handlers for.\n */\n getHandler: function ( eventName) {\n var events = this.events[ eventName ];\n if ( !events || !events.length ) {\n return null;\n }\n events = events.length === 1 ?\n [ events[ 0 ] ] :\n Array.apply( null, events );\n return function ( source, args ) {\n var i,\n length = events.length;\n for ( i = 0; i < length; i++ ) {\n if ( events[ i ] ) {\n args.eventSource = source;\n args.userData = events[ i ].userData;\n events[ i ].handler( args );\n }\n }\n };\n },\n\n /**\n * Trigger an event, optionally passing additional information.\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {Object} eventArgs - Event-specific data.\n */\n raiseEvent: function( eventName, eventArgs ) {\n //uncomment if you want to get a log of all events\n //$.console.log( eventName );\n\n var handler = this.getHandler( eventName );\n if ( handler ) {\n return handler( this, eventArgs || {} );\n }\n return undefined;\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - MouseTracker\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ( $ ) {\n\n // All MouseTracker instances\n var MOUSETRACKERS = [];\n\n // dictionary from hash to private properties\n var THIS = {};\n\n\n /**\n * @class MouseTracker\n * @classdesc Provides simplified handling of common pointer device (mouse, touch, pen, etc.) gestures\n * and keyboard events on a specified element.\n * @memberof OpenSeadragon\n * @param {Object} options\n * Allows configurable properties to be entirely specified by passing\n * an options object to the constructor. The constructor also supports\n * the original positional arguments 'element', 'clickTimeThreshold',\n * and 'clickDistThreshold' in that order.\n * @param {Element|String} options.element\n * A reference to an element or an element id for which the pointer/key\n * events will be monitored.\n * @param {Boolean} [options.startDisabled=false]\n * If true, event tracking on the element will not start until\n * {@link OpenSeadragon.MouseTracker.setTracking|setTracking} is called.\n * @param {Number} options.clickTimeThreshold\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n * @param {Number} options.clickDistThreshold\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n * @param {Number} options.dblClickTimeThreshold\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n * @param {Number} options.dblClickDistThreshold\n * The maximum distance allowed between two pointer click events\n * to be treated as a click gesture.\n * @param {Number} [options.stopDelay=50]\n * The number of milliseconds without pointer move before the stop\n * event is fired.\n * @param {OpenSeadragon.EventHandler} [options.preProcessEventHandler=null]\n * An optional handler for controlling DOM event propagation and processing.\n * @param {OpenSeadragon.EventHandler} [options.contextMenuHandler=null]\n * An optional handler for contextmenu.\n * @param {OpenSeadragon.EventHandler} [options.enterHandler=null]\n * An optional handler for pointer enter.\n * @param {OpenSeadragon.EventHandler} [options.leaveHandler=null]\n * An optional handler for pointer leave.\n * @param {OpenSeadragon.EventHandler} [options.exitHandler=null]\n * An optional handler for pointer leave. Deprecated. Use leaveHandler instead.\n * @param {OpenSeadragon.EventHandler} [options.overHandler=null]\n * An optional handler for pointer over.\n * @param {OpenSeadragon.EventHandler} [options.outHandler=null]\n * An optional handler for pointer out.\n * @param {OpenSeadragon.EventHandler} [options.pressHandler=null]\n * An optional handler for pointer press.\n * @param {OpenSeadragon.EventHandler} [options.nonPrimaryPressHandler=null]\n * An optional handler for pointer non-primary button press.\n * @param {OpenSeadragon.EventHandler} [options.releaseHandler=null]\n * An optional handler for pointer release.\n * @param {OpenSeadragon.EventHandler} [options.nonPrimaryReleaseHandler=null]\n * An optional handler for pointer non-primary button release.\n * @param {OpenSeadragon.EventHandler} [options.moveHandler=null]\n * An optional handler for pointer move.\n * @param {OpenSeadragon.EventHandler} [options.scrollHandler=null]\n * An optional handler for mouse wheel scroll.\n * @param {OpenSeadragon.EventHandler} [options.clickHandler=null]\n * An optional handler for pointer click.\n * @param {OpenSeadragon.EventHandler} [options.dblClickHandler=null]\n * An optional handler for pointer double-click.\n * @param {OpenSeadragon.EventHandler} [options.dragHandler=null]\n * An optional handler for the drag gesture.\n * @param {OpenSeadragon.EventHandler} [options.dragEndHandler=null]\n * An optional handler for after a drag gesture.\n * @param {OpenSeadragon.EventHandler} [options.pinchHandler=null]\n * An optional handler for the pinch gesture.\n * @param {OpenSeadragon.EventHandler} [options.keyDownHandler=null]\n * An optional handler for keydown.\n * @param {OpenSeadragon.EventHandler} [options.keyUpHandler=null]\n * An optional handler for keyup.\n * @param {OpenSeadragon.EventHandler} [options.keyHandler=null]\n * An optional handler for keypress.\n * @param {OpenSeadragon.EventHandler} [options.focusHandler=null]\n * An optional handler for focus.\n * @param {OpenSeadragon.EventHandler} [options.blurHandler=null]\n * An optional handler for blur.\n * @param {Object} [options.userData=null]\n * Arbitrary object to be passed unchanged to any attached handler methods.\n */\n $.MouseTracker = function ( options ) {\n\n MOUSETRACKERS.push( this );\n\n var args = arguments;\n\n if ( !$.isPlainObject( options ) ) {\n options = {\n element: args[ 0 ],\n clickTimeThreshold: args[ 1 ],\n clickDistThreshold: args[ 2 ]\n };\n }\n\n this.hash = Math.random(); // An unique hash for this tracker.\n /**\n * The element for which pointer events are being monitored.\n * @member {Element} element\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.element = $.getElement( options.element );\n /**\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n * @member {Number} clickTimeThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.clickTimeThreshold = options.clickTimeThreshold || $.DEFAULT_SETTINGS.clickTimeThreshold;\n /**\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n * @member {Number} clickDistThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.clickDistThreshold = options.clickDistThreshold || $.DEFAULT_SETTINGS.clickDistThreshold;\n /**\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n * @member {Number} dblClickTimeThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.dblClickTimeThreshold = options.dblClickTimeThreshold || $.DEFAULT_SETTINGS.dblClickTimeThreshold;\n /**\n * The maximum distance allowed between two pointer click events\n * to be treated as a double-click gesture.\n * @member {Number} dblClickDistThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.dblClickDistThreshold = options.dblClickDistThreshold || $.DEFAULT_SETTINGS.dblClickDistThreshold;\n /*eslint-disable no-multi-spaces*/\n this.userData = options.userData || null;\n this.stopDelay = options.stopDelay || 50;\n\n this.preProcessEventHandler = options.preProcessEventHandler || null;\n this.contextMenuHandler = options.contextMenuHandler || null;\n this.enterHandler = options.enterHandler || null;\n this.leaveHandler = options.leaveHandler || null;\n this.exitHandler = options.exitHandler || null; // Deprecated v2.5.0\n this.overHandler = options.overHandler || null;\n this.outHandler = options.outHandler || null;\n this.pressHandler = options.pressHandler || null;\n this.nonPrimaryPressHandler = options.nonPrimaryPressHandler || null;\n this.releaseHandler = options.releaseHandler || null;\n this.nonPrimaryReleaseHandler = options.nonPrimaryReleaseHandler || null;\n this.moveHandler = options.moveHandler || null;\n this.scrollHandler = options.scrollHandler || null;\n this.clickHandler = options.clickHandler || null;\n this.dblClickHandler = options.dblClickHandler || null;\n this.dragHandler = options.dragHandler || null;\n this.dragEndHandler = options.dragEndHandler || null;\n this.pinchHandler = options.pinchHandler || null;\n this.stopHandler = options.stopHandler || null;\n this.keyDownHandler = options.keyDownHandler || null;\n this.keyUpHandler = options.keyUpHandler || null;\n this.keyHandler = options.keyHandler || null;\n this.focusHandler = options.focusHandler || null;\n this.blurHandler = options.blurHandler || null;\n /*eslint-enable no-multi-spaces*/\n\n //Store private properties in a scope sealed hash map\n var _this = this;\n\n /**\n * @private\n * @property {Boolean} tracking\n * Are we currently tracking pointer events for this element.\n */\n THIS[ this.hash ] = {\n click: function ( event ) { onClick( _this, event ); },\n dblclick: function ( event ) { onDblClick( _this, event ); },\n keydown: function ( event ) { onKeyDown( _this, event ); },\n keyup: function ( event ) { onKeyUp( _this, event ); },\n keypress: function ( event ) { onKeyPress( _this, event ); },\n focus: function ( event ) { onFocus( _this, event ); },\n blur: function ( event ) { onBlur( _this, event ); },\n contextmenu: function ( event ) { onContextMenu( _this, event ); },\n\n wheel: function ( event ) { onWheel( _this, event ); },\n mousewheel: function ( event ) { onMouseWheel( _this, event ); },\n DOMMouseScroll: function ( event ) { onMouseWheel( _this, event ); },\n MozMousePixelScroll: function ( event ) { onMouseWheel( _this, event ); },\n\n losecapture: function ( event ) { onLoseCapture( _this, event ); },\n\n mouseenter: function ( event ) { onPointerEnter( _this, event ); },\n mouseleave: function ( event ) { onPointerLeave( _this, event ); },\n mouseover: function ( event ) { onPointerOver( _this, event ); },\n mouseout: function ( event ) { onPointerOut( _this, event ); },\n mousedown: function ( event ) { onPointerDown( _this, event ); },\n mouseup: function ( event ) { onPointerUp( _this, event ); },\n mousemove: function ( event ) { onPointerMove( _this, event ); },\n\n touchstart: function ( event ) { onTouchStart( _this, event ); },\n touchend: function ( event ) { onTouchEnd( _this, event ); },\n touchmove: function ( event ) { onTouchMove( _this, event ); },\n touchcancel: function ( event ) { onTouchCancel( _this, event ); },\n\n gesturestart: function ( event ) { onGestureStart( _this, event ); }, // Safari/Safari iOS\n gesturechange: function ( event ) { onGestureChange( _this, event ); }, // Safari/Safari iOS\n\n gotpointercapture: function ( event ) { onGotPointerCapture( _this, event ); },\n lostpointercapture: function ( event ) { onLostPointerCapture( _this, event ); },\n pointerenter: function ( event ) { onPointerEnter( _this, event ); },\n pointerleave: function ( event ) { onPointerLeave( _this, event ); },\n pointerover: function ( event ) { onPointerOver( _this, event ); },\n pointerout: function ( event ) { onPointerOut( _this, event ); },\n pointerdown: function ( event ) { onPointerDown( _this, event ); },\n pointerup: function ( event ) { onPointerUp( _this, event ); },\n pointermove: function ( event ) { onPointerMove( _this, event ); },\n pointercancel: function ( event ) { onPointerCancel( _this, event ); },\n pointerupcaptured: function ( event ) { onPointerUpCaptured( _this, event ); },\n pointermovecaptured: function ( event ) { onPointerMoveCaptured( _this, event ); },\n\n tracking: false,\n\n // Active pointers lists. Array of GesturePointList objects, one for each pointer device type.\n // GesturePointList objects are added each time a pointer is tracked by a new pointer device type (see getActivePointersListByType()).\n // Active pointers are any pointer being tracked for this element which are in the hit-test area\n // of the element (for hover-capable devices) and/or have contact or a button press initiated in the element.\n activePointersLists: [],\n\n // Tracking for double-click gesture\n lastClickPos: null,\n dblClickTimeOut: null,\n\n // Tracking for pinch gesture\n pinchGPoints: [],\n lastPinchDist: 0,\n currentPinchDist: 0,\n lastPinchCenter: null,\n currentPinchCenter: null,\n\n // Tracking for drag\n sentDragEvent: false\n };\n\n this.hasGestureHandlers = !!( this.pressHandler || this.nonPrimaryPressHandler ||\n this.releaseHandler || this.nonPrimaryReleaseHandler ||\n this.clickHandler || this.dblClickHandler ||\n this.dragHandler || this.dragEndHandler ||\n this.pinchHandler );\n this.hasScrollHandler = !!this.scrollHandler;\n\n if ( $.MouseTracker.havePointerEvents ) {\n $.setElementPointerEvents( this.element, 'auto' );\n }\n\n if (this.exitHandler) {\n $.console.error(\"MouseTracker.exitHandler is deprecated. Use MouseTracker.leaveHandler instead.\");\n }\n\n if ( !options.startDisabled ) {\n this.setTracking( true );\n }\n };\n\n /** @lends OpenSeadragon.MouseTracker.prototype */\n $.MouseTracker.prototype = {\n\n /**\n * Clean up any events or objects created by the tracker.\n * @function\n */\n destroy: function () {\n var i;\n\n stopTracking( this );\n this.element = null;\n\n for ( i = 0; i < MOUSETRACKERS.length; i++ ) {\n if ( MOUSETRACKERS[ i ] === this ) {\n MOUSETRACKERS.splice( i, 1 );\n break;\n }\n }\n\n THIS[ this.hash ] = null;\n delete THIS[ this.hash ];\n },\n\n /**\n * Are we currently tracking events on this element.\n * @deprecated Just use this.tracking\n * @function\n * @returns {Boolean} Are we currently tracking events on this element.\n */\n isTracking: function () {\n return THIS[ this.hash ].tracking;\n },\n\n /**\n * Enable or disable whether or not we are tracking events on this element.\n * @function\n * @param {Boolean} track True to start tracking, false to stop tracking.\n * @returns {OpenSeadragon.MouseTracker} Chainable.\n */\n setTracking: function ( track ) {\n if ( track ) {\n startTracking( this );\n } else {\n stopTracking( this );\n }\n //chain\n return this;\n },\n\n /**\n * Returns the {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} for the given pointer device type,\n * creating and caching a new {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} if one doesn't already exist for the type.\n * @function\n * @param {String} type - The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @returns {OpenSeadragon.MouseTracker.GesturePointList}\n */\n getActivePointersListByType: function ( type ) {\n var delegate = THIS[ this.hash ],\n i,\n len = delegate.activePointersLists.length,\n list;\n\n for ( i = 0; i < len; i++ ) {\n if ( delegate.activePointersLists[ i ].type === type ) {\n return delegate.activePointersLists[ i ];\n }\n }\n\n list = new $.MouseTracker.GesturePointList( type );\n delegate.activePointersLists.push( list );\n return list;\n },\n\n /**\n * Returns the total number of pointers currently active on the tracked element.\n * @function\n * @returns {Number}\n */\n getActivePointerCount: function () {\n var delegate = THIS[ this.hash ],\n i,\n len = delegate.activePointersLists.length,\n count = 0;\n\n for ( i = 0; i < len; i++ ) {\n count += delegate.activePointersLists[ i ].getLength();\n }\n\n return count;\n },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n */\n preProcessEventHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the contextmenu event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n contextMenuHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n enterHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @since v2.5.0\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n leaveHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @deprecated v2.5.0 Use leaveHandler instead\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n exitHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @since v2.5.0\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n overHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @since v2.5.0\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n outHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n pressHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.button\n * Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n nonPrimaryPressHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.insideElementReleased\n * True if the cursor inside the tracked element when the button was released.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n releaseHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.button\n * Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n nonPrimaryReleaseHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n moveHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.scroll\n * The scroll delta for the event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead. Touch devices no longer generate scroll event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the wheel event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n scrollHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Boolean} event.quick\n * True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for ignoring drag events.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Element} event.originalTarget\n * The DOM element clicked on.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n clickHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dblClickHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {OpenSeadragon.Point} event.delta\n * The x,y components of the difference between the current position and the last drag event position. Useful for ignoring or weighting the events.\n * @param {Number} event.speed\n * Current computed speed, in pixels per second.\n * @param {Number} event.direction\n * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dragHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.speed\n * Speed at the end of a drag gesture, in pixels per second.\n * @param {Number} event.direction\n * Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dragEndHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {Array.} event.gesturePoints\n * Gesture points associated with the gesture. Velocity data can be found here.\n * @param {OpenSeadragon.Point} event.lastCenter\n * The previous center point of the two pinch contact points relative to the tracked element.\n * @param {OpenSeadragon.Point} event.center\n * The center point of the two pinch contact points relative to the tracked element.\n * @param {Number} event.lastDistance\n * The previous distance between the two pinch contact points in CSS pixels.\n * @param {Number} event.distance\n * The distance between the two pinch contact points in CSS pixels.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n pinchHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. Deprecated. Use pointerType and/or originalEvent instead.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n stopHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the keydown event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyDownHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the keyup event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyUpHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefault\n * Set to true to prevent the default user-agent's handling of the keypress event.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n focusHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n blurHandler: function () { }\n };\n\n // https://github.com/openseadragon/openseadragon/pull/790\n /**\n * True if inside an iframe, otherwise false.\n * @member {Boolean} isInIframe\n * @private\n * @inner\n */\n var isInIframe = (function() {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n })();\n\n // https://github.com/openseadragon/openseadragon/pull/790\n /**\n * @function\n * @private\n * @inner\n * @returns {Boolean} True if the target supports DOM Level 2 event subscription methods, otherwise false.\n */\n function canAccessEvents (target) {\n try {\n return target.addEventListener && target.removeEventListener;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Provides continuous computation of velocity (speed and direction) of active pointers.\n * This is a singleton, used by all MouseTracker instances, as it is unlikely there will ever be more than\n * two active gesture pointers at a time.\n *\n * @private\n * @member gesturePointVelocityTracker\n * @memberof OpenSeadragon.MouseTracker\n */\n $.MouseTracker.gesturePointVelocityTracker = (function () {\n var trackerPoints = [],\n intervalId = 0,\n lastTime = 0;\n\n // Generates a unique identifier for a tracked gesture point\n var _generateGuid = function ( tracker, gPoint ) {\n return tracker.hash.toString() + gPoint.type + gPoint.id.toString();\n };\n\n // Interval timer callback. Computes velocity for all tracked gesture points.\n var _doTracking = function () {\n var i,\n len = trackerPoints.length,\n trackPoint,\n gPoint,\n now = $.now(),\n elapsedTime,\n distance,\n speed;\n\n elapsedTime = now - lastTime;\n lastTime = now;\n\n for ( i = 0; i < len; i++ ) {\n trackPoint = trackerPoints[ i ];\n gPoint = trackPoint.gPoint;\n // Math.atan2 gives us just what we need for a velocity vector, as we can simply\n // use cos()/sin() to extract the x/y velocity components.\n gPoint.direction = Math.atan2( gPoint.currentPos.y - trackPoint.lastPos.y, gPoint.currentPos.x - trackPoint.lastPos.x );\n // speed = distance / elapsed time\n distance = trackPoint.lastPos.distanceTo( gPoint.currentPos );\n trackPoint.lastPos = gPoint.currentPos;\n speed = 1000 * distance / ( elapsedTime + 1 );\n // Simple biased average, favors the most recent speed computation. Smooths out erratic gestures a bit.\n gPoint.speed = 0.75 * speed + 0.25 * gPoint.speed;\n }\n };\n\n // Public. Add a gesture point to be tracked\n var addPoint = function ( tracker, gPoint ) {\n var guid = _generateGuid( tracker, gPoint );\n\n trackerPoints.push(\n {\n guid: guid,\n gPoint: gPoint,\n lastPos: gPoint.currentPos\n } );\n\n // Only fire up the interval timer when there's gesture pointers to track\n if ( trackerPoints.length === 1 ) {\n lastTime = $.now();\n intervalId = window.setInterval( _doTracking, 50 );\n }\n };\n\n // Public. Stop tracking a gesture point\n var removePoint = function ( tracker, gPoint ) {\n var guid = _generateGuid( tracker, gPoint ),\n i,\n len = trackerPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( trackerPoints[ i ].guid === guid ) {\n trackerPoints.splice( i, 1 );\n // Only run the interval timer if theres gesture pointers to track\n len--;\n if ( len === 0 ) {\n window.clearInterval( intervalId );\n }\n break;\n }\n }\n };\n\n return {\n addPoint: addPoint,\n removePoint: removePoint\n };\n } )();\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Pointer event model and feature detection\n///////////////////////////////////////////////////////////////////////////////\n\n $.MouseTracker.captureElement = document;\n\n /**\n * Detect available mouse wheel event name.\n */\n $.MouseTracker.wheelEventName = ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version > 8 ) ||\n ( 'onwheel' in document.createElement( 'div' ) ) ? 'wheel' : // Modern browsers support 'wheel'\n document.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least 'mousewheel'\n 'DOMMouseScroll'; // Assume old Firefox\n\n /**\n * Detect browser pointer device event model(s) and build appropriate list of events to subscribe to.\n */\n $.MouseTracker.subscribeEvents = [ \"click\", \"dblclick\", \"keydown\", \"keyup\", \"keypress\", \"focus\", \"blur\", \"contextmenu\", $.MouseTracker.wheelEventName ];\n\n if( $.MouseTracker.wheelEventName === \"DOMMouseScroll\" ) {\n // Older Firefox\n $.MouseTracker.subscribeEvents.push( \"MozMousePixelScroll\" );\n }\n\n if ( window.PointerEvent ) {\n // IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents)\n $.MouseTracker.havePointerEvents = true;\n $.MouseTracker.subscribeEvents.push( \"pointerenter\", \"pointerleave\", \"pointerover\", \"pointerout\", \"pointerdown\", \"pointerup\", \"pointermove\", \"pointercancel\" );\n // Pointer events capture support\n $.MouseTracker.havePointerCapture = (function () {\n var divElement = document.createElement( 'div' );\n return $.isFunction( divElement.setPointerCapture ) && $.isFunction( divElement.releasePointerCapture );\n }());\n if ( $.MouseTracker.havePointerCapture ) {\n $.MouseTracker.subscribeEvents.push( \"gotpointercapture\", \"lostpointercapture\" );\n }\n } else {\n // Legacy W3C mouse events\n $.MouseTracker.havePointerEvents = false;\n $.MouseTracker.subscribeEvents.push( \"mouseenter\", \"mouseleave\", \"mouseover\", \"mouseout\", \"mousedown\", \"mouseup\", \"mousemove\" );\n $.MouseTracker.mousePointerId = \"legacy-mouse\";\n // Legacy mouse events capture support (IE/Firefox only?)\n $.MouseTracker.havePointerCapture = (function () {\n var divElement = document.createElement( 'div' );\n return $.isFunction( divElement.setCapture ) && $.isFunction( divElement.releaseCapture );\n }());\n if ( $.MouseTracker.havePointerCapture ) {\n $.MouseTracker.subscribeEvents.push( \"losecapture\" );\n }\n // Legacy touch events\n if ( 'ontouchstart' in window ) {\n // iOS, Android, and other W3c Touch Event implementations\n // (see http://www.w3.org/TR/touch-events/)\n // (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n // (see https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n $.MouseTracker.subscribeEvents.push( \"touchstart\", \"touchend\", \"touchmove\", \"touchcancel\" );\n }\n if ( 'ongesturestart' in window ) {\n // iOS (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n // Subscribe to these to prevent default gesture handling\n $.MouseTracker.subscribeEvents.push( \"gesturestart\", \"gesturechange\" );\n }\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Classes and typedefs\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * Used for the processing/disposition of DOM events (propagation, default handling, capture, etc.)\n *\n * @typedef {Object} EventProcessInfo\n * @memberof OpenSeadragon.MouseTracker\n * @since v2.5.0\n *\n * @property {OpenSeadragon.MouseTracker} eventSource\n * A reference to the tracker instance.\n * @property {Object} originalEvent\n * The original DOM event object.\n * @property {Number} eventPhase\n * 0 == NONE, 1 == CAPTURING_PHASE, 2 == AT_TARGET, 3 == BUBBLING_PHASE.\n * @property {String} eventType\n * \"keydown\", \"keyup\", \"keypress\", \"focus\", \"blur\", \"contextmenu\", \"gotpointercapture\", \"lostpointercapture\", \"pointerenter\", \"pointerleave\", \"pointerover\", \"pointerout\", \"pointerdown\", \"pointerup\", \"pointermove\", \"pointercancel\", \"wheel\", \"click\", \"dblclick\".\n * @property {String} pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @property {Boolean} isEmulated\n * True if this is an emulated event. If true, originalEvent is either the event that caused\n * the emulated event, a synthetic event object created with values from the actual DOM event,\n * or null if no DOM event applies. Emulated events can occur on eventType \"wheel\" on legacy mouse-scroll\n * event emitting user agents.\n * @property {Boolean} isStoppable\n * True if propagation of the event (e.g. bubbling) can be stopped with stopPropagation/stopImmediatePropagation.\n * @property {Boolean} isCancelable\n * True if the event's default handling by the browser can be prevented with preventDefault.\n * @property {Boolean} defaultPrevented\n * True if the event's default handling has already been prevented by a descendent element.\n * @property {Boolean} preventDefault\n * Set to true to prevent the event's default handling by the browser.\n * @property {Boolean} preventGesture\n * Set to true to prevent this MouseTracker from generating a gesture from the event.\n * Valid on eventType \"pointerdown\".\n * @property {Boolean} stopPropagation\n * Set to true prevent the event from propagating to ancestor/descendent elements on capture/bubble phase.\n * @property {Boolean} shouldCapture\n * (Internal Use) Set to true if the pointer should be captured (events (re)targeted to tracker element).\n * @property {Boolean} shouldReleaseCapture\n * (Internal Use) Set to true if the captured pointer should be released.\n * @property {Object} userData\n * Arbitrary user-defined object.\n */\n\n\n /**\n * Represents a point of contact on the screen made by a mouse cursor, pen, touch, or other pointer device.\n *\n * @typedef {Object} GesturePoint\n * @memberof OpenSeadragon.MouseTracker\n *\n * @property {Number} id\n * Identifier unique from all other active GesturePoints for a given pointer device.\n * @property {String} type\n * The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @property {Boolean} captured\n * True if events for the gesture point are captured to the tracked element.\n * @property {Boolean} isPrimary\n * True if the gesture point is a master pointer amongst the set of active pointers for each pointer type. True for mouse and primary (first) touch/pen pointers.\n * @property {Boolean} insideElementPressed\n * True if button pressed or contact point initiated inside the screen area of the tracked element.\n * @property {Boolean} insideElement\n * True if pointer or contact point is currently inside the bounds of the tracked element.\n * @property {Number} speed\n * Current computed speed, in pixels per second.\n * @property {Number} direction\n * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {OpenSeadragon.Point} contactPos\n * The initial pointer contact position, relative to the page including any scrolling. Only valid if the pointer has contact (pressed, touch contact, pen contact).\n * @property {Number} contactTime\n * The initial pointer contact time, in milliseconds. Only valid if the pointer has contact (pressed, touch contact, pen contact).\n * @property {OpenSeadragon.Point} lastPos\n * The last pointer position, relative to the page including any scrolling.\n * @property {Number} lastTime\n * The last pointer contact time, in milliseconds.\n * @property {OpenSeadragon.Point} currentPos\n * The current pointer position, relative to the page including any scrolling.\n * @property {Number} currentTime\n * The current pointer contact time, in milliseconds.\n */\n\n\n /**\n * @class GesturePointList\n * @classdesc Provides an abstraction for a set of active {@link OpenSeadragon.MouseTracker.GesturePoint|GesturePoint} objects for a given pointer device type.\n * Active pointers are any pointer being tracked for this element which are in the hit-test area\n * of the element (for hover-capable devices) and/or have contact or a button press initiated in the element.\n * @memberof OpenSeadragon.MouseTracker\n * @param {String} type - The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n */\n $.MouseTracker.GesturePointList = function ( type ) {\n this._gPoints = [];\n /**\n * The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @member {String} type\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.type = type;\n /**\n * Current buttons pressed for the device.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @member {Number} buttons\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.buttons = 0;\n /**\n * Current number of contact points (touch points, mouse down, etc.) for the device.\n * @member {Number} contacts\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.contacts = 0;\n /**\n * Current number of clicks for the device. Used for multiple click gesture tracking.\n * @member {Number} clicks\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.clicks = 0;\n /**\n * Current number of captured pointers for the device.\n * @member {Number} captureCount\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.captureCount = 0;\n };\n\n /** @lends OpenSeadragon.MouseTracker.GesturePointList.prototype */\n $.MouseTracker.GesturePointList.prototype = {\n /**\n * @function\n * @returns {Number} Number of gesture points in the list.\n */\n getLength: function () {\n return this._gPoints.length;\n },\n /**\n * @function\n * @returns {Array.} The list of gesture points in the list as an array (read-only).\n */\n asArray: function () {\n return this._gPoints;\n },\n /**\n * @function\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gesturePoint - A gesture point to add to the list.\n * @returns {Number} Number of gesture points in the list.\n */\n add: function ( gp ) {\n return this._gPoints.push( gp );\n },\n /**\n * @function\n * @param {Number} id - The id of the gesture point to remove from the list.\n * @returns {Number} Number of gesture points in the list.\n */\n removeById: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].id === id ) {\n this._gPoints.splice( i, 1 );\n break;\n }\n }\n return this._gPoints.length;\n },\n /**\n * @function\n * @param {Number} index - The index of the gesture point to retrieve from the list.\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point at the given index, or null if not found.\n */\n getByIndex: function ( index ) {\n if ( index < this._gPoints.length) {\n return this._gPoints[ index ];\n }\n\n return null;\n },\n /**\n * @function\n * @param {Number} id - The id of the gesture point to retrieve from the list.\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point with the given id, or null if not found.\n */\n getById: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].id === id ) {\n return this._gPoints[ i ];\n }\n }\n return null;\n },\n /**\n * @function\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The primary gesture point in the list, or null if not found.\n */\n getPrimary: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].isPrimary ) {\n return this._gPoints[ i ];\n }\n }\n return null;\n },\n\n /**\n * Increment this pointer list's contact count.\n * It will evaluate whether this pointer type is allowed to have multiple contacts.\n * @function\n */\n addContact: function() {\n ++this.contacts;\n\n if (this.contacts > 1 && (this.type === \"mouse\" || this.type === \"pen\")) {\n $.console.warn('GesturePointList.addContact() Implausible contacts value');\n this.contacts = 1;\n }\n },\n\n /**\n * Decrement this pointer list's contact count.\n * It will make sure the count does not go below 0.\n * @function\n */\n removeContact: function() {\n --this.contacts;\n\n if (this.contacts < 0) {\n this.contacts = 0;\n }\n }\n };\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Utility functions\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * Removes all tracked pointers.\n * @private\n * @inner\n */\n function clearTrackedPointers( tracker ) {\n var delegate = THIS[ tracker.hash ],\n i, j,\n pointsList,\n gPoints,\n gPointsToRemove,\n pointerListCount = delegate.activePointersLists.length;\n\n for ( i = 0; i < pointerListCount; i++ ) {\n pointsList = delegate.activePointersLists[ i ];\n\n if ( pointsList.getLength() > 0 ) {\n // Make an array containing references to the gPoints in the pointer list\n // (because calls to stopTrackingPointer() are going to modify the pointer list)\n gPointsToRemove = [];\n gPoints = pointsList.asArray();\n for ( j = 0; j < gPoints.length; j++ ) {\n gPointsToRemove.push( gPoints[ j ] );\n }\n\n // Release and remove all gPoints from the pointer list\n for ( j = 0; j < gPointsToRemove.length; j++ ) {\n stopTrackingPointer( tracker, pointsList, gPointsToRemove[ j ] );\n }\n }\n }\n\n for ( i = 0; i < pointerListCount; i++ ) {\n delegate.activePointersLists.pop();\n }\n\n delegate.sentDragEvent = false;\n }\n\n /**\n * Starts tracking pointer events on the tracked element.\n * @private\n * @inner\n */\n function startTracking( tracker ) {\n var delegate = THIS[ tracker.hash ],\n event,\n i;\n\n if ( !delegate.tracking ) {\n for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) {\n event = $.MouseTracker.subscribeEvents[ i ];\n $.addEvent(\n tracker.element,\n event,\n delegate[ event ],\n event === $.MouseTracker.wheelEventName ? { passive: false, capture: false } : false\n );\n }\n\n clearTrackedPointers( tracker );\n\n delegate.tracking = true;\n }\n }\n\n /**\n * Stops tracking pointer events on the tracked element.\n * @private\n * @inner\n */\n function stopTracking( tracker ) {\n var delegate = THIS[ tracker.hash ],\n event,\n i;\n\n if ( delegate.tracking ) {\n for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) {\n event = $.MouseTracker.subscribeEvents[ i ];\n $.removeEvent(\n tracker.element,\n event,\n delegate[ event ],\n false\n );\n }\n\n clearTrackedPointers( tracker );\n\n delegate.tracking = false;\n }\n }\n\n /**\n * @private\n * @inner\n */\n function getCaptureEventParams( tracker, pointerType ) {\n var delegate = THIS[ tracker.hash ];\n\n if ( pointerType === 'pointerevent' ) {\n return {\n upName: 'pointerup',\n upHandler: delegate.pointerupcaptured,\n moveName: 'pointermove',\n moveHandler: delegate.pointermovecaptured\n };\n } else if ( pointerType === 'mouse' ) {\n return {\n upName: 'pointerup',\n upHandler: delegate.pointerupcaptured,\n moveName: 'pointermove',\n moveHandler: delegate.pointermovecaptured\n };\n } else if ( pointerType === 'touch' ) {\n return {\n upName: 'touchend',\n upHandler: delegate.touchendcaptured,\n moveName: 'touchmove',\n moveHandler: delegate.touchmovecaptured\n };\n } else {\n throw new Error( \"MouseTracker.getCaptureEventParams: Unknown pointer type.\" );\n }\n }\n\n /**\n * Begin capturing pointer events to the tracked element.\n * @private\n * @inner\n */\n function capturePointer( tracker, gPoint ) {\n var eventParams;\n\n if ( $.MouseTracker.havePointerCapture ) {\n if ( $.MouseTracker.havePointerEvents ) {\n // Can throw NotFoundError (InvalidPointerId Firefox < 82)\n // (should never happen so we'll log a warning)\n try {\n tracker.element.setPointerCapture( gPoint.id );\n //$.console.log('element.setPointerCapture() called');\n } catch ( e ) {\n $.console.warn('setPointerCapture() called on invalid pointer ID');\n return;\n }\n } else {\n tracker.element.setCapture( true );\n //$.console.log('element.setCapture() called');\n }\n } else {\n // Emulate mouse capture by hanging listeners on the document object.\n // (Note we listen on the capture phase so the captured handlers will get called first)\n // eslint-disable-next-line no-use-before-define\n //$.console.log('Emulated mouse capture set');\n eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : gPoint.type );\n // https://github.com/openseadragon/openseadragon/pull/790\n if (isInIframe && canAccessEvents(window.top)) {\n $.addEvent(\n window.top,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n $.addEvent(\n $.MouseTracker.captureElement,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n $.addEvent(\n $.MouseTracker.captureElement,\n eventParams.moveName,\n eventParams.moveHandler,\n true\n );\n }\n\n updatePointerCaptured( tracker, gPoint, true );\n }\n\n\n /**\n * Stop capturing pointer events to the tracked element.\n * @private\n * @inner\n */\n function releasePointer( tracker, gPoint ) {\n var eventParams;\n var pointsList;\n var cachedGPoint;\n\n if ( $.MouseTracker.havePointerCapture ) {\n if ( $.MouseTracker.havePointerEvents ) {\n pointsList = tracker.getActivePointersListByType( gPoint.type );\n cachedGPoint = pointsList.getById( gPoint.id );\n if ( !cachedGPoint || !cachedGPoint.captured ) {\n return;\n }\n // Can throw NotFoundError (InvalidPointerId Firefox < 82)\n // (should never happen, but it does on Firefox 79 touch so we won't log a warning)\n try {\n tracker.element.releasePointerCapture( gPoint.id );\n //$.console.log('element.releasePointerCapture() called');\n } catch ( e ) {\n //$.console.warn('releasePointerCapture() called on invalid pointer ID');\n }\n } else {\n tracker.element.releaseCapture();\n //$.console.log('element.releaseCapture() called');\n }\n } else {\n // Emulate mouse capture by hanging listeners on the document object.\n // (Note we listen on the capture phase so the captured handlers will get called first)\n //$.console.log('Emulated mouse capture release');\n eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : gPoint.type );\n // https://github.com/openseadragon/openseadragon/pull/790\n if (isInIframe && canAccessEvents(window.top)) {\n $.removeEvent(\n window.top,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n $.removeEvent(\n $.MouseTracker.captureElement,\n eventParams.moveName,\n eventParams.moveHandler,\n true\n );\n $.removeEvent(\n $.MouseTracker.captureElement,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n\n updatePointerCaptured( tracker, gPoint, false );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n * @private\n * @inner\n */\n function getPointerId( event ) {\n return ( $.MouseTracker.havePointerEvents ) ? event.pointerId : $.MouseTracker.mousePointerId;\n }\n\n\n /**\n * Gets a W3C Pointer Events model compatible pointer type string from a DOM pointer event.\n * IE10 used a long integer value, but the W3C specification (and IE11+) use a string \"mouse\", \"touch\", \"pen\", etc.\n *\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n * @private\n * @inner\n */\n function getPointerType( event ) {\n if ( $.MouseTracker.havePointerEvents ) {\n // Note: IE pointer events bug - sends invalid pointerType on lostpointercapture events\n // and possibly other events. We rely on sane, valid property values in DOM events, so for\n // IE, when the pointerType is missing, we'll default to 'mouse'...should be right most of the time\n return event.pointerType || (( $.Browser.vendor === $.BROWSERS.IE ) ? 'mouse' : '');\n } else {\n return 'mouse';\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n * @private\n * @inner\n */\n function getIsPrimary( event ) {\n return ( $.MouseTracker.havePointerEvents ) ? event.isPrimary : true;\n }\n\n\n /**\n * @private\n * @inner\n */\n function getMouseAbsolute( event ) {\n return $.getMousePosition( event );\n }\n\n /**\n * @private\n * @inner\n */\n function getMouseRelative( event, element ) {\n return getPointRelativeToAbsolute( getMouseAbsolute( event ), element );\n }\n\n /**\n * @private\n * @inner\n */\n function getPointRelativeToAbsolute( point, element ) {\n var offset = $.getElementOffset( element );\n return point.minus( offset );\n }\n\n /**\n * @private\n * @inner\n */\n function getCenterPoint( point1, point2 ) {\n return new $.Point( ( point1.x + point2.x ) / 2, ( point1.y + point2.y ) / 2 );\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Device-specific DOM event handlers\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * @private\n * @inner\n */\n function onClick( tracker, event ) {\n //$.console.log('click ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'click',\n pointerType: 'mouse',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onDblClick( tracker, event ) {\n //$.console.log('dblclick ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'dblclick',\n pointerType: 'mouse',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyDown( tracker, event ) {\n //$.console.log( \"keydown %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n var eventArgs = null;\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'keydown',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.keyDownHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n tracker.keyDownHandler( eventArgs );\n }\n\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyUp( tracker, event ) {\n //$.console.log( \"keyup %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n\n var eventArgs = null;\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'keyup',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.keyUpHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n tracker.keyUpHandler( eventArgs );\n }\n\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyPress( tracker, event ) {\n //$.console.log( \"keypress %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n\n var eventArgs = null;\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'keypress',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.keyHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n tracker.keyHandler( eventArgs );\n }\n\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onFocus( tracker, event ) {\n //$.console.log('focus ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n // focus doesn't bubble and is not cancelable, but we call\n // preProcessEvent() so it's dispatched to preProcessEventHandler\n // if necessary\n var eventInfo = {\n originalEvent: event,\n eventType: 'focus',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.focusHandler && !eventInfo.preventGesture ) {\n tracker.focusHandler(\n {\n eventSource: tracker,\n originalEvent: event,\n userData: tracker.userData\n }\n );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onBlur( tracker, event ) {\n //$.console.log('blur ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n // blur doesn't bubble and is not cancelable, but we call\n // preProcessEvent() so it's dispatched to preProcessEventHandler\n // if necessary\n var eventInfo = {\n originalEvent: event,\n eventType: 'blur',\n pointerType: '',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.blurHandler && !eventInfo.preventGesture ) {\n tracker.blurHandler(\n {\n eventSource: tracker,\n originalEvent: event,\n userData: tracker.userData\n }\n );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onContextMenu( tracker, event ) {\n //$.console.log('contextmenu ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventArgs = null;\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'contextmenu',\n pointerType: 'mouse',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n // ContextMenu\n if ( tracker.contextMenuHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n position: getPointRelativeToAbsolute( getMouseAbsolute( event ), tracker.element ),\n originalEvent: eventInfo.originalEvent,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n tracker.contextMenuHandler( eventArgs );\n }\n\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * Handler for 'wheel' events\n *\n * @private\n * @inner\n */\n function onWheel( tracker, event ) {\n handleWheelEvent( tracker, event, event );\n }\n\n\n /**\n * Handler for 'mousewheel', 'DOMMouseScroll', and 'MozMousePixelScroll' events\n *\n * @private\n * @inner\n */\n function onMouseWheel( tracker, event ) {\n // Simulate a 'wheel' event\n var simulatedEvent = {\n target: event.target || event.srcElement,\n type: \"wheel\",\n shiftKey: event.shiftKey || false,\n clientX: event.clientX,\n clientY: event.clientY,\n pageX: event.pageX ? event.pageX : event.clientX,\n pageY: event.pageY ? event.pageY : event.clientY,\n deltaMode: event.type === \"MozMousePixelScroll\" ? 0 : 1, // 0=pixel, 1=line, 2=page\n deltaX: 0,\n deltaZ: 0\n };\n\n // Calculate deltaY\n if ( $.MouseTracker.wheelEventName === \"mousewheel\" ) {\n simulatedEvent.deltaY = -event.wheelDelta / $.DEFAULT_SETTINGS.pixelsPerWheelLine;\n } else {\n simulatedEvent.deltaY = event.detail;\n }\n\n handleWheelEvent( tracker, simulatedEvent, event );\n }\n\n\n /**\n * Handles 'wheel' events.\n * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()).\n *\n * @private\n * @inner\n */\n function handleWheelEvent( tracker, event, originalEvent ) {\n var nDelta = 0,\n eventInfo;\n\n var eventArgs = null;\n\n // The nDelta variable is gated to provide smooth z-index scrolling\n // since the mouse wheel allows for substantial deltas meant for rapid\n // y-index scrolling.\n // event.deltaMode: 0=pixel, 1=line, 2=page\n // TODO: Deltas in pixel mode should be accumulated then a scroll value computed after $.DEFAULT_SETTINGS.pixelsPerWheelLine threshold reached\n nDelta = event.deltaY < 0 ? 1 : -1;\n\n eventInfo = {\n originalEvent: event,\n eventType: 'wheel',\n pointerType: 'mouse',\n isEmulated: event !== originalEvent\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( tracker.scrollHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventArgs = {\n eventSource: tracker,\n pointerType: 'mouse',\n position: getMouseRelative( event, tracker.element ),\n scroll: nDelta,\n shift: event.shiftKey,\n isTouchEvent: false,\n originalEvent: originalEvent,\n preventDefault: eventInfo.preventDefault || eventInfo.defaultPrevented,\n userData: tracker.userData\n };\n\n\n tracker.scrollHandler( eventArgs );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( originalEvent );\n }\n if ( ( eventArgs && eventArgs.preventDefault ) || ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) ) {\n $.cancelEvent( originalEvent );\n }\n}\n\n\n /**\n * TODO Never actually seen this event fired, and documentation is tough to find\n * @private\n * @inner\n */\n function onLoseCapture( tracker, event ) {\n //$.console.log('losecapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var gPoint = {\n id: $.MouseTracker.mousePointerId,\n type: 'mouse'\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'lostpointercapture',\n pointerType: 'mouse',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( event.target === tracker.element ) {\n updatePointerCaptured( tracker, gPoint, false );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchStart( tracker, event ) {\n var time,\n i,\n touchCount = event.changedTouches.length,\n gPoint,\n pointsList = tracker.getActivePointersListByType( 'touch' );\n\n time = $.now();\n\n //$.console.log('touchstart ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n if ( pointsList.getLength() > event.touches.length - touchCount ) {\n $.console.warn('Tracked touch contact count doesn\\'t match event.touches.length');\n }\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerdown',\n pointerType: 'touch',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoint = {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n // Simulate isPrimary\n isPrimary: pointsList.getLength() === 0,\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: time\n };\n\n // simulate touchenter on our tracked element\n updatePointerEnter( tracker, eventInfo, gPoint );\n\n updatePointerDown( tracker, eventInfo, gPoint, 0 );\n\n updatePointerCaptured( tracker, gPoint, true );\n }\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchEnd( tracker, event ) {\n var time,\n i,\n touchCount = event.changedTouches.length,\n gPoint;\n\n time = $.now();\n\n //$.console.log('touchend ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerup',\n pointerType: 'touch',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoint = {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: time\n };\n\n updatePointerUp( tracker, eventInfo, gPoint, 0 );\n\n updatePointerCaptured( tracker, gPoint, false );\n\n // simulate touchleave on our tracked element\n updatePointerLeave( tracker, eventInfo, gPoint );\n }\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchMove( tracker, event ) {\n var time,\n i,\n touchCount = event.changedTouches.length,\n gPoint;\n\n time = $.now();\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointermove',\n pointerType: 'touch',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoint = {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: time\n };\n\n updatePointerMove( tracker, eventInfo, gPoint );\n }\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchCancel( tracker, event ) {\n var touchCount = event.changedTouches.length,\n i,\n gPoint;\n\n //$.console.log('touchcancel ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointercancel',\n pointerType: 'touch',\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoint = {\n id: event.changedTouches[ i ].identifier,\n type: 'touch'\n };\n\n //TODO need to only do this if our element is target?\n updatePointerCancel( tracker, eventInfo, gPoint );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onGestureStart( tracker, event ) {\n if ( !$.eventIsCanceled( event ) ) {\n event.preventDefault();\n }\n return false;\n }\n\n\n /**\n * @private\n * @inner\n */\n function onGestureChange( tracker, event ) {\n if ( !$.eventIsCanceled( event ) ) {\n event.preventDefault();\n }\n return false;\n }\n\n\n /**\n * @private\n * @inner\n */\n function onGotPointerCapture( tracker, event ) {\n //$.console.log('gotpointercapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'gotpointercapture',\n pointerType: getPointerType( event ),\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( event.target === tracker.element ) {\n //$.console.log('gotpointercapture ' + (tracker.userData ? tracker.userData.toString() : ''));\n updatePointerCaptured( tracker, {\n id: event.pointerId,\n type: getPointerType( event )\n }, true );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onLostPointerCapture( tracker, event ) {\n //$.console.log('lostpointercapture ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'lostpointercapture',\n pointerType: getPointerType( event ),\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n if ( event.target === tracker.element ) {\n //$.console.log('lostpointercapture ' + (tracker.userData ? tracker.userData.toString() : ''));\n updatePointerCaptured( tracker, {\n id: event.pointerId,\n type: getPointerType( event )\n }, false );\n }\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerEnter( tracker, event ) {\n //$.console.log('pointerenter ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n // pointerenter doesn't bubble and is not cancelable, but we call\n // preProcessEvent() so it's dispatched to preProcessEventHandler\n // if necessary\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerenter',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerEnter( tracker, eventInfo, gPoint );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerLeave( tracker, event ) {\n //$.console.log('pointerleave ' + (tracker.userData ? tracker.userData.toString() : ''));\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n // pointerleave doesn't bubble and is not cancelable, but we call\n // preProcessEvent() so it's dispatched to preProcessEventHandler\n // if necessary\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerleave',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerLeave( tracker, eventInfo, gPoint );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerOver( tracker, event ) {\n //$.console.log('pointerover ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerover',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerOver( tracker, eventInfo, gPoint );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerOut( tracker, event ) {\n //$.console.log('pointerout ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerout',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerOut( tracker, eventInfo, gPoint );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerDown( tracker, event ) {\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n // Most browsers implicitly capture touch pointer events\n // Note no IE versions have element.hasPointerCapture() so no implicit\n // pointer capture possible\n // var implicitlyCaptured = ($.MouseTracker.havePointerEvents &&\n // event.target.hasPointerCapture &&\n // $.Browser.vendor !== $.BROWSERS.IE) ?\n // event.target.hasPointerCapture(event.pointerId) : false;\n var implicitlyCaptured = $.MouseTracker.havePointerEvents &&\n gPoint.type === 'touch' &&\n $.Browser.vendor !== $.BROWSERS.IE;\n\n //$.console.log('pointerdown ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerdown',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerDown( tracker, eventInfo, gPoint, event.button );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n if ( eventInfo.shouldCapture ) {\n if ( implicitlyCaptured ) {\n updatePointerCaptured( tracker, gPoint, true );\n } else {\n capturePointer( tracker, gPoint );\n }\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerUp( tracker, event ) {\n handlePointerUp( tracker, event );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * This handler is attached to the window object (on the capture phase) to emulate mouse capture.\n * onPointerUp is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onPointerUpCaptured( tracker, event ) {\n var pointsList = tracker.getActivePointersListByType( getPointerType( event ) );\n if ( pointsList.getById( event.pointerId ) ) {\n handlePointerUp( tracker, event );\n }\n $.stopEvent( event );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function handlePointerUp( tracker, event ) {\n var gPoint;\n\n //$.console.log('pointerup ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointerup',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerUp( tracker, eventInfo, gPoint, event.button );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n\n // Per spec, pointerup events are supposed to release capture. Not all browser\n // versions have adhered to the spec, and there's no harm in releasing\n // explicitly\n if ( eventInfo.shouldReleaseCapture ) {\n if ( event.target === tracker.element ) {\n releasePointer( tracker, gPoint );\n } else {\n updatePointerCaptured( tracker, gPoint, false );\n }\n }\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function onPointerMove( tracker, event ) {\n handlePointerMove( tracker, event );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * This handler is attached to the window object (on the capture phase) to emulate mouse capture.\n * onPointerMove is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onPointerMoveCaptured( tracker, event ) {\n var pointsList = tracker.getActivePointersListByType( getPointerType( event ) );\n if ( pointsList.getById( event.pointerId ) ) {\n handlePointerMove( tracker, event );\n }\n $.stopEvent( event );\n }\n\n\n /**\n * Note: Called for both pointer events and legacy mouse events\n * ($.MouseTracker.havePointerEvents determines which)\n *\n * @private\n * @inner\n */\n function handlePointerMove( tracker, event ) {\n // Pointer changed coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height)\n\n var gPoint = {\n id: getPointerId( event ),\n type: getPointerType( event ),\n isPrimary: getIsPrimary( event ),\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointermove',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n updatePointerMove( tracker, eventInfo, gPoint );\n\n if ( eventInfo.preventDefault && !eventInfo.defaultPrevented ) {\n $.cancelEvent( event );\n }\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onPointerCancel( tracker, event ) {\n //$.console.log('pointercancel ' + (tracker.userData ? tracker.userData.toString() : '') + ' ' + (event.target === tracker.element ? 'tracker.element' : ''));\n\n var gPoint = {\n id: event.pointerId,\n type: getPointerType( event )\n };\n\n var eventInfo = {\n originalEvent: event,\n eventType: 'pointercancel',\n pointerType: gPoint.type,\n isEmulated: false\n };\n preProcessEvent( tracker, eventInfo );\n\n //TODO need to only do this if our element is target?\n updatePointerCancel( tracker, eventInfo, gPoint );\n\n if ( eventInfo.stopPropagation ) {\n $.stopEvent( event );\n }\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Device-agnostic DOM event handlers\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList\n * The GesturePointList to track the pointer in.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point to track.\n * @returns {Number} Number of gesture points in pointsList.\n */\n function startTrackingPointer( pointsList, gPoint ) {\n //$.console.log('startTrackingPointer *** ' + pointsList.type + ' ' + gPoint.id.toString());\n gPoint.speed = 0;\n gPoint.direction = 0;\n gPoint.contactPos = gPoint.currentPos;\n gPoint.contactTime = gPoint.currentTime;\n gPoint.lastPos = gPoint.currentPos;\n gPoint.lastTime = gPoint.currentTime;\n\n return pointsList.add( gPoint );\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList\n * The GesturePointList to stop tracking the pointer on.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point to stop tracking.\n * @returns {Number} Number of gesture points in pointsList.\n */\n function stopTrackingPointer( tracker, pointsList, gPoint ) {\n //$.console.log('stopTrackingPointer *** ' + pointsList.type + ' ' + gPoint.id.toString());\n var listLength;\n\n var trackedGPoint = pointsList.getById( gPoint.id );\n\n if ( trackedGPoint ) {\n if ( trackedGPoint.captured ) {\n $.console.warn('stopTrackingPointer() called on captured pointer');\n releasePointer( tracker, trackedGPoint );\n }\n\n // If child element relinquishes capture to a parent we may get here\n // from a pointerleave event while a pointerup event will never be received.\n // In that case, we'll clean up the contact count\n pointsList.removeContact();\n\n listLength = pointsList.removeById( gPoint.id );\n } else {\n listLength = pointsList.getLength();\n }\n\n return listLength;\n }\n\n\n /**\n * @function\n * @private\n * @inner\n */\n function getEventProcessDefaults( tracker, eventInfo ) {\n switch ( eventInfo.eventType ) {\n case 'pointermove':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false;\n eventInfo.preventGesture = !tracker.hasGestureHandlers;\n eventInfo.stopPropagation = false;\n break;\n case 'pointerover':\n case 'pointerout':\n case 'contextmenu':\n case 'keydown':\n case 'keyup':\n case 'keypress':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false; // onContextMenu(), onKeyDown(), onKeyUp(), onKeyPress() may set true\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n case 'pointerdown':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false; // updatePointerDown() may set true (tracker.hasGestureHandlers)\n eventInfo.preventGesture = !tracker.hasGestureHandlers;\n eventInfo.stopPropagation = false;\n break;\n case 'pointerup':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false;\n eventInfo.preventGesture = !tracker.hasGestureHandlers;\n eventInfo.stopPropagation = false;\n break;\n case 'wheel':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = false; // handleWheelEvent() may set true\n eventInfo.preventGesture = !tracker.hasScrollHandler;\n eventInfo.stopPropagation = false;\n break;\n case 'gotpointercapture':\n case 'lostpointercapture':\n case 'pointercancel':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = false;\n eventInfo.preventDefault = false;\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n case 'click':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = !!tracker.clickHandler;\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n case 'dblclick':\n eventInfo.isStoppable = true;\n eventInfo.isCancelable = true;\n eventInfo.preventDefault = !!tracker.dblClickHandler;\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n case 'focus':\n case 'blur':\n case 'pointerenter':\n case 'pointerleave':\n default:\n eventInfo.isStoppable = false;\n eventInfo.isCancelable = false;\n eventInfo.preventDefault = false;\n eventInfo.preventGesture = false;\n eventInfo.stopPropagation = false;\n break;\n }\n }\n\n\n /**\n * Sets up for and calls preProcessEventHandler. Call with the following parameters -\n * this function will fill in the rest of the preProcessEventHandler event object\n * properties\n *\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * @param {Object} eventInfo.originalEvent\n * @param {String} eventInfo.eventType\n * @param {String} eventInfo.pointerType\n * @param {Boolean} eventInfo.isEmulated\n */\n function preProcessEvent( tracker, eventInfo ) {\n eventInfo.eventSource = tracker;\n eventInfo.eventPhase = eventInfo.originalEvent ?\n ((typeof eventInfo.originalEvent.eventPhase !== 'undefined') ?\n eventInfo.originalEvent.eventPhase : 0) : 0;\n eventInfo.defaultPrevented = $.eventIsCanceled( eventInfo.originalEvent );\n eventInfo.shouldCapture = false;\n eventInfo.shouldReleaseCapture = false;\n eventInfo.userData = tracker.userData;\n\n getEventProcessDefaults( tracker, eventInfo );\n\n if ( tracker.preProcessEventHandler ) {\n tracker.preProcessEventHandler( eventInfo );\n }\n }\n\n\n /**\n * Sets or resets the captured property on the tracked pointer matching the passed gPoint's id/type\n *\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {Object} gPoint\n * An object with id and type properties describing the pointer to update.\n * @param {Boolean} isCaptured\n * Value to set the captured property to.\n */\n function updatePointerCaptured( tracker, gPoint, isCaptured ) {\n var pointsList = tracker.getActivePointersListByType( gPoint.type );\n var updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n if ( isCaptured && !updateGPoint.captured ) {\n updateGPoint.captured = true;\n pointsList.captureCount++;\n } else if ( !isCaptured && updateGPoint.captured ) {\n updateGPoint.captured = false;\n pointsList.captureCount--;\n if ( pointsList.captureCount < 0 ) {\n pointsList.captureCount = 0;\n $.console.warn('updatePointerCaptured() - pointsList.captureCount went negative');\n }\n }\n } else {\n $.console.warn('updatePointerCaptured() called on untracked pointer');\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n */\n function updatePointerEnter( tracker, eventInfo, gPoint ) {\n var pointsList = tracker.getActivePointersListByType( gPoint.type ),\n updateGPoint;\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n updateGPoint.insideElement = true;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n\n gPoint = updateGPoint;\n } else {\n // Initialize for tracking and add to the tracking list\n gPoint.captured = false; // Handled by updatePointerCaptured()\n gPoint.insideElementPressed = false;\n gPoint.insideElement = true;\n startTrackingPointer( pointsList, gPoint );\n }\n\n // Enter (doesn't bubble and not cancelable)\n if ( tracker.enterHandler ) {\n tracker.enterHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: gPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n */\n function updatePointerLeave( tracker, eventInfo, gPoint ) {\n var pointsList = tracker.getActivePointersListByType(gPoint.type),\n updateGPoint,\n dispatchEventObj;\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer. If captured then update it, else stop tracking it\n if ( updateGPoint.captured ) {\n updateGPoint.insideElement = false;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n } else {\n stopTrackingPointer( tracker, pointsList, updateGPoint );\n }\n\n gPoint = updateGPoint;\n } else {\n gPoint.captured = false; // Handled by updatePointerCaptured()\n gPoint.insideElementPressed = false;\n }\n\n // Leave (doesn't bubble and not cancelable)\n // Note: exitHandler is deprecated (v2.5.0), replaced by leaveHandler\n if ( tracker.leaveHandler || tracker.exitHandler ) {\n dispatchEventObj = {\n eventSource: tracker,\n pointerType: gPoint.type,\n // GitHub PR: https://github.com/openseadragon/openseadragon/pull/1754 (gPoint.currentPos && )\n position: gPoint.currentPos && getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: gPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n };\n\n if ( tracker.leaveHandler ) {\n tracker.leaveHandler( dispatchEventObj );\n }\n // Deprecated\n if ( tracker.exitHandler ) {\n tracker.exitHandler( dispatchEventObj );\n }\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n */\n function updatePointerOver( tracker, eventInfo, gPoint ) {\n var pointsList,\n updateGPoint;\n\n pointsList = tracker.getActivePointersListByType( gPoint.type );\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n gPoint = updateGPoint;\n } else {\n gPoint.captured = false;\n gPoint.insideElementPressed = false;\n //gPoint.insideElement = true; // Tracked by updatePointerEnter\n }\n\n if ( tracker.overHandler ) {\n // Over\n tracker.overHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: gPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n }\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n */\n function updatePointerOut( tracker, eventInfo, gPoint ) {\n var pointsList,\n updateGPoint;\n\n pointsList = tracker.getActivePointersListByType(gPoint.type);\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n gPoint = updateGPoint;\n } else {\n gPoint.captured = false;\n gPoint.insideElementPressed = false;\n //gPoint.insideElement = true; // Tracked by updatePointerEnter\n }\n\n if ( tracker.outHandler ) {\n // Out\n tracker.outHandler( {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: gPoint.currentPos && getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: gPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n } );\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point associated with the event.\n * @param {Number} buttonChanged\n * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model,\n * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events.\n */\n function updatePointerDown( tracker, eventInfo, gPoint, buttonChanged ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoint.type ),\n updateGPoint;\n\n if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) {\n pointsList.buttons = eventInfo.originalEvent.buttons;\n } else {\n if ( buttonChanged === 0 ) {\n // Primary\n pointsList.buttons |= 1;\n } else if ( buttonChanged === 1 ) {\n // Aux\n pointsList.buttons |= 4;\n } else if ( buttonChanged === 2 ) {\n // Secondary\n pointsList.buttons |= 2;\n } else if ( buttonChanged === 3 ) {\n // X1 (Back)\n pointsList.buttons |= 8;\n } else if ( buttonChanged === 4 ) {\n // X2 (Forward)\n pointsList.buttons |= 16;\n } else if ( buttonChanged === 5 ) {\n // Pen Eraser\n pointsList.buttons |= 32;\n }\n }\n\n // Only capture and track primary button, pen, and touch contacts\n if ( buttonChanged !== 0 ) {\n eventInfo.shouldCapture = false;\n eventInfo.shouldReleaseCapture = false;\n\n // Aux Press\n if ( tracker.nonPrimaryPressHandler &&\n !eventInfo.preventGesture &&\n !eventInfo.defaultPrevented ) {\n eventInfo.preventDefault = true;\n\n tracker.nonPrimaryPressHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n button: buttonChanged,\n buttons: pointsList.buttons,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n return;\n }\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n //updateGPoint.captured = true; // Handled by updatePointerCaptured()\n updateGPoint.insideElementPressed = true;\n updateGPoint.insideElement = true;\n updateGPoint.originalTarget = eventInfo.originalEvent.target;\n updateGPoint.contactPos = gPoint.currentPos;\n updateGPoint.contactTime = gPoint.currentTime;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n\n gPoint = updateGPoint;\n } else {\n // Initialize for tracking and add to the tracking list (no pointerenter event occurred before this)\n // NOTE: pointerdown event on untracked pointer\n gPoint.captured = false; // Handled by updatePointerCaptured()\n gPoint.insideElementPressed = true;\n gPoint.insideElement = true;\n gPoint.originalTarget = eventInfo.originalEvent.target;\n startTrackingPointer( pointsList, gPoint );\n }\n\n pointsList.addContact();\n //$.console.log('contacts++ ', pointsList.contacts);\n\n if ( !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n eventInfo.shouldCapture = true;\n eventInfo.shouldReleaseCapture = false;\n eventInfo.preventDefault = true;\n\n if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {\n $.MouseTracker.gesturePointVelocityTracker.addPoint( tracker, gPoint );\n }\n\n if ( pointsList.contacts === 1 ) {\n // Press\n if ( tracker.pressHandler && !eventInfo.preventGesture ) {\n tracker.pressHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.contactPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n } else if ( pointsList.contacts === 2 ) {\n if ( tracker.pinchHandler && gPoint.type === 'touch' ) {\n // Initialize for pinch\n delegate.pinchGPoints = pointsList.asArray();\n delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n }\n }\n } else {\n eventInfo.shouldCapture = false;\n eventInfo.shouldReleaseCapture = false;\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture points associated with the event.\n * @param {Number} buttonChanged\n * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model,\n * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events.\n */\n function updatePointerUp( tracker, eventInfo, gPoint, buttonChanged ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoint.type ),\n releasePoint,\n releaseTime,\n updateGPoint,\n wasCaptured = false,\n quick;\n\n if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) {\n pointsList.buttons = eventInfo.originalEvent.buttons;\n } else {\n if ( buttonChanged === 0 ) {\n // Primary\n pointsList.buttons ^= ~1;\n } else if ( buttonChanged === 1 ) {\n // Aux\n pointsList.buttons ^= ~4;\n } else if ( buttonChanged === 2 ) {\n // Secondary\n pointsList.buttons ^= ~2;\n } else if ( buttonChanged === 3 ) {\n // X1 (Back)\n pointsList.buttons ^= ~8;\n } else if ( buttonChanged === 4 ) {\n // X2 (Forward)\n pointsList.buttons ^= ~16;\n } else if ( buttonChanged === 5 ) {\n // Pen Eraser\n pointsList.buttons ^= ~32;\n }\n }\n\n eventInfo.shouldCapture = false;\n\n // Only capture and track primary button, pen, and touch contacts\n if ( buttonChanged !== 0 ) {\n eventInfo.shouldReleaseCapture = false;\n\n // Aux Release\n if ( tracker.nonPrimaryReleaseHandler &&\n !eventInfo.preventGesture &&\n !eventInfo.defaultPrevented ) {\n eventInfo.preventDefault = true;\n\n tracker.nonPrimaryReleaseHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute(gPoint.currentPos, tracker.element),\n button: buttonChanged,\n buttons: pointsList.buttons,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n return;\n }\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n pointsList.removeContact();\n //$.console.log('contacts-- ', pointsList.contacts);\n\n // Update the pointer, stop tracking it if not still in this element\n if ( updateGPoint.captured ) {\n //updateGPoint.captured = false; // Handled by updatePointerCaptured()\n wasCaptured = true;\n }\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n if ( !updateGPoint.insideElement ) {\n stopTrackingPointer( tracker, pointsList, updateGPoint );\n }\n\n releasePoint = updateGPoint.currentPos;\n releaseTime = updateGPoint.currentTime;\n } else {\n // NOTE: updatePointerUp(): pointerup on untracked gPoint\n // ...we'll start to track pointer again\n gPoint.captured = false; // Handled by updatePointerCaptured()\n gPoint.insideElementPressed = false;\n gPoint.insideElement = true;\n startTrackingPointer( pointsList, gPoint );\n\n updateGPoint = gPoint;\n }\n\n if ( !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n if ( wasCaptured ) {\n // Pointer was activated in our element but could have been removed in any element since events are captured to our element\n\n eventInfo.shouldReleaseCapture = true;\n eventInfo.preventDefault = true;\n\n if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {\n $.MouseTracker.gesturePointVelocityTracker.removePoint( tracker, updateGPoint );\n }\n\n if ( pointsList.contacts === 0 ) {\n\n // Release (pressed in our element)\n if ( tracker.releaseHandler && releasePoint ) {\n tracker.releaseHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( releasePoint, tracker.element ),\n buttons: pointsList.buttons,\n insideElementPressed: updateGPoint.insideElementPressed,\n insideElementReleased: updateGPoint.insideElement,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n // Drag End\n if ( tracker.dragEndHandler && delegate.sentDragEvent ) {\n tracker.dragEndHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n speed: updateGPoint.speed,\n direction: updateGPoint.direction,\n shift: eventInfo.originalEvent.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n // We want to clear this flag regardless of whether we fired the dragEndHandler\n delegate.sentDragEvent = false;\n\n // Click / Double-Click\n if ( ( tracker.clickHandler || tracker.dblClickHandler ) && updateGPoint.insideElement ) {\n quick = releaseTime - updateGPoint.contactTime <= tracker.clickTimeThreshold &&\n updateGPoint.contactPos.distanceTo( releasePoint ) <= tracker.clickDistThreshold;\n\n // Click\n if ( tracker.clickHandler ) {\n tracker.clickHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n quick: quick,\n shift: eventInfo.originalEvent.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n originalTarget: updateGPoint.originalTarget,\n userData: tracker.userData\n }\n );\n }\n\n // Double-Click\n if ( tracker.dblClickHandler && quick ) {\n pointsList.clicks++;\n if ( pointsList.clicks === 1 ) {\n delegate.lastClickPos = releasePoint;\n /*jshint loopfunc:true*/\n delegate.dblClickTimeOut = setTimeout( function() {\n pointsList.clicks = 0;\n }, tracker.dblClickTimeThreshold );\n /*jshint loopfunc:false*/\n } else if ( pointsList.clicks === 2 ) {\n clearTimeout( delegate.dblClickTimeOut );\n pointsList.clicks = 0;\n if ( delegate.lastClickPos.distanceTo( releasePoint ) <= tracker.dblClickDistThreshold ) {\n tracker.dblClickHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n shift: eventInfo.originalEvent.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n delegate.lastClickPos = null;\n }\n }\n }\n } else if ( pointsList.contacts === 2 ) {\n if ( tracker.pinchHandler && updateGPoint.type === 'touch' ) {\n // Reset for pinch\n delegate.pinchGPoints = pointsList.asArray();\n delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n }\n }\n } else {\n // Pointer was activated in another element but removed in our element\n\n eventInfo.shouldReleaseCapture = false;\n\n // Release (pressed in another element)\n if ( tracker.releaseHandler && releasePoint ) {\n tracker.releaseHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( releasePoint, tracker.element ),\n buttons: pointsList.buttons,\n insideElementPressed: updateGPoint.insideElementPressed,\n insideElementReleased: updateGPoint.insideElement,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n eventInfo.preventDefault = true;\n }\n }\n }\n }\n\n\n /**\n * Call when pointer(s) change coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height)\n *\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture points associated with the event.\n */\n function updatePointerMove( tracker, eventInfo, gPoint ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoint.type ),\n updateGPoint,\n gPointArray,\n delta;\n\n if ( typeof eventInfo.originalEvent.buttons !== 'undefined' ) {\n pointsList.buttons = eventInfo.originalEvent.buttons;\n }\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = gPoint.currentPos;\n updateGPoint.currentTime = gPoint.currentTime;\n } else {\n // Should never get here, but due to user agent bugs (e.g. legacy touch) it sometimes happens\n return;\n }\n\n eventInfo.shouldCapture = false;\n eventInfo.shouldReleaseCapture = false;\n\n // Stop (mouse only)\n if ( tracker.stopHandler && gPoint.type === 'mouse' ) {\n clearTimeout( tracker.stopTimeOut );\n tracker.stopTimeOut = setTimeout( function() {\n handlePointerStop( tracker, eventInfo.originalEvent, gPoint.type );\n }, tracker.stopDelay );\n }\n\n if ( pointsList.contacts === 0 ) {\n // Move (no contacts: hovering mouse or other hover-capable device)\n if ( tracker.moveHandler ) {\n tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: gPoint.type,\n position: getPointRelativeToAbsolute( gPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: gPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n } else if ( pointsList.contacts === 1 ) {\n // Move (1 contact)\n if ( tracker.moveHandler ) {\n updateGPoint = pointsList.asArray()[ 0 ];\n tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n // Drag\n if ( tracker.dragHandler && !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n updateGPoint = pointsList.asArray()[ 0 ];\n delta = updateGPoint.currentPos.minus( updateGPoint.lastPos );\n tracker.dragHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n delta: delta,\n speed: updateGPoint.speed,\n direction: updateGPoint.direction,\n shift: eventInfo.originalEvent.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n eventInfo.preventDefault = true;\n delegate.sentDragEvent = true;\n }\n } else if ( pointsList.contacts === 2 ) {\n // Move (2 contacts, use center)\n if ( tracker.moveHandler ) {\n gPointArray = pointsList.asArray();\n tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: gPointArray[ 0 ].type,\n position: getPointRelativeToAbsolute( getCenterPoint( gPointArray[ 0 ].currentPos, gPointArray[ 1 ].currentPos ), tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: gPointArray[ 0 ].type === 'touch',\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n }\n\n // Pinch\n if ( tracker.pinchHandler && gPoint.type === 'touch' &&\n !eventInfo.preventGesture && !eventInfo.defaultPrevented ) {\n delta = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n if ( delta !== delegate.currentPinchDist ) {\n delegate.lastPinchDist = delegate.currentPinchDist;\n delegate.currentPinchDist = delta;\n delegate.lastPinchCenter = delegate.currentPinchCenter;\n delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n tracker.pinchHandler(\n {\n eventSource: tracker,\n pointerType: 'touch',\n gesturePoints: delegate.pinchGPoints,\n lastCenter: getPointRelativeToAbsolute( delegate.lastPinchCenter, tracker.element ),\n center: getPointRelativeToAbsolute( delegate.currentPinchCenter, tracker.element ),\n lastDistance: delegate.lastPinchDist,\n distance: delegate.currentPinchDist,\n shift: eventInfo.originalEvent.shiftKey,\n originalEvent: eventInfo.originalEvent,\n userData: tracker.userData\n }\n );\n eventInfo.preventDefault = true;\n }\n }\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {OpenSeadragon.MouseTracker.EventProcessInfo} eventInfo\n * Processing info for originating DOM event.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture points associated with the event.\n */\n function updatePointerCancel( tracker, eventInfo, gPoint ) {\n var pointsList = tracker.getActivePointersListByType( gPoint.type ),\n updateGPoint;\n\n updateGPoint = pointsList.getById( gPoint.id );\n\n if ( updateGPoint ) {\n stopTrackingPointer( tracker, pointsList, updateGPoint );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function handlePointerStop( tracker, originalMoveEvent, pointerType ) {\n if ( tracker.stopHandler ) {\n tracker.stopHandler( {\n eventSource: tracker,\n pointerType: pointerType,\n position: getMouseRelative( originalMoveEvent, tracker.element ),\n buttons: tracker.getActivePointersListByType( pointerType ).buttons,\n isTouchEvent: pointerType === 'touch',\n originalEvent: originalMoveEvent,\n userData: tracker.userData\n } );\n }\n }\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Control\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * An enumeration of supported locations where controls can be anchored.\n * The anchoring is always relative to the container.\n * @member ControlAnchor\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {Number} NONE\n * @property {Number} TOP_LEFT\n * @property {Number} TOP_RIGHT\n * @property {Number} BOTTOM_LEFT\n * @property {Number} BOTTOM_RIGHT\n * @property {Number} ABSOLUTE\n */\n$.ControlAnchor = {\n NONE: 0,\n TOP_LEFT: 1,\n TOP_RIGHT: 2,\n BOTTOM_RIGHT: 3,\n BOTTOM_LEFT: 4,\n ABSOLUTE: 5\n};\n\n/**\n * @class Control\n * @classdesc A Control represents any interface element which is meant to allow the user\n * to interact with the zoomable interface. Any control can be anchored to any\n * element.\n *\n * @memberof OpenSeadragon\n * @param {Element} element - the control element to be anchored in the container.\n * @param {Object } options - All required and optional settings for configuring a control element.\n * @param {OpenSeadragon.ControlAnchor} [options.anchor=OpenSeadragon.ControlAnchor.NONE] - the position of the control\n * relative to the container.\n * @param {Boolean} [options.attachToViewer=true] - Whether the control should be added directly to the viewer, or\n * directly to the container\n * @param {Boolean} [options.autoFade=true] - Whether the control should have the autofade behavior\n * @param {Element} container - the element to control will be anchored too.\n */\n$.Control = function ( element, options, container ) {\n\n var parent = element.parentNode;\n if (typeof options === 'number')\n {\n $.console.error(\"Passing an anchor directly into the OpenSeadragon.Control constructor is deprecated; \" +\n \"please use an options object instead. \" +\n \"Support for this deprecated variant is scheduled for removal in December 2013\");\n options = {anchor: options};\n }\n options.attachToViewer = (typeof options.attachToViewer === 'undefined') ? true : options.attachToViewer;\n /**\n * True if the control should have autofade behavior.\n * @member {Boolean} autoFade\n * @memberof OpenSeadragon.Control#\n */\n this.autoFade = (typeof options.autoFade === 'undefined') ? true : options.autoFade;\n /**\n * The element providing the user interface with some type of control (e.g. a zoom-in button).\n * @member {Element} element\n * @memberof OpenSeadragon.Control#\n */\n this.element = element;\n /**\n * The position of the Control relative to its container.\n * @member {OpenSeadragon.ControlAnchor} anchor\n * @memberof OpenSeadragon.Control#\n */\n this.anchor = options.anchor;\n /**\n * The Control's containing element.\n * @member {Element} container\n * @memberof OpenSeadragon.Control#\n */\n this.container = container;\n /**\n * A neutral element surrounding the control element.\n * @member {Element} wrapper\n * @memberof OpenSeadragon.Control#\n */\n if ( this.anchor === $.ControlAnchor.ABSOLUTE ) {\n this.wrapper = $.makeNeutralElement( \"div\" );\n this.wrapper.style.position = \"absolute\";\n this.wrapper.style.top = typeof (options.top) === \"number\" ? (options.top + 'px') : options.top;\n this.wrapper.style.left = typeof (options.left) === \"number\" ? (options.left + 'px') : options.left;\n this.wrapper.style.height = typeof (options.height) === \"number\" ? (options.height + 'px') : options.height;\n this.wrapper.style.width = typeof (options.width) === \"number\" ? (options.width + 'px') : options.width;\n this.wrapper.style.margin = \"0px\";\n this.wrapper.style.padding = \"0px\";\n\n this.element.style.position = \"relative\";\n this.element.style.top = \"0px\";\n this.element.style.left = \"0px\";\n this.element.style.height = \"100%\";\n this.element.style.width = \"100%\";\n } else {\n this.wrapper = $.makeNeutralElement( \"div\" );\n this.wrapper.style.display = \"inline-block\";\n if ( this.anchor === $.ControlAnchor.NONE ) {\n // IE6 fix\n this.wrapper.style.width = this.wrapper.style.height = \"100%\";\n }\n }\n this.wrapper.appendChild( this.element );\n\n if (options.attachToViewer ) {\n if ( this.anchor === $.ControlAnchor.TOP_RIGHT ||\n this.anchor === $.ControlAnchor.BOTTOM_RIGHT ) {\n this.container.insertBefore(\n this.wrapper,\n this.container.firstChild\n );\n } else {\n this.container.appendChild( this.wrapper );\n }\n } else {\n parent.appendChild( this.wrapper );\n }\n\n};\n\n/** @lends OpenSeadragon.Control.prototype */\n$.Control.prototype = {\n\n /**\n * Removes the control from the container.\n * @function\n */\n destroy: function() {\n this.wrapper.removeChild( this.element );\n if (this.anchor !== $.ControlAnchor.NONE) {\n this.container.removeChild(this.wrapper);\n }\n },\n\n /**\n * Determines if the control is currently visible.\n * @function\n * @returns {Boolean} true if currently visible, false otherwise.\n */\n isVisible: function() {\n return this.wrapper.style.display !== \"none\";\n },\n\n /**\n * Toggles the visibility of the control.\n * @function\n * @param {Boolean} visible - true to make visible, false to hide.\n */\n setVisible: function( visible ) {\n this.wrapper.style.display = visible ?\n ( this.anchor === $.ControlAnchor.ABSOLUTE ? 'block' : 'inline-block' ) :\n \"none\";\n },\n\n /**\n * Sets the opacity level for the control.\n * @function\n * @param {Number} opactiy - a value between 1 and 0 inclusively.\n */\n setOpacity: function( opacity ) {\n if ( this.element[ $.SIGNAL ] && $.Browser.vendor === $.BROWSERS.IE ) {\n $.setElementOpacity( this.element, opacity, true );\n } else {\n $.setElementOpacity( this.wrapper, opacity, true );\n }\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ControlDock\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n /**\n * @class ControlDock\n * @classdesc Provides a container element (a <form> element) with support for the layout of control elements.\n *\n * @memberof OpenSeadragon\n */\n $.ControlDock = function( options ){\n var layouts = [ 'topleft', 'topright', 'bottomright', 'bottomleft'],\n layout,\n i;\n\n $.extend( true, this, {\n id: 'controldock-' + $.now() + '-' + Math.floor(Math.random() * 1000000),\n container: $.makeNeutralElement( 'div' ),\n controls: []\n }, options );\n\n // Disable the form's submit; otherwise button clicks and return keys\n // can trigger it.\n this.container.onsubmit = function() {\n return false;\n };\n\n if( this.element ){\n this.element = $.getElement( this.element );\n this.element.appendChild( this.container );\n this.element.style.position = 'relative';\n this.container.style.width = '100%';\n this.container.style.height = '100%';\n }\n\n for( i = 0; i < layouts.length; i++ ){\n layout = layouts[ i ];\n this.controls[ layout ] = $.makeNeutralElement( \"div\" );\n this.controls[ layout ].style.position = 'absolute';\n if ( layout.match( 'left' ) ){\n this.controls[ layout ].style.left = '0px';\n }\n if ( layout.match( 'right' ) ){\n this.controls[ layout ].style.right = '0px';\n }\n if ( layout.match( 'top' ) ){\n this.controls[ layout ].style.top = '0px';\n }\n if ( layout.match( 'bottom' ) ){\n this.controls[ layout ].style.bottom = '0px';\n }\n }\n\n this.container.appendChild( this.controls.topleft );\n this.container.appendChild( this.controls.topright );\n this.container.appendChild( this.controls.bottomright );\n this.container.appendChild( this.controls.bottomleft );\n };\n\n /** @lends OpenSeadragon.ControlDock.prototype */\n $.ControlDock.prototype = {\n\n /**\n * @function\n */\n addControl: function ( element, controlOptions ) {\n element = $.getElement( element );\n var div = null;\n\n if ( getControlIndex( this, element ) >= 0 ) {\n return; // they're trying to add a duplicate control\n }\n\n switch ( controlOptions.anchor ) {\n case $.ControlAnchor.TOP_RIGHT:\n div = this.controls.topright;\n element.style.position = \"relative\";\n element.style.paddingRight = \"0px\";\n element.style.paddingTop = \"0px\";\n break;\n case $.ControlAnchor.BOTTOM_RIGHT:\n div = this.controls.bottomright;\n element.style.position = \"relative\";\n element.style.paddingRight = \"0px\";\n element.style.paddingBottom = \"0px\";\n break;\n case $.ControlAnchor.BOTTOM_LEFT:\n div = this.controls.bottomleft;\n element.style.position = \"relative\";\n element.style.paddingLeft = \"0px\";\n element.style.paddingBottom = \"0px\";\n break;\n case $.ControlAnchor.TOP_LEFT:\n div = this.controls.topleft;\n element.style.position = \"relative\";\n element.style.paddingLeft = \"0px\";\n element.style.paddingTop = \"0px\";\n break;\n case $.ControlAnchor.ABSOLUTE:\n div = this.container;\n element.style.margin = \"0px\";\n element.style.padding = \"0px\";\n break;\n default:\n case $.ControlAnchor.NONE:\n div = this.container;\n element.style.margin = \"0px\";\n element.style.padding = \"0px\";\n break;\n }\n\n this.controls.push(\n new $.Control( element, controlOptions, div )\n );\n element.style.display = \"inline-block\";\n },\n\n\n /**\n * @function\n * @returns {OpenSeadragon.ControlDock} Chainable.\n */\n removeControl: function ( element ) {\n element = $.getElement( element );\n var i = getControlIndex( this, element );\n\n if ( i >= 0 ) {\n this.controls[ i ].destroy();\n this.controls.splice( i, 1 );\n }\n\n return this;\n },\n\n /**\n * @function\n * @returns {OpenSeadragon.ControlDock} Chainable.\n */\n clearControls: function () {\n while ( this.controls.length > 0 ) {\n this.controls.pop().destroy();\n }\n\n return this;\n },\n\n\n /**\n * @function\n * @returns {Boolean}\n */\n areControlsEnabled: function () {\n var i;\n\n for ( i = this.controls.length - 1; i >= 0; i-- ) {\n if ( this.controls[ i ].isVisible() ) {\n return true;\n }\n }\n\n return false;\n },\n\n\n /**\n * @function\n * @returns {OpenSeadragon.ControlDock} Chainable.\n */\n setControlsEnabled: function( enabled ) {\n var i;\n\n for ( i = this.controls.length - 1; i >= 0; i-- ) {\n this.controls[ i ].setVisible( enabled );\n }\n\n return this;\n }\n\n };\n\n\n ///////////////////////////////////////////////////////////////////////////////\n // Utility methods\n ///////////////////////////////////////////////////////////////////////////////\n function getControlIndex( dock, element ) {\n var controls = dock.controls,\n i;\n\n for ( i = controls.length - 1; i >= 0; i-- ) {\n if ( controls[ i ].element === element ) {\n return i;\n }\n }\n\n return -1;\n }\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Placement\n *\n * Copyright (C) 2010-2016 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n /**\n * An enumeration of positions to anchor an element.\n * @member Placement\n * @memberOf OpenSeadragon\n * @static\n * @readonly\n * @property {OpenSeadragon.Placement} CENTER\n * @property {OpenSeadragon.Placement} TOP_LEFT\n * @property {OpenSeadragon.Placement} TOP\n * @property {OpenSeadragon.Placement} TOP_RIGHT\n * @property {OpenSeadragon.Placement} RIGHT\n * @property {OpenSeadragon.Placement} BOTTOM_RIGHT\n * @property {OpenSeadragon.Placement} BOTTOM\n * @property {OpenSeadragon.Placement} BOTTOM_LEFT\n * @property {OpenSeadragon.Placement} LEFT\n */\n $.Placement = $.freezeObject({\n CENTER: 0,\n TOP_LEFT: 1,\n TOP: 2,\n TOP_RIGHT: 3,\n RIGHT: 4,\n BOTTOM_RIGHT: 5,\n BOTTOM: 6,\n BOTTOM_LEFT: 7,\n LEFT: 8,\n properties: {\n 0: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n },\n 1: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 2: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 3: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 4: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n },\n 5: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 6: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 7: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 8: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n }\n }\n });\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Viewer\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// dictionary from hash to private properties\nvar THIS = {};\nvar nextHash = 1;\n\n/**\n *\n * The main point of entry into creating a zoomable image on the page.
    \n *
    \n * We have provided an idiomatic javascript constructor which takes\n * a single object, but still support the legacy positional arguments.
    \n *
    \n * The options below are given in order that they appeared in the constructor\n * as arguments and we translate a positional call into an idiomatic call.
    \n *
    \n * To create a viewer, you can use either of this methods:
    \n *
      \n *
    • var viewer = new OpenSeadragon.Viewer(options);
    • \n *
    • var viewer = OpenSeadragon(options);
    • \n *
    \n * @class Viewer\n * @classdesc The main OpenSeadragon viewer class.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @extends OpenSeadragon.ControlDock\n * @param {OpenSeadragon.Options} options - Viewer options.\n *\n **/\n$.Viewer = function( options ) {\n\n var args = arguments,\n _this = this,\n i;\n\n\n //backward compatibility for positional args while preferring more\n //idiomatic javascript options object as the only argument\n if( !$.isPlainObject( options ) ){\n options = {\n id: args[ 0 ],\n xmlPath: args.length > 1 ? args[ 1 ] : undefined,\n prefixUrl: args.length > 2 ? args[ 2 ] : undefined,\n controls: args.length > 3 ? args[ 3 ] : undefined,\n overlays: args.length > 4 ? args[ 4 ] : undefined\n };\n }\n\n //options.config and the general config argument are deprecated\n //in favor of the more direct specification of optional settings\n //being pass directly on the options object\n if ( options.config ){\n $.extend( true, options, options.config );\n delete options.config;\n }\n\n //Public properties\n //Allow the options object to override global defaults\n $.extend( true, this, {\n\n //internal state and dom identifiers\n id: options.id,\n hash: options.hash || nextHash++,\n /**\n * Index for page to be shown first next time open() is called (only used in sequenceMode).\n * @member {Number} initialPage\n * @memberof OpenSeadragon.Viewer#\n */\n initialPage: 0,\n\n //dom nodes\n /**\n * The parent element of this Viewer instance, passed in when the Viewer was created.\n * @member {Element} element\n * @memberof OpenSeadragon.Viewer#\n */\n element: null,\n /**\n * A <div> element (provided by {@link OpenSeadragon.ControlDock}), the base element of this Viewer instance.

    \n * Child element of {@link OpenSeadragon.Viewer#element}.\n * @member {Element} container\n * @memberof OpenSeadragon.Viewer#\n */\n container: null,\n /**\n * A <div> element, the element where user-input events are handled for panning and zooming.

    \n * Child element of {@link OpenSeadragon.Viewer#container},\n * positioned on top of {@link OpenSeadragon.Viewer#keyboardCommandArea}.

    \n * The parent of {@link OpenSeadragon.Drawer#canvas} instances.\n * @member {Element} canvas\n * @memberof OpenSeadragon.Viewer#\n */\n canvas: null,\n\n // Overlays list. An overlay allows to add html on top of the viewer.\n overlays: [],\n // Container inside the canvas where overlays are drawn.\n overlaysContainer: null,\n\n //private state properties\n previousBody: [],\n\n //This was originally initialized in the constructor and so could never\n //have anything in it. now it can because we allow it to be specified\n //in the options and is only empty by default if not specified. Also\n //this array was returned from get_controls which I find confusing\n //since this object has a controls property which is treated in other\n //functions like clearControls. I'm removing the accessors.\n customControls: [],\n\n //These are originally not part options but declared as members\n //in initialize. It's still considered idiomatic to put them here\n //source is here for backwards compatibility. It is not an official\n //part of the API and should not be relied upon.\n source: null,\n /**\n * Handles rendering of tiles in the viewer. Created for each TileSource opened.\n * @member {OpenSeadragon.Drawer} drawer\n * @memberof OpenSeadragon.Viewer#\n */\n drawer: null,\n /**\n * Keeps track of all of the tiled images in the scene.\n * @member {OpenSeadragon.World} world\n * @memberof OpenSeadragon.Viewer#\n */\n world: null,\n /**\n * Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened.\n * @member {OpenSeadragon.Viewport} viewport\n * @memberof OpenSeadragon.Viewer#\n */\n viewport: null,\n /**\n * @member {OpenSeadragon.Navigator} navigator\n * @memberof OpenSeadragon.Viewer#\n */\n navigator: null,\n\n //A collection viewport is a separate viewport used to provide\n //simultaneous rendering of sets of tiles\n collectionViewport: null,\n collectionDrawer: null,\n\n //UI image resources\n //TODO: rename navImages to uiImages\n navImages: null,\n\n //interface button controls\n buttonGroup: null,\n\n //TODO: this is defunct so safely remove it\n profiler: null\n\n }, $.DEFAULT_SETTINGS, options );\n\n if ( typeof ( this.hash) === \"undefined\" ) {\n throw new Error(\"A hash must be defined, either by specifying options.id or options.hash.\");\n }\n if ( typeof ( THIS[ this.hash ] ) !== \"undefined\" ) {\n // We don't want to throw an error here, as the user might have discarded\n // the previous viewer with the same hash and now want to recreate it.\n $.console.warn(\"Hash \" + this.hash + \" has already been used.\");\n }\n\n //Private state properties\n THIS[ this.hash ] = {\n fsBoundsDelta: new $.Point( 1, 1 ),\n prevContainerSize: null,\n animating: false,\n forceRedraw: false,\n needsResize: false,\n forceResize: false,\n mouseInside: false,\n group: null,\n // whether we should be continuously zooming\n zooming: false,\n // how much we should be continuously zooming by\n zoomFactor: null,\n lastZoomTime: null,\n fullPage: false,\n onfullscreenchange: null,\n lastClickTime: null,\n draggingToZoom: false,\n };\n\n this._sequenceIndex = 0;\n this._firstOpen = true;\n this._updateRequestId = null;\n this._loadQueue = [];\n this.currentOverlays = [];\n this._updatePixelDensityRatioBind = null;\n\n this._lastScrollTime = $.now(); // variable used to help normalize the scroll event speed of different devices\n\n //Inherit some behaviors and properties\n $.EventSource.call( this );\n\n this.addHandler( 'open-failed', function ( event ) {\n var msg = $.getString( \"Errors.OpenFailed\", event.eventSource, event.message);\n _this._showMessage( msg );\n });\n\n $.ControlDock.call( this, options );\n\n //Deal with tile sources\n if (this.xmlPath) {\n //Deprecated option. Now it is preferred to use the tileSources option\n this.tileSources = [ this.xmlPath ];\n }\n\n this.element = this.element || document.getElementById( this.id );\n this.canvas = $.makeNeutralElement( \"div\" );\n\n this.canvas.className = \"openseadragon-canvas\";\n (function( style ){\n style.width = \"100%\";\n style.height = \"100%\";\n style.overflow = \"hidden\";\n style.position = \"absolute\";\n style.top = \"0px\";\n style.left = \"0px\";\n }(this.canvas.style));\n $.setElementTouchActionNone( this.canvas );\n if (options.tabIndex !== \"\") {\n this.canvas.tabIndex = (options.tabIndex === undefined ? 0 : options.tabIndex);\n }\n\n //the container is created through applying the ControlDock constructor above\n this.container.className = \"openseadragon-container\";\n (function( style ){\n style.width = \"100%\";\n style.height = \"100%\";\n style.position = \"relative\";\n style.overflow = \"hidden\";\n style.left = \"0px\";\n style.top = \"0px\";\n style.textAlign = \"left\"; // needed to protect against\n }( this.container.style ));\n $.setElementTouchActionNone( this.container );\n\n this.container.insertBefore( this.canvas, this.container.firstChild );\n this.element.appendChild( this.container );\n\n //Used for toggling between fullscreen and default container size\n //TODO: these can be closure private and shared across Viewer\n // instances.\n this.bodyWidth = document.body.style.width;\n this.bodyHeight = document.body.style.height;\n this.bodyOverflow = document.body.style.overflow;\n this.docOverflow = document.documentElement.style.overflow;\n\n this.innerTracker = new $.MouseTracker({\n userData: 'Viewer.innerTracker',\n element: this.canvas,\n startDisabled: !this.mouseNavEnabled,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n dblClickTimeThreshold: this.dblClickTimeThreshold,\n dblClickDistThreshold: this.dblClickDistThreshold,\n contextMenuHandler: $.delegate( this, onCanvasContextMenu ),\n keyDownHandler: $.delegate( this, onCanvasKeyDown ),\n keyHandler: $.delegate( this, onCanvasKeyPress ),\n clickHandler: $.delegate( this, onCanvasClick ),\n dblClickHandler: $.delegate( this, onCanvasDblClick ),\n dragHandler: $.delegate( this, onCanvasDrag ),\n dragEndHandler: $.delegate( this, onCanvasDragEnd ),\n enterHandler: $.delegate( this, onCanvasEnter ),\n leaveHandler: $.delegate( this, onCanvasLeave ),\n pressHandler: $.delegate( this, onCanvasPress ),\n releaseHandler: $.delegate( this, onCanvasRelease ),\n nonPrimaryPressHandler: $.delegate( this, onCanvasNonPrimaryPress ),\n nonPrimaryReleaseHandler: $.delegate( this, onCanvasNonPrimaryRelease ),\n scrollHandler: $.delegate( this, onCanvasScroll ),\n pinchHandler: $.delegate( this, onCanvasPinch ),\n focusHandler: $.delegate( this, onCanvasFocus ),\n blurHandler: $.delegate( this, onCanvasBlur ),\n });\n\n this.outerTracker = new $.MouseTracker({\n userData: 'Viewer.outerTracker',\n element: this.container,\n startDisabled: !this.mouseNavEnabled,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n dblClickTimeThreshold: this.dblClickTimeThreshold,\n dblClickDistThreshold: this.dblClickDistThreshold,\n enterHandler: $.delegate( this, onContainerEnter ),\n leaveHandler: $.delegate( this, onContainerLeave )\n });\n\n if( this.toolbar ){\n this.toolbar = new $.ControlDock({ element: this.toolbar });\n }\n\n this.bindStandardControls();\n\n THIS[ this.hash ].prevContainerSize = _getSafeElemSize( this.container );\n\n if(window.ResizeObserver){\n this._autoResizePolling = false;\n this._resizeObserver = new ResizeObserver(function(){\n THIS[_this.hash].needsResize = true;\n });\n\n this._resizeObserver.observe(this.container, {});\n } else {\n this._autoResizePolling = true;\n }\n\n // Create the world\n this.world = new $.World({\n viewer: this\n });\n\n this.world.addHandler('add-item', function(event) {\n // For backwards compatibility, we maintain the source property\n _this.source = _this.world.getItemAt(0).source;\n\n THIS[ _this.hash ].forceRedraw = true;\n\n if (!_this._updateRequestId) {\n _this._updateRequestId = scheduleUpdate( _this, updateMulti );\n }\n });\n\n this.world.addHandler('remove-item', function(event) {\n // For backwards compatibility, we maintain the source property\n if (_this.world.getItemCount()) {\n _this.source = _this.world.getItemAt(0).source;\n } else {\n _this.source = null;\n }\n\n THIS[ _this.hash ].forceRedraw = true;\n });\n\n this.world.addHandler('metrics-change', function(event) {\n if (_this.viewport) {\n _this.viewport._setContentBounds(_this.world.getHomeBounds(), _this.world.getContentFactor());\n }\n });\n\n this.world.addHandler('item-index-change', function(event) {\n // For backwards compatibility, we maintain the source property\n _this.source = _this.world.getItemAt(0).source;\n });\n\n // Create the viewport\n this.viewport = new $.Viewport({\n containerSize: THIS[ this.hash ].prevContainerSize,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime,\n minZoomImageRatio: this.minZoomImageRatio,\n maxZoomPixelRatio: this.maxZoomPixelRatio,\n visibilityRatio: this.visibilityRatio,\n wrapHorizontal: this.wrapHorizontal,\n wrapVertical: this.wrapVertical,\n defaultZoomLevel: this.defaultZoomLevel,\n minZoomLevel: this.minZoomLevel,\n maxZoomLevel: this.maxZoomLevel,\n viewer: this,\n degrees: this.degrees,\n flipped: this.flipped,\n navigatorRotate: this.navigatorRotate,\n homeFillsViewer: this.homeFillsViewer,\n margins: this.viewportMargins,\n silenceMultiImageWarnings: this.silenceMultiImageWarnings\n });\n\n this.viewport._setContentBounds(this.world.getHomeBounds(), this.world.getContentFactor());\n\n // Create the image loader\n this.imageLoader = new $.ImageLoader({\n jobLimit: this.imageLoaderLimit,\n timeout: options.timeout,\n tileRetryMax: this.tileRetryMax,\n tileRetryDelay: this.tileRetryDelay\n });\n\n // Create the tile cache\n this.tileCache = new $.TileCache({\n maxImageCacheCount: this.maxImageCacheCount\n });\n\n // Create the drawer\n this.drawer = new $.Drawer({\n viewer: this,\n viewport: this.viewport,\n element: this.canvas,\n debugGridColor: this.debugGridColor\n });\n\n // Overlay container\n this.overlaysContainer = $.makeNeutralElement( \"div\" );\n this.canvas.appendChild( this.overlaysContainer );\n\n // Now that we have a drawer, see if it supports rotate. If not we need to remove the rotate buttons\n if (!this.drawer.canRotate()) {\n // Disable/remove the rotate left/right buttons since they aren't supported\n if (this.rotateLeft) {\n i = this.buttonGroup.buttons.indexOf(this.rotateLeft);\n this.buttonGroup.buttons.splice(i, 1);\n this.buttonGroup.element.removeChild(this.rotateLeft.element);\n }\n if (this.rotateRight) {\n i = this.buttonGroup.buttons.indexOf(this.rotateRight);\n this.buttonGroup.buttons.splice(i, 1);\n this.buttonGroup.element.removeChild(this.rotateRight.element);\n }\n }\n\n this._addUpdatePixelDensityRatioEvent();\n\n //Instantiate a navigator if configured\n if ( this.showNavigator){\n this.navigator = new $.Navigator({\n element: this.navigatorElement,\n id: this.navigatorId,\n position: this.navigatorPosition,\n sizeRatio: this.navigatorSizeRatio,\n maintainSizeRatio: this.navigatorMaintainSizeRatio,\n top: this.navigatorTop,\n left: this.navigatorLeft,\n width: this.navigatorWidth,\n height: this.navigatorHeight,\n autoResize: this.navigatorAutoResize,\n autoFade: this.navigatorAutoFade,\n prefixUrl: this.prefixUrl,\n viewer: this,\n navigatorRotate: this.navigatorRotate,\n background: this.navigatorBackground,\n opacity: this.navigatorOpacity,\n borderColor: this.navigatorBorderColor,\n displayRegionColor: this.navigatorDisplayRegionColor,\n crossOriginPolicy: this.crossOriginPolicy,\n animationTime: this.animationTime,\n });\n }\n\n // Sequence mode\n if (this.sequenceMode) {\n this.bindSequenceControls();\n }\n\n // Open initial tilesources\n if (this.tileSources) {\n this.open( this.tileSources );\n }\n\n // Add custom controls\n for ( i = 0; i < this.customControls.length; i++ ) {\n this.addControl(\n this.customControls[ i ].id,\n {anchor: this.customControls[ i ].anchor}\n );\n }\n\n // Initial fade out\n $.requestAnimationFrame( function(){\n beginControlsAutoHide( _this );\n } );\n\n // Initial canvas options\n if ( this.imageSmoothingEnabled !== undefined && !this.imageSmoothingEnabled){\n this.drawer.setImageSmoothingEnabled(this.imageSmoothingEnabled);\n }\n\n // Register the viewer\n $._viewers.set(this.element, this);\n};\n\n$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{\n\n\n /**\n * @function\n * @returns {Boolean}\n */\n isOpen: function () {\n return !!this.world.getItemCount();\n },\n\n // deprecated\n openDzi: function ( dzi ) {\n $.console.error( \"[Viewer.openDzi] this function is deprecated; use Viewer.open() instead.\" );\n return this.open( dzi );\n },\n\n // deprecated\n openTileSource: function ( tileSource ) {\n $.console.error( \"[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead.\" );\n return this.open( tileSource );\n },\n\n //deprecated\n get buttons () {\n $.console.warn('Viewer.buttons is deprecated; Please use Viewer.buttonGroup');\n return this.buttonGroup;\n },\n\n /**\n * Open tiled images into the viewer, closing any others.\n * To get the TiledImage instance created by open, add an event listener for\n * {@link OpenSeadragon.Viewer.html#.event:open}, which when fired can be used to get access\n * to the instance, i.e., viewer.world.getItemAt(0).\n * @function\n * @param {Array|String|Object|Function} tileSources - This can be a TiledImage\n * specifier, a TileSource specifier, or an array of either. A TiledImage specifier\n * is the same as the options parameter for {@link OpenSeadragon.Viewer#addTiledImage},\n * except for the index property; images are added in sequence.\n * A TileSource specifier is anything you could pass as the tileSource property\n * of the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}.\n * @param {Number} initialPage - If sequenceMode is true, display this page initially\n * for the given tileSources. If specified, will overwrite the Viewer's existing initialPage property.\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:open\n * @fires OpenSeadragon.Viewer.event:open-failed\n */\n open: function (tileSources, initialPage) {\n var _this = this;\n\n this.close();\n\n if (!tileSources) {\n return this;\n }\n\n if (this.sequenceMode && $.isArray(tileSources)) {\n if (this.referenceStrip) {\n this.referenceStrip.destroy();\n this.referenceStrip = null;\n }\n\n if (typeof initialPage !== 'undefined' && !isNaN(initialPage)) {\n this.initialPage = initialPage;\n }\n\n this.tileSources = tileSources;\n this._sequenceIndex = Math.max(0, Math.min(this.tileSources.length - 1, this.initialPage));\n if (this.tileSources.length) {\n this.open(this.tileSources[this._sequenceIndex]);\n\n if ( this.showReferenceStrip ){\n this.addReferenceStrip();\n }\n }\n\n this._updateSequenceButtons( this._sequenceIndex );\n return this;\n }\n\n if (!$.isArray(tileSources)) {\n tileSources = [tileSources];\n }\n\n if (!tileSources.length) {\n return this;\n }\n\n this._opening = true;\n\n var expected = tileSources.length;\n var successes = 0;\n var failures = 0;\n var failEvent;\n\n var checkCompletion = function() {\n if (successes + failures === expected) {\n if (successes) {\n if (_this._firstOpen || !_this.preserveViewport) {\n _this.viewport.goHome( true );\n _this.viewport.update();\n }\n\n _this._firstOpen = false;\n\n var source = tileSources[0];\n if (source.tileSource) {\n source = source.tileSource;\n }\n\n // Global overlays\n if( _this.overlays && !_this.preserveOverlays ){\n for ( var i = 0; i < _this.overlays.length; i++ ) {\n _this.currentOverlays[ i ] = getOverlayObject( _this, _this.overlays[ i ] );\n }\n }\n\n _this._drawOverlays();\n _this._opening = false;\n\n /**\n * Raised when the viewer has opened and loaded one or more TileSources.\n *\n * @event open\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TileSource} source - The tile source that was opened.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n // TODO: what if there are multiple sources?\n _this.raiseEvent( 'open', { source: source } );\n } else {\n _this._opening = false;\n\n /**\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {String} message - Information about what failed.\n * @property {String} source - The tile source that failed.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', failEvent );\n }\n }\n };\n\n var doOne = function(options) {\n if (!$.isPlainObject(options) || !options.tileSource) {\n options = {\n tileSource: options\n };\n }\n\n if (options.index !== undefined) {\n $.console.error('[Viewer.open] setting indexes here is not supported; use addTiledImage instead');\n delete options.index;\n }\n\n if (options.collectionImmediately === undefined) {\n options.collectionImmediately = true;\n }\n\n var originalSuccess = options.success;\n options.success = function(event) {\n successes++;\n\n // TODO: now that options has other things besides tileSource, the overlays\n // should probably be at the options level, not the tileSource level.\n if (options.tileSource.overlays) {\n for (var i = 0; i < options.tileSource.overlays.length; i++) {\n _this.addOverlay(options.tileSource.overlays[i]);\n }\n }\n\n if (originalSuccess) {\n originalSuccess(event);\n }\n\n checkCompletion();\n };\n\n var originalError = options.error;\n options.error = function(event) {\n failures++;\n\n if (!failEvent) {\n failEvent = event;\n }\n\n if (originalError) {\n originalError(event);\n }\n\n checkCompletion();\n };\n\n _this.addTiledImage(options);\n };\n\n // TileSources\n for (var i = 0; i < tileSources.length; i++) {\n doOne(tileSources[i]);\n }\n\n return this;\n },\n\n\n /**\n * @function\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:close\n */\n close: function ( ) {\n if ( !THIS[ this.hash ] ) {\n //this viewer has already been destroyed: returning immediately\n return this;\n }\n\n this._opening = false;\n\n if ( this.navigator ) {\n this.navigator.close();\n }\n\n if (!this.preserveOverlays) {\n this.clearOverlays();\n this.overlaysContainer.innerHTML = \"\";\n }\n\n THIS[ this.hash ].animating = false;\n\n this.world.removeAll();\n this.imageLoader.clear();\n\n /**\n * Raised when the viewer is closed (see {@link OpenSeadragon.Viewer#close}).\n *\n * @event close\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'close' );\n\n return this;\n },\n\n\n /**\n * Function to destroy the viewer and clean up everything created by OpenSeadragon.\n *\n * Example:\n * var viewer = OpenSeadragon({\n * [...]\n * });\n *\n * //when you are done with the viewer:\n * viewer.destroy();\n * viewer = null; //important\n *\n * @function\n * @fires OpenSeadragon.Viewer.event:before-destroy\n * @fires OpenSeadragon.Viewer.event:destroy\n */\n destroy: function( ) {\n if ( !THIS[ this.hash ] ) {\n //this viewer has already been destroyed: returning immediately\n return;\n }\n\n /**\n * Raised when the viewer is about to be destroyed (see {@link OpenSeadragon.Viewer#before-destroy}).\n *\n * @event before-destroy\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'before-destroy' );\n\n this._removeUpdatePixelDensityRatioEvent();\n\n this.close();\n\n this.clearOverlays();\n this.overlaysContainer.innerHTML = \"\";\n\n //TODO: implement this...\n //this.unbindSequenceControls()\n //this.unbindStandardControls()\n if (this._resizeObserver){\n this._resizeObserver.disconnect();\n }\n\n if (this.referenceStrip) {\n this.referenceStrip.destroy();\n this.referenceStrip = null;\n }\n\n if ( this._updateRequestId !== null ) {\n $.cancelAnimationFrame( this._updateRequestId );\n this._updateRequestId = null;\n }\n\n if ( this.drawer ) {\n this.drawer.destroy();\n }\n\n if ( this.navigator ) {\n this.navigator.destroy();\n THIS[ this.navigator.hash ] = null;\n delete THIS[ this.navigator.hash ];\n this.navigator = null;\n }\n\n\n if (this.buttonGroup) {\n this.buttonGroup.destroy();\n } else if (this.customButtons) {\n while (this.customButtons.length) {\n this.customButtons.pop().destroy();\n }\n }\n\n if (this.paging) {\n this.paging.destroy();\n }\n\n // Go through top element (passed to us) and remove all children\n // Use removeChild to make sure it handles SVG or any non-html\n // also it performs better - http://jsperf.com/innerhtml-vs-removechild/15\n if (this.element){\n while (this.element.firstChild) {\n this.element.removeChild(this.element.firstChild);\n }\n }\n\n this.container.onsubmit = null;\n this.clearControls();\n\n // destroy the mouse trackers\n if (this.innerTracker){\n this.innerTracker.destroy();\n }\n if (this.outerTracker){\n this.outerTracker.destroy();\n }\n\n THIS[ this.hash ] = null;\n delete THIS[ this.hash ];\n\n // clear all our references to dom objects\n this.canvas = null;\n this.container = null;\n\n // Unregister the viewer\n $._viewers.delete(this.element);\n\n // clear our reference to the main element - they will need to pass it in again, creating a new viewer\n this.element = null;\n\n /**\n * Raised when the viewer is destroyed (see {@link OpenSeadragon.Viewer#destroy}).\n *\n * @event destroy\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'destroy' );\n\n this.removeAllHandlers();\n },\n\n /**\n * @function\n * @returns {Boolean}\n */\n isMouseNavEnabled: function () {\n return this.innerTracker.isTracking();\n },\n\n /**\n * @function\n * @param {Boolean} enabled - true to enable, false to disable\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:mouse-enabled\n */\n setMouseNavEnabled: function( enabled ){\n this.innerTracker.setTracking( enabled );\n this.outerTracker.setTracking( enabled );\n /**\n * Raised when mouse/touch navigation is enabled or disabled (see {@link OpenSeadragon.Viewer#setMouseNavEnabled}).\n *\n * @event mouse-enabled\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} enabled\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'mouse-enabled', { enabled: enabled } );\n return this;\n },\n\n\n /**\n * @function\n * @returns {Boolean}\n */\n areControlsEnabled: function () {\n var enabled = this.controls.length,\n i;\n for( i = 0; i < this.controls.length; i++ ){\n enabled = enabled && this.controls[ i ].isVisible();\n }\n return enabled;\n },\n\n\n /**\n * Shows or hides the controls (e.g. the default navigation buttons).\n *\n * @function\n * @param {Boolean} true to show, false to hide.\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:controls-enabled\n */\n setControlsEnabled: function( enabled ) {\n if( enabled ){\n abortControlsAutoHide( this );\n } else {\n beginControlsAutoHide( this );\n }\n /**\n * Raised when the navigation controls are shown or hidden (see {@link OpenSeadragon.Viewer#setControlsEnabled}).\n *\n * @event controls-enabled\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} enabled\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'controls-enabled', { enabled: enabled } );\n return this;\n },\n\n /**\n * Turns debugging mode on or off for this viewer.\n *\n * @function\n * @param {Boolean} debugMode true to turn debug on, false to turn debug off.\n */\n setDebugMode: function(debugMode){\n\n for (var i = 0; i < this.world.getItemCount(); i++) {\n this.world.getItemAt(i).debugMode = debugMode;\n }\n\n this.debugMode = debugMode;\n this.forceRedraw();\n },\n\n /**\n * Update headers to include when making AJAX requests.\n *\n * Unless `propagate` is set to false (which is likely only useful in rare circumstances),\n * the updated headers are propagated to all tiled images, each of which will subsequently\n * propagate the changed headers to all their tiles.\n * If applicable, the headers of the viewer's navigator and reference strip will also be updated.\n *\n * Note that the rules for merging headers still apply, i.e. headers returned by\n * {@link OpenSeadragon.TileSource#getTileAjaxHeaders} take precedence over\n * `TiledImage.ajaxHeaders`, which take precedence over the headers here in the viewer.\n *\n * @function\n * @param {Object} ajaxHeaders Updated AJAX headers.\n * @param {Boolean} [propagate=true] Whether to propagate updated headers to tiled images, etc.\n */\n setAjaxHeaders: function(ajaxHeaders, propagate) {\n if (ajaxHeaders === null) {\n ajaxHeaders = {};\n }\n if (!$.isPlainObject(ajaxHeaders)) {\n console.error('[Viewer.setAjaxHeaders] Ignoring invalid headers, must be a plain object');\n return;\n }\n if (propagate === undefined) {\n propagate = true;\n }\n\n this.ajaxHeaders = ajaxHeaders;\n\n if (propagate) {\n for (var i = 0; i < this.world.getItemCount(); i++) {\n this.world.getItemAt(i)._updateAjaxHeaders(true);\n }\n\n if (this.navigator) {\n this.navigator.setAjaxHeaders(this.ajaxHeaders, true);\n }\n\n if (this.referenceStrip && this.referenceStrip.miniViewers) {\n for (var key in this.referenceStrip.miniViewers) {\n this.referenceStrip.miniViewers[key].setAjaxHeaders(this.ajaxHeaders, true);\n }\n }\n }\n },\n\n /**\n * Adds the given button to this viewer.\n *\n * @function\n * @param {OpenSeadragon.Button} button\n */\n addButton: function( button ){\n this.buttonGroup.addButton(button);\n },\n\n /**\n * @function\n * @returns {Boolean}\n */\n isFullPage: function () {\n return THIS[ this.hash ].fullPage;\n },\n\n\n /**\n * Toggle full page mode.\n * @function\n * @param {Boolean} fullPage\n * If true, enter full page mode. If false, exit full page mode.\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:pre-full-page\n * @fires OpenSeadragon.Viewer.event:full-page\n */\n setFullPage: function( fullPage ) {\n\n var body = document.body,\n bodyStyle = body.style,\n docStyle = document.documentElement.style,\n _this = this,\n nodes,\n i;\n\n //don't bother modifying the DOM if we are already in full page mode.\n if ( fullPage === this.isFullPage() ) {\n return this;\n }\n\n var fullPageEventArgs = {\n fullPage: fullPage,\n preventDefaultAction: false\n };\n /**\n * Raised when the viewer is about to change to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}).\n *\n * @event pre-full-page\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullPage - True if entering full-page mode, false if exiting full-page mode.\n * @property {Boolean} preventDefaultAction - Set to true to prevent full-page mode change. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'pre-full-page', fullPageEventArgs );\n if ( fullPageEventArgs.preventDefaultAction ) {\n return this;\n }\n\n if ( fullPage ) {\n\n this.elementSize = $.getElementSize( this.element );\n this.pageScroll = $.getPageScroll();\n\n this.elementMargin = this.element.style.margin;\n this.element.style.margin = \"0\";\n this.elementPadding = this.element.style.padding;\n this.element.style.padding = \"0\";\n\n this.bodyMargin = bodyStyle.margin;\n this.docMargin = docStyle.margin;\n bodyStyle.margin = \"0\";\n docStyle.margin = \"0\";\n\n this.bodyPadding = bodyStyle.padding;\n this.docPadding = docStyle.padding;\n bodyStyle.padding = \"0\";\n docStyle.padding = \"0\";\n\n this.bodyWidth = bodyStyle.width;\n this.docWidth = docStyle.width;\n bodyStyle.width = \"100%\";\n docStyle.width = \"100%\";\n\n this.bodyHeight = bodyStyle.height;\n this.docHeight = docStyle.height;\n bodyStyle.height = \"100%\";\n docStyle.height = \"100%\";\n\n this.bodyDisplay = bodyStyle.display;\n bodyStyle.display = \"block\";\n\n //when entering full screen on the ipad it wasn't sufficient to leave\n //the body intact as only only the top half of the screen would\n //respond to touch events on the canvas, while the bottom half treated\n //them as touch events on the document body. Thus we remove and store\n //the bodies elements and replace them when we leave full screen.\n this.previousBody = [];\n THIS[ this.hash ].prevElementParent = this.element.parentNode;\n THIS[ this.hash ].prevNextSibling = this.element.nextSibling;\n THIS[ this.hash ].prevElementWidth = this.element.style.width;\n THIS[ this.hash ].prevElementHeight = this.element.style.height;\n nodes = body.childNodes.length;\n for ( i = 0; i < nodes; i++ ) {\n this.previousBody.push( body.childNodes[ 0 ] );\n body.removeChild( body.childNodes[ 0 ] );\n }\n\n //If we've got a toolbar, we need to enable the user to use css to\n //preserve it in fullpage mode\n if ( this.toolbar && this.toolbar.element ) {\n //save a reference to the parent so we can put it back\n //in the long run we need a better strategy\n this.toolbar.parentNode = this.toolbar.element.parentNode;\n this.toolbar.nextSibling = this.toolbar.element.nextSibling;\n body.appendChild( this.toolbar.element );\n\n //Make sure the user has some ability to style the toolbar based\n //on the mode\n $.addClass( this.toolbar.element, 'fullpage' );\n }\n\n $.addClass( this.element, 'fullpage' );\n body.appendChild( this.element );\n\n this.element.style.height = '100vh';\n this.element.style.width = '100vw';\n\n if ( this.toolbar && this.toolbar.element ) {\n this.element.style.height = (\n $.getElementSize( this.element ).y - $.getElementSize( this.toolbar.element ).y\n ) + 'px';\n }\n\n THIS[ this.hash ].fullPage = true;\n\n // mouse will be inside container now\n $.delegate( this, onContainerEnter )( {} );\n\n } else {\n\n this.element.style.margin = this.elementMargin;\n this.element.style.padding = this.elementPadding;\n\n bodyStyle.margin = this.bodyMargin;\n docStyle.margin = this.docMargin;\n\n bodyStyle.padding = this.bodyPadding;\n docStyle.padding = this.docPadding;\n\n bodyStyle.width = this.bodyWidth;\n docStyle.width = this.docWidth;\n\n bodyStyle.height = this.bodyHeight;\n docStyle.height = this.docHeight;\n\n bodyStyle.display = this.bodyDisplay;\n\n body.removeChild( this.element );\n nodes = this.previousBody.length;\n for ( i = 0; i < nodes; i++ ) {\n body.appendChild( this.previousBody.shift() );\n }\n\n $.removeClass( this.element, 'fullpage' );\n THIS[ this.hash ].prevElementParent.insertBefore(\n this.element,\n THIS[ this.hash ].prevNextSibling\n );\n\n //If we've got a toolbar, we need to enable the user to use css to\n //reset it to its original state\n if ( this.toolbar && this.toolbar.element ) {\n body.removeChild( this.toolbar.element );\n\n //Make sure the user has some ability to style the toolbar based\n //on the mode\n $.removeClass( this.toolbar.element, 'fullpage' );\n\n this.toolbar.parentNode.insertBefore(\n this.toolbar.element,\n this.toolbar.nextSibling\n );\n delete this.toolbar.parentNode;\n delete this.toolbar.nextSibling;\n }\n\n this.element.style.width = THIS[ this.hash ].prevElementWidth;\n this.element.style.height = THIS[ this.hash ].prevElementHeight;\n\n // After exiting fullPage or fullScreen, it can take some time\n // before the browser can actually set the scroll.\n var restoreScrollCounter = 0;\n var restoreScroll = function() {\n $.setPageScroll( _this.pageScroll );\n var pageScroll = $.getPageScroll();\n restoreScrollCounter++;\n if (restoreScrollCounter < 10 &&\n (pageScroll.x !== _this.pageScroll.x ||\n pageScroll.y !== _this.pageScroll.y)) {\n $.requestAnimationFrame( restoreScroll );\n }\n };\n $.requestAnimationFrame( restoreScroll );\n\n THIS[ this.hash ].fullPage = false;\n\n // mouse will likely be outside now\n $.delegate( this, onContainerLeave )( { } );\n\n }\n\n if ( this.navigator && this.viewport ) {\n this.navigator.update( this.viewport );\n }\n\n /**\n * Raised when the viewer has changed to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}).\n *\n * @event full-page\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullPage - True if changed to full-page mode, false if exited full-page mode.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'full-page', { fullPage: fullPage } );\n\n return this;\n },\n\n /**\n * Toggle full screen mode if supported. Toggle full page mode otherwise.\n * @function\n * @param {Boolean} fullScreen\n * If true, enter full screen mode. If false, exit full screen mode.\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:pre-full-screen\n * @fires OpenSeadragon.Viewer.event:full-screen\n */\n setFullScreen: function( fullScreen ) {\n var _this = this;\n\n if ( !$.supportsFullScreen ) {\n return this.setFullPage( fullScreen );\n }\n\n if ( $.isFullScreen() === fullScreen ) {\n return this;\n }\n\n var fullScreeEventArgs = {\n fullScreen: fullScreen,\n preventDefaultAction: false\n };\n /**\n * Raised when the viewer is about to change to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).\n * Note: the pre-full-screen event is not raised when the user is exiting\n * full-screen mode by pressing the Esc key. In that case, consider using\n * the full-screen, pre-full-page or full-page events.\n *\n * @event pre-full-screen\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullScreen - True if entering full-screen mode, false if exiting full-screen mode.\n * @property {Boolean} preventDefaultAction - Set to true to prevent full-screen mode change. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'pre-full-screen', fullScreeEventArgs );\n if ( fullScreeEventArgs.preventDefaultAction ) {\n return this;\n }\n\n if ( fullScreen ) {\n\n this.setFullPage( true );\n // If the full page mode is not actually entered, we need to prevent\n // the full screen mode.\n if ( !this.isFullPage() ) {\n return this;\n }\n\n this.fullPageStyleWidth = this.element.style.width;\n this.fullPageStyleHeight = this.element.style.height;\n this.element.style.width = '100%';\n this.element.style.height = '100%';\n\n var onFullScreenChange = function() {\n var isFullScreen = $.isFullScreen();\n if ( !isFullScreen ) {\n $.removeEvent( document, $.fullScreenEventName, onFullScreenChange );\n $.removeEvent( document, $.fullScreenErrorEventName, onFullScreenChange );\n\n _this.setFullPage( false );\n if ( _this.isFullPage() ) {\n _this.element.style.width = _this.fullPageStyleWidth;\n _this.element.style.height = _this.fullPageStyleHeight;\n }\n }\n if ( _this.navigator && _this.viewport ) {\n //09/08/2018 - Fabroh : Fix issue #1504 : Ensure to get the navigator updated on fullscreen out with custom location with a timeout\n setTimeout(function(){\n _this.navigator.update( _this.viewport );\n });\n }\n /**\n * Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).\n *\n * @event full-screen\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullScreen - True if changed to full-screen mode, false if exited full-screen mode.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'full-screen', { fullScreen: isFullScreen } );\n };\n $.addEvent( document, $.fullScreenEventName, onFullScreenChange );\n $.addEvent( document, $.fullScreenErrorEventName, onFullScreenChange );\n\n $.requestFullScreen( document.body );\n\n } else {\n $.exitFullScreen();\n }\n return this;\n },\n\n /**\n * @function\n * @returns {Boolean}\n */\n isVisible: function () {\n return this.container.style.visibility !== \"hidden\";\n },\n\n\n //\n /**\n * @function\n * @returns {Boolean} returns true if the viewer is in fullscreen\n */\n isFullScreen: function () {\n return $.isFullScreen() && this.isFullPage();\n },\n\n /**\n * @function\n * @param {Boolean} visible\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:visible\n */\n setVisible: function( visible ){\n this.container.style.visibility = visible ? \"\" : \"hidden\";\n /**\n * Raised when the viewer is shown or hidden (see {@link OpenSeadragon.Viewer#setVisible}).\n *\n * @event visible\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} visible\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'visible', { visible: visible } );\n return this;\n },\n\n /**\n * Add a tiled image to the viewer.\n * options.tileSource can be anything that {@link OpenSeadragon.Viewer#open}\n * supports except arrays of images.\n * Note that you can specify options.width or options.height, but not both.\n * The other dimension will be calculated according to the item's aspect ratio.\n * If collectionMode is on (see {@link OpenSeadragon.Options}), the new image is\n * automatically arranged with the others.\n * @function\n * @param {Object} options\n * @param {String|Object|Function} options.tileSource - The TileSource specifier.\n * A String implies a url used to determine the tileSource implementation\n * based on the file extension of url. JSONP is implied by *.js,\n * otherwise the url is retrieved as text and the resulting text is\n * introspected to determine if its json, xml, or text and parsed.\n * An Object implies an inline configuration which has a single\n * property sufficient for being able to determine tileSource\n * implementation. If the object has a property which is a function\n * named 'getTileUrl', it is treated as a custom TileSource.\n * @param {Number} [options.index] The index of the item. Added on top of\n * all other items if not specified.\n * @param {Boolean} [options.replace=false] If true, the item at options.index will be\n * removed and the new item is added in its place. options.tileSource will be\n * interpreted and fetched if necessary before the old item is removed to avoid leaving\n * a gap in the world.\n * @param {Number} [options.x=0] The X position for the image in viewport coordinates.\n * @param {Number} [options.y=0] The Y position for the image in viewport coordinates.\n * @param {Number} [options.width=1] The width for the image in viewport coordinates.\n * @param {Number} [options.height] The height for the image in viewport coordinates.\n * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates\n * to fit the image into. If specified, x, y, width and height get ignored.\n * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds if options.fitBounds is set.\n * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @param {Number} [options.opacity=1] Proportional opacity of the tiled images (1=opaque, 0=hidden)\n * @param {Boolean} [options.preload=false] Default switch for loading hidden images (true loads, false blocks)\n * @param {Number} [options.degrees=0] Initial rotation of the tiled image around\n * its top left corner in degrees.\n * @param {Boolean} [options.flipped=false] Whether to horizontally flip the image.\n * @param {String} [options.compositeOperation] How the image is composited onto other images.\n * @param {String} [options.crossOriginPolicy] The crossOriginPolicy for this specific image,\n * overriding viewer.crossOriginPolicy.\n * @param {Boolean} [options.ajaxWithCredentials] Whether to set withCredentials on tile AJAX\n * @param {Boolean} [options.loadTilesWithAjax]\n * Whether to load tile data using AJAX requests.\n * Defaults to the setting in {@link OpenSeadragon.Options}.\n * @param {Object} [options.ajaxHeaders]\n * A set of headers to include when making tile AJAX requests.\n * Note that these headers will be merged over any headers specified in {@link OpenSeadragon.Options}.\n * Specifying a falsy value for a header will clear its existing value set at the Viewer level (if any).\n * @param {Function} [options.success] A function that gets called when the image is\n * successfully added. It's passed the event object which contains a single property:\n * \"item\", which is the resulting instance of TiledImage.\n * @param {Function} [options.error] A function that gets called if the image is\n * unable to be added. It's passed the error event object, which contains \"message\"\n * and \"source\" properties.\n * @param {Boolean} [options.collectionImmediately=false] If collectionMode is on,\n * specifies whether to snap to the new arrangement immediately or to animate to it.\n * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.Viewer.event:add-item-failed\n */\n addTiledImage: function( options ) {\n $.console.assert(options, \"[Viewer.addTiledImage] options is required\");\n $.console.assert(options.tileSource, \"[Viewer.addTiledImage] options.tileSource is required\");\n $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()),\n \"[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world\");\n\n var _this = this;\n\n if (options.replace) {\n options.replaceItem = _this.world.getItemAt(options.index);\n }\n\n this._hideMessage();\n\n if (options.placeholderFillStyle === undefined) {\n options.placeholderFillStyle = this.placeholderFillStyle;\n }\n if (options.opacity === undefined) {\n options.opacity = this.opacity;\n }\n if (options.preload === undefined) {\n options.preload = this.preload;\n }\n if (options.compositeOperation === undefined) {\n options.compositeOperation = this.compositeOperation;\n }\n if (options.crossOriginPolicy === undefined) {\n options.crossOriginPolicy = options.tileSource.crossOriginPolicy !== undefined ? options.tileSource.crossOriginPolicy : this.crossOriginPolicy;\n }\n if (options.ajaxWithCredentials === undefined) {\n options.ajaxWithCredentials = this.ajaxWithCredentials;\n }\n if (options.loadTilesWithAjax === undefined) {\n options.loadTilesWithAjax = this.loadTilesWithAjax;\n }\n if (!$.isPlainObject(options.ajaxHeaders)) {\n options.ajaxHeaders = {};\n }\n\n var myQueueItem = {\n options: options\n };\n\n function raiseAddItemFailed( event ) {\n for (var i = 0; i < _this._loadQueue.length; i++) {\n if (_this._loadQueue[i] === myQueueItem) {\n _this._loadQueue.splice(i, 1);\n break;\n }\n }\n\n if (_this._loadQueue.length === 0) {\n refreshWorld(myQueueItem);\n }\n\n /**\n * Raised when an error occurs while adding a item.\n * @event add-item-failed\n * @memberOf OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {Object} options The options passed to the addTiledImage method.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'add-item-failed', event );\n\n if (options.error) {\n options.error(event);\n }\n }\n\n function refreshWorld(theItem) {\n if (_this.collectionMode) {\n _this.world.arrange({\n immediately: theItem.options.collectionImmediately,\n rows: _this.collectionRows,\n columns: _this.collectionColumns,\n layout: _this.collectionLayout,\n tileSize: _this.collectionTileSize,\n tileMargin: _this.collectionTileMargin\n });\n _this.world.setAutoRefigureSizes(true);\n }\n }\n\n if ($.isArray(options.tileSource)) {\n setTimeout(function() {\n raiseAddItemFailed({\n message: \"[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.\",\n source: options.tileSource,\n options: options\n });\n });\n return;\n }\n\n this._loadQueue.push(myQueueItem);\n\n function processReadyItems() {\n var queueItem, tiledImage, optionsClone;\n while (_this._loadQueue.length) {\n queueItem = _this._loadQueue[0];\n if (!queueItem.tileSource) {\n break;\n }\n\n _this._loadQueue.splice(0, 1);\n\n if (queueItem.options.replace) {\n var newIndex = _this.world.getIndexOfItem(queueItem.options.replaceItem);\n if (newIndex !== -1) {\n queueItem.options.index = newIndex;\n }\n _this.world.removeItem(queueItem.options.replaceItem);\n }\n\n tiledImage = new $.TiledImage({\n viewer: _this,\n source: queueItem.tileSource,\n viewport: _this.viewport,\n drawer: _this.drawer,\n tileCache: _this.tileCache,\n imageLoader: _this.imageLoader,\n x: queueItem.options.x,\n y: queueItem.options.y,\n width: queueItem.options.width,\n height: queueItem.options.height,\n fitBounds: queueItem.options.fitBounds,\n fitBoundsPlacement: queueItem.options.fitBoundsPlacement,\n clip: queueItem.options.clip,\n placeholderFillStyle: queueItem.options.placeholderFillStyle,\n opacity: queueItem.options.opacity,\n preload: queueItem.options.preload,\n degrees: queueItem.options.degrees,\n flipped: queueItem.options.flipped,\n compositeOperation: queueItem.options.compositeOperation,\n springStiffness: _this.springStiffness,\n animationTime: _this.animationTime,\n minZoomImageRatio: _this.minZoomImageRatio,\n wrapHorizontal: _this.wrapHorizontal,\n wrapVertical: _this.wrapVertical,\n immediateRender: _this.immediateRender,\n blendTime: _this.blendTime,\n alwaysBlend: _this.alwaysBlend,\n minPixelRatio: _this.minPixelRatio,\n smoothTileEdgesMinZoom: _this.smoothTileEdgesMinZoom,\n iOSDevice: _this.iOSDevice,\n crossOriginPolicy: queueItem.options.crossOriginPolicy,\n ajaxWithCredentials: queueItem.options.ajaxWithCredentials,\n loadTilesWithAjax: queueItem.options.loadTilesWithAjax,\n ajaxHeaders: queueItem.options.ajaxHeaders,\n debugMode: _this.debugMode,\n subPixelRoundingForTransparency: _this.subPixelRoundingForTransparency\n });\n\n if (_this.collectionMode) {\n _this.world.setAutoRefigureSizes(false);\n }\n\n if (_this.navigator) {\n optionsClone = $.extend({}, queueItem.options, {\n replace: false, // navigator already removed the layer, nothing to replace\n originalTiledImage: tiledImage,\n tileSource: queueItem.tileSource\n });\n\n _this.navigator.addTiledImage(optionsClone);\n }\n\n _this.world.addItem( tiledImage, {\n index: queueItem.options.index\n });\n\n if (_this._loadQueue.length === 0) {\n //this restores the autoRefigureSizes flag to true.\n refreshWorld(queueItem);\n }\n\n if (_this.world.getItemCount() === 1 && !_this.preserveViewport) {\n _this.viewport.goHome(true);\n }\n\n if (queueItem.options.success) {\n queueItem.options.success({\n item: tiledImage\n });\n }\n }\n }\n\n getTileSourceImplementation( this, options.tileSource, options, function( tileSource ) {\n\n myQueueItem.tileSource = tileSource;\n\n // add everybody at the front of the queue that's ready to go\n processReadyItems();\n }, function( event ) {\n event.options = options;\n raiseAddItemFailed(event);\n\n // add everybody at the front of the queue that's ready to go\n processReadyItems();\n } );\n },\n\n /**\n * Add a simple image to the viewer.\n * The options are the same as the ones in {@link OpenSeadragon.Viewer#addTiledImage}\n * except for options.tileSource which is replaced by options.url.\n * @function\n * @param {Object} options - See {@link OpenSeadragon.Viewer#addTiledImage}\n * for all the options\n * @param {String} options.url - The URL of the image to add.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.Viewer.event:add-item-failed\n */\n addSimpleImage: function(options) {\n $.console.assert(options, \"[Viewer.addSimpleImage] options is required\");\n $.console.assert(options.url, \"[Viewer.addSimpleImage] options.url is required\");\n\n var opts = $.extend({}, options, {\n tileSource: {\n type: 'image',\n url: options.url\n }\n });\n delete opts.url;\n this.addTiledImage(opts);\n },\n\n // deprecated\n addLayer: function( options ) {\n var _this = this;\n\n $.console.error( \"[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead.\" );\n\n var optionsClone = $.extend({}, options, {\n success: function(event) {\n _this.raiseEvent(\"add-layer\", {\n options: options,\n drawer: event.item\n });\n },\n error: function(event) {\n _this.raiseEvent(\"add-layer-failed\", event);\n }\n });\n\n this.addTiledImage(optionsClone);\n return this;\n },\n\n // deprecated\n getLayerAtLevel: function( level ) {\n $.console.error( \"[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead.\" );\n return this.world.getItemAt(level);\n },\n\n // deprecated\n getLevelOfLayer: function( drawer ) {\n $.console.error( \"[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead.\" );\n return this.world.getIndexOfItem(drawer);\n },\n\n // deprecated\n getLayersCount: function() {\n $.console.error( \"[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead.\" );\n return this.world.getItemCount();\n },\n\n // deprecated\n setLayerLevel: function( drawer, level ) {\n $.console.error( \"[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead.\" );\n return this.world.setItemIndex(drawer, level);\n },\n\n // deprecated\n removeLayer: function( drawer ) {\n $.console.error( \"[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead.\" );\n return this.world.removeItem(drawer);\n },\n\n /**\n * Force the viewer to redraw its contents.\n * @returns {OpenSeadragon.Viewer} Chainable.\n */\n forceRedraw: function() {\n THIS[ this.hash ].forceRedraw = true;\n return this;\n },\n\n /**\n * Force the viewer to reset its size to match its container.\n */\n forceResize: function() {\n THIS[this.hash].needsResize = true;\n THIS[this.hash].forceResize = true;\n },\n\n /**\n * @function\n * @returns {OpenSeadragon.Viewer} Chainable.\n */\n bindSequenceControls: function(){\n\n //////////////////////////////////////////////////////////////////////////\n // Image Sequence Controls\n //////////////////////////////////////////////////////////////////////////\n var onFocusHandler = $.delegate( this, onFocus ),\n onBlurHandler = $.delegate( this, onBlur ),\n onNextHandler = $.delegate( this, this.goToNextPage ),\n onPreviousHandler = $.delegate( this, this.goToPreviousPage ),\n navImages = this.navImages,\n useGroup = true;\n\n if( this.showSequenceControl ){\n\n if( this.previousButton || this.nextButton ){\n //if we are binding to custom buttons then layout and\n //grouping is the responsibility of the page author\n useGroup = false;\n }\n\n this.previousButton = new $.Button({\n element: this.previousButton ? $.getElement( this.previousButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.PreviousPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.previous.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.previous.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.previous.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.previous.DOWN ),\n onRelease: onPreviousHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n });\n\n this.nextButton = new $.Button({\n element: this.nextButton ? $.getElement( this.nextButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.NextPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.next.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.next.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.next.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.next.DOWN ),\n onRelease: onNextHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n });\n\n if( !this.navPrevNextWrap ){\n this.previousButton.disable();\n }\n\n if (!this.tileSources || !this.tileSources.length) {\n this.nextButton.disable();\n }\n\n if( useGroup ){\n this.paging = new $.ButtonGroup({\n buttons: [\n this.previousButton,\n this.nextButton\n ],\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold\n });\n\n this.pagingControl = this.paging.element;\n\n if( this.toolbar ){\n this.toolbar.addControl(\n this.pagingControl,\n {anchor: $.ControlAnchor.BOTTOM_RIGHT}\n );\n }else{\n this.addControl(\n this.pagingControl,\n {anchor: this.sequenceControlAnchor || $.ControlAnchor.TOP_LEFT}\n );\n }\n }\n }\n return this;\n },\n\n\n /**\n * @function\n * @returns {OpenSeadragon.Viewer} Chainable.\n */\n bindStandardControls: function(){\n //////////////////////////////////////////////////////////////////////////\n // Navigation Controls\n //////////////////////////////////////////////////////////////////////////\n var beginZoomingInHandler = $.delegate( this, beginZoomingIn ),\n endZoomingHandler = $.delegate( this, endZooming ),\n doSingleZoomInHandler = $.delegate( this, doSingleZoomIn ),\n beginZoomingOutHandler = $.delegate( this, beginZoomingOut ),\n doSingleZoomOutHandler = $.delegate( this, doSingleZoomOut ),\n onHomeHandler = $.delegate( this, onHome ),\n onFullScreenHandler = $.delegate( this, onFullScreen ),\n onRotateLeftHandler = $.delegate( this, onRotateLeft ),\n onRotateRightHandler = $.delegate( this, onRotateRight ),\n onFlipHandler = $.delegate( this, onFlip),\n onFocusHandler = $.delegate( this, onFocus ),\n onBlurHandler = $.delegate( this, onBlur ),\n navImages = this.navImages,\n buttons = [],\n useGroup = true;\n\n\n if ( this.showNavigationControl ) {\n\n if( this.zoomInButton || this.zoomOutButton ||\n this.homeButton || this.fullPageButton ||\n this.rotateLeftButton || this.rotateRightButton ||\n this.flipButton ) {\n //if we are binding to custom buttons then layout and\n //grouping is the responsibility of the page author\n useGroup = false;\n }\n\n if ( this.showZoomControl ) {\n buttons.push( this.zoomInButton = new $.Button({\n element: this.zoomInButton ? $.getElement( this.zoomInButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.ZoomIn\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.zoomIn.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.zoomIn.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.zoomIn.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.zoomIn.DOWN ),\n onPress: beginZoomingInHandler,\n onRelease: endZoomingHandler,\n onClick: doSingleZoomInHandler,\n onEnter: beginZoomingInHandler,\n onExit: endZoomingHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n\n buttons.push( this.zoomOutButton = new $.Button({\n element: this.zoomOutButton ? $.getElement( this.zoomOutButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.ZoomOut\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.zoomOut.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.zoomOut.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.zoomOut.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.zoomOut.DOWN ),\n onPress: beginZoomingOutHandler,\n onRelease: endZoomingHandler,\n onClick: doSingleZoomOutHandler,\n onEnter: beginZoomingOutHandler,\n onExit: endZoomingHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showHomeControl ) {\n buttons.push( this.homeButton = new $.Button({\n element: this.homeButton ? $.getElement( this.homeButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.Home\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.home.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.home.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.home.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.home.DOWN ),\n onRelease: onHomeHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showFullPageControl ) {\n buttons.push( this.fullPageButton = new $.Button({\n element: this.fullPageButton ? $.getElement( this.fullPageButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.FullPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.fullpage.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.fullpage.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.fullpage.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.fullpage.DOWN ),\n onRelease: onFullScreenHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showRotationControl ) {\n buttons.push( this.rotateLeftButton = new $.Button({\n element: this.rotateLeftButton ? $.getElement( this.rotateLeftButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.RotateLeft\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.rotateleft.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.rotateleft.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.rotateleft.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.rotateleft.DOWN ),\n onRelease: onRotateLeftHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n\n buttons.push( this.rotateRightButton = new $.Button({\n element: this.rotateRightButton ? $.getElement( this.rotateRightButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.RotateRight\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.rotateright.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.rotateright.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.rotateright.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.rotateright.DOWN ),\n onRelease: onRotateRightHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showFlipControl ) {\n buttons.push( this.flipButton = new $.Button({\n element: this.flipButton ? $.getElement( this.flipButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.Flip\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.flip.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.flip.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.flip.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.flip.DOWN ),\n onRelease: onFlipHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( useGroup ) {\n this.buttonGroup = new $.ButtonGroup({\n buttons: buttons,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold\n });\n\n this.navControl = this.buttonGroup.element;\n this.addHandler( 'open', $.delegate( this, lightUp ) );\n\n if( this.toolbar ){\n this.toolbar.addControl(\n this.navControl,\n {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT}\n );\n } else {\n this.addControl(\n this.navControl,\n {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT}\n );\n }\n } else {\n this.customButtons = buttons;\n }\n\n }\n return this;\n },\n\n /**\n * Gets the active page of a sequence\n * @function\n * @returns {Number}\n */\n currentPage: function() {\n return this._sequenceIndex;\n },\n\n /**\n * @function\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:page\n */\n goToPage: function( page ){\n if( this.tileSources && page >= 0 && page < this.tileSources.length ){\n this._sequenceIndex = page;\n\n this._updateSequenceButtons( page );\n\n this.open( this.tileSources[ page ] );\n\n if( this.referenceStrip ){\n this.referenceStrip.setFocus( page );\n }\n\n /**\n * Raised when the page is changed on a viewer configured with multiple image sources (see {@link OpenSeadragon.Viewer#goToPage}).\n *\n * @event page\n * @memberof OpenSeadragon.Viewer\n * @type {Object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Number} page - The page index.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'page', { page: page } );\n }\n\n return this;\n },\n\n /**\n * Adds an html element as an overlay to the current viewport. Useful for\n * highlighting words or areas of interest on an image or other zoomable\n * interface. The overlays added via this method are removed when the viewport\n * is closed which include when changing page.\n * @method\n * @param {Element|String|Object} element - A reference to an element or an id for\n * the element which will be overlaid. Or an Object specifying the configuration for the overlay.\n * If using an object, see {@link OpenSeadragon.Overlay} for a list of\n * all available options.\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or\n * rectangle which will be overlaid. This is a viewport relative location.\n * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the\n * viewport which the location coordinates will be treated as relative\n * to.\n * @param {function} [onDraw] - If supplied the callback is called when the overlay\n * needs to be drawn. It it the responsibility of the callback to do any drawing/positioning.\n * It is passed position, size and element.\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:add-overlay\n */\n addOverlay: function( element, location, placement, onDraw ) {\n var options;\n if( $.isPlainObject( element ) ){\n options = element;\n } else {\n options = {\n element: element,\n location: location,\n placement: placement,\n onDraw: onDraw\n };\n }\n\n element = $.getElement( options.element );\n\n if ( getOverlayIndex( this.currentOverlays, element ) >= 0 ) {\n // they're trying to add a duplicate overlay\n return this;\n }\n\n var overlay = getOverlayObject( this, options);\n this.currentOverlays.push(overlay);\n overlay.drawHTML( this.overlaysContainer, this.viewport );\n\n /**\n * Raised when an overlay is added to the viewer (see {@link OpenSeadragon.Viewer#addOverlay}).\n *\n * @event add-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Element} element - The overlay element.\n * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location\n * @property {OpenSeadragon.Placement} placement\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'add-overlay', {\n element: element,\n location: options.location,\n placement: options.placement\n });\n return this;\n },\n\n /**\n * Updates the overlay represented by the reference to the element or\n * element id moving it to the new location, relative to the new placement.\n * @method\n * @param {Element|String} element - A reference to an element or an id for\n * the element which is overlaid.\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or\n * rectangle which will be overlaid. This is a viewport relative location.\n * @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the\n * viewport which the location coordinates will be treated as relative\n * to.\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:update-overlay\n */\n updateOverlay: function( element, location, placement ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if ( i >= 0 ) {\n this.currentOverlays[ i ].update( location, placement );\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when an overlay's location or placement changes\n * (see {@link OpenSeadragon.Viewer#updateOverlay}).\n *\n * @event update-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the\n * Viewer which raised the event.\n * @property {Element} element\n * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location\n * @property {OpenSeadragon.Placement} placement\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'update-overlay', {\n element: element,\n location: location,\n placement: placement\n });\n }\n return this;\n },\n\n /**\n * Removes an overlay identified by the reference element or element id\n * and schedules an update.\n * @method\n * @param {Element|String} element - A reference to the element or an\n * element id which represent the ovelay content to be removed.\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:remove-overlay\n */\n removeOverlay: function( element ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if ( i >= 0 ) {\n this.currentOverlays[ i ].destroy();\n this.currentOverlays.splice( i, 1 );\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when an overlay is removed from the viewer\n * (see {@link OpenSeadragon.Viewer#removeOverlay}).\n *\n * @event remove-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the\n * Viewer which raised the event.\n * @property {Element} element - The overlay element.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'remove-overlay', {\n element: element\n });\n }\n return this;\n },\n\n /**\n * Removes all currently configured Overlays from this Viewer and schedules\n * an update.\n * @method\n * @returns {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:clear-overlay\n */\n clearOverlays: function() {\n while ( this.currentOverlays.length > 0 ) {\n this.currentOverlays.pop().destroy();\n }\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when all overlays are removed from the viewer (see {@link OpenSeadragon.Drawer#clearOverlays}).\n *\n * @event clear-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'clear-overlay', {} );\n return this;\n },\n\n /**\n * Finds an overlay identified by the reference element or element id\n * and returns it as an object, return null if not found.\n * @method\n * @param {Element|String} element - A reference to the element or an\n * element id which represents the overlay content.\n * @returns {OpenSeadragon.Overlay} the matching overlay or null if none found.\n */\n getOverlayById: function( element ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if (i >= 0) {\n return this.currentOverlays[i];\n } else {\n return null;\n }\n },\n\n /**\n * Updates the sequence buttons.\n * @function OpenSeadragon.Viewer.prototype._updateSequenceButtons\n * @private\n * @param {Number} Sequence Value\n */\n _updateSequenceButtons: function( page ) {\n\n if ( this.nextButton ) {\n if(!this.tileSources || this.tileSources.length - 1 === page) {\n //Disable next button\n if ( !this.navPrevNextWrap ) {\n this.nextButton.disable();\n }\n } else {\n this.nextButton.enable();\n }\n }\n if ( this.previousButton ) {\n if ( page > 0 ) {\n //Enable previous button\n this.previousButton.enable();\n } else {\n if ( !this.navPrevNextWrap ) {\n this.previousButton.disable();\n }\n }\n }\n },\n\n /**\n * Display a message in the viewport\n * @function OpenSeadragon.Viewer.prototype._showMessage\n * @private\n * @param {String} text message\n */\n _showMessage: function ( message ) {\n this._hideMessage();\n\n var div = $.makeNeutralElement( \"div\" );\n div.appendChild( document.createTextNode( message ) );\n\n this.messageDiv = $.makeCenteredNode( div );\n\n $.addClass(this.messageDiv, \"openseadragon-message\");\n\n this.container.appendChild( this.messageDiv );\n },\n\n /**\n * Hide any currently displayed viewport message\n * @function OpenSeadragon.Viewer.prototype._hideMessage\n * @private\n */\n _hideMessage: function () {\n var div = this.messageDiv;\n if (div) {\n div.parentNode.removeChild(div);\n delete this.messageDiv;\n }\n },\n\n /**\n * Gets this viewer's gesture settings for the given pointer device type.\n * @method\n * @param {String} type - The pointer device type to get the gesture settings for (\"mouse\", \"touch\", \"pen\", etc.).\n * @returns {OpenSeadragon.GestureSettings}\n */\n gestureSettingsByDeviceType: function ( type ) {\n switch ( type ) {\n case 'mouse':\n return this.gestureSettingsMouse;\n case 'touch':\n return this.gestureSettingsTouch;\n case 'pen':\n return this.gestureSettingsPen;\n default:\n return this.gestureSettingsUnknown;\n }\n },\n\n // private\n _drawOverlays: function() {\n var i,\n length = this.currentOverlays.length;\n for ( i = 0; i < length; i++ ) {\n this.currentOverlays[ i ].drawHTML( this.overlaysContainer, this.viewport );\n }\n },\n\n /**\n * Cancel the \"in flight\" images.\n */\n _cancelPendingImages: function() {\n this._loadQueue = [];\n },\n\n /**\n * Removes the reference strip and disables displaying it.\n * @function\n */\n removeReferenceStrip: function() {\n this.showReferenceStrip = false;\n\n if (this.referenceStrip) {\n this.referenceStrip.destroy();\n this.referenceStrip = null;\n }\n },\n\n /**\n * Enables and displays the reference strip based on the currently set tileSources.\n * Works only when the Viewer has sequenceMode set to true.\n * @function\n */\n addReferenceStrip: function() {\n this.showReferenceStrip = true;\n\n if (this.sequenceMode) {\n if (this.referenceStrip) {\n return;\n }\n\n if (this.tileSources.length && this.tileSources.length > 1) {\n this.referenceStrip = new $.ReferenceStrip({\n id: this.referenceStripElement,\n position: this.referenceStripPosition,\n sizeRatio: this.referenceStripSizeRatio,\n scroll: this.referenceStripScroll,\n height: this.referenceStripHeight,\n width: this.referenceStripWidth,\n tileSources: this.tileSources,\n prefixUrl: this.prefixUrl,\n useCanvas: this.useCanvas,\n viewer: this\n });\n\n this.referenceStrip.setFocus( this._sequenceIndex );\n }\n } else {\n $.console.warn('Attempting to display a reference strip while \"sequenceMode\" is off.');\n }\n },\n\n /**\n * Adds _updatePixelDensityRatio to the window resize event.\n * @private\n */\n _addUpdatePixelDensityRatioEvent: function() {\n this._updatePixelDensityRatioBind = this._updatePixelDensityRatio.bind(this);\n $.addEvent( window, 'resize', this._updatePixelDensityRatioBind );\n },\n\n /**\n * Removes _updatePixelDensityRatio from the window resize event.\n * @private\n */\n _removeUpdatePixelDensityRatioEvent: function() {\n $.removeEvent( window, 'resize', this._updatePixelDensityRatioBind );\n },\n\n /**\n * Update pixel density ratio, clears all tiles and triggers updates for\n * all items if the ratio has changed.\n * @private\n */\n _updatePixelDensityRatio: function() {\n var previusPixelDensityRatio = $.pixelDensityRatio;\n var currentPixelDensityRatio = $.getCurrentPixelDensityRatio();\n if (previusPixelDensityRatio !== currentPixelDensityRatio) {\n $.pixelDensityRatio = currentPixelDensityRatio;\n this.world.resetItems();\n this.forceRedraw();\n }\n },\n\n /**\n * Sets the image source to the source with index equal to\n * currentIndex - 1. Changes current image in sequence mode.\n * If specified, wraps around (see navPrevNextWrap in\n * {@link OpenSeadragon.Options})\n *\n * @method\n */\n\n goToPreviousPage: function () {\n var previous = this._sequenceIndex - 1;\n if(this.navPrevNextWrap && previous < 0){\n previous += this.tileSources.length;\n }\n this.goToPage( previous );\n },\n\n /**\n * Sets the image source to the source with index equal to\n * currentIndex + 1. Changes current image in sequence mode.\n * If specified, wraps around (see navPrevNextWrap in\n * {@link OpenSeadragon.Options})\n *\n * @method\n */\n goToNextPage: function () {\n var next = this._sequenceIndex + 1;\n if(this.navPrevNextWrap && next >= this.tileSources.length){\n next = 0;\n }\n this.goToPage( next );\n },\n\n isAnimating: function () {\n return THIS[ this.hash ].animating;\n },\n});\n\n\n/**\n * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y,\n * which was causing some calling operations to return NaN.\n * @returns {Point}\n * @private\n */\nfunction _getSafeElemSize (oElement) {\n oElement = $.getElement( oElement );\n\n return new $.Point(\n (oElement.clientWidth === 0 ? 1 : oElement.clientWidth),\n (oElement.clientHeight === 0 ? 1 : oElement.clientHeight)\n );\n}\n\n\n/**\n * @function\n * @private\n */\nfunction getTileSourceImplementation( viewer, tileSource, imgOptions, successCallback,\n failCallback ) {\n var _this = viewer;\n\n //allow plain xml strings or json strings to be parsed here\n if ( $.type( tileSource ) === 'string' ) {\n //xml should start with \"<\" and end with \">\"\n if ( tileSource.match( /^\\s*<.*>\\s*$/ ) ) {\n tileSource = $.parseXml( tileSource );\n //json should start with \"{\" or \"[\" and end with \"}\" or \"]\"\n } else if ( tileSource.match(/^\\s*[{[].*[}\\]]\\s*$/ ) ) {\n try {\n var tileSourceJ = $.parseJSON(tileSource);\n tileSource = tileSourceJ;\n } catch (e) {\n //tileSource = tileSource;\n }\n }\n }\n\n function waitUntilReady(tileSource, originalTileSource) {\n if (tileSource.ready) {\n successCallback(tileSource);\n } else {\n tileSource.addHandler('ready', function () {\n successCallback(tileSource);\n });\n tileSource.addHandler('open-failed', function (event) {\n failCallback({\n message: event.message,\n source: originalTileSource\n });\n });\n }\n }\n\n setTimeout( function() {\n if ( $.type( tileSource ) === 'string' ) {\n //If its still a string it means it must be a url at this point\n tileSource = new $.TileSource({\n url: tileSource,\n crossOriginPolicy: imgOptions.crossOriginPolicy !== undefined ?\n imgOptions.crossOriginPolicy : viewer.crossOriginPolicy,\n ajaxWithCredentials: viewer.ajaxWithCredentials,\n ajaxHeaders: imgOptions.ajaxHeaders ?\n imgOptions.ajaxHeaders : viewer.ajaxHeaders,\n splitHashDataForPost: viewer.splitHashDataForPost,\n useCanvas: viewer.useCanvas,\n success: function( event ) {\n successCallback( event.tileSource );\n }\n });\n tileSource.addHandler( 'open-failed', function( event ) {\n failCallback( event );\n } );\n\n } else if ($.isPlainObject(tileSource) || tileSource.nodeType) {\n if (tileSource.crossOriginPolicy === undefined &&\n (imgOptions.crossOriginPolicy !== undefined || viewer.crossOriginPolicy !== undefined)) {\n tileSource.crossOriginPolicy = imgOptions.crossOriginPolicy !== undefined ?\n imgOptions.crossOriginPolicy : viewer.crossOriginPolicy;\n }\n if (tileSource.ajaxWithCredentials === undefined) {\n tileSource.ajaxWithCredentials = viewer.ajaxWithCredentials;\n }\n if (tileSource.useCanvas === undefined) {\n tileSource.useCanvas = viewer.useCanvas;\n }\n\n if ( $.isFunction( tileSource.getTileUrl ) ) {\n //Custom tile source\n var customTileSource = new $.TileSource( tileSource );\n customTileSource.getTileUrl = tileSource.getTileUrl;\n successCallback( customTileSource );\n } else {\n //inline configuration\n var $TileSource = $.TileSource.determineType( _this, tileSource );\n if ( !$TileSource ) {\n failCallback( {\n message: \"Unable to load TileSource\",\n source: tileSource\n });\n return;\n }\n var options = $TileSource.prototype.configure.apply( _this, [ tileSource ] );\n waitUntilReady(new $TileSource(options), tileSource);\n }\n } else {\n //can assume it's already a tile source implementation\n waitUntilReady(tileSource, tileSource);\n }\n });\n}\n\nfunction getOverlayObject( viewer, overlay ) {\n if ( overlay instanceof $.Overlay ) {\n return overlay;\n }\n\n var element = null;\n if ( overlay.element ) {\n element = $.getElement( overlay.element );\n } else {\n var id = overlay.id ?\n overlay.id :\n \"openseadragon-overlay-\" + Math.floor( Math.random() * 10000000 );\n\n element = $.getElement( overlay.id );\n if ( !element ) {\n element = document.createElement( \"a\" );\n element.href = \"#/overlay/\" + id;\n }\n element.id = id;\n $.addClass( element, overlay.className ?\n overlay.className :\n \"openseadragon-overlay\"\n );\n }\n\n var location = overlay.location;\n var width = overlay.width;\n var height = overlay.height;\n if (!location) {\n var x = overlay.x;\n var y = overlay.y;\n if (overlay.px !== undefined) {\n var rect = viewer.viewport.imageToViewportRectangle(new $.Rect(\n overlay.px,\n overlay.py,\n width || 0,\n height || 0));\n x = rect.x;\n y = rect.y;\n width = width !== undefined ? rect.width : undefined;\n height = height !== undefined ? rect.height : undefined;\n }\n location = new $.Point(x, y);\n }\n\n var placement = overlay.placement;\n if (placement && $.type(placement) === \"string\") {\n placement = $.Placement[overlay.placement.toUpperCase()];\n }\n\n return new $.Overlay({\n element: element,\n location: location,\n placement: placement,\n onDraw: overlay.onDraw,\n checkResize: overlay.checkResize,\n width: width,\n height: height,\n rotationMode: overlay.rotationMode\n });\n}\n\n/**\n * @private\n * @inner\n * Determines the index of the given overlay in the given overlays array.\n */\nfunction getOverlayIndex( overlays, element ) {\n var i;\n for ( i = overlays.length - 1; i >= 0; i-- ) {\n if ( overlays[ i ].element === element ) {\n return i;\n }\n }\n\n return -1;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// Schedulers provide the general engine for animation\n///////////////////////////////////////////////////////////////////////////////\nfunction scheduleUpdate( viewer, updateFunc ){\n return $.requestAnimationFrame( function(){\n updateFunc( viewer );\n } );\n}\n\n\n//provides a sequence in the fade animation\nfunction scheduleControlsFade( viewer ) {\n $.requestAnimationFrame( function(){\n updateControlsFade( viewer );\n });\n}\n\n\n//initiates an animation to hide the controls\nfunction beginControlsAutoHide( viewer ) {\n if ( !viewer.autoHideControls ) {\n return;\n }\n viewer.controlsShouldFade = true;\n viewer.controlsFadeBeginTime =\n $.now() +\n viewer.controlsFadeDelay;\n\n window.setTimeout( function(){\n scheduleControlsFade( viewer );\n }, viewer.controlsFadeDelay );\n}\n\n\n//determines if fade animation is done or continues the animation\nfunction updateControlsFade( viewer ) {\n var currentTime,\n deltaTime,\n opacity,\n i;\n if ( viewer.controlsShouldFade ) {\n currentTime = $.now();\n deltaTime = currentTime - viewer.controlsFadeBeginTime;\n opacity = 1.0 - deltaTime / viewer.controlsFadeLength;\n\n opacity = Math.min( 1.0, opacity );\n opacity = Math.max( 0.0, opacity );\n\n for ( i = viewer.controls.length - 1; i >= 0; i--) {\n if (viewer.controls[ i ].autoFade) {\n viewer.controls[ i ].setOpacity( opacity );\n }\n }\n\n if ( opacity > 0 ) {\n // fade again\n scheduleControlsFade( viewer );\n }\n }\n}\n\n\n//stop the fade animation on the controls and show them\nfunction abortControlsAutoHide( viewer ) {\n var i;\n viewer.controlsShouldFade = false;\n for ( i = viewer.controls.length - 1; i >= 0; i-- ) {\n viewer.controls[ i ].setOpacity( 1.0 );\n }\n}\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Default view event handlers.\n///////////////////////////////////////////////////////////////////////////////\nfunction onFocus(){\n abortControlsAutoHide( this );\n}\n\nfunction onBlur(){\n beginControlsAutoHide( this );\n\n}\n\nfunction onCanvasContextMenu( event ) {\n var eventArgs = {\n tracker: event.eventSource,\n position: event.position,\n originalEvent: event.originalEvent,\n preventDefault: event.preventDefault\n };\n\n /**\n * Raised when a contextmenu event occurs in the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-contextmenu\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the contextmenu event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-contextmenu', eventArgs );\n\n event.preventDefault = eventArgs.preventDefault;\n}\n\nfunction onCanvasKeyDown( event ) {\n var canvasKeyDownEventArgs = {\n originalEvent: event.originalEvent,\n preventDefaultAction: false,\n preventVerticalPan: event.preventVerticalPan || !this.panVertical,\n preventHorizontalPan: event.preventHorizontalPan || !this.panHorizontal\n };\n\n /**\n * Raised when a keyboard key is pressed and the focus is on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-key\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default keyboard behaviour. Default: false.\n * @property {Boolean} preventVerticalPan - Set to true to prevent keyboard vertical panning. Default: false.\n * @property {Boolean} preventHorizontalPan - Set to true to prevent keyboard horizontal panning. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n\n this.raiseEvent('canvas-key', canvasKeyDownEventArgs);\n\n if ( !canvasKeyDownEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n switch( event.keyCode ){\n case 38://up arrow/shift uparrow\n if (!canvasKeyDownEventArgs.preventVerticalPan) {\n if ( event.shift ) {\n this.viewport.zoomBy(1.1);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -this.pixelsPerArrowPress)));\n }\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 40://down arrow/shift downarrow\n if (!canvasKeyDownEventArgs.preventVerticalPan) {\n if ( event.shift ) {\n this.viewport.zoomBy(0.9);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, this.pixelsPerArrowPress)));\n }\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 37://left arrow\n if (!canvasKeyDownEventArgs.preventHorizontalPan) {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-this.pixelsPerArrowPress, 0)));\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 39://right arrow\n if (!canvasKeyDownEventArgs.preventHorizontalPan) {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(this.pixelsPerArrowPress, 0)));\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 187://=|+\n this.viewport.zoomBy(1.1);\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 189://-|_\n this.viewport.zoomBy(0.9);\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 48://0|)\n this.viewport.goHome();\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 87://W/w\n if (!canvasKeyDownEventArgs.preventVerticalPan) {\n if ( event.shift ) {\n this.viewport.zoomBy(1.1);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40)));\n }\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 83://S/s\n if (!canvasKeyDownEventArgs.preventVerticalPan) {\n if ( event.shift ) {\n this.viewport.zoomBy(0.9);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40)));\n }\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 65://a/A\n if (!canvasKeyDownEventArgs.preventHorizontalPan) {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 68://d/D\n if (!canvasKeyDownEventArgs.preventHorizontalPan) {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));\n this.viewport.applyConstraints();\n }\n event.preventDefault = true;\n break;\n case 82: //r - clockwise rotation/R - counterclockwise rotation\n if(event.shift){\n if(this.viewport.flipped){\n this.viewport.setRotation(this.viewport.getRotation() + this.rotationIncrement);\n } else{\n this.viewport.setRotation(this.viewport.getRotation() - this.rotationIncrement);\n }\n }else{\n if(this.viewport.flipped){\n this.viewport.setRotation(this.viewport.getRotation() - this.rotationIncrement);\n } else{\n this.viewport.setRotation(this.viewport.getRotation() + this.rotationIncrement);\n }\n }\n this.viewport.applyConstraints();\n event.preventDefault = true;\n break;\n case 70: //f/F\n this.viewport.toggleFlip();\n event.preventDefault = true;\n break;\n case 74: //j - previous image source\n this.goToPreviousPage();\n break;\n case 75: //k - next image source\n this.goToNextPage();\n break;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n event.preventDefault = false;\n break;\n }\n } else {\n event.preventDefault = false;\n }\n}\n\nfunction onCanvasKeyPress( event ) {\n var canvasKeyPressEventArgs = {\n originalEvent: event.originalEvent,\n };\n\n /**\n * Raised when a keyboard key is pressed and the focus is on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-key-press\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n\n this.raiseEvent('canvas-key-press', canvasKeyPressEventArgs);\n}\n\nfunction onCanvasClick( event ) {\n var gestureSettings;\n\n var haveKeyboardFocus = document.activeElement === this.canvas;\n\n // If we don't have keyboard focus, request it.\n if ( !haveKeyboardFocus ) {\n this.canvas.focus();\n }\n if(this.viewport.flipped){\n event.position.x = this.viewport.getContainerSize().x - event.position.x;\n }\n\n var canvasClickEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n quick: event.quick,\n shift: event.shift,\n originalEvent: event.originalEvent,\n originalTarget: event.originalTarget,\n preventDefaultAction: false\n };\n\n /**\n * Raised when a mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-click\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Element} originalTarget - The DOM element clicked on.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n\n this.raiseEvent( 'canvas-click', canvasClickEventArgs);\n\n\n if ( !canvasClickEventArgs.preventDefaultAction && this.viewport && event.quick ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n\n if (gestureSettings.clickToZoom === true){\n this.viewport.zoomBy(\n event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,\n gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\n );\n this.viewport.applyConstraints();\n }\n\n if( gestureSettings.dblClickDragToZoom){\n if(THIS[ this.hash ].draggingToZoom === true){\n THIS[ this.hash ].lastClickTime = null;\n THIS[ this.hash ].draggingToZoom = false;\n }\n else{\n THIS[ this.hash ].lastClickTime = $.now();\n }\n }\n\n }\n}\n\nfunction onCanvasDblClick( event ) {\n var gestureSettings;\n\n var canvasDblClickEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n\n /**\n * Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-double-click\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default double tap to zoom behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-double-click', canvasDblClickEventArgs);\n\n if ( !canvasDblClickEventArgs.preventDefaultAction && this.viewport ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.dblClickToZoom ) {\n this.viewport.zoomBy(\n event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,\n gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\n );\n this.viewport.applyConstraints();\n }\n }\n}\n\nfunction onCanvasDrag( event ) {\n var gestureSettings;\n\n var canvasDragEventArgs = {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n delta: event.delta,\n speed: event.speed,\n direction: event.direction,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n\n /**\n * Raised when a mouse or touch drag operation occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-drag\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag.\n * @property {Number} speed - Current computed speed, in pixels per second.\n * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default drag to pan behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-drag', canvasDragEventArgs);\n\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n\n if(!canvasDragEventArgs.preventDefaultAction && this.viewport){\n\n if (gestureSettings.dblClickDragToZoom && THIS[ this.hash ].draggingToZoom){\n var factor = Math.pow( this.zoomPerDblClickDrag, event.delta.y / 50);\n this.viewport.zoomBy(factor);\n }\n else if (gestureSettings.dragToPan && !THIS[ this.hash ].draggingToZoom) {\n if( !this.panHorizontal ){\n event.delta.x = 0;\n }\n if( !this.panVertical ){\n event.delta.y = 0;\n }\n if(this.viewport.flipped){\n event.delta.x = -event.delta.x;\n }\n\n if( this.constrainDuringPan ){\n var delta = this.viewport.deltaPointsFromPixels( event.delta.negate() );\n\n this.viewport.centerSpringX.target.value += delta.x;\n this.viewport.centerSpringY.target.value += delta.y;\n\n var constrainedBounds = this.viewport.getConstrainedBounds();\n\n this.viewport.centerSpringX.target.value -= delta.x;\n this.viewport.centerSpringY.target.value -= delta.y;\n\n if (constrainedBounds.xConstrained) {\n event.delta.x = 0;\n }\n\n if (constrainedBounds.yConstrained) {\n event.delta.y = 0;\n }\n }\n this.viewport.panBy( this.viewport.deltaPointsFromPixels( event.delta.negate() ), gestureSettings.flickEnabled && !this.constrainDuringPan);\n }\n\n }\n\n}\n\nfunction onCanvasDragEnd( event ) {\n var gestureSettings;\n var canvasDragEndEventArgs = {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n speed: event.speed,\n direction: event.direction,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n\n /**\n * Raised when a mouse or touch drag operation ends on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-drag-end\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} speed - Speed at the end of a drag gesture, in pixels per second.\n * @property {Number} direction - Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default drag-end flick behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('canvas-drag-end', canvasDragEndEventArgs);\n\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n\n if (!canvasDragEndEventArgs.preventDefaultAction && this.viewport) {\n if ( !THIS[ this.hash ].draggingToZoom &&\n gestureSettings.flickEnabled &&\n event.speed >= gestureSettings.flickMinSpeed) {\n var amplitudeX = 0;\n if (this.panHorizontal) {\n amplitudeX = gestureSettings.flickMomentum * event.speed *\n Math.cos(event.direction);\n }\n var amplitudeY = 0;\n if (this.panVertical) {\n amplitudeY = gestureSettings.flickMomentum * event.speed *\n Math.sin(event.direction);\n }\n var center = this.viewport.pixelFromPoint(\n this.viewport.getCenter(true));\n var target = this.viewport.pointFromPixel(\n new $.Point(center.x - amplitudeX, center.y - amplitudeY));\n this.viewport.panTo(target, false);\n }\n this.viewport.applyConstraints();\n }\n\n\n if( gestureSettings.dblClickDragToZoom && THIS[ this.hash ].draggingToZoom === true ){\n THIS[ this.hash ].draggingToZoom = false;\n }\n\n\n}\n\nfunction onCanvasEnter( event ) {\n /**\n * Raised when a pointer enters the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-enter\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-enter', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasLeave( event ) {\n /**\n * Raised when a pointer leaves the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-exit\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-exit', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasPress( event ) {\n var gestureSettings;\n\n /**\n * Raised when the primary mouse button is pressed or touch starts on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-press\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-press', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n insideElementPressed: event.insideElementPressed,\n insideElementReleased: event.insideElementReleased,\n originalEvent: event.originalEvent\n });\n\n\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.dblClickDragToZoom ){\n var lastClickTime = THIS[ this.hash ].lastClickTime;\n var currClickTime = $.now();\n\n if ( lastClickTime === null) {\n return;\n }\n\n if ((currClickTime - lastClickTime) < this.dblClickTimeThreshold) {\n THIS[ this.hash ].draggingToZoom = true;\n }\n\n THIS[ this.hash ].lastClickTime = null;\n }\n\n}\n\nfunction onCanvasRelease( event ) {\n /**\n * Raised when the primary mouse button is released or touch ends on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-release\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-release', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n insideElementPressed: event.insideElementPressed,\n insideElementReleased: event.insideElementReleased,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasNonPrimaryPress( event ) {\n /**\n * Raised when any non-primary pointer button is pressed on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-nonprimary-press\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {Number} button - Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @property {Number} buttons - Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-nonprimary-press', {\n tracker: event.eventSource,\n position: event.position,\n pointerType: event.pointerType,\n button: event.button,\n buttons: event.buttons,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasNonPrimaryRelease( event ) {\n /**\n * Raised when any non-primary pointer button is released on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-nonprimary-release\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {Number} button - Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @property {Number} buttons - Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-nonprimary-release', {\n tracker: event.eventSource,\n position: event.position,\n pointerType: event.pointerType,\n button: event.button,\n buttons: event.buttons,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasPinch( event ) {\n var gestureSettings,\n centerPt,\n lastCenterPt,\n panByPt;\n\n var canvasPinchEventArgs = {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n gesturePoints: event.gesturePoints,\n lastCenter: event.lastCenter,\n center: event.center,\n lastDistance: event.lastDistance,\n distance: event.distance,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultPanAction: false,\n preventDefaultZoomAction: false,\n preventDefaultRotateAction: false\n };\n\n /**\n * Raised when a pinch event occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-pinch\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {Array.} gesturePoints - Gesture points associated with the gesture. Velocity data can be found here.\n * @property {OpenSeadragon.Point} lastCenter - The previous center point of the two pinch contact points relative to the tracked element.\n * @property {OpenSeadragon.Point} center - The center point of the two pinch contact points relative to the tracked element.\n * @property {Number} lastDistance - The previous distance between the two pinch contact points in CSS pixels.\n * @property {Number} distance - The distance between the two pinch contact points in CSS pixels.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultPanAction - Set to true to prevent default pinch to pan behaviour. Default: false.\n * @property {Boolean} preventDefaultZoomAction - Set to true to prevent default pinch to zoom behaviour. Default: false.\n * @property {Boolean} preventDefaultRotateAction - Set to true to prevent default pinch to rotate behaviour. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('canvas-pinch', canvasPinchEventArgs);\n\n if ( this.viewport ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.pinchToZoom &&\n (!canvasPinchEventArgs.preventDefaultPanAction || !canvasPinchEventArgs.preventDefaultZoomAction) ) {\n centerPt = this.viewport.pointFromPixel( event.center, true );\n if ( gestureSettings.zoomToRefPoint && !canvasPinchEventArgs.preventDefaultPanAction ) {\n lastCenterPt = this.viewport.pointFromPixel( event.lastCenter, true );\n panByPt = lastCenterPt.minus( centerPt );\n if( !this.panHorizontal ) {\n panByPt.x = 0;\n }\n if( !this.panVertical ) {\n panByPt.y = 0;\n }\n this.viewport.panBy(panByPt, true);\n }\n if ( !canvasPinchEventArgs.preventDefaultZoomAction ) {\n this.viewport.zoomBy( event.distance / event.lastDistance, centerPt, true );\n }\n this.viewport.applyConstraints();\n }\n if ( gestureSettings.pinchRotate && !canvasPinchEventArgs.preventDefaultRotateAction ) {\n // Pinch rotate\n var angle1 = Math.atan2(event.gesturePoints[0].currentPos.y - event.gesturePoints[1].currentPos.y,\n event.gesturePoints[0].currentPos.x - event.gesturePoints[1].currentPos.x);\n var angle2 = Math.atan2(event.gesturePoints[0].lastPos.y - event.gesturePoints[1].lastPos.y,\n event.gesturePoints[0].lastPos.x - event.gesturePoints[1].lastPos.x);\n centerPt = this.viewport.pointFromPixel( event.center, true );\n this.viewport.rotateTo(this.viewport.getRotation(true) + ((angle1 - angle2) * (180 / Math.PI)), centerPt, true);\n }\n }\n}\n\nfunction onCanvasFocus( event ) {\n\n /**\n * Raised when the {@link OpenSeadragon.Viewer#canvas} element gets keyboard focus.\n *\n * @event canvas-focus\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-focus', {\n tracker: event.eventSource,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasBlur( event ) {\n /**\n * Raised when the {@link OpenSeadragon.Viewer#canvas} element loses keyboard focus.\n *\n * @event canvas-blur\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-blur', {\n tracker: event.eventSource,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasScroll( event ) {\n var canvasScrollEventArgs,\n gestureSettings,\n factor,\n thisScrollTime,\n deltaScrollTime;\n\n /* Certain scroll devices fire the scroll event way too fast so we are injecting a simple adjustment to keep things\n * partially normalized. If we have already fired an event within the last 'minScrollDelta' milliseconds we skip\n * this one and wait for the next event. */\n thisScrollTime = $.now();\n deltaScrollTime = thisScrollTime - this._lastScrollTime;\n if (deltaScrollTime > this.minScrollDeltaTime) {\n this._lastScrollTime = thisScrollTime;\n\n canvasScrollEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n scroll: event.scroll,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false,\n preventDefault: true\n };\n\n /**\n * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#canvas} element (mouse wheel).\n *\n * @event canvas-scroll\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} scroll - The scroll delta for the event.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default scroll to zoom behaviour. Default: false.\n * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the wheel event. Default: true.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('canvas-scroll', canvasScrollEventArgs );\n\n if ( !canvasScrollEventArgs.preventDefaultAction && this.viewport ) {\n if(this.viewport.flipped){\n event.position.x = this.viewport.getContainerSize().x - event.position.x;\n }\n\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.scrollToZoom ) {\n factor = Math.pow( this.zoomPerScroll, event.scroll );\n this.viewport.zoomBy(\n factor,\n gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null\n );\n this.viewport.applyConstraints();\n }\n }\n\n event.preventDefault = canvasScrollEventArgs.preventDefault;\n } else {\n event.preventDefault = true;\n }\n}\n\nfunction onContainerEnter( event ) {\n THIS[ this.hash ].mouseInside = true;\n abortControlsAutoHide( this );\n /**\n * Raised when the cursor enters the {@link OpenSeadragon.Viewer#container} element.\n *\n * @event container-enter\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'container-enter', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onContainerLeave( event ) {\n if ( event.pointers < 1 ) {\n THIS[ this.hash ].mouseInside = false;\n if ( !THIS[ this.hash ].animating ) {\n beginControlsAutoHide( this );\n }\n }\n /**\n * Raised when the cursor leaves the {@link OpenSeadragon.Viewer#container} element.\n *\n * @event container-exit\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. Deprecated. Use buttons instead.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'container-exit', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Page update routines ( aka Views - for future reference )\n///////////////////////////////////////////////////////////////////////////////\n\nfunction updateMulti( viewer ) {\n updateOnce( viewer );\n\n // Request the next frame, unless we've been closed\n if ( viewer.isOpen() ) {\n viewer._updateRequestId = scheduleUpdate( viewer, updateMulti );\n } else {\n viewer._updateRequestId = false;\n }\n}\n\nfunction doViewerResize(viewer, containerSize){\n var viewport = viewer.viewport;\n var zoom = viewport.getZoom();\n var center = viewport.getCenter();\n viewport.resize(containerSize, viewer.preserveImageSizeOnResize);\n viewport.panTo(center, true);\n var resizeRatio;\n if (viewer.preserveImageSizeOnResize) {\n resizeRatio = THIS[viewer.hash].prevContainerSize.x / containerSize.x;\n } else {\n var origin = new $.Point(0, 0);\n var prevDiag = new $.Point(THIS[viewer.hash].prevContainerSize.x, THIS[viewer.hash].prevContainerSize.y).distanceTo(origin);\n var newDiag = new $.Point(containerSize.x, containerSize.y).distanceTo(origin);\n resizeRatio = newDiag / prevDiag * THIS[viewer.hash].prevContainerSize.x / containerSize.x;\n }\n viewport.zoomTo(zoom * resizeRatio, null, true);\n THIS[viewer.hash].prevContainerSize = containerSize;\n THIS[viewer.hash].forceRedraw = true;\n THIS[viewer.hash].needsResize = false;\n THIS[viewer.hash].forceResize = false;\n}\nfunction updateOnce( viewer ) {\n\n //viewer.profiler.beginUpdate();\n\n if (viewer._opening || !THIS[viewer.hash]) {\n return;\n }\n if (viewer.autoResize || THIS[viewer.hash].forceResize){\n var containerSize;\n if(viewer._autoResizePolling){\n containerSize = _getSafeElemSize(viewer.container);\n var prevContainerSize = THIS[viewer.hash].prevContainerSize;\n if (!containerSize.equals(prevContainerSize)) {\n THIS[viewer.hash].needsResize = true;\n }\n }\n if(THIS[viewer.hash].needsResize){\n doViewerResize(viewer, containerSize || _getSafeElemSize(viewer.container));\n }\n\n }\n\n\n\n var viewportChange = viewer.viewport.update();\n var animated = viewer.world.update() || viewportChange;\n\n if (viewportChange) {\n /**\n * Raised when any spring animation update occurs (zoom, pan, etc.),\n * before the viewer has drawn the new location.\n *\n * @event viewport-change\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent('viewport-change');\n }\n\n if( viewer.referenceStrip ){\n animated = viewer.referenceStrip.update( viewer.viewport ) || animated;\n }\n\n var currentAnimating = THIS[ viewer.hash ].animating;\n\n if ( !currentAnimating && animated ) {\n /**\n * Raised when any spring animation starts (zoom, pan, etc.).\n *\n * @event animation-start\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation-start\" );\n abortControlsAutoHide( viewer );\n }\n\n var isAnimationFinished = currentAnimating && !animated;\n\n if ( isAnimationFinished ) {\n THIS[ viewer.hash ].animating = false;\n }\n\n if ( animated || isAnimationFinished || THIS[ viewer.hash ].forceRedraw || viewer.world.needsDraw() ) {\n drawWorld( viewer );\n viewer._drawOverlays();\n if( viewer.navigator ){\n viewer.navigator.update( viewer.viewport );\n }\n\n THIS[ viewer.hash ].forceRedraw = false;\n\n if (animated) {\n /**\n * Raised when any spring animation update occurs (zoom, pan, etc.),\n * after the viewer has drawn the new location.\n *\n * @event animation\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation\" );\n }\n }\n\n if ( isAnimationFinished ) {\n /**\n * Raised when any spring animation ends (zoom, pan, etc.).\n *\n * @event animation-finish\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation-finish\" );\n\n if ( !THIS[ viewer.hash ].mouseInside ) {\n beginControlsAutoHide( viewer );\n }\n }\n\n THIS[ viewer.hash ].animating = animated;\n\n //viewer.profiler.endUpdate();\n}\n\nfunction drawWorld( viewer ) {\n viewer.imageLoader.clear();\n viewer.drawer.clear();\n viewer.world.draw();\n\n /**\n * - Needs documentation -\n *\n * @event update-viewport\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( 'update-viewport', {} );\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// Navigation Controls\n///////////////////////////////////////////////////////////////////////////////\nfunction resolveUrl( prefix, url ) {\n return prefix ? prefix + url : url;\n}\n\n\n\nfunction beginZoomingIn() {\n THIS[ this.hash ].lastZoomTime = $.now();\n THIS[ this.hash ].zoomFactor = this.zoomPerSecond;\n THIS[ this.hash ].zooming = true;\n scheduleZoom( this );\n}\n\n\nfunction beginZoomingOut() {\n THIS[ this.hash ].lastZoomTime = $.now();\n THIS[ this.hash ].zoomFactor = 1.0 / this.zoomPerSecond;\n THIS[ this.hash ].zooming = true;\n scheduleZoom( this );\n}\n\n\nfunction endZooming() {\n THIS[ this.hash ].zooming = false;\n}\n\n\nfunction scheduleZoom( viewer ) {\n $.requestAnimationFrame( $.delegate( viewer, doZoom ) );\n}\n\n\nfunction doZoom() {\n var currentTime,\n deltaTime,\n adjustedFactor;\n\n if ( THIS[ this.hash ].zooming && this.viewport) {\n currentTime = $.now();\n deltaTime = currentTime - THIS[ this.hash ].lastZoomTime;\n adjustedFactor = Math.pow( THIS[ this.hash ].zoomFactor, deltaTime / 1000 );\n\n this.viewport.zoomBy( adjustedFactor );\n this.viewport.applyConstraints();\n THIS[ this.hash ].lastZoomTime = currentTime;\n scheduleZoom( this );\n }\n}\n\n\nfunction doSingleZoomIn() {\n if ( this.viewport ) {\n THIS[ this.hash ].zooming = false;\n this.viewport.zoomBy(\n this.zoomPerClick / 1.0\n );\n this.viewport.applyConstraints();\n }\n}\n\n\nfunction doSingleZoomOut() {\n if ( this.viewport ) {\n THIS[ this.hash ].zooming = false;\n this.viewport.zoomBy(\n 1.0 / this.zoomPerClick\n );\n this.viewport.applyConstraints();\n }\n}\n\n\nfunction lightUp() {\n if (this.buttonGroup) {\n this.buttonGroup.emulateEnter();\n this.buttonGroup.emulateLeave();\n }\n}\n\n\nfunction onHome() {\n if ( this.viewport ) {\n this.viewport.goHome();\n }\n}\n\n\nfunction onFullScreen() {\n if ( this.isFullPage() && !$.isFullScreen() ) {\n // Is fullPage but not fullScreen\n this.setFullPage( false );\n } else {\n this.setFullScreen( !this.isFullPage() );\n }\n // correct for no mouseout event on change\n if ( this.buttonGroup ) {\n this.buttonGroup.emulateLeave();\n }\n this.fullPageButton.element.focus();\n if ( this.viewport ) {\n this.viewport.applyConstraints();\n }\n}\n\nfunction onRotateLeft() {\n if ( this.viewport ) {\n var currRotation = this.viewport.getRotation();\n\n if ( this.viewport.flipped ){\n currRotation += this.rotationIncrement;\n } else {\n currRotation -= this.rotationIncrement;\n }\n this.viewport.setRotation(currRotation);\n }\n}\n\nfunction onRotateRight() {\n if ( this.viewport ) {\n var currRotation = this.viewport.getRotation();\n\n if ( this.viewport.flipped ){\n currRotation -= this.rotationIncrement;\n } else {\n currRotation += this.rotationIncrement;\n }\n this.viewport.setRotation(currRotation);\n }\n}\n/**\n * Note: When pressed flip control button\n */\nfunction onFlip() {\n this.viewport.toggleFlip();\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Navigator\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Navigator\n * @classdesc The Navigator provides a small view of the current image as fixed\n * while representing the viewport as a moving box serving as a frame\n * of reference in the larger viewport as to which portion of the image\n * is currently being examined. The navigator's viewport can be interacted\n * with using the keyboard or the mouse.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.Viewer\n * @extends OpenSeadragon.EventSource\n * @param {Object} options - Navigator options\n * @param {Element} [options.element] - An element to use for the navigator.\n * @param {String} [options.id] - Id of the element to use for the navigator. However, this is ignored if {@link options.element} is provided.\n */\n$.Navigator = function( options ){\n\n var viewer = options.viewer,\n _this = this,\n viewerSize,\n navigatorSize;\n\n //We may need to create a new element and id if they did not\n //provide the id for the existing element or the element itself\n if( options.element || options.id ){\n if ( options.element ) {\n if ( options.id ){\n $.console.warn(\"Given option.id for Navigator was ignored since option.element was provided and is being used instead.\");\n }\n\n // Don't overwrite the element's id if it has one already\n if ( options.element.id ) {\n options.id = options.element.id;\n } else {\n options.id = 'navigator-' + $.now();\n }\n\n this.element = options.element;\n } else {\n this.element = document.getElementById( options.id );\n }\n\n options.controlOptions = {\n anchor: $.ControlAnchor.NONE,\n attachToViewer: false,\n autoFade: false\n };\n } else {\n options.id = 'navigator-' + $.now();\n this.element = $.makeNeutralElement( \"div\" );\n options.controlOptions = {\n anchor: $.ControlAnchor.TOP_RIGHT,\n attachToViewer: true,\n autoFade: options.autoFade\n };\n\n if( options.position ){\n if( 'BOTTOM_RIGHT' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.BOTTOM_RIGHT;\n } else if( 'BOTTOM_LEFT' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.BOTTOM_LEFT;\n } else if( 'TOP_RIGHT' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.TOP_RIGHT;\n } else if( 'TOP_LEFT' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.TOP_LEFT;\n } else if( 'ABSOLUTE' === options.position ){\n options.controlOptions.anchor = $.ControlAnchor.ABSOLUTE;\n options.controlOptions.top = options.top;\n options.controlOptions.left = options.left;\n options.controlOptions.height = options.height;\n options.controlOptions.width = options.width;\n }\n }\n }\n this.element.id = options.id;\n this.element.className += ' navigator';\n\n options = $.extend( true, {\n sizeRatio: $.DEFAULT_SETTINGS.navigatorSizeRatio\n }, options, {\n element: this.element,\n tabIndex: -1, // No keyboard navigation, omit from tab order\n //These need to be overridden to prevent recursion since\n //the navigator is a viewer and a viewer has a navigator\n showNavigator: false,\n mouseNavEnabled: false,\n showNavigationControl: false,\n showSequenceControl: false,\n immediateRender: true,\n blendTime: 0,\n animationTime: options.animationTime,\n // disable autoResize since resize behavior is implemented differently by the navigator\n autoResize: false,\n // prevent resizing the navigator from adding unwanted space around the image\n minZoomImageRatio: 1.0,\n background: options.background,\n opacity: options.opacity,\n borderColor: options.borderColor,\n displayRegionColor: options.displayRegionColor\n });\n\n options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;\n\n $.setElementTouchActionNone( this.element );\n\n this.borderWidth = 2;\n //At some browser magnification levels the display regions lines up correctly, but at some there appears to\n //be a one pixel gap.\n this.fudge = new $.Point(1, 1);\n this.totalBorderWidths = new $.Point(this.borderWidth * 2, this.borderWidth * 2).minus(this.fudge);\n\n\n if ( options.controlOptions.anchor !== $.ControlAnchor.NONE ) {\n (function( style, borderWidth ){\n style.margin = '0px';\n style.border = borderWidth + 'px solid ' + options.borderColor;\n style.padding = '0px';\n style.background = options.background;\n style.opacity = options.opacity;\n style.overflow = 'hidden';\n }( this.element.style, this.borderWidth));\n }\n\n this.displayRegion = $.makeNeutralElement( \"div\" );\n this.displayRegion.id = this.element.id + '-displayregion';\n this.displayRegion.className = 'displayregion';\n\n (function( style, borderWidth ){\n style.position = 'relative';\n style.top = '0px';\n style.left = '0px';\n style.fontSize = '0px';\n style.overflow = 'hidden';\n style.border = borderWidth + 'px solid ' + options.displayRegionColor;\n style.margin = '0px';\n style.padding = '0px';\n //TODO: IE doesn't like this property being set\n //try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/}\n\n style.background = 'transparent';\n\n // We use square bracket notation on the statement below, because float is a keyword.\n // This is important for the Google Closure compiler, if nothing else.\n /*jshint sub:true */\n style['float'] = 'left'; //Webkit\n\n style.cssFloat = 'left'; //Firefox\n style.styleFloat = 'left'; //IE\n style.zIndex = 999999999;\n style.cursor = 'default';\n style.boxSizing = 'content-box';\n }( this.displayRegion.style, this.borderWidth ));\n $.setElementPointerEventsNone( this.displayRegion );\n $.setElementTouchActionNone( this.displayRegion );\n\n this.displayRegionContainer = $.makeNeutralElement(\"div\");\n this.displayRegionContainer.id = this.element.id + '-displayregioncontainer';\n this.displayRegionContainer.className = \"displayregioncontainer\";\n this.displayRegionContainer.style.width = \"100%\";\n this.displayRegionContainer.style.height = \"100%\";\n $.setElementPointerEventsNone( this.displayRegionContainer );\n $.setElementTouchActionNone( this.displayRegionContainer );\n\n viewer.addControl(\n this.element,\n options.controlOptions\n );\n\n this._resizeWithViewer = options.controlOptions.anchor !== $.ControlAnchor.ABSOLUTE &&\n options.controlOptions.anchor !== $.ControlAnchor.NONE;\n\n if (options.width && options.height) {\n this.setWidth(options.width);\n this.setHeight(options.height);\n } else if ( this._resizeWithViewer ) {\n viewerSize = $.getElementSize( viewer.element );\n this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px';\n this.element.style.width = Math.round( viewerSize.x * options.sizeRatio ) + 'px';\n this.oldViewerSize = viewerSize;\n navigatorSize = $.getElementSize( this.element );\n this.elementArea = navigatorSize.x * navigatorSize.y;\n }\n\n this.oldContainerSize = new $.Point( 0, 0 );\n\n $.Viewer.apply( this, [ options ] );\n\n this.displayRegionContainer.appendChild(this.displayRegion);\n this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer);\n\n function rotate(degrees, immediately) {\n _setTransformRotate(_this.displayRegionContainer, degrees);\n _setTransformRotate(_this.displayRegion, -degrees);\n _this.viewport.setRotation(degrees, immediately);\n }\n if (options.navigatorRotate) {\n var degrees = options.viewer.viewport ?\n options.viewer.viewport.getRotation() :\n options.viewer.degrees || 0;\n\n rotate(degrees, true);\n options.viewer.addHandler(\"rotate\", function (args) {\n rotate(args.degrees, args.immediately);\n });\n }\n\n\n // Remove the base class' (Viewer's) innerTracker and replace it with our own\n this.innerTracker.destroy();\n this.innerTracker = new $.MouseTracker({\n userData: 'Navigator.innerTracker',\n element: this.element, //this.canvas,\n dragHandler: $.delegate( this, onCanvasDrag ),\n clickHandler: $.delegate( this, onCanvasClick ),\n releaseHandler: $.delegate( this, onCanvasRelease ),\n scrollHandler: $.delegate( this, onCanvasScroll ),\n preProcessEventHandler: function (eventInfo) {\n if (eventInfo.eventType === 'wheel') {\n //don't scroll the page up and down if the user is scrolling\n //in the navigator\n eventInfo.preventDefault = true;\n }\n }\n });\n this.outerTracker.userData = 'Navigator.outerTracker';\n\n // this.innerTracker is attached to this.element...we need to allow pointer\n // events to pass through this Viewer's canvas/container elements so implicit\n // pointer capture works on touch devices\n //TODO an alternative is to attach the new MouseTracker to this.canvas...not\n // sure why it isn't already (see MouseTracker constructor call above)\n $.setElementPointerEventsNone( this.canvas );\n $.setElementPointerEventsNone( this.container );\n\n this.addHandler(\"reset-size\", function() {\n if (_this.viewport) {\n _this.viewport.goHome(true);\n }\n });\n\n viewer.world.addHandler(\"item-index-change\", function(event) {\n window.setTimeout(function(){\n var item = _this.world.getItemAt(event.previousIndex);\n _this.world.setItemIndex(item, event.newIndex);\n }, 1);\n });\n\n viewer.world.addHandler(\"remove-item\", function(event) {\n var theirItem = event.item;\n var myItem = _this._getMatchingItem(theirItem);\n if (myItem) {\n _this.world.removeItem(myItem);\n }\n });\n\n this.update(viewer.viewport);\n};\n\n$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{\n\n /**\n * Used to notify the navigator when its size has changed.\n * Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable.\n * @function\n */\n updateSize: function () {\n if ( this.viewport ) {\n var containerSize = new $.Point(\n (this.container.clientWidth === 0 ? 1 : this.container.clientWidth),\n (this.container.clientHeight === 0 ? 1 : this.container.clientHeight)\n );\n\n if ( !containerSize.equals( this.oldContainerSize ) ) {\n this.viewport.resize( containerSize, true );\n this.viewport.goHome(true);\n this.oldContainerSize = containerSize;\n this.drawer.clear();\n this.world.draw();\n }\n }\n },\n\n /**\n * Explicitly sets the width of the navigator, in web coordinates. Disables automatic resizing.\n * @param {Number|String} width - the new width, either a number of pixels or a CSS string, such as \"100%\"\n */\n setWidth: function(width) {\n this.width = width;\n this.element.style.width = typeof (width) === \"number\" ? (width + 'px') : width;\n this._resizeWithViewer = false;\n this.updateSize();\n },\n\n /**\n * Explicitly sets the height of the navigator, in web coordinates. Disables automatic resizing.\n * @param {Number|String} height - the new height, either a number of pixels or a CSS string, such as \"100%\"\n */\n setHeight: function(height) {\n this.height = height;\n this.element.style.height = typeof (height) === \"number\" ? (height + 'px') : height;\n this._resizeWithViewer = false;\n this.updateSize();\n },\n\n /**\n * Flip navigator element\n * @param {Boolean} state - Flip state to set.\n */\n setFlip: function(state) {\n this.viewport.setFlip(state);\n\n this.setDisplayTransform(this.viewer.viewport.getFlip() ? \"scale(-1,1)\" : \"scale(1,1)\");\n return this;\n },\n\n setDisplayTransform: function(rule) {\n setElementTransform(this.displayRegion, rule);\n setElementTransform(this.canvas, rule);\n setElementTransform(this.element, rule);\n },\n\n /**\n * Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs.\n * @function\n * @param {OpenSeadragon.Viewport} The viewport this navigator is tracking.\n */\n update: function( viewport ) {\n\n var viewerSize,\n newWidth,\n newHeight,\n bounds,\n topleft,\n bottomright;\n\n viewerSize = $.getElementSize( this.viewer.element );\n if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) {\n this.oldViewerSize = viewerSize;\n\n if ( this.maintainSizeRatio || !this.elementArea) {\n newWidth = viewerSize.x * this.sizeRatio;\n newHeight = viewerSize.y * this.sizeRatio;\n } else {\n newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y));\n newHeight = this.elementArea / newWidth;\n }\n\n this.element.style.width = Math.round( newWidth ) + 'px';\n this.element.style.height = Math.round( newHeight ) + 'px';\n\n if (!this.elementArea) {\n this.elementArea = newWidth * newHeight;\n }\n\n this.updateSize();\n }\n\n if (viewport && this.viewport) {\n bounds = viewport.getBoundsNoRotate(true);\n topleft = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false);\n bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false)\n .minus( this.totalBorderWidths );\n\n if (!this.navigatorRotate) {\n var degrees = viewport.getRotation(true);\n _setTransformRotate(this.displayRegion, -degrees);\n }\n\n //update style for navigator-box\n var style = this.displayRegion.style;\n style.display = this.world.getItemCount() ? 'block' : 'none';\n\n style.top = topleft.y.toFixed(2) + \"px\";\n style.left = topleft.x.toFixed(2) + \"px\";\n\n var width = bottomright.x - topleft.x;\n var height = bottomright.y - topleft.y;\n // make sure width and height are non-negative so IE doesn't throw\n style.width = Math.round( Math.max( width, 0 ) ) + 'px';\n style.height = Math.round( Math.max( height, 0 ) ) + 'px';\n }\n\n },\n\n // overrides Viewer.addTiledImage\n addTiledImage: function(options) {\n var _this = this;\n\n var original = options.originalTiledImage;\n delete options.original;\n\n var optionsClone = $.extend({}, options, {\n success: function(event) {\n var myItem = event.item;\n myItem._originalForNavigator = original;\n _this._matchBounds(myItem, original, true);\n _this._matchOpacity(myItem, original);\n _this._matchCompositeOperation(myItem, original);\n\n function matchBounds() {\n _this._matchBounds(myItem, original);\n }\n\n function matchOpacity() {\n _this._matchOpacity(myItem, original);\n }\n\n function matchCompositeOperation() {\n _this._matchCompositeOperation(myItem, original);\n }\n\n original.addHandler('bounds-change', matchBounds);\n original.addHandler('clip-change', matchBounds);\n original.addHandler('opacity-change', matchOpacity);\n original.addHandler('composite-operation-change', matchCompositeOperation);\n }\n });\n\n return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]);\n },\n\n destroy: function() {\n return $.Viewer.prototype.destroy.apply(this);\n },\n\n // private\n _getMatchingItem: function(theirItem) {\n var count = this.world.getItemCount();\n var item;\n for (var i = 0; i < count; i++) {\n item = this.world.getItemAt(i);\n if (item._originalForNavigator === theirItem) {\n return item;\n }\n }\n\n return null;\n },\n\n // private\n _matchBounds: function(myItem, theirItem, immediately) {\n var bounds = theirItem.getBoundsNoRotate();\n myItem.setPosition(bounds.getTopLeft(), immediately);\n myItem.setWidth(bounds.width, immediately);\n myItem.setRotation(theirItem.getRotation(), immediately);\n myItem.setClip(theirItem.getClip());\n myItem.setFlip(theirItem.getFlip());\n },\n\n // private\n _matchOpacity: function(myItem, theirItem) {\n myItem.setOpacity(theirItem.opacity);\n },\n\n // private\n _matchCompositeOperation: function(myItem, theirItem) {\n myItem.setCompositeOperation(theirItem.compositeOperation);\n }\n});\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasClick( event ) {\n var canvasClickEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n quick: event.quick,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n /**\n * Raised when a click event occurs on the {@link OpenSeadragon.Viewer#navigator} element.\n *\n * @event navigator-click\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.\n */\n\n this.viewer.raiseEvent('navigator-click', canvasClickEventArgs);\n\n if ( !canvasClickEventArgs.preventDefaultAction && event.quick && this.viewer.viewport && (this.panVertical || this.panHorizontal)) {\n if(this.viewer.viewport.flipped) {\n event.position.x = this.viewport.getContainerSize().x - event.position.x;\n }\n var target = this.viewport.pointFromPixel(event.position);\n if (!this.panVertical) {\n // perform only horizonal pan\n target.y = this.viewer.viewport.getCenter(true).y;\n } else if (!this.panHorizontal) {\n // perform only vertical pan\n target.x = this.viewer.viewport.getCenter(true).x;\n }\n this.viewer.viewport.panTo(target);\n this.viewer.viewport.applyConstraints();\n }\n\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasDrag( event ) {\n var canvasDragEventArgs = {\n tracker: event.eventSource,\n position: event.position,\n delta: event.delta,\n speed: event.speed,\n direction: event.direction,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefaultAction: false\n };\n /**\n * Raised when a drag event occurs on the {@link OpenSeadragon.Viewer#navigator} element.\n *\n * @event navigator-drag\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag.\n * @property {Number} speed - Current computed speed, in pixels per second.\n * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n * @property {Boolean} preventDefaultAction - Set to true to prevent default drag to pan behaviour. Default: false.\n */\n this.viewer.raiseEvent('navigator-drag', canvasDragEventArgs);\n\n if ( !canvasDragEventArgs.preventDefaultAction && this.viewer.viewport ) {\n if( !this.panHorizontal ){\n event.delta.x = 0;\n }\n if( !this.panVertical ){\n event.delta.y = 0;\n }\n\n if(this.viewer.viewport.flipped){\n event.delta.x = -event.delta.x;\n }\n\n this.viewer.viewport.panBy(\n this.viewport.deltaPointsFromPixels(\n event.delta\n )\n );\n if( this.viewer.constrainDuringPan ){\n this.viewer.viewport.applyConstraints();\n }\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasRelease( event ) {\n if ( event.insideElementPressed && this.viewer.viewport ) {\n this.viewer.viewport.applyConstraints();\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasScroll( event ) {\n var eventArgs = {\n tracker: event.eventSource,\n position: event.position,\n scroll: event.scroll,\n shift: event.shift,\n originalEvent: event.originalEvent,\n preventDefault: event.preventDefault\n };\n\n /**\n * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#navigator} element (mouse wheel, touch pinch, etc.).\n *\n * @event navigator-scroll\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} scroll - The scroll delta for the event.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {Boolean} preventDefault - Set to true to prevent the default user-agent's handling of the wheel event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'navigator-scroll', eventArgs );\n\n event.preventDefault = eventArgs.preventDefault;\n}\n\n/**\n * @function\n * @private\n * @param {Object} element\n * @param {Number} degrees\n */\nfunction _setTransformRotate( element, degrees ) {\n setElementTransform(element, \"rotate(\" + degrees + \"deg)\");\n}\n\nfunction setElementTransform( element, rule ) {\n element.style.webkitTransform = rule;\n element.style.mozTransform = rule;\n element.style.msTransform = rule;\n element.style.oTransform = rule;\n element.style.transform = rule;\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - getString/setString\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n//TODO: I guess this is where the i18n needs to be reimplemented. I'll look\n// into existing patterns for i18n in javascript but i think that mimicking\n// pythons gettext might be a reasonable approach.\nvar I18N = {\n Errors: {\n Dzc: \"Sorry, we don't support Deep Zoom Collections!\",\n Dzi: \"Hmm, this doesn't appear to be a valid Deep Zoom Image.\",\n Xml: \"Hmm, this doesn't appear to be a valid Deep Zoom Image.\",\n ImageFormat: \"Sorry, we don't support {0}-based Deep Zoom Images.\",\n Security: \"It looks like a security restriction stopped us from \" +\n \"loading this Deep Zoom Image.\",\n Status: \"This space unintentionally left blank ({0} {1}).\",\n OpenFailed: \"Unable to open {0}: {1}\"\n },\n\n Tooltips: {\n FullPage: \"Toggle full page\",\n Home: \"Go home\",\n ZoomIn: \"Zoom in\",\n ZoomOut: \"Zoom out\",\n NextPage: \"Next page\",\n PreviousPage: \"Previous page\",\n RotateLeft: \"Rotate left\",\n RotateRight: \"Rotate right\",\n Flip: \"Flip Horizontally\"\n }\n};\n\n$.extend( $, /** @lends OpenSeadragon */{\n\n /**\n * @function\n * @param {String} property\n */\n getString: function( prop ) {\n\n var props = prop.split('.'),\n string = null,\n args = arguments,\n container = I18N,\n i;\n\n for (i = 0; i < props.length - 1; i++) {\n // in case not a subproperty\n container = container[ props[ i ] ] || {};\n }\n string = container[ props[ i ] ];\n\n if ( typeof ( string ) !== \"string\" ) {\n $.console.error( \"Untranslated source string:\", prop );\n string = \"\"; // FIXME: this breaks gettext()-style convention, which would return source\n }\n\n return string.replace(/\\{\\d+\\}/g, function(capture) {\n var i = parseInt( capture.match( /\\d+/ ), 10 ) + 1;\n return i < args.length ?\n args[ i ] :\n \"\";\n });\n },\n\n /**\n * @function\n * @param {String} property\n * @param {*} value\n */\n setString: function( prop, value ) {\n\n var props = prop.split('.'),\n container = I18N,\n i;\n\n for ( i = 0; i < props.length - 1; i++ ) {\n if ( !container[ props[ i ] ] ) {\n container[ props[ i ] ] = {};\n }\n container = container[ props[ i ] ];\n }\n\n container[ props[ i ] ] = value;\n }\n\n});\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Point\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Point\n * @classdesc A Point is really used as a 2-dimensional vector, equally useful for\n * representing a point on a plane, or the height and width of a plane\n * not requiring any other frame of reference.\n *\n * @memberof OpenSeadragon\n * @param {Number} [x] The vector component 'x'. Defaults to the origin at 0.\n * @param {Number} [y] The vector component 'y'. Defaults to the origin at 0.\n */\n$.Point = function( x, y ) {\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Point#\n */\n this.x = typeof ( x ) === \"number\" ? x : 0;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Point#\n */\n this.y = typeof ( y ) === \"number\" ? y : 0;\n};\n\n/** @lends OpenSeadragon.Point.prototype */\n$.Point.prototype = {\n /**\n * @function\n * @returns {OpenSeadragon.Point} a duplicate of this Point\n */\n clone: function() {\n return new $.Point(this.x, this.y);\n },\n\n /**\n * Add another Point to this point and return a new Point.\n * @function\n * @param {OpenSeadragon.Point} point The point to add vector components.\n * @returns {OpenSeadragon.Point} A new point representing the sum of the\n * vector components\n */\n plus: function( point ) {\n return new $.Point(\n this.x + point.x,\n this.y + point.y\n );\n },\n\n /**\n * Subtract another Point to this point and return a new Point.\n * @function\n * @param {OpenSeadragon.Point} point The point to subtract vector components.\n * @returns {OpenSeadragon.Point} A new point representing the subtraction of the\n * vector components\n */\n minus: function( point ) {\n return new $.Point(\n this.x - point.x,\n this.y - point.y\n );\n },\n\n /**\n * Multiply this point by a factor and return a new Point.\n * @function\n * @param {Number} factor The factor to multiply vector components.\n * @returns {OpenSeadragon.Point} A new point representing the multiplication\n * of the vector components by the factor\n */\n times: function( factor ) {\n return new $.Point(\n this.x * factor,\n this.y * factor\n );\n },\n\n /**\n * Divide this point by a factor and return a new Point.\n * @function\n * @param {Number} factor The factor to divide vector components.\n * @returns {OpenSeadragon.Point} A new point representing the division of the\n * vector components by the factor\n */\n divide: function( factor ) {\n return new $.Point(\n this.x / factor,\n this.y / factor\n );\n },\n\n /**\n * Compute the opposite of this point and return a new Point.\n * @function\n * @returns {OpenSeadragon.Point} A new point representing the opposite of the\n * vector components\n */\n negate: function() {\n return new $.Point( -this.x, -this.y );\n },\n\n /**\n * Compute the distance between this point and another point.\n * @function\n * @param {OpenSeadragon.Point} point The point to compute the distance with.\n * @returns {Number} The distance between the 2 points\n */\n distanceTo: function( point ) {\n return Math.sqrt(\n Math.pow( this.x - point.x, 2 ) +\n Math.pow( this.y - point.y, 2 )\n );\n },\n\n /**\n * Compute the squared distance between this point and another point.\n * Useful for optimizing things like comparing distances.\n * @function\n * @param {OpenSeadragon.Point} point The point to compute the squared distance with.\n * @returns {Number} The squared distance between the 2 points\n */\n squaredDistanceTo: function( point ) {\n return Math.pow( this.x - point.x, 2 ) +\n Math.pow( this.y - point.y, 2 );\n },\n\n /**\n * Apply a function to each coordinate of this point and return a new point.\n * @function\n * @param {function} func The function to apply to each coordinate.\n * @returns {OpenSeadragon.Point} A new point with the coordinates computed\n * by the specified function\n */\n apply: function( func ) {\n return new $.Point( func( this.x ), func( this.y ) );\n },\n\n /**\n * Check if this point is equal to another one.\n * @function\n * @param {OpenSeadragon.Point} point The point to compare this point with.\n * @returns {Boolean} true if they are equal, false otherwise.\n */\n equals: function( point ) {\n return (\n point instanceof $.Point\n ) && (\n this.x === point.x\n ) && (\n this.y === point.y\n );\n },\n\n /**\n * Rotates the point around the specified pivot\n * From http://stackoverflow.com/questions/4465931/rotate-rectangle-around-a-point\n * @function\n * @param {Number} degress to rotate around the pivot.\n * @param {OpenSeadragon.Point} [pivot=(0,0)] Point around which to rotate.\n * Defaults to the origin.\n * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot\n */\n rotate: function (degrees, pivot) {\n pivot = pivot || new $.Point(0, 0);\n var cos;\n var sin;\n // Avoid float computations when possible\n if (degrees % 90 === 0) {\n var d = $.positiveModulo(degrees, 360);\n switch (d) {\n case 0:\n cos = 1;\n sin = 0;\n break;\n case 90:\n cos = 0;\n sin = 1;\n break;\n case 180:\n cos = -1;\n sin = 0;\n break;\n case 270:\n cos = 0;\n sin = -1;\n break;\n }\n } else {\n var angle = degrees * Math.PI / 180.0;\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n }\n var x = cos * (this.x - pivot.x) - sin * (this.y - pivot.y) + pivot.x;\n var y = sin * (this.x - pivot.x) + cos * (this.y - pivot.y) + pivot.y;\n return new $.Point(x, y);\n },\n\n /**\n * Convert this point to a string in the format (x,y) where x and y are\n * rounded to the nearest integer.\n * @function\n * @returns {String} A string representation of this point.\n */\n toString: function() {\n return \"(\" + (Math.round(this.x * 100) / 100) + \",\" + (Math.round(this.y * 100) / 100) + \")\";\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n\n/**\n * @class TileSource\n * @classdesc The TileSource contains the most basic implementation required to create a\n * smooth transition between layers in an image pyramid. It has only a single key\n * interface that must be implemented to complete its key functionality:\n * 'getTileUrl'. It also has several optional interfaces that can be\n * implemented if a new TileSource wishes to support configuration via a simple\n * object or array ('configure') and if the tile source supports or requires\n * configuration via retrieval of a document on the network ala AJAX or JSONP,\n * ('getImageInfo').\n *
    \n * By default the image pyramid is split into N layers where the image's longest\n * side in M (in pixels), where N is the smallest integer which satisfies\n * 2^(N+1) >= M.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @param {Object} options\n * You can either specify a URL, or literally define the TileSource (by specifying\n * width, height, tileSize, tileOverlap, minLevel, and maxLevel). For the former,\n * the extending class is expected to implement 'getImageInfo' and 'configure'.\n * For the latter, the construction is assumed to occur through\n * the extending classes implementation of 'configure'.\n * @param {String} [options.url]\n * The URL for the data necessary for this TileSource.\n * @param {String} [options.referenceStripThumbnailUrl]\n * The URL for a thumbnail image to be used by the reference strip\n * @param {Function} [options.success]\n * A function to be called upon successful creation.\n * @param {Boolean} [options.ajaxWithCredentials]\n * If this TileSource needs to make an AJAX call, this specifies whether to set\n * the XHR's withCredentials (for accessing secure data).\n * @param {Object} [options.ajaxHeaders]\n * A set of headers to include in AJAX requests.\n * @param {Boolean} [options.splitHashDataForPost]\n * First occurrence of '#' in the options.url is used to split URL\n * and the latter part is treated as POST data (applies to getImageInfo(...))\n * @param {Number} [options.width]\n * Width of the source image at max resolution in pixels.\n * @param {Number} [options.height]\n * Height of the source image at max resolution in pixels.\n * @param {Number} [options.tileSize]\n * The size of the tiles to assumed to make up each pyramid layer in pixels.\n * Tile size determines the point at which the image pyramid must be\n * divided into a matrix of smaller images.\n * Use options.tileWidth and options.tileHeight to support non-square tiles.\n * @param {Number} [options.tileWidth]\n * The width of the tiles to assumed to make up each pyramid layer in pixels.\n * @param {Number} [options.tileHeight]\n * The height of the tiles to assumed to make up each pyramid layer in pixels.\n * @param {Number} [options.tileOverlap]\n * The number of pixels each tile is expected to overlap touching tiles.\n * @param {Number} [options.minLevel]\n * The minimum level to attempt to load.\n * @param {Number} [options.maxLevel]\n * The maximum level to attempt to load.\n */\n$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) {\n var _this = this;\n\n var args = arguments,\n options,\n i;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: args[0],\n height: args[1],\n tileSize: args[2],\n tileOverlap: args[3],\n minLevel: args[4],\n maxLevel: args[5]\n };\n }\n\n //Tile sources supply some events, namely 'ready' when they must be configured\n //by asynchronously fetching their configuration data.\n $.EventSource.call( this );\n\n //we allow options to override anything we don't treat as\n //required via idiomatic options or which is functionally\n //set depending on the state of the readiness of this tile\n //source\n $.extend( true, this, options );\n\n if (!this.success) {\n //Any functions that are passed as arguments are bound to the ready callback\n for ( i = 0; i < arguments.length; i++ ) {\n if ( $.isFunction( arguments[ i ] ) ) {\n this.success = arguments[ i ];\n //only one callback per constructor\n break;\n }\n }\n }\n\n if (this.success) {\n this.addHandler( 'ready', function ( event ) {\n _this.success( event );\n } );\n }\n\n /**\n * Ratio of width to height\n * @member {Number} aspectRatio\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * Vector storing x and y dimensions ( width and height respectively ).\n * @member {OpenSeadragon.Point} dimensions\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The overlap in pixels each tile shares with its adjacent neighbors.\n * @member {Number} tileOverlap\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The minimum pyramid level this tile source supports or should attempt to load.\n * @member {Number} minLevel\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The maximum pyramid level this tile source supports or should attempt to load.\n * @member {Number} maxLevel\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n *\n * @member {Boolean} ready\n * @memberof OpenSeadragon.TileSource#\n */\n\n if( 'string' === $.type( arguments[ 0 ] ) ){\n this.url = arguments[0];\n }\n\n if (this.url) {\n //in case the getImageInfo method is overridden and/or implies an\n //async mechanism set some safe defaults first\n this.aspectRatio = 1;\n this.dimensions = new $.Point( 10, 10 );\n this._tileWidth = 0;\n this._tileHeight = 0;\n this.tileOverlap = 0;\n this.minLevel = 0;\n this.maxLevel = 0;\n this.ready = false;\n //configuration via url implies the extending class\n //implements and 'configure'\n this.getImageInfo( this.url );\n\n } else {\n\n //explicit configuration via positional args in constructor\n //or the more idiomatic 'options' object\n this.ready = true;\n this.aspectRatio = (options.width && options.height) ?\n (options.width / options.height) : 1;\n this.dimensions = new $.Point( options.width, options.height );\n\n if ( this.tileSize ){\n this._tileWidth = this._tileHeight = this.tileSize;\n delete this.tileSize;\n } else {\n if( this.tileWidth ){\n // We were passed tileWidth in options, but we want to rename it\n // with a leading underscore to make clear that it is not safe to directly modify it\n this._tileWidth = this.tileWidth;\n delete this.tileWidth;\n } else {\n this._tileWidth = 0;\n }\n\n if( this.tileHeight ){\n // See note above about renaming this.tileWidth\n this._tileHeight = this.tileHeight;\n delete this.tileHeight;\n } else {\n this._tileHeight = 0;\n }\n }\n\n this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0;\n this.minLevel = options.minLevel ? options.minLevel : 0;\n this.maxLevel = ( undefined !== options.maxLevel && null !== options.maxLevel ) ?\n options.maxLevel : (\n ( options.width && options.height ) ? Math.ceil(\n Math.log( Math.max( options.width, options.height ) ) /\n Math.log( 2 )\n ) : 0\n );\n if( this.success && $.isFunction( this.success ) ){\n this.success( this );\n }\n }\n\n\n};\n\n/** @lends OpenSeadragon.TileSource.prototype */\n$.TileSource.prototype = {\n\n getTileSize: function( level ) {\n $.console.error(\n \"[TileSource.getTileSize] is deprecated. \" +\n \"Use TileSource.getTileWidth() and TileSource.getTileHeight() instead\"\n );\n return this._tileWidth;\n },\n\n /**\n * Return the tileWidth for a given level.\n * Subclasses should override this if tileWidth can be different at different levels\n * such as in IIIFTileSource. Code should use this function rather than reading\n * from ._tileWidth directly.\n * @function\n * @param {Number} level\n */\n getTileWidth: function( level ) {\n if (!this._tileWidth) {\n return this.getTileSize(level);\n }\n return this._tileWidth;\n },\n\n /**\n * Return the tileHeight for a given level.\n * Subclasses should override this if tileHeight can be different at different levels\n * such as in IIIFTileSource. Code should use this function rather than reading\n * from ._tileHeight directly.\n * @function\n * @param {Number} level\n */\n getTileHeight: function( level ) {\n if (!this._tileHeight) {\n return this.getTileSize(level);\n }\n return this._tileHeight;\n },\n\n /**\n * Set the maxLevel to the given level, and perform the memoization of\n * getLevelScale with the new maxLevel. This function can be useful if the\n * memoization is required before the first call of getLevelScale, or both\n * memoized getLevelScale and maxLevel should be changed accordingly.\n * @function\n * @param {Number} level\n */\n setMaxLevel: function( level ) {\n this.maxLevel = level;\n this._memoizeLevelScale();\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function( level ) {\n // if getLevelScale is not memoized, we generate the memoized version\n // at the first call and return the result\n this._memoizeLevelScale();\n return this.getLevelScale( level );\n },\n\n // private\n _memoizeLevelScale: function() {\n // see https://github.com/openseadragon/openseadragon/issues/22\n // we use the tilesources implementation of getLevelScale to generate\n // a memoized re-implementation\n var levelScaleCache = {},\n i;\n for( i = 0; i <= this.maxLevel; i++ ){\n levelScaleCache[ i ] = 1 / Math.pow(2, this.maxLevel - i);\n }\n this.getLevelScale = function( _level ){\n return levelScaleCache[ _level ];\n };\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n var scale = this.getLevelScale( level ),\n x = Math.ceil( scale * this.dimensions.x / this.getTileWidth(level) ),\n y = Math.ceil( scale * this.dimensions.y / this.getTileHeight(level) );\n\n return new $.Point( x, y );\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getPixelRatio: function( level ) {\n var imageSizeScaled = this.dimensions.times( this.getLevelScale( level ) ),\n rx = 1.0 / imageSizeScaled.x * $.pixelDensityRatio,\n ry = 1.0 / imageSizeScaled.y * $.pixelDensityRatio;\n\n return new $.Point(rx, ry);\n },\n\n\n /**\n * @function\n * @returns {Number} The highest level in this tile source that can be contained in a single tile.\n */\n getClosestLevel: function() {\n var i,\n tiles;\n\n for (i = this.minLevel + 1; i <= this.maxLevel; i++){\n tiles = this.getNumTiles(i);\n if (tiles.x > 1 || tiles.y > 1) {\n break;\n }\n }\n\n return i - 1;\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {OpenSeadragon.Point} point\n */\n getTileAtPoint: function(level, point) {\n var validPoint = point.x >= 0 && point.x <= 1 &&\n point.y >= 0 && point.y <= 1 / this.aspectRatio;\n $.console.assert(validPoint, \"[TileSource.getTileAtPoint] must be called with a valid point.\");\n\n var widthScaled = this.dimensions.x * this.getLevelScale(level);\n var pixelX = point.x * widthScaled;\n var pixelY = point.y * widthScaled;\n\n var x = Math.floor(pixelX / this.getTileWidth(level));\n var y = Math.floor(pixelY / this.getTileHeight(level));\n\n // When point.x == 1 or point.y == 1 / this.aspectRatio we want to\n // return the last tile of the row/column\n if (point.x >= 1) {\n x = this.getNumTiles(level).x - 1;\n }\n var EPSILON = 1e-15;\n if (point.y >= 1 / this.aspectRatio - EPSILON) {\n y = this.getNumTiles(level).y - 1;\n }\n\n return new $.Point(x, y);\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @param {Boolean} [isSource=false] Whether to return the source bounds of the tile.\n * @returns {OpenSeadragon.Rect} Either where this tile fits (in normalized coordinates) or the\n * portion of the tile to use as the source of the drawing operation (in pixels), depending on\n * the isSource parameter.\n */\n getTileBounds: function( level, x, y, isSource ) {\n var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ),\n tileWidth = this.getTileWidth(level),\n tileHeight = this.getTileHeight(level),\n px = ( x === 0 ) ? 0 : tileWidth * x - this.tileOverlap,\n py = ( y === 0 ) ? 0 : tileHeight * y - this.tileOverlap,\n sx = tileWidth + ( x === 0 ? 1 : 2 ) * this.tileOverlap,\n sy = tileHeight + ( y === 0 ? 1 : 2 ) * this.tileOverlap,\n scale = 1.0 / dimensionsScaled.x;\n\n sx = Math.min( sx, dimensionsScaled.x - px );\n sy = Math.min( sy, dimensionsScaled.y - py );\n\n if (isSource) {\n return new $.Rect(0, 0, sx, sy);\n }\n\n return new $.Rect( px * scale, py * scale, sx * scale, sy * scale );\n },\n\n\n /**\n * Responsible for retrieving, and caching the\n * image metadata pertinent to this TileSources implementation.\n * @function\n * @param {String} url\n * @throws {Error}\n */\n getImageInfo: function( url ) {\n var _this = this,\n callbackName,\n callback,\n readySource,\n options,\n urlParts,\n filename,\n lastDot;\n\n\n if( url ) {\n urlParts = url.split( '/' );\n filename = urlParts[ urlParts.length - 1 ];\n lastDot = filename.lastIndexOf( '.' );\n if ( lastDot > -1 ) {\n urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot );\n }\n }\n\n var postData = null;\n if (this.splitHashDataForPost) {\n var hashIdx = url.indexOf(\"#\");\n if (hashIdx !== -1) {\n postData = url.substring(hashIdx + 1);\n url = url.substr(0, hashIdx);\n }\n }\n\n callback = function( data ){\n if( typeof (data) === \"string\" ) {\n data = $.parseXml( data );\n }\n var $TileSource = $.TileSource.determineType( _this, data, url );\n if ( !$TileSource ) {\n /**\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', { message: \"Unable to load TileSource\", source: url } );\n return;\n }\n\n options = $TileSource.prototype.configure.apply( _this, [ data, url, postData ]);\n if (options.ajaxWithCredentials === undefined) {\n options.ajaxWithCredentials = _this.ajaxWithCredentials;\n }\n\n readySource = new $TileSource( options );\n _this.ready = true;\n /**\n * Raised when a TileSource is opened and initialized.\n *\n * @event ready\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {Object} tileSource\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'ready', { tileSource: readySource } );\n };\n\n if( url.match(/\\.js$/) ){\n //TODO: Its not very flexible to require tile sources to end jsonp\n // request for info with a url that ends with '.js' but for\n // now it's the only way I see to distinguish uniformly.\n callbackName = url.split('/').pop().replace('.js', '');\n $.jsonp({\n url: url,\n async: false,\n callbackName: callbackName,\n callback: callback\n });\n } else {\n // request info via xhr asynchronously.\n $.makeAjaxRequest( {\n url: url,\n postData: postData,\n withCredentials: this.ajaxWithCredentials,\n headers: this.ajaxHeaders,\n success: function( xhr ) {\n var data = processResponse( xhr );\n callback( data );\n },\n error: function ( xhr, exc ) {\n var msg;\n\n /*\n IE < 10 will block XHR requests to different origins. Any property access on the request\n object will raise an exception which we'll attempt to handle by formatting the original\n exception rather than the second one raised when we try to access xhr.status\n */\n try {\n msg = \"HTTP \" + xhr.status + \" attempting to load TileSource: \" + url;\n } catch ( e ) {\n var formattedExc;\n if ( typeof ( exc ) === \"undefined\" || !exc.toString ) {\n formattedExc = \"Unknown error\";\n } else {\n formattedExc = exc.toString();\n }\n\n msg = formattedExc + \" attempting to load TileSource: \" + url;\n }\n\n $.console.error(msg);\n\n /***\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {String} postData - HTTP POST data (usually but not necessarily in k=v&k2=v2... form,\n * see TileSource::getPostData) or null\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', {\n message: msg,\n source: url,\n postData: postData\n });\n }\n });\n }\n\n },\n\n /**\n * Responsible determining if a the particular TileSource supports the\n * data format ( and allowed to apply logic against the url the data was\n * loaded from, if any ). Overriding implementations are expected to do\n * something smart with data and / or url to determine support. Also\n * understand that iteration order of TileSources is not guarunteed so\n * please make sure your data or url is expressive enough to ensure a simple\n * and sufficient mechanisim for clear determination.\n * @function\n * @param {String|Object|Array|Document} data\n * @param {String} url - the url the data was loaded\n * from if any.\n * @returns {Boolean}\n */\n supports: function( data, url ) {\n return false;\n },\n\n /**\n * Responsible for parsing and configuring the\n * image metadata pertinent to this TileSources implementation.\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {String|Object|Array|Document} data\n * @param {String} url - the url the data was loaded\n * from if any.\n * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null value obtained from\n * the protocol URL after '#' sign if flag splitHashDataForPost set to 'true'\n * @returns {Object} options - A dictionary of keyword arguments sufficient\n * to configure the tile source constructor (include all values you want to\n * instantiate the TileSource subclass with - what _options_ object should contain).\n * @throws {Error}\n */\n configure: function( data, url, postData ) {\n throw new Error( \"Method not implemented.\" );\n },\n\n /**\n * Responsible for retrieving the url which will return an image for the\n * region specified by the given x, y, and level components.\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @returns {String|Function} url - A string for the url or a function that returns a url string.\n * @throws {Error}\n */\n getTileUrl: function( level, x, y ) {\n throw new Error( \"Method not implemented.\" );\n },\n\n /**\n * Must use AJAX in order to work, i.e. loadTilesWithAjax = true is set.\n * If a value is returned, ajax issues POST request to the tile url.\n * If null is returned, ajax issues GET request.\n * The return value must comply to the header 'content type'.\n *\n * Examples (USED HEADER --> getTilePostData CODE):\n * 'Content-type': 'application/x-www-form-urlencoded' -->\n * return \"key1=value=1&key2=value2\";\n *\n * 'Content-type': 'application/x-www-form-urlencoded' -->\n * return JSON.stringify({key: \"value\", number: 5});\n *\n * 'Content-type': 'multipart/form-data' -->\n * let result = new FormData();\n * result.append(\"data\", myData);\n * return result;\n *\n * IMPORTANT: in case you move all the logic on image fetching\n * to post data, you must re-define 'getTileHashKey(...)' to\n * stay unique for different tile images.\n *\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @returns {*|null} post data to send with tile configuration request\n */\n getTilePostData: function( level, x, y ) {\n return null;\n },\n\n /**\n * Responsible for retrieving the headers which will be attached to the image request for the\n * region specified by the given x, y, and level components.\n * This option is only relevant if {@link OpenSeadragon.Options}.loadTilesWithAjax is set to true.\n * The headers returned here will override headers specified at the Viewer or TiledImage level.\n * Specifying a falsy value for a header will clear its existing value set at the Viewer or\n * TiledImage level (if any).\n *\n * Note that the headers of existing tiles don't automatically change when this function\n * returns updated headers. To do that, you need to call {@link OpenSeadragon.Viewer#setAjaxHeaders}\n * and propagate the changes.\n *\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @returns {Object}\n */\n getTileAjaxHeaders: function( level, x, y ) {\n return {};\n },\n\n /**\n * The tile cache object is uniquely determined by this key and used to lookup\n * the image data in cache: keys should be different if images are different.\n *\n * In case a tile has context2D property defined (TileSource.prototype.getContext2D)\n * or its context2D is set manually; the cache is not used and this function\n * is irrelevant.\n * Note: default behaviour does not take into account post data.\n * @param {Number} level tile level it was fetched with\n * @param {Number} x x-coordinate in the pyramid level\n * @param {Number} y y-coordinate in the pyramid level\n * @param {String} url the tile was fetched with\n * @param {Object} ajaxHeaders the tile was fetched with\n * @param {*} postData data the tile was fetched with (type depends on getTilePostData(..) return type)\n */\n getTileHashKey: function(level, x, y, url, ajaxHeaders, postData) {\n function withHeaders(hash) {\n return ajaxHeaders ? hash + \"+\" + JSON.stringify(ajaxHeaders) : hash;\n }\n\n if (typeof url !== \"string\") {\n return withHeaders(level + \"/\" + x + \"_\" + y);\n }\n return withHeaders(url);\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n tileExists: function( level, x, y ) {\n var numTiles = this.getNumTiles( level );\n return level >= this.minLevel &&\n level <= this.maxLevel &&\n x >= 0 &&\n y >= 0 &&\n x < numTiles.x &&\n y < numTiles.y;\n },\n\n /**\n * Decide whether tiles have transparency: this is crucial for correct images blending.\n * @returns {boolean} true if the image has transparency\n */\n hasTransparency: function(context2D, url, ajaxHeaders, post) {\n return !!context2D || url.match('.png');\n },\n\n /**\n * Download tile data.\n * Note that if you override this function, you should override also downloadTileAbort().\n * @param {ImageJob} context job context that you have to call finish(...) on.\n * @param {String} [context.src] - URL of image to download.\n * @param {String} [context.loadWithAjax] - Whether to load this image with AJAX.\n * @param {String} [context.ajaxHeaders] - Headers to add to the image request if using AJAX.\n * @param {Boolean} [context.ajaxWithCredentials] - Whether to set withCredentials on AJAX requests.\n * @param {String} [context.crossOriginPolicy] - CORS policy to use for downloads\n * @param {String} [context.postData] - HTTP POST data (usually but not necessarily in k=v&k2=v2... form,\n * see TileSource::getPostData) or null\n * @param {*} [context.userData] - Empty object to attach your own data and helper variables to.\n * @param {Function} [context.finish] - Should be called unless abort() was executed, e.g. on all occasions,\n * be it successful or unsuccessful request.\n * Usage: context.finish(data, request, errMessage). Pass the downloaded data object or null upon failure.\n * Add also reference to an ajax request if used. Provide error message in case of failure.\n * @param {Function} [context.abort] - Called automatically when the job times out.\n * Usage: context.abort().\n * @param {Function} [context.callback] @private - Called automatically once image has been downloaded\n * (triggered by finish).\n * @param {Number} [context.timeout] @private - The max number of milliseconds that\n * this image job may take to complete.\n * @param {string} [context.errorMsg] @private - The final error message, default null (set by finish).\n */\n downloadTileStart: function (context) {\n var dataStore = context.userData,\n image = new Image();\n\n dataStore.image = image;\n dataStore.request = null;\n\n var finish = function(error) {\n if (!image) {\n context.finish(null, dataStore.request, \"Image load failed: undefined Image instance.\");\n return;\n }\n image.onload = image.onerror = image.onabort = null;\n context.finish(error ? null : image, dataStore.request, error);\n };\n image.onload = function () {\n finish();\n };\n image.onabort = image.onerror = function() {\n finish(\"Image load aborted.\");\n };\n\n // Load the tile with an AJAX request if the loadWithAjax option is\n // set. Otherwise load the image by setting the source proprety of the image object.\n if (context.loadWithAjax) {\n dataStore.request = $.makeAjaxRequest({\n url: context.src,\n withCredentials: context.ajaxWithCredentials,\n headers: context.ajaxHeaders,\n responseType: \"arraybuffer\",\n postData: context.postData,\n success: function(request) {\n var blb;\n // Make the raw data into a blob.\n // BlobBuilder fallback adapted from\n // http://stackoverflow.com/questions/15293694/blob-constructor-browser-compatibility\n try {\n blb = new window.Blob([request.response]);\n } catch (e) {\n var BlobBuilder = (\n window.BlobBuilder ||\n window.WebKitBlobBuilder ||\n window.MozBlobBuilder ||\n window.MSBlobBuilder\n );\n if (e.name === 'TypeError' && BlobBuilder) {\n var bb = new BlobBuilder();\n bb.append(request.response);\n blb = bb.getBlob();\n }\n }\n // If the blob is empty for some reason consider the image load a failure.\n if (blb.size === 0) {\n finish(\"Empty image response.\");\n } else {\n // Create a URL for the blob data and make it the source of the image object.\n // This will still trigger Image.onload to indicate a successful tile load.\n image.src = (window.URL || window.webkitURL).createObjectURL(blb);\n }\n },\n error: function(request) {\n finish(\"Image load aborted - XHR error\");\n }\n });\n } else {\n if (context.crossOriginPolicy !== false) {\n image.crossOrigin = context.crossOriginPolicy;\n }\n image.src = context.src;\n }\n },\n\n /**\n * Provide means of aborting the execution.\n * Note that if you override this function, you should override also downloadTileStart().\n * @param {ImageJob} context job, the same object as with downloadTileStart(..)\n * @param {*} [context.userData] - Empty object to attach (and mainly read) your own data.\n */\n downloadTileAbort: function (context) {\n if (context.userData.request) {\n context.userData.request.abort();\n }\n var image = context.userData.image;\n if (context.userData.image) {\n image.onload = image.onerror = image.onabort = null;\n }\n },\n\n /**\n * Create cache object from the result of the download process. The\n * cacheObject parameter should be used to attach the data to, there are no\n * conventions on how it should be stored - all the logic is implemented within *TileCache() functions.\n *\n * Note that if you override any of *TileCache() functions, you should override all of them.\n * @param {object} cacheObject context cache object\n * @param {*} data image data, the data sent to ImageJob.prototype.finish(), by default an Image object\n * @param {Tile} tile instance the cache was created with\n */\n createTileCache: function(cacheObject, data, tile) {\n cacheObject._data = data;\n },\n\n /**\n * Cache object destructor, unset all properties you created to allow GC collection.\n * Note that if you override any of *TileCache() functions, you should override all of them.\n * @param {object} cacheObject context cache object\n */\n destroyTileCache: function (cacheObject) {\n cacheObject._data = null;\n cacheObject._renderedContext = null;\n },\n\n /**\n * Raw data getter\n * Note that if you override any of *TileCache() functions, you should override all of them.\n * @param {object} cacheObject context cache object\n * @returns {*} cache data\n */\n getTileCacheData: function(cacheObject) {\n return cacheObject._data;\n },\n\n /**\n * Compatibility image element getter\n * - plugins might need image representation of the data\n * - div HTML rendering relies on image element presence\n * Note that if you override any of *TileCache() functions, you should override all of them.\n * @param {object} cacheObject context cache object\n * @returns {Image} cache data as an Image\n */\n getTileCacheDataAsImage: function(cacheObject) {\n return cacheObject._data; //the data itself by default is Image\n },\n\n /**\n * Compatibility context 2D getter\n * - most heavily used rendering method is a canvas-based approach,\n * convert the data to a canvas and return it's 2D context\n * Note that if you override any of *TileCache() functions, you should override all of them.\n * @param {object} cacheObject context cache object\n * @returns {CanvasRenderingContext2D} context of the canvas representation of the cache data\n */\n getTileCacheDataAsContext2D: function(cacheObject) {\n if (!cacheObject._renderedContext) {\n var canvas = document.createElement( 'canvas' );\n canvas.width = cacheObject._data.width;\n canvas.height = cacheObject._data.height;\n cacheObject._renderedContext = canvas.getContext('2d');\n cacheObject._renderedContext.drawImage( cacheObject._data, 0, 0 );\n //since we are caching the prerendered image on a canvas\n //allow the image to not be held in memory\n cacheObject._data = null;\n }\n return cacheObject._renderedContext;\n }\n};\n\n\n$.extend( true, $.TileSource.prototype, $.EventSource.prototype );\n\n\n/**\n * Decides whether to try to process the response as xml, json, or hand back\n * the text\n * @private\n * @inner\n * @function\n * @param {XMLHttpRequest} xhr - the completed network request\n */\nfunction processResponse( xhr ){\n var responseText = xhr.responseText,\n status = xhr.status,\n statusText,\n data;\n\n if ( !xhr ) {\n throw new Error( $.getString( \"Errors.Security\" ) );\n } else if ( xhr.status !== 200 && xhr.status !== 0 ) {\n status = xhr.status;\n statusText = ( status === 404 ) ?\n \"Not Found\" :\n xhr.statusText;\n throw new Error( $.getString( \"Errors.Status\", status, statusText ) );\n }\n\n if( responseText.match(/^\\s*<.*/) ){\n try{\n data = ( xhr.responseXML && xhr.responseXML.documentElement ) ?\n xhr.responseXML :\n $.parseXml( responseText );\n } catch (e){\n data = xhr.responseText;\n }\n }else if( responseText.match(/\\s*[{[].*/) ){\n try{\n data = $.parseJSON(responseText);\n } catch(e){\n data = responseText;\n }\n }else{\n data = responseText;\n }\n return data;\n}\n\n\n/**\n * Determines the TileSource Implementation by introspection of OpenSeadragon\n * namespace, calling each TileSource implementation of 'isType'\n * @private\n * @inner\n * @function\n * @param {Object|Array|Document} data - the tile source configuration object\n * @param {String} url - the url where the tile source configuration object was\n * loaded from, if any.\n */\n$.TileSource.determineType = function( tileSource, data, url ){\n var property;\n for( property in OpenSeadragon ){\n if( property.match(/.+TileSource$/) &&\n $.isFunction( OpenSeadragon[ property ] ) &&\n $.isFunction( OpenSeadragon[ property ].prototype.supports ) &&\n OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url )\n ){\n return OpenSeadragon[ property ];\n }\n }\n\n $.console.error( \"No TileSource was able to open %s %s\", url, data );\n\n return null;\n};\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - DziTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class DziTileSource\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n * @param {String} fileFormat\n * @param {OpenSeadragon.DisplayRect[]} displayRects\n * @property {String} tilesUrl\n * @property {String} fileFormat\n * @property {OpenSeadragon.DisplayRect[]} displayRects\n */\n$.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, fileFormat, displayRects, minLevel, maxLevel ) {\n var i,\n rect,\n level,\n options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[ 0 ],\n height: arguments[ 1 ],\n tileSize: arguments[ 2 ],\n tileOverlap: arguments[ 3 ],\n tilesUrl: arguments[ 4 ],\n fileFormat: arguments[ 5 ],\n displayRects: arguments[ 6 ],\n minLevel: arguments[ 7 ],\n maxLevel: arguments[ 8 ]\n };\n }\n\n this._levelRects = {};\n this.tilesUrl = options.tilesUrl;\n this.fileFormat = options.fileFormat;\n this.displayRects = options.displayRects;\n\n if ( this.displayRects ) {\n for ( i = this.displayRects.length - 1; i >= 0; i-- ) {\n rect = this.displayRects[ i ];\n for ( level = rect.minLevel; level <= rect.maxLevel; level++ ) {\n if ( !this._levelRects[ level ] ) {\n this._levelRects[ level ] = [];\n }\n this._levelRects[ level ].push( rect );\n }\n }\n }\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.DziTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.DziTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n var ns;\n if ( data.Image ) {\n ns = data.Image.xmlns;\n } else if ( data.documentElement) {\n if (\"Image\" === data.documentElement.localName || \"Image\" === data.documentElement.tagName) {\n ns = data.documentElement.namespaceURI;\n }\n }\n\n ns = (ns || '').toLowerCase();\n\n return (ns.indexOf('schemas.microsoft.com/deepzoom/2008') !== -1 ||\n ns.indexOf('schemas.microsoft.com/deepzoom/2009') !== -1);\n },\n\n /**\n *\n * @function\n * @param {Object|XMLDocument} data - the raw configuration\n * @param {String} url - the url the data was retrieved from if any.\n * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null\n * @returns {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url, postData ){\n\n var options;\n\n if( !$.isPlainObject(data) ){\n\n options = configureFromXML( this, data );\n\n }else{\n\n options = configureFromObject( this, data );\n }\n\n if (url && !options.tilesUrl) {\n options.tilesUrl = url.replace(\n /([^/]+?)(\\.(dzi|xml|js)?(\\?[^/]*)?)?\\/?$/, '$1_files/');\n\n if (url.search(/\\.(dzi|xml|js)\\?/) !== -1) {\n options.queryParams = url.match(/\\?.*/);\n }else{\n options.queryParams = '';\n }\n }\n\n return options;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat, this.queryParams ].join( '' );\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n tileExists: function( level, x, y ) {\n var rects = this._levelRects[ level ],\n rect,\n scale,\n xMin,\n yMin,\n xMax,\n yMax,\n i;\n\n if ((this.minLevel && level < this.minLevel) || (this.maxLevel && level > this.maxLevel)) {\n return false;\n }\n\n if ( !rects || !rects.length ) {\n return true;\n }\n\n for ( i = rects.length - 1; i >= 0; i-- ) {\n rect = rects[ i ];\n\n if ( level < rect.minLevel || level > rect.maxLevel ) {\n continue;\n }\n\n scale = this.getLevelScale( level );\n xMin = rect.x * scale;\n yMin = rect.y * scale;\n xMax = xMin + rect.width * scale;\n yMax = yMin + rect.height * scale;\n\n xMin = Math.floor( xMin / this._tileWidth );\n yMin = Math.floor( yMin / this._tileWidth ); // DZI tiles are square, so we just use _tileWidth\n xMax = Math.ceil( xMax / this._tileWidth );\n yMax = Math.ceil( yMax / this._tileWidth );\n\n if ( xMin <= x && x < xMax && yMin <= y && y < yMax ) {\n return true;\n }\n }\n\n return false;\n }\n});\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromXML( tileSource, xmlDoc ){\n\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.localName || root.tagName,\n ns = xmlDoc.documentElement.namespaceURI,\n configuration = null,\n displayRects = [],\n dispRectNodes,\n dispRectNode,\n rectNode,\n sizeNode,\n i;\n\n if ( rootName === \"Image\" ) {\n\n try {\n sizeNode = root.getElementsByTagName(\"Size\" )[ 0 ];\n if (sizeNode === undefined) {\n sizeNode = root.getElementsByTagNameNS(ns, \"Size\" )[ 0 ];\n }\n\n configuration = {\n Image: {\n xmlns: \"http://schemas.microsoft.com/deepzoom/2008\",\n Url: root.getAttribute( \"Url\" ),\n Format: root.getAttribute( \"Format\" ),\n DisplayRect: null,\n Overlap: parseInt( root.getAttribute( \"Overlap\" ), 10 ),\n TileSize: parseInt( root.getAttribute( \"TileSize\" ), 10 ),\n Size: {\n Height: parseInt( sizeNode.getAttribute( \"Height\" ), 10 ),\n Width: parseInt( sizeNode.getAttribute( \"Width\" ), 10 )\n }\n }\n };\n\n if ( !$.imageFormatSupported( configuration.Image.Format ) ) {\n throw new Error(\n $.getString( \"Errors.ImageFormat\", configuration.Image.Format.toUpperCase() )\n );\n }\n\n dispRectNodes = root.getElementsByTagName(\"DisplayRect\" );\n if (dispRectNodes === undefined) {\n dispRectNodes = root.getElementsByTagNameNS(ns, \"DisplayRect\" )[ 0 ];\n }\n\n for ( i = 0; i < dispRectNodes.length; i++ ) {\n dispRectNode = dispRectNodes[ i ];\n rectNode = dispRectNode.getElementsByTagName(\"Rect\" )[ 0 ];\n if (rectNode === undefined) {\n rectNode = dispRectNode.getElementsByTagNameNS(ns, \"Rect\" )[ 0 ];\n }\n\n displayRects.push({\n Rect: {\n X: parseInt( rectNode.getAttribute( \"X\" ), 10 ),\n Y: parseInt( rectNode.getAttribute( \"Y\" ), 10 ),\n Width: parseInt( rectNode.getAttribute( \"Width\" ), 10 ),\n Height: parseInt( rectNode.getAttribute( \"Height\" ), 10 ),\n MinLevel: parseInt( dispRectNode.getAttribute( \"MinLevel\" ), 10 ),\n MaxLevel: parseInt( dispRectNode.getAttribute( \"MaxLevel\" ), 10 )\n }\n });\n }\n\n if( displayRects.length ){\n configuration.Image.DisplayRect = displayRects;\n }\n\n return configureFromObject( tileSource, configuration );\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( $.getString(\"Errors.Dzi\") );\n }\n } else if ( rootName === \"Collection\" ) {\n throw new Error( $.getString( \"Errors.Dzc\" ) );\n } else if ( rootName === \"Error\" ) {\n var messageNode = root.getElementsByTagName(\"Message\")[0];\n var message = messageNode.firstChild.nodeValue;\n throw new Error(message);\n }\n\n throw new Error( $.getString( \"Errors.Dzi\" ) );\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromObject( tileSource, configuration ){\n var imageData = configuration.Image,\n tilesUrl = imageData.Url,\n fileFormat = imageData.Format,\n sizeData = imageData.Size,\n dispRectData = imageData.DisplayRect || [],\n width = parseInt( sizeData.Width, 10 ),\n height = parseInt( sizeData.Height, 10 ),\n tileSize = parseInt( imageData.TileSize, 10 ),\n tileOverlap = parseInt( imageData.Overlap, 10 ),\n displayRects = [],\n rectData,\n i;\n\n //TODO: need to figure out out to better handle image format compatibility\n // which actually includes additional file formats like xml and pdf\n // and plain text for various tilesource implementations to avoid low\n // level errors.\n //\n // For now, just don't perform the check.\n //\n /*if ( !imageFormatSupported( fileFormat ) ) {\n throw new Error(\n $.getString( \"Errors.ImageFormat\", fileFormat.toUpperCase() )\n );\n }*/\n\n for ( i = 0; i < dispRectData.length; i++ ) {\n rectData = dispRectData[ i ].Rect;\n\n displayRects.push( new $.DisplayRect(\n parseInt( rectData.X, 10 ),\n parseInt( rectData.Y, 10 ),\n parseInt( rectData.Width, 10 ),\n parseInt( rectData.Height, 10 ),\n parseInt( rectData.MinLevel, 10 ),\n parseInt( rectData.MaxLevel, 10 )\n ));\n }\n\n return $.extend(true, {\n width: width, /* width *required */\n height: height, /* height *required */\n tileSize: tileSize, /* tileSize *required */\n tileOverlap: tileOverlap, /* tileOverlap *required */\n minLevel: null, /* minLevel */\n maxLevel: null, /* maxLevel */\n tilesUrl: tilesUrl, /* tilesUrl */\n fileFormat: fileFormat, /* fileFormat */\n displayRects: displayRects /* displayRects */\n }, configuration );\n\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - IIIFTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2023 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class IIIFTileSource\n * @classdesc A client implementation of the International Image Interoperability Framework\n * Format: Image API 1.0 - 2.1\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @see http://iiif.io/api/image/\n * @param {String} [options.tileFormat='jpg']\n * The extension that will be used when requiring tiles.\n */\n$.IIIFTileSource = function( options ){\n\n /* eslint-disable camelcase */\n\n $.extend( true, this, options );\n\n /* Normalizes v3-style 'id' keys to an \"_id\" internal property */\n this._id = this[\"@id\"] || this[\"id\"] || this['identifier'] || null;\n\n if ( !( this.height && this.width && this._id) ) {\n throw new Error( 'IIIF required parameters (width, height, or id) not provided.' );\n }\n\n options.tileSizePerScaleFactor = {};\n\n this.tileFormat = this.tileFormat || 'jpg';\n\n this.version = options.version;\n\n // N.B. 2.0 renamed scale_factors to scaleFactors\n if ( this.tile_width && this.tile_height ) {\n options.tileWidth = this.tile_width;\n options.tileHeight = this.tile_height;\n } else if ( this.tile_width ) {\n options.tileSize = this.tile_width;\n } else if ( this.tile_height ) {\n options.tileSize = this.tile_height;\n } else if ( this.tiles ) {\n // Version 2.0 forwards\n if ( this.tiles.length === 1 ) {\n options.tileWidth = this.tiles[0].width;\n // Use height if provided, otherwise assume square tiles and use width.\n options.tileHeight = this.tiles[0].height || this.tiles[0].width;\n this.scale_factors = this.tiles[0].scaleFactors;\n } else {\n // Multiple tile sizes at different levels\n this.scale_factors = [];\n for (var t = 0; t < this.tiles.length; t++ ) {\n for (var sf = 0; sf < this.tiles[t].scaleFactors.length; sf++) {\n var scaleFactor = this.tiles[t].scaleFactors[sf];\n this.scale_factors.push(scaleFactor);\n options.tileSizePerScaleFactor[scaleFactor] = {\n width: this.tiles[t].width,\n height: this.tiles[t].height || this.tiles[t].width\n };\n }\n }\n }\n } else if ( canBeTiled(options) ) {\n // use the largest of tileOptions that is smaller than the short dimension\n var shortDim = Math.min( this.height, this.width ),\n tileOptions = [256, 512, 1024],\n smallerTiles = [];\n\n for ( var c = 0; c < tileOptions.length; c++ ) {\n if ( tileOptions[c] <= shortDim ) {\n smallerTiles.push( tileOptions[c] );\n }\n }\n\n if ( smallerTiles.length > 0 ) {\n options.tileSize = Math.max.apply( null, smallerTiles );\n } else {\n // If we're smaller than 256, just use the short side.\n options.tileSize = shortDim;\n }\n } else if (this.sizes && this.sizes.length > 0) {\n // This info.json can't be tiled, but we can still construct a legacy pyramid from the sizes array.\n // In this mode, IIIFTileSource will call functions from the abstract baseTileSource or the\n // LegacyTileSource instead of performing IIIF tiling.\n this.emulateLegacyImagePyramid = true;\n\n options.levels = constructLevels( this );\n // use the largest available size to define tiles\n $.extend( true, options, {\n width: options.levels[ options.levels.length - 1 ].width,\n height: options.levels[ options.levels.length - 1 ].height,\n tileSize: Math.max( options.height, options.width ),\n tileOverlap: 0,\n minLevel: 0,\n maxLevel: options.levels.length - 1\n });\n this.levels = options.levels;\n } else {\n $.console.error(\"Nothing in the info.json to construct image pyramids from\");\n }\n\n if (!options.maxLevel && !this.emulateLegacyImagePyramid) {\n if (!this.scale_factors) {\n options.maxLevel = Number(Math.round(Math.log(Math.max(this.width, this.height), 2)));\n } else {\n var maxScaleFactor = Math.max.apply(null, this.scale_factors);\n options.maxLevel = Math.round(Math.log(maxScaleFactor) * Math.LOG2E);\n }\n }\n\n // Create an array with our exact resolution sizes if these have been supplied\n if( this.sizes ) {\n var sizeLength = this.sizes.length;\n if ( (sizeLength === options.maxLevel) || (sizeLength === options.maxLevel + 1) ) {\n this.levelSizes = this.sizes;\n // Need to take into account that the list may or may not include the full resolution size\n if( sizeLength === options.maxLevel ) {\n this.levelSizes.push( {width: this.width, height: this.height} );\n }\n }\n }\n\n $.TileSource.apply( this, [ options ] );\n};\n\n$.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.IIIFTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} [url] - url\n */\n\n supports: function( data, url ) {\n // Version 2.0 and forwards\n if (data.protocol && data.protocol === 'http://iiif.io/api/image') {\n return true;\n // Version 1.1\n } else if ( data['@context'] && (\n data['@context'] === \"http://library.stanford.edu/iiif/image-api/1.1/context.json\" ||\n data['@context'] === \"http://iiif.io/api/image/1/context.json\") ) {\n // N.B. the iiif.io context is wrong, but where the representation lives so likely to be used\n return true;\n\n // Version 1.0\n } else if ( data.profile &&\n data.profile.indexOf(\"http://library.stanford.edu/iiif/image-api/compliance.html\") === 0) {\n return true;\n } else if ( data.identifier && data.width && data.height ) {\n return true;\n } else if ( data.documentElement &&\n \"info\" === data.documentElement.tagName &&\n \"http://library.stanford.edu/iiif/image-api/ns/\" ===\n data.documentElement.namespaceURI) {\n return true;\n\n // Not IIIF\n } else {\n return false;\n }\n },\n\n /**\n * A static function used to prepare an incoming IIIF Image API info.json\n * response for processing by the tile handler. Normalizes data for all\n * versions of IIIF (1.0, 1.1, 2.x, 3.x) and returns a data object that\n * may be passed to the IIIFTileSource.\n *\n * @function\n * @static\n * @param {Object} data - the raw configuration\n * @param {String} url - the url configuration was retrieved from\n * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null\n * @returns {Object} A normalized IIIF data object\n * @example IIIF 2.x Info Looks like this\n * {\n * \"@context\": \"http://iiif.io/api/image/2/context.json\",\n * \"@id\": \"http://iiif.example.com/prefix/1E34750D-38DB-4825-A38A-B60A345E591C\",\n * \"protocol\": \"http://iiif.io/api/image\",\n * \"height\": 1024,\n * \"width\": 775,\n * \"tiles\" : [{\"width\":256, \"scaleFactors\":[1,2,4,8]}],\n * \"profile\": [\"http://iiif.io/api/image/2/level1.json\", {\n * \"qualities\": [ \"native\", \"bitonal\", \"grey\", \"color\" ],\n * \"formats\": [ \"jpg\", \"png\", \"gif\" ]\n * }]\n * }\n */\n configure: function( data, url, postData ){\n // Try to deduce our version and fake it upwards if needed\n if ( !$.isPlainObject(data) ) {\n var options = configureFromXml10( data );\n options['@context'] = \"http://iiif.io/api/image/1.0/context.json\";\n options[\"@id\"] = url.replace('/info.xml', '');\n options.version = 1;\n return options;\n } else {\n if ( !data['@context'] ) {\n data['@context'] = 'http://iiif.io/api/image/1.0/context.json';\n data[\"@id\"] = url.replace('/info.json', '');\n data.version = 1;\n } else {\n var context = data['@context'];\n if (Array.isArray(context)) {\n for (var i = 0; i < context.length; i++) {\n if (typeof context[i] === 'string' &&\n ( /^http:\\/\\/iiif\\.io\\/api\\/image\\/[1-3]\\/context\\.json$/.test(context[i]) ||\n context[i] === 'http://library.stanford.edu/iiif/image-api/1.1/context.json' ) ) {\n context = context[i];\n break;\n }\n }\n }\n switch (context) {\n case 'http://iiif.io/api/image/1/context.json':\n case 'http://library.stanford.edu/iiif/image-api/1.1/context.json':\n data.version = 1;\n break;\n case 'http://iiif.io/api/image/2/context.json':\n data.version = 2;\n break;\n case 'http://iiif.io/api/image/3/context.json':\n data.version = 3;\n break;\n default:\n $.console.error('Data has a @context property which contains no known IIIF context URI.');\n }\n }\n\n if (data.preferredFormats) {\n for (var f = 0; f < data.preferredFormats.length; f++ ) {\n if ( OpenSeadragon.imageFormatSupported(data.preferredFormats[f]) ) {\n data.tileFormat = data.preferredFormats[f];\n break;\n }\n }\n }\n return data;\n }\n },\n\n /**\n * Return the tileWidth for the given level.\n * @function\n * @param {Number} level\n */\n getTileWidth: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n return $.TileSource.prototype.getTileWidth.call(this, level);\n }\n\n var scaleFactor = Math.pow(2, this.maxLevel - level);\n\n if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {\n return this.tileSizePerScaleFactor[scaleFactor].width;\n }\n return this._tileWidth;\n },\n\n /**\n * Return the tileHeight for the given level.\n * @function\n * @param {Number} level\n */\n getTileHeight: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n return $.TileSource.prototype.getTileHeight.call(this, level);\n }\n\n var scaleFactor = Math.pow(2, this.maxLevel - level);\n\n if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {\n return this.tileSizePerScaleFactor[scaleFactor].height;\n }\n return this._tileHeight;\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function ( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n var levelScale = NaN;\n if (this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel) {\n levelScale =\n this.levels[level].width /\n this.levels[this.maxLevel].width;\n }\n return levelScale;\n }\n\n return $.TileSource.prototype.getLevelScale.call(this, level);\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n var scale = this.getLevelScale(level);\n if (scale) {\n return new $.Point(1, 1);\n } else {\n return new $.Point(0, 0);\n }\n }\n\n // Use supplied list of scaled resolution sizes if these exist\n if( this.levelSizes ) {\n var levelSize = this.levelSizes[level];\n var x = Math.ceil( levelSize.width / this.getTileWidth(level) ),\n y = Math.ceil( levelSize.height / this.getTileHeight(level) );\n return new $.Point( x, y );\n }\n // Otherwise call default TileSource->getNumTiles() function\n else {\n return $.TileSource.prototype.getNumTiles.call(this, level);\n }\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {OpenSeadragon.Point} point\n */\n getTileAtPoint: function( level, point ) {\n\n if(this.emulateLegacyImagePyramid) {\n return new $.Point(0, 0);\n }\n\n // Use supplied list of scaled resolution sizes if these exist\n if( this.levelSizes ) {\n\n var validPoint = point.x >= 0 && point.x <= 1 &&\n point.y >= 0 && point.y <= 1 / this.aspectRatio;\n $.console.assert(validPoint, \"[TileSource.getTileAtPoint] must be called with a valid point.\");\n\n var widthScaled = this.levelSizes[level].width;\n var pixelX = point.x * widthScaled;\n var pixelY = point.y * widthScaled;\n\n var x = Math.floor(pixelX / this.getTileWidth(level));\n var y = Math.floor(pixelY / this.getTileHeight(level));\n\n // When point.x == 1 or point.y == 1 / this.aspectRatio we want to\n // return the last tile of the row/column\n if (point.x >= 1) {\n x = this.getNumTiles(level).x - 1;\n }\n var EPSILON = 1e-15;\n if (point.y >= 1 / this.aspectRatio - EPSILON) {\n y = this.getNumTiles(level).y - 1;\n }\n\n return new $.Point(x, y);\n }\n\n // Otherwise call default TileSource->getTileAtPoint() function\n return $.TileSource.prototype.getTileAtPoint.call(this, level, point);\n },\n\n\n /**\n * Responsible for retrieving the url which will return an image for the\n * region specified by the given x, y, and level components.\n * @function\n * @param {Number} level - z index\n * @param {Number} x\n * @param {Number} y\n * @throws {Error}\n */\n getTileUrl: function( level, x, y ){\n\n if(this.emulateLegacyImagePyramid) {\n var url = null;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n url = this.levels[ level ].url;\n }\n return url;\n }\n\n //# constants\n var IIIF_ROTATION = '0',\n //## get the scale (level as a decimal)\n scale = Math.pow( 0.5, this.maxLevel - level ),\n //# image dimensions at this level\n levelWidth,\n levelHeight,\n\n //## iiif region\n tileWidth,\n tileHeight,\n iiifTileSizeWidth,\n iiifTileSizeHeight,\n iiifRegion,\n iiifTileX,\n iiifTileY,\n iiifTileW,\n iiifTileH,\n iiifSize,\n iiifSizeW,\n iiifSizeH,\n iiifQuality,\n uri;\n\n // Use supplied list of scaled resolution sizes if these exist\n if( this.levelSizes ) {\n levelWidth = this.levelSizes[level].width;\n levelHeight = this.levelSizes[level].height;\n }\n // Otherwise calculate the sizes ourselves\n else {\n levelWidth = Math.ceil( this.width * scale );\n levelHeight = Math.ceil( this.height * scale );\n }\n\n tileWidth = this.getTileWidth(level);\n tileHeight = this.getTileHeight(level);\n iiifTileSizeWidth = Math.round( tileWidth / scale );\n iiifTileSizeHeight = Math.round( tileHeight / scale );\n if (this.version === 1) {\n iiifQuality = \"native.\" + this.tileFormat;\n } else {\n iiifQuality = \"default.\" + this.tileFormat;\n }\n if ( levelWidth < tileWidth && levelHeight < tileHeight ){\n if ( this.version === 2 && levelWidth === this.width ) {\n iiifSize = \"full\";\n } else if ( this.version === 3 && levelWidth === this.width && levelHeight === this.height ) {\n iiifSize = \"max\";\n } else if ( this.version === 3 ) {\n iiifSize = levelWidth + \",\" + levelHeight;\n } else {\n iiifSize = levelWidth + \",\";\n }\n iiifRegion = 'full';\n } else {\n iiifTileX = x * iiifTileSizeWidth;\n iiifTileY = y * iiifTileSizeHeight;\n iiifTileW = Math.min( iiifTileSizeWidth, this.width - iiifTileX );\n iiifTileH = Math.min( iiifTileSizeHeight, this.height - iiifTileY );\n if ( x === 0 && y === 0 && iiifTileW === this.width && iiifTileH === this.height ) {\n iiifRegion = \"full\";\n } else {\n iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' );\n }\n iiifSizeW = Math.min( tileWidth, levelWidth - (x * tileWidth) );\n iiifSizeH = Math.min( tileHeight, levelHeight - (y * tileHeight) );\n if ( this.version === 2 && iiifSizeW === this.width ) {\n iiifSize = \"full\";\n } else if ( this.version === 3 && iiifSizeW === this.width && iiifSizeH === this.height ) {\n iiifSize = \"max\";\n } else if (this.version === 3) {\n iiifSize = iiifSizeW + \",\" + iiifSizeH;\n } else {\n iiifSize = iiifSizeW + \",\";\n }\n }\n uri = [ this._id, iiifRegion, iiifSize, IIIF_ROTATION, iiifQuality ].join( '/' );\n\n return uri;\n },\n\n __testonly__: {\n canBeTiled: canBeTiled,\n constructLevels: constructLevels\n }\n\n });\n\n /**\n * Determine whether arbitrary tile requests can be made against a service with the given profile\n * @function\n * @param {Object} options\n * @param {Array|String} options.profile\n * @param {Number} options.version\n * @param {String[]} options.extraFeatures\n * @returns {Boolean}\n */\n function canBeTiled ( options ) {\n var level0Profiles = [\n \"http://library.stanford.edu/iiif/image-api/compliance.html#level0\",\n \"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0\",\n \"http://iiif.io/api/image/2/level0.json\",\n \"level0\",\n \"https://iiif.io/api/image/3/level0.json\"\n ];\n var profileLevel = Array.isArray(options.profile) ? options.profile[0] : options.profile;\n var isLevel0 = (level0Profiles.indexOf(profileLevel) !== -1);\n var hasCanoncicalSizeFeature = false;\n if ( options.version === 2 && options.profile.length > 1 && options.profile[1].supports ) {\n hasCanoncicalSizeFeature = options.profile[1].supports.indexOf( \"sizeByW\" ) !== -1;\n }\n if ( options.version === 3 && options.extraFeatures ) {\n hasCanoncicalSizeFeature = options.extraFeatures.indexOf( \"sizeByWh\" ) !== -1;\n }\n return !isLevel0 || hasCanoncicalSizeFeature;\n }\n\n /**\n * Build the legacy pyramid URLs (one tile per level)\n * @function\n * @param {object} options - infoJson\n * @throws {Error}\n */\n function constructLevels(options) {\n var levels = [];\n for(var i = 0; i < options.sizes.length; i++) {\n levels.push({\n url: options._id + '/full/' + options.sizes[i].width + ',' +\n (options.version === 3 ? options.sizes[i].height : '') +\n '/0/default.' + options.tileFormat,\n width: options.sizes[i].width,\n height: options.sizes[i].height\n });\n }\n return levels.sort(function(a, b) {\n return a.width - b.width;\n });\n }\n\n\n function configureFromXml10(xmlDoc) {\n //parse the xml\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.tagName,\n configuration = null;\n\n if ( rootName === \"info\" ) {\n try {\n configuration = {};\n parseXML10( root, configuration );\n return configuration;\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( $.getString(\"Errors.IIIF\") );\n }\n }\n throw new Error( $.getString( \"Errors.IIIF\" ) );\n }\n\n function parseXML10( node, configuration, property ) {\n var i,\n value;\n if ( node.nodeType === 3 && property ) {//text node\n value = node.nodeValue.trim();\n if( value.match(/^\\d*$/)){\n value = Number( value );\n }\n if( !configuration[ property ] ){\n configuration[ property ] = value;\n }else{\n if( !$.isArray( configuration[ property ] ) ){\n configuration[ property ] = [ configuration[ property ] ];\n }\n configuration[ property ].push( value );\n }\n } else if( node.nodeType === 1 ){\n for( i = 0; i < node.childNodes.length; i++ ){\n parseXML10( node.childNodes[ i ], configuration, node.nodeName );\n }\n }\n }\n\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - OsmTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Derived from the OSM tile source in Rainer Simon's seajax-utils project\n * . Rainer Simon has contributed\n * the included code to the OpenSeadragon project under the New BSD license;\n * see .\n */\n\n\n(function( $ ){\n\n/**\n * @class OsmTileSource\n * @classdesc A tilesource implementation for OpenStreetMap.

    \n *\n * Note 1. Zoomlevels. Deep Zoom and OSM define zoom levels differently. In Deep\n * Zoom, level 0 equals an image of 1x1 pixels. In OSM, level 0 equals an image of\n * 256x256 levels (see http://gasi.ch/blog/inside-deep-zoom-2). I.e. there is a\n * difference of log2(256)=8 levels.

    \n *\n * Note 2. Image dimension. According to the OSM Wiki\n * (http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Zoom_levels)\n * the highest Mapnik zoom level has 256.144x256.144 tiles, with a 256x256\n * pixel size. I.e. the Deep Zoom image dimension is 65.572.864x65.572.864\n * pixels.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n */\n$.OsmTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) {\n var options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[0],\n height: arguments[1],\n tileSize: arguments[2],\n tileOverlap: arguments[3],\n tilesUrl: arguments[4]\n };\n }\n //apply default setting for standard public OpenStreatMaps service\n //but allow them to be specified so fliks can host there own instance\n //or apply against other services supportting the same standard\n if( !options.width || !options.height ){\n options.width = 65572864;\n options.height = 65572864;\n }\n if( !options.tileSize ){\n options.tileSize = 256;\n options.tileOverlap = 0;\n }\n if( !options.tilesUrl ){\n options.tilesUrl = \"http://tile.openstreetmap.org/\";\n }\n options.minLevel = 8;\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.OsmTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.OsmTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return (\n data.type &&\n \"openstreetmaps\" === data.type\n );\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @param {String} url - the url the data was retrieved from if any.\n * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null\n * @returns {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url, postData ){\n return data;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n return this.tilesUrl + (level - 8) + \"/\" + x + \"/\" + y + \".png\";\n }\n});\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TmsTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Derived from the TMS tile source in Rainer Simon's seajax-utils project\n * . Rainer Simon has contributed\n * the included code to the OpenSeadragon project under the New BSD license;\n * see .\n */\n\n\n(function( $ ){\n\n/**\n * @class TmsTileSource\n * @classdesc A tilesource implementation for Tiled Map Services (TMS).\n * TMS tile scheme ( [ as supported by OpenLayers ] is described here\n * ( http://openlayers.org/dev/examples/tms.html ).\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n */\n$.TmsTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) {\n var options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[0],\n height: arguments[1],\n tileSize: arguments[2],\n tileOverlap: arguments[3],\n tilesUrl: arguments[4]\n };\n }\n // TMS has integer multiples of 256 for width/height and adds buffer\n // if necessary -> account for this!\n var bufferedWidth = Math.ceil(options.width / 256) * 256,\n bufferedHeight = Math.ceil(options.height / 256) * 256,\n max;\n\n // Compute number of zoomlevels in this tileset\n if (bufferedWidth > bufferedHeight) {\n max = bufferedWidth / 256;\n } else {\n max = bufferedHeight / 256;\n }\n options.maxLevel = Math.ceil(Math.log(max) / Math.log(2)) - 1;\n options.tileSize = 256;\n options.width = bufferedWidth;\n options.height = bufferedHeight;\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.TmsTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.TmsTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return ( data.type && \"tiledmapservice\" === data.type );\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @param {String} url - the url the data was retrieved from if any.\n * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null\n * @returns {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url, postData ){\n return data;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n // Convert from Deep Zoom definition to TMS zoom definition\n var yTiles = this.getNumTiles( level ).y - 1;\n\n return this.tilesUrl + level + \"/\" + x + \"/\" + (yTiles - y) + \".png\";\n }\n});\n\n\n}( OpenSeadragon ));\n","(function($) {\n\n /**\n * @class ZoomifyTileSource\n * @classdesc A tilesource implementation for the zoomify format.\n *\n * A description of the format can be found here:\n * https://ecommons.cornell.edu/bitstream/handle/1813/5410/Introducing_Zoomify_Image.pdf\n *\n * There are two ways of creating a zoomify tilesource for openseadragon\n *\n * 1) Supplying all necessary information in the tilesource object. A minimal example object for this method looks like this:\n *\n * {\n * type: \"zoomifytileservice\",\n * width: 1000,\n * height: 1000,\n * tilesUrl: \"/test/data/zoomify/\"\n * }\n *\n * The tileSize is set to 256 (the usual Zoomify default) when it is not defined. The tileUrl must the path to the image _directory_.\n *\n * 2) Loading image metadata from xml file: (CURRENTLY NOT SUPPORTED)\n *\n * When creating zoomify formatted images one \"xml\" like file with name ImageProperties.xml\n * will be created as well. Here is an example of such a file:\n *\n * \n *\n * To use this xml file as metadata source you must supply the path to the ImageProperties.xml file and leave out all other parameters:\n * As stated above, this method of loading a zoomify tilesource is currently not supported\n *\n * {\n * type: \"zoomifytileservice\",\n * tilesUrl: \"/test/data/zoomify/ImageProperties.xml\"\n * }\n\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number} width - the pixel width of the image.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {String} tilesUrl\n */\n $.ZoomifyTileSource = function(options) {\n if(typeof options.tileSize === 'undefined'){\n options.tileSize = 256;\n }\n\n if(typeof options.fileFormat === 'undefined'){\n options.fileFormat = 'jpg';\n this.fileFormat = options.fileFormat;\n }\n\n var currentImageSize = {\n x: options.width,\n y: options.height\n };\n options.imageSizes = [{\n x: options.width,\n y: options.height\n }];\n options.gridSize = [this._getGridSize(options.width, options.height, options.tileSize)];\n\n while (parseInt(currentImageSize.x, 10) > options.tileSize || parseInt(currentImageSize.y, 10) > options.tileSize) {\n currentImageSize.x = Math.floor(currentImageSize.x / 2);\n currentImageSize.y = Math.floor(currentImageSize.y / 2);\n options.imageSizes.push({\n x: currentImageSize.x,\n y: currentImageSize.y\n });\n options.gridSize.push(this._getGridSize(currentImageSize.x, currentImageSize.y, options.tileSize));\n }\n options.imageSizes.reverse();\n options.gridSize.reverse();\n options.minLevel = 0;\n options.maxLevel = options.gridSize.length - 1;\n\n OpenSeadragon.TileSource.apply(this, [options]);\n };\n\n $.extend($.ZoomifyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ZoomifyTileSource.prototype */ {\n\n //private\n _getGridSize: function(width, height, tileSize) {\n return {\n x: Math.ceil(width / tileSize),\n y: Math.ceil(height / tileSize)\n };\n },\n\n //private\n _calculateAbsoluteTileNumber: function(level, x, y) {\n var num = 0;\n var size = {};\n\n //Sum up all tiles below the level we want the number of tiles\n for (var z = 0; z < level; z++) {\n size = this.gridSize[z];\n num += size.x * size.y;\n }\n //Add the tiles of the level\n size = this.gridSize[level];\n num += size.x * y + x;\n return num;\n },\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function(data, url) {\n return (data.type && \"zoomifytileservice\" === data.type);\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @param {String} url - the url the data was retrieved from if any.\n * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null\n * @returns {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function(data, url, postData) {\n return data;\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function(level, x, y) {\n //console.log(level);\n var result = 0;\n var num = this._calculateAbsoluteTileNumber(level, x, y);\n result = Math.floor(num / 256);\n return this.tilesUrl + 'TileGroup' + result + '/' + level + '-' + x + '-' + y + '.' + this.fileFormat;\n\n }\n });\n\n}(OpenSeadragon));\n\n","/*\n * OpenSeadragon - LegacyTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class LegacyTileSource\n * @classdesc The LegacyTileSource allows simple, traditional image pyramids to be loaded\n * into an OpenSeadragon Viewer. Basically, this translates to the historically\n * common practice of starting with a 'master' image, maybe a tiff for example,\n * and generating a set of 'service' images like one or more thumbnails, a medium\n * resolution image and a high resolution image in standard web formats like\n * png or jpg.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Array} levels An array of file descriptions, each is an object with\n * a 'url', a 'width', and a 'height'. Overriding classes can expect more\n * properties but these properties are sufficient for this implementation.\n * Additionally, the levels are required to be listed in order from\n * smallest to largest.\n * @property {Number} aspectRatio\n * @property {Number} dimensions\n * @property {Number} tileSize\n * @property {Number} tileOverlap\n * @property {Number} minLevel\n * @property {Number} maxLevel\n * @property {Array} levels\n */\n$.LegacyTileSource = function( levels ) {\n\n var options,\n width,\n height;\n\n if( $.isArray( levels ) ){\n options = {\n type: 'legacy-image-pyramid',\n levels: levels\n };\n }\n\n //clean up the levels to make sure we support all formats\n options.levels = filterFiles( options.levels );\n\n if ( options.levels.length > 0 ) {\n width = options.levels[ options.levels.length - 1 ].width;\n height = options.levels[ options.levels.length - 1 ].height;\n }\n else {\n width = 0;\n height = 0;\n $.console.error( \"No supported image formats found\" );\n }\n\n $.extend( true, options, {\n width: width,\n height: height,\n tileSize: Math.max( height, width ),\n tileOverlap: 0,\n minLevel: 0,\n maxLevel: options.levels.length > 0 ? options.levels.length - 1 : 0\n } );\n\n $.TileSource.apply( this, [ options ] );\n\n this.levels = options.levels;\n};\n\n$.extend( $.LegacyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.LegacyTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return (\n data.type &&\n \"legacy-image-pyramid\" === data.type\n ) || (\n data.documentElement &&\n \"legacy-image-pyramid\" === data.documentElement.getAttribute('type')\n );\n },\n\n\n /**\n *\n * @function\n * @param {Object|XMLDocument} configuration - the raw configuration\n * @param {String} dataUrl - the url the data was retrieved from if any.\n * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null\n * @returns {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( configuration, dataUrl, postData ){\n\n var options;\n\n if( !$.isPlainObject(configuration) ){\n\n options = configureFromXML( this, configuration );\n\n }else{\n\n options = configureFromObject( this, configuration );\n }\n\n return options;\n\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function ( level ) {\n var levelScale = NaN;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n levelScale =\n this.levels[ level ].width /\n this.levels[ this.maxLevel ].width;\n }\n return levelScale;\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n var scale = this.getLevelScale( level );\n if ( scale ){\n return new $.Point( 1, 1 );\n } else {\n return new $.Point( 0, 0 );\n }\n },\n\n /**\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @throws {Error}\n */\n getTileUrl: function ( level, x, y ) {\n var url = null;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n url = this.levels[ level ].url;\n }\n return url;\n }\n} );\n\n/**\n * This method removes any files from the Array which don't conform to our\n * basic requirements for a 'level' in the LegacyTileSource.\n * @private\n * @inner\n * @function\n */\nfunction filterFiles( files ){\n var filtered = [],\n file,\n i;\n for( i = 0; i < files.length; i++ ){\n file = files[ i ];\n if( file.height &&\n file.width &&\n file.url ){\n //This is sufficient to serve as a level\n filtered.push({\n url: file.url,\n width: Number( file.width ),\n height: Number( file.height )\n });\n }\n else {\n $.console.error( 'Unsupported image format: %s', file.url ? file.url : '' );\n }\n }\n\n return filtered.sort(function(a, b) {\n return a.height - b.height;\n });\n\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromXML( tileSource, xmlDoc ){\n\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.tagName,\n conf = null,\n levels = [],\n level,\n i;\n\n if ( rootName === \"image\" ) {\n\n try {\n conf = {\n type: root.getAttribute( \"type\" ),\n levels: []\n };\n\n levels = root.getElementsByTagName( \"level\" );\n for ( i = 0; i < levels.length; i++ ) {\n level = levels[ i ];\n\n conf.levels.push({\n url: level.getAttribute( \"url\" ),\n width: parseInt( level.getAttribute( \"width\" ), 10 ),\n height: parseInt( level.getAttribute( \"height\" ), 10 )\n });\n }\n\n return configureFromObject( tileSource, conf );\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( 'Unknown error parsing Legacy Image Pyramid XML.' );\n }\n } else if ( rootName === \"collection\" ) {\n throw new Error( 'Legacy Image Pyramid Collections not yet supported.' );\n } else if ( rootName === \"error\" ) {\n throw new Error( 'Error: ' + xmlDoc );\n }\n\n throw new Error( 'Unknown element ' + rootName );\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromObject( tileSource, configuration ){\n\n return configuration.levels;\n\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ImageTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ($) {\n\n /**\n * @class ImageTileSource\n * @classdesc The ImageTileSource allows a simple image to be loaded\n * into an OpenSeadragon Viewer.\n * There are 2 ways to open an ImageTileSource:\n * 1. viewer.open({type: 'image', url: fooUrl});\n * 2. viewer.open(new OpenSeadragon.ImageTileSource({url: fooUrl}));\n *\n * With the first syntax, the crossOriginPolicy, ajaxWithCredentials and\n * useCanvas options are inherited from the viewer if they are not\n * specified directly in the options object.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Object} options Options object.\n * @param {String} options.url URL of the image\n * @param {Boolean} [options.buildPyramid=true] If set to true (default), a\n * pyramid will be built internally to provide a better downsampling.\n * @param {String|Boolean} [options.crossOriginPolicy=false] Valid values are\n * 'Anonymous', 'use-credentials', and false. If false, image requests will\n * not use CORS preventing internal pyramid building for images from other\n * domains.\n * @param {String|Boolean} [options.ajaxWithCredentials=false] Whether to set\n * the withCredentials XHR flag for AJAX requests (when loading tile sources).\n * @param {Boolean} [options.useCanvas=true] Set to false to prevent any use\n * of the canvas API.\n */\n $.ImageTileSource = function (options) {\n\n options = $.extend({\n buildPyramid: true,\n crossOriginPolicy: false,\n ajaxWithCredentials: false,\n useCanvas: true\n }, options);\n $.TileSource.apply(this, [options]);\n\n };\n\n $.extend($.ImageTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ImageTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function (data, url) {\n return data.type && data.type === \"image\";\n },\n /**\n *\n * @function\n * @param {Object} options - the options\n * @param {String} dataUrl - the url the image was retrieved from, if any.\n * @param {String} postData - HTTP POST data in k=v&k2=v2... form or null\n * @returns {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function (options, dataUrl, postData) {\n return options;\n },\n /**\n * Responsible for retrieving, and caching the\n * image metadata pertinent to this TileSources implementation.\n * @function\n * @param {String} url\n * @throws {Error}\n */\n getImageInfo: function (url) {\n var image = this._image = new Image();\n var _this = this;\n\n if (this.crossOriginPolicy) {\n image.crossOrigin = this.crossOriginPolicy;\n }\n if (this.ajaxWithCredentials) {\n image.useCredentials = this.ajaxWithCredentials;\n }\n\n $.addEvent(image, 'load', function () {\n _this.width = image.naturalWidth;\n _this.height = image.naturalHeight;\n _this.aspectRatio = _this.width / _this.height;\n _this.dimensions = new $.Point(_this.width, _this.height);\n _this._tileWidth = _this.width;\n _this._tileHeight = _this.height;\n _this.tileOverlap = 0;\n _this.minLevel = 0;\n _this.levels = _this._buildLevels();\n _this.maxLevel = _this.levels.length - 1;\n\n _this.ready = true;\n\n // Note: this event is documented elsewhere, in TileSource\n _this.raiseEvent('ready', {tileSource: _this});\n });\n\n $.addEvent(image, 'error', function () {\n // Note: this event is documented elsewhere, in TileSource\n _this.raiseEvent('open-failed', {\n message: \"Error loading image at \" + url,\n source: url\n });\n });\n\n image.src = url;\n },\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function (level) {\n var levelScale = NaN;\n if (level >= this.minLevel && level <= this.maxLevel) {\n levelScale =\n this.levels[level].width /\n this.levels[this.maxLevel].width;\n }\n return levelScale;\n },\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function (level) {\n var scale = this.getLevelScale(level);\n if (scale) {\n return new $.Point(1, 1);\n } else {\n return new $.Point(0, 0);\n }\n },\n /**\n * Retrieves a tile url\n * @function\n * @param {Number} level Level of the tile\n * @param {Number} x x coordinate of the tile\n * @param {Number} y y coordinate of the tile\n */\n getTileUrl: function (level, x, y) {\n var url = null;\n if (level >= this.minLevel && level <= this.maxLevel) {\n url = this.levels[level].url;\n }\n return url;\n },\n /**\n * Retrieves a tile context 2D\n * @function\n * @param {Number} level Level of the tile\n * @param {Number} x x coordinate of the tile\n * @param {Number} y y coordinate of the tile\n */\n getContext2D: function (level, x, y) {\n var context = null;\n if (level >= this.minLevel && level <= this.maxLevel) {\n context = this.levels[level].context2D;\n }\n return context;\n },\n /**\n * Destroys ImageTileSource\n * @function\n */\n destroy: function () {\n this._freeupCanvasMemory();\n },\n\n // private\n //\n // Builds the different levels of the pyramid if possible\n // (i.e. if canvas API enabled and no canvas tainting issue).\n _buildLevels: function () {\n var levels = [{\n url: this._image.src,\n width: this._image.naturalWidth,\n height: this._image.naturalHeight\n }];\n\n if (!this.buildPyramid || !$.supportsCanvas || !this.useCanvas) {\n // We don't need the image anymore. Allows it to be GC.\n delete this._image;\n return levels;\n }\n\n var currentWidth = this._image.naturalWidth;\n var currentHeight = this._image.naturalHeight;\n\n\n var bigCanvas = document.createElement(\"canvas\");\n var bigContext = bigCanvas.getContext(\"2d\");\n\n bigCanvas.width = currentWidth;\n bigCanvas.height = currentHeight;\n bigContext.drawImage(this._image, 0, 0, currentWidth, currentHeight);\n // We cache the context of the highest level because the browser\n // is a lot faster at downsampling something it already has\n // downsampled before.\n levels[0].context2D = bigContext;\n // We don't need the image anymore. Allows it to be GC.\n delete this._image;\n\n if ($.isCanvasTainted(bigCanvas)) {\n // If the canvas is tainted, we can't compute the pyramid.\n return levels;\n }\n\n // We build smaller levels until either width or height becomes\n // 1 pixel wide.\n while (currentWidth >= 2 && currentHeight >= 2) {\n currentWidth = Math.floor(currentWidth / 2);\n currentHeight = Math.floor(currentHeight / 2);\n var smallCanvas = document.createElement(\"canvas\");\n var smallContext = smallCanvas.getContext(\"2d\");\n smallCanvas.width = currentWidth;\n smallCanvas.height = currentHeight;\n smallContext.drawImage(bigCanvas, 0, 0, currentWidth, currentHeight);\n\n levels.splice(0, 0, {\n context2D: smallContext,\n width: currentWidth,\n height: currentHeight\n });\n\n bigCanvas = smallCanvas;\n bigContext = smallContext;\n }\n return levels;\n },\n /**\n * Free up canvas memory\n * (iOS 12 or higher on 2GB RAM device has only 224MB canvas memory,\n * and Safari keeps canvas until its height and width will be set to 0).\n * @function\n */\n _freeupCanvasMemory: function () {\n for (var i = 0; i < this.levels.length; i++) {\n if(this.levels[i].context2D){\n this.levels[i].context2D.canvas.height = 0;\n this.levels[i].context2D.canvas.width = 0;\n }\n }\n },\n });\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - TileSourceCollection\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n// deprecated\n$.TileSourceCollection = function(tileSize, tileSources, rows, layout) {\n $.console.error('TileSourceCollection is deprecated; use World instead');\n};\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Button\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * An enumeration of button states\n * @member ButtonState\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {Number} REST\n * @property {Number} GROUP\n * @property {Number} HOVER\n * @property {Number} DOWN\n */\n$.ButtonState = {\n REST: 0,\n GROUP: 1,\n HOVER: 2,\n DOWN: 3\n};\n\n/**\n * @class Button\n * @classdesc Manages events, hover states for individual buttons, tool-tips, as well\n * as fading the buttons out when the user has not interacted with them\n * for a specified period.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @param {Object} options\n * @param {Element} [options.element=null] Element to use as the button. If not specified, an HTML <div> element is created.\n * @param {String} [options.tooltip=null] Provides context help for the button when the\n * user hovers over it.\n * @param {String} [options.srcRest=null] URL of image to use in 'rest' state.\n * @param {String} [options.srcGroup=null] URL of image to use in 'up' state.\n * @param {String} [options.srcHover=null] URL of image to use in 'hover' state.\n * @param {String} [options.srcDown=null] URL of image to use in 'down' state.\n * @param {Number} [options.fadeDelay=0] How long to wait before fading.\n * @param {Number} [options.fadeLength=2000] How long should it take to fade the button.\n * @param {OpenSeadragon.EventHandler} [options.onPress=null] Event handler callback for {@link OpenSeadragon.Button.event:press}.\n * @param {OpenSeadragon.EventHandler} [options.onRelease=null] Event handler callback for {@link OpenSeadragon.Button.event:release}.\n * @param {OpenSeadragon.EventHandler} [options.onClick=null] Event handler callback for {@link OpenSeadragon.Button.event:click}.\n * @param {OpenSeadragon.EventHandler} [options.onEnter=null] Event handler callback for {@link OpenSeadragon.Button.event:enter}.\n * @param {OpenSeadragon.EventHandler} [options.onExit=null] Event handler callback for {@link OpenSeadragon.Button.event:exit}.\n * @param {OpenSeadragon.EventHandler} [options.onFocus=null] Event handler callback for {@link OpenSeadragon.Button.event:focus}.\n * @param {OpenSeadragon.EventHandler} [options.onBlur=null] Event handler callback for {@link OpenSeadragon.Button.event:blur}.\n * @param {Object} [options.userData=null] Arbitrary object to be passed unchanged to any attached handler methods.\n */\n$.Button = function( options ) {\n\n var _this = this;\n\n $.EventSource.call( this );\n\n $.extend( true, this, {\n\n tooltip: null,\n srcRest: null,\n srcGroup: null,\n srcHover: null,\n srcDown: null,\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold,\n clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold,\n /**\n * How long to wait before fading.\n * @member {Number} fadeDelay\n * @memberof OpenSeadragon.Button#\n */\n fadeDelay: 0,\n /**\n * How long should it take to fade the button.\n * @member {Number} fadeLength\n * @memberof OpenSeadragon.Button#\n */\n fadeLength: 2000,\n onPress: null,\n onRelease: null,\n onClick: null,\n onEnter: null,\n onExit: null,\n onFocus: null,\n onBlur: null,\n userData: null\n\n }, options );\n\n /**\n * The button element.\n * @member {Element} element\n * @memberof OpenSeadragon.Button#\n */\n this.element = options.element || $.makeNeutralElement(\"div\");\n\n //if the user has specified the element to bind the control to explicitly\n //then do not add the default control images\n if ( !options.element ) {\n this.imgRest = $.makeTransparentImage( this.srcRest );\n this.imgGroup = $.makeTransparentImage( this.srcGroup );\n this.imgHover = $.makeTransparentImage( this.srcHover );\n this.imgDown = $.makeTransparentImage( this.srcDown );\n\n this.imgRest.alt =\n this.imgGroup.alt =\n this.imgHover.alt =\n this.imgDown.alt =\n this.tooltip;\n\n // Allow pointer events to pass through the img elements so implicit\n // pointer capture works on touch devices\n $.setElementPointerEventsNone( this.imgRest );\n $.setElementPointerEventsNone( this.imgGroup );\n $.setElementPointerEventsNone( this.imgHover );\n $.setElementPointerEventsNone( this.imgDown );\n\n this.element.style.position = \"relative\";\n $.setElementTouchActionNone( this.element );\n\n this.imgGroup.style.position =\n this.imgHover.style.position =\n this.imgDown.style.position =\n \"absolute\";\n\n this.imgGroup.style.top =\n this.imgHover.style.top =\n this.imgDown.style.top =\n \"0px\";\n\n this.imgGroup.style.left =\n this.imgHover.style.left =\n this.imgDown.style.left =\n \"0px\";\n\n this.imgHover.style.visibility =\n this.imgDown.style.visibility =\n \"hidden\";\n\n if ($.Browser.vendor === $.BROWSERS.FIREFOX && $.Browser.version < 3) {\n this.imgGroup.style.top =\n this.imgHover.style.top =\n this.imgDown.style.top =\n \"\";\n }\n\n this.element.appendChild( this.imgRest );\n this.element.appendChild( this.imgGroup );\n this.element.appendChild( this.imgHover );\n this.element.appendChild( this.imgDown );\n }\n\n\n this.addHandler(\"press\", this.onPress);\n this.addHandler(\"release\", this.onRelease);\n this.addHandler(\"click\", this.onClick);\n this.addHandler(\"enter\", this.onEnter);\n this.addHandler(\"exit\", this.onExit);\n this.addHandler(\"focus\", this.onFocus);\n this.addHandler(\"blur\", this.onBlur);\n\n /**\n * The button's current state.\n * @member {OpenSeadragon.ButtonState} currentState\n * @memberof OpenSeadragon.Button#\n */\n this.currentState = $.ButtonState.GROUP;\n\n // When the button last began to fade.\n this.fadeBeginTime = null;\n // Whether this button should fade after user stops interacting with the viewport.\n this.shouldFade = false;\n\n this.element.style.display = \"inline-block\";\n this.element.style.position = \"relative\";\n this.element.title = this.tooltip;\n\n /**\n * Tracks mouse/touch/key events on the button.\n * @member {OpenSeadragon.MouseTracker} tracker\n * @memberof OpenSeadragon.Button#\n */\n this.tracker = new $.MouseTracker({\n\n userData: 'Button.tracker',\n element: this.element,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n\n enterHandler: function( event ) {\n if ( event.insideElementPressed ) {\n inTo( _this, $.ButtonState.DOWN );\n /**\n * Raised when the cursor enters the Button element.\n *\n * @event enter\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"enter\", { originalEvent: event.originalEvent } );\n } else if ( !event.buttonDownAny ) {\n inTo( _this, $.ButtonState.HOVER );\n }\n },\n\n focusHandler: function ( event ) {\n _this.tracker.enterHandler( event );\n /**\n * Raised when the Button element receives focus.\n *\n * @event focus\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"focus\", { originalEvent: event.originalEvent } );\n },\n\n leaveHandler: function( event ) {\n outTo( _this, $.ButtonState.GROUP );\n if ( event.insideElementPressed ) {\n /**\n * Raised when the cursor leaves the Button element.\n *\n * @event exit\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"exit\", { originalEvent: event.originalEvent } );\n }\n },\n\n blurHandler: function ( event ) {\n _this.tracker.leaveHandler( event );\n /**\n * Raised when the Button element loses focus.\n *\n * @event blur\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"blur\", { originalEvent: event.originalEvent } );\n },\n\n pressHandler: function ( event ) {\n inTo( _this, $.ButtonState.DOWN );\n /**\n * Raised when a mouse button is pressed or touch occurs in the Button element.\n *\n * @event press\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"press\", { originalEvent: event.originalEvent } );\n },\n\n releaseHandler: function( event ) {\n if ( event.insideElementPressed && event.insideElementReleased ) {\n outTo( _this, $.ButtonState.HOVER );\n /**\n * Raised when the mouse button is released or touch ends in the Button element.\n *\n * @event release\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"release\", { originalEvent: event.originalEvent } );\n } else if ( event.insideElementPressed ) {\n outTo( _this, $.ButtonState.GROUP );\n } else {\n inTo( _this, $.ButtonState.HOVER );\n }\n },\n\n clickHandler: function( event ) {\n if ( event.quick ) {\n /**\n * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold.\n *\n * @event click\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent(\"click\", { originalEvent: event.originalEvent });\n }\n },\n\n keyHandler: function( event ){\n //console.log( \"%s : handling key %s!\", _this.tooltip, event.keyCode);\n if( 13 === event.keyCode ){\n /***\n * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold.\n *\n * @event click\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"click\", { originalEvent: event.originalEvent } );\n /***\n * Raised when the mouse button is released or touch ends in the Button element.\n *\n * @event release\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"release\", { originalEvent: event.originalEvent } );\n\n event.preventDefault = true;\n } else{\n event.preventDefault = false;\n }\n }\n\n });\n\n outTo( this, $.ButtonState.REST );\n};\n\n$.extend( $.Button.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.Button.prototype */{\n\n /**\n * Used by a button container element (e.g. a ButtonGroup) to transition the button state\n * to ButtonState.GROUP.\n * @function\n */\n notifyGroupEnter: function() {\n inTo( this, $.ButtonState.GROUP );\n },\n\n /**\n * Used by a button container element (e.g. a ButtonGroup) to transition the button state\n * to ButtonState.REST.\n * @function\n */\n notifyGroupExit: function() {\n outTo( this, $.ButtonState.REST );\n },\n\n /**\n * @function\n */\n disable: function(){\n this.notifyGroupExit();\n this.element.disabled = true;\n this.tracker.setTracking(false);\n $.setElementOpacity( this.element, 0.2, true );\n },\n\n /**\n * @function\n */\n enable: function(){\n this.element.disabled = false;\n this.tracker.setTracking(true);\n $.setElementOpacity( this.element, 1.0, true );\n this.notifyGroupEnter();\n },\n\n destroy: function() {\n if (this.imgRest) {\n this.element.removeChild(this.imgRest);\n this.imgRest = null;\n }\n if (this.imgGroup) {\n this.element.removeChild(this.imgGroup);\n this.imgGroup = null;\n }\n if (this.imgHover) {\n this.element.removeChild(this.imgHover);\n this.imgHover = null;\n }\n if (this.imgDown) {\n this.element.removeChild(this.imgDown);\n this.imgDown = null;\n }\n this.removeAllHandlers();\n this.tracker.destroy();\n this.element = null;\n }\n\n});\n\n\nfunction scheduleFade( button ) {\n $.requestAnimationFrame(function(){\n updateFade( button );\n });\n}\n\nfunction updateFade( button ) {\n var currentTime,\n deltaTime,\n opacity;\n\n if ( button.shouldFade ) {\n currentTime = $.now();\n deltaTime = currentTime - button.fadeBeginTime;\n opacity = 1.0 - deltaTime / button.fadeLength;\n opacity = Math.min( 1.0, opacity );\n opacity = Math.max( 0.0, opacity );\n\n if( button.imgGroup ){\n $.setElementOpacity( button.imgGroup, opacity, true );\n }\n if ( opacity > 0 ) {\n // fade again\n scheduleFade( button );\n }\n }\n}\n\nfunction beginFading( button ) {\n button.shouldFade = true;\n button.fadeBeginTime = $.now() + button.fadeDelay;\n window.setTimeout( function(){\n scheduleFade( button );\n }, button.fadeDelay );\n}\n\nfunction stopFading( button ) {\n button.shouldFade = false;\n if( button.imgGroup ){\n $.setElementOpacity( button.imgGroup, 1.0, true );\n }\n}\n\nfunction inTo( button, newState ) {\n\n if( button.element.disabled ){\n return;\n }\n\n if ( newState >= $.ButtonState.GROUP &&\n button.currentState === $.ButtonState.REST ) {\n stopFading( button );\n button.currentState = $.ButtonState.GROUP;\n }\n\n if ( newState >= $.ButtonState.HOVER &&\n button.currentState === $.ButtonState.GROUP ) {\n if( button.imgHover ){\n button.imgHover.style.visibility = \"\";\n }\n button.currentState = $.ButtonState.HOVER;\n }\n\n if ( newState >= $.ButtonState.DOWN &&\n button.currentState === $.ButtonState.HOVER ) {\n if( button.imgDown ){\n button.imgDown.style.visibility = \"\";\n }\n button.currentState = $.ButtonState.DOWN;\n }\n}\n\n\nfunction outTo( button, newState ) {\n\n if( button.element.disabled ){\n return;\n }\n\n if ( newState <= $.ButtonState.HOVER &&\n button.currentState === $.ButtonState.DOWN ) {\n if( button.imgDown ){\n button.imgDown.style.visibility = \"hidden\";\n }\n button.currentState = $.ButtonState.HOVER;\n }\n\n if ( newState <= $.ButtonState.GROUP &&\n button.currentState === $.ButtonState.HOVER ) {\n if( button.imgHover ){\n button.imgHover.style.visibility = \"hidden\";\n }\n button.currentState = $.ButtonState.GROUP;\n }\n\n if ( newState <= $.ButtonState.REST &&\n button.currentState === $.ButtonState.GROUP ) {\n beginFading( button );\n button.currentState = $.ButtonState.REST;\n }\n}\n\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ButtonGroup\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n/**\n * @class ButtonGroup\n * @classdesc Manages events on groups of buttons.\n *\n * @memberof OpenSeadragon\n * @param {Object} options - A dictionary of settings applied against the entire group of buttons.\n * @param {Array} options.buttons Array of buttons\n * @param {Element} [options.element] Element to use as the container\n **/\n$.ButtonGroup = function( options ) {\n\n $.extend( true, this, {\n /**\n * An array containing the buttons themselves.\n * @member {Array} buttons\n * @memberof OpenSeadragon.ButtonGroup#\n */\n buttons: [],\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold,\n clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold,\n labelText: \"\"\n }, options );\n\n // copy the button elements TODO: Why?\n var buttons = this.buttons.concat([]),\n _this = this,\n i;\n\n /**\n * The shared container for the buttons.\n * @member {Element} element\n * @memberof OpenSeadragon.ButtonGroup#\n */\n this.element = options.element || $.makeNeutralElement( \"div\" );\n\n // TODO What if there IS an options.group specified?\n if( !options.group ){\n this.element.style.display = \"inline-block\";\n //this.label = $.makeNeutralElement( \"label\" );\n //TODO: support labels for ButtonGroups\n //this.label.innerHTML = this.labelText;\n //this.element.appendChild( this.label );\n for ( i = 0; i < buttons.length; i++ ) {\n this.element.appendChild( buttons[ i ].element );\n }\n }\n\n $.setElementTouchActionNone( this.element );\n\n /**\n * Tracks mouse/touch/key events across the group of buttons.\n * @member {OpenSeadragon.MouseTracker} tracker\n * @memberof OpenSeadragon.ButtonGroup#\n */\n this.tracker = new $.MouseTracker({\n userData: 'ButtonGroup.tracker',\n element: this.element,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n enterHandler: function ( event ) {\n var i;\n for ( i = 0; i < _this.buttons.length; i++ ) {\n _this.buttons[ i ].notifyGroupEnter();\n }\n },\n leaveHandler: function ( event ) {\n var i;\n if ( !event.insideElementPressed ) {\n for ( i = 0; i < _this.buttons.length; i++ ) {\n _this.buttons[ i ].notifyGroupExit();\n }\n }\n },\n });\n};\n\n/** @lends OpenSeadragon.ButtonGroup.prototype */\n$.ButtonGroup.prototype = {\n\n /**\n * Adds the given button to this button group.\n *\n * @function\n * @param {OpenSeadragon.Button} button\n */\n addButton: function( button ){\n this.buttons.push(button);\n this.element.appendChild(button.element);\n },\n\n /**\n * TODO: Figure out why this is used on the public API and if a more useful\n * api can be created.\n * @function\n * @private\n */\n emulateEnter: function() {\n this.tracker.enterHandler( { eventSource: this.tracker } );\n },\n\n /**\n * TODO: Figure out why this is used on the public API and if a more useful\n * api can be created.\n * @function\n * @private\n */\n emulateLeave: function() {\n this.tracker.leaveHandler( { eventSource: this.tracker } );\n },\n\n destroy: function() {\n while (this.buttons.length) {\n var button = this.buttons.pop();\n this.element.removeChild(button.element);\n button.destroy();\n }\n this.tracker.destroy();\n this.element = null;\n }\n};\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Rect\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n/**\n * @class Rect\n * @classdesc A Rectangle is described by it top left coordinates (x, y), width,\n * height and degrees of rotation around (x, y).\n * Note that the coordinate system used is the one commonly used with images:\n * x increases when going to the right\n * y increases when going to the bottom\n * degrees increases clockwise with 0 being the horizontal\n *\n * The constructor normalizes the rectangle to always have 0 <= degrees < 90\n *\n * @memberof OpenSeadragon\n * @param {Number} [x=0] The vector component 'x'.\n * @param {Number} [y=0] The vector component 'y'.\n * @param {Number} [width=0] The vector component 'width'.\n * @param {Number} [height=0] The vector component 'height'.\n * @param {Number} [degrees=0] Rotation of the rectangle around (x,y) in degrees.\n */\n$.Rect = function(x, y, width, height, degrees) {\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Rect#\n */\n this.x = typeof (x) === \"number\" ? x : 0;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Rect#\n */\n this.y = typeof (y) === \"number\" ? y : 0;\n /**\n * The vector component 'width'.\n * @member {Number} width\n * @memberof OpenSeadragon.Rect#\n */\n this.width = typeof (width) === \"number\" ? width : 0;\n /**\n * The vector component 'height'.\n * @member {Number} height\n * @memberof OpenSeadragon.Rect#\n */\n this.height = typeof (height) === \"number\" ? height : 0;\n\n /**\n * The rotation of the rectangle, in degrees.\n * @member {Number} degrees\n * @memberof OpenSeadragon.Rect#\n */\n this.degrees = typeof (degrees) === \"number\" ? degrees : 0;\n\n // Normalizes the rectangle.\n this.degrees = $.positiveModulo(this.degrees, 360);\n var newTopLeft, newWidth;\n if (this.degrees >= 270) {\n newTopLeft = this.getTopRight();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n newWidth = this.height;\n this.height = this.width;\n this.width = newWidth;\n this.degrees -= 270;\n } else if (this.degrees >= 180) {\n newTopLeft = this.getBottomRight();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n this.degrees -= 180;\n } else if (this.degrees >= 90) {\n newTopLeft = this.getBottomLeft();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n newWidth = this.height;\n this.height = this.width;\n this.width = newWidth;\n this.degrees -= 90;\n }\n};\n\n/**\n * Builds a rectangle having the 3 specified points as summits.\n * @static\n * @memberof OpenSeadragon.Rect\n * @param {OpenSeadragon.Point} topLeft\n * @param {OpenSeadragon.Point} topRight\n * @param {OpenSeadragon.Point} bottomLeft\n * @returns {OpenSeadragon.Rect}\n */\n$.Rect.fromSummits = function(topLeft, topRight, bottomLeft) {\n var width = topLeft.distanceTo(topRight);\n var height = topLeft.distanceTo(bottomLeft);\n var diff = topRight.minus(topLeft);\n var radians = Math.atan(diff.y / diff.x);\n if (diff.x < 0) {\n radians += Math.PI;\n } else if (diff.y < 0) {\n radians += 2 * Math.PI;\n }\n return new $.Rect(\n topLeft.x,\n topLeft.y,\n width,\n height,\n radians / Math.PI * 180);\n};\n\n/** @lends OpenSeadragon.Rect.prototype */\n$.Rect.prototype = {\n /**\n * @function\n * @returns {OpenSeadragon.Rect} a duplicate of this Rect\n */\n clone: function() {\n return new $.Rect(\n this.x,\n this.y,\n this.width,\n this.height,\n this.degrees);\n },\n\n /**\n * The aspect ratio is simply the ratio of width to height.\n * @function\n * @returns {Number} The ratio of width to height.\n */\n getAspectRatio: function() {\n return this.width / this.height;\n },\n\n /**\n * Provides the coordinates of the upper-left corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the upper-left corner of\n * the rectangle.\n */\n getTopLeft: function() {\n return new $.Point(\n this.x,\n this.y\n );\n },\n\n /**\n * Provides the coordinates of the bottom-right corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the bottom-right corner of\n * the rectangle.\n */\n getBottomRight: function() {\n return new $.Point(this.x + this.width, this.y + this.height)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Provides the coordinates of the top-right corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the top-right corner of\n * the rectangle.\n */\n getTopRight: function() {\n return new $.Point(this.x + this.width, this.y)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Provides the coordinates of the bottom-left corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the bottom-left corner of\n * the rectangle.\n */\n getBottomLeft: function() {\n return new $.Point(this.x, this.y + this.height)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Computes the center of the rectangle.\n * @function\n * @returns {OpenSeadragon.Point} The center of the rectangle as represented\n * as represented by a 2-dimensional vector (x,y)\n */\n getCenter: function() {\n return new $.Point(\n this.x + this.width / 2.0,\n this.y + this.height / 2.0\n ).rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Returns the width and height component as a vector OpenSeadragon.Point\n * @function\n * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the\n * width and height of the rectangle.\n */\n getSize: function() {\n return new $.Point(this.width, this.height);\n },\n\n /**\n * Determines if two Rectangles have equivalent components.\n * @function\n * @param {OpenSeadragon.Rect} rectangle The Rectangle to compare to.\n * @returns {Boolean} 'true' if all components are equal, otherwise 'false'.\n */\n equals: function(other) {\n return (other instanceof $.Rect) &&\n this.x === other.x &&\n this.y === other.y &&\n this.width === other.width &&\n this.height === other.height &&\n this.degrees === other.degrees;\n },\n\n /**\n * Multiply all dimensions (except degrees) in this Rect by a factor and\n * return a new Rect.\n * @function\n * @param {Number} factor The factor to multiply vector components.\n * @returns {OpenSeadragon.Rect} A new rect representing the multiplication\n * of the vector components by the factor\n */\n times: function(factor) {\n return new $.Rect(\n this.x * factor,\n this.y * factor,\n this.width * factor,\n this.height * factor,\n this.degrees);\n },\n\n /**\n * Translate/move this Rect by a vector and return new Rect.\n * @function\n * @param {OpenSeadragon.Point} delta The translation vector.\n * @returns {OpenSeadragon.Rect} A new rect with altered position\n */\n translate: function(delta) {\n return new $.Rect(\n this.x + delta.x,\n this.y + delta.y,\n this.width,\n this.height,\n this.degrees);\n },\n\n /**\n * Returns the smallest rectangle that will contain this and the given\n * rectangle bounding boxes.\n * @param {OpenSeadragon.Rect} rect\n * @returns {OpenSeadragon.Rect} The new rectangle.\n */\n union: function(rect) {\n var thisBoundingBox = this.getBoundingBox();\n var otherBoundingBox = rect.getBoundingBox();\n\n var left = Math.min(thisBoundingBox.x, otherBoundingBox.x);\n var top = Math.min(thisBoundingBox.y, otherBoundingBox.y);\n var right = Math.max(\n thisBoundingBox.x + thisBoundingBox.width,\n otherBoundingBox.x + otherBoundingBox.width);\n var bottom = Math.max(\n thisBoundingBox.y + thisBoundingBox.height,\n otherBoundingBox.y + otherBoundingBox.height);\n\n return new $.Rect(\n left,\n top,\n right - left,\n bottom - top);\n },\n\n /**\n * Returns the bounding box of the intersection of this rectangle with the\n * given rectangle.\n * @param {OpenSeadragon.Rect} rect\n * @returns {OpenSeadragon.Rect} the bounding box of the intersection\n * or null if the rectangles don't intersect.\n */\n intersection: function(rect) {\n // Simplified version of Weiler Atherton clipping algorithm\n // https://en.wikipedia.org/wiki/Weiler%E2%80%93Atherton_clipping_algorithm\n // Because we just want the bounding box of the intersection,\n // we can just compute the bounding box of:\n // 1. all the summits of this which are inside rect\n // 2. all the summits of rect which are inside this\n // 3. all the intersections of rect and this\n var EPSILON = 0.0000000001;\n\n var intersectionPoints = [];\n\n var thisTopLeft = this.getTopLeft();\n if (rect.containsPoint(thisTopLeft, EPSILON)) {\n intersectionPoints.push(thisTopLeft);\n }\n var thisTopRight = this.getTopRight();\n if (rect.containsPoint(thisTopRight, EPSILON)) {\n intersectionPoints.push(thisTopRight);\n }\n var thisBottomLeft = this.getBottomLeft();\n if (rect.containsPoint(thisBottomLeft, EPSILON)) {\n intersectionPoints.push(thisBottomLeft);\n }\n var thisBottomRight = this.getBottomRight();\n if (rect.containsPoint(thisBottomRight, EPSILON)) {\n intersectionPoints.push(thisBottomRight);\n }\n\n var rectTopLeft = rect.getTopLeft();\n if (this.containsPoint(rectTopLeft, EPSILON)) {\n intersectionPoints.push(rectTopLeft);\n }\n var rectTopRight = rect.getTopRight();\n if (this.containsPoint(rectTopRight, EPSILON)) {\n intersectionPoints.push(rectTopRight);\n }\n var rectBottomLeft = rect.getBottomLeft();\n if (this.containsPoint(rectBottomLeft, EPSILON)) {\n intersectionPoints.push(rectBottomLeft);\n }\n var rectBottomRight = rect.getBottomRight();\n if (this.containsPoint(rectBottomRight, EPSILON)) {\n intersectionPoints.push(rectBottomRight);\n }\n\n var thisSegments = this._getSegments();\n var rectSegments = rect._getSegments();\n for (var i = 0; i < thisSegments.length; i++) {\n var thisSegment = thisSegments[i];\n for (var j = 0; j < rectSegments.length; j++) {\n var rectSegment = rectSegments[j];\n var intersect = getIntersection(thisSegment[0], thisSegment[1],\n rectSegment[0], rectSegment[1]);\n if (intersect) {\n intersectionPoints.push(intersect);\n }\n }\n }\n\n // Get intersection point of segments [a,b] and [c,d]\n function getIntersection(a, b, c, d) {\n // http://stackoverflow.com/a/1968345/1440403\n var abVector = b.minus(a);\n var cdVector = d.minus(c);\n\n var denom = -cdVector.x * abVector.y + abVector.x * cdVector.y;\n if (denom === 0) {\n return null;\n }\n\n var s = (abVector.x * (a.y - c.y) - abVector.y * (a.x - c.x)) / denom;\n var t = (cdVector.x * (a.y - c.y) - cdVector.y * (a.x - c.x)) / denom;\n\n if (-EPSILON <= s && s <= 1 - EPSILON &&\n -EPSILON <= t && t <= 1 - EPSILON) {\n return new $.Point(a.x + t * abVector.x, a.y + t * abVector.y);\n }\n return null;\n }\n\n if (intersectionPoints.length === 0) {\n return null;\n }\n\n var minX = intersectionPoints[0].x;\n var maxX = intersectionPoints[0].x;\n var minY = intersectionPoints[0].y;\n var maxY = intersectionPoints[0].y;\n for (var k = 1; k < intersectionPoints.length; k++) {\n var point = intersectionPoints[k];\n if (point.x < minX) {\n minX = point.x;\n }\n if (point.x > maxX) {\n maxX = point.x;\n }\n if (point.y < minY) {\n minY = point.y;\n }\n if (point.y > maxY) {\n maxY = point.y;\n }\n }\n return new $.Rect(minX, minY, maxX - minX, maxY - minY);\n },\n\n // private\n _getSegments: function() {\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var bottomRight = this.getBottomRight();\n return [[topLeft, topRight],\n [topRight, bottomRight],\n [bottomRight, bottomLeft],\n [bottomLeft, topLeft]];\n },\n\n /**\n * Rotates a rectangle around a point.\n * @function\n * @param {Number} degrees The angle in degrees to rotate.\n * @param {OpenSeadragon.Point} [pivot] The point about which to rotate.\n * Defaults to the center of the rectangle.\n * @returns {OpenSeadragon.Rect}\n */\n rotate: function(degrees, pivot) {\n degrees = $.positiveModulo(degrees, 360);\n if (degrees === 0) {\n return this.clone();\n }\n\n pivot = pivot || this.getCenter();\n var newTopLeft = this.getTopLeft().rotate(degrees, pivot);\n var newTopRight = this.getTopRight().rotate(degrees, pivot);\n\n var diff = newTopRight.minus(newTopLeft);\n // Handle floating point error\n diff = diff.apply(function(x) {\n var EPSILON = 1e-15;\n return Math.abs(x) < EPSILON ? 0 : x;\n });\n var radians = Math.atan(diff.y / diff.x);\n if (diff.x < 0) {\n radians += Math.PI;\n } else if (diff.y < 0) {\n radians += 2 * Math.PI;\n }\n return new $.Rect(\n newTopLeft.x,\n newTopLeft.y,\n this.width,\n this.height,\n radians / Math.PI * 180);\n },\n\n /**\n * Retrieves the smallest horizontal (degrees=0) rectangle which contains\n * this rectangle.\n * @returns {OpenSeadragon.Rect}\n */\n getBoundingBox: function() {\n if (this.degrees === 0) {\n return this.clone();\n }\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var bottomRight = this.getBottomRight();\n var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n return new $.Rect(\n minX,\n minY,\n maxX - minX,\n maxY - minY);\n },\n\n /**\n * Retrieves the smallest horizontal (degrees=0) rectangle which contains\n * this rectangle and has integers x, y, width and height\n * @returns {OpenSeadragon.Rect}\n */\n getIntegerBoundingBox: function() {\n var boundingBox = this.getBoundingBox();\n var x = Math.floor(boundingBox.x);\n var y = Math.floor(boundingBox.y);\n var width = Math.ceil(boundingBox.width + boundingBox.x - x);\n var height = Math.ceil(boundingBox.height + boundingBox.y - y);\n return new $.Rect(x, y, width, height);\n },\n\n /**\n * Determines whether a point is inside this rectangle (edge included).\n * @function\n * @param {OpenSeadragon.Point} point\n * @param {Number} [epsilon=0] the margin of error allowed\n * @returns {Boolean} true if the point is inside this rectangle, false\n * otherwise.\n */\n containsPoint: function(point, epsilon) {\n epsilon = epsilon || 0;\n\n // See http://stackoverflow.com/a/2752754/1440403 for explanation\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var topDiff = topRight.minus(topLeft);\n var leftDiff = bottomLeft.minus(topLeft);\n\n return ((point.x - topLeft.x) * topDiff.x +\n (point.y - topLeft.y) * topDiff.y >= -epsilon) &&\n\n ((point.x - topRight.x) * topDiff.x +\n (point.y - topRight.y) * topDiff.y <= epsilon) &&\n\n ((point.x - topLeft.x) * leftDiff.x +\n (point.y - topLeft.y) * leftDiff.y >= -epsilon) &&\n\n ((point.x - bottomLeft.x) * leftDiff.x +\n (point.y - bottomLeft.y) * leftDiff.y <= epsilon);\n },\n\n /**\n * Provides a string representation of the rectangle which is useful for\n * debugging.\n * @function\n * @returns {String} A string representation of the rectangle.\n */\n toString: function() {\n return \"[\" +\n (Math.round(this.x * 100) / 100) + \", \" +\n (Math.round(this.y * 100) / 100) + \", \" +\n (Math.round(this.width * 100) / 100) + \"x\" +\n (Math.round(this.height * 100) / 100) + \", \" +\n (Math.round(this.degrees * 100) / 100) + \"deg\" +\n \"]\";\n }\n};\n\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - ReferenceStrip\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ( $ ) {\n\n// dictionary from id to private properties\nvar THIS = {};\n\n/**\n * The CollectionDrawer is a reimplementation if the Drawer API that\n * focuses on allowing a viewport to be redefined as a collection\n * of smaller viewports, defined by a clear number of rows and / or\n * columns of which each item in the matrix of viewports has its own\n * source.\n *\n * This idea is a reexpression of the idea of dzi collections\n * which allows a clearer algorithm to reuse the tile sources already\n * supported by OpenSeadragon, in heterogenious or homogenious\n * sequences just like mixed groups already supported by the viewer\n * for the purpose of image sequnces.\n *\n * TODO: The difficult part of this feature is figuring out how to express\n * this functionality as a combination of the functionality already\n * provided by Drawer, Viewport, TileSource, and Navigator. It may\n * require better abstraction at those points in order to efficiently\n * reuse those paradigms.\n */\n/**\n * @class ReferenceStrip\n * @memberof OpenSeadragon\n * @param {Object} options\n */\n$.ReferenceStrip = function ( options ) {\n\n var _this = this,\n viewer = options.viewer,\n viewerSize = $.getElementSize( viewer.element ),\n element,\n style,\n i;\n\n //We may need to create a new element and id if they did not\n //provide the id for the existing element\n if ( !options.id ) {\n options.id = 'referencestrip-' + $.now();\n this.element = $.makeNeutralElement( \"div\" );\n this.element.id = options.id;\n this.element.className = 'referencestrip';\n }\n\n options = $.extend( true, {\n sizeRatio: $.DEFAULT_SETTINGS.referenceStripSizeRatio,\n position: $.DEFAULT_SETTINGS.referenceStripPosition,\n scroll: $.DEFAULT_SETTINGS.referenceStripScroll,\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold\n }, options, {\n element: this.element\n } );\n\n $.extend( this, options );\n //Private state properties\n THIS[this.id] = {\n animating: false\n };\n\n this.minPixelRatio = this.viewer.minPixelRatio;\n\n this.element.tabIndex = 0;\n\n style = this.element.style;\n style.marginTop = '0px';\n style.marginRight = '0px';\n style.marginBottom = '0px';\n style.marginLeft = '0px';\n style.left = '0px';\n style.bottom = '0px';\n style.border = '0px';\n style.background = '#000';\n style.position = 'relative';\n\n $.setElementTouchActionNone( this.element );\n\n $.setElementOpacity( this.element, 0.8 );\n\n this.viewer = viewer;\n this.tracker = new $.MouseTracker( {\n userData: 'ReferenceStrip.tracker',\n element: this.element,\n clickHandler: $.delegate( this, onStripClick ),\n dragHandler: $.delegate( this, onStripDrag ),\n scrollHandler: $.delegate( this, onStripScroll ),\n enterHandler: $.delegate( this, onStripEnter ),\n leaveHandler: $.delegate( this, onStripLeave ),\n keyDownHandler: $.delegate( this, onKeyDown ),\n keyHandler: $.delegate( this, onKeyPress ),\n preProcessEventHandler: function (eventInfo) {\n if (eventInfo.eventType === 'wheel') {\n eventInfo.preventDefault = true;\n }\n }\n } );\n\n //Controls the position and orientation of the reference strip and sets the\n //appropriate width and height\n if ( options.width && options.height ) {\n this.element.style.width = options.width + 'px';\n this.element.style.height = options.height + 'px';\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.BOTTOM_LEFT }\n );\n } else {\n if ( \"horizontal\" === options.scroll ) {\n this.element.style.width = (\n viewerSize.x *\n options.sizeRatio *\n viewer.tileSources.length\n ) + ( 12 * viewer.tileSources.length ) + 'px';\n\n this.element.style.height = (\n viewerSize.y *\n options.sizeRatio\n ) + 'px';\n\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.BOTTOM_LEFT }\n );\n } else {\n this.element.style.height = (\n viewerSize.y *\n options.sizeRatio *\n viewer.tileSources.length\n ) + ( 12 * viewer.tileSources.length ) + 'px';\n\n this.element.style.width = (\n viewerSize.x *\n options.sizeRatio\n ) + 'px';\n\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.TOP_LEFT }\n );\n\n }\n }\n\n this.panelWidth = ( viewerSize.x * this.sizeRatio ) + 8;\n this.panelHeight = ( viewerSize.y * this.sizeRatio ) + 8;\n this.panels = [];\n this.miniViewers = {};\n\n /*jshint loopfunc:true*/\n for ( i = 0; i < viewer.tileSources.length; i++ ) {\n\n element = $.makeNeutralElement( 'div' );\n element.id = this.element.id + \"-\" + i;\n\n element.style.width = _this.panelWidth + 'px';\n element.style.height = _this.panelHeight + 'px';\n element.style.display = 'inline';\n element.style['float'] = 'left'; //Webkit\n element.style.cssFloat = 'left'; //Firefox\n element.style.styleFloat = 'left'; //IE\n element.style.padding = '2px';\n $.setElementTouchActionNone( element );\n $.setElementPointerEventsNone( element );\n\n this.element.appendChild( element );\n\n element.activePanel = false;\n\n this.panels.push( element );\n\n }\n loadPanels( this, this.scroll === 'vertical' ? viewerSize.y : viewerSize.x, 0 );\n this.setFocus( 0 );\n\n};\n\n/** @lends OpenSeadragon.ReferenceStrip.prototype */\n$.ReferenceStrip.prototype = {\n\n /**\n * @function\n */\n setFocus: function ( page ) {\n var element = this.element.querySelector('#' + this.element.id + '-' + page ),\n viewerSize = $.getElementSize( this.viewer.canvas ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n offsetLeft = -Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = -Number( this.element.style.marginTop.replace( 'px', '' ) ),\n offset;\n\n if ( this.currentSelected !== element ) {\n if ( this.currentSelected ) {\n this.currentSelected.style.background = '#000';\n }\n this.currentSelected = element;\n this.currentSelected.style.background = '#999';\n\n if ( 'horizontal' === this.scroll ) {\n //right left\n offset = ( Number( page ) ) * ( this.panelWidth + 3 );\n if ( offset > offsetLeft + viewerSize.x - this.panelWidth ) {\n offset = Math.min( offset, ( scrollWidth - viewerSize.x ) );\n this.element.style.marginLeft = -offset + 'px';\n loadPanels( this, viewerSize.x, -offset );\n } else if ( offset < offsetLeft ) {\n offset = Math.max( 0, offset - viewerSize.x / 2 );\n this.element.style.marginLeft = -offset + 'px';\n loadPanels( this, viewerSize.x, -offset );\n }\n } else {\n offset = ( Number( page ) ) * ( this.panelHeight + 3 );\n if ( offset > offsetTop + viewerSize.y - this.panelHeight ) {\n offset = Math.min( offset, ( scrollHeight - viewerSize.y ) );\n this.element.style.marginTop = -offset + 'px';\n loadPanels( this, viewerSize.y, -offset );\n } else if ( offset < offsetTop ) {\n offset = Math.max( 0, offset - viewerSize.y / 2 );\n this.element.style.marginTop = -offset + 'px';\n loadPanels( this, viewerSize.y, -offset );\n }\n }\n\n this.currentPage = page;\n onStripEnter.call( this, { eventSource: this.tracker } );\n }\n },\n\n /**\n * @function\n */\n update: function () {\n if ( THIS[this.id].animating ) {\n // $.console.log( 'image reference strip update' );\n return true;\n }\n return false;\n },\n\n destroy: function() {\n if (this.miniViewers) {\n for (var key in this.miniViewers) {\n this.miniViewers[key].destroy();\n }\n }\n\n this.tracker.destroy();\n\n if (this.element) {\n this.viewer.removeControl( this.element );\n }\n }\n\n};\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripClick( event ) {\n if ( event.quick ) {\n var page;\n\n if ( 'horizontal' === this.scroll ) {\n // +4px fix to solve problem with precision on thumbnail selection if there is a lot of them\n page = Math.floor(event.position.x / (this.panelWidth + 4));\n } else {\n page = Math.floor(event.position.y / this.panelHeight);\n }\n\n this.viewer.goToPage( page );\n }\n\n this.element.focus();\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripDrag( event ) {\n\n this.dragging = true;\n if ( this.element ) {\n var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n viewerSize = $.getElementSize( this.viewer.canvas );\n\n if ( 'horizontal' === this.scroll ) {\n if ( -event.delta.x > 0 ) {\n //forward\n if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) {\n this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) );\n }\n } else if ( -event.delta.x < 0 ) {\n //reverse\n if ( offsetLeft < 0 ) {\n this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) );\n }\n }\n } else {\n if ( -event.delta.y > 0 ) {\n //forward\n if ( offsetTop > -( scrollHeight - viewerSize.y ) ) {\n this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) );\n }\n } else if ( -event.delta.y < 0 ) {\n //reverse\n if ( offsetTop < 0 ) {\n this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) );\n }\n }\n }\n }\n\n}\n\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripScroll( event ) {\n if ( this.element ) {\n var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n viewerSize = $.getElementSize( this.viewer.canvas );\n\n if ( 'horizontal' === this.scroll ) {\n if ( event.scroll > 0 ) {\n //forward\n if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) {\n this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) );\n }\n } else if ( event.scroll < 0 ) {\n //reverse\n if ( offsetLeft < 0 ) {\n this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) );\n }\n }\n } else {\n if ( event.scroll < 0 ) {\n //scroll up\n if ( offsetTop > viewerSize.y - scrollHeight ) {\n this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) );\n }\n } else if ( event.scroll > 0 ) {\n //scroll dowm\n if ( offsetTop < 0 ) {\n this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) );\n }\n }\n }\n\n event.preventDefault = true;\n }\n}\n\n\nfunction loadPanels( strip, viewerSize, scroll ) {\n var panelSize,\n activePanelsStart,\n activePanelsEnd,\n miniViewer,\n i,\n element;\n if ( 'horizontal' === strip.scroll ) {\n panelSize = strip.panelWidth;\n } else {\n panelSize = strip.panelHeight;\n }\n activePanelsStart = Math.ceil( viewerSize / panelSize ) + 5;\n activePanelsEnd = Math.ceil( ( Math.abs( scroll ) + viewerSize ) / panelSize ) + 1;\n activePanelsStart = activePanelsEnd - activePanelsStart;\n activePanelsStart = activePanelsStart < 0 ? 0 : activePanelsStart;\n\n for ( i = activePanelsStart; i < activePanelsEnd && i < strip.panels.length; i++ ) {\n element = strip.panels[i];\n if ( !element.activePanel ) {\n var miniTileSource;\n var originalTileSource = strip.viewer.tileSources[i];\n if (originalTileSource.referenceStripThumbnailUrl) {\n miniTileSource = {\n type: 'image',\n url: originalTileSource.referenceStripThumbnailUrl\n };\n } else {\n miniTileSource = originalTileSource;\n }\n miniViewer = new $.Viewer( {\n id: element.id,\n tileSources: [miniTileSource],\n element: element,\n navigatorSizeRatio: strip.sizeRatio,\n showNavigator: false,\n mouseNavEnabled: false,\n showNavigationControl: false,\n showSequenceControl: false,\n immediateRender: true,\n blendTime: 0,\n animationTime: 0,\n loadTilesWithAjax: strip.viewer.loadTilesWithAjax,\n ajaxHeaders: strip.viewer.ajaxHeaders,\n useCanvas: strip.useCanvas\n } );\n // Allow pointer events to pass through miniViewer's canvas/container\n // elements so implicit pointer capture works on touch devices\n $.setElementPointerEventsNone( miniViewer.canvas );\n $.setElementPointerEventsNone( miniViewer.container );\n // We'll use event delegation from the reference strip element instead of\n // handling events on every miniViewer\n miniViewer.innerTracker.setTracking( false );\n miniViewer.outerTracker.setTracking( false );\n\n strip.miniViewers[element.id] = miniViewer;\n\n element.activePanel = true;\n }\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripEnter( event ) {\n var element = event.eventSource.element;\n\n //$.setElementOpacity(element, 0.8);\n\n //element.style.border = '1px solid #555';\n //element.style.background = '#000';\n\n if ( 'horizontal' === this.scroll ) {\n\n //element.style.paddingTop = \"0px\";\n element.style.marginBottom = \"0px\";\n\n } else {\n\n //element.style.paddingRight = \"0px\";\n element.style.marginLeft = \"0px\";\n\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripLeave( event ) {\n var element = event.eventSource.element;\n\n if ( 'horizontal' === this.scroll ) {\n\n //element.style.paddingTop = \"10px\";\n element.style.marginBottom = \"-\" + ( $.getElementSize( element ).y / 2 ) + \"px\";\n\n } else {\n\n //element.style.paddingRight = \"10px\";\n element.style.marginLeft = \"-\" + ( $.getElementSize( element ).x / 2 ) + \"px\";\n\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onKeyDown( event ) {\n //console.log( event.keyCode );\n\n if ( !event.ctrl && !event.alt && !event.meta ) {\n switch ( event.keyCode ) {\n case 38: //up arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n case 40: //down arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 37: //left arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 39: //right arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n event.preventDefault = false;\n break;\n }\n } else {\n event.preventDefault = false;\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onKeyPress( event ) {\n //console.log( event.keyCode );\n\n if ( !event.ctrl && !event.alt && !event.meta ) {\n switch ( event.keyCode ) {\n case 61: //=|+\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n case 45: //-|_\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 48: //0|)\n case 119: //w\n case 87: //W\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n case 115: //s\n case 83: //S\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 97: //a\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n event.preventDefault = true;\n break;\n case 100: //d\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n event.preventDefault = true;\n break;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n event.preventDefault = false;\n break;\n }\n } else {\n event.preventDefault = false;\n }\n}\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - DisplayRect\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class DisplayRect\n * @classdesc A display rectangle is very similar to {@link OpenSeadragon.Rect} but adds two\n * fields, 'minLevel' and 'maxLevel' which denote the supported zoom levels\n * for this rectangle.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.Rect\n * @param {Number} x The vector component 'x'.\n * @param {Number} y The vector component 'y'.\n * @param {Number} width The vector component 'height'.\n * @param {Number} height The vector component 'width'.\n * @param {Number} minLevel The lowest zoom level supported.\n * @param {Number} maxLevel The highest zoom level supported.\n */\n$.DisplayRect = function( x, y, width, height, minLevel, maxLevel ) {\n $.Rect.apply( this, [ x, y, width, height ] );\n\n /**\n * The lowest zoom level supported.\n * @member {Number} minLevel\n * @memberof OpenSeadragon.DisplayRect#\n */\n this.minLevel = minLevel;\n /**\n * The highest zoom level supported.\n * @member {Number} maxLevel\n * @memberof OpenSeadragon.DisplayRect#\n */\n this.maxLevel = maxLevel;\n};\n\n$.extend( $.DisplayRect.prototype, $.Rect.prototype );\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Spring\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Spring\n * @memberof OpenSeadragon\n * @param {Object} options - Spring configuration settings.\n * @param {Number} options.springStiffness - Spring stiffness. Must be greater than zero.\n * The closer to zero, the closer to linear animation.\n * @param {Number} options.animationTime - Animation duration per spring, in seconds.\n * Must be zero or greater.\n * @param {Number} [options.initial=0] - Initial value of spring.\n * @param {Boolean} [options.exponential=false] - Whether this spring represents\n * an exponential scale (such as zoom) and should be animated accordingly. Note that\n * exponential springs must have non-zero values.\n */\n$.Spring = function( options ) {\n var args = arguments;\n\n if( typeof ( options ) !== 'object' ){\n //allows backward compatible use of ( initialValue, config ) as\n //constructor parameters\n options = {\n initial: args.length && typeof ( args[ 0 ] ) === \"number\" ?\n args[ 0 ] :\n undefined,\n /**\n * Spring stiffness.\n * @member {Number} springStiffness\n * @memberof OpenSeadragon.Spring#\n */\n springStiffness: args.length > 1 ?\n args[ 1 ].springStiffness :\n 5.0,\n /**\n * Animation duration per spring.\n * @member {Number} animationTime\n * @memberof OpenSeadragon.Spring#\n */\n animationTime: args.length > 1 ?\n args[ 1 ].animationTime :\n 1.5\n };\n }\n\n $.console.assert(typeof options.springStiffness === \"number\" && options.springStiffness !== 0,\n \"[OpenSeadragon.Spring] options.springStiffness must be a non-zero number\");\n\n $.console.assert(typeof options.animationTime === \"number\" && options.animationTime >= 0,\n \"[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0\");\n\n if (options.exponential) {\n this._exponential = true;\n delete options.exponential;\n }\n\n $.extend( true, this, options);\n\n /**\n * @member {Object} current\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.current = {\n value: typeof ( this.initial ) === \"number\" ?\n this.initial :\n (this._exponential ? 0 : 1),\n time: $.now() // always work in milliseconds\n };\n\n $.console.assert(!this._exponential || this.current.value !== 0,\n \"[OpenSeadragon.Spring] value must be non-zero for exponential springs\");\n\n /**\n * @member {Object} start\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.start = {\n value: this.current.value,\n time: this.current.time\n };\n\n /**\n * @member {Object} target\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.target = {\n value: this.current.value,\n time: this.current.time\n };\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n};\n\n/** @lends OpenSeadragon.Spring.prototype */\n$.Spring.prototype = {\n\n /**\n * @function\n * @param {Number} target\n */\n resetTo: function( target ) {\n $.console.assert(!this._exponential || target !== 0,\n \"[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs\");\n\n this.start.value = this.target.value = this.current.value = target;\n this.start.time = this.target.time = this.current.time = $.now();\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n },\n\n /**\n * @function\n * @param {Number} target\n */\n springTo: function( target ) {\n $.console.assert(!this._exponential || target !== 0,\n \"[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs\");\n\n this.start.value = this.current.value;\n this.start.time = this.current.time;\n this.target.value = target;\n this.target.time = this.start.time + 1000 * this.animationTime;\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n }\n },\n\n /**\n * @function\n * @param {Number} delta\n */\n shiftBy: function( delta ) {\n this.start.value += delta;\n this.target.value += delta;\n\n if (this._exponential) {\n $.console.assert(this.target.value !== 0 && this.start.value !== 0,\n \"[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs\");\n\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n }\n },\n\n setExponential: function(value) {\n this._exponential = value;\n\n if (this._exponential) {\n $.console.assert(this.current.value !== 0 && this.target.value !== 0 && this.start.value !== 0,\n \"[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs\");\n\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n },\n\n /**\n * @function\n * @returns true if the value got updated, false otherwise\n */\n update: function() {\n this.current.time = $.now();\n\n var startValue, targetValue;\n if (this._exponential) {\n startValue = this.start._logValue;\n targetValue = this.target._logValue;\n } else {\n startValue = this.start.value;\n targetValue = this.target.value;\n }\n\n var currentValue = (this.current.time >= this.target.time) ?\n targetValue :\n startValue +\n ( targetValue - startValue ) *\n transform(\n this.springStiffness,\n ( this.current.time - this.start.time ) /\n ( this.target.time - this.start.time )\n );\n\n var oldValue = this.current.value;\n if (this._exponential) {\n this.current.value = Math.exp(currentValue);\n } else {\n this.current.value = currentValue;\n }\n\n return oldValue !== this.current.value;\n },\n\n /**\n * Returns whether the spring is at the target value\n * @function\n * @returns {Boolean} True if at target value, false otherwise\n */\n isAtTargetValue: function() {\n return this.current.value === this.target.value;\n }\n};\n\n/**\n * @private\n */\nfunction transform( stiffness, x ) {\n return ( 1.0 - Math.exp( stiffness * -x ) ) /\n ( 1.0 - Math.exp( -stiffness ) );\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ImageLoader\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($){\n\n/**\n * @class ImageJob\n * @classdesc Handles downloading of a single image.\n * @param {Object} options - Options for this ImageJob.\n * @param {String} [options.src] - URL of image to download.\n * @param {Tile} [options.tile] - Tile that belongs the data to.\n * @param {TileSource} [options.source] - Image loading strategy\n * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX.\n * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX.\n * @param {Boolean} [options.ajaxWithCredentials] - Whether to set withCredentials on AJAX requests.\n * @param {String} [options.crossOriginPolicy] - CORS policy to use for downloads\n * @param {String} [options.postData] - HTTP POST data (usually but not necessarily in k=v&k2=v2... form,\n * see TileSource::getPostData) or null\n * @param {Function} [options.callback] - Called once image has been downloaded.\n * @param {Function} [options.abort] - Called when this image job is aborted.\n * @param {Number} [options.timeout] - The max number of milliseconds that this image job may take to complete.\n * @param {Number} [options.tries] - Actual number of the current try.\n */\n$.ImageJob = function(options) {\n\n $.extend(true, this, {\n timeout: $.DEFAULT_SETTINGS.timeout,\n jobId: null,\n tries: 0\n }, options);\n\n /**\n * Data object which will contain downloaded image data.\n * @member {Image|*} data data object, by default an Image object (depends on TileSource)\n * @memberof OpenSeadragon.ImageJob#\n */\n this.data = null;\n\n /**\n * User workspace to populate with helper variables\n * @member {*} userData to append custom data and avoid namespace collision\n * @memberof OpenSeadragon.ImageJob#\n */\n this.userData = {};\n\n /**\n * Error message holder\n * @member {string} error message\n * @memberof OpenSeadragon.ImageJob#\n * @private\n */\n this.errorMsg = null;\n};\n\n$.ImageJob.prototype = {\n /**\n * Starts the image job.\n * @method\n */\n start: function() {\n this.tries++;\n\n var self = this;\n var selfAbort = this.abort;\n\n this.jobId = window.setTimeout(function () {\n self.finish(null, null, \"Image load exceeded timeout (\" + self.timeout + \" ms)\");\n }, this.timeout);\n\n this.abort = function() {\n self.source.downloadTileAbort(self);\n if (typeof selfAbort === \"function\") {\n selfAbort();\n }\n };\n\n this.source.downloadTileStart(this);\n },\n\n /**\n * Finish this job.\n * @param {*} data data that has been downloaded\n * @param {XMLHttpRequest} request reference to the request if used\n * @param {string} errorMessage description upon failure\n */\n finish: function(data, request, errorMessage ) {\n this.data = data;\n this.request = request;\n this.errorMsg = errorMessage;\n\n if (this.jobId) {\n window.clearTimeout(this.jobId);\n }\n\n this.callback(this);\n }\n};\n\n/**\n * @class ImageLoader\n * @memberof OpenSeadragon\n * @classdesc Handles downloading of a set of images using asynchronous queue pattern.\n * You generally won't have to interact with the ImageLoader directly.\n * @param {Object} options - Options for this ImageLoader.\n * @param {Number} [options.jobLimit] - The number of concurrent image requests. See imageLoaderLimit in {@link OpenSeadragon.Options} for details.\n * @param {Number} [options.timeout] - The max number of milliseconds that an image job may take to complete.\n */\n$.ImageLoader = function(options) {\n\n $.extend(true, this, {\n jobLimit: $.DEFAULT_SETTINGS.imageLoaderLimit,\n timeout: $.DEFAULT_SETTINGS.timeout,\n jobQueue: [],\n failedTiles: [],\n jobsInProgress: 0\n }, options);\n\n};\n\n/** @lends OpenSeadragon.ImageLoader.prototype */\n$.ImageLoader.prototype = {\n\n /**\n * Add an unloaded image to the loader queue.\n * @method\n * @param {Object} options - Options for this job.\n * @param {String} [options.src] - URL of image to download.\n * @param {Tile} [options.tile] - Tile that belongs the data to. The tile instance\n * is not internally used and serves for custom TileSources implementations.\n * @param {TileSource} [options.source] - Image loading strategy\n * @param {String} [options.loadWithAjax] - Whether to load this image with AJAX.\n * @param {String} [options.ajaxHeaders] - Headers to add to the image request if using AJAX.\n * @param {String|Boolean} [options.crossOriginPolicy] - CORS policy to use for downloads\n * @param {String} [options.postData] - POST parameters (usually but not necessarily in k=v&k2=v2... form,\n * see TileSource::getPostData) or null\n * @param {Boolean} [options.ajaxWithCredentials] - Whether to set withCredentials on AJAX\n * requests.\n * @param {Function} [options.callback] - Called once image has been downloaded.\n * @param {Function} [options.abort] - Called when this image job is aborted.\n */\n addJob: function(options) {\n if (!options.source) {\n $.console.error('ImageLoader.prototype.addJob() requires [options.source]. ' +\n 'TileSource since new API defines how images are fetched. Creating a dummy TileSource.');\n var implementation = $.TileSource.prototype;\n options.source = {\n downloadTileStart: implementation.downloadTileStart,\n downloadTileAbort: implementation.downloadTileAbort\n };\n }\n\n var _this = this,\n complete = function(job) {\n completeJob(_this, job, options.callback);\n },\n jobOptions = {\n src: options.src,\n tile: options.tile || {},\n source: options.source,\n loadWithAjax: options.loadWithAjax,\n ajaxHeaders: options.loadWithAjax ? options.ajaxHeaders : null,\n crossOriginPolicy: options.crossOriginPolicy,\n ajaxWithCredentials: options.ajaxWithCredentials,\n postData: options.postData,\n callback: complete,\n abort: options.abort,\n timeout: this.timeout\n },\n newJob = new $.ImageJob(jobOptions);\n\n if ( !this.jobLimit || this.jobsInProgress < this.jobLimit ) {\n newJob.start();\n this.jobsInProgress++;\n }\n else {\n this.jobQueue.push( newJob );\n }\n },\n\n /**\n * Clear any unstarted image loading jobs from the queue.\n * @method\n */\n clear: function() {\n for( var i = 0; i < this.jobQueue.length; i++ ) {\n var job = this.jobQueue[i];\n if ( typeof job.abort === \"function\" ) {\n job.abort();\n }\n }\n\n this.jobQueue = [];\n }\n};\n\n/**\n * Cleans up ImageJob once completed. Restarts job after tileRetryDelay seconds if failed\n * but max tileRetryMax times\n * @method\n * @private\n * @param loader - ImageLoader used to start job.\n * @param job - The ImageJob that has completed.\n * @param callback - Called once cleanup is finished.\n */\nfunction completeJob(loader, job, callback) {\n if (job.errorMsg !== '' && (job.data === null || job.data === undefined) && job.tries < 1 + loader.tileRetryMax) {\n loader.failedTiles.push(job);\n }\n var nextJob;\n\n loader.jobsInProgress--;\n\n if ((!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.jobQueue.length > 0) {\n nextJob = loader.jobQueue.shift();\n nextJob.start();\n loader.jobsInProgress++;\n }\n\n if (loader.tileRetryMax > 0 && loader.jobQueue.length === 0) {\n if ((!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.failedTiles.length > 0) {\n nextJob = loader.failedTiles.shift();\n setTimeout(function () {\n nextJob.start();\n }, loader.tileRetryDelay);\n loader.jobsInProgress++;\n }\n }\n\n callback(job.data, job.errorMsg, job.request);\n}\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Tile\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Tile\n * @memberof OpenSeadragon\n * @param {Number} level The zoom level this tile belongs to.\n * @param {Number} x The vector component 'x'.\n * @param {Number} y The vector component 'y'.\n * @param {OpenSeadragon.Rect} bounds Where this tile fits, in normalized\n * coordinates.\n * @param {Boolean} exists Is this tile a part of a sparse image? ( Also has\n * this tile failed to load? )\n * @param {String|Function} url The URL of this tile's image or a function that returns a url.\n * @param {CanvasRenderingContext2D} context2D The context2D of this tile if it\n * is provided directly by the tile source.\n * @param {Boolean} loadWithAjax Whether this tile image should be loaded with an AJAX request .\n * @param {Object} ajaxHeaders The headers to send with this tile's AJAX request (if applicable).\n * @param {OpenSeadragon.Rect} sourceBounds The portion of the tile to use as the source of the\n * drawing operation, in pixels. Note that this only works when drawing with canvas; when drawing\n * with HTML the entire tile is always used.\n * @param {String} postData HTTP POST data (usually but not necessarily in k=v&k2=v2... form,\n * see TileSource::getPostData) or null\n * @param {String} cacheKey key to act as a tile cache, must be unique for tiles with unique image data\n */\n$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders, sourceBounds, postData, cacheKey) {\n /**\n * The zoom level this tile belongs to.\n * @member {Number} level\n * @memberof OpenSeadragon.Tile#\n */\n this.level = level;\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Tile#\n */\n this.x = x;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Tile#\n */\n this.y = y;\n /**\n * Where this tile fits, in normalized coordinates\n * @member {OpenSeadragon.Rect} bounds\n * @memberof OpenSeadragon.Tile#\n */\n this.bounds = bounds;\n /**\n * The portion of the tile to use as the source of the drawing operation, in pixels. Note that\n * this only works when drawing with canvas; when drawing with HTML the entire tile is always used.\n * @member {OpenSeadragon.Rect} sourceBounds\n * @memberof OpenSeadragon.Tile#\n */\n this.sourceBounds = sourceBounds;\n /**\n * Is this tile a part of a sparse image? Also has this tile failed to load?\n * @member {Boolean} exists\n * @memberof OpenSeadragon.Tile#\n */\n this.exists = exists;\n /**\n * Private property to hold string url or url retriever function.\n * Consumers should access via Tile.getUrl()\n * @private\n * @member {String|Function} url\n * @memberof OpenSeadragon.Tile#\n */\n this._url = url;\n /**\n * Post parameters for this tile. For example, it can be an URL-encoded string\n * in k1=v1&k2=v2... format, or a JSON, or a FormData instance... or null if no POST request used\n * @member {String} postData HTTP POST data (usually but not necessarily in k=v&k2=v2... form,\n * see TileSource::getPostData) or null\n * @memberof OpenSeadragon.Tile#\n */\n this.postData = postData;\n /**\n * The context2D of this tile if it is provided directly by the tile source.\n * @member {CanvasRenderingContext2D} context2D\n * @memberOf OpenSeadragon.Tile#\n */\n this.context2D = context2D;\n /**\n * Whether to load this tile's image with an AJAX request.\n * @member {Boolean} loadWithAjax\n * @memberof OpenSeadragon.Tile#\n */\n this.loadWithAjax = loadWithAjax;\n /**\n * The headers to be used in requesting this tile's image.\n * Only used if loadWithAjax is set to true.\n * @member {Object} ajaxHeaders\n * @memberof OpenSeadragon.Tile#\n */\n this.ajaxHeaders = ajaxHeaders;\n\n if (cacheKey === undefined) {\n $.console.warn(\"Tile constructor needs 'cacheKey' variable: creation tile cache\" +\n \" in Tile class is deprecated. TileSource.prototype.getTileHashKey will be used.\");\n cacheKey = $.TileSource.prototype.getTileHashKey(level, x, y, url, ajaxHeaders, postData);\n }\n /**\n * The unique cache key for this tile.\n * @member {String} cacheKey\n * @memberof OpenSeadragon.Tile#\n */\n this.cacheKey = cacheKey;\n /**\n * Is this tile loaded?\n * @member {Boolean} loaded\n * @memberof OpenSeadragon.Tile#\n */\n this.loaded = false;\n /**\n * Is this tile loading?\n * @member {Boolean} loading\n * @memberof OpenSeadragon.Tile#\n */\n this.loading = false;\n\n /**\n * The HTML div element for this tile\n * @member {Element} element\n * @memberof OpenSeadragon.Tile#\n */\n this.element = null;\n /**\n * The HTML img element for this tile.\n * @member {Element} imgElement\n * @memberof OpenSeadragon.Tile#\n */\n this.imgElement = null;\n\n /**\n * The alias of this.element.style.\n * @member {String} style\n * @memberof OpenSeadragon.Tile#\n */\n this.style = null;\n /**\n * This tile's position on screen, in pixels.\n * @member {OpenSeadragon.Point} position\n * @memberof OpenSeadragon.Tile#\n */\n this.position = null;\n /**\n * This tile's size on screen, in pixels.\n * @member {OpenSeadragon.Point} size\n * @memberof OpenSeadragon.Tile#\n */\n this.size = null;\n /**\n * Whether to flip the tile when rendering.\n * @member {Boolean} flipped\n * @memberof OpenSeadragon.Tile#\n */\n this.flipped = false;\n /**\n * The start time of this tile's blending.\n * @member {Number} blendStart\n * @memberof OpenSeadragon.Tile#\n */\n this.blendStart = null;\n /**\n * The current opacity this tile should be.\n * @member {Number} opacity\n * @memberof OpenSeadragon.Tile#\n */\n this.opacity = null;\n /**\n * The squared distance of this tile to the viewport center.\n * Use for comparing tiles.\n * @private\n * @member {Number} squaredDistance\n * @memberof OpenSeadragon.Tile#\n */\n this.squaredDistance = null;\n /**\n * The visibility score of this tile.\n * @member {Number} visibility\n * @memberof OpenSeadragon.Tile#\n */\n this.visibility = null;\n\n /**\n * The transparency indicator of this tile.\n * @member {Boolean} hasTransparency true if tile contains transparency for correct rendering\n * @memberof OpenSeadragon.Tile#\n */\n this.hasTransparency = false;\n\n /**\n * Whether this tile is currently being drawn.\n * @member {Boolean} beingDrawn\n * @memberof OpenSeadragon.Tile#\n */\n this.beingDrawn = false;\n\n /**\n * Timestamp the tile was last touched.\n * @member {Number} lastTouchTime\n * @memberof OpenSeadragon.Tile#\n */\n this.lastTouchTime = 0;\n\n /**\n * Whether this tile is in the right-most column for its level.\n * @member {Boolean} isRightMost\n * @memberof OpenSeadragon.Tile#\n */\n this.isRightMost = false;\n\n /**\n * Whether this tile is in the bottom-most row for its level.\n * @member {Boolean} isBottomMost\n * @memberof OpenSeadragon.Tile#\n */\n this.isBottomMost = false;\n};\n\n/** @lends OpenSeadragon.Tile.prototype */\n$.Tile.prototype = {\n\n /**\n * Provides a string representation of this tiles level and (x,y)\n * components.\n * @function\n * @returns {String}\n */\n toString: function() {\n return this.level + \"/\" + this.x + \"_\" + this.y;\n },\n\n // private\n _hasTransparencyChannel: function() {\n console.warn(\"Tile.prototype._hasTransparencyChannel() has been \" +\n \"deprecated and will be removed in the future. Use TileSource.prototype.hasTransparency() instead.\");\n return !!this.context2D || this.getUrl().match('.png');\n },\n\n /**\n * Renders the tile in an html container.\n * @function\n * @param {Element} container\n */\n drawHTML: function( container ) {\n if (!this.cacheImageRecord) {\n $.console.warn(\n '[Tile.drawHTML] attempting to draw tile %s when it\\'s not cached',\n this.toString());\n return;\n }\n\n if ( !this.loaded ) {\n $.console.warn(\n \"Attempting to draw tile %s when it's not yet loaded.\",\n this.toString()\n );\n return;\n }\n\n //EXPERIMENTAL - trying to figure out how to scale the container\n // content during animation of the container size.\n\n if ( !this.element ) {\n var image = this.getImage();\n if (!image) {\n return;\n }\n\n this.element = $.makeNeutralElement( \"div\" );\n this.imgElement = image.cloneNode();\n this.imgElement.style.msInterpolationMode = \"nearest-neighbor\";\n this.imgElement.style.width = \"100%\";\n this.imgElement.style.height = \"100%\";\n\n this.style = this.element.style;\n this.style.position = \"absolute\";\n }\n if ( this.element.parentNode !== container ) {\n container.appendChild( this.element );\n }\n if ( this.imgElement.parentNode !== this.element ) {\n this.element.appendChild( this.imgElement );\n }\n\n this.style.top = this.position.y + \"px\";\n this.style.left = this.position.x + \"px\";\n this.style.height = this.size.y + \"px\";\n this.style.width = this.size.x + \"px\";\n\n if (this.flipped) {\n this.style.transform = \"scaleX(-1)\";\n }\n\n $.setElementOpacity( this.element, this.opacity );\n },\n\n /**\n * The Image object for this tile.\n * @member {Object} image\n * @memberof OpenSeadragon.Tile#\n * @deprecated\n * @returns {Image}\n */\n get image() {\n $.console.error(\"[Tile.image] property has been deprecated. Use [Tile.prototype.getImage] instead.\");\n return this.getImage();\n },\n\n /**\n * The URL of this tile's image.\n * @member {String} url\n * @memberof OpenSeadragon.Tile#\n * @deprecated\n * @returns {String}\n */\n get url() {\n $.console.error(\"[Tile.url] property has been deprecated. Use [Tile.prototype.getUrl] instead.\");\n return this.getUrl();\n },\n\n /**\n * Get the Image object for this tile.\n * @returns {Image}\n */\n getImage: function() {\n return this.cacheImageRecord.getImage();\n },\n\n /**\n * Get the url string for this tile.\n * @returns {String}\n */\n getUrl: function() {\n if (typeof this._url === 'function') {\n return this._url();\n }\n\n return this._url;\n },\n\n /**\n * Get the CanvasRenderingContext2D instance for tile image data drawn\n * onto Canvas if enabled and available\n * @returns {CanvasRenderingContext2D}\n */\n getCanvasContext: function() {\n return this.context2D || this.cacheImageRecord.getRenderedContext();\n },\n\n /**\n * Renders the tile in a canvas-based context.\n * @function\n * @param {Canvas} context\n * @param {Function} drawingHandler - Method for firing the drawing event.\n * drawingHandler({context, tile, rendered})\n * where rendered is the context with the pre-drawn image.\n * @param {Number} [scale=1] - Apply a scale to position and size\n * @param {OpenSeadragon.Point} [translate] - A translation vector\n * @param {Boolean} [shouldRoundPositionAndSize] - Tells whether to round\n * position and size of tiles supporting alpha channel in non-transparency\n * context.\n * @param {OpenSeadragon.TileSource} source - The source specification of the tile.\n */\n drawCanvas: function( context, drawingHandler, scale, translate, shouldRoundPositionAndSize, source) {\n\n var position = this.position.times($.pixelDensityRatio),\n size = this.size.times($.pixelDensityRatio),\n rendered;\n\n if (!this.context2D && !this.cacheImageRecord) {\n $.console.warn(\n '[Tile.drawCanvas] attempting to draw tile %s when it\\'s not cached',\n this.toString());\n return;\n }\n\n rendered = this.getCanvasContext();\n\n if ( !this.loaded || !rendered ){\n $.console.warn(\n \"Attempting to draw tile %s when it's not yet loaded.\",\n this.toString()\n );\n\n return;\n }\n\n context.save();\n context.globalAlpha = this.opacity;\n\n if (typeof scale === 'number' && scale !== 1) {\n // draw tile at a different scale\n position = position.times(scale);\n size = size.times(scale);\n }\n\n if (translate instanceof $.Point) {\n // shift tile position slightly\n position = position.plus(translate);\n }\n\n //if we are supposed to be rendering fully opaque rectangle,\n //ie its done fading or fading is turned off, and if we are drawing\n //an image with an alpha channel, then the only way\n //to avoid seeing the tile underneath is to clear the rectangle\n if (context.globalAlpha === 1 && this.hasTransparency) {\n if (shouldRoundPositionAndSize) {\n // Round to the nearest whole pixel so we don't get seams from overlap.\n position.x = Math.round(position.x);\n position.y = Math.round(position.y);\n size.x = Math.round(size.x);\n size.y = Math.round(size.y);\n }\n\n //clearing only the inside of the rectangle occupied\n //by the png prevents edge flikering\n context.clearRect(\n position.x,\n position.y,\n size.x,\n size.y\n );\n }\n\n // This gives the application a chance to make image manipulation\n // changes as we are rendering the image\n drawingHandler({context: context, tile: this, rendered: rendered});\n\n var sourceWidth, sourceHeight;\n if (this.sourceBounds) {\n sourceWidth = Math.min(this.sourceBounds.width, rendered.canvas.width);\n sourceHeight = Math.min(this.sourceBounds.height, rendered.canvas.height);\n } else {\n sourceWidth = rendered.canvas.width;\n sourceHeight = rendered.canvas.height;\n }\n\n context.translate(position.x + size.x / 2, 0);\n if (this.flipped) {\n context.scale(-1, 1);\n }\n context.drawImage(\n rendered.canvas,\n 0,\n 0,\n sourceWidth,\n sourceHeight,\n -size.x / 2,\n position.y,\n size.x,\n size.y\n );\n\n context.restore();\n },\n\n /**\n * Get the ratio between current and original size.\n * @function\n * @returns {Float}\n */\n getScaleForEdgeSmoothing: function() {\n var context;\n if (this.cacheImageRecord) {\n context = this.cacheImageRecord.getRenderedContext();\n } else if (this.context2D) {\n context = this.context2D;\n } else {\n $.console.warn(\n '[Tile.drawCanvas] attempting to get tile scale %s when tile\\'s not cached',\n this.toString());\n return 1;\n }\n return context.canvas.width / (this.size.x * $.pixelDensityRatio);\n },\n\n /**\n * Get a translation vector that when applied to the tile position produces integer coordinates.\n * Needed to avoid swimming and twitching.\n * @function\n * @param {Number} [scale=1] - Scale to be applied to position.\n * @returns {OpenSeadragon.Point}\n */\n getTranslationForEdgeSmoothing: function(scale, canvasSize, sketchCanvasSize) {\n // The translation vector must have positive values, otherwise the image goes a bit off\n // the sketch canvas to the top and left and we must use negative coordinates to repaint it\n // to the main canvas. In that case, some browsers throw:\n // INDEX_SIZE_ERR: DOM Exception 1: Index or size was negative, or greater than the allowed value.\n var x = Math.max(1, Math.ceil((sketchCanvasSize.x - canvasSize.x) / 2));\n var y = Math.max(1, Math.ceil((sketchCanvasSize.y - canvasSize.y) / 2));\n return new $.Point(x, y).minus(\n this.position\n .times($.pixelDensityRatio)\n .times(scale || 1)\n .apply(function(x) {\n return x % 1;\n })\n );\n },\n\n /**\n * Removes tile from its container.\n * @function\n */\n unload: function() {\n if ( this.imgElement && this.imgElement.parentNode ) {\n this.imgElement.parentNode.removeChild( this.imgElement );\n }\n if ( this.element && this.element.parentNode ) {\n this.element.parentNode.removeChild( this.element );\n }\n\n this.element = null;\n this.imgElement = null;\n this.loaded = false;\n this.loading = false;\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Overlay\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n /**\n * An enumeration of positions that an overlay may be assigned relative to\n * the viewport.\n * It is identical to OpenSeadragon.Placement but is kept for backward\n * compatibility.\n * @member OverlayPlacement\n * @memberof OpenSeadragon\n * @see OpenSeadragon.Placement\n * @static\n * @readonly\n * @type {Object}\n * @property {Number} CENTER\n * @property {Number} TOP_LEFT\n * @property {Number} TOP\n * @property {Number} TOP_RIGHT\n * @property {Number} RIGHT\n * @property {Number} BOTTOM_RIGHT\n * @property {Number} BOTTOM\n * @property {Number} BOTTOM_LEFT\n * @property {Number} LEFT\n */\n $.OverlayPlacement = $.Placement;\n\n /**\n * An enumeration of possible ways to handle overlays rotation\n * @member OverlayRotationMode\n * @memberOf OpenSeadragon\n * @static\n * @readonly\n * @property {Number} NO_ROTATION The overlay ignore the viewport rotation.\n * @property {Number} EXACT The overlay use CSS 3 transforms to rotate with\n * the viewport. If the overlay contains text, it will get rotated as well.\n * @property {Number} BOUNDING_BOX The overlay adjusts for rotation by\n * taking the size of the bounding box of the rotated bounds.\n * Only valid for overlays with Rect location and scalable in both directions.\n */\n $.OverlayRotationMode = $.freezeObject({\n NO_ROTATION: 1,\n EXACT: 2,\n BOUNDING_BOX: 3\n });\n\n /**\n * @class Overlay\n * @classdesc Provides a way to float an HTML element on top of the viewer element.\n *\n * @memberof OpenSeadragon\n * @param {Object} options\n * @param {Element} options.element\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} options.location - The\n * location of the overlay on the image. If a {@link OpenSeadragon.Point}\n * is specified, the overlay will be located at this location with respect\n * to the placement option. If a {@link OpenSeadragon.Rect} is specified,\n * the overlay will be placed at this location with the corresponding width\n * and height and placement TOP_LEFT.\n * @param {OpenSeadragon.Placement} [options.placement=OpenSeadragon.Placement.TOP_LEFT]\n * Defines what part of the overlay should be at the specified options.location\n * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw]\n * @param {Boolean} [options.checkResize=true] Set to false to avoid to\n * check the size of the overlay every time it is drawn in the directions\n * which are not scaled. It will improve performances but will cause a\n * misalignment if the overlay size changes.\n * @param {Number} [options.width] The width of the overlay in viewport\n * coordinates. If specified, the width of the overlay will be adjusted when\n * the zoom changes.\n * @param {Number} [options.height] The height of the overlay in viewport\n * coordinates. If specified, the height of the overlay will be adjusted when\n * the zoom changes.\n * @param {Boolean} [options.rotationMode=OpenSeadragon.OverlayRotationMode.EXACT]\n * How to handle the rotation of the viewport.\n */\n $.Overlay = function(element, location, placement) {\n\n /**\n * onDraw callback signature used by {@link OpenSeadragon.Overlay}.\n *\n * @callback OnDrawCallback\n * @memberof OpenSeadragon.Overlay\n * @param {OpenSeadragon.Point} position\n * @param {OpenSeadragon.Point} size\n * @param {Element} element\n */\n\n var options;\n if ($.isPlainObject(element)) {\n options = element;\n } else {\n options = {\n element: element,\n location: location,\n placement: placement\n };\n }\n\n this.element = options.element;\n this.style = options.element.style;\n this._init(options);\n };\n\n /** @lends OpenSeadragon.Overlay.prototype */\n $.Overlay.prototype = {\n\n // private\n _init: function(options) {\n this.location = options.location;\n this.placement = options.placement === undefined ?\n $.Placement.TOP_LEFT : options.placement;\n this.onDraw = options.onDraw;\n this.checkResize = options.checkResize === undefined ?\n true : options.checkResize;\n\n // When this.width is not null, the overlay get scaled horizontally\n this.width = options.width === undefined ? null : options.width;\n\n // When this.height is not null, the overlay get scaled vertically\n this.height = options.height === undefined ? null : options.height;\n\n this.rotationMode = options.rotationMode || $.OverlayRotationMode.EXACT;\n\n // Having a rect as location is a syntactic sugar\n if (this.location instanceof $.Rect) {\n this.width = this.location.width;\n this.height = this.location.height;\n this.location = this.location.getTopLeft();\n this.placement = $.Placement.TOP_LEFT;\n }\n\n // Deprecated properties kept for backward compatibility.\n this.scales = this.width !== null && this.height !== null;\n this.bounds = new $.Rect(\n this.location.x, this.location.y, this.width, this.height);\n this.position = this.location;\n },\n\n /**\n * Internal function to adjust the position of an overlay\n * depending on it size and placement.\n * @function\n * @param {OpenSeadragon.Point} position\n * @param {OpenSeadragon.Point} size\n */\n adjust: function(position, size) {\n var properties = $.Placement.properties[this.placement];\n if (!properties) {\n return;\n }\n if (properties.isHorizontallyCentered) {\n position.x -= size.x / 2;\n } else if (properties.isRight) {\n position.x -= size.x;\n }\n if (properties.isVerticallyCentered) {\n position.y -= size.y / 2;\n } else if (properties.isBottom) {\n position.y -= size.y;\n }\n },\n\n /**\n * @function\n */\n destroy: function() {\n var element = this.element;\n var style = this.style;\n\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n //this should allow us to preserve overlays when required between\n //pages\n if (element.prevElementParent) {\n style.display = 'none';\n //element.prevElementParent.insertBefore(\n // element,\n // element.prevNextSibling\n //);\n document.body.appendChild(element);\n }\n }\n\n // clear the onDraw callback\n this.onDraw = null;\n\n style.top = \"\";\n style.left = \"\";\n style.position = \"\";\n\n if (this.width !== null) {\n style.width = \"\";\n }\n if (this.height !== null) {\n style.height = \"\";\n }\n var transformOriginProp = $.getCssPropertyWithVendorPrefix(\n 'transformOrigin');\n var transformProp = $.getCssPropertyWithVendorPrefix(\n 'transform');\n if (transformOriginProp && transformProp) {\n style[transformOriginProp] = \"\";\n style[transformProp] = \"\";\n }\n },\n\n /**\n * @function\n * @param {Element} container\n */\n drawHTML: function(container, viewport) {\n var element = this.element;\n if (element.parentNode !== container) {\n //save the source parent for later if we need it\n element.prevElementParent = element.parentNode;\n element.prevNextSibling = element.nextSibling;\n container.appendChild(element);\n\n // have to set position before calculating size, fix #1116\n this.style.position = \"absolute\";\n // this.size is used by overlays which don't get scaled in at\n // least one direction when this.checkResize is set to false.\n this.size = $.getElementSize(element);\n }\n\n var positionAndSize = this._getOverlayPositionAndSize(viewport);\n\n var position = positionAndSize.position;\n var size = this.size = positionAndSize.size;\n var rotate = positionAndSize.rotate;\n\n // call the onDraw callback if it exists to allow one to overwrite\n // the drawing/positioning/sizing of the overlay\n if (this.onDraw) {\n this.onDraw(position, size, this.element);\n } else {\n var style = this.style;\n style.left = position.x + \"px\";\n style.top = position.y + \"px\";\n if (this.width !== null) {\n style.width = size.x + \"px\";\n }\n if (this.height !== null) {\n style.height = size.y + \"px\";\n }\n var transformOriginProp = $.getCssPropertyWithVendorPrefix(\n 'transformOrigin');\n var transformProp = $.getCssPropertyWithVendorPrefix(\n 'transform');\n if (transformOriginProp && transformProp) {\n if (rotate) {\n style[transformOriginProp] = this._getTransformOrigin();\n style[transformProp] = \"rotate(\" + rotate + \"deg)\";\n } else {\n style[transformOriginProp] = \"\";\n style[transformProp] = \"\";\n }\n }\n style.display = 'block';\n }\n },\n\n // private\n _getOverlayPositionAndSize: function(viewport) {\n var position = viewport.pixelFromPoint(this.location, true);\n var size = this._getSizeInPixels(viewport);\n this.adjust(position, size);\n\n var rotate = 0;\n if (viewport.getRotation(true) &&\n this.rotationMode !== $.OverlayRotationMode.NO_ROTATION) {\n // BOUNDING_BOX is only valid if both directions get scaled.\n // Get replaced by EXACT otherwise.\n if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX &&\n this.width !== null && this.height !== null) {\n var rect = new $.Rect(position.x, position.y, size.x, size.y);\n var boundingBox = this._getBoundingBox(rect, viewport.getRotation(true));\n position = boundingBox.getTopLeft();\n size = boundingBox.getSize();\n } else {\n rotate = viewport.getRotation(true);\n }\n }\n\n return {\n position: position,\n size: size,\n rotate: rotate\n };\n },\n\n // private\n _getSizeInPixels: function(viewport) {\n var width = this.size.x;\n var height = this.size.y;\n if (this.width !== null || this.height !== null) {\n var scaledSize = viewport.deltaPixelsFromPointsNoRotate(\n new $.Point(this.width || 0, this.height || 0), true);\n if (this.width !== null) {\n width = scaledSize.x;\n }\n if (this.height !== null) {\n height = scaledSize.y;\n }\n }\n if (this.checkResize &&\n (this.width === null || this.height === null)) {\n var eltSize = this.size = $.getElementSize(this.element);\n if (this.width === null) {\n width = eltSize.x;\n }\n if (this.height === null) {\n height = eltSize.y;\n }\n }\n return new $.Point(width, height);\n },\n\n // private\n _getBoundingBox: function(rect, degrees) {\n var refPoint = this._getPlacementPoint(rect);\n return rect.rotate(degrees, refPoint).getBoundingBox();\n },\n\n // private\n _getPlacementPoint: function(rect) {\n var result = new $.Point(rect.x, rect.y);\n var properties = $.Placement.properties[this.placement];\n if (properties) {\n if (properties.isHorizontallyCentered) {\n result.x += rect.width / 2;\n } else if (properties.isRight) {\n result.x += rect.width;\n }\n if (properties.isVerticallyCentered) {\n result.y += rect.height / 2;\n } else if (properties.isBottom) {\n result.y += rect.height;\n }\n }\n return result;\n },\n\n // private\n _getTransformOrigin: function() {\n var result = \"\";\n var properties = $.Placement.properties[this.placement];\n if (!properties) {\n return result;\n }\n if (properties.isLeft) {\n result = \"left\";\n } else if (properties.isRight) {\n result = \"right\";\n }\n if (properties.isTop) {\n result += \" top\";\n } else if (properties.isBottom) {\n result += \" bottom\";\n }\n return result;\n },\n\n /**\n * Changes the overlay settings.\n * @function\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect|Object} location\n * If an object is specified, the options are the same than the constructor\n * except for the element which can not be changed.\n * @param {OpenSeadragon.Placement} placement\n */\n update: function(location, placement) {\n var options = $.isPlainObject(location) ? location : {\n location: location,\n placement: placement\n };\n this._init({\n location: options.location || this.location,\n placement: options.placement !== undefined ?\n options.placement : this.placement,\n onDraw: options.onDraw || this.onDraw,\n checkResize: options.checkResize || this.checkResize,\n width: options.width !== undefined ? options.width : this.width,\n height: options.height !== undefined ? options.height : this.height,\n rotationMode: options.rotationMode || this.rotationMode\n });\n },\n\n /**\n * Returns the current bounds of the overlay in viewport coordinates\n * @function\n * @param {OpenSeadragon.Viewport} viewport the viewport\n * @returns {OpenSeadragon.Rect} overlay bounds\n */\n getBounds: function(viewport) {\n $.console.assert(viewport,\n 'A viewport must now be passed to Overlay.getBounds.');\n var width = this.width;\n var height = this.height;\n if (width === null || height === null) {\n var size = viewport.deltaPointsFromPixelsNoRotate(this.size, true);\n if (width === null) {\n width = size.x;\n }\n if (height === null) {\n height = size.y;\n }\n }\n var location = this.location.clone();\n this.adjust(location, new $.Point(width, height));\n return this._adjustBoundsForRotation(\n viewport, new $.Rect(location.x, location.y, width, height));\n },\n\n // private\n _adjustBoundsForRotation: function(viewport, bounds) {\n if (!viewport ||\n viewport.getRotation(true) === 0 ||\n this.rotationMode === $.OverlayRotationMode.EXACT) {\n return bounds;\n }\n if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX) {\n // If overlay not fully scalable, BOUNDING_BOX falls back to EXACT\n if (this.width === null || this.height === null) {\n return bounds;\n }\n // It is easier to just compute the position and size and\n // convert to viewport coordinates.\n var positionAndSize = this._getOverlayPositionAndSize(viewport);\n return viewport.viewerElementToViewportRectangle(new $.Rect(\n positionAndSize.position.x,\n positionAndSize.position.y,\n positionAndSize.size.x,\n positionAndSize.size.y));\n }\n\n // NO_ROTATION case\n return bounds.rotate(-viewport.getRotation(true),\n this._getPlacementPoint(bounds));\n }\n };\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Drawer\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Drawer\n * @memberof OpenSeadragon\n * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.\n * @param {Object} options - Options for this Drawer.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this Drawer.\n * @param {OpenSeadragon.Viewport} options.viewport - Reference to Viewer viewport.\n * @param {Element} options.element - Parent element.\n * @param {Number} [options.debugGridColor] - See debugGridColor in {@link OpenSeadragon.Options} for details.\n */\n$.Drawer = function( options ) {\n\n $.console.assert( options.viewer, \"[Drawer] options.viewer is required\" );\n\n //backward compatibility for positional args while preferring more\n //idiomatic javascript options object as the only argument\n var args = arguments;\n\n if( !$.isPlainObject( options ) ){\n options = {\n source: args[ 0 ], // Reference to Viewer tile source.\n viewport: args[ 1 ], // Reference to Viewer viewport.\n element: args[ 2 ] // Parent element.\n };\n }\n\n $.console.assert( options.viewport, \"[Drawer] options.viewport is required\" );\n $.console.assert( options.element, \"[Drawer] options.element is required\" );\n\n if ( options.source ) {\n $.console.error( \"[Drawer] options.source is no longer accepted; use TiledImage instead\" );\n }\n\n this.viewer = options.viewer;\n this.viewport = options.viewport;\n this.debugGridColor = typeof options.debugGridColor === 'string' ? [options.debugGridColor] : options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;\n if (options.opacity) {\n $.console.error( \"[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead\" );\n }\n\n this.useCanvas = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true );\n /**\n * The parent element of this Drawer instance, passed in when the Drawer was created.\n * The parent of {@link OpenSeadragon.Drawer#canvas}.\n * @member {Element} container\n * @memberof OpenSeadragon.Drawer#\n */\n this.container = $.getElement( options.element );\n /**\n * A <canvas> element if the browser supports them, otherwise a <div> element.\n * Child element of {@link OpenSeadragon.Drawer#container}.\n * @member {Element} canvas\n * @memberof OpenSeadragon.Drawer#\n */\n this.canvas = $.makeNeutralElement( this.useCanvas ? \"canvas\" : \"div\" );\n /**\n * 2d drawing context for {@link OpenSeadragon.Drawer#canvas} if it's a <canvas> element, otherwise null.\n * @member {Object} context\n * @memberof OpenSeadragon.Drawer#\n */\n this.context = this.useCanvas ? this.canvas.getContext( \"2d\" ) : null;\n\n /**\n * Sketch canvas used to temporarily draw tiles which cannot be drawn directly\n * to the main canvas due to opacity. Lazily initialized.\n */\n this.sketchCanvas = null;\n this.sketchContext = null;\n\n /**\n * @member {Element} element\n * @memberof OpenSeadragon.Drawer#\n * @deprecated Alias for {@link OpenSeadragon.Drawer#container}.\n */\n this.element = this.container;\n\n // We force our container to ltr because our drawing math doesn't work in rtl.\n // This issue only affects our canvas renderer, but we do it always for consistency.\n // Note that this means overlays you want to be rtl need to be explicitly set to rtl.\n this.container.dir = 'ltr';\n\n // check canvas available width and height, set canvas width and height such that the canvas backing store is set to the proper pixel density\n if (this.useCanvas) {\n var viewportSize = this._calculateCanvasSize();\n this.canvas.width = viewportSize.x;\n this.canvas.height = viewportSize.y;\n }\n\n this.canvas.style.width = \"100%\";\n this.canvas.style.height = \"100%\";\n this.canvas.style.position = \"absolute\";\n $.setElementOpacity( this.canvas, this.opacity, true );\n // Allow pointer events to pass through the canvas element so implicit\n // pointer capture works on touch devices\n $.setElementPointerEventsNone( this.canvas );\n $.setElementTouchActionNone( this.canvas );\n\n // explicit left-align\n this.container.style.textAlign = \"left\";\n this.container.appendChild( this.canvas );\n\n // Image smoothing for canvas rendering (only if canvas is used).\n // Canvas default is \"true\", so this will only be changed if user specified \"false\".\n this._imageSmoothingEnabled = true;\n};\n\n/** @lends OpenSeadragon.Drawer.prototype */\n$.Drawer.prototype = {\n // deprecated\n addOverlay: function( element, location, placement, onDraw ) {\n $.console.error(\"drawer.addOverlay is deprecated. Use viewer.addOverlay instead.\");\n this.viewer.addOverlay( element, location, placement, onDraw );\n return this;\n },\n\n // deprecated\n updateOverlay: function( element, location, placement ) {\n $.console.error(\"drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.\");\n this.viewer.updateOverlay( element, location, placement );\n return this;\n },\n\n // deprecated\n removeOverlay: function( element ) {\n $.console.error(\"drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.\");\n this.viewer.removeOverlay( element );\n return this;\n },\n\n // deprecated\n clearOverlays: function() {\n $.console.error(\"drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.\");\n this.viewer.clearOverlays();\n return this;\n },\n\n /**\n * This function converts the given point from to the drawer coordinate by\n * multiplying it with the pixel density.\n * This function does not take rotation into account, thus assuming provided\n * point is at 0 degree.\n * @param {OpenSeadragon.Point} point - the pixel point to convert\n * @returns {OpenSeadragon.Point} Point in drawer coordinate system.\n */\n viewportCoordToDrawerCoord: function(point) {\n var vpPoint = this.viewport.pixelFromPointNoRotate(point, true);\n return new $.Point(\n vpPoint.x * $.pixelDensityRatio,\n vpPoint.y * $.pixelDensityRatio\n );\n },\n\n /**\n * This function will create multiple polygon paths on the drawing context by provided polygons,\n * then clip the context to the paths.\n * @param {OpenSeadragon.Point[][]} polygons - an array of polygons. A polygon is an array of OpenSeadragon.Point\n * @param {Boolean} useSketch - Whether to use the sketch canvas or not.\n */\n clipWithPolygons: function (polygons, useSketch) {\n if (!this.useCanvas) {\n return;\n }\n var context = this._getContext(useSketch);\n context.beginPath();\n polygons.forEach(function (polygon) {\n polygon.forEach(function (coord, i) {\n context[i === 0 ? 'moveTo' : 'lineTo'](coord.x, coord.y);\n });\n });\n context.clip();\n },\n\n /**\n * Set the opacity of the drawer.\n * @param {Number} opacity\n * @returns {OpenSeadragon.Drawer} Chainable.\n */\n setOpacity: function( opacity ) {\n $.console.error(\"drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.\");\n var world = this.viewer.world;\n for (var i = 0; i < world.getItemCount(); i++) {\n world.getItemAt( i ).setOpacity( opacity );\n }\n return this;\n },\n\n /**\n * Get the opacity of the drawer.\n * @returns {Number}\n */\n getOpacity: function() {\n $.console.error(\"drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead.\");\n var world = this.viewer.world;\n var maxOpacity = 0;\n for (var i = 0; i < world.getItemCount(); i++) {\n var opacity = world.getItemAt( i ).getOpacity();\n if ( opacity > maxOpacity ) {\n maxOpacity = opacity;\n }\n }\n return maxOpacity;\n },\n\n // deprecated\n needsUpdate: function() {\n $.console.error( \"[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead.\" );\n return this.viewer.world.needsDraw();\n },\n\n // deprecated\n numTilesLoaded: function() {\n $.console.error( \"[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead.\" );\n return this.viewer.tileCache.numTilesLoaded();\n },\n\n // deprecated\n reset: function() {\n $.console.error( \"[Drawer.reset] this function is deprecated. Use World.resetItems instead.\" );\n this.viewer.world.resetItems();\n return this;\n },\n\n // deprecated\n update: function() {\n $.console.error( \"[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead.\" );\n this.clear();\n this.viewer.world.draw();\n return this;\n },\n\n /**\n * @returns {Boolean} True if rotation is supported.\n */\n canRotate: function() {\n return this.useCanvas;\n },\n\n /**\n * Destroy the drawer (unload current loaded tiles)\n */\n destroy: function() {\n //force unloading of current canvas (1x1 will be gc later, trick not necessarily needed)\n this.canvas.width = 1;\n this.canvas.height = 1;\n this.sketchCanvas = null;\n this.sketchContext = null;\n },\n\n /**\n * Clears the Drawer so it's ready to draw another frame.\n */\n clear: function() {\n this.canvas.innerHTML = \"\";\n if ( this.useCanvas ) {\n var viewportSize = this._calculateCanvasSize();\n if( this.canvas.width !== viewportSize.x ||\n this.canvas.height !== viewportSize.y ) {\n this.canvas.width = viewportSize.x;\n this.canvas.height = viewportSize.y;\n this._updateImageSmoothingEnabled(this.context);\n if ( this.sketchCanvas !== null ) {\n var sketchCanvasSize = this._calculateSketchCanvasSize();\n this.sketchCanvas.width = sketchCanvasSize.x;\n this.sketchCanvas.height = sketchCanvasSize.y;\n this._updateImageSmoothingEnabled(this.sketchContext);\n }\n }\n this._clear();\n }\n },\n\n _clear: function (useSketch, bounds) {\n if (!this.useCanvas) {\n return;\n }\n var context = this._getContext(useSketch);\n if (bounds) {\n context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height);\n } else {\n var canvas = context.canvas;\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n },\n\n /**\n * Scale from OpenSeadragon viewer rectangle to drawer rectangle\n * (ignoring rotation)\n * @param {OpenSeadragon.Rect} rectangle - The rectangle in viewport coordinate system.\n * @returns {OpenSeadragon.Rect} Rectangle in drawer coordinate system.\n */\n viewportToDrawerRectangle: function(rectangle) {\n var topLeft = this.viewport.pixelFromPointNoRotate(rectangle.getTopLeft(), true);\n var size = this.viewport.deltaPixelsFromPointsNoRotate(rectangle.getSize(), true);\n\n return new $.Rect(\n topLeft.x * $.pixelDensityRatio,\n topLeft.y * $.pixelDensityRatio,\n size.x * $.pixelDensityRatio,\n size.y * $.pixelDensityRatio\n );\n },\n\n /**\n * Draws the given tile.\n * @param {OpenSeadragon.Tile} tile - The tile to draw.\n * @param {Function} drawingHandler - Method for firing the drawing event if using canvas.\n * drawingHandler({context, tile, rendered})\n * @param {Boolean} useSketch - Whether to use the sketch canvas or not.\n * where rendered is the context with the pre-drawn image.\n * @param {Float} [scale=1] - Apply a scale to tile position and size. Defaults to 1.\n * @param {OpenSeadragon.Point} [translate] A translation vector to offset tile position\n * @param {Boolean} [shouldRoundPositionAndSize] - Tells whether to round\n * position and size of tiles supporting alpha channel in non-transparency\n * context.\n * @param {OpenSeadragon.TileSource} source - The source specification of the tile.\n */\n drawTile: function( tile, drawingHandler, useSketch, scale, translate, shouldRoundPositionAndSize, source) {\n $.console.assert(tile, '[Drawer.drawTile] tile is required');\n $.console.assert(drawingHandler, '[Drawer.drawTile] drawingHandler is required');\n\n if (this.useCanvas) {\n var context = this._getContext(useSketch);\n scale = scale || 1;\n tile.drawCanvas(context, drawingHandler, scale, translate, shouldRoundPositionAndSize, source);\n } else {\n tile.drawHTML( this.canvas );\n }\n },\n\n _getContext: function( useSketch ) {\n var context = this.context;\n if ( useSketch ) {\n if (this.sketchCanvas === null) {\n this.sketchCanvas = document.createElement( \"canvas\" );\n var sketchCanvasSize = this._calculateSketchCanvasSize();\n this.sketchCanvas.width = sketchCanvasSize.x;\n this.sketchCanvas.height = sketchCanvasSize.y;\n this.sketchContext = this.sketchCanvas.getContext( \"2d\" );\n\n // If the viewport is not currently rotated, the sketchCanvas\n // will have the same size as the main canvas. However, if\n // the viewport get rotated later on, we will need to resize it.\n if (this.viewport.getRotation() === 0) {\n var self = this;\n this.viewer.addHandler('rotate', function resizeSketchCanvas() {\n if (self.viewport.getRotation() === 0) {\n return;\n }\n self.viewer.removeHandler('rotate', resizeSketchCanvas);\n var sketchCanvasSize = self._calculateSketchCanvasSize();\n self.sketchCanvas.width = sketchCanvasSize.x;\n self.sketchCanvas.height = sketchCanvasSize.y;\n });\n }\n this._updateImageSmoothingEnabled(this.sketchContext);\n }\n context = this.sketchContext;\n }\n return context;\n },\n\n // private\n saveContext: function( useSketch ) {\n if (!this.useCanvas) {\n return;\n }\n\n this._getContext( useSketch ).save();\n },\n\n // private\n restoreContext: function( useSketch ) {\n if (!this.useCanvas) {\n return;\n }\n\n this._getContext( useSketch ).restore();\n },\n\n // private\n setClip: function(rect, useSketch) {\n if (!this.useCanvas) {\n return;\n }\n\n var context = this._getContext( useSketch );\n context.beginPath();\n context.rect(rect.x, rect.y, rect.width, rect.height);\n context.clip();\n },\n\n // private\n drawRectangle: function(rect, fillStyle, useSketch) {\n if (!this.useCanvas) {\n return;\n }\n\n var context = this._getContext( useSketch );\n context.save();\n context.fillStyle = fillStyle;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n context.restore();\n },\n\n /**\n * Blends the sketch canvas in the main canvas.\n * @param {Object} options The options\n * @param {Float} options.opacity The opacity of the blending.\n * @param {Float} [options.scale=1] The scale at which tiles were drawn on\n * the sketch. Default is 1.\n * Use scale to draw at a lower scale and then enlarge onto the main canvas.\n * @param {OpenSeadragon.Point} [options.translate] A translation vector\n * that was used to draw the tiles\n * @param {String} [options.compositeOperation] - How the image is\n * composited onto other images; see compositeOperation in\n * {@link OpenSeadragon.Options} for possible values.\n * @param {OpenSeadragon.Rect} [options.bounds] The part of the sketch\n * canvas to blend in the main canvas. If specified, options.scale and\n * options.translate get ignored.\n */\n blendSketch: function(opacity, scale, translate, compositeOperation) {\n var options = opacity;\n if (!$.isPlainObject(options)) {\n options = {\n opacity: opacity,\n scale: scale,\n translate: translate,\n compositeOperation: compositeOperation\n };\n }\n if (!this.useCanvas || !this.sketchCanvas) {\n return;\n }\n opacity = options.opacity;\n compositeOperation = options.compositeOperation;\n var bounds = options.bounds;\n\n this.context.save();\n this.context.globalAlpha = opacity;\n if (compositeOperation) {\n this.context.globalCompositeOperation = compositeOperation;\n }\n if (bounds) {\n // Internet Explorer, Microsoft Edge, and Safari have problems\n // when you call context.drawImage with negative x or y\n // or x + width or y + height greater than the canvas width or height respectively.\n if (bounds.x < 0) {\n bounds.width += bounds.x;\n bounds.x = 0;\n }\n if (bounds.x + bounds.width > this.canvas.width) {\n bounds.width = this.canvas.width - bounds.x;\n }\n if (bounds.y < 0) {\n bounds.height += bounds.y;\n bounds.y = 0;\n }\n if (bounds.y + bounds.height > this.canvas.height) {\n bounds.height = this.canvas.height - bounds.y;\n }\n\n this.context.drawImage(\n this.sketchCanvas,\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height,\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height\n );\n } else {\n scale = options.scale || 1;\n translate = options.translate;\n var position = translate instanceof $.Point ?\n translate : new $.Point(0, 0);\n\n var widthExt = 0;\n var heightExt = 0;\n if (translate) {\n var widthDiff = this.sketchCanvas.width - this.canvas.width;\n var heightDiff = this.sketchCanvas.height - this.canvas.height;\n widthExt = Math.round(widthDiff / 2);\n heightExt = Math.round(heightDiff / 2);\n }\n this.context.drawImage(\n this.sketchCanvas,\n position.x - widthExt * scale,\n position.y - heightExt * scale,\n (this.canvas.width + 2 * widthExt) * scale,\n (this.canvas.height + 2 * heightExt) * scale,\n -widthExt,\n -heightExt,\n this.canvas.width + 2 * widthExt,\n this.canvas.height + 2 * heightExt\n );\n }\n this.context.restore();\n },\n\n // private\n drawDebugInfo: function(tile, count, i, tiledImage) {\n if ( !this.useCanvas ) {\n return;\n }\n\n var colorIndex = this.viewer.world.getIndexOfItem(tiledImage) % this.debugGridColor.length;\n var context = this.context;\n context.save();\n context.lineWidth = 2 * $.pixelDensityRatio;\n context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial';\n context.strokeStyle = this.debugGridColor[colorIndex];\n context.fillStyle = this.debugGridColor[colorIndex];\n\n if (this.viewport.getRotation(true) % 360 !== 0 ) {\n this._offsetForRotation({degrees: this.viewport.getRotation(true)});\n }\n if (tiledImage.getRotation(true) % 360 !== 0) {\n this._offsetForRotation({\n degrees: tiledImage.getRotation(true),\n point: tiledImage.viewport.pixelFromPointNoRotate(\n tiledImage._getRotationPoint(true), true)\n });\n }\n if (tiledImage.viewport.getRotation(true) % 360 === 0 &&\n tiledImage.getRotation(true) % 360 === 0) {\n if(tiledImage._drawer.viewer.viewport.getFlip()) {\n tiledImage._drawer._flip();\n }\n }\n\n context.strokeRect(\n tile.position.x * $.pixelDensityRatio,\n tile.position.y * $.pixelDensityRatio,\n tile.size.x * $.pixelDensityRatio,\n tile.size.y * $.pixelDensityRatio\n );\n\n var tileCenterX = (tile.position.x + (tile.size.x / 2)) * $.pixelDensityRatio;\n var tileCenterY = (tile.position.y + (tile.size.y / 2)) * $.pixelDensityRatio;\n\n // Rotate the text the right way around.\n context.translate( tileCenterX, tileCenterY );\n context.rotate( Math.PI / 180 * -this.viewport.getRotation(true) );\n context.translate( -tileCenterX, -tileCenterY );\n\n if( tile.x === 0 && tile.y === 0 ){\n context.fillText(\n \"Zoom: \" + this.viewport.getZoom(),\n tile.position.x * $.pixelDensityRatio,\n (tile.position.y - 30) * $.pixelDensityRatio\n );\n context.fillText(\n \"Pan: \" + this.viewport.getBounds().toString(),\n tile.position.x * $.pixelDensityRatio,\n (tile.position.y - 20) * $.pixelDensityRatio\n );\n }\n context.fillText(\n \"Level: \" + tile.level,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 20) * $.pixelDensityRatio\n );\n context.fillText(\n \"Column: \" + tile.x,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 30) * $.pixelDensityRatio\n );\n context.fillText(\n \"Row: \" + tile.y,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 40) * $.pixelDensityRatio\n );\n context.fillText(\n \"Order: \" + i + \" of \" + count,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 50) * $.pixelDensityRatio\n );\n context.fillText(\n \"Size: \" + tile.size.toString(),\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 60) * $.pixelDensityRatio\n );\n context.fillText(\n \"Position: \" + tile.position.toString(),\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 70) * $.pixelDensityRatio\n );\n\n if (this.viewport.getRotation(true) % 360 !== 0 ) {\n this._restoreRotationChanges();\n }\n if (tiledImage.getRotation(true) % 360 !== 0) {\n this._restoreRotationChanges();\n }\n\n if (tiledImage.viewport.getRotation(true) % 360 === 0 &&\n tiledImage.getRotation(true) % 360 === 0) {\n if(tiledImage._drawer.viewer.viewport.getFlip()) {\n tiledImage._drawer._flip();\n }\n }\n\n context.restore();\n },\n\n // private\n debugRect: function(rect) {\n if ( this.useCanvas ) {\n var context = this.context;\n context.save();\n context.lineWidth = 2 * $.pixelDensityRatio;\n context.strokeStyle = this.debugGridColor[0];\n context.fillStyle = this.debugGridColor[0];\n\n context.strokeRect(\n rect.x * $.pixelDensityRatio,\n rect.y * $.pixelDensityRatio,\n rect.width * $.pixelDensityRatio,\n rect.height * $.pixelDensityRatio\n );\n\n context.restore();\n }\n },\n\n /**\n * Turns image smoothing on or off for this viewer. Note: Ignored in some (especially older) browsers that do not support this property.\n *\n * @function\n * @param {Boolean} [imageSmoothingEnabled] - Whether or not the image is\n * drawn smoothly on the canvas; see imageSmoothingEnabled in\n * {@link OpenSeadragon.Options} for more explanation.\n */\n setImageSmoothingEnabled: function(imageSmoothingEnabled){\n if ( this.useCanvas ) {\n this._imageSmoothingEnabled = imageSmoothingEnabled;\n this._updateImageSmoothingEnabled(this.context);\n this.viewer.forceRedraw();\n }\n },\n\n // private\n _updateImageSmoothingEnabled: function(context){\n context.msImageSmoothingEnabled = this._imageSmoothingEnabled;\n context.imageSmoothingEnabled = this._imageSmoothingEnabled;\n },\n\n /**\n * Get the canvas size\n * @param {Boolean} sketch If set to true return the size of the sketch canvas\n * @returns {OpenSeadragon.Point} The size of the canvas\n */\n getCanvasSize: function(sketch) {\n var canvas = this._getContext(sketch).canvas;\n return new $.Point(canvas.width, canvas.height);\n },\n\n getCanvasCenter: function() {\n return new $.Point(this.canvas.width / 2, this.canvas.height / 2);\n },\n\n // private\n _offsetForRotation: function(options) {\n var point = options.point ?\n options.point.times($.pixelDensityRatio) :\n this.getCanvasCenter();\n\n var context = this._getContext(options.useSketch);\n context.save();\n\n context.translate(point.x, point.y);\n if(this.viewer.viewport.flipped){\n context.rotate(Math.PI / 180 * -options.degrees);\n context.scale(-1, 1);\n } else{\n context.rotate(Math.PI / 180 * options.degrees);\n }\n context.translate(-point.x, -point.y);\n },\n\n // private\n _flip: function(options) {\n options = options || {};\n var point = options.point ?\n options.point.times($.pixelDensityRatio) :\n this.getCanvasCenter();\n var context = this._getContext(options.useSketch);\n\n context.translate(point.x, 0);\n context.scale(-1, 1);\n context.translate(-point.x, 0);\n },\n\n // private\n _restoreRotationChanges: function(useSketch) {\n var context = this._getContext(useSketch);\n context.restore();\n },\n\n // private\n _calculateCanvasSize: function() {\n var pixelDensityRatio = $.pixelDensityRatio;\n var viewportSize = this.viewport.getContainerSize();\n return {\n // canvas width and height are integers\n x: Math.round(viewportSize.x * pixelDensityRatio),\n y: Math.round(viewportSize.y * pixelDensityRatio)\n };\n },\n\n // private\n _calculateSketchCanvasSize: function() {\n var canvasSize = this._calculateCanvasSize();\n if (this.viewport.getRotation() === 0) {\n return canvasSize;\n }\n // If the viewport is rotated, we need a larger sketch canvas in order\n // to support edge smoothing.\n var sketchCanvasSize = Math.ceil(Math.sqrt(\n canvasSize.x * canvasSize.x +\n canvasSize.y * canvasSize.y));\n return {\n x: sketchCanvasSize,\n y: sketchCanvasSize\n };\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Viewport\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n\n/**\n * @class Viewport\n * @memberof OpenSeadragon\n * @classdesc Handles coordinate-related functionality (zoom, pan, rotation, etc.)\n * for an {@link OpenSeadragon.Viewer}.\n * @param {Object} options - Options for this Viewport.\n * @param {Object} [options.margins] - See viewportMargins in {@link OpenSeadragon.Options}.\n * @param {Number} [options.springStiffness] - See springStiffness in {@link OpenSeadragon.Options}.\n * @param {Number} [options.animationTime] - See animationTime in {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomImageRatio] - See minZoomImageRatio in {@link OpenSeadragon.Options}.\n * @param {Number} [options.maxZoomPixelRatio] - See maxZoomPixelRatio in {@link OpenSeadragon.Options}.\n * @param {Number} [options.visibilityRatio] - See visibilityRatio in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapHorizontal] - See wrapHorizontal in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapVertical] - See wrapVertical in {@link OpenSeadragon.Options}.\n * @param {Number} [options.defaultZoomLevel] - See defaultZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomLevel] - See minZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.maxZoomLevel] - See maxZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.degrees] - See degrees in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.homeFillsViewer] - See homeFillsViewer in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.silenceMultiImageWarnings] - See silenceMultiImageWarnings in {@link OpenSeadragon.Options}.\n */\n$.Viewport = function( options ) {\n\n //backward compatibility for positional args while preferring more\n //idiomatic javascript options object as the only argument\n var args = arguments;\n if (args.length && args[0] instanceof $.Point) {\n options = {\n containerSize: args[0],\n contentSize: args[1],\n config: args[2]\n };\n }\n\n //options.config and the general config argument are deprecated\n //in favor of the more direct specification of optional settings\n //being passed directly on the options object\n if ( options.config ){\n $.extend( true, options, options.config );\n delete options.config;\n }\n\n this._margins = $.extend({\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n }, options.margins || {});\n\n delete options.margins;\n\n options.initialDegrees = options.degrees;\n delete options.degrees;\n\n $.extend( true, this, {\n\n //required settings\n containerSize: null,\n contentSize: null,\n\n //internal state properties\n zoomPoint: null,\n rotationPivot: null,\n viewer: null,\n\n //configurable options\n springStiffness: $.DEFAULT_SETTINGS.springStiffness,\n animationTime: $.DEFAULT_SETTINGS.animationTime,\n minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio,\n maxZoomPixelRatio: $.DEFAULT_SETTINGS.maxZoomPixelRatio,\n visibilityRatio: $.DEFAULT_SETTINGS.visibilityRatio,\n wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal,\n wrapVertical: $.DEFAULT_SETTINGS.wrapVertical,\n defaultZoomLevel: $.DEFAULT_SETTINGS.defaultZoomLevel,\n minZoomLevel: $.DEFAULT_SETTINGS.minZoomLevel,\n maxZoomLevel: $.DEFAULT_SETTINGS.maxZoomLevel,\n initialDegrees: $.DEFAULT_SETTINGS.degrees,\n flipped: $.DEFAULT_SETTINGS.flipped,\n homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer,\n silenceMultiImageWarnings: $.DEFAULT_SETTINGS.silenceMultiImageWarnings\n\n }, options );\n\n this._updateContainerInnerSize();\n\n this.centerSpringX = new $.Spring({\n initial: 0,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n this.centerSpringY = new $.Spring({\n initial: 0,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n this.zoomSpring = new $.Spring({\n exponential: true,\n initial: 1,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this.degreesSpring = new $.Spring({\n initial: options.initialDegrees,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._oldCenterX = this.centerSpringX.current.value;\n this._oldCenterY = this.centerSpringY.current.value;\n this._oldZoom = this.zoomSpring.current.value;\n this._oldDegrees = this.degreesSpring.current.value;\n\n this._setContentBounds(new $.Rect(0, 0, 1, 1), 1);\n\n this.goHome(true);\n this.update();\n};\n\n/** @lends OpenSeadragon.Viewport.prototype */\n$.Viewport.prototype = {\n\n // deprecated\n get degrees () {\n $.console.warn('Accessing [Viewport.degrees] is deprecated. Use viewport.getRotation instead.');\n return this.getRotation();\n },\n\n // deprecated\n set degrees (degrees) {\n $.console.warn('Setting [Viewport.degrees] is deprecated. Use viewport.rotateTo, viewport.rotateBy, or viewport.setRotation instead.');\n this.rotateTo(degrees);\n },\n\n /**\n * Updates the viewport's home bounds and constraints for the given content size.\n * @function\n * @param {OpenSeadragon.Point} contentSize - size of the content in content units\n * @returns {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:reset-size\n */\n resetContentSize: function(contentSize) {\n $.console.assert(contentSize, \"[Viewport.resetContentSize] contentSize is required\");\n $.console.assert(contentSize instanceof $.Point, \"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point\");\n $.console.assert(contentSize.x > 0, \"[Viewport.resetContentSize] contentSize.x must be greater than 0\");\n $.console.assert(contentSize.y > 0, \"[Viewport.resetContentSize] contentSize.y must be greater than 0\");\n\n this._setContentBounds(new $.Rect(0, 0, 1, contentSize.y / contentSize.x), contentSize.x);\n return this;\n },\n\n // deprecated\n setHomeBounds: function(bounds, contentFactor) {\n $.console.error(\"[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually.\");\n this._setContentBounds(bounds, contentFactor);\n },\n\n // Set the viewport's content bounds\n // @param {OpenSeadragon.Rect} bounds - the new bounds in viewport coordinates\n // without rotation\n // @param {Number} contentFactor - how many content units per viewport unit\n // @fires OpenSeadragon.Viewer.event:reset-size\n // @private\n _setContentBounds: function(bounds, contentFactor) {\n $.console.assert(bounds, \"[Viewport._setContentBounds] bounds is required\");\n $.console.assert(bounds instanceof $.Rect, \"[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect\");\n $.console.assert(bounds.width > 0, \"[Viewport._setContentBounds] bounds.width must be greater than 0\");\n $.console.assert(bounds.height > 0, \"[Viewport._setContentBounds] bounds.height must be greater than 0\");\n\n this._contentBoundsNoRotate = bounds.clone();\n this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times(\n contentFactor);\n\n this._contentBounds = bounds.rotate(this.getRotation()).getBoundingBox();\n this._contentSize = this._contentBounds.getSize().times(contentFactor);\n this._contentAspectRatio = this._contentSize.x / this._contentSize.y;\n\n if (this.viewer) {\n /**\n * Raised when the viewer's content size or home bounds are reset\n * (see {@link OpenSeadragon.Viewport#resetContentSize}).\n *\n * @event reset-size\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} contentSize\n * @property {OpenSeadragon.Rect} contentBounds - Content bounds.\n * @property {OpenSeadragon.Rect} homeBounds - Content bounds.\n * Deprecated use contentBounds instead.\n * @property {Number} contentFactor\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('reset-size', {\n contentSize: this._contentSizeNoRotate.clone(),\n contentFactor: contentFactor,\n homeBounds: this._contentBoundsNoRotate.clone(),\n contentBounds: this._contentBounds.clone()\n });\n }\n },\n\n /**\n * Returns the home zoom in \"viewport zoom\" value.\n * @function\n * @returns {Number} The home zoom in \"viewport zoom\".\n */\n getHomeZoom: function() {\n if (this.defaultZoomLevel) {\n return this.defaultZoomLevel;\n }\n\n var aspectFactor = this._contentAspectRatio / this.getAspectRatio();\n var output;\n if (this.homeFillsViewer) { // fill the viewer and clip the image\n output = aspectFactor >= 1 ? aspectFactor : 1;\n } else {\n output = aspectFactor >= 1 ? 1 : aspectFactor;\n }\n\n return output / this._contentBounds.width;\n },\n\n /**\n * Returns the home bounds in viewport coordinates.\n * @function\n * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.\n */\n getHomeBounds: function() {\n return this.getHomeBoundsNoRotate().rotate(-this.getRotation());\n },\n\n /**\n * Returns the home bounds in viewport coordinates.\n * This method ignores the viewport rotation. Use\n * {@link OpenSeadragon.Viewport#getHomeBounds} to take it into account.\n * @function\n * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.\n */\n getHomeBoundsNoRotate: function() {\n var center = this._contentBounds.getCenter();\n var width = 1.0 / this.getHomeZoom();\n var height = width / this.getAspectRatio();\n\n return new $.Rect(\n center.x - (width / 2.0),\n center.y - (height / 2.0),\n width,\n height\n );\n },\n\n /**\n * @function\n * @param {Boolean} immediately\n * @fires OpenSeadragon.Viewer.event:home\n */\n goHome: function(immediately) {\n if (this.viewer) {\n /**\n * Raised when the \"home\" operation occurs (see {@link OpenSeadragon.Viewport#goHome}).\n *\n * @event home\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('home', {\n immediately: immediately\n });\n }\n return this.fitBounds(this.getHomeBounds(), immediately);\n },\n\n /**\n * @function\n */\n getMinZoom: function() {\n var homeZoom = this.getHomeZoom(),\n zoom = this.minZoomLevel ?\n this.minZoomLevel :\n this.minZoomImageRatio * homeZoom;\n\n return zoom;\n },\n\n /**\n * @function\n */\n getMaxZoom: function() {\n var zoom = this.maxZoomLevel;\n if (!zoom) {\n zoom = this._contentSize.x * this.maxZoomPixelRatio / this._containerInnerSize.x;\n zoom /= this._contentBounds.width;\n }\n\n return Math.max( zoom, this.getHomeZoom() );\n },\n\n /**\n * @function\n */\n getAspectRatio: function() {\n return this._containerInnerSize.x / this._containerInnerSize.y;\n },\n\n /**\n * @function\n * @returns {OpenSeadragon.Point} The size of the container, in screen coordinates.\n */\n getContainerSize: function() {\n return new $.Point(\n this.containerSize.x,\n this.containerSize.y\n );\n },\n\n /**\n * The margins push the \"home\" region in from the sides by the specified amounts.\n * @function\n * @returns {Object} Properties (Numbers, in screen coordinates): left, top, right, bottom.\n */\n getMargins: function() {\n return $.extend({}, this._margins); // Make a copy so we are not returning our original\n },\n\n /**\n * The margins push the \"home\" region in from the sides by the specified amounts.\n * @function\n * @param {Object} margins - Properties (Numbers, in screen coordinates): left, top, right, bottom.\n */\n setMargins: function(margins) {\n $.console.assert($.type(margins) === 'object', '[Viewport.setMargins] margins must be an object');\n\n this._margins = $.extend({\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n }, margins);\n\n this._updateContainerInnerSize();\n if (this.viewer) {\n this.viewer.forceRedraw();\n }\n },\n\n /**\n * Returns the bounds of the visible area in viewport coordinates.\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.\n */\n getBounds: function(current) {\n return this.getBoundsNoRotate(current).rotate(-this.getRotation(current));\n },\n\n /**\n * Returns the bounds of the visible area in viewport coordinates.\n * This method ignores the viewport rotation. Use\n * {@link OpenSeadragon.Viewport#getBounds} to take it into account.\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.\n */\n getBoundsNoRotate: function(current) {\n var center = this.getCenter(current);\n var width = 1.0 / this.getZoom(current);\n var height = width / this.getAspectRatio();\n\n return new $.Rect(\n center.x - (width / 2.0),\n center.y - (height / 2.0),\n width,\n height\n );\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,\n * including the space taken by margins, in viewport coordinates.\n */\n getBoundsWithMargins: function(current) {\n return this.getBoundsNoRotateWithMargins(current).rotate(\n -this.getRotation(current), this.getCenter(current));\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,\n * including the space taken by margins, in viewport coordinates.\n */\n getBoundsNoRotateWithMargins: function(current) {\n var bounds = this.getBoundsNoRotate(current);\n var factor = this._containerInnerSize.x * this.getZoom(current);\n bounds.x -= this._margins.left / factor;\n bounds.y -= this._margins.top / factor;\n bounds.width += (this._margins.left + this._margins.right) / factor;\n bounds.height += (this._margins.top + this._margins.bottom) / factor;\n return bounds;\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n */\n getCenter: function( current ) {\n var centerCurrent = new $.Point(\n this.centerSpringX.current.value,\n this.centerSpringY.current.value\n ),\n centerTarget = new $.Point(\n this.centerSpringX.target.value,\n this.centerSpringY.target.value\n ),\n oldZoomPixel,\n zoom,\n width,\n height,\n bounds,\n newZoomPixel,\n deltaZoomPixels,\n deltaZoomPoints;\n\n if ( current ) {\n return centerCurrent;\n } else if ( !this.zoomPoint ) {\n return centerTarget;\n }\n\n oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n\n zoom = this.getZoom();\n width = 1.0 / zoom;\n height = width / this.getAspectRatio();\n bounds = new $.Rect(\n centerCurrent.x - width / 2.0,\n centerCurrent.y - height / 2.0,\n width,\n height\n );\n\n newZoomPixel = this._pixelFromPoint(this.zoomPoint, bounds);\n deltaZoomPixels = newZoomPixel.minus( oldZoomPixel ).rotate(-this.getRotation(true));\n deltaZoomPoints = deltaZoomPixels.divide( this._containerInnerSize.x * zoom );\n\n return centerTarget.plus( deltaZoomPoints );\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n */\n getZoom: function( current ) {\n if ( current ) {\n return this.zoomSpring.current.value;\n } else {\n return this.zoomSpring.target.value;\n }\n },\n\n // private\n _applyZoomConstraints: function(zoom) {\n return Math.max(\n Math.min(zoom, this.getMaxZoom()),\n this.getMinZoom());\n },\n\n /**\n * @function\n * @private\n * @param {OpenSeadragon.Rect} bounds\n * @returns {OpenSeadragon.Rect} constrained bounds.\n */\n _applyBoundaryConstraints: function(bounds) {\n var newBounds = this.viewportToViewerElementRectangle(bounds).getBoundingBox();\n var cb = this.viewportToViewerElementRectangle(this._contentBoundsNoRotate).getBoundingBox();\n\n var xConstrained = false;\n var yConstrained = false;\n\n if (this.wrapHorizontal) {\n //do nothing\n } else {\n var boundsRight = newBounds.x + newBounds.width;\n var contentRight = cb.x + cb.width;\n\n var horizontalThreshold, leftDx, rightDx;\n if (newBounds.width > cb.width) {\n horizontalThreshold = this.visibilityRatio * cb.width;\n } else {\n horizontalThreshold = this.visibilityRatio * newBounds.width;\n }\n\n leftDx = cb.x - boundsRight + horizontalThreshold;\n rightDx = contentRight - newBounds.x - horizontalThreshold;\n if (horizontalThreshold > cb.width) {\n newBounds.x += (leftDx + rightDx) / 2;\n xConstrained = true;\n } else if (rightDx < 0) {\n newBounds.x += rightDx;\n xConstrained = true;\n } else if (leftDx > 0) {\n newBounds.x += leftDx;\n xConstrained = true;\n }\n\n }\n\n if (this.wrapVertical) {\n //do nothing\n } else {\n var boundsBottom = newBounds.y + newBounds.height;\n var contentBottom = cb.y + cb.height;\n\n var verticalThreshold, topDy, bottomDy;\n if (newBounds.height > cb.height) {\n verticalThreshold = this.visibilityRatio * cb.height;\n } else{\n verticalThreshold = this.visibilityRatio * newBounds.height;\n }\n\n topDy = cb.y - boundsBottom + verticalThreshold;\n bottomDy = contentBottom - newBounds.y - verticalThreshold;\n if (verticalThreshold > cb.height) {\n newBounds.y += (topDy + bottomDy) / 2;\n yConstrained = true;\n } else if (bottomDy < 0) {\n newBounds.y += bottomDy;\n yConstrained = true;\n } else if (topDy > 0) {\n newBounds.y += topDy;\n yConstrained = true;\n }\n\n }\n\n var constraintApplied = xConstrained || yConstrained;\n var newViewportBounds = constraintApplied ? this.viewerElementToViewportRectangle(newBounds) : bounds.clone();\n newViewportBounds.xConstrained = xConstrained;\n newViewportBounds.yConstrained = yConstrained;\n newViewportBounds.constraintApplied = constraintApplied;\n\n return newViewportBounds;\n },\n\n /**\n * @function\n * @private\n * @param {Boolean} [immediately=false] - whether the function that triggered this event was\n * called with the \"immediately\" flag\n */\n _raiseConstraintsEvent: function(immediately) {\n if (this.viewer) {\n /**\n * Raised when the viewport constraints are applied (see {@link OpenSeadragon.Viewport#applyConstraints}).\n *\n * @event constrain\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Boolean} immediately - whether the function that triggered this event was\n * called with the \"immediately\" flag\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'constrain', {\n immediately: immediately\n });\n }\n },\n\n /**\n * Enforces the minZoom, maxZoom and visibilityRatio constraints by\n * zooming and panning to the closest acceptable zoom and location.\n * @function\n * @param {Boolean} [immediately=false]\n * @returns {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:constrain if constraints were applied\n */\n applyConstraints: function(immediately) {\n var actualZoom = this.getZoom();\n var constrainedZoom = this._applyZoomConstraints(actualZoom);\n\n if (actualZoom !== constrainedZoom) {\n this.zoomTo(constrainedZoom, this.zoomPoint, immediately);\n }\n\n var constrainedBounds = this.getConstrainedBounds(false);\n\n if(constrainedBounds.constraintApplied){\n this.fitBounds(constrainedBounds, immediately);\n this._raiseConstraintsEvent(immediately);\n }\n\n return this;\n },\n\n /**\n * Equivalent to {@link OpenSeadragon.Viewport#applyConstraints}\n * @function\n * @param {Boolean} [immediately=false]\n * @returns {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:constrain\n */\n ensureVisible: function(immediately) {\n return this.applyConstraints(immediately);\n },\n\n /**\n * @function\n * @private\n * @param {OpenSeadragon.Rect} bounds\n * @param {Object} options (immediately=false, constraints=false)\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n _fitBounds: function(bounds, options) {\n options = options || {};\n var immediately = options.immediately || false;\n var constraints = options.constraints || false;\n\n var aspect = this.getAspectRatio();\n var center = bounds.getCenter();\n\n // Compute width and height of bounding box.\n var newBounds = new $.Rect(\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height,\n bounds.degrees + this.getRotation())\n .getBoundingBox();\n\n if (newBounds.getAspectRatio() >= aspect) {\n newBounds.height = newBounds.width / aspect;\n } else {\n newBounds.width = newBounds.height * aspect;\n }\n\n // Compute x and y from width, height and center position\n newBounds.x = center.x - newBounds.width / 2;\n newBounds.y = center.y - newBounds.height / 2;\n var newZoom = 1.0 / newBounds.width;\n\n if (immediately) {\n this.panTo(center, true);\n this.zoomTo(newZoom, null, true);\n if(constraints){\n this.applyConstraints(true);\n }\n return this;\n }\n\n var currentCenter = this.getCenter(true);\n var currentZoom = this.getZoom(true);\n this.panTo(currentCenter, true);\n this.zoomTo(currentZoom, null, true);\n\n var oldBounds = this.getBounds();\n var oldZoom = this.getZoom();\n\n if (oldZoom === 0 || Math.abs(newZoom / oldZoom - 1) < 0.00000001) {\n this.zoomTo(newZoom, null, true);\n this.panTo(center, immediately);\n if(constraints){\n this.applyConstraints(false);\n }\n return this;\n }\n\n if(constraints){\n this.panTo(center, false);\n\n newZoom = this._applyZoomConstraints(newZoom);\n this.zoomTo(newZoom, null, false);\n\n var constrainedBounds = this.getConstrainedBounds();\n\n this.panTo(currentCenter, true);\n this.zoomTo(currentZoom, null, true);\n\n this.fitBounds(constrainedBounds);\n } else {\n var rotatedNewBounds = newBounds.rotate(-this.getRotation());\n var referencePoint = rotatedNewBounds.getTopLeft().times(newZoom)\n .minus(oldBounds.getTopLeft().times(oldZoom))\n .divide(newZoom - oldZoom);\n\n this.zoomTo(newZoom, referencePoint, immediately);\n }\n return this;\n },\n\n /**\n * Makes the viewport zoom and pan so that the specified bounds take\n * as much space as possible in the viewport.\n * Note: this method ignores the constraints (minZoom, maxZoom and\n * visibilityRatio).\n * Use {@link OpenSeadragon.Viewport#fitBoundsWithConstraints} to enforce\n * them.\n * @function\n * @param {OpenSeadragon.Rect} bounds\n * @param {Boolean} [immediately=false]\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n fitBounds: function(bounds, immediately) {\n return this._fitBounds(bounds, {\n immediately: immediately,\n constraints: false\n });\n },\n\n /**\n * Makes the viewport zoom and pan so that the specified bounds take\n * as much space as possible in the viewport while enforcing the constraints\n * (minZoom, maxZoom and visibilityRatio).\n * Note: because this method enforces the constraints, part of the\n * provided bounds may end up outside of the viewport.\n * Use {@link OpenSeadragon.Viewport#fitBounds} to ignore them.\n * @function\n * @param {OpenSeadragon.Rect} bounds\n * @param {Boolean} [immediately=false]\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n fitBoundsWithConstraints: function(bounds, immediately) {\n return this._fitBounds(bounds, {\n immediately: immediately,\n constraints: true\n });\n },\n\n /**\n * Zooms so the image just fills the viewer vertically.\n * @param {Boolean} immediately\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n fitVertically: function(immediately) {\n var box = new $.Rect(\n this._contentBounds.x + (this._contentBounds.width / 2),\n this._contentBounds.y,\n 0,\n this._contentBounds.height);\n return this.fitBounds(box, immediately);\n },\n\n /**\n * Zooms so the image just fills the viewer horizontally.\n * @param {Boolean} immediately\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n fitHorizontally: function(immediately) {\n var box = new $.Rect(\n this._contentBounds.x,\n this._contentBounds.y + (this._contentBounds.height / 2),\n this._contentBounds.width,\n 0);\n return this.fitBounds(box, immediately);\n },\n\n\n /**\n * Returns bounds taking constraints into account\n * Added to improve constrained panning\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The bounds in viewport coordinates after applying constraints. The returned $.Rect\n * contains additional properties constraintsApplied, xConstrained and yConstrained.\n * These flags indicate whether the viewport bounds were modified by the constraints\n * of the viewer rectangle, and in which dimension(s).\n */\n getConstrainedBounds: function(current) {\n var bounds,\n constrainedBounds;\n\n bounds = this.getBounds(current);\n\n constrainedBounds = this._applyBoundaryConstraints(bounds);\n\n return constrainedBounds;\n },\n\n /**\n * @function\n * @param {OpenSeadragon.Point} delta\n * @param {Boolean} immediately\n * @returns {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:pan\n */\n panBy: function( delta, immediately ) {\n var center = new $.Point(\n this.centerSpringX.target.value,\n this.centerSpringY.target.value\n );\n return this.panTo( center.plus( delta ), immediately );\n },\n\n /**\n * @function\n * @param {OpenSeadragon.Point} center\n * @param {Boolean} immediately\n * @returns {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:pan\n */\n panTo: function( center, immediately ) {\n if ( immediately ) {\n this.centerSpringX.resetTo( center.x );\n this.centerSpringY.resetTo( center.y );\n } else {\n this.centerSpringX.springTo( center.x );\n this.centerSpringY.springTo( center.y );\n }\n\n if( this.viewer ){\n /**\n * Raised when the viewport is panned (see {@link OpenSeadragon.Viewport#panBy} and {@link OpenSeadragon.Viewport#panTo}).\n *\n * @event pan\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} center\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'pan', {\n center: center,\n immediately: immediately\n });\n }\n\n return this;\n },\n\n /**\n * @function\n * @returns {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:zoom\n */\n zoomBy: function(factor, refPoint, immediately) {\n return this.zoomTo(\n this.zoomSpring.target.value * factor, refPoint, immediately);\n },\n\n /**\n * Zooms to the specified zoom level\n * @function\n * @param {Number} zoom The zoom level to zoom to.\n * @param {OpenSeadragon.Point} [refPoint] The point which will stay at\n * the same screen location. Defaults to the viewport center.\n * @param {Boolean} [immediately=false]\n * @returns {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:zoom\n */\n zoomTo: function(zoom, refPoint, immediately) {\n var _this = this;\n\n this.zoomPoint = refPoint instanceof $.Point &&\n !isNaN(refPoint.x) &&\n !isNaN(refPoint.y) ?\n refPoint :\n null;\n\n if (immediately) {\n this._adjustCenterSpringsForZoomPoint(function() {\n _this.zoomSpring.resetTo(zoom);\n });\n } else {\n this.zoomSpring.springTo(zoom);\n }\n\n if (this.viewer) {\n /**\n * Raised when the viewport zoom level changes (see {@link OpenSeadragon.Viewport#zoomBy} and {@link OpenSeadragon.Viewport#zoomTo}).\n *\n * @event zoom\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Number} zoom\n * @property {OpenSeadragon.Point} refPoint\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('zoom', {\n zoom: zoom,\n refPoint: refPoint,\n immediately: immediately\n });\n }\n\n return this;\n },\n\n /**\n * Rotates this viewport to the angle specified.\n * @function\n * @param {Number} degrees The degrees to set the rotation to.\n * @param {Boolean} [immediately=false] Whether to animate to the new angle\n * or rotate immediately.\n * * @returns {OpenSeadragon.Viewport} Chainable.\n */\n setRotation: function(degrees, immediately) {\n return this.rotateTo(degrees, null, immediately);\n },\n\n /**\n * Gets the current rotation in degrees.\n * @function\n * @param {Boolean} [current=false] True for current rotation, false for target.\n * @returns {Number} The current rotation in degrees.\n */\n getRotation: function(current) {\n return current ?\n this.degreesSpring.current.value :\n this.degreesSpring.target.value;\n },\n\n /**\n * Rotates this viewport to the angle specified around a pivot point. Alias for rotateTo.\n * @function\n * @param {Number} degrees The degrees to set the rotation to.\n * @param {OpenSeadragon.Point} [pivot] (Optional) point in viewport coordinates\n * around which the rotation should be performed. Defaults to the center of the viewport.\n * @param {Boolean} [immediately=false] Whether to animate to the new angle\n * or rotate immediately.\n * * @returns {OpenSeadragon.Viewport} Chainable.\n */\n setRotationWithPivot: function(degrees, pivot, immediately) {\n return this.rotateTo(degrees, pivot, immediately);\n },\n\n /**\n * Rotates this viewport to the angle specified.\n * @function\n * @param {Number} degrees The degrees to set the rotation to.\n * @param {OpenSeadragon.Point} [pivot] (Optional) point in viewport coordinates\n * around which the rotation should be performed. Defaults to the center of the viewport.\n * @param {Boolean} [immediately=false] Whether to animate to the new angle\n * or rotate immediately.\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n rotateTo: function(degrees, pivot, immediately){\n if (!this.viewer || !this.viewer.drawer.canRotate()) {\n return this;\n }\n\n if (this.degreesSpring.target.value === degrees &&\n this.degreesSpring.isAtTargetValue()) {\n return this;\n }\n this.rotationPivot = pivot instanceof $.Point &&\n !isNaN(pivot.x) &&\n !isNaN(pivot.y) ?\n pivot :\n null;\n if (immediately) {\n if(this.rotationPivot){\n var changeInDegrees = degrees - this._oldDegrees;\n if(!changeInDegrees){\n this.rotationPivot = null;\n return this;\n }\n this._rotateAboutPivot(degrees);\n } else{\n this.degreesSpring.resetTo(degrees);\n }\n } else {\n var normalizedFrom = $.positiveModulo(this.degreesSpring.current.value, 360);\n var normalizedTo = $.positiveModulo(degrees, 360);\n var diff = normalizedTo - normalizedFrom;\n if (diff > 180) {\n normalizedTo -= 360;\n } else if (diff < -180) {\n normalizedTo += 360;\n }\n\n var reverseDiff = normalizedFrom - normalizedTo;\n this.degreesSpring.resetTo(degrees + reverseDiff);\n this.degreesSpring.springTo(degrees);\n }\n\n this._setContentBounds(\n this.viewer.world.getHomeBounds(),\n this.viewer.world.getContentFactor());\n this.viewer.forceRedraw();\n\n /**\n * Raised when rotation has been changed.\n *\n * @event rotate\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Number} degrees - The number of degrees the rotation was set to.\n * @property {Boolean} immediately - Whether the rotation happened immediately or was animated\n * @property {OpenSeadragon.Point} pivot - The point in viewport coordinates around which the rotation (if any) happened\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('rotate', {degrees: degrees, immediately: !!immediately, pivot: this.rotationPivot || this.getCenter()});\n return this;\n },\n\n /**\n * Rotates this viewport by the angle specified.\n * @function\n * @param {Number} degrees The degrees by which to rotate the viewport.\n * @param {OpenSeadragon.Point} [pivot] (Optional) point in viewport coordinates\n * around which the rotation should be performed. Defaults to the center of the viewport.\n * * @param {Boolean} [immediately=false] Whether to animate to the new angle\n * or rotate immediately.\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n rotateBy: function(degrees, pivot, immediately){\n return this.rotateTo(this.degreesSpring.target.value + degrees, pivot, immediately);\n },\n\n /**\n * @function\n * @returns {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:resize\n */\n resize: function( newContainerSize, maintain ) {\n var oldBounds = this.getBoundsNoRotate(),\n newBounds = oldBounds,\n widthDeltaFactor;\n\n this.containerSize.x = newContainerSize.x;\n this.containerSize.y = newContainerSize.y;\n\n this._updateContainerInnerSize();\n\n if ( maintain ) {\n // TODO: widthDeltaFactor will always be 1; probably not what's intended\n widthDeltaFactor = newContainerSize.x / this.containerSize.x;\n newBounds.width = oldBounds.width * widthDeltaFactor;\n newBounds.height = newBounds.width / this.getAspectRatio();\n }\n\n if( this.viewer ){\n /**\n * Raised when a viewer resize operation is initiated (see {@link OpenSeadragon.Viewport#resize}).\n * This event happens before the viewport bounds have been updated.\n * See also {@link OpenSeadragon.Viewer#after-resize} which reflects\n * the new viewport bounds following the resize action.\n *\n * @event resize\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} newContainerSize\n * @property {Boolean} maintain\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'resize', {\n newContainerSize: newContainerSize,\n maintain: maintain\n });\n }\n\n var output = this.fitBounds( newBounds, true );\n\n if( this.viewer ){\n /**\n * Raised after the viewer is resized (see {@link OpenSeadragon.Viewport#resize}).\n * See also {@link OpenSeadragon.Viewer#resize} event which happens\n * before the new bounds have been calculated and applied.\n *\n * @event after-resize\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} newContainerSize\n * @property {Boolean} maintain\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'after-resize', {\n newContainerSize: newContainerSize,\n maintain: maintain\n });\n }\n\n return output;\n },\n\n // private\n _updateContainerInnerSize: function() {\n this._containerInnerSize = new $.Point(\n Math.max(1, this.containerSize.x - (this._margins.left + this._margins.right)),\n Math.max(1, this.containerSize.y - (this._margins.top + this._margins.bottom))\n );\n },\n\n /**\n * Update the zoom, degrees, and center (X and Y) springs.\n * @function\n * @returns {Boolean} True if any change has been made, false otherwise.\n */\n update: function() {\n var _this = this;\n this._adjustCenterSpringsForZoomPoint(function() {\n _this.zoomSpring.update();\n });\n if(this.degreesSpring.isAtTargetValue()){\n this.rotationPivot = null;\n }\n this.centerSpringX.update();\n this.centerSpringY.update();\n\n if(this.rotationPivot){\n this._rotateAboutPivot(true);\n }\n else{\n this.degreesSpring.update();\n }\n\n\n var changed = this.centerSpringX.current.value !== this._oldCenterX ||\n this.centerSpringY.current.value !== this._oldCenterY ||\n this.zoomSpring.current.value !== this._oldZoom ||\n this.degreesSpring.current.value !== this._oldDegrees;\n\n\n this._oldCenterX = this.centerSpringX.current.value;\n this._oldCenterY = this.centerSpringY.current.value;\n this._oldZoom = this.zoomSpring.current.value;\n this._oldDegrees = this.degreesSpring.current.value;\n\n return changed;\n },\n\n // private - pass true to use spring, or a number for degrees for immediate rotation\n _rotateAboutPivot: function(degreesOrUseSpring){\n var useSpring = degreesOrUseSpring === true;\n\n var delta = this.rotationPivot.minus(this.getCenter());\n this.centerSpringX.shiftBy(delta.x);\n this.centerSpringY.shiftBy(delta.y);\n\n if(useSpring){\n this.degreesSpring.update();\n } else {\n this.degreesSpring.resetTo(degreesOrUseSpring);\n }\n\n var changeInDegrees = this.degreesSpring.current.value - this._oldDegrees;\n var rdelta = delta.rotate(changeInDegrees * -1).times(-1);\n this.centerSpringX.shiftBy(rdelta.x);\n this.centerSpringY.shiftBy(rdelta.y);\n },\n\n // private\n _adjustCenterSpringsForZoomPoint: function(zoomSpringHandler) {\n if (this.zoomPoint) {\n var oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n zoomSpringHandler();\n var newZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n\n var deltaZoomPixels = newZoomPixel.minus(oldZoomPixel);\n var deltaZoomPoints = this.deltaPointsFromPixels(\n deltaZoomPixels, true);\n\n this.centerSpringX.shiftBy(deltaZoomPoints.x);\n this.centerSpringY.shiftBy(deltaZoomPoints.y);\n\n if (this.zoomSpring.isAtTargetValue()) {\n this.zoomPoint = null;\n }\n } else {\n zoomSpringHandler();\n }\n },\n\n /**\n * Convert a delta (translation vector) from viewport coordinates to pixels\n * coordinates. This method does not take rotation into account.\n * Consider using deltaPixelsFromPoints if you need to account for rotation.\n * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPixelsFromPointsNoRotate: function(deltaPoints, current) {\n return deltaPoints.times(\n this._containerInnerSize.x * this.getZoom(current)\n );\n },\n\n /**\n * Convert a delta (translation vector) from viewport coordinates to pixels\n * coordinates.\n * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPixelsFromPoints: function(deltaPoints, current) {\n return this.deltaPixelsFromPointsNoRotate(\n deltaPoints.rotate(this.getRotation(current)),\n current);\n },\n\n /**\n * Convert a delta (translation vector) from pixels coordinates to viewport\n * coordinates. This method does not take rotation into account.\n * Consider using deltaPointsFromPixels if you need to account for rotation.\n * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPointsFromPixelsNoRotate: function(deltaPixels, current) {\n return deltaPixels.divide(\n this._containerInnerSize.x * this.getZoom(current)\n );\n },\n\n /**\n * Convert a delta (translation vector) from pixels coordinates to viewport\n * coordinates.\n * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPointsFromPixels: function(deltaPixels, current) {\n return this.deltaPointsFromPixelsNoRotate(deltaPixels, current)\n .rotate(-this.getRotation(current));\n },\n\n /**\n * Convert viewport coordinates to pixels coordinates.\n * This method does not take rotation into account.\n * Consider using pixelFromPoint if you need to account for rotation.\n * @param {OpenSeadragon.Point} point the viewport coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pixelFromPointNoRotate: function(point, current) {\n return this._pixelFromPointNoRotate(\n point, this.getBoundsNoRotate(current));\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates.\n * @param {OpenSeadragon.Point} point the viewport coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pixelFromPoint: function(point, current) {\n return this._pixelFromPoint(point, this.getBoundsNoRotate(current));\n },\n\n // private\n _pixelFromPointNoRotate: function(point, bounds) {\n return point.minus(\n bounds.getTopLeft()\n ).times(\n this._containerInnerSize.x / bounds.width\n ).plus(\n new $.Point(this._margins.left, this._margins.top)\n );\n },\n\n // private\n _pixelFromPoint: function(point, bounds) {\n return this._pixelFromPointNoRotate(\n point.rotate(this.getRotation(true), this.getCenter(true)),\n bounds);\n },\n\n /**\n * Convert pixel coordinates to viewport coordinates.\n * This method does not take rotation into account.\n * Consider using pointFromPixel if you need to account for rotation.\n * @param {OpenSeadragon.Point} pixel Pixel coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pointFromPixelNoRotate: function(pixel, current) {\n var bounds = this.getBoundsNoRotate(current);\n return pixel.minus(\n new $.Point(this._margins.left, this._margins.top)\n ).divide(\n this._containerInnerSize.x / bounds.width\n ).plus(\n bounds.getTopLeft()\n );\n },\n\n /**\n * Convert pixel coordinates to viewport coordinates.\n * @param {OpenSeadragon.Point} pixel Pixel coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pointFromPixel: function(pixel, current) {\n return this.pointFromPixelNoRotate(pixel, current).rotate(\n -this.getRotation(current),\n this.getCenter(current)\n );\n },\n\n // private\n _viewportToImageDelta: function( viewerX, viewerY ) {\n var scale = this._contentBoundsNoRotate.width;\n return new $.Point(\n viewerX * this._contentSizeNoRotate.x / scale,\n viewerY * this._contentSizeNoRotate.x / scale);\n },\n\n /**\n * Translates from OpenSeadragon viewer coordinate system to image coordinate system.\n * This method can be called either by passing X,Y coordinates or an\n * OpenSeadragon.Point\n * Note: not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.\n * @function\n * @param {(OpenSeadragon.Point|Number)} viewerX either a point or the X\n * coordinate in viewport coordinate system.\n * @param {Number} [viewerY] Y coordinate in viewport coordinate system.\n * @returns {OpenSeadragon.Point} a point representing the coordinates in the image.\n */\n viewportToImageCoordinates: function(viewerX, viewerY) {\n if (viewerX instanceof $.Point) {\n //they passed a point instead of individual components\n return this.viewportToImageCoordinates(viewerX.x, viewerX.y);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n if (!this.silenceMultiImageWarnings) {\n $.console.error('[Viewport.viewportToImageCoordinates] is not accurate ' +\n 'with multi-image; use TiledImage.viewportToImageCoordinates instead.');\n }\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageCoordinates(viewerX, viewerY, true);\n }\n }\n\n return this._viewportToImageDelta(\n viewerX - this._contentBoundsNoRotate.x,\n viewerY - this._contentBoundsNoRotate.y);\n },\n\n // private\n _imageToViewportDelta: function( imageX, imageY ) {\n var scale = this._contentBoundsNoRotate.width;\n return new $.Point(\n imageX / this._contentSizeNoRotate.x * scale,\n imageY / this._contentSizeNoRotate.x * scale);\n },\n\n /**\n * Translates from image coordinate system to OpenSeadragon viewer coordinate system\n * This method can be called either by passing X,Y coordinates or an\n * OpenSeadragon.Point\n * Note: not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.\n * @function\n * @param {(OpenSeadragon.Point | Number)} imageX the point or the\n * X coordinate in image coordinate system.\n * @param {Number} [imageY] Y coordinate in image coordinate system.\n * @returns {OpenSeadragon.Point} a point representing the coordinates in the viewport.\n */\n imageToViewportCoordinates: function(imageX, imageY) {\n if (imageX instanceof $.Point) {\n //they passed a point instead of individual components\n return this.imageToViewportCoordinates(imageX.x, imageX.y);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n if (!this.silenceMultiImageWarnings) {\n $.console.error('[Viewport.imageToViewportCoordinates] is not accurate ' +\n 'with multi-image; use TiledImage.imageToViewportCoordinates instead.');\n }\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportCoordinates(imageX, imageY, true);\n }\n }\n\n var point = this._imageToViewportDelta(imageX, imageY);\n point.x += this._contentBoundsNoRotate.x;\n point.y += this._contentBoundsNoRotate.y;\n return point;\n },\n\n /**\n * Translates from a rectangle which describes a portion of the image in\n * pixel coordinates to OpenSeadragon viewport rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an\n * OpenSeadragon.Rect\n * Note: not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.\n * @function\n * @param {(OpenSeadragon.Rect | Number)} imageX the rectangle or the X\n * coordinate of the top left corner of the rectangle in image coordinate system.\n * @param {Number} [imageY] the Y coordinate of the top left corner of the rectangle\n * in image coordinate system.\n * @param {Number} [pixelWidth] the width in pixel of the rectangle.\n * @param {Number} [pixelHeight] the height in pixel of the rectangle.\n * @returns {OpenSeadragon.Rect} This image's bounds in viewport coordinates\n */\n imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight) {\n var rect = imageX;\n if (!(rect instanceof $.Rect)) {\n //they passed individual components instead of a rectangle\n rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n if (!this.silenceMultiImageWarnings) {\n $.console.error('[Viewport.imageToViewportRectangle] is not accurate ' +\n 'with multi-image; use TiledImage.imageToViewportRectangle instead.');\n }\n } else if (count === 1) {\n // It is better to use TiledImage.imageToViewportRectangle\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportRectangle(\n imageX, imageY, pixelWidth, pixelHeight, true);\n }\n }\n\n var coordA = this.imageToViewportCoordinates(rect.x, rect.y);\n var coordB = this._imageToViewportDelta(rect.width, rect.height);\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees\n );\n },\n\n /**\n * Translates from a rectangle which describes a portion of\n * the viewport in point coordinates to image rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an\n * OpenSeadragon.Rect\n * Note: not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.\n * @function\n * @param {(OpenSeadragon.Rect | Number)} viewerX either a rectangle or\n * the X coordinate of the top left corner of the rectangle in viewport\n * coordinate system.\n * @param {Number} [viewerY] the Y coordinate of the top left corner of the rectangle\n * in viewport coordinate system.\n * @param {Number} [pointWidth] the width of the rectangle in viewport coordinate system.\n * @param {Number} [pointHeight] the height of the rectangle in viewport coordinate system.\n */\n viewportToImageRectangle: function(viewerX, viewerY, pointWidth, pointHeight) {\n var rect = viewerX;\n if (!(rect instanceof $.Rect)) {\n //they passed individual components instead of a rectangle\n rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n if (!this.silenceMultiImageWarnings) {\n $.console.error('[Viewport.viewportToImageRectangle] is not accurate ' +\n 'with multi-image; use TiledImage.viewportToImageRectangle instead.');\n }\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageRectangle(\n viewerX, viewerY, pointWidth, pointHeight, true);\n }\n }\n\n var coordA = this.viewportToImageCoordinates(rect.x, rect.y);\n var coordB = this._viewportToImageDelta(rect.width, rect.height);\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees\n );\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to image\n * coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToImageCoordinates: function( pixel ) {\n var point = this.pointFromPixel( pixel, true );\n return this.viewportToImageCoordinates( point );\n },\n\n /**\n * Convert pixel coordinates relative to the image to\n * viewer element coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToViewerElementCoordinates: function( pixel ) {\n var point = this.imageToViewportCoordinates( pixel );\n return this.pixelFromPoint( point, true );\n },\n\n /**\n * Convert pixel coordinates relative to the window to image coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToImageCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.windowToImageCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = pixel.minus(\n $.getElementPosition(this.viewer.element));\n return this.viewerElementToImageCoordinates(viewerCoordinates);\n },\n\n /**\n * Convert image coordinates to pixel coordinates relative to the window.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToWindowCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.imageToWindowCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = this.imageToViewerElementCoordinates(pixel);\n return viewerCoordinates.plus(\n $.getElementPosition(this.viewer.element));\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to viewport\n * coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToViewportCoordinates: function( pixel ) {\n return this.pointFromPixel( pixel, true );\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates relative to the\n * viewer element.\n * @param {OpenSeadragon.Point} point\n * @returns {OpenSeadragon.Point}\n */\n viewportToViewerElementCoordinates: function( point ) {\n return this.pixelFromPoint( point, true );\n },\n\n /**\n * Convert a rectangle in pixel coordinates relative to the viewer element\n * to viewport coordinates.\n * @param {OpenSeadragon.Rect} rectangle the rectangle to convert\n * @returns {OpenSeadragon.Rect} the converted rectangle\n */\n viewerElementToViewportRectangle: function(rectangle) {\n return $.Rect.fromSummits(\n this.pointFromPixel(rectangle.getTopLeft(), true),\n this.pointFromPixel(rectangle.getTopRight(), true),\n this.pointFromPixel(rectangle.getBottomLeft(), true)\n );\n },\n\n /**\n * Convert a rectangle in viewport coordinates to pixel coordinates relative\n * to the viewer element.\n * @param {OpenSeadragon.Rect} rectangle the rectangle to convert\n * @returns {OpenSeadragon.Rect} the converted rectangle\n */\n viewportToViewerElementRectangle: function(rectangle) {\n return $.Rect.fromSummits(\n this.pixelFromPoint(rectangle.getTopLeft(), true),\n this.pixelFromPoint(rectangle.getTopRight(), true),\n this.pixelFromPoint(rectangle.getBottomLeft(), true)\n );\n },\n\n /**\n * Convert pixel coordinates relative to the window to viewport coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToViewportCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.windowToViewportCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = pixel.minus(\n $.getElementPosition(this.viewer.element));\n return this.viewerElementToViewportCoordinates(viewerCoordinates);\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates relative to the window.\n * @param {OpenSeadragon.Point} point\n * @returns {OpenSeadragon.Point}\n */\n viewportToWindowCoordinates: function(point) {\n $.console.assert(this.viewer,\n \"[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = this.viewportToViewerElementCoordinates(point);\n return viewerCoordinates.plus(\n $.getElementPosition(this.viewer.element));\n },\n\n /**\n * Convert a viewport zoom to an image zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} viewportZoom The viewport zoom\n * target zoom.\n * @returns {Number} imageZoom The image zoom\n */\n viewportToImageZoom: function(viewportZoom) {\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n if (!this.silenceMultiImageWarnings) {\n $.console.error('[Viewport.viewportToImageZoom] is not ' +\n 'accurate with multi-image.');\n }\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageZoom\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageZoom(viewportZoom);\n }\n }\n\n var imageWidth = this._contentSizeNoRotate.x;\n var containerWidth = this._containerInnerSize.x;\n var scale = this._contentBoundsNoRotate.width;\n var viewportToImageZoomRatio = (containerWidth / imageWidth) * scale;\n return viewportZoom * viewportToImageZoomRatio;\n },\n\n /**\n * Convert an image zoom to a viewport zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} imageZoom The image zoom\n * target zoom.\n * @returns {Number} viewportZoom The viewport zoom\n */\n imageToViewportZoom: function(imageZoom) {\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n if (!this.silenceMultiImageWarnings) {\n $.console.error('[Viewport.imageToViewportZoom] is not accurate ' +\n 'with multi-image.');\n }\n } else if (count === 1) {\n // It is better to use TiledImage.imageToViewportZoom\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportZoom(imageZoom);\n }\n }\n\n var imageWidth = this._contentSizeNoRotate.x;\n var containerWidth = this._containerInnerSize.x;\n var scale = this._contentBoundsNoRotate.width;\n var viewportToImageZoomRatio = (imageWidth / containerWidth) / scale;\n return imageZoom * viewportToImageZoomRatio;\n },\n\n /**\n * Toggles flip state and demands a new drawing on navigator and viewer objects.\n * @function\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n toggleFlip: function() {\n this.setFlip(!this.getFlip());\n return this;\n },\n\n /**\n * Get flip state stored on viewport.\n * @function\n * @returns {Boolean} Flip state.\n */\n getFlip: function() {\n return this.flipped;\n },\n\n /**\n * Sets flip state according to the state input argument.\n * @function\n * @param {Boolean} state - Flip state to set.\n * @returns {OpenSeadragon.Viewport} Chainable.\n */\n setFlip: function( state ) {\n if ( this.flipped === state ) {\n return this;\n }\n\n this.flipped = state;\n if(this.viewer.navigator){\n this.viewer.navigator.setFlip(this.getFlip());\n }\n this.viewer.forceRedraw();\n\n /**\n * Raised when flip state has been changed.\n *\n * @event flip\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Number} flipped - The flip state after this change.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('flip', {flipped: state});\n return this;\n }\n\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TiledImage\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * You shouldn't have to create a TiledImage instance directly; get it asynchronously by\n * using {@link OpenSeadragon.Viewer#open} or {@link OpenSeadragon.Viewer#addTiledImage} instead.\n * @class TiledImage\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.\n * A new instance is created for each TileSource opened.\n * @param {Object} options - Configuration for this TiledImage.\n * @param {OpenSeadragon.TileSource} options.source - The TileSource that defines this TiledImage.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this TiledImage.\n * @param {OpenSeadragon.TileCache} options.tileCache - The TileCache for this TiledImage to use.\n * @param {OpenSeadragon.Drawer} options.drawer - The Drawer for this TiledImage to draw onto.\n * @param {OpenSeadragon.ImageLoader} options.imageLoader - The ImageLoader for this TiledImage to use.\n * @param {Number} [options.x=0] - Left position, in viewport coordinates.\n * @param {Number} [options.y=0] - Top position, in viewport coordinates.\n * @param {Number} [options.width=1] - Width, in viewport coordinates.\n * @param {Number} [options.height] - Height, in viewport coordinates.\n * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates\n * to fit the image into. If specified, x, y, width and height get ignored.\n * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds if options.fitBounds is set.\n * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @param {Number} [options.springStiffness] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.animationTime] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomImageRatio] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapHorizontal] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapVertical] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.immediateRender] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.blendTime] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.alwaysBlend] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.minPixelRatio] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.smoothTileEdgesMinZoom] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.iOSDevice] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.opacity=1] - Set to draw at proportional opacity. If zero, images will not draw.\n * @param {Boolean} [options.preload=false] - Set true to load even when the image is hidden by zero opacity.\n * @param {String} [options.compositeOperation] - How the image is composited onto other images; see compositeOperation in {@link OpenSeadragon.Options} for possible\n values.\n * @param {Boolean} [options.debugMode] - See {@link OpenSeadragon.Options}.\n * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.\n * @param {String|Boolean} [options.crossOriginPolicy] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.ajaxWithCredentials] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.loadTilesWithAjax]\n * Whether to load tile data using AJAX requests.\n * Defaults to the setting in {@link OpenSeadragon.Options}.\n * @param {Object} [options.ajaxHeaders={}]\n * A set of headers to include when making tile AJAX requests.\n */\n$.TiledImage = function( options ) {\n var _this = this;\n /**\n * The {@link OpenSeadragon.TileSource} that defines this TiledImage.\n * @member {OpenSeadragon.TileSource} source\n * @memberof OpenSeadragon.TiledImage#\n */\n $.console.assert( options.tileCache, \"[TiledImage] options.tileCache is required\" );\n $.console.assert( options.drawer, \"[TiledImage] options.drawer is required\" );\n $.console.assert( options.viewer, \"[TiledImage] options.viewer is required\" );\n $.console.assert( options.imageLoader, \"[TiledImage] options.imageLoader is required\" );\n $.console.assert( options.source, \"[TiledImage] options.source is required\" );\n $.console.assert(!options.clip || options.clip instanceof $.Rect,\n \"[TiledImage] options.clip must be an OpenSeadragon.Rect if present\");\n\n $.EventSource.call( this );\n\n this._tileCache = options.tileCache;\n delete options.tileCache;\n\n this._drawer = options.drawer;\n delete options.drawer;\n\n this._imageLoader = options.imageLoader;\n delete options.imageLoader;\n\n if (options.clip instanceof $.Rect) {\n this._clip = options.clip.clone();\n }\n\n delete options.clip;\n\n var x = options.x || 0;\n delete options.x;\n var y = options.y || 0;\n delete options.y;\n\n // Ratio of zoomable image height to width.\n this.normHeight = options.source.dimensions.y / options.source.dimensions.x;\n this.contentAspectX = options.source.dimensions.x / options.source.dimensions.y;\n\n var scale = 1;\n if ( options.width ) {\n scale = options.width;\n delete options.width;\n\n if ( options.height ) {\n $.console.error( \"specifying both width and height to a tiledImage is not supported\" );\n delete options.height;\n }\n } else if ( options.height ) {\n scale = options.height / this.normHeight;\n delete options.height;\n }\n\n var fitBounds = options.fitBounds;\n delete options.fitBounds;\n var fitBoundsPlacement = options.fitBoundsPlacement || OpenSeadragon.Placement.CENTER;\n delete options.fitBoundsPlacement;\n\n var degrees = options.degrees || 0;\n delete options.degrees;\n\n var ajaxHeaders = options.ajaxHeaders;\n delete options.ajaxHeaders;\n\n $.extend( true, this, {\n\n //internal state properties\n viewer: null,\n tilesMatrix: {}, // A '3d' dictionary [level][x][y] --> Tile.\n coverage: {}, // A '3d' dictionary [level][x][y] --> Boolean; shows what areas have been drawn.\n loadingCoverage: {}, // A '3d' dictionary [level][x][y] --> Boolean; shows what areas are loaded or are being loaded/blended.\n lastDrawn: [], // An unordered list of Tiles drawn last frame.\n lastResetTime: 0, // Last time for which the tiledImage was reset.\n _midDraw: false, // Is the tiledImage currently updating the viewport?\n _needsDraw: true, // Does the tiledImage need to update the viewport again?\n _hasOpaqueTile: false, // Do we have even one fully opaque tile?\n _tilesLoading: 0, // The number of pending tile requests.\n //configurable settings\n springStiffness: $.DEFAULT_SETTINGS.springStiffness,\n animationTime: $.DEFAULT_SETTINGS.animationTime,\n minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio,\n wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal,\n wrapVertical: $.DEFAULT_SETTINGS.wrapVertical,\n immediateRender: $.DEFAULT_SETTINGS.immediateRender,\n blendTime: $.DEFAULT_SETTINGS.blendTime,\n alwaysBlend: $.DEFAULT_SETTINGS.alwaysBlend,\n minPixelRatio: $.DEFAULT_SETTINGS.minPixelRatio,\n smoothTileEdgesMinZoom: $.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,\n iOSDevice: $.DEFAULT_SETTINGS.iOSDevice,\n debugMode: $.DEFAULT_SETTINGS.debugMode,\n crossOriginPolicy: $.DEFAULT_SETTINGS.crossOriginPolicy,\n ajaxWithCredentials: $.DEFAULT_SETTINGS.ajaxWithCredentials,\n placeholderFillStyle: $.DEFAULT_SETTINGS.placeholderFillStyle,\n opacity: $.DEFAULT_SETTINGS.opacity,\n preload: $.DEFAULT_SETTINGS.preload,\n compositeOperation: $.DEFAULT_SETTINGS.compositeOperation,\n subPixelRoundingForTransparency: $.DEFAULT_SETTINGS.subPixelRoundingForTransparency\n }, options );\n\n this._preload = this.preload;\n delete this.preload;\n\n this._fullyLoaded = false;\n\n this._xSpring = new $.Spring({\n initial: x,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._ySpring = new $.Spring({\n initial: y,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._scaleSpring = new $.Spring({\n initial: scale,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._degreesSpring = new $.Spring({\n initial: degrees,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._updateForScale();\n\n if (fitBounds) {\n this.fitBounds(fitBounds, fitBoundsPlacement, true);\n }\n\n // We need a callback to give image manipulation a chance to happen\n this._drawingHandler = function(args) {\n /**\n * This event is fired just before the tile is drawn giving the application a chance to alter the image.\n *\n * NOTE: This event is only fired when the drawer is using a <canvas>.\n *\n * @event tile-drawing\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.Tile} tile - The Tile being drawn.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} context - The HTML canvas context being drawn into.\n * @property {OpenSeadragon.Tile} rendered - The HTML canvas context containing the tile imagery.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.viewer.raiseEvent('tile-drawing', $.extend({\n tiledImage: _this\n }, args));\n };\n\n this._ownAjaxHeaders = {};\n this.setAjaxHeaders(ajaxHeaders, false);\n};\n\n$.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.TiledImage.prototype */{\n /**\n * @returns {Boolean} Whether the TiledImage needs to be drawn.\n */\n needsDraw: function() {\n return this._needsDraw;\n },\n\n /**\n * @returns {Boolean} Whether all tiles necessary for this TiledImage to draw at the current view have been loaded.\n */\n getFullyLoaded: function() {\n return this._fullyLoaded;\n },\n\n // private\n _setFullyLoaded: function(flag) {\n if (flag === this._fullyLoaded) {\n return;\n }\n\n this._fullyLoaded = flag;\n\n /**\n * Fired when the TiledImage's \"fully loaded\" flag (whether all tiles necessary for this TiledImage\n * to draw at the current view have been loaded) changes.\n *\n * @event fully-loaded-change\n * @memberof OpenSeadragon.TiledImage\n * @type {object}\n * @property {Boolean} fullyLoaded - The new \"fully loaded\" value.\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('fully-loaded-change', {\n fullyLoaded: this._fullyLoaded\n });\n },\n\n /**\n * Clears all tiles and triggers an update on the next call to\n * {@link OpenSeadragon.TiledImage#update}.\n */\n reset: function() {\n this._tileCache.clearTilesFor(this);\n this.lastResetTime = $.now();\n this._needsDraw = true;\n },\n\n /**\n * Updates the TiledImage's bounds, animating if needed.\n * @returns {Boolean} Whether the TiledImage animated.\n */\n update: function() {\n var xUpdated = this._xSpring.update();\n var yUpdated = this._ySpring.update();\n var scaleUpdated = this._scaleSpring.update();\n var degreesUpdated = this._degreesSpring.update();\n\n if (xUpdated || yUpdated || scaleUpdated || degreesUpdated) {\n this._updateForScale();\n this._needsDraw = true;\n return true;\n }\n\n return false;\n },\n\n /**\n * Draws the TiledImage to its Drawer.\n */\n draw: function() {\n if (this.opacity !== 0 || this._preload) {\n this._midDraw = true;\n this._updateViewport();\n this._midDraw = false;\n }\n // Images with opacity 0 should not need to be drawn in future. this._needsDraw = false is set in this._updateViewport() for other images.\n else {\n this._needsDraw = false;\n }\n },\n\n /**\n * Destroy the TiledImage (unload current loaded tiles).\n */\n destroy: function() {\n this.reset();\n\n if (this.source.destroy) {\n this.source.destroy();\n }\n },\n\n /**\n * Get this TiledImage's bounds in viewport coordinates.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * false for target location.\n * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.\n */\n getBounds: function(current) {\n return this.getBoundsNoRotate(current)\n .rotate(this.getRotation(current), this._getRotationPoint(current));\n },\n\n /**\n * Get this TiledImage's bounds in viewport coordinates without taking\n * rotation into account.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * false for target location.\n * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.\n */\n getBoundsNoRotate: function(current) {\n return current ?\n new $.Rect(\n this._xSpring.current.value,\n this._ySpring.current.value,\n this._worldWidthCurrent,\n this._worldHeightCurrent) :\n new $.Rect(\n this._xSpring.target.value,\n this._ySpring.target.value,\n this._worldWidthTarget,\n this._worldHeightTarget);\n },\n\n // deprecated\n getWorldBounds: function() {\n $.console.error('[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead');\n return this.getBounds();\n },\n\n /**\n * Get the bounds of the displayed part of the tiled image.\n * @param {Boolean} [current=false] Pass true for the current location,\n * false for the target location.\n * @returns {$.Rect} The clipped bounds in viewport coordinates.\n */\n getClippedBounds: function(current) {\n var bounds = this.getBoundsNoRotate(current);\n if (this._clip) {\n var worldWidth = current ?\n this._worldWidthCurrent : this._worldWidthTarget;\n var ratio = worldWidth / this.source.dimensions.x;\n var clip = this._clip.times(ratio);\n bounds = new $.Rect(\n bounds.x + clip.x,\n bounds.y + clip.y,\n clip.width,\n clip.height);\n }\n return bounds.rotate(this.getRotation(current), this._getRotationPoint(current));\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @returns {OpenSeadragon.Rect} Where this tile fits (in normalized coordinates).\n */\n getTileBounds: function( level, x, y ) {\n var numTiles = this.source.getNumTiles(level);\n var xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x;\n var yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y;\n var bounds = this.source.getTileBounds(level, xMod, yMod);\n if (this.getFlip()) {\n bounds.x = 1 - bounds.x - bounds.width;\n }\n bounds.x += (x - xMod) / numTiles.x;\n bounds.y += (this._worldHeightCurrent / this._worldWidthCurrent) * ((y - yMod) / numTiles.y);\n return bounds;\n },\n\n /**\n * @returns {OpenSeadragon.Point} This TiledImage's content size, in original pixels.\n */\n getContentSize: function() {\n return new $.Point(this.source.dimensions.x, this.source.dimensions.y);\n },\n\n /**\n * @returns {OpenSeadragon.Point} The TiledImage's content size, in window coordinates.\n */\n getSizeInWindowCoordinates: function() {\n var topLeft = this.imageToWindowCoordinates(new $.Point(0, 0));\n var bottomRight = this.imageToWindowCoordinates(this.getContentSize());\n return new $.Point(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);\n },\n\n // private\n _viewportToImageDelta: function( viewerX, viewerY, current ) {\n var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);\n return new $.Point(viewerX * (this.source.dimensions.x / scale),\n viewerY * ((this.source.dimensions.y * this.contentAspectX) / scale));\n },\n\n /**\n * Translates from OpenSeadragon viewer coordinate system to image coordinate system.\n * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.\n * @param {Number|OpenSeadragon.Point} viewerX - The X coordinate or point in viewport coordinate system.\n * @param {Number} [viewerY] - The Y coordinate in viewport coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @returns {OpenSeadragon.Point} A point representing the coordinates in the image.\n */\n viewportToImageCoordinates: function(viewerX, viewerY, current) {\n var point;\n if (viewerX instanceof $.Point) {\n //they passed a point instead of individual components\n current = viewerY;\n point = viewerX;\n } else {\n point = new $.Point(viewerX, viewerY);\n }\n\n point = point.rotate(-this.getRotation(current), this._getRotationPoint(current));\n return current ?\n this._viewportToImageDelta(\n point.x - this._xSpring.current.value,\n point.y - this._ySpring.current.value) :\n this._viewportToImageDelta(\n point.x - this._xSpring.target.value,\n point.y - this._ySpring.target.value);\n },\n\n // private\n _imageToViewportDelta: function( imageX, imageY, current ) {\n var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);\n return new $.Point((imageX / this.source.dimensions.x) * scale,\n (imageY / this.source.dimensions.y / this.contentAspectX) * scale);\n },\n\n /**\n * Translates from image coordinate system to OpenSeadragon viewer coordinate system\n * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.\n * @param {Number|OpenSeadragon.Point} imageX - The X coordinate or point in image coordinate system.\n * @param {Number} [imageY] - The Y coordinate in image coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @returns {OpenSeadragon.Point} A point representing the coordinates in the viewport.\n */\n imageToViewportCoordinates: function(imageX, imageY, current) {\n if (imageX instanceof $.Point) {\n //they passed a point instead of individual components\n current = imageY;\n imageY = imageX.y;\n imageX = imageX.x;\n }\n\n var point = this._imageToViewportDelta(imageX, imageY);\n if (current) {\n point.x += this._xSpring.current.value;\n point.y += this._ySpring.current.value;\n } else {\n point.x += this._xSpring.target.value;\n point.y += this._ySpring.target.value;\n }\n\n return point.rotate(this.getRotation(current), this._getRotationPoint(current));\n },\n\n /**\n * Translates from a rectangle which describes a portion of the image in\n * pixel coordinates to OpenSeadragon viewport rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.\n * @param {Number|OpenSeadragon.Rect} imageX - The left coordinate or rectangle in image coordinate system.\n * @param {Number} [imageY] - The top coordinate in image coordinate system.\n * @param {Number} [pixelWidth] - The width in pixel of the rectangle.\n * @param {Number} [pixelHeight] - The height in pixel of the rectangle.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @returns {OpenSeadragon.Rect} A rect representing the coordinates in the viewport.\n */\n imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight, current) {\n var rect = imageX;\n if (rect instanceof $.Rect) {\n //they passed a rect instead of individual components\n current = imageY;\n } else {\n rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);\n }\n\n var coordA = this.imageToViewportCoordinates(rect.getTopLeft(), current);\n var coordB = this._imageToViewportDelta(rect.width, rect.height, current);\n\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees + this.getRotation(current)\n );\n },\n\n /**\n * Translates from a rectangle which describes a portion of\n * the viewport in point coordinates to image rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.\n * @param {Number|OpenSeadragon.Rect} viewerX - The left coordinate or rectangle in viewport coordinate system.\n * @param {Number} [viewerY] - The top coordinate in viewport coordinate system.\n * @param {Number} [pointWidth] - The width in viewport coordinate system.\n * @param {Number} [pointHeight] - The height in viewport coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @returns {OpenSeadragon.Rect} A rect representing the coordinates in the image.\n */\n viewportToImageRectangle: function( viewerX, viewerY, pointWidth, pointHeight, current ) {\n var rect = viewerX;\n if (viewerX instanceof $.Rect) {\n //they passed a rect instead of individual components\n current = viewerY;\n } else {\n rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);\n }\n\n var coordA = this.viewportToImageCoordinates(rect.getTopLeft(), current);\n var coordB = this._viewportToImageDelta(rect.width, rect.height, current);\n\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees - this.getRotation(current)\n );\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to image\n * coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToImageCoordinates: function( pixel ) {\n var point = this.viewport.pointFromPixel( pixel, true );\n return this.viewportToImageCoordinates( point );\n },\n\n /**\n * Convert pixel coordinates relative to the image to\n * viewer element coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToViewerElementCoordinates: function( pixel ) {\n var point = this.imageToViewportCoordinates( pixel );\n return this.viewport.pixelFromPoint( point, true );\n },\n\n /**\n * Convert pixel coordinates relative to the window to image coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToImageCoordinates: function( pixel ) {\n var viewerCoordinates = pixel.minus(\n OpenSeadragon.getElementPosition( this.viewer.element ));\n return this.viewerElementToImageCoordinates( viewerCoordinates );\n },\n\n /**\n * Convert image coordinates to pixel coordinates relative to the window.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToWindowCoordinates: function( pixel ) {\n var viewerCoordinates = this.imageToViewerElementCoordinates( pixel );\n return viewerCoordinates.plus(\n OpenSeadragon.getElementPosition( this.viewer.element ));\n },\n\n // private\n // Convert rectangle in viewport coordinates to this tiled image point\n // coordinates (x in [0, 1] and y in [0, aspectRatio])\n _viewportToTiledImageRectangle: function(rect) {\n var scale = this._scaleSpring.current.value;\n rect = rect.rotate(-this.getRotation(true), this._getRotationPoint(true));\n return new $.Rect(\n (rect.x - this._xSpring.current.value) / scale,\n (rect.y - this._ySpring.current.value) / scale,\n rect.width / scale,\n rect.height / scale,\n rect.degrees);\n },\n\n /**\n * Convert a viewport zoom to an image zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * @function\n * @param {Number} viewportZoom The viewport zoom\n * @returns {Number} imageZoom The image zoom\n */\n viewportToImageZoom: function( viewportZoom ) {\n var ratio = this._scaleSpring.current.value *\n this.viewport._containerInnerSize.x / this.source.dimensions.x;\n return ratio * viewportZoom;\n },\n\n /**\n * Convert an image zoom to a viewport zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} imageZoom The image zoom\n * @returns {Number} viewportZoom The viewport zoom\n */\n imageToViewportZoom: function( imageZoom ) {\n var ratio = this._scaleSpring.current.value *\n this.viewport._containerInnerSize.x / this.source.dimensions.x;\n return imageZoom / ratio;\n },\n\n /**\n * Sets the TiledImage's position in the world.\n * @param {OpenSeadragon.Point} position - The new position, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new position or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setPosition: function(position, immediately) {\n var sameTarget = (this._xSpring.target.value === position.x &&\n this._ySpring.target.value === position.y);\n\n if (immediately) {\n if (sameTarget && this._xSpring.current.value === position.x &&\n this._ySpring.current.value === position.y) {\n return;\n }\n\n this._xSpring.resetTo(position.x);\n this._ySpring.resetTo(position.y);\n this._needsDraw = true;\n } else {\n if (sameTarget) {\n return;\n }\n\n this._xSpring.springTo(position.x);\n this._ySpring.springTo(position.y);\n this._needsDraw = true;\n }\n\n if (!sameTarget) {\n this._raiseBoundsChange();\n }\n },\n\n /**\n * Sets the TiledImage's width in the world, adjusting the height to match based on aspect ratio.\n * @param {Number} width - The new width, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setWidth: function(width, immediately) {\n this._setScale(width, immediately);\n },\n\n /**\n * Sets the TiledImage's height in the world, adjusting the width to match based on aspect ratio.\n * @param {Number} height - The new height, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setHeight: function(height, immediately) {\n this._setScale(height / this.normHeight, immediately);\n },\n\n /**\n * Sets an array of polygons to crop the TiledImage during draw tiles.\n * The render function will use the default non-zero winding rule.\n * @param {OpenSeadragon.Point[][]} polygons - represented in an array of point object in image coordinates.\n * Example format: [\n * [{x: 197, y:172}, {x: 226, y:172}, {x: 226, y:198}, {x: 197, y:198}], // First polygon\n * [{x: 328, y:200}, {x: 330, y:199}, {x: 332, y:201}, {x: 329, y:202}] // Second polygon\n * [{x: 321, y:201}, {x: 356, y:205}, {x: 341, y:250}] // Third polygon\n * ]\n */\n setCroppingPolygons: function( polygons ) {\n\n var isXYObject = function(obj) {\n return obj instanceof $.Point || (typeof obj.x === 'number' && typeof obj.y === 'number');\n };\n\n var objectToSimpleXYObject = function(objs) {\n return objs.map(function(obj) {\n try {\n if (isXYObject(obj)) {\n return { x: obj.x, y: obj.y };\n } else {\n throw new Error();\n }\n } catch(e) {\n throw new Error('A Provided cropping polygon point is not supported');\n }\n });\n };\n\n try {\n if (!$.isArray(polygons)) {\n throw new Error('Provided cropping polygon is not an array');\n }\n this._croppingPolygons = polygons.map(function(polygon){\n return objectToSimpleXYObject(polygon);\n });\n } catch (e) {\n $.console.error('[TiledImage.setCroppingPolygons] Cropping polygon format not supported');\n $.console.error(e);\n this._croppingPolygons = null;\n }\n },\n\n /**\n * Resets the cropping polygons, thus next render will remove all cropping\n * polygon effects.\n */\n resetCroppingPolygons: function() {\n this._croppingPolygons = null;\n },\n\n /**\n * Positions and scales the TiledImage to fit in the specified bounds.\n * Note: this method fires OpenSeadragon.TiledImage.event:bounds-change\n * twice\n * @param {OpenSeadragon.Rect} bounds The bounds to fit the image into.\n * @param {OpenSeadragon.Placement} [anchor=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds.\n * @param {Boolean} [immediately=false] Whether to animate to the new size\n * or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n fitBounds: function(bounds, anchor, immediately) {\n anchor = anchor || $.Placement.CENTER;\n var anchorProperties = $.Placement.properties[anchor];\n var aspectRatio = this.contentAspectX;\n var xOffset = 0;\n var yOffset = 0;\n var displayedWidthRatio = 1;\n var displayedHeightRatio = 1;\n if (this._clip) {\n aspectRatio = this._clip.getAspectRatio();\n displayedWidthRatio = this._clip.width / this.source.dimensions.x;\n displayedHeightRatio = this._clip.height / this.source.dimensions.y;\n if (bounds.getAspectRatio() > aspectRatio) {\n xOffset = this._clip.x / this._clip.height * bounds.height;\n yOffset = this._clip.y / this._clip.height * bounds.height;\n } else {\n xOffset = this._clip.x / this._clip.width * bounds.width;\n yOffset = this._clip.y / this._clip.width * bounds.width;\n }\n }\n\n if (bounds.getAspectRatio() > aspectRatio) {\n // We will have margins on the X axis\n var height = bounds.height / displayedHeightRatio;\n var marginLeft = 0;\n if (anchorProperties.isHorizontallyCentered) {\n marginLeft = (bounds.width - bounds.height * aspectRatio) / 2;\n } else if (anchorProperties.isRight) {\n marginLeft = bounds.width - bounds.height * aspectRatio;\n }\n this.setPosition(\n new $.Point(bounds.x - xOffset + marginLeft, bounds.y - yOffset),\n immediately);\n this.setHeight(height, immediately);\n } else {\n // We will have margins on the Y axis\n var width = bounds.width / displayedWidthRatio;\n var marginTop = 0;\n if (anchorProperties.isVerticallyCentered) {\n marginTop = (bounds.height - bounds.width / aspectRatio) / 2;\n } else if (anchorProperties.isBottom) {\n marginTop = bounds.height - bounds.width / aspectRatio;\n }\n this.setPosition(\n new $.Point(bounds.x - xOffset, bounds.y - yOffset + marginTop),\n immediately);\n this.setWidth(width, immediately);\n }\n },\n\n /**\n * @returns {OpenSeadragon.Rect|null} The TiledImage's current clip rectangle,\n * in image pixels, or null if none.\n */\n getClip: function() {\n if (this._clip) {\n return this._clip.clone();\n }\n\n return null;\n },\n\n /**\n * @param {OpenSeadragon.Rect|null} newClip - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @fires OpenSeadragon.TiledImage.event:clip-change\n */\n setClip: function(newClip) {\n $.console.assert(!newClip || newClip instanceof $.Rect,\n \"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null\");\n\n if (newClip instanceof $.Rect) {\n this._clip = newClip.clone();\n } else {\n this._clip = null;\n }\n\n this._needsDraw = true;\n /**\n * Raised when the TiledImage's clip is changed.\n * @event clip-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n * TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('clip-change');\n },\n\n /**\n * @returns {Boolean} Whether the TiledImage should be flipped before rendering.\n */\n getFlip: function() {\n return !!this.flipped;\n },\n\n /**\n * @param {Boolean} flip Whether the TiledImage should be flipped before rendering.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setFlip: function(flip) {\n this.flipped = !!flip;\n this._needsDraw = true;\n this._raiseBoundsChange();\n },\n\n /**\n * @returns {Number} The TiledImage's current opacity.\n */\n getOpacity: function() {\n return this.opacity;\n },\n\n /**\n * @param {Number} opacity Opacity the tiled image should be drawn at.\n * @fires OpenSeadragon.TiledImage.event:opacity-change\n */\n setOpacity: function(opacity) {\n if (opacity === this.opacity) {\n return;\n }\n\n this.opacity = opacity;\n this._needsDraw = true;\n /**\n * Raised when the TiledImage's opacity is changed.\n * @event opacity-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {Number} opacity - The new opacity value.\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n * TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('opacity-change', {\n opacity: this.opacity\n });\n },\n\n /**\n * @returns {Boolean} whether the tiledImage can load its tiles even when it has zero opacity.\n */\n getPreload: function() {\n return this._preload;\n },\n\n /**\n * Set true to load even when hidden. Set false to block loading when hidden.\n */\n setPreload: function(preload) {\n this._preload = !!preload;\n this._needsDraw = true;\n },\n\n /**\n * Get the rotation of this tiled image in degrees.\n * @param {Boolean} [current=false] True for current rotation, false for target.\n * @returns {Number} the rotation of this tiled image in degrees.\n */\n getRotation: function(current) {\n return current ?\n this._degreesSpring.current.value :\n this._degreesSpring.target.value;\n },\n\n /**\n * Set the current rotation of this tiled image in degrees.\n * @param {Number} degrees the rotation in degrees.\n * @param {Boolean} [immediately=false] Whether to animate to the new angle\n * or rotate immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setRotation: function(degrees, immediately) {\n if (this._degreesSpring.target.value === degrees &&\n this._degreesSpring.isAtTargetValue()) {\n return;\n }\n if (immediately) {\n this._degreesSpring.resetTo(degrees);\n } else {\n this._degreesSpring.springTo(degrees);\n }\n this._needsDraw = true;\n this._raiseBoundsChange();\n },\n\n /**\n * Get the point around which this tiled image is rotated\n * @private\n * @param {Boolean} current True for current rotation point, false for target.\n * @returns {OpenSeadragon.Point}\n */\n _getRotationPoint: function(current) {\n return this.getBoundsNoRotate(current).getCenter();\n },\n\n /**\n * @returns {String} The TiledImage's current compositeOperation.\n */\n getCompositeOperation: function() {\n return this.compositeOperation;\n },\n\n /**\n * @param {String} compositeOperation the tiled image should be drawn with this globalCompositeOperation.\n * @fires OpenSeadragon.TiledImage.event:composite-operation-change\n */\n setCompositeOperation: function(compositeOperation) {\n if (compositeOperation === this.compositeOperation) {\n return;\n }\n\n this.compositeOperation = compositeOperation;\n this._needsDraw = true;\n /**\n * Raised when the TiledImage's opacity is changed.\n * @event composite-operation-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {String} compositeOperation - The new compositeOperation value.\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n * TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('composite-operation-change', {\n compositeOperation: this.compositeOperation\n });\n },\n\n /**\n * Update headers to include when making AJAX requests.\n *\n * Unless `propagate` is set to false (which is likely only useful in rare circumstances),\n * the updated headers are propagated to all tiles and queued image loader jobs.\n *\n * Note that the rules for merging headers still apply, i.e. headers returned by\n * {@link OpenSeadragon.TileSource#getTileAjaxHeaders} take precedence over\n * the headers here in the tiled image (`TiledImage.ajaxHeaders`).\n *\n * @function\n * @param {Object} ajaxHeaders Updated AJAX headers, which will be merged over any headers specified in {@link OpenSeadragon.Options}.\n * @param {Boolean} [propagate=true] Whether to propagate updated headers to existing tiles and queued image loader jobs.\n */\n setAjaxHeaders: function(ajaxHeaders, propagate) {\n if (ajaxHeaders === null) {\n ajaxHeaders = {};\n }\n if (!$.isPlainObject(ajaxHeaders)) {\n console.error('[TiledImage.setAjaxHeaders] Ignoring invalid headers, must be a plain object');\n return;\n }\n\n this._ownAjaxHeaders = ajaxHeaders;\n this._updateAjaxHeaders(propagate);\n },\n\n /**\n * Update headers to include when making AJAX requests.\n *\n * This function has the same effect as calling {@link OpenSeadragon.TiledImage#setAjaxHeaders},\n * except that the headers for this tiled image do not change. This is especially useful\n * for propagating updated headers from {@link OpenSeadragon.TileSource#getTileAjaxHeaders}\n * to existing tiles.\n *\n * @private\n * @function\n * @param {Boolean} [propagate=true] Whether to propagate updated headers to existing tiles and queued image loader jobs.\n */\n _updateAjaxHeaders: function(propagate) {\n if (propagate === undefined) {\n propagate = true;\n }\n\n // merge with viewer's headers\n if ($.isPlainObject(this.viewer.ajaxHeaders)) {\n this.ajaxHeaders = $.extend({}, this.viewer.ajaxHeaders, this._ownAjaxHeaders);\n } else {\n this.ajaxHeaders = this._ownAjaxHeaders;\n }\n\n // propagate header updates to all tiles and queued image loader jobs\n if (propagate) {\n var numTiles, xMod, yMod, tile;\n\n for (var level in this.tilesMatrix) {\n numTiles = this.source.getNumTiles(level);\n\n for (var x in this.tilesMatrix[level]) {\n xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x;\n\n for (var y in this.tilesMatrix[level][x]) {\n yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y;\n tile = this.tilesMatrix[level][x][y];\n\n tile.loadWithAjax = this.loadTilesWithAjax;\n if (tile.loadWithAjax) {\n var tileAjaxHeaders = this.source.getTileAjaxHeaders( level, xMod, yMod );\n tile.ajaxHeaders = $.extend({}, this.ajaxHeaders, tileAjaxHeaders);\n } else {\n tile.ajaxHeaders = null;\n }\n }\n }\n }\n\n for (var i = 0; i < this._imageLoader.jobQueue.length; i++) {\n var job = this._imageLoader.jobQueue[i];\n job.loadWithAjax = job.tile.loadWithAjax;\n job.ajaxHeaders = job.tile.loadWithAjax ? job.tile.ajaxHeaders : null;\n }\n }\n },\n\n // private\n _setScale: function(scale, immediately) {\n var sameTarget = (this._scaleSpring.target.value === scale);\n if (immediately) {\n if (sameTarget && this._scaleSpring.current.value === scale) {\n return;\n }\n\n this._scaleSpring.resetTo(scale);\n this._updateForScale();\n this._needsDraw = true;\n } else {\n if (sameTarget) {\n return;\n }\n\n this._scaleSpring.springTo(scale);\n this._updateForScale();\n this._needsDraw = true;\n }\n\n if (!sameTarget) {\n this._raiseBoundsChange();\n }\n },\n\n // private\n _updateForScale: function() {\n this._worldWidthTarget = this._scaleSpring.target.value;\n this._worldHeightTarget = this.normHeight * this._scaleSpring.target.value;\n this._worldWidthCurrent = this._scaleSpring.current.value;\n this._worldHeightCurrent = this.normHeight * this._scaleSpring.current.value;\n },\n\n // private\n _raiseBoundsChange: function() {\n /**\n * Raised when the TiledImage's bounds are changed.\n * Note that this event is triggered only when the animation target is changed;\n * not for every frame of animation.\n * @event bounds-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {OpenSeadragon.TiledImage} eventSource - A reference to the\n * TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('bounds-change');\n },\n\n // private\n _isBottomItem: function() {\n return this.viewer.world.getItemAt(0) === this;\n },\n\n // private\n _getLevelsInterval: function() {\n var lowestLevel = Math.max(\n this.source.minLevel,\n Math.floor(Math.log(this.minZoomImageRatio) / Math.log(2))\n );\n var currentZeroRatio = this.viewport.deltaPixelsFromPointsNoRotate(\n this.source.getPixelRatio(0), true).x *\n this._scaleSpring.current.value;\n var highestLevel = Math.min(\n Math.abs(this.source.maxLevel),\n Math.abs(Math.floor(\n Math.log(currentZeroRatio / this.minPixelRatio) / Math.log(2)\n ))\n );\n\n // Calculations for the interval of levels to draw\n // can return invalid intervals; fix that here if necessary\n highestLevel = Math.max(highestLevel, this.source.minLevel || 0);\n lowestLevel = Math.min(lowestLevel, highestLevel);\n return {\n lowestLevel: lowestLevel,\n highestLevel: highestLevel\n };\n },\n\n /**\n * @private\n * @inner\n * Pretty much every other line in this needs to be documented so it's clear\n * how each piece of this routine contributes to the drawing process. That's\n * why there are so many TODO's inside this function.\n */\n _updateViewport: function() {\n this._needsDraw = false;\n this._tilesLoading = 0;\n this.loadingCoverage = {};\n\n // Reset tile's internal drawn state\n while (this.lastDrawn.length > 0) {\n var tile = this.lastDrawn.pop();\n tile.beingDrawn = false;\n }\n\n var viewport = this.viewport;\n var drawArea = this._viewportToTiledImageRectangle(\n viewport.getBoundsWithMargins(true));\n\n if (!this.wrapHorizontal && !this.wrapVertical) {\n var tiledImageBounds = this._viewportToTiledImageRectangle(\n this.getClippedBounds(true));\n drawArea = drawArea.intersection(tiledImageBounds);\n if (drawArea === null) {\n return;\n }\n }\n\n var levelsInterval = this._getLevelsInterval();\n var lowestLevel = levelsInterval.lowestLevel;\n var highestLevel = levelsInterval.highestLevel;\n var bestTile = null;\n var haveDrawn = false;\n var currentTime = $.now();\n\n // Update any level that will be drawn\n for (var level = highestLevel; level >= lowestLevel; level--) {\n var drawLevel = false;\n\n //Avoid calculations for draw if we have already drawn this\n var currentRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate(\n this.source.getPixelRatio(level),\n true\n ).x * this._scaleSpring.current.value;\n\n if (level === lowestLevel ||\n (!haveDrawn && currentRenderPixelRatio >= this.minPixelRatio)) {\n drawLevel = true;\n haveDrawn = true;\n } else if (!haveDrawn) {\n continue;\n }\n\n //Perform calculations for draw if we haven't drawn this\n var targetRenderPixelRatio = viewport.deltaPixelsFromPointsNoRotate(\n this.source.getPixelRatio(level),\n false\n ).x * this._scaleSpring.current.value;\n\n var targetZeroRatio = viewport.deltaPixelsFromPointsNoRotate(\n this.source.getPixelRatio(\n Math.max(\n this.source.getClosestLevel(),\n 0\n )\n ),\n false\n ).x * this._scaleSpring.current.value;\n\n var optimalRatio = this.immediateRender ? 1 : targetZeroRatio;\n var levelOpacity = Math.min(1, (currentRenderPixelRatio - 0.5) / 0.5);\n var levelVisibility = optimalRatio / Math.abs(\n optimalRatio - targetRenderPixelRatio\n );\n\n // Update the level and keep track of 'best' tile to load\n bestTile = this._updateLevel(\n haveDrawn,\n drawLevel,\n level,\n levelOpacity,\n levelVisibility,\n drawArea,\n currentTime,\n bestTile\n );\n\n // Stop the loop if lower-res tiles would all be covered by\n // already drawn tiles\n if (this._providesCoverage(this.coverage, level)) {\n break;\n }\n }\n\n // Perform the actual drawing\n this._drawTiles(this.lastDrawn);\n\n // Load the new 'best' tile\n if (bestTile && !bestTile.context2D) {\n this._loadTile(bestTile, currentTime);\n this._needsDraw = true;\n this._setFullyLoaded(false);\n } else {\n this._setFullyLoaded(this._tilesLoading === 0);\n }\n },\n\n // private\n _getCornerTiles: function(level, topLeftBound, bottomRightBound) {\n var leftX;\n var rightX;\n if (this.wrapHorizontal) {\n leftX = $.positiveModulo(topLeftBound.x, 1);\n rightX = $.positiveModulo(bottomRightBound.x, 1);\n } else {\n leftX = Math.max(0, topLeftBound.x);\n rightX = Math.min(1, bottomRightBound.x);\n }\n var topY;\n var bottomY;\n var aspectRatio = 1 / this.source.aspectRatio;\n if (this.wrapVertical) {\n topY = $.positiveModulo(topLeftBound.y, aspectRatio);\n bottomY = $.positiveModulo(bottomRightBound.y, aspectRatio);\n } else {\n topY = Math.max(0, topLeftBound.y);\n bottomY = Math.min(aspectRatio, bottomRightBound.y);\n }\n\n var topLeftTile = this.source.getTileAtPoint(level, new $.Point(leftX, topY));\n var bottomRightTile = this.source.getTileAtPoint(level, new $.Point(rightX, bottomY));\n var numTiles = this.source.getNumTiles(level);\n\n if (this.wrapHorizontal) {\n topLeftTile.x += numTiles.x * Math.floor(topLeftBound.x);\n bottomRightTile.x += numTiles.x * Math.floor(bottomRightBound.x);\n }\n if (this.wrapVertical) {\n topLeftTile.y += numTiles.y * Math.floor(topLeftBound.y / aspectRatio);\n bottomRightTile.y += numTiles.y * Math.floor(bottomRightBound.y / aspectRatio);\n }\n\n return {\n topLeft: topLeftTile,\n bottomRight: bottomRightTile,\n };\n },\n\n /**\n * Updates all tiles at a given resolution level.\n * @private\n * @param {Boolean} haveDrawn\n * @param {Boolean} drawLevel\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} levelVisibility\n * @param {OpenSeadragon.Rect} drawArea\n * @param {Number} currentTime\n * @param {OpenSeadragon.Tile} best - The current \"best\" tile to draw.\n */\n _updateLevel: function(haveDrawn, drawLevel, level, levelOpacity,\n levelVisibility, drawArea, currentTime, best) {\n\n var topLeftBound = drawArea.getBoundingBox().getTopLeft();\n var bottomRightBound = drawArea.getBoundingBox().getBottomRight();\n\n if (this.viewer) {\n /**\n * - Needs documentation -\n *\n * @event update-level\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {Object} havedrawn\n * @property {Object} level\n * @property {Object} opacity\n * @property {Object} visibility\n * @property {OpenSeadragon.Rect} drawArea\n * @property {Object} topleft deprecated, use drawArea instead\n * @property {Object} bottomright deprecated, use drawArea instead\n * @property {Object} currenttime\n * @property {Object} best\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('update-level', {\n tiledImage: this,\n havedrawn: haveDrawn,\n level: level,\n opacity: levelOpacity,\n visibility: levelVisibility,\n drawArea: drawArea,\n topleft: topLeftBound,\n bottomright: bottomRightBound,\n currenttime: currentTime,\n best: best\n });\n }\n\n this._resetCoverage(this.coverage, level);\n this._resetCoverage(this.loadingCoverage, level);\n\n //OK, a new drawing so do your calculations\n var cornerTiles = this._getCornerTiles(level, topLeftBound, bottomRightBound);\n var topLeftTile = cornerTiles.topLeft;\n var bottomRightTile = cornerTiles.bottomRight;\n var numberOfTiles = this.source.getNumTiles(level);\n\n var viewportCenter = this.viewport.pixelFromPoint(this.viewport.getCenter());\n\n if (this.getFlip()) {\n // The right-most tile can be narrower than the others. When flipped,\n // this tile is now on the left. Because it is narrower than the normal\n // left-most tile, the subsequent tiles may not be wide enough to completely\n // fill the viewport. Fix this by rendering an extra column of tiles. If we\n // are not wrapping, make sure we never render more than the number of tiles\n // in the image.\n bottomRightTile.x += 1;\n if (!this.wrapHorizontal) {\n bottomRightTile.x = Math.min(bottomRightTile.x, numberOfTiles.x - 1);\n }\n }\n\n for (var x = topLeftTile.x; x <= bottomRightTile.x; x++) {\n for (var y = topLeftTile.y; y <= bottomRightTile.y; y++) {\n\n var flippedX;\n if (this.getFlip()) {\n var xMod = ( numberOfTiles.x + ( x % numberOfTiles.x ) ) % numberOfTiles.x;\n flippedX = x + numberOfTiles.x - xMod - xMod - 1;\n } else {\n flippedX = x;\n }\n\n if (drawArea.intersection(this.getTileBounds(level, flippedX, y)) === null) {\n // This tile is outside of the viewport, no need to draw it\n continue;\n }\n\n best = this._updateTile(\n drawLevel,\n haveDrawn,\n flippedX, y,\n level,\n levelOpacity,\n levelVisibility,\n viewportCenter,\n numberOfTiles,\n currentTime,\n best\n );\n }\n }\n\n return best;\n },\n\n /**\n * @private\n * @inner\n * Update a single tile at a particular resolution level.\n * @param {Boolean} haveDrawn\n * @param {Boolean} drawLevel\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} levelVisibility\n * @param {OpenSeadragon.Point} viewportCenter\n * @param {Number} numberOfTiles\n * @param {Number} currentTime\n * @param {OpenSeadragon.Tile} best - The current \"best\" tile to draw.\n */\n _updateTile: function( haveDrawn, drawLevel, x, y, level, levelOpacity,\n levelVisibility, viewportCenter, numberOfTiles, currentTime, best){\n\n var tile = this._getTile(\n x, y,\n level,\n currentTime,\n numberOfTiles,\n this._worldWidthCurrent,\n this._worldHeightCurrent\n ),\n drawTile = drawLevel;\n\n if( this.viewer ){\n /**\n * - Needs documentation -\n *\n * @event update-tile\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} tile\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'update-tile', {\n tiledImage: this,\n tile: tile\n });\n }\n\n this._setCoverage( this.coverage, level, x, y, false );\n\n var loadingCoverage = tile.loaded || tile.loading || this._isCovered(this.loadingCoverage, level, x, y);\n this._setCoverage(this.loadingCoverage, level, x, y, loadingCoverage);\n\n if ( !tile.exists ) {\n return best;\n }\n\n if ( haveDrawn && !drawTile ) {\n if ( this._isCovered( this.coverage, level, x, y ) ) {\n this._setCoverage( this.coverage, level, x, y, true );\n } else {\n drawTile = true;\n }\n }\n\n if ( !drawTile ) {\n return best;\n }\n\n this._positionTile(\n tile,\n this.source.tileOverlap,\n this.viewport,\n viewportCenter,\n levelVisibility\n );\n\n if (!tile.loaded) {\n if (tile.context2D) {\n this._setTileLoaded(tile);\n } else {\n var imageRecord = this._tileCache.getImageRecord(tile.cacheKey);\n if (imageRecord) {\n this._setTileLoaded(tile, imageRecord.getData());\n }\n }\n }\n\n if ( tile.loaded ) {\n var needsDraw = this._blendTile(\n tile,\n x, y,\n level,\n levelOpacity,\n currentTime\n );\n\n if ( needsDraw ) {\n this._needsDraw = true;\n }\n } else if ( tile.loading ) {\n // the tile is already in the download queue\n this._tilesLoading++;\n } else if (!loadingCoverage) {\n best = this._compareTiles( best, tile );\n }\n\n return best;\n },\n\n /**\n * @private\n * @inner\n * Obtains a tile at the given location.\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {Number} time\n * @param {Number} numTiles\n * @param {Number} worldWidth\n * @param {Number} worldHeight\n * @returns {OpenSeadragon.Tile}\n */\n _getTile: function(\n x, y,\n level,\n time,\n numTiles,\n worldWidth,\n worldHeight\n ) {\n var xMod,\n yMod,\n bounds,\n sourceBounds,\n exists,\n urlOrGetter,\n post,\n ajaxHeaders,\n context2D,\n tile,\n tilesMatrix = this.tilesMatrix,\n tileSource = this.source;\n\n if ( !tilesMatrix[ level ] ) {\n tilesMatrix[ level ] = {};\n }\n if ( !tilesMatrix[ level ][ x ] ) {\n tilesMatrix[ level ][ x ] = {};\n }\n\n if ( !tilesMatrix[ level ][ x ][ y ] || !tilesMatrix[ level ][ x ][ y ].flipped !== !this.flipped ) {\n xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x;\n yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y;\n bounds = this.getTileBounds( level, x, y );\n sourceBounds = tileSource.getTileBounds( level, xMod, yMod, true );\n exists = tileSource.tileExists( level, xMod, yMod );\n urlOrGetter = tileSource.getTileUrl( level, xMod, yMod );\n post = tileSource.getTilePostData( level, xMod, yMod );\n\n // Headers are only applicable if loadTilesWithAjax is set\n if (this.loadTilesWithAjax) {\n ajaxHeaders = tileSource.getTileAjaxHeaders( level, xMod, yMod );\n // Combine tile AJAX headers with tiled image AJAX headers (if applicable)\n if ($.isPlainObject(this.ajaxHeaders)) {\n ajaxHeaders = $.extend({}, this.ajaxHeaders, ajaxHeaders);\n }\n } else {\n ajaxHeaders = null;\n }\n\n context2D = tileSource.getContext2D ?\n tileSource.getContext2D(level, xMod, yMod) : undefined;\n\n tile = new $.Tile(\n level,\n x,\n y,\n bounds,\n exists,\n urlOrGetter,\n context2D,\n this.loadTilesWithAjax,\n ajaxHeaders,\n sourceBounds,\n post,\n tileSource.getTileHashKey(level, xMod, yMod, urlOrGetter, ajaxHeaders, post)\n );\n\n if (this.getFlip()) {\n if (xMod === 0) {\n tile.isRightMost = true;\n }\n } else {\n if (xMod === numTiles.x - 1) {\n tile.isRightMost = true;\n }\n }\n\n if (yMod === numTiles.y - 1) {\n tile.isBottomMost = true;\n }\n\n tile.flipped = this.flipped;\n\n tilesMatrix[ level ][ x ][ y ] = tile;\n }\n\n tile = tilesMatrix[ level ][ x ][ y ];\n tile.lastTouchTime = time;\n\n return tile;\n },\n\n /**\n * @private\n * @inner\n * Dispatch a job to the ImageLoader to load the Image for a Tile.\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} time\n */\n _loadTile: function(tile, time ) {\n var _this = this;\n tile.loading = true;\n this._imageLoader.addJob({\n src: tile.getUrl(),\n tile: tile,\n source: this.source,\n postData: tile.postData,\n loadWithAjax: tile.loadWithAjax,\n ajaxHeaders: tile.ajaxHeaders,\n crossOriginPolicy: this.crossOriginPolicy,\n ajaxWithCredentials: this.ajaxWithCredentials,\n callback: function( data, errorMsg, tileRequest ){\n _this._onTileLoad( tile, time, data, errorMsg, tileRequest );\n },\n abort: function() {\n tile.loading = false;\n }\n });\n },\n\n /**\n * @private\n * @inner\n * Callback fired when a Tile's Image finished downloading.\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} time\n * @param {*} data image data\n * @param {String} errorMsg\n * @param {XMLHttpRequest} tileRequest\n */\n _onTileLoad: function( tile, time, data, errorMsg, tileRequest ) {\n if ( !data ) {\n $.console.error( \"Tile %s failed to load: %s - error: %s\", tile, tile.getUrl(), errorMsg );\n /**\n * Triggered when a tile fails to load.\n *\n * @event tile-load-failed\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Tile} tile - The tile that failed to load.\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image the tile belongs to.\n * @property {number} time - The time in milliseconds when the tile load began.\n * @property {string} message - The error message.\n * @property {XMLHttpRequest} tileRequest - The XMLHttpRequest used to load the tile if available.\n */\n this.viewer.raiseEvent(\"tile-load-failed\", {\n tile: tile,\n tiledImage: this,\n time: time,\n message: errorMsg,\n tileRequest: tileRequest\n });\n tile.loading = false;\n tile.exists = false;\n return;\n } else {\n tile.exists = true;\n }\n\n if ( time < this.lastResetTime ) {\n $.console.warn( \"Ignoring tile %s loaded before reset: %s\", tile, tile.getUrl() );\n tile.loading = false;\n return;\n }\n\n var _this = this,\n finish = function() {\n var ccc = _this.source;\n var cutoff = ccc.getClosestLevel();\n _this._setTileLoaded(tile, data, cutoff, tileRequest);\n };\n\n // Check if we're mid-update; this can happen on IE8 because image load events for\n // cached images happen immediately there\n if ( !this._midDraw ) {\n finish();\n } else {\n // Wait until after the update, in case caching unloads any tiles\n window.setTimeout( finish, 1);\n }\n },\n\n /**\n * @private\n * @inner\n * @param {OpenSeadragon.Tile} tile\n * @param {*} data image data, the data sent to ImageJob.prototype.finish(), by default an Image object\n * @param {Number|undefined} cutoff\n * @param {XMLHttpRequest|undefined} tileRequest\n */\n _setTileLoaded: function(tile, data, cutoff, tileRequest) {\n var increment = 0,\n eventFinished = false,\n _this = this;\n\n function getCompletionCallback() {\n if (eventFinished) {\n $.console.error(\"Event 'tile-loaded' argument getCompletionCallback must be called synchronously. \" +\n \"Its return value should be called asynchronously.\");\n }\n increment++;\n return completionCallback;\n }\n\n function completionCallback() {\n increment--;\n if (increment === 0) {\n tile.loading = false;\n tile.loaded = true;\n tile.hasTransparency = _this.source.hasTransparency(\n tile.context2D, tile.getUrl(), tile.ajaxHeaders, tile.postData\n );\n if (!tile.context2D) {\n _this._tileCache.cacheTile({\n data: data,\n tile: tile,\n cutoff: cutoff,\n tiledImage: _this\n });\n }\n _this._needsDraw = true;\n }\n }\n\n /**\n * Triggered when a tile has just been loaded in memory. That means that the\n * image has been downloaded and can be modified before being drawn to the canvas.\n *\n * @event tile-loaded\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {Image|*} image - The image (data) of the tile. Deprecated.\n * @property {*} data image data, the data sent to ImageJob.prototype.finish(), by default an Image object\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the loaded tile.\n * @property {OpenSeadragon.Tile} tile - The tile which has been loaded.\n * @property {XMLHttpRequest} tileRequest - The AJAX request that loaded this tile (if applicable).\n * @property {function} getCompletionCallback - A function giving a callback to call\n * when the asynchronous processing of the image is done. The image will be\n * marked as entirely loaded when the callback has been called once for each\n * call to getCompletionCallback.\n */\n\n var fallbackCompletion = getCompletionCallback();\n this.viewer.raiseEvent(\"tile-loaded\", {\n tile: tile,\n tiledImage: this,\n tileRequest: tileRequest,\n get image() {\n $.console.error(\"[tile-loaded] event 'image' has been deprecated. Use 'data' property instead.\");\n return data;\n },\n data: data,\n getCompletionCallback: getCompletionCallback\n });\n eventFinished = true;\n // In case the completion callback is never called, we at least force it once.\n fallbackCompletion();\n },\n\n /**\n * @private\n * @inner\n * @param {OpenSeadragon.Tile} tile\n * @param {Boolean} overlap\n * @param {OpenSeadragon.Viewport} viewport\n * @param {OpenSeadragon.Point} viewportCenter\n * @param {Number} levelVisibility\n */\n _positionTile: function( tile, overlap, viewport, viewportCenter, levelVisibility ){\n var boundsTL = tile.bounds.getTopLeft();\n\n boundsTL.x *= this._scaleSpring.current.value;\n boundsTL.y *= this._scaleSpring.current.value;\n boundsTL.x += this._xSpring.current.value;\n boundsTL.y += this._ySpring.current.value;\n\n var boundsSize = tile.bounds.getSize();\n\n boundsSize.x *= this._scaleSpring.current.value;\n boundsSize.y *= this._scaleSpring.current.value;\n\n var positionC = viewport.pixelFromPointNoRotate(boundsTL, true),\n positionT = viewport.pixelFromPointNoRotate(boundsTL, false),\n sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true),\n sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false),\n tileCenter = positionT.plus( sizeT.divide( 2 ) ),\n tileSquaredDistance = viewportCenter.squaredDistanceTo( tileCenter );\n\n if ( !overlap ) {\n sizeC = sizeC.plus( new $.Point( 1, 1 ) );\n }\n\n if (tile.isRightMost && this.wrapHorizontal) {\n sizeC.x += 0.75; // Otherwise Firefox and Safari show seams\n }\n\n if (tile.isBottomMost && this.wrapVertical) {\n sizeC.y += 0.75; // Otherwise Firefox and Safari show seams\n }\n\n tile.position = positionC;\n tile.size = sizeC;\n tile.squaredDistance = tileSquaredDistance;\n tile.visibility = levelVisibility;\n },\n\n /**\n * @private\n * @inner\n * Updates the opacity of a tile according to the time it has been on screen\n * to perform a fade-in.\n * Updates coverage once a tile is fully opaque.\n * Returns whether the fade-in has completed.\n *\n * @param {OpenSeadragon.Tile} tile\n * @param {Number} x\n * @param {Number} y\n * @param {Number} level\n * @param {Number} levelOpacity\n * @param {Number} currentTime\n * @returns {Boolean}\n */\n _blendTile: function( tile, x, y, level, levelOpacity, currentTime ){\n var blendTimeMillis = 1000 * this.blendTime,\n deltaTime,\n opacity;\n\n if ( !tile.blendStart ) {\n tile.blendStart = currentTime;\n }\n\n deltaTime = currentTime - tile.blendStart;\n opacity = blendTimeMillis ? Math.min( 1, deltaTime / ( blendTimeMillis ) ) : 1;\n\n if ( this.alwaysBlend ) {\n opacity *= levelOpacity;\n }\n\n tile.opacity = opacity;\n\n this.lastDrawn.push( tile );\n\n if ( opacity === 1 ) {\n this._setCoverage( this.coverage, level, x, y, true );\n this._hasOpaqueTile = true;\n } else if ( deltaTime < blendTimeMillis ) {\n return true;\n }\n\n return false;\n },\n\n\n /**\n * @private\n * @inner\n * Determines whether the 'last best' tile for the area is better than the\n * tile in question.\n *\n * @param {OpenSeadragon.Tile} previousBest\n * @param {OpenSeadragon.Tile} tile\n * @returns {OpenSeadragon.Tile} The new best tile.\n */\n _compareTiles: function( previousBest, tile ) {\n if ( !previousBest ) {\n return tile;\n }\n\n if ( tile.visibility > previousBest.visibility ) {\n return tile;\n } else if ( tile.visibility === previousBest.visibility ) {\n if ( tile.squaredDistance < previousBest.squaredDistance ) {\n return tile;\n }\n }\n return previousBest;\n },\n\n /**\n * @private\n * @inner\n * Draws a TiledImage.\n * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.\n */\n _drawTiles: function( lastDrawn ) {\n if (this.opacity === 0 || (lastDrawn.length === 0 && !this.placeholderFillStyle)) {\n return;\n }\n\n var tile = lastDrawn[0];\n var useSketch;\n\n if (tile) {\n useSketch = this.opacity < 1 ||\n (this.compositeOperation && this.compositeOperation !== 'source-over') ||\n (!this._isBottomItem() &&\n this.source.hasTransparency(tile.context2D, tile.getUrl(), tile.ajaxHeaders, tile.postData));\n }\n\n var sketchScale;\n var sketchTranslate;\n\n var zoom = this.viewport.getZoom(true);\n var imageZoom = this.viewportToImageZoom(zoom);\n\n if (lastDrawn.length > 1 &&\n imageZoom > this.smoothTileEdgesMinZoom &&\n !this.iOSDevice &&\n this.getRotation(true) % 360 === 0 && // TODO: support tile edge smoothing with tiled image rotation.\n $.supportsCanvas && this.viewer.useCanvas) {\n // When zoomed in a lot (>100%) the tile edges are visible.\n // So we have to composite them at ~100% and scale them up together.\n // Note: Disabled on iOS devices per default as it causes a native crash\n useSketch = true;\n sketchScale = tile.getScaleForEdgeSmoothing();\n sketchTranslate = tile.getTranslationForEdgeSmoothing(sketchScale,\n this._drawer.getCanvasSize(false),\n this._drawer.getCanvasSize(true));\n }\n\n var bounds;\n if (useSketch) {\n if (!sketchScale) {\n // Except when edge smoothing, we only clean the part of the\n // sketch canvas we are going to use for performance reasons.\n bounds = this.viewport.viewportToViewerElementRectangle(\n this.getClippedBounds(true))\n .getIntegerBoundingBox();\n\n if(this._drawer.viewer.viewport.getFlip()) {\n if (this.viewport.getRotation(true) % 360 !== 0 ||\n this.getRotation(true) % 360 !== 0) {\n bounds.x = this._drawer.viewer.container.clientWidth - (bounds.x + bounds.width);\n }\n }\n\n bounds = bounds.times($.pixelDensityRatio);\n }\n this._drawer._clear(true, bounds);\n }\n\n // When scaling, we must rotate only when blending the sketch canvas to\n // avoid interpolation\n if (!sketchScale) {\n if (this.viewport.getRotation(true) % 360 !== 0) {\n this._drawer._offsetForRotation({\n degrees: this.viewport.getRotation(true),\n useSketch: useSketch\n });\n }\n if (this.getRotation(true) % 360 !== 0) {\n this._drawer._offsetForRotation({\n degrees: this.getRotation(true),\n point: this.viewport.pixelFromPointNoRotate(\n this._getRotationPoint(true), true),\n useSketch: useSketch\n });\n }\n\n if (this.viewport.getRotation(true) % 360 === 0 &&\n this.getRotation(true) % 360 === 0) {\n if(this._drawer.viewer.viewport.getFlip()) {\n this._drawer._flip();\n }\n }\n }\n\n var usedClip = false;\n if ( this._clip ) {\n this._drawer.saveContext(useSketch);\n\n var box = this.imageToViewportRectangle(this._clip, true);\n box = box.rotate(-this.getRotation(true), this._getRotationPoint(true));\n var clipRect = this._drawer.viewportToDrawerRectangle(box);\n if (sketchScale) {\n clipRect = clipRect.times(sketchScale);\n }\n if (sketchTranslate) {\n clipRect = clipRect.translate(sketchTranslate);\n }\n this._drawer.setClip(clipRect, useSketch);\n\n usedClip = true;\n }\n\n if (this._croppingPolygons) {\n var self = this;\n this._drawer.saveContext(useSketch);\n try {\n var polygons = this._croppingPolygons.map(function (polygon) {\n return polygon.map(function (coord) {\n var point = self\n .imageToViewportCoordinates(coord.x, coord.y, true)\n .rotate(-self.getRotation(true), self._getRotationPoint(true));\n var clipPoint = self._drawer.viewportCoordToDrawerCoord(point);\n if (sketchScale) {\n clipPoint = clipPoint.times(sketchScale);\n }\n if (sketchTranslate) {\n clipPoint = clipPoint.plus(sketchTranslate);\n }\n return clipPoint;\n });\n });\n this._drawer.clipWithPolygons(polygons, useSketch);\n } catch (e) {\n $.console.error(e);\n }\n usedClip = true;\n }\n\n if ( this.placeholderFillStyle && this._hasOpaqueTile === false ) {\n var placeholderRect = this._drawer.viewportToDrawerRectangle(this.getBounds(true));\n if (sketchScale) {\n placeholderRect = placeholderRect.times(sketchScale);\n }\n if (sketchTranslate) {\n placeholderRect = placeholderRect.translate(sketchTranslate);\n }\n\n var fillStyle = null;\n if ( typeof this.placeholderFillStyle === \"function\" ) {\n fillStyle = this.placeholderFillStyle(this, this._drawer.context);\n }\n else {\n fillStyle = this.placeholderFillStyle;\n }\n\n this._drawer.drawRectangle(placeholderRect, fillStyle, useSketch);\n }\n\n var subPixelRoundingRule = determineSubPixelRoundingRule(this.subPixelRoundingForTransparency);\n\n var shouldRoundPositionAndSize = false;\n\n if (subPixelRoundingRule === $.SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS) {\n shouldRoundPositionAndSize = true;\n } else if (subPixelRoundingRule === $.SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST) {\n var isAnimating = this.viewer && this.viewer.isAnimating();\n shouldRoundPositionAndSize = !isAnimating;\n }\n\n for (var i = lastDrawn.length - 1; i >= 0; i--) {\n tile = lastDrawn[ i ];\n this._drawer.drawTile( tile, this._drawingHandler, useSketch, sketchScale,\n sketchTranslate, shouldRoundPositionAndSize, this.source );\n tile.beingDrawn = true;\n\n if( this.viewer ){\n /**\n * - Needs documentation -\n *\n * @event tile-drawn\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} tile\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'tile-drawn', {\n tiledImage: this,\n tile: tile\n });\n }\n }\n\n if ( usedClip ) {\n this._drawer.restoreContext( useSketch );\n }\n\n if (!sketchScale) {\n if (this.getRotation(true) % 360 !== 0) {\n this._drawer._restoreRotationChanges(useSketch);\n }\n if (this.viewport.getRotation(true) % 360 !== 0) {\n this._drawer._restoreRotationChanges(useSketch);\n }\n }\n\n if (useSketch) {\n if (sketchScale) {\n if (this.viewport.getRotation(true) % 360 !== 0) {\n this._drawer._offsetForRotation({\n degrees: this.viewport.getRotation(true),\n useSketch: false\n });\n }\n if (this.getRotation(true) % 360 !== 0) {\n this._drawer._offsetForRotation({\n degrees: this.getRotation(true),\n point: this.viewport.pixelFromPointNoRotate(\n this._getRotationPoint(true), true),\n useSketch: false\n });\n }\n }\n this._drawer.blendSketch({\n opacity: this.opacity,\n scale: sketchScale,\n translate: sketchTranslate,\n compositeOperation: this.compositeOperation,\n bounds: bounds\n });\n if (sketchScale) {\n if (this.getRotation(true) % 360 !== 0) {\n this._drawer._restoreRotationChanges(false);\n }\n if (this.viewport.getRotation(true) % 360 !== 0) {\n this._drawer._restoreRotationChanges(false);\n }\n }\n }\n\n if (!sketchScale) {\n if (this.viewport.getRotation(true) % 360 === 0 &&\n this.getRotation(true) % 360 === 0) {\n if(this._drawer.viewer.viewport.getFlip()) {\n this._drawer._flip();\n }\n }\n }\n\n this._drawDebugInfo( lastDrawn );\n },\n\n /**\n * @private\n * @inner\n * Draws special debug information for a TiledImage if in debug mode.\n * @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.\n */\n _drawDebugInfo: function( lastDrawn ) {\n if( this.debugMode ) {\n for ( var i = lastDrawn.length - 1; i >= 0; i-- ) {\n var tile = lastDrawn[ i ];\n try {\n this._drawer.drawDebugInfo(tile, lastDrawn.length, i, this);\n } catch(e) {\n $.console.error(e);\n }\n }\n }\n },\n\n /**\n * @private\n * @inner\n * Returns true if the given tile provides coverage to lower-level tiles of\n * lower resolution representing the same content. If neither x nor y is\n * given, returns true if the entire visible level provides coverage.\n *\n * Note that out-of-bounds tiles provide coverage in this sense, since\n * there's no content that they would need to cover. Tiles at non-existent\n * levels that are within the image bounds, however, do not.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @returns {Boolean}\n */\n _providesCoverage: function( coverage, level, x, y ) {\n var rows,\n cols,\n i, j;\n\n if ( !coverage[ level ] ) {\n return false;\n }\n\n if ( x === undefined || y === undefined ) {\n rows = coverage[ level ];\n for ( i in rows ) {\n if ( Object.prototype.hasOwnProperty.call( rows, i ) ) {\n cols = rows[ i ];\n for ( j in cols ) {\n if ( Object.prototype.hasOwnProperty.call( cols, j ) && !cols[ j ] ) {\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n return (\n coverage[ level ][ x] === undefined ||\n coverage[ level ][ x ][ y ] === undefined ||\n coverage[ level ][ x ][ y ] === true\n );\n },\n\n /**\n * @private\n * @inner\n * Returns true if the given tile is completely covered by higher-level\n * tiles of higher resolution representing the same content. If neither x\n * nor y is given, returns true if the entire visible level is covered.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @returns {Boolean}\n */\n _isCovered: function( coverage, level, x, y ) {\n if ( x === undefined || y === undefined ) {\n return this._providesCoverage( coverage, level + 1 );\n } else {\n return (\n this._providesCoverage( coverage, level + 1, 2 * x, 2 * y ) &&\n this._providesCoverage( coverage, level + 1, 2 * x, 2 * y + 1 ) &&\n this._providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y ) &&\n this._providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y + 1 )\n );\n }\n },\n\n /**\n * @private\n * @inner\n * Sets whether the given tile provides coverage or not.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of the tile.\n * @param {Number} x - The X position of the tile.\n * @param {Number} y - The Y position of the tile.\n * @param {Boolean} covers - Whether the tile provides coverage.\n */\n _setCoverage: function( coverage, level, x, y, covers ) {\n if ( !coverage[ level ] ) {\n $.console.warn(\n \"Setting coverage for a tile before its level's coverage has been reset: %s\",\n level\n );\n return;\n }\n\n if ( !coverage[ level ][ x ] ) {\n coverage[ level ][ x ] = {};\n }\n\n coverage[ level ][ x ][ y ] = covers;\n },\n\n /**\n * @private\n * @inner\n * Resets coverage information for the given level. This should be called\n * after every draw routine. Note that at the beginning of the next draw\n * routine, coverage for every visible tile should be explicitly set.\n *\n * @param {Object} coverage - A '3d' dictionary [level][x][y] --> Boolean.\n * @param {Number} level - The resolution level of tiles to completely reset.\n */\n _resetCoverage: function( coverage, level ) {\n coverage[ level ] = {};\n }\n});\n\n\n/**\n * @private\n * @inner\n * Defines the value for subpixel rounding to fallback to in case of missing or\n * invalid value.\n */\nvar DEFAULT_SUBPIXEL_ROUNDING_RULE = $.SUBPIXEL_ROUNDING_OCCURRENCES.NEVER;\n\n/**\n * @private\n * @inner\n * Checks whether the input value is an invalid subpixel rounding enum value.\n *\n * @param {SUBPIXEL_ROUNDING_OCCURRENCES} value - The subpixel rounding enum value to check.\n * @returns {Boolean} Returns true if the input value is none of the expected\n * {@link SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS}, {@link SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST} or {@link SUBPIXEL_ROUNDING_OCCURRENCES.NEVER} value.\n */\nfunction isSubPixelRoundingRuleUnknown(value) {\n return value !== $.SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS &&\n value !== $.SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST &&\n value !== $.SUBPIXEL_ROUNDING_OCCURRENCES.NEVER;\n}\n\n/**\n * @private\n * @inner\n * Ensures the returned value is always a valid subpixel rounding enum value,\n * defaulting to {@link SUBPIXEL_ROUNDING_OCCURRENCES.NEVER} if input is missing or invalid.\n *\n * @param {SUBPIXEL_ROUNDING_OCCURRENCES} value - The subpixel rounding enum value to normalize.\n * @returns {SUBPIXEL_ROUNDING_OCCURRENCES} Returns a valid subpixel rounding enum value.\n */\nfunction normalizeSubPixelRoundingRule(value) {\n if (isSubPixelRoundingRuleUnknown(value)) {\n return DEFAULT_SUBPIXEL_ROUNDING_RULE;\n }\n return value;\n}\n\n/**\n * @private\n * @inner\n * Ensures the returned value is always a valid subpixel rounding enum value,\n * defaulting to 'NEVER' if input is missing or invalid.\n *\n * @param {Object} subPixelRoundingRules - A subpixel rounding enum values dictionary [{@link BROWSERS}] --> {@link SUBPIXEL_ROUNDING_OCCURRENCES}.\n * @returns {SUBPIXEL_ROUNDING_OCCURRENCES} Returns the determined subpixel rounding enum value for the\n * current browser.\n */\nfunction determineSubPixelRoundingRule(subPixelRoundingRules) {\n if (typeof subPixelRoundingRules === 'number') {\n return normalizeSubPixelRoundingRule(subPixelRoundingRules);\n }\n\n if (!subPixelRoundingRules || !$.Browser) {\n return DEFAULT_SUBPIXEL_ROUNDING_RULE;\n }\n\n var subPixelRoundingRule = subPixelRoundingRules[$.Browser.vendor];\n\n if (isSubPixelRoundingRuleUnknown(subPixelRoundingRule)) {\n subPixelRoundingRule = subPixelRoundingRules['*'];\n }\n\n return normalizeSubPixelRoundingRule(subPixelRoundingRule);\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TileCache\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// private class\nvar TileRecord = function( options ) {\n $.console.assert( options, \"[TileCache.cacheTile] options is required\" );\n $.console.assert( options.tile, \"[TileCache.cacheTile] options.tile is required\" );\n $.console.assert( options.tiledImage, \"[TileCache.cacheTile] options.tiledImage is required\" );\n this.tile = options.tile;\n this.tiledImage = options.tiledImage;\n};\n\n// private class\nvar ImageRecord = function(options) {\n $.console.assert( options, \"[ImageRecord] options is required\" );\n $.console.assert( options.data, \"[ImageRecord] options.data is required\" );\n this._tiles = [];\n\n options.create.apply(null, [this, options.data, options.ownerTile]);\n this._destroyImplementation = options.destroy.bind(null, this);\n this.getImage = options.getImage.bind(null, this);\n this.getData = options.getData.bind(null, this);\n this.getRenderedContext = options.getRenderedContext.bind(null, this);\n};\n\nImageRecord.prototype = {\n destroy: function() {\n this._destroyImplementation();\n this._tiles = null;\n },\n\n addTile: function(tile) {\n $.console.assert(tile, '[ImageRecord.addTile] tile is required');\n this._tiles.push(tile);\n },\n\n removeTile: function(tile) {\n for (var i = 0; i < this._tiles.length; i++) {\n if (this._tiles[i] === tile) {\n this._tiles.splice(i, 1);\n return;\n }\n }\n\n $.console.warn('[ImageRecord.removeTile] trying to remove unknown tile', tile);\n },\n\n getTileCount: function() {\n return this._tiles.length;\n }\n};\n\n/**\n * @class TileCache\n * @memberof OpenSeadragon\n * @classdesc Stores all the tiles displayed in a {@link OpenSeadragon.Viewer}.\n * You generally won't have to interact with the TileCache directly.\n * @param {Object} options - Configuration for this TileCache.\n * @param {Number} [options.maxImageCacheCount] - See maxImageCacheCount in\n * {@link OpenSeadragon.Options} for details.\n */\n$.TileCache = function( options ) {\n options = options || {};\n\n this._maxImageCacheCount = options.maxImageCacheCount || $.DEFAULT_SETTINGS.maxImageCacheCount;\n this._tilesLoaded = [];\n this._imagesLoaded = [];\n this._imagesLoadedCount = 0;\n};\n\n/** @lends OpenSeadragon.TileCache.prototype */\n$.TileCache.prototype = {\n /**\n * @returns {Number} The total number of tiles that have been loaded by\n * this TileCache.\n */\n numTilesLoaded: function() {\n return this._tilesLoaded.length;\n },\n\n /**\n * Caches the specified tile, removing an old tile if necessary to stay under the\n * maxImageCacheCount specified on construction. Note that if multiple tiles reference\n * the same image, there may be more tiles than maxImageCacheCount; the goal is to keep\n * the number of images below that number. Note, as well, that even the number of images\n * may temporarily surpass that number, but should eventually come back down to the max specified.\n * @param {Object} options - Tile info.\n * @param {OpenSeadragon.Tile} options.tile - The tile to cache.\n * @param {String} options.tile.cacheKey - The unique key used to identify this tile in the cache.\n * @param {Image} options.image - The image of the tile to cache.\n * @param {OpenSeadragon.TiledImage} options.tiledImage - The TiledImage that owns that tile.\n * @param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this\n * function will release an old tile. The cutoff option specifies a tile level at or below which\n * tiles will not be released.\n */\n cacheTile: function( options ) {\n $.console.assert( options, \"[TileCache.cacheTile] options is required\" );\n $.console.assert( options.tile, \"[TileCache.cacheTile] options.tile is required\" );\n $.console.assert( options.tile.cacheKey, \"[TileCache.cacheTile] options.tile.cacheKey is required\" );\n $.console.assert( options.tiledImage, \"[TileCache.cacheTile] options.tiledImage is required\" );\n\n var cutoff = options.cutoff || 0;\n var insertionIndex = this._tilesLoaded.length;\n\n var imageRecord = this._imagesLoaded[options.tile.cacheKey];\n if (!imageRecord) {\n\n if (!options.data) {\n $.console.error(\"[TileCache.cacheTile] options.image was renamed to options.data. '.image' attribute \" +\n \"has been deprecated and will be removed in the future.\");\n options.data = options.image;\n }\n\n $.console.assert( options.data, \"[TileCache.cacheTile] options.data is required to create an ImageRecord\" );\n imageRecord = this._imagesLoaded[options.tile.cacheKey] = new ImageRecord({\n data: options.data,\n ownerTile: options.tile,\n create: options.tiledImage.source.createTileCache,\n destroy: options.tiledImage.source.destroyTileCache,\n getImage: options.tiledImage.source.getTileCacheDataAsImage,\n getData: options.tiledImage.source.getTileCacheData,\n getRenderedContext: options.tiledImage.source.getTileCacheDataAsContext2D,\n });\n\n this._imagesLoadedCount++;\n }\n\n imageRecord.addTile(options.tile);\n options.tile.cacheImageRecord = imageRecord;\n\n // Note that just because we're unloading a tile doesn't necessarily mean\n // we're unloading an image. With repeated calls it should sort itself out, though.\n if ( this._imagesLoadedCount > this._maxImageCacheCount ) {\n var worstTile = null;\n var worstTileIndex = -1;\n var worstTileRecord = null;\n var prevTile, worstTime, worstLevel, prevTime, prevLevel, prevTileRecord;\n\n for ( var i = this._tilesLoaded.length - 1; i >= 0; i-- ) {\n prevTileRecord = this._tilesLoaded[ i ];\n prevTile = prevTileRecord.tile;\n\n if ( prevTile.level <= cutoff || prevTile.beingDrawn ) {\n continue;\n } else if ( !worstTile ) {\n worstTile = prevTile;\n worstTileIndex = i;\n worstTileRecord = prevTileRecord;\n continue;\n }\n\n prevTime = prevTile.lastTouchTime;\n worstTime = worstTile.lastTouchTime;\n prevLevel = prevTile.level;\n worstLevel = worstTile.level;\n\n if ( prevTime < worstTime ||\n ( prevTime === worstTime && prevLevel > worstLevel ) ) {\n worstTile = prevTile;\n worstTileIndex = i;\n worstTileRecord = prevTileRecord;\n }\n }\n\n if ( worstTile && worstTileIndex >= 0 ) {\n this._unloadTile(worstTileRecord);\n insertionIndex = worstTileIndex;\n }\n }\n\n this._tilesLoaded[ insertionIndex ] = new TileRecord({\n tile: options.tile,\n tiledImage: options.tiledImage\n });\n },\n\n /**\n * Clears all tiles associated with the specified tiledImage.\n * @param {OpenSeadragon.TiledImage} tiledImage\n */\n clearTilesFor: function( tiledImage ) {\n $.console.assert(tiledImage, '[TileCache.clearTilesFor] tiledImage is required');\n var tileRecord;\n for ( var i = 0; i < this._tilesLoaded.length; ++i ) {\n tileRecord = this._tilesLoaded[ i ];\n if ( tileRecord.tiledImage === tiledImage ) {\n this._unloadTile(tileRecord);\n this._tilesLoaded.splice( i, 1 );\n i--;\n }\n }\n },\n\n // private\n getImageRecord: function(cacheKey) {\n $.console.assert(cacheKey, '[TileCache.getImageRecord] cacheKey is required');\n return this._imagesLoaded[cacheKey];\n },\n\n // private\n _unloadTile: function(tileRecord) {\n $.console.assert(tileRecord, '[TileCache._unloadTile] tileRecord is required');\n var tile = tileRecord.tile;\n var tiledImage = tileRecord.tiledImage;\n\n tile.unload();\n tile.cacheImageRecord = null;\n\n var imageRecord = this._imagesLoaded[tile.cacheKey];\n imageRecord.removeTile(tile);\n if (!imageRecord.getTileCount()) {\n imageRecord.destroy();\n delete this._imagesLoaded[tile.cacheKey];\n this._imagesLoadedCount--;\n }\n\n /**\n * Triggered when a tile has just been unloaded from memory.\n *\n * @event tile-unloaded\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the unloaded tile.\n * @property {OpenSeadragon.Tile} tile - The tile which has been unloaded.\n */\n tiledImage.viewer.raiseEvent(\"tile-unloaded\", {\n tile: tile,\n tiledImage: tiledImage\n });\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - World\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2022 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class World\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @classdesc Keeps track of all of the tiled images in the scene.\n * @param {Object} options - World options.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this World.\n **/\n$.World = function( options ) {\n var _this = this;\n\n $.console.assert( options.viewer, \"[World] options.viewer is required\" );\n\n $.EventSource.call( this );\n\n this.viewer = options.viewer;\n this._items = [];\n this._needsDraw = false;\n this._autoRefigureSizes = true;\n this._needsSizesFigured = false;\n this._delegatedFigureSizes = function(event) {\n if (_this._autoRefigureSizes) {\n _this._figureSizes();\n } else {\n _this._needsSizesFigured = true;\n }\n };\n\n this._figureSizes();\n};\n\n$.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.World.prototype */{\n /**\n * Add the specified item.\n * @param {OpenSeadragon.TiledImage} item - The item to add.\n * @param {Number} [options.index] - Index for the item. If not specified, goes at the top.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n addItem: function( item, options ) {\n $.console.assert(item, \"[World.addItem] item is required\");\n $.console.assert(item instanceof $.TiledImage, \"[World.addItem] only TiledImages supported at this time\");\n\n options = options || {};\n if (options.index !== undefined) {\n var index = Math.max(0, Math.min(this._items.length, options.index));\n this._items.splice(index, 0, item);\n } else {\n this._items.push( item );\n }\n\n if (this._autoRefigureSizes) {\n this._figureSizes();\n } else {\n this._needsSizesFigured = true;\n }\n\n this._needsDraw = true;\n\n item.addHandler('bounds-change', this._delegatedFigureSizes);\n item.addHandler('clip-change', this._delegatedFigureSizes);\n\n /**\n * Raised when an item is added to the World.\n * @event add-item\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item that has been added.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'add-item', {\n item: item\n } );\n },\n\n /**\n * Get the item at the specified index.\n * @param {Number} index - The item's index.\n * @returns {OpenSeadragon.TiledImage} The item at the specified index.\n */\n getItemAt: function( index ) {\n $.console.assert(index !== undefined, \"[World.getItemAt] index is required\");\n return this._items[ index ];\n },\n\n /**\n * Get the index of the given item or -1 if not present.\n * @param {OpenSeadragon.TiledImage} item - The item.\n * @returns {Number} The index of the item or -1 if not present.\n */\n getIndexOfItem: function( item ) {\n $.console.assert(item, \"[World.getIndexOfItem] item is required\");\n return $.indexOf( this._items, item );\n },\n\n /**\n * @returns {Number} The number of items used.\n */\n getItemCount: function() {\n return this._items.length;\n },\n\n /**\n * Change the index of a item so that it appears over or under others.\n * @param {OpenSeadragon.TiledImage} item - The item to move.\n * @param {Number} index - The new index.\n * @fires OpenSeadragon.World.event:item-index-change\n */\n setItemIndex: function( item, index ) {\n $.console.assert(item, \"[World.setItemIndex] item is required\");\n $.console.assert(index !== undefined, \"[World.setItemIndex] index is required\");\n\n var oldIndex = this.getIndexOfItem( item );\n\n if ( index >= this._items.length ) {\n throw new Error( \"Index bigger than number of layers.\" );\n }\n\n if ( index === oldIndex || oldIndex === -1 ) {\n return;\n }\n\n this._items.splice( oldIndex, 1 );\n this._items.splice( index, 0, item );\n this._needsDraw = true;\n\n /**\n * Raised when the order of the indexes has been changed.\n * @event item-index-change\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item whose index has\n * been changed\n * @property {Number} previousIndex - The previous index of the item\n * @property {Number} newIndex - The new index of the item\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'item-index-change', {\n item: item,\n previousIndex: oldIndex,\n newIndex: index\n } );\n },\n\n /**\n * Remove an item.\n * @param {OpenSeadragon.TiledImage} item - The item to remove.\n * @fires OpenSeadragon.World.event:remove-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n removeItem: function( item ) {\n $.console.assert(item, \"[World.removeItem] item is required\");\n\n var index = $.indexOf(this._items, item );\n if ( index === -1 ) {\n return;\n }\n\n item.removeHandler('bounds-change', this._delegatedFigureSizes);\n item.removeHandler('clip-change', this._delegatedFigureSizes);\n item.destroy();\n this._items.splice( index, 1 );\n this._figureSizes();\n this._needsDraw = true;\n this._raiseRemoveItem(item);\n },\n\n /**\n * Remove all items.\n * @fires OpenSeadragon.World.event:remove-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n removeAll: function() {\n // We need to make sure any pending images are canceled so the world items don't get messed up\n this.viewer._cancelPendingImages();\n var item;\n var i;\n for (i = 0; i < this._items.length; i++) {\n item = this._items[i];\n item.removeHandler('bounds-change', this._delegatedFigureSizes);\n item.removeHandler('clip-change', this._delegatedFigureSizes);\n item.destroy();\n }\n\n var removedItems = this._items;\n this._items = [];\n this._figureSizes();\n this._needsDraw = true;\n\n for (i = 0; i < removedItems.length; i++) {\n item = removedItems[i];\n this._raiseRemoveItem(item);\n }\n },\n\n /**\n * Clears all tiles and triggers updates for all items.\n */\n resetItems: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n this._items[i].reset();\n }\n },\n\n /**\n * Updates (i.e. animates bounds of) all items.\n */\n update: function() {\n var animated = false;\n for ( var i = 0; i < this._items.length; i++ ) {\n animated = this._items[i].update() || animated;\n }\n\n return animated;\n },\n\n /**\n * Draws all items.\n */\n draw: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n this._items[i].draw();\n }\n\n this._needsDraw = false;\n },\n\n /**\n * @returns {Boolean} true if any items need updating.\n */\n needsDraw: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n if ( this._items[i].needsDraw() ) {\n return true;\n }\n }\n return this._needsDraw;\n },\n\n /**\n * @returns {OpenSeadragon.Rect} The smallest rectangle that encloses all items, in viewport coordinates.\n */\n getHomeBounds: function() {\n return this._homeBounds.clone();\n },\n\n /**\n * To facilitate zoom constraints, we keep track of the pixel density of the\n * densest item in the World (i.e. the item whose content size to viewport size\n * ratio is the highest) and save it as this \"content factor\".\n * @returns {Number} the number of content units per viewport unit.\n */\n getContentFactor: function() {\n return this._contentFactor;\n },\n\n /**\n * As a performance optimization, setting this flag to false allows the bounds-change event handler\n * on tiledImages to skip calculations on the world bounds. If a lot of images are going to be positioned in\n * rapid succession, this is a good idea. When finished, setAutoRefigureSizes should be called with true\n * or the system may behave oddly.\n * @param {Boolean} [value] The value to which to set the flag.\n */\n setAutoRefigureSizes: function(value) {\n this._autoRefigureSizes = value;\n if (value & this._needsSizesFigured) {\n this._figureSizes();\n this._needsSizesFigured = false;\n }\n },\n\n /**\n * Arranges all of the TiledImages with the specified settings.\n * @param {Object} options - Specifies how to arrange.\n * @param {Boolean} [options.immediately=false] - Whether to animate to the new arrangement.\n * @param {String} [options.layout] - See collectionLayout in {@link OpenSeadragon.Options}.\n * @param {Number} [options.rows] - See collectionRows in {@link OpenSeadragon.Options}.\n * @param {Number} [options.columns] - See collectionColumns in {@link OpenSeadragon.Options}.\n * @param {Number} [options.tileSize] - See collectionTileSize in {@link OpenSeadragon.Options}.\n * @param {Number} [options.tileMargin] - See collectionTileMargin in {@link OpenSeadragon.Options}.\n * @fires OpenSeadragon.World.event:metrics-change\n */\n arrange: function(options) {\n options = options || {};\n var immediately = options.immediately || false;\n var layout = options.layout || $.DEFAULT_SETTINGS.collectionLayout;\n var rows = options.rows || $.DEFAULT_SETTINGS.collectionRows;\n var columns = options.columns || $.DEFAULT_SETTINGS.collectionColumns;\n var tileSize = options.tileSize || $.DEFAULT_SETTINGS.collectionTileSize;\n var tileMargin = options.tileMargin || $.DEFAULT_SETTINGS.collectionTileMargin;\n var increment = tileSize + tileMargin;\n var wrap;\n if (!options.rows && columns) {\n wrap = columns;\n } else {\n wrap = Math.ceil(this._items.length / rows);\n }\n var x = 0;\n var y = 0;\n var item, box, width, height, position;\n\n this.setAutoRefigureSizes(false);\n for (var i = 0; i < this._items.length; i++) {\n if (i && (i % wrap) === 0) {\n if (layout === 'horizontal') {\n y += increment;\n x = 0;\n } else {\n x += increment;\n y = 0;\n }\n }\n\n item = this._items[i];\n box = item.getBounds();\n if (box.width > box.height) {\n width = tileSize;\n } else {\n width = tileSize * (box.width / box.height);\n }\n\n height = width * (box.height / box.width);\n position = new $.Point(x + ((tileSize - width) / 2),\n y + ((tileSize - height) / 2));\n\n item.setPosition(position, immediately);\n item.setWidth(width, immediately);\n\n if (layout === 'horizontal') {\n x += increment;\n } else {\n y += increment;\n }\n }\n this.setAutoRefigureSizes(true);\n },\n\n // private\n _figureSizes: function() {\n var oldHomeBounds = this._homeBounds ? this._homeBounds.clone() : null;\n var oldContentSize = this._contentSize ? this._contentSize.clone() : null;\n var oldContentFactor = this._contentFactor || 0;\n\n if (!this._items.length) {\n this._homeBounds = new $.Rect(0, 0, 1, 1);\n this._contentSize = new $.Point(1, 1);\n this._contentFactor = 1;\n } else {\n var item = this._items[0];\n var bounds = item.getBounds();\n this._contentFactor = item.getContentSize().x / bounds.width;\n var clippedBounds = item.getClippedBounds().getBoundingBox();\n var left = clippedBounds.x;\n var top = clippedBounds.y;\n var right = clippedBounds.x + clippedBounds.width;\n var bottom = clippedBounds.y + clippedBounds.height;\n for (var i = 1; i < this._items.length; i++) {\n item = this._items[i];\n bounds = item.getBounds();\n this._contentFactor = Math.max(this._contentFactor,\n item.getContentSize().x / bounds.width);\n clippedBounds = item.getClippedBounds().getBoundingBox();\n left = Math.min(left, clippedBounds.x);\n top = Math.min(top, clippedBounds.y);\n right = Math.max(right, clippedBounds.x + clippedBounds.width);\n bottom = Math.max(bottom, clippedBounds.y + clippedBounds.height);\n }\n\n this._homeBounds = new $.Rect(left, top, right - left, bottom - top);\n this._contentSize = new $.Point(\n this._homeBounds.width * this._contentFactor,\n this._homeBounds.height * this._contentFactor);\n }\n\n if (this._contentFactor !== oldContentFactor ||\n !this._homeBounds.equals(oldHomeBounds) ||\n !this._contentSize.equals(oldContentSize)) {\n /**\n * Raised when the home bounds or content factor change.\n * @event metrics-change\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('metrics-change', {});\n }\n },\n\n // private\n _raiseRemoveItem: function(item) {\n /**\n * Raised when an item is removed.\n * @event remove-item\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item's underlying item.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'remove-item', { item: item } );\n }\n});\n\n}( OpenSeadragon ));\n"]} \ No newline at end of file diff --git a/script/openseadragon/openseadragon.min.js b/script/openseadragon/openseadragon.min.js new file mode 100644 index 0000000..b2778cf --- /dev/null +++ b/script/openseadragon/openseadragon.min.js @@ -0,0 +1,9 @@ +//! openseadragon 4.1.0 +//! Built on 2023-05-25 +//! Git commit: v4.1.0-0-8849681 +//! http://openseadragon.github.io +//! License: http://openseadragon.github.io/license/ + + +function OpenSeadragon(e){return new OpenSeadragon.Viewer(e)}!function(n){n.version={versionStr:"4.1.0",major:parseInt("4",10),minor:parseInt("1",10),revision:parseInt("0",10)};var t={"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object AsyncFunction]":"function","[object Promise]":"promise","[object Array]":"array","[object Date]":"date","[object RegExp]":"regexp","[object Object]":"object"},i=Object.prototype.toString,o=Object.prototype.hasOwnProperty;n.isFunction=function(e){return"function"===n.type(e)};n.isArray=Array.isArray||function(e){return"array"===n.type(e)};n.isWindow=function(e){return e&&"object"==typeof e&&"setInterval"in e};n.type=function(e){return null==e?String(e):t[i.call(e)]||"object"};n.isPlainObject=function(e){if(!e||"object"!==OpenSeadragon.type(e)||e.nodeType||n.isWindow(e))return!1;if(e.constructor&&!o.call(e,"constructor")&&!o.call(e.constructor.prototype,"isPrototypeOf"))return!1;var t;for(var i in e)t=i;return void 0===t||o.call(e,t)};n.isEmptyObject=function(e){for(var t in e)return!1;return!0};n.freezeObject=function(e){Object.freeze?n.freezeObject=Object.freeze:n.freezeObject=function(e){return e};return n.freezeObject(e)};n.supportsCanvas=(e=document.createElement("canvas"),!(!n.isFunction(e.getContext)||!e.getContext("2d")));var e;n.isCanvasTainted=function(e){var t=!1;try{e.getContext("2d").getImageData(0,0,1,1)}catch(e){t=!0}return t};n.supportsAddEventListener=!(!document.documentElement.addEventListener||!document.addEventListener);n.supportsRemoveEventListener=!(!document.documentElement.removeEventListener||!document.removeEventListener);n.supportsEventListenerOptions=function(){var t=0;if(n.supportsAddEventListener)try{var e={get capture(){t++;return!1},get once(){t++;return!1},get passive(){t++;return!1}};window.addEventListener("test",null,e);window.removeEventListener("test",null,e)}catch(e){t=0}return 3<=t}();n.getCurrentPixelDensityRatio=function(){if(n.supportsCanvas){var e=document.createElement("canvas").getContext("2d");var t=window.devicePixelRatio||1;e=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return Math.max(t,1)/e}return 1};n.pixelDensityRatio=n.getCurrentPixelDensityRatio()}(OpenSeadragon);!function(u){u.extend=function(){var e,t,i,n,o,r=arguments[0]||{},s=arguments.length,a=!1,l=1;if("boolean"==typeof r){a=r;r=arguments[1]||{};l=2}"object"==typeof r||OpenSeadragon.isFunction(r)||(r={});if(s===l){r=this;--l}for(;l=i.x&&t.x=i.y},getMousePosition:function(e){if("number"==typeof e.pageX)u.getMousePosition=function(e){var t=new u.Point;t.x=e.pageX;t.y=e.pageY;return t};else{if("number"!=typeof e.clientX)throw new Error("Unknown event mouse position, no known technique.");u.getMousePosition=function(e){var t=new u.Point;t.x=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;t.y=e.clientY+document.body.scrollTop+document.documentElement.scrollTop;return t}}return u.getMousePosition(e)},getPageScroll:function(){var e=document.documentElement||{},t=document.body||{};if("number"==typeof window.pageXOffset)u.getPageScroll=function(){return new u.Point(window.pageXOffset,window.pageYOffset)};else if(t.scrollLeft||t.scrollTop)u.getPageScroll=function(){return new u.Point(document.body.scrollLeft,document.body.scrollTop)};else{if(!e.scrollLeft&&!e.scrollTop)return new u.Point(0,0);u.getPageScroll=function(){return new u.Point(document.documentElement.scrollLeft,document.documentElement.scrollTop)}}return u.getPageScroll()},setPageScroll:function(e){if(void 0!==window.scrollTo)u.setPageScroll=function(e){window.scrollTo(e.x,e.y)};else{var t=u.getPageScroll();if(t.x===e.x&&t.y===e.y)return;document.body.scrollLeft=e.x;document.body.scrollTop=e.y;var i=u.getPageScroll();if(i.x!==t.x&&i.y!==t.y){u.setPageScroll=function(e){document.body.scrollLeft=e.x;document.body.scrollTop=e.y};return}document.documentElement.scrollLeft=e.x;document.documentElement.scrollTop=e.y;if((i=u.getPageScroll()).x!==t.x&&i.y!==t.y){u.setPageScroll=function(e){document.documentElement.scrollLeft=e.x;document.documentElement.scrollTop=e.y};return}u.setPageScroll=function(e){}}u.setPageScroll(e)},getWindowSize:function(){var e=document.documentElement||{},t=document.body||{};if("number"==typeof window.innerWidth)u.getWindowSize=function(){return new u.Point(window.innerWidth,window.innerHeight)};else if(e.clientWidth||e.clientHeight)u.getWindowSize=function(){return new u.Point(document.documentElement.clientWidth,document.documentElement.clientHeight)};else{if(!t.clientWidth&&!t.clientHeight)throw new Error("Unknown window size, no known technique.");u.getWindowSize=function(){return new u.Point(document.body.clientWidth,document.body.clientHeight)}}return u.getWindowSize()},makeCenteredNode:function(e){e=u.getElement(e);var t=[u.makeNeutralElement("div"),u.makeNeutralElement("div"),u.makeNeutralElement("div")];u.extend(t[0].style,{display:"table",height:"100%",width:"100%"});u.extend(t[1].style,{display:"table-row"});u.extend(t[2].style,{display:"table-cell",verticalAlign:"middle",textAlign:"center"});t[0].appendChild(t[1]);t[1].appendChild(t[2]);t[2].appendChild(e);return t[0]},makeNeutralElement:function(e){var t=document.createElement(e),e=t.style;e.background="transparent none";e.border="none";e.margin="0px";e.padding="0px";e.position="static";return t},now:function(){Date.now?u.now=Date.now:u.now=function(){return(new Date).getTime()};return u.now()},makeTransparentImage:function(e){var t=u.makeNeutralElement("img");t.src=e;return t},setElementOpacity:function(e,t,i){e=u.getElement(e);i&&!u.Browser.alpha&&(t=Math.round(t));if(u.Browser.opacity)e.style.opacity=t<1?t:"";else if(t<1){t=Math.round(100*t);e.style.filter="alpha(opacity="+t+")"}else e.style.filter=""},setElementTouchActionNone:function(e){void 0!==(e=u.getElement(e)).style.touchAction?e.style.touchAction="none":void 0!==e.style.msTouchAction&&(e.style.msTouchAction="none")},setElementPointerEvents:function(e,t){void 0!==(e=u.getElement(e)).style&&void 0!==e.style.pointerEvents&&(e.style.pointerEvents=t)},setElementPointerEventsNone:function(e){u.setElementPointerEvents(e,"none")},addClass:function(e,t){(e=u.getElement(e)).className?-1===(" "+e.className+" ").indexOf(" "+t+" ")&&(e.className+=" "+t):e.className=t},indexOf:function(e,t,i){Array.prototype.indexOf?this.indexOf=function(e,t,i){return e.indexOf(t,i)}:this.indexOf=function(e,t,i){var n,o,i=i||0;if(!e)throw new TypeError;if(0===(o=e.length)||o<=i)return-1;for(n=i=i<0?o-Math.abs(i):i;nt.touches.length-r&&c.console.warn("Tracked touch contact count doesn't match event.touches.length");var a={originalEvent:t,eventType:"pointerdown",pointerType:"touch",isEmulated:!1};B(e,a);for(n=0;n\s*$/))n=m.parseXml(n);else if(n.match(/^\s*[{[].*[}\]]\s*$/))try{var e=m.parseJSON(n);n=e}catch(e){}function l(e,t){if(e.ready)r(e);else{e.addHandler("ready",function(){r(e)});e.addHandler("open-failed",function(e){s({message:e.message,source:t})})}}setTimeout(function(){if("string"===m.type(n))(n=new m.TileSource({url:n,crossOriginPolicy:(void 0!==o.crossOriginPolicy?o:i).crossOriginPolicy,ajaxWithCredentials:i.ajaxWithCredentials,ajaxHeaders:o.ajaxHeaders||i.ajaxHeaders,splitHashDataForPost:i.splitHashDataForPost,useCanvas:i.useCanvas,success:function(e){r(e.tileSource)}})).addHandler("open-failed",function(e){s(e)});else if(m.isPlainObject(n)||n.nodeType){void 0!==n.crossOriginPolicy||void 0===o.crossOriginPolicy&&void 0===i.crossOriginPolicy||(n.crossOriginPolicy=(void 0!==o.crossOriginPolicy?o:i).crossOriginPolicy);void 0===n.ajaxWithCredentials&&(n.ajaxWithCredentials=i.ajaxWithCredentials);void 0===n.useCanvas&&(n.useCanvas=i.useCanvas);if(m.isFunction(n.getTileUrl)){var e=new m.TileSource(n);e.getTileUrl=n.getTileUrl;r(e)}else{var t=m.TileSource.determineType(a,n);if(t){e=t.prototype.configure.apply(a,[n]);l(new t(e),n)}else s({message:"Unable to load TileSource",source:n})}}else l(n,n)})}(this,i.tileSource,i,function(e){o.tileSource=e;s()},function(e){e.options=i;t(e);s()})}function s(){var e,t;for(;n._loadQueue.length&&(e=n._loadQueue[0]).tileSource;){n._loadQueue.splice(0,1);if(e.options.replace){var i=n.world.getIndexOfItem(e.options.replaceItem);-1!==i&&(e.options.index=i);n.world.removeItem(e.options.replaceItem)}t=new m.TiledImage({viewer:n,source:e.tileSource,viewport:n.viewport,drawer:n.drawer,tileCache:n.tileCache,imageLoader:n.imageLoader,x:e.options.x,y:e.options.y,width:e.options.width,height:e.options.height,fitBounds:e.options.fitBounds,fitBoundsPlacement:e.options.fitBoundsPlacement,clip:e.options.clip,placeholderFillStyle:e.options.placeholderFillStyle,opacity:e.options.opacity,preload:e.options.preload,degrees:e.options.degrees,flipped:e.options.flipped,compositeOperation:e.options.compositeOperation,springStiffness:n.springStiffness,animationTime:n.animationTime,minZoomImageRatio:n.minZoomImageRatio,wrapHorizontal:n.wrapHorizontal,wrapVertical:n.wrapVertical,immediateRender:n.immediateRender,blendTime:n.blendTime,alwaysBlend:n.alwaysBlend,minPixelRatio:n.minPixelRatio,smoothTileEdgesMinZoom:n.smoothTileEdgesMinZoom,iOSDevice:n.iOSDevice,crossOriginPolicy:e.options.crossOriginPolicy,ajaxWithCredentials:e.options.ajaxWithCredentials,loadTilesWithAjax:e.options.loadTilesWithAjax,ajaxHeaders:e.options.ajaxHeaders,debugMode:n.debugMode,subPixelRoundingForTransparency:n.subPixelRoundingForTransparency});n.collectionMode&&n.world.setAutoRefigureSizes(!1);if(n.navigator){i=m.extend({},e.options,{replace:!1,originalTiledImage:t,tileSource:e.tileSource});n.navigator.addTiledImage(i)}n.world.addItem(t,{index:e.options.index});0===n._loadQueue.length&&r(e);1!==n.world.getItemCount()||n.preserveViewport||n.viewport.goHome(!0);e.options.success&&e.options.success({item:t})}}},addSimpleImage:function(e){m.console.assert(e,"[Viewer.addSimpleImage] options is required");m.console.assert(e.url,"[Viewer.addSimpleImage] options.url is required");e=m.extend({},e,{tileSource:{type:"image",url:e.url}});delete e.url;this.addTiledImage(e)},addLayer:function(t){var i=this;m.console.error("[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead.");var e=m.extend({},t,{success:function(e){i.raiseEvent("add-layer",{options:t,drawer:e.item})},error:function(e){i.raiseEvent("add-layer-failed",e)}});this.addTiledImage(e);return this},getLayerAtLevel:function(e){m.console.error("[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead.");return this.world.getItemAt(e)},getLevelOfLayer:function(e){m.console.error("[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead.");return this.world.getIndexOfItem(e)},getLayersCount:function(){m.console.error("[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead.");return this.world.getItemCount()},setLayerLevel:function(e,t){m.console.error("[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead.");return this.world.setItemIndex(e,t)},removeLayer:function(e){m.console.error("[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead.");return this.world.removeItem(e)},forceRedraw:function(){c[this.hash].forceRedraw=!0;return this},forceResize:function(){c[this.hash].needsResize=!0;c[this.hash].forceResize=!0},bindSequenceControls:function(){var e=m.delegate(this,v),t=m.delegate(this,f),i=m.delegate(this,this.goToNextPage),n=m.delegate(this,this.goToPreviousPage),o=this.navImages,r=!0;if(this.showSequenceControl){(this.previousButton||this.nextButton)&&(r=!1);this.previousButton=new m.Button({element:this.previousButton?m.getElement(this.previousButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.PreviousPage"),srcRest:B(this.prefixUrl,o.previous.REST),srcGroup:B(this.prefixUrl,o.previous.GROUP),srcHover:B(this.prefixUrl,o.previous.HOVER),srcDown:B(this.prefixUrl,o.previous.DOWN),onRelease:n,onFocus:e,onBlur:t});this.nextButton=new m.Button({element:this.nextButton?m.getElement(this.nextButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.NextPage"),srcRest:B(this.prefixUrl,o.next.REST),srcGroup:B(this.prefixUrl,o.next.GROUP),srcHover:B(this.prefixUrl,o.next.HOVER),srcDown:B(this.prefixUrl,o.next.DOWN),onRelease:i,onFocus:e,onBlur:t});this.navPrevNextWrap||this.previousButton.disable();this.tileSources&&this.tileSources.length||this.nextButton.disable();if(r){this.paging=new m.ButtonGroup({buttons:[this.previousButton,this.nextButton],clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold});this.pagingControl=this.paging.element;this.toolbar?this.toolbar.addControl(this.pagingControl,{anchor:m.ControlAnchor.BOTTOM_RIGHT}):this.addControl(this.pagingControl,{anchor:this.sequenceControlAnchor||m.ControlAnchor.TOP_LEFT})}}return this},bindStandardControls:function(){var e=m.delegate(this,L),t=m.delegate(this,M),i=m.delegate(this,N),n=m.delegate(this,F),o=m.delegate(this,A),r=m.delegate(this,U),s=m.delegate(this,V),a=m.delegate(this,j),l=m.delegate(this,G),h=m.delegate(this,q),c=m.delegate(this,v),u=m.delegate(this,f),d=this.navImages,p=[],g=!0;if(this.showNavigationControl){(this.zoomInButton||this.zoomOutButton||this.homeButton||this.fullPageButton||this.rotateLeftButton||this.rotateRightButton||this.flipButton)&&(g=!1);if(this.showZoomControl){p.push(this.zoomInButton=new m.Button({element:this.zoomInButton?m.getElement(this.zoomInButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.ZoomIn"),srcRest:B(this.prefixUrl,d.zoomIn.REST),srcGroup:B(this.prefixUrl,d.zoomIn.GROUP),srcHover:B(this.prefixUrl,d.zoomIn.HOVER),srcDown:B(this.prefixUrl,d.zoomIn.DOWN),onPress:e,onRelease:t,onClick:i,onEnter:e,onExit:t,onFocus:c,onBlur:u}));p.push(this.zoomOutButton=new m.Button({element:this.zoomOutButton?m.getElement(this.zoomOutButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.ZoomOut"),srcRest:B(this.prefixUrl,d.zoomOut.REST),srcGroup:B(this.prefixUrl,d.zoomOut.GROUP),srcHover:B(this.prefixUrl,d.zoomOut.HOVER),srcDown:B(this.prefixUrl,d.zoomOut.DOWN),onPress:n,onRelease:t,onClick:o,onEnter:n,onExit:t,onFocus:c,onBlur:u}))}this.showHomeControl&&p.push(this.homeButton=new m.Button({element:this.homeButton?m.getElement(this.homeButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.Home"),srcRest:B(this.prefixUrl,d.home.REST),srcGroup:B(this.prefixUrl,d.home.GROUP),srcHover:B(this.prefixUrl,d.home.HOVER),srcDown:B(this.prefixUrl,d.home.DOWN),onRelease:r,onFocus:c,onBlur:u}));this.showFullPageControl&&p.push(this.fullPageButton=new m.Button({element:this.fullPageButton?m.getElement(this.fullPageButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.FullPage"),srcRest:B(this.prefixUrl,d.fullpage.REST),srcGroup:B(this.prefixUrl,d.fullpage.GROUP),srcHover:B(this.prefixUrl,d.fullpage.HOVER),srcDown:B(this.prefixUrl,d.fullpage.DOWN),onRelease:s,onFocus:c,onBlur:u}));if(this.showRotationControl){p.push(this.rotateLeftButton=new m.Button({element:this.rotateLeftButton?m.getElement(this.rotateLeftButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.RotateLeft"),srcRest:B(this.prefixUrl,d.rotateleft.REST),srcGroup:B(this.prefixUrl,d.rotateleft.GROUP),srcHover:B(this.prefixUrl,d.rotateleft.HOVER),srcDown:B(this.prefixUrl,d.rotateleft.DOWN),onRelease:a,onFocus:c,onBlur:u}));p.push(this.rotateRightButton=new m.Button({element:this.rotateRightButton?m.getElement(this.rotateRightButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.RotateRight"),srcRest:B(this.prefixUrl,d.rotateright.REST),srcGroup:B(this.prefixUrl,d.rotateright.GROUP),srcHover:B(this.prefixUrl,d.rotateright.HOVER),srcDown:B(this.prefixUrl,d.rotateright.DOWN),onRelease:l,onFocus:c,onBlur:u}))}this.showFlipControl&&p.push(this.flipButton=new m.Button({element:this.flipButton?m.getElement(this.flipButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:m.getString("Tooltips.Flip"),srcRest:B(this.prefixUrl,d.flip.REST),srcGroup:B(this.prefixUrl,d.flip.GROUP),srcHover:B(this.prefixUrl,d.flip.HOVER),srcDown:B(this.prefixUrl,d.flip.DOWN),onRelease:h,onFocus:c,onBlur:u}));if(g){this.buttonGroup=new m.ButtonGroup({buttons:p,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold});this.navControl=this.buttonGroup.element;this.addHandler("open",m.delegate(this,W));(this.toolbar||this).addControl(this.navControl,{anchor:this.navigationControlAnchor||m.ControlAnchor.TOP_LEFT})}else this.customButtons=p}return this},currentPage:function(){return this._sequenceIndex},goToPage:function(e){if(this.tileSources&&0<=e&&e=this.tileSources.length&&(e=0);this.goToPage(e)},isAnimating:function(){return c[this.hash].animating}});function r(e){e=m.getElement(e);return new m.Point(0===e.clientWidth?1:e.clientWidth,0===e.clientHeight?1:e.clientHeight)}function h(e,t){if(t instanceof m.Overlay)return t;var i=null;if(t.element)i=m.getElement(t.element);else{var n=t.id||"openseadragon-overlay-"+Math.floor(1e7*Math.random());(i=m.getElement(t.id))||((i=document.createElement("a")).href="#/overlay/"+n);i.id=n;m.addClass(i,t.className||"openseadragon-overlay")}var o=t.location;var r=t.width;var s=t.height;if(!o){n=t.x;var a=t.y;if(void 0!==t.px){e=e.viewport.imageToViewportRectangle(new m.Rect(t.px,t.py,r||0,s||0));n=e.x;a=e.y;r=void 0!==r?e.width:void 0;s=void 0!==s?e.height:void 0}o=new m.Point(n,a)}a=t.placement;a&&"string"===m.type(a)&&(a=m.Placement[t.placement.toUpperCase()]);return new m.Overlay({element:i,location:o,placement:a,onDraw:t.onDraw,checkResize:t.checkResize,width:r,height:s,rotationMode:t.rotationMode})}function s(e,t){var i;for(i=e.length-1;0<=i;i--)if(e[i].element===t)return i;return-1}function a(e,t){return m.requestAnimationFrame(function(){t(e)})}function l(e){m.requestAnimationFrame(function(){!function(e){var t,i,n;if(e.controlsShouldFade){t=m.now();t=t-e.controlsFadeBeginTime;i=1-t/e.controlsFadeLength;i=Math.min(1,i);i=Math.max(0,i);for(n=e.controls.length-1;0<=n;n--)e.controls[n].autoFade&&e.controls[n].setOpacity(i);0=t.flickMinSpeed){var n=0;this.panHorizontal&&(n=t.flickMomentum*e.speed*Math.cos(e.direction));i=0;this.panVertical&&(i=t.flickMomentum*e.speed*Math.sin(e.direction));e=this.viewport.pixelFromPoint(this.viewport.getCenter(!0));i=this.viewport.pointFromPixel(new m.Point(e.x-n,e.y-i));this.viewport.panTo(i,!1)}this.viewport.applyConstraints()}t.dblClickDragToZoom&&!0===c[this.hash].draggingToZoom&&(c[this.hash].draggingToZoom=!1)}function S(e){this.raiseEvent("canvas-enter",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,buttons:e.buttons,pointers:e.pointers,insideElementPressed:e.insideElementPressed,buttonDownAny:e.buttonDownAny,originalEvent:e.originalEvent})}function E(e){this.raiseEvent("canvas-exit",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,buttons:e.buttons,pointers:e.pointers,insideElementPressed:e.insideElementPressed,buttonDownAny:e.buttonDownAny,originalEvent:e.originalEvent})}function P(e){this.raiseEvent("canvas-press",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,insideElementPressed:e.insideElementPressed,insideElementReleased:e.insideElementReleased,originalEvent:e.originalEvent});if(this.gestureSettingsByDeviceType(e.pointerType).dblClickDragToZoom){var t=c[this.hash].lastClickTime;e=m.now();if(null!==t){e-tthis.minScrollDeltaTime){this._lastScrollTime=n;t={tracker:e.eventSource,position:e.position,scroll:e.scroll,shift:e.shift,originalEvent:e.originalEvent,preventDefaultAction:!1,preventDefault:!0};this.raiseEvent("canvas-scroll",t);if(!t.preventDefaultAction&&this.viewport){this.viewport.flipped&&(e.position.x=this.viewport.getContainerSize().x-e.position.x);if((i=this.gestureSettingsByDeviceType(e.pointerType)).scrollToZoom){n=Math.pow(this.zoomPerScroll,e.scroll);this.viewport.zoomBy(n,i.zoomToRefPoint?this.viewport.pointFromPixel(e.position,!0):null);this.viewport.applyConstraints()}}e.preventDefault=t.preventDefault}else e.preventDefault=!0}function k(e){c[this.hash].mouseInside=!0;n(this);this.raiseEvent("container-enter",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,buttons:e.buttons,pointers:e.pointers,insideElementPressed:e.insideElementPressed,buttonDownAny:e.buttonDownAny,originalEvent:e.originalEvent})}function H(e){if(e.pointers<1){c[this.hash].mouseInside=!1;c[this.hash].animating||u(this)}this.raiseEvent("container-exit",{tracker:e.eventSource,pointerType:e.pointerType,position:e.position,buttons:e.buttons,pointers:e.pointers,insideElementPressed:e.insideElementPressed,buttonDownAny:e.buttonDownAny,originalEvent:e.originalEvent})}function z(e){!function(e){if(!e._opening&&c[e.hash]){if(e.autoResize||c[e.hash].forceResize){if(e._autoResizePolling){i=r(e.container);var t=c[e.hash].prevContainerSize;i.equals(t)||(c[e.hash].needsResize=!0)}c[e.hash].needsResize&&function(e,t){var i=e.viewport;var n=i.getZoom();var o=i.getCenter();i.resize(t,e.preserveImageSizeOnResize);i.panTo(o,!0);var r;if(e.preserveImageSizeOnResize)r=c[e.hash].prevContainerSize.x/t.x;else{var s=new m.Point(0,0);o=new m.Point(c[e.hash].prevContainerSize.x,c[e.hash].prevContainerSize.y).distanceTo(s);s=new m.Point(t.x,t.y).distanceTo(s);r=s/o*c[e.hash].prevContainerSize.x/t.x}i.zoomTo(n*r,null,!0);c[e.hash].prevContainerSize=t;c[e.hash].forceRedraw=!0;c[e.hash].needsResize=!1;c[e.hash].forceResize=!1}(e,i||r(e.container))}t=e.viewport.update();var i=e.world.update()||t;t&&e.raiseEvent("viewport-change");e.referenceStrip&&(i=e.referenceStrip.update(e.viewport)||i);t=c[e.hash].animating;if(!t&&i){e.raiseEvent("animation-start");n(e)}t=t&&!i;t&&(c[e.hash].animating=!1);if(i||t||c[e.hash].forceRedraw||e.world.needsDraw()){!function(e){e.imageLoader.clear();e.drawer.clear();e.world.draw();e.raiseEvent("update-viewport",{})}(e);e._drawOverlays();e.navigator&&e.navigator.update(e.viewport);c[e.hash].forceRedraw=!1;i&&e.raiseEvent("animation")}if(t){e.raiseEvent("animation-finish");c[e.hash].mouseInside||u(e)}c[e.hash].animating=i}}(e);e.isOpen()?e._updateRequestId=a(e,z):e._updateRequestId=!1}function B(e,t){return e?e+t:t}function L(){c[this.hash].lastZoomTime=m.now();c[this.hash].zoomFactor=this.zoomPerSecond;c[this.hash].zooming=!0;i(this)}function F(){c[this.hash].lastZoomTime=m.now();c[this.hash].zoomFactor=1/this.zoomPerSecond;c[this.hash].zooming=!0;i(this)}function M(){c[this.hash].zooming=!1}function i(e){m.requestAnimationFrame(m.delegate(e,t))}function t(){var e,t;if(c[this.hash].zooming&&this.viewport){t=(e=m.now())-c[this.hash].lastZoomTime;t=Math.pow(c[this.hash].zoomFactor,t/1e3);this.viewport.zoomBy(t);this.viewport.applyConstraints();c[this.hash].lastZoomTime=e;i(this)}}function N(){if(this.viewport){c[this.hash].zooming=!1;this.viewport.zoomBy(+this.zoomPerClick);this.viewport.applyConstraints()}}function A(){if(this.viewport){c[this.hash].zooming=!1;this.viewport.zoomBy(1/this.zoomPerClick);this.viewport.applyConstraints()}}function W(){if(this.buttonGroup){this.buttonGroup.emulateEnter();this.buttonGroup.emulateLeave()}}function U(){this.viewport&&this.viewport.goHome()}function V(){this.isFullPage()&&!m.isFullScreen()?this.setFullPage(!1):this.setFullScreen(!this.isFullPage());this.buttonGroup&&this.buttonGroup.emulateLeave();this.fullPageButton.element.focus();this.viewport&&this.viewport.applyConstraints()}function j(){if(this.viewport){var e=this.viewport.getRotation();this.viewport.flipped?e+=this.rotationIncrement:e-=this.rotationIncrement;this.viewport.setRotation(e)}}function G(){if(this.viewport){var e=this.viewport.getRotation();this.viewport.flipped?e-=this.rotationIncrement:e+=this.rotationIncrement;this.viewport.setRotation(e)}}function q(){this.viewport.toggleFlip()}}(OpenSeadragon);!function(r){r.Navigator=function(i){var e,t=i.viewer,n=this;if(i.element||i.id){if(i.element){i.id&&r.console.warn("Given option.id for Navigator was ignored since option.element was provided and is being used instead.");i.element.id?i.id=i.element.id:i.id="navigator-"+r.now();this.element=i.element}else this.element=document.getElementById(i.id);i.controlOptions={anchor:r.ControlAnchor.NONE,attachToViewer:!1,autoFade:!1}}else{i.id="navigator-"+r.now();this.element=r.makeNeutralElement("div");i.controlOptions={anchor:r.ControlAnchor.TOP_RIGHT,attachToViewer:!0,autoFade:i.autoFade};if(i.position)if("BOTTOM_RIGHT"===i.position)i.controlOptions.anchor=r.ControlAnchor.BOTTOM_RIGHT;else if("BOTTOM_LEFT"===i.position)i.controlOptions.anchor=r.ControlAnchor.BOTTOM_LEFT;else if("TOP_RIGHT"===i.position)i.controlOptions.anchor=r.ControlAnchor.TOP_RIGHT;else if("TOP_LEFT"===i.position)i.controlOptions.anchor=r.ControlAnchor.TOP_LEFT;else if("ABSOLUTE"===i.position){i.controlOptions.anchor=r.ControlAnchor.ABSOLUTE;i.controlOptions.top=i.top;i.controlOptions.left=i.left;i.controlOptions.height=i.height;i.controlOptions.width=i.width}}this.element.id=i.id;this.element.className+=" navigator";(i=r.extend(!0,{sizeRatio:r.DEFAULT_SETTINGS.navigatorSizeRatio},i,{element:this.element,tabIndex:-1,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:i.animationTime,autoResize:!1,minZoomImageRatio:1,background:i.background,opacity:i.opacity,borderColor:i.borderColor,displayRegionColor:i.displayRegionColor})).minPixelRatio=this.minPixelRatio=t.minPixelRatio;r.setElementTouchActionNone(this.element);this.borderWidth=2;this.fudge=new r.Point(1,1);this.totalBorderWidths=new r.Point(2*this.borderWidth,2*this.borderWidth).minus(this.fudge);i.controlOptions.anchor!==r.ControlAnchor.NONE&&function(e,t){e.margin="0px";e.border=t+"px solid "+i.borderColor;e.padding="0px";e.background=i.background;e.opacity=i.opacity;e.overflow="hidden"}(this.element.style,this.borderWidth);this.displayRegion=r.makeNeutralElement("div");this.displayRegion.id=this.element.id+"-displayregion";this.displayRegion.className="displayregion";!function(e,t){e.position="relative";e.top="0px";e.left="0px";e.fontSize="0px";e.overflow="hidden";e.border=t+"px solid "+i.displayRegionColor;e.margin="0px";e.padding="0px";e.background="transparent";e.float="left";e.cssFloat="left";e.styleFloat="left";e.zIndex=999999999;e.cursor="default";e.boxSizing="content-box"}(this.displayRegion.style,this.borderWidth);r.setElementPointerEventsNone(this.displayRegion);r.setElementTouchActionNone(this.displayRegion);this.displayRegionContainer=r.makeNeutralElement("div");this.displayRegionContainer.id=this.element.id+"-displayregioncontainer";this.displayRegionContainer.className="displayregioncontainer";this.displayRegionContainer.style.width="100%";this.displayRegionContainer.style.height="100%";r.setElementPointerEventsNone(this.displayRegionContainer);r.setElementTouchActionNone(this.displayRegionContainer);t.addControl(this.element,i.controlOptions);this._resizeWithViewer=i.controlOptions.anchor!==r.ControlAnchor.ABSOLUTE&&i.controlOptions.anchor!==r.ControlAnchor.NONE;if(i.width&&i.height){this.setWidth(i.width);this.setHeight(i.height)}else if(this._resizeWithViewer){e=r.getElementSize(t.element);this.element.style.height=Math.round(e.y*i.sizeRatio)+"px";this.element.style.width=Math.round(e.x*i.sizeRatio)+"px";this.oldViewerSize=e;e=r.getElementSize(this.element);this.elementArea=e.x*e.y}this.oldContainerSize=new r.Point(0,0);r.Viewer.apply(this,[i]);this.displayRegionContainer.appendChild(this.displayRegion);this.element.getElementsByTagName("div")[0].appendChild(this.displayRegionContainer);function o(e,t){c(n.displayRegionContainer,e);c(n.displayRegion,-e);n.viewport.setRotation(e,t)}if(i.navigatorRotate){o(i.viewer.viewport?i.viewer.viewport.getRotation():i.viewer.degrees||0,!0);i.viewer.addHandler("rotate",function(e){o(e.degrees,e.immediately)})}this.innerTracker.destroy();this.innerTracker=new r.MouseTracker({userData:"Navigator.innerTracker",element:this.element,dragHandler:r.delegate(this,a),clickHandler:r.delegate(this,s),releaseHandler:r.delegate(this,l),scrollHandler:r.delegate(this,h),preProcessEventHandler:function(e){"wheel"===e.eventType&&(e.preventDefault=!0)}});this.outerTracker.userData="Navigator.outerTracker";r.setElementPointerEventsNone(this.canvas);r.setElementPointerEventsNone(this.container);this.addHandler("reset-size",function(){n.viewport&&n.viewport.goHome(!0)});t.world.addHandler("item-index-change",function(t){window.setTimeout(function(){var e=n.world.getItemAt(t.previousIndex);n.world.setItemIndex(e,t.newIndex)},1)});t.world.addHandler("remove-item",function(e){e=e.item;e=n._getMatchingItem(e);e&&n.world.removeItem(e)});this.update(t.viewport)};r.extend(r.Navigator.prototype,r.EventSource.prototype,r.Viewer.prototype,{updateSize:function(){if(this.viewport){var e=new r.Point(0===this.container.clientWidth?1:this.container.clientWidth,0===this.container.clientHeight?1:this.container.clientHeight);if(!e.equals(this.oldContainerSize)){this.viewport.resize(e,!0);this.viewport.goHome(!0);this.oldContainerSize=e;this.drawer.clear();this.world.draw()}}},setWidth:function(e){this.width=e;this.element.style.width="number"==typeof e?e+"px":e;this._resizeWithViewer=!1;this.updateSize()},setHeight:function(e){this.height=e;this.element.style.height="number"==typeof e?e+"px":e;this._resizeWithViewer=!1;this.updateSize()},setFlip:function(e){this.viewport.setFlip(e);this.setDisplayTransform(this.viewer.viewport.getFlip()?"scale(-1,1)":"scale(1,1)");return this},setDisplayTransform:function(e){i(this.displayRegion,e);i(this.canvas,e);i(this.element,e)},update:function(e){var t,i;t=r.getElementSize(this.viewer.element);if(this._resizeWithViewer&&t.x&&t.y&&!t.equals(this.oldViewerSize)){this.oldViewerSize=t;if(this.maintainSizeRatio||!this.elementArea){i=t.x*this.sizeRatio;o=t.y*this.sizeRatio}else{i=Math.sqrt(this.elementArea*(t.x/t.y));o=this.elementArea/i}this.element.style.width=Math.round(i)+"px";this.element.style.height=Math.round(o)+"px";this.elementArea||(this.elementArea=i*o);this.updateSize()}if(e&&this.viewport){i=e.getBoundsNoRotate(!0);o=this.viewport.pixelFromPointNoRotate(i.getTopLeft(),!1);i=this.viewport.pixelFromPointNoRotate(i.getBottomRight(),!1).minus(this.totalBorderWidths);if(!this.navigatorRotate){var n=e.getRotation(!0);c(this.displayRegion,-n)}e=this.displayRegion.style;e.display=this.world.getItemCount()?"block":"none";e.top=o.y.toFixed(2)+"px";e.left=o.x.toFixed(2)+"px";n=i.x-o.x;var o=i.y-o.y;e.width=Math.round(Math.max(n,0))+"px";e.height=Math.round(Math.max(o,0))+"px"}},addTiledImage:function(e){var n=this;var o=e.originalTiledImage;delete e.original;e=r.extend({},e,{success:function(e){var t=e.item;t._originalForNavigator=o;n._matchBounds(t,o,!0);n._matchOpacity(t,o);n._matchCompositeOperation(t,o);function i(){n._matchBounds(t,o)}o.addHandler("bounds-change",i);o.addHandler("clip-change",i);o.addHandler("opacity-change",function(){n._matchOpacity(t,o)});o.addHandler("composite-operation-change",function(){n._matchCompositeOperation(t,o)})}});return r.Viewer.prototype.addTiledImage.apply(this,[e])},destroy:function(){return r.Viewer.prototype.destroy.apply(this)},_getMatchingItem:function(e){var t=this.world.getItemCount();var i;for(var n=0;n=1/this.aspectRatio-1e-15&&(n=this.getNumTiles(e).y-1);return new h.Point(i,n)},getTileBounds:function(e,t,i,n){var o=this.dimensions.times(this.getLevelScale(e)),r=this.getTileWidth(e),s=this.getTileHeight(e),a=0===t?0:r*t-this.tileOverlap,e=0===i?0:s*i-this.tileOverlap,t=r+(0===t?1:2)*this.tileOverlap,s=s+(0===i?1:2)*this.tileOverlap,i=1/o.x;t=Math.min(t,o.x-a);s=Math.min(s,o.y-e);return n?new h.Rect(0,0,t,s):new h.Rect(a*i,e*i,t*i,s*i)},getImageInfo:function(n){var t,i,e,o,r,s=this;n&&-1<(r=(o=(e=n.split("/"))[e.length-1]).lastIndexOf("."))&&(e[e.length-1]=o.slice(0,r));var a=null;if(this.splitHashDataForPost){var l=n.indexOf("#");if(-1!==l){a=n.substring(l+1);n=n.substr(0,l)}}t=function(e){"string"==typeof e&&(e=h.parseXml(e));var t=h.TileSource.determineType(s,e,n);if(t){void 0===(i=t.prototype.configure.apply(s,[e,n,a])).ajaxWithCredentials&&(i.ajaxWithCredentials=s.ajaxWithCredentials);i=new t(i);s.ready=!0;s.raiseEvent("ready",{tileSource:i})}else s.raiseEvent("open-failed",{message:"Unable to load TileSource",source:n})};if(n.match(/\.js$/)){l=n.split("/").pop().replace(".js","");h.jsonp({url:n,async:!1,callbackName:l,callback:t})}else h.makeAjaxRequest({url:n,postData:a,withCredentials:this.ajaxWithCredentials,headers:this.ajaxHeaders,success:function(e){e=function(t){var e,i,n=t.responseText,o=t.status;{if(!t)throw new Error(h.getString("Errors.Security"));if(200!==t.status&&0!==t.status){o=t.status;e=404===o?"Not Found":t.statusText;throw new Error(h.getString("Errors.Status",o,e))}}if(n.match(/^\s*<.*/))try{i=t.responseXML&&t.responseXML.documentElement?t.responseXML:h.parseXml(n)}catch(e){i=t.responseText}else if(n.match(/\s*[{[].*/))try{i=h.parseJSON(n)}catch(e){i=n}else i=n;return i}(e);t(e)},error:function(e,t){var i;try{i="HTTP "+e.status+" attempting to load TileSource: "+n}catch(e){i=(void 0!==t&&t.toString?t.toString():"Unknown error")+" attempting to load TileSource: "+n}h.console.error(i);s.raiseEvent("open-failed",{message:i,source:n,postData:a})}})},supports:function(e,t){return!1},configure:function(e,t,i){throw new Error("Method not implemented.")},getTileUrl:function(e,t,i){throw new Error("Method not implemented.")},getTilePostData:function(e,t,i){return null},getTileAjaxHeaders:function(e,t,i){return{}},getTileHashKey:function(e,t,i,n,o,r){function s(e){return o?e+"+"+JSON.stringify(o):e}return s("string"!=typeof n?e+"/"+t+"_"+i:n)},tileExists:function(e,t,i){var n=this.getNumTiles(e);return e>=this.minLevel&&e<=this.maxLevel&&0<=t&&0<=i&&tthis.maxLevel)return!1;if(!h||!h.length)return!0;for(l=h.length-1;0<=l;l--)if(!(e<(n=h[l]).minLevel||e>n.maxLevel)){a=this.getLevelScale(e);o=n.x*a;r=n.y*a;s=o+n.width*a;a=r+n.height*a;o=Math.floor(o/this._tileWidth);r=Math.floor(r/this._tileWidth);s=Math.ceil(s/this._tileWidth);a=Math.ceil(a/this._tileWidth);if(o<=t&&t=this.minLevel&&e<=this.maxLevel?this.levels[e].width/this.levels[this.maxLevel].width:t}return h.TileSource.prototype.getLevelScale.call(this,e)},getNumTiles:function(e){if(this.emulateLegacyImagePyramid)return this.getLevelScale(e)?new h.Point(1,1):new h.Point(0,0);if(this.levelSizes){var t=this.levelSizes[e];var i=Math.ceil(t.width/this.getTileWidth(e)),t=Math.ceil(t.height/this.getTileHeight(e));return new h.Point(i,t)}return h.TileSource.prototype.getNumTiles.call(this,e)},getTileAtPoint:function(e,t){if(this.emulateLegacyImagePyramid)return new h.Point(0,0);if(this.levelSizes){var i=0<=t.x&&t.x<=1&&0<=t.y&&t.y<=1/this.aspectRatio;h.console.assert(i,"[TileSource.getTileAtPoint] must be called with a valid point.");var n=this.levelSizes[e].width;i=t.x*n;n=t.y*n;i=Math.floor(i/this.getTileWidth(e));n=Math.floor(n/this.getTileHeight(e));1<=t.x&&(i=this.getNumTiles(e).x-1);t.y>=1/this.aspectRatio-1e-15&&(n=this.getNumTiles(e).y-1);return new h.Point(i,n)}return h.TileSource.prototype.getTileAtPoint.call(this,e,t)},getTileUrl:function(e,t,i){if(this.emulateLegacyImagePyramid){var n=null;return n=0=this.minLevel&&e<=this.maxLevel?this.levels[e].url:n}var o,r,s,a,l,h,c,u,d=Math.pow(.5,this.maxLevel-e);if(this.levelSizes){o=this.levelSizes[e].width;r=this.levelSizes[e].height}else{o=Math.ceil(this.width*d);r=Math.ceil(this.height*d)}c=this.getTileWidth(e);u=this.getTileHeight(e);a=Math.round(c/d);l=Math.round(u/d);n=1===this.version?"native."+this.tileFormat:"default."+this.tileFormat;if(oe.tileSize||parseInt(t.y,10)>e.tileSize;){t.x=Math.floor(t.x/2);t.y=Math.floor(t.y/2);e.imageSizes.push({x:t.x,y:t.y});e.gridSize.push(this._getGridSize(t.x,t.y,e.tileSize))}e.imageSizes.reverse();e.gridSize.reverse();e.minLevel=0;e.maxLevel=e.gridSize.length-1;OpenSeadragon.TileSource.apply(this,[e])};e.extend(e.ZoomifyTileSource.prototype,e.TileSource.prototype,{_getGridSize:function(e,t,i){return{x:Math.ceil(e/i),y:Math.ceil(t/i)}},_calculateAbsoluteTileNumber:function(e,t,i){var n=0;var o={};for(var r=0;r");return n.sort(function(e,t){return e.height-t.height})}(t.levels);if(0=this.minLevel&&e<=this.maxLevel?this.levels[e].width/this.levels[this.maxLevel].width:t},getNumTiles:function(e){return this.getLevelScale(e)?new a.Point(1,1):new a.Point(0,0)},getTileUrl:function(e,t,i){var n=null;return n=0=this.minLevel&&e<=this.maxLevel?this.levels[e].url:n}})}(OpenSeadragon);!function(a){a.ImageTileSource=function(e){e=a.extend({buildPyramid:!0,crossOriginPolicy:!1,ajaxWithCredentials:!1,useCanvas:!0},e);a.TileSource.apply(this,[e])};a.extend(a.ImageTileSource.prototype,a.TileSource.prototype,{supports:function(e,t){return e.type&&"image"===e.type},configure:function(e,t,i){return e},getImageInfo:function(e){var t=this._image=new Image;var i=this;this.crossOriginPolicy&&(t.crossOrigin=this.crossOriginPolicy);this.ajaxWithCredentials&&(t.useCredentials=this.ajaxWithCredentials);a.addEvent(t,"load",function(){i.width=t.naturalWidth;i.height=t.naturalHeight;i.aspectRatio=i.width/i.height;i.dimensions=new a.Point(i.width,i.height);i._tileWidth=i.width;i._tileHeight=i.height;i.tileOverlap=0;i.minLevel=0;i.levels=i._buildLevels();i.maxLevel=i.levels.length-1;i.ready=!0;i.raiseEvent("ready",{tileSource:i})});a.addEvent(t,"error",function(){i.raiseEvent("open-failed",{message:"Error loading image at "+e,source:e})});t.src=e},getLevelScale:function(e){var t=NaN;return t=e>=this.minLevel&&e<=this.maxLevel?this.levels[e].width/this.levels[this.maxLevel].width:t},getNumTiles:function(e){return this.getLevelScale(e)?new a.Point(1,1):new a.Point(0,0)},getTileUrl:function(e,t,i){var n=null;return n=e>=this.minLevel&&e<=this.maxLevel?this.levels[e].url:n},getContext2D:function(e,t,i){var n=null;return n=e>=this.minLevel&&e<=this.maxLevel?this.levels[e].context2D:n},destroy:function(){this._freeupCanvasMemory()},_buildLevels:function(){var e=[{url:this._image.src,width:this._image.naturalWidth,height:this._image.naturalHeight}];if(!this.buildPyramid||!a.supportsCanvas||!this.useCanvas){delete this._image;return e}var t=this._image.naturalWidth;var i=this._image.naturalHeight;var n=document.createElement("canvas");var o=n.getContext("2d");n.width=t;n.height=i;o.drawImage(this._image,0,0,t,i);e[0].context2D=o;delete this._image;if(a.isCanvasTainted(n))return e;for(;2<=t&&2<=i;){t=Math.floor(t/2);i=Math.floor(i/2);var r=document.createElement("canvas");var s=r.getContext("2d");r.width=t;r.height=i;s.drawImage(n,0,0,t,i);e.splice(0,0,{context2D:s,width:t,height:i});n=r;o=s}return e},_freeupCanvasMemory:function(){for(var e=0;e=i.ButtonState.GROUP&&e.currentState===i.ButtonState.REST){!function(e){e.shouldFade=!1;e.imgGroup&&i.setElementOpacity(e.imgGroup,1,!0)}(e);e.currentState=i.ButtonState.GROUP}if(t>=i.ButtonState.HOVER&&e.currentState===i.ButtonState.GROUP){e.imgHover&&(e.imgHover.style.visibility="");e.currentState=i.ButtonState.HOVER}if(t>=i.ButtonState.DOWN&&e.currentState===i.ButtonState.HOVER){e.imgDown&&(e.imgDown.style.visibility="");e.currentState=i.ButtonState.DOWN}}}function r(e,t){if(!e.element.disabled){if(t<=i.ButtonState.HOVER&&e.currentState===i.ButtonState.DOWN){e.imgDown&&(e.imgDown.style.visibility="hidden");e.currentState=i.ButtonState.HOVER}if(t<=i.ButtonState.GROUP&&e.currentState===i.ButtonState.HOVER){e.imgHover&&(e.imgHover.style.visibility="hidden");e.currentState=i.ButtonState.GROUP}if(t<=i.ButtonState.REST&&e.currentState===i.ButtonState.GROUP){!function(e){e.shouldFade=!0;e.fadeBeginTime=i.now()+e.fadeDelay;window.setTimeout(function(){n(e)},e.fadeDelay)}(e);e.currentState=i.ButtonState.REST}}}}(OpenSeadragon);!function(o){o.ButtonGroup=function(e){o.extend(!0,this,{buttons:[],clickTimeThreshold:o.DEFAULT_SETTINGS.clickTimeThreshold,clickDistThreshold:o.DEFAULT_SETTINGS.clickDistThreshold,labelText:""},e);var t,i=this.buttons.concat([]),n=this;this.element=e.element||o.makeNeutralElement("div");if(!e.group){this.element.style.display="inline-block";for(t=0;tu&&(u=m.x);m.yp&&(p=m.y)}return new v.Rect(c,d,u-c,p-d)},_getSegments:function(){var e=this.getTopLeft();var t=this.getTopRight();var i=this.getBottomLeft();var n=this.getBottomRight();return[[e,t],[t,n],[n,i],[i,e]]},rotate:function(e,t){if(0===(e=v.positiveModulo(e,360)))return this.clone();t=t||this.getCenter();var i=this.getTopLeft().rotate(e,t);e=this.getTopRight().rotate(e,t).minus(i);e=e.apply(function(e){return Math.abs(e)<1e-15?0:e});t=Math.atan(e.y/e.x);e.x<0?t+=Math.PI:e.y<0&&(t+=2*Math.PI);return new v.Rect(i.x,i.y,this.width,this.height,t/Math.PI*180)},getBoundingBox:function(){if(0===this.degrees)return this.clone();var e=this.getTopLeft();var t=this.getTopRight();var i=this.getBottomLeft();var n=this.getBottomRight();var o=Math.min(e.x,t.x,i.x,n.x);var r=Math.max(e.x,t.x,i.x,n.x);var s=Math.min(e.y,t.y,i.y,n.y);n=Math.max(e.y,t.y,i.y,n.y);return new v.Rect(o,s,r-o,n-s)},getIntegerBoundingBox:function(){var e=this.getBoundingBox();var t=Math.floor(e.x);var i=Math.floor(e.y);var n=Math.ceil(e.width+e.x-t);e=Math.ceil(e.height+e.y-i);return new v.Rect(t,i,n,e)},containsPoint:function(e,t){t=t||0;var i=this.getTopLeft();var n=this.getTopRight();var o=this.getBottomLeft();var r=n.minus(i);var s=o.minus(i);return(e.x-i.x)*r.x+(e.y-i.y)*r.y>=-t&&(e.x-n.x)*r.x+(e.y-n.y)*r.y<=t&&(e.x-i.x)*s.x+(e.y-i.y)*s.y>=-t&&(e.x-o.x)*s.x+(e.y-o.y)*s.y<=t},toString:function(){return"["+Math.round(100*this.x)/100+", "+Math.round(100*this.y)/100+", "+Math.round(100*this.width)/100+"x"+Math.round(100*this.height)/100+", "+Math.round(100*this.degrees)/100+"deg]"}}}(OpenSeadragon);!function(h){var s={};h.ReferenceStrip=function(e){var t,i,n,o=e.viewer,r=h.getElementSize(o.element);if(!e.id){e.id="referencestrip-"+h.now();this.element=h.makeNeutralElement("div");this.element.id=e.id;this.element.className="referencestrip"}e=h.extend(!0,{sizeRatio:h.DEFAULT_SETTINGS.referenceStripSizeRatio,position:h.DEFAULT_SETTINGS.referenceStripPosition,scroll:h.DEFAULT_SETTINGS.referenceStripScroll,clickTimeThreshold:h.DEFAULT_SETTINGS.clickTimeThreshold},e,{element:this.element});h.extend(this,e);s[this.id]={animating:!1};this.minPixelRatio=this.viewer.minPixelRatio;this.element.tabIndex=0;(i=this.element.style).marginTop="0px";i.marginRight="0px";i.marginBottom="0px";i.marginLeft="0px";i.left="0px";i.bottom="0px";i.border="0px";i.background="#000";i.position="relative";h.setElementTouchActionNone(this.element);h.setElementOpacity(this.element,.8);this.viewer=o;this.tracker=new h.MouseTracker({userData:"ReferenceStrip.tracker",element:this.element,clickHandler:h.delegate(this,a),dragHandler:h.delegate(this,l),scrollHandler:h.delegate(this,c),enterHandler:h.delegate(this,d),leaveHandler:h.delegate(this,p),keyDownHandler:h.delegate(this,g),keyHandler:h.delegate(this,m),preProcessEventHandler:function(e){"wheel"===e.eventType&&(e.preventDefault=!0)}});if(e.width&&e.height){this.element.style.width=e.width+"px";this.element.style.height=e.height+"px";o.addControl(this.element,{anchor:h.ControlAnchor.BOTTOM_LEFT})}else if("horizontal"===e.scroll){this.element.style.width=r.x*e.sizeRatio*o.tileSources.length+12*o.tileSources.length+"px";this.element.style.height=r.y*e.sizeRatio+"px";o.addControl(this.element,{anchor:h.ControlAnchor.BOTTOM_LEFT})}else{this.element.style.height=r.y*e.sizeRatio*o.tileSources.length+12*o.tileSources.length+"px";this.element.style.width=r.x*e.sizeRatio+"px";o.addControl(this.element,{anchor:h.ControlAnchor.TOP_LEFT})}this.panelWidth=r.x*this.sizeRatio+8;this.panelHeight=r.y*this.sizeRatio+8;this.panels=[];this.miniViewers={};for(n=0;ns+n.x-this.panelWidth){t=Math.min(t,o-n.x);this.element.style.marginLeft=-t+"px";u(this,n.x,-t)}else if(ta+n.y-this.panelHeight){t=Math.min(t,r-n.y);this.element.style.marginTop=-t+"px";u(this,n.y,-t)}else if(t-(n-r.x)){this.element.style.marginLeft=t+2*e.delta.x+"px";u(this,r.x,t+2*e.delta.x)}}else if(-e.delta.x<0&&t<0){this.element.style.marginLeft=t+2*e.delta.x+"px";u(this,r.x,t+2*e.delta.x)}}else if(0<-e.delta.y){if(i>-(o-r.y)){this.element.style.marginTop=i+2*e.delta.y+"px";u(this,r.y,i+2*e.delta.y)}}else if(-e.delta.y<0&&i<0){this.element.style.marginTop=i+2*e.delta.y+"px";u(this,r.y,i+2*e.delta.y)}}}function c(e){if(this.element){var t=Number(this.element.style.marginLeft.replace("px","")),i=Number(this.element.style.marginTop.replace("px","")),n=Number(this.element.style.width.replace("px","")),o=Number(this.element.style.height.replace("px","")),r=h.getElementSize(this.viewer.canvas);if("horizontal"===this.scroll){if(0-(n-r.x)){this.element.style.marginLeft=t-60*e.scroll+"px";u(this,r.x,t-60*e.scroll)}}else if(e.scroll<0&&t<0){this.element.style.marginLeft=t-60*e.scroll+"px";u(this,r.x,t-60*e.scroll)}}else if(e.scroll<0){if(i>r.y-o){this.element.style.marginTop=i+60*e.scroll+"px";u(this,r.y,i+60*e.scroll)}}else if(0=this.target.time?t:e+(t-e)*(n=this.springStiffness,i=(this.current.time-this.start.time)/(this.target.time-this.start.time),(1-Math.exp(n*-i))/(1-Math.exp(-n)));var i;var n=this.current.value;this._exponential?this.current.value=Math.exp(i):this.current.value=i;return n!==this.current.value},isAtTargetValue:function(){return this.current.value===this.target.value}}}(OpenSeadragon);!function(n){n.ImageJob=function(e){n.extend(!0,this,{timeout:n.DEFAULT_SETTINGS.timeout,jobId:null,tries:0},e);this.data=null;this.userData={};this.errorMsg=null};n.ImageJob.prototype={start:function(){this.tries++;var e=this;var t=this.abort;this.jobId=window.setTimeout(function(){e.finish(null,null,"Image load exceeded timeout ("+e.timeout+" ms)")},this.timeout);this.abort=function(){e.source.downloadTileAbort(e);"function"==typeof t&&t()};this.source.downloadTileStart(this)},finish:function(e,t,i){this.data=e;this.request=t;this.errorMsg=i;this.jobId&&window.clearTimeout(this.jobId);this.callback(this)}};n.ImageLoader=function(e){n.extend(!0,this,{jobLimit:n.DEFAULT_SETTINGS.imageLoaderLimit,timeout:n.DEFAULT_SETTINGS.timeout,jobQueue:[],failedTiles:[],jobsInProgress:0},e)};n.ImageLoader.prototype={addJob:function(t){if(!t.source){n.console.error("ImageLoader.prototype.addJob() requires [options.source]. TileSource since new API defines how images are fetched. Creating a dummy TileSource.");var e=n.TileSource.prototype;t.source={downloadTileStart:e.downloadTileStart,downloadTileAbort:e.downloadTileAbort}}var i=this,e={src:t.src,tile:t.tile||{},source:t.source,loadWithAjax:t.loadWithAjax,ajaxHeaders:t.loadWithAjax?t.ajaxHeaders:null,crossOriginPolicy:t.crossOriginPolicy,ajaxWithCredentials:t.ajaxWithCredentials,postData:t.postData,callback:function(e){!function(e,t,i){""!==t.errorMsg&&(null===t.data||void 0===t.data)&&t.tries<1+e.tileRetryMax&&e.failedTiles.push(t);var n;e.jobsInProgress--;if((!e.jobLimit||e.jobsInProgressthis.canvas.width&&(r.width=this.canvas.width-r.x);if(r.y<0){r.height+=r.y;r.y=0}r.y+r.height>this.canvas.height&&(r.height=this.canvas.height-r.y);this.context.drawImage(this.sketchCanvas,r.x,r.y,r.width,r.height,r.x,r.y,r.width,r.height)}else{t=o.scale||1;e=(i=o.translate)instanceof a.Point?i:new a.Point(0,0);n=0;r=0;if(i){o=this.sketchCanvas.width-this.canvas.width;i=this.sketchCanvas.height-this.canvas.height;n=Math.round(o/2);r=Math.round(i/2)}this.context.drawImage(this.sketchCanvas,e.x-n*t,e.y-r*t,(this.canvas.width+2*n)*t,(this.canvas.height+2*r)*t,-n,-r,this.canvas.width+2*n,this.canvas.height+2*r)}this.context.restore()}},drawDebugInfo:function(e,t,i,n){if(this.useCanvas){var o=this.viewer.world.getIndexOfItem(n)%this.debugGridColor.length;var r=this.context;r.save();r.lineWidth=2*a.pixelDensityRatio;r.font="small-caps bold "+13*a.pixelDensityRatio+"px arial";r.strokeStyle=this.debugGridColor[o];r.fillStyle=this.debugGridColor[o];this.viewport.getRotation(!0)%360!=0&&this._offsetForRotation({degrees:this.viewport.getRotation(!0)});n.getRotation(!0)%360!=0&&this._offsetForRotation({degrees:n.getRotation(!0),point:n.viewport.pixelFromPointNoRotate(n._getRotationPoint(!0),!0)});n.viewport.getRotation(!0)%360==0&&n.getRotation(!0)%360==0&&n._drawer.viewer.viewport.getFlip()&&n._drawer._flip();r.strokeRect(e.position.x*a.pixelDensityRatio,e.position.y*a.pixelDensityRatio,e.size.x*a.pixelDensityRatio,e.size.y*a.pixelDensityRatio);var s=(e.position.x+e.size.x/2)*a.pixelDensityRatio;o=(e.position.y+e.size.y/2)*a.pixelDensityRatio;r.translate(s,o);r.rotate(Math.PI/180*-this.viewport.getRotation(!0));r.translate(-s,-o);if(0===e.x&&0===e.y){r.fillText("Zoom: "+this.viewport.getZoom(),e.position.x*a.pixelDensityRatio,(e.position.y-30)*a.pixelDensityRatio);r.fillText("Pan: "+this.viewport.getBounds().toString(),e.position.x*a.pixelDensityRatio,(e.position.y-20)*a.pixelDensityRatio)}r.fillText("Level: "+e.level,(e.position.x+10)*a.pixelDensityRatio,(e.position.y+20)*a.pixelDensityRatio);r.fillText("Column: "+e.x,(e.position.x+10)*a.pixelDensityRatio,(e.position.y+30)*a.pixelDensityRatio);r.fillText("Row: "+e.y,(e.position.x+10)*a.pixelDensityRatio,(e.position.y+40)*a.pixelDensityRatio);r.fillText("Order: "+i+" of "+t,(e.position.x+10)*a.pixelDensityRatio,(e.position.y+50)*a.pixelDensityRatio);r.fillText("Size: "+e.size.toString(),(e.position.x+10)*a.pixelDensityRatio,(e.position.y+60)*a.pixelDensityRatio);r.fillText("Position: "+e.position.toString(),(e.position.x+10)*a.pixelDensityRatio,(e.position.y+70)*a.pixelDensityRatio);this.viewport.getRotation(!0)%360!=0&&this._restoreRotationChanges();n.getRotation(!0)%360!=0&&this._restoreRotationChanges();n.viewport.getRotation(!0)%360==0&&n.getRotation(!0)%360==0&&n._drawer.viewer.viewport.getFlip()&&n._drawer._flip();r.restore()}},debugRect:function(e){if(this.useCanvas){var t=this.context;t.save();t.lineWidth=2*a.pixelDensityRatio;t.strokeStyle=this.debugGridColor[0];t.fillStyle=this.debugGridColor[0];t.strokeRect(e.x*a.pixelDensityRatio,e.y*a.pixelDensityRatio,e.width*a.pixelDensityRatio,e.height*a.pixelDensityRatio);t.restore()}},setImageSmoothingEnabled:function(e){if(this.useCanvas){this._imageSmoothingEnabled=e;this._updateImageSmoothingEnabled(this.context);this.viewer.forceRedraw()}},_updateImageSmoothingEnabled:function(e){e.msImageSmoothingEnabled=this._imageSmoothingEnabled;e.imageSmoothingEnabled=this._imageSmoothingEnabled},getCanvasSize:function(e){e=this._getContext(e).canvas;return new a.Point(e.width,e.height)},getCanvasCenter:function(){return new a.Point(this.canvas.width/2,this.canvas.height/2)},_offsetForRotation:function(e){var t=e.point?e.point.times(a.pixelDensityRatio):this.getCanvasCenter();var i=this._getContext(e.useSketch);i.save();i.translate(t.x,t.y);if(this.viewer.viewport.flipped){i.rotate(Math.PI/180*-e.degrees);i.scale(-1,1)}else i.rotate(Math.PI/180*e.degrees);i.translate(-t.x,-t.y)},_flip:function(e){var t=(e=e||{}).point?e.point.times(a.pixelDensityRatio):this.getCanvasCenter();e=this._getContext(e.useSketch);e.translate(t.x,0);e.scale(-1,1);e.translate(-t.x,0)},_restoreRotationChanges:function(e){this._getContext(e).restore()},_calculateCanvasSize:function(){var e=a.pixelDensityRatio;var t=this.viewport.getContainerSize();return{x:Math.round(t.x*e),y:Math.round(t.y*e)}},_calculateSketchCanvasSize:function(){var e=this._calculateCanvasSize();if(0===this.viewport.getRotation())return e;e=Math.ceil(Math.sqrt(e.x*e.x+e.y*e.y));return{x:e,y:e}}}}(OpenSeadragon);!function(h){h.Viewport=function(e){var t=arguments;if((e=t.length&&t[0]instanceof h.Point?{containerSize:t[0],contentSize:t[1],config:t[2]}:e).config){h.extend(!0,e,e.config);delete e.config}this._margins=h.extend({left:0,top:0,right:0,bottom:0},e.margins||{});delete e.margins;e.initialDegrees=e.degrees;delete e.degrees;h.extend(!0,this,{containerSize:null,contentSize:null,zoomPoint:null,rotationPivot:null,viewer:null,springStiffness:h.DEFAULT_SETTINGS.springStiffness,animationTime:h.DEFAULT_SETTINGS.animationTime,minZoomImageRatio:h.DEFAULT_SETTINGS.minZoomImageRatio,maxZoomPixelRatio:h.DEFAULT_SETTINGS.maxZoomPixelRatio,visibilityRatio:h.DEFAULT_SETTINGS.visibilityRatio,wrapHorizontal:h.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:h.DEFAULT_SETTINGS.wrapVertical,defaultZoomLevel:h.DEFAULT_SETTINGS.defaultZoomLevel,minZoomLevel:h.DEFAULT_SETTINGS.minZoomLevel,maxZoomLevel:h.DEFAULT_SETTINGS.maxZoomLevel,initialDegrees:h.DEFAULT_SETTINGS.degrees,flipped:h.DEFAULT_SETTINGS.flipped,homeFillsViewer:h.DEFAULT_SETTINGS.homeFillsViewer,silenceMultiImageWarnings:h.DEFAULT_SETTINGS.silenceMultiImageWarnings},e);this._updateContainerInnerSize();this.centerSpringX=new h.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime});this.centerSpringY=new h.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime});this.zoomSpring=new h.Spring({exponential:!0,initial:1,springStiffness:this.springStiffness,animationTime:this.animationTime});this.degreesSpring=new h.Spring({initial:e.initialDegrees,springStiffness:this.springStiffness,animationTime:this.animationTime});this._oldCenterX=this.centerSpringX.current.value;this._oldCenterY=this.centerSpringY.current.value;this._oldZoom=this.zoomSpring.current.value;this._oldDegrees=this.degreesSpring.current.value;this._setContentBounds(new h.Rect(0,0,1,1),1);this.goHome(!0);this.update()};h.Viewport.prototype={get degrees(){h.console.warn("Accessing [Viewport.degrees] is deprecated. Use viewport.getRotation instead.");return this.getRotation()},set degrees(e){h.console.warn("Setting [Viewport.degrees] is deprecated. Use viewport.rotateTo, viewport.rotateBy, or viewport.setRotation instead.");this.rotateTo(e)},resetContentSize:function(e){h.console.assert(e,"[Viewport.resetContentSize] contentSize is required");h.console.assert(e instanceof h.Point,"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point");h.console.assert(0i.width?this.visibilityRatio*i.width:this.visibilityRatio*t.width;r=i.x-r+a;s=s-t.x-a;if(a>i.width){t.x+=(r+s)/2;n=!0}else if(s<0){t.x+=s;n=!0}else if(0i.height?this.visibilityRatio*i.height:this.visibilityRatio*t.height;l=i.y-l+r;s=s-t.y-r;if(r>i.height){t.y+=(l+s)/2;o=!0}else if(s<0){t.y+=s;o=!0}else if(0=o?s.height=s.width/o:s.width=s.height*o;s.x=r.x-s.width/2;s.y=r.y-s.height/2;var a=1/s.width;if(i){this.panTo(r,!0);this.zoomTo(a,null,!0);n&&this.applyConstraints(!0);return this}var l=this.getCenter(!0);t=this.getZoom(!0);this.panTo(l,!0);this.zoomTo(t,null,!0);e=this.getBounds();o=this.getZoom();if(0===o||Math.abs(a/o-1)<1e-8){this.zoomTo(a,null,!0);this.panTo(r,i);n&&this.applyConstraints(!1);return this}if(n){this.panTo(r,!1);a=this._applyZoomConstraints(a);this.zoomTo(a,null,!1);r=this.getConstrainedBounds();this.panTo(l,!0);this.zoomTo(t,null,!0);this.fitBounds(r)}else{o=s.rotate(-this.getRotation()).getTopLeft().times(a).minus(e.getTopLeft().times(o)).divide(a-o);this.zoomTo(a,o,i)}return this},fitBounds:function(e,t){return this._fitBounds(e,{immediately:t,constraints:!1})},fitBoundsWithConstraints:function(e,t){return this._fitBounds(e,{immediately:t,constraints:!0})},fitVertically:function(e){var t=new h.Rect(this._contentBounds.x+this._contentBounds.width/2,this._contentBounds.y,0,this._contentBounds.height);return this.fitBounds(t,e)},fitHorizontally:function(e){var t=new h.Rect(this._contentBounds.x,this._contentBounds.y+this._contentBounds.height/2,this._contentBounds.width,0);return this.fitBounds(t,e)},getConstrainedBounds:function(e){e=this.getBounds(e);return this._applyBoundaryConstraints(e)},panBy:function(e,t){var i=new h.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);return this.panTo(i.plus(e),t)},panTo:function(e,t){if(t){this.centerSpringX.resetTo(e.x);this.centerSpringY.resetTo(e.y)}else{this.centerSpringX.springTo(e.x);this.centerSpringY.springTo(e.y)}this.viewer&&this.viewer.raiseEvent("pan",{center:e,immediately:t});return this},zoomBy:function(e,t,i){return this.zoomTo(this.zoomSpring.target.value*e,t,i)},zoomTo:function(e,t,i){var n=this;this.zoomPoint=t instanceof h.Point&&!isNaN(t.x)&&!isNaN(t.y)?t:null;i?this._adjustCenterSpringsForZoomPoint(function(){n.zoomSpring.resetTo(e)}):this.zoomSpring.springTo(e);this.viewer&&this.viewer.raiseEvent("zoom",{zoom:e,refPoint:t,immediately:i});return this},setRotation:function(e,t){return this.rotateTo(e,null,t)},getRotation:function(e){return(e?this.degreesSpring.current:this.degreesSpring.target).value},setRotationWithPivot:function(e,t,i){return this.rotateTo(e,t,i)},rotateTo:function(e,t,i){if(!this.viewer||!this.viewer.drawer.canRotate())return this;if(this.degreesSpring.target.value===e&&this.degreesSpring.isAtTargetValue())return this;this.rotationPivot=t instanceof h.Point&&!isNaN(t.x)&&!isNaN(t.y)?t:null;if(i)if(this.rotationPivot){if(!(e-this._oldDegrees)){this.rotationPivot=null;return this}this._rotateAboutPivot(e)}else this.degreesSpring.resetTo(e);else{var n=h.positiveModulo(this.degreesSpring.current.value,360);var o=h.positiveModulo(e,360);t=o-n;180o){r=this._clip.x/this._clip.height*e.height;s=this._clip.y/this._clip.height*e.height}else{r=this._clip.x/this._clip.width*e.width;s=this._clip.y/this._clip.width*e.width}}if(e.getAspectRatio()>o){var l=e.height/t;t=0;n.isHorizontallyCentered?t=(e.width-e.height*o)/2:n.isRight&&(t=e.width-e.height*o);this.setPosition(new y.Point(e.x-r+t,e.y-s),i);this.setHeight(l,i)}else{l=e.width/a;a=0;n.isVerticallyCentered?a=(e.height-e.width/o)/2:n.isBottom&&(a=e.height-e.width/o);this.setPosition(new y.Point(e.x-r,e.y-s+a),i);this.setWidth(l,i)}},getClip:function(){return this._clip?this._clip.clone():null},setClip:function(e){y.console.assert(!e||e instanceof y.Rect,"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null");e instanceof y.Rect?this._clip=e.clone():this._clip=null;this._needsDraw=!0;this.raiseEvent("clip-change")},getFlip:function(){return!!this.flipped},setFlip:function(e){this.flipped=!!e;this._needsDraw=!0;this._raiseBoundsChange()},getOpacity:function(){return this.opacity},setOpacity:function(e){if(e!==this.opacity){this.opacity=e;this._needsDraw=!0;this.raiseEvent("opacity-change",{opacity:this.opacity})}},getPreload:function(){return this._preload},setPreload:function(e){this._preload=!!e;this._needsDraw=!0},getRotation:function(e){return(e?this._degreesSpring.current:this._degreesSpring.target).value},setRotation:function(e,t){if(this._degreesSpring.target.value!==e||!this._degreesSpring.isAtTargetValue()){t?this._degreesSpring.resetTo(e):this._degreesSpring.springTo(e);this._needsDraw=!0;this._raiseBoundsChange()}},_getRotationPoint:function(e){return this.getBoundsNoRotate(e).getCenter()},getCompositeOperation:function(){return this.compositeOperation},setCompositeOperation:function(e){if(e!==this.compositeOperation){this.compositeOperation=e;this._needsDraw=!0;this.raiseEvent("composite-operation-change",{compositeOperation:this.compositeOperation})}},setAjaxHeaders:function(e,t){if(y.isPlainObject(e=null===e?{}:e)){this._ownAjaxHeaders=e;this._updateAjaxHeaders(t)}else console.error("[TiledImage.setAjaxHeaders] Ignoring invalid headers, must be a plain object")},_updateAjaxHeaders:function(e){void 0===e&&(e=!0);y.isPlainObject(this.viewer.ajaxHeaders)?this.ajaxHeaders=y.extend({},this.viewer.ajaxHeaders,this._ownAjaxHeaders):this.ajaxHeaders=this._ownAjaxHeaders;if(e){var t,i;for(var n in this.tilesMatrix){t=this.source.getNumTiles(n);for(var o in this.tilesMatrix[n]){i=(t.x+o%t.x)%t.x;for(var r in this.tilesMatrix[n][o]){s=(t.y+r%t.y)%t.y;(r=this.tilesMatrix[n][o][r]).loadWithAjax=this.loadTilesWithAjax;if(r.loadWithAjax){var s=this.source.getTileAjaxHeaders(n,i,s);r.ajaxHeaders=y.extend({},this.ajaxHeaders,s)}else r.ajaxHeaders=null}}}for(var a=0;a=this.minPixelRatio)r=l=!0;else if(!r)continue;var c=e.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(a),!1).x*this._scaleSpring.current.value;var u=e.deltaPixelsFromPointsNoRotate(this.source.getPixelRatio(Math.max(this.source.getClosestLevel(),0)),!1).x*this._scaleSpring.current.value;u=this.immediateRender?1:u;h=Math.min(1,(h-.5)/.5);c=u/Math.abs(u-c);o=this._updateLevel(r,l,a,h,c,t,s,o);if(this._providesCoverage(this.coverage,a))break}this._drawTiles(this.lastDrawn);if(o&&!o.context2D){this._loadTile(o,s);this._needsDraw=!0;this._setFullyLoaded(!1)}else this._setFullyLoaded(0===this._tilesLoading)},_getCornerTiles:function(e,t,i){var n;var o;if(this.wrapHorizontal){n=y.positiveModulo(t.x,1);o=y.positiveModulo(i.x,1)}else{n=Math.max(0,t.x);o=Math.min(1,i.x)}var r=1/this.source.aspectRatio;if(this.wrapVertical){s=y.positiveModulo(t.y,r);a=y.positiveModulo(i.y,r)}else{s=Math.max(0,t.y);a=Math.min(r,i.y)}var s=this.source.getTileAtPoint(e,new y.Point(n,s));var a=this.source.getTileAtPoint(e,new y.Point(o,a));e=this.source.getNumTiles(e);if(this.wrapHorizontal){s.x+=e.x*Math.floor(t.x);a.x+=e.x*Math.floor(i.x)}if(this.wrapVertical){s.y+=e.y*Math.floor(t.y/r);a.y+=e.y*Math.floor(i.y/r)}return{topLeft:s,bottomRight:a}},_updateLevel:function(e,t,i,n,o,r,s,a){var l=r.getBoundingBox().getTopLeft();var h=r.getBoundingBox().getBottomRight();this.viewer&&this.viewer.raiseEvent("update-level",{tiledImage:this,havedrawn:e,level:i,opacity:n,visibility:o,drawArea:r,topleft:l,bottomright:h,currenttime:s,best:a});this._resetCoverage(this.coverage,i);this._resetCoverage(this.loadingCoverage,i);h=this._getCornerTiles(i,l,h);var c=h.topLeft;var u=h.bottomRight;var d=this.source.getNumTiles(i);var p=this.viewport.pixelFromPoint(this.viewport.getCenter());if(this.getFlip()){u.x+=1;this.wrapHorizontal||(u.x=Math.min(u.x,d.x-1))}for(var g=c.x;g<=u.x;g++)for(var m=c.y;m<=u.y;m++){if(this.getFlip()){var v=(d.x+g%d.x)%d.x;v=g+d.x-v-v-1}else v=g;null!==r.intersection(this.getTileBounds(i,v,m))&&(a=this._updateTile(t,e,v,m,i,n,o,p,d,s,a))}return a},_updateTile:function(e,t,i,n,o,r,s,a,l,h,c){var u=this._getTile(i,n,o,h,l,this._worldWidthCurrent,this._worldHeightCurrent),l=t;this.viewer&&this.viewer.raiseEvent("update-tile",{tiledImage:this,tile:u});this._setCoverage(this.coverage,o,i,n,!1);t=u.loaded||u.loading||this._isCovered(this.loadingCoverage,o,i,n);this._setCoverage(this.loadingCoverage,o,i,n,t);if(!u.exists)return c;e&&!l&&(this._isCovered(this.coverage,o,i,n)?this._setCoverage(this.coverage,o,i,n,!0):l=!0);if(!l)return c;this._positionTile(u,this.source.tileOverlap,this.viewport,a,s);if(!u.loaded)if(u.context2D)this._setTileLoaded(u);else{s=this._tileCache.getImageRecord(u.cacheKey);s&&this._setTileLoaded(u,s.getData())}u.loaded?this._blendTile(u,i,n,o,r,h)&&(this._needsDraw=!0):u.loading?this._tilesLoading++:t||(c=this._compareTiles(c,u));return c},_getTile:function(e,t,i,n,o,r,s){var a,l,h,c,u,d,p,g,m,v=this.tilesMatrix,f=this.source;v[i]||(v[i]={});v[i][e]||(v[i][e]={});if(!v[i][e][t]||!v[i][e][t].flipped!=!this.flipped){a=(o.x+e%o.x)%o.x;l=(o.y+t%o.y)%o.y;h=this.getTileBounds(i,e,t);c=f.getTileBounds(i,a,l,!0);u=f.tileExists(i,a,l);d=f.getTileUrl(i,a,l);m=f.getTilePostData(i,a,l);if(this.loadTilesWithAjax){p=f.getTileAjaxHeaders(i,a,l);y.isPlainObject(this.ajaxHeaders)&&(p=y.extend({},this.ajaxHeaders,p))}else p=null;g=f.getContext2D?f.getContext2D(i,a,l):void 0;m=new y.Tile(i,e,t,h,u,d,g,this.loadTilesWithAjax,p,c,m,f.getTileHashKey(i,a,l,d,p,m));this.getFlip()?0==a&&(m.isRightMost=!0):a==o.x-1&&(m.isRightMost=!0);l==o.y-1&&(m.isBottomMost=!0);m.flipped=this.flipped;v[i][e][t]=m}(m=v[i][e][t]).lastTouchTime=n;return m},_loadTile:function(n,o){var r=this;n.loading=!0;this._imageLoader.addJob({src:n.getUrl(),tile:n,source:this.source,postData:n.postData,loadWithAjax:n.loadWithAjax,ajaxHeaders:n.ajaxHeaders,crossOriginPolicy:this.crossOriginPolicy,ajaxWithCredentials:this.ajaxWithCredentials,callback:function(e,t,i){r._onTileLoad(n,o,e,t,i)},abort:function(){n.loading=!1}})},_onTileLoad:function(t,e,i,n,o){if(i){t.exists=!0;if(ee.visibility||t.visibility===e.visibility&&t.squaredDistancethis.smoothTileEdgesMinZoom&&!this.iOSDevice&&this.getRotation(!0)%360==0&&y.supportsCanvas&&this.viewer.useCanvas){i=!0;n=t.getScaleForEdgeSmoothing();o=t.getTranslationForEdgeSmoothing(n,this._drawer.getCanvasSize(!1),this._drawer.getCanvasSize(!0))}var a;if(i){if(!n){a=this.viewport.viewportToViewerElementRectangle(this.getClippedBounds(!0)).getIntegerBoundingBox();this._drawer.viewer.viewport.getFlip()&&(this.viewport.getRotation(!0)%360==0&&this.getRotation(!0)%360==0||(a.x=this._drawer.viewer.container.clientWidth-(a.x+a.width)));a=a.times(y.pixelDensityRatio)}this._drawer._clear(!0,a)}if(!n){this.viewport.getRotation(!0)%360!=0&&this._drawer._offsetForRotation({degrees:this.viewport.getRotation(!0),useSketch:i});this.getRotation(!0)%360!=0&&this._drawer._offsetForRotation({degrees:this.getRotation(!0),point:this.viewport.pixelFromPointNoRotate(this._getRotationPoint(!0),!0),useSketch:i});this.viewport.getRotation(!0)%360==0&&this.getRotation(!0)%360==0&&this._drawer.viewer.viewport.getFlip()&&this._drawer._flip()}r=!1;if(this._clip){this._drawer.saveContext(i);s=this.imageToViewportRectangle(this._clip,!0);s=s.rotate(-this.getRotation(!0),this._getRotationPoint(!0));s=this._drawer.viewportToDrawerRectangle(s);n&&(s=s.times(n));o&&(s=s.translate(o));this._drawer.setClip(s,i);r=!0}if(this._croppingPolygons){var l=this;this._drawer.saveContext(i);try{var h=this._croppingPolygons.map(function(e){return e.map(function(e){e=l.imageToViewportCoordinates(e.x,e.y,!0).rotate(-l.getRotation(!0),l._getRotationPoint(!0));e=l._drawer.viewportCoordToDrawerCoord(e);n&&(e=e.times(n));return e=o?e.plus(o):e})});this._drawer.clipWithPolygons(h,i)}catch(e){y.console.error(e)}r=!0}if(this.placeholderFillStyle&&!1===this._hasOpaqueTile){h=this._drawer.viewportToDrawerRectangle(this.getBounds(!0));n&&(h=h.times(n));o&&(h=h.translate(o));var c=null;c="function"==typeof this.placeholderFillStyle?this.placeholderFillStyle(this,this._drawer.context):this.placeholderFillStyle;this._drawer.drawRectangle(h,c,i)}c=function(e){if("number"==typeof e)return m(e);if(!e||!y.Browser)return p;var t=e[y.Browser.vendor];g(t)&&(t=e["*"]);return m(t)}(this.subPixelRoundingForTransparency);var u=!1;c===y.SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS?u=!0:c===y.SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST&&(u=!(this.viewer&&this.viewer.isAnimating()));for(var d=e.length-1;0<=d;d--){t=e[d];this._drawer.drawTile(t,this._drawingHandler,i,n,o,u,this.source);t.beingDrawn=!0;this.viewer&&this.viewer.raiseEvent("tile-drawn",{tiledImage:this,tile:t})}r&&this._drawer.restoreContext(i);if(!n){this.getRotation(!0)%360!=0&&this._drawer._restoreRotationChanges(i);this.viewport.getRotation(!0)%360!=0&&this._drawer._restoreRotationChanges(i)}if(i){if(n){this.viewport.getRotation(!0)%360!=0&&this._drawer._offsetForRotation({degrees:this.viewport.getRotation(!0),useSketch:!1});this.getRotation(!0)%360!=0&&this._drawer._offsetForRotation({degrees:this.getRotation(!0),point:this.viewport.pixelFromPointNoRotate(this._getRotationPoint(!0),!0),useSketch:!1})}this._drawer.blendSketch({opacity:this.opacity,scale:n,translate:o,compositeOperation:this.compositeOperation,bounds:a});if(n){this.getRotation(!0)%360!=0&&this._drawer._restoreRotationChanges(!1);this.viewport.getRotation(!0)%360!=0&&this._drawer._restoreRotationChanges(!1)}}n||this.viewport.getRotation(!0)%360==0&&this.getRotation(!0)%360==0&&this._drawer.viewer.viewport.getFlip()&&this._drawer._flip();this._drawDebugInfo(e)}},_drawDebugInfo:function(e){if(this.debugMode)for(var t=e.length-1;0<=t;t--){var i=e[t];try{this._drawer.drawDebugInfo(i,e.length,t,this)}catch(e){y.console.error(e)}}},_providesCoverage:function(e,t,i,n){var o,r,s,a;if(!e[t])return!1;if(void 0!==i&&void 0!==n)return void 0===e[t][i]||void 0===e[t][i][n]||!0===e[t][i][n];for(s in o=e[t])if(Object.prototype.hasOwnProperty.call(o,s))for(a in r=o[s])if(Object.prototype.hasOwnProperty.call(r,a)&&!r[a])return!1;return!0},_isCovered:function(e,t,i,n){return void 0===i||void 0===n?this._providesCoverage(e,t+1):this._providesCoverage(e,t+1,2*i,2*n)&&this._providesCoverage(e,t+1,2*i,2*n+1)&&this._providesCoverage(e,t+1,2*i+1,2*n)&&this._providesCoverage(e,t+1,2*i+1,2*n+1)},_setCoverage:function(e,t,i,n,o){if(e[t]){e[t][i]||(e[t][i]={});e[t][i][n]=o}else y.console.warn("Setting coverage for a tile before its level's coverage has been reset: %s",t)},_resetCoverage:function(e,t){e[t]={}}});var p=y.SUBPIXEL_ROUNDING_OCCURRENCES.NEVER;function g(e){return e!==y.SUBPIXEL_ROUNDING_OCCURRENCES.ALWAYS&&e!==y.SUBPIXEL_ROUNDING_OCCURRENCES.ONLY_AT_REST&&e!==y.SUBPIXEL_ROUNDING_OCCURRENCES.NEVER}function m(e){return g(e)?p:e}}(OpenSeadragon);!function(g){function m(e){g.console.assert(e,"[TileCache.cacheTile] options is required");g.console.assert(e.tile,"[TileCache.cacheTile] options.tile is required");g.console.assert(e.tiledImage,"[TileCache.cacheTile] options.tiledImage is required");this.tile=e.tile;this.tiledImage=e.tiledImage}function v(e){g.console.assert(e,"[ImageRecord] options is required");g.console.assert(e.data,"[ImageRecord] options.data is required");this._tiles=[];e.create.apply(null,[this,e.data,e.ownerTile]);this._destroyImplementation=e.destroy.bind(null,this);this.getImage=e.getImage.bind(null,this);this.getData=e.getData.bind(null,this);this.getRenderedContext=e.getRenderedContext.bind(null,this)}v.prototype={destroy:function(){this._destroyImplementation();this._tiles=null},addTile:function(e){g.console.assert(e,"[ImageRecord.addTile] tile is required");this._tiles.push(e)},removeTile:function(e){for(var t=0;tthis._maxImageCacheCount){var o=null;var r=-1;var s=null;var a,l,h,c,u,d;for(var p=this._tilesLoaded.length-1;0<=p;p--)if(!((a=(d=this._tilesLoaded[p]).tile).level<=t||a.beingDrawn))if(o){c=a.lastTouchTime;l=o.lastTouchTime;u=a.level;h=o.level;if(c=this._items.length)throw new Error("Index bigger than number of layers.");if(t!==i&&-1!==i){this._items.splice(i,1);this._items.splice(t,0,e);this._needsDraw=!0;this.raiseEvent("item-index-change",{item:e,previousIndex:i,newIndex:t})}},removeItem:function(e){g.console.assert(e,"[World.removeItem] item is required");var t=g.indexOf(this._items,e);if(-1!==t){e.removeHandler("bounds-change",this._delegatedFigureSizes);e.removeHandler("clip-change",this._delegatedFigureSizes);e.destroy();this._items.splice(t,1);this._figureSizes();this._needsDraw=!0;this._raiseRemoveItem(e)}},removeAll:function(){this.viewer._cancelPendingImages();var e;var t;for(t=0;td.height?r:r*(d.width/d.height))*(d.height/d.width);d=new g.Point(l+(r-u)/2,h+(r-d)/2);c.setPosition(d,t);c.setWidth(u,t);"horizontal"===i?l+=s:h+=s}this.setAutoRefigureSizes(!0)},_figureSizes:function(){var e=this._homeBounds?this._homeBounds.clone():null;var t=this._contentSize?this._contentSize.clone():null;var i=this._contentFactor||0;if(this._items.length){var n=this._items[0];var o=n.getBounds();this._contentFactor=n.getContentSize().x/o.width;var r=n.getClippedBounds().getBoundingBox();var s=r.x;var a=r.y;var l=r.x+r.width;var h=r.y+r.height;for(var c=1;c{var t={19257:(t,r,e)=>{var n=e(25222),o=e(23120),i=TypeError;t.exports=function(t){if(n(t))return t;throw i(o(t)+" is not a function")}},13834:(t,r,e)=>{var n=e(93722),o=e(23120),i=TypeError;t.exports=function(t){if(n(t))return t;throw i(o(t)+" is not a constructor")}},42193:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(25222),i=String,a=TypeError;t.exports=function(t){if("object"==n(t)||o(t))return t;throw a("Can't set "+i(t)+" as a prototype")}},29690:(t,r,e)=>{var n=e(1386),o=e(63571),i=e(67455).f,a=n("unscopables"),u=Array.prototype;null==u[a]&&i(u,a,{configurable:!0,value:o(null)}),t.exports=function(t){u[a][t]=!0}},67675:(t,r,e)=>{"use strict";var n=e(73832).charAt;t.exports=function(t,r,e){return r+(e?n(t,r).length:1)}},30680:(t,r,e)=>{var n=e(8449),o=TypeError;t.exports=function(t,r){if(n(r,t))return t;throw o("Incorrect invocation")}},86956:(t,r,e)=>{var n=e(42521),o=String,i=TypeError;t.exports=function(t){if(n(t))return t;throw i(o(t)+" is not an object")}},35558:t=>{t.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},65400:(t,r,e)=>{var n=e(72763);t.exports=n((function(){if("function"==typeof ArrayBuffer){var t=new ArrayBuffer(8);Object.isExtensible(t)&&Object.defineProperty(t,"a",{value:8})}}))},44162:(t,r,e)=>{"use strict";var n,o,i,a=e(35558),u=e(37703),s=e(76121),c=e(25222),f=e(42521),l=e(89146),h=e(79538),p=e(23120),v=e(91471),d=e(73918),g=e(3546),y=e(8449),m=e(99366),b=e(86594),x=e(1386),w=e(51735),S=e(2995),E=S.enforce,A=S.get,O=s.Int8Array,R=O&&O.prototype,T=s.Uint8ClampedArray,I=T&&T.prototype,M=O&&m(O),k=R&&m(R),j=Object.prototype,P=s.TypeError,L=x("toStringTag"),C=w("TYPED_ARRAY_TAG"),_="TypedArrayConstructor",N=a&&!!b&&"Opera"!==h(s.opera),U=!1,D={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},F={BigInt64Array:8,BigUint64Array:8},B=function(t){if(!f(t))return!1;var r=h(t);return l(D,r)||l(F,r)};for(n in D)(i=(o=s[n])&&o.prototype)?E(i)[_]=o:N=!1;for(n in F)(i=(o=s[n])&&o.prototype)&&(E(i)[_]=o);if((!N||!c(M)||M===Function.prototype)&&(M=function(){throw P("Incorrect invocation")},N))for(n in D)s[n]&&b(s[n],M);if((!N||!k||k===j)&&(k=M.prototype,N))for(n in D)s[n]&&b(s[n].prototype,k);if(N&&m(I)!==k&&b(I,k),u&&!l(k,L))for(n in U=!0,g(k,L,{configurable:!0,get:function(){return f(this)?this[C]:void 0}}),D)s[n]&&v(s[n],C,n);t.exports={NATIVE_ARRAY_BUFFER_VIEWS:N,TYPED_ARRAY_TAG:U&&C,aTypedArray:function(t){if(B(t))return t;throw P("Target is not a typed array")},aTypedArrayConstructor:function(t){if(c(t)&&(!b||y(M,t)))return t;throw P(p(t)+" is not a typed array constructor")},exportTypedArrayMethod:function(t,r,e,n){if(u){if(e)for(var o in D){var i=s[o];if(i&&l(i.prototype,t))try{delete i.prototype[t]}catch(e){try{i.prototype[t]=r}catch(t){}}}k[t]&&!e||d(k,t,e?r:N&&R[t]||r,n)}},exportTypedArrayStaticMethod:function(t,r,e){var n,o;if(u){if(b){if(e)for(n in D)if((o=s[n])&&l(o,t))try{delete o[t]}catch(t){}if(M[t]&&!e)return;try{return d(M,t,e?r:N&&M[t]||r)}catch(t){}}for(n in D)!(o=s[n])||o[t]&&!e||d(o,t,r)}},getTypedArrayConstructor:function t(r){var e=m(r);if(f(e)){var n=A(e);return n&&l(n,_)?n[_]:t(e)}},isView:function(t){if(!f(t))return!1;var r=h(t);return"DataView"===r||l(D,r)||l(F,r)},isTypedArray:B,TypedArray:M,TypedArrayPrototype:k}},75117:(t,r,e)=>{"use strict";var n=e(76121),o=e(47585),i=e(37703),a=e(35558),u=e(13343),s=e(91471),c=e(3546),f=e(20267),l=e(72763),h=e(30680),p=e(64725),v=e(48331),d=e(35639),g=e(6601),y=e(99366),m=e(86594),b=e(2042).f,x=e(6922),w=e(31280),S=e(54849),E=e(2995),A=u.PROPER,O=u.CONFIGURABLE,R="ArrayBuffer",T="DataView",I="prototype",M="Wrong index",k=E.getterFor(R),j=E.getterFor(T),P=E.set,L=n[R],C=L,_=C&&C[I],N=n[T],U=N&&N[I],D=Object.prototype,F=n.Array,B=n.RangeError,z=o(x),W=o([].reverse),V=g.pack,G=g.unpack,H=function(t){return[255&t]},q=function(t){return[255&t,t>>8&255]},Y=function(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]},$=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},K=function(t){return V(t,23,4)},J=function(t){return V(t,52,8)},X=function(t,r,e){c(t[I],r,{configurable:!0,get:function(){return e(this)[r]}})},Q=function(t,r,e,n){var o=d(e),i=j(t);if(o+r>i.byteLength)throw B(M);var a=i.bytes,u=o+i.byteOffset,s=w(a,u,u+r);return n?s:W(s)},Z=function(t,r,e,n,o,i){var a=d(e),u=j(t);if(a+r>u.byteLength)throw B(M);for(var s=u.bytes,c=a+u.byteOffset,f=n(+o),l=0;lnt;)(rt=et[nt++])in C||s(C,rt,L[rt]);_.constructor=C}m&&y(U)!==D&&m(U,D);var ot=new N(new C(2)),it=o(U.setInt8);ot.setInt8(0,2147483648),ot.setInt8(1,2147483649),!ot.getInt8(0)&&ot.getInt8(1)||f(U,{setInt8:function(t,r){it(this,t,r<<24>>24)},setUint8:function(t,r){it(this,t,r<<24>>24)}},{unsafe:!0})}else _=(C=function(t){h(this,_);var r=d(t);P(this,{type:R,bytes:z(F(r),0),byteLength:r}),i||(this.byteLength=r,this.detached=!1)})[I],U=(N=function(t,r,e){h(this,U),h(t,_);var n=k(t),o=n.byteLength,a=p(r);if(a<0||a>o)throw B("Wrong offset");if(a+(e=void 0===e?o-a:v(e))>o)throw B("Wrong length");P(this,{type:T,buffer:t,byteLength:e,byteOffset:a,bytes:n.bytes}),i||(this.buffer=t,this.byteLength=e,this.byteOffset=a)})[I],i&&(X(C,"byteLength",k),X(N,"buffer",j),X(N,"byteLength",j),X(N,"byteOffset",j)),f(U,{getInt8:function(t){return Q(this,1,t)[0]<<24>>24},getUint8:function(t){return Q(this,1,t)[0]},getInt16:function(t){var r=Q(this,2,t,arguments.length>1?arguments[1]:void 0);return(r[1]<<8|r[0])<<16>>16},getUint16:function(t){var r=Q(this,2,t,arguments.length>1?arguments[1]:void 0);return r[1]<<8|r[0]},getInt32:function(t){return $(Q(this,4,t,arguments.length>1?arguments[1]:void 0))},getUint32:function(t){return $(Q(this,4,t,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(t){return G(Q(this,4,t,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(t){return G(Q(this,8,t,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(t,r){Z(this,1,t,H,r)},setUint8:function(t,r){Z(this,1,t,H,r)},setInt16:function(t,r){Z(this,2,t,q,r,arguments.length>2?arguments[2]:void 0)},setUint16:function(t,r){Z(this,2,t,q,r,arguments.length>2?arguments[2]:void 0)},setInt32:function(t,r){Z(this,4,t,Y,r,arguments.length>2?arguments[2]:void 0)},setUint32:function(t,r){Z(this,4,t,Y,r,arguments.length>2?arguments[2]:void 0)},setFloat32:function(t,r){Z(this,4,t,K,r,arguments.length>2?arguments[2]:void 0)},setFloat64:function(t,r){Z(this,8,t,J,r,arguments.length>2?arguments[2]:void 0)}});S(C,R),S(N,T),t.exports={ArrayBuffer:C,DataView:N}},24579:(t,r,e)=>{"use strict";var n=e(84766),o=e(11588),i=e(25902),a=e(23156),u=Math.min;t.exports=[].copyWithin||function(t,r){var e=n(this),s=i(e),c=o(t,s),f=o(r,s),l=arguments.length>2?arguments[2]:void 0,h=u((void 0===l?s:o(l,s))-f,s-c),p=1;for(f0;)f in e?e[c]=e[f]:a(e,c),c+=p,f+=p;return e}},6922:(t,r,e)=>{"use strict";var n=e(84766),o=e(11588),i=e(25902);t.exports=function(t){for(var r=n(this),e=i(r),a=arguments.length,u=o(a>1?arguments[1]:void 0,e),s=a>2?arguments[2]:void 0,c=void 0===s?e:o(s,e);c>u;)r[u++]=t;return r}},20702:(t,r,e)=>{"use strict";var n=e(25097).forEach,o=e(49719)("forEach");t.exports=o?[].forEach:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}},15078:(t,r,e)=>{var n=e(25902);t.exports=function(t,r){for(var e=0,o=n(r),i=new t(o);o>e;)i[e]=r[e++];return i}},54513:(t,r,e)=>{"use strict";var n=e(43322),o=e(47702),i=e(84766),a=e(95913),u=e(19439),s=e(93722),c=e(25902),f=e(32385),l=e(78977),h=e(85111),p=Array;t.exports=function(t){var r=i(t),e=s(this),v=arguments.length,d=v>1?arguments[1]:void 0,g=void 0!==d;g&&(d=n(d,v>2?arguments[2]:void 0));var y,m,b,x,w,S,E=h(r),A=0;if(!E||this===p&&u(E))for(y=c(r),m=e?new this(y):p(y);y>A;A++)S=g?d(r[A],A):r[A],f(m,A,S);else for(w=(x=l(r,E)).next,m=e?new this:[];!(b=o(w,x)).done;A++)S=g?a(x,d,[b.value,A],!0):b.value,f(m,A,S);return m.length=A,m}},59729:(t,r,e)=>{var n=e(19969),o=e(11588),i=e(25902),a=function(t){return function(r,e,a){var u,s=n(r),c=i(s),f=o(a,c);if(t&&e!=e){for(;c>f;)if((u=s[f++])!=u)return!0}else for(;c>f;f++)if((t||f in s)&&s[f]===e)return t||f||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},51486:(t,r,e)=>{var n=e(43322),o=e(23169),i=e(84766),a=e(25902),u=function(t){var r=1==t;return function(e,u,s){for(var c,f=i(e),l=o(f),h=n(u,s),p=a(l);p-- >0;)if(h(c=l[p],p,f))switch(t){case 0:return c;case 1:return p}return r?-1:void 0}};t.exports={findLast:u(0),findLastIndex:u(1)}},25097:(t,r,e)=>{var n=e(43322),o=e(47585),i=e(23169),a=e(84766),u=e(25902),s=e(48347),c=o([].push),f=function(t){var r=1==t,e=2==t,o=3==t,f=4==t,l=6==t,h=7==t,p=5==t||l;return function(v,d,g,y){for(var m,b,x=a(v),w=i(x),S=n(d,g),E=u(w),A=0,O=y||s,R=r?O(v,E):e||h?O(v,0):void 0;E>A;A++)if((p||A in w)&&(b=S(m=w[A],A,x),t))if(r)R[A]=b;else if(b)switch(t){case 3:return!0;case 5:return m;case 6:return A;case 2:c(R,m)}else switch(t){case 4:return!1;case 7:c(R,m)}return l?-1:o||f?f:R}};t.exports={forEach:f(0),map:f(1),filter:f(2),some:f(3),every:f(4),find:f(5),findIndex:f(6),filterReject:f(7)}},8139:(t,r,e)=>{"use strict";var n=e(79102),o=e(19969),i=e(64725),a=e(25902),u=e(49719),s=Math.min,c=[].lastIndexOf,f=!!c&&1/[1].lastIndexOf(1,-0)<0,l=u("lastIndexOf"),h=f||!l;t.exports=h?function(t){if(f)return n(c,this,arguments)||0;var r=o(this),e=a(r),u=e-1;for(arguments.length>1&&(u=s(u,i(arguments[1]))),u<0&&(u=e+u);u>=0;u--)if(u in r&&r[u]===t)return u||0;return-1}:c},1566:(t,r,e)=>{var n=e(72763),o=e(1386),i=e(56962),a=o("species");t.exports=function(t){return i>=51||!n((function(){var r=[];return(r.constructor={})[a]=function(){return{foo:1}},1!==r[t](Boolean).foo}))}},49719:(t,r,e)=>{"use strict";var n=e(72763);t.exports=function(t,r){var e=[][t];return!!e&&n((function(){e.call(null,r||function(){return 1},1)}))}},59856:(t,r,e)=>{var n=e(19257),o=e(84766),i=e(23169),a=e(25902),u=TypeError,s=function(t){return function(r,e,s,c){n(e);var f=o(r),l=i(f),h=a(f),p=t?h-1:0,v=t?-1:1;if(s<2)for(;;){if(p in l){c=l[p],p+=v;break}if(p+=v,t?p<0:h<=p)throw u("Reduce of empty array with no initial value")}for(;t?p>=0:h>p;p+=v)p in l&&(c=e(c,l[p],p,f));return c}};t.exports={left:s(!1),right:s(!0)}},19506:(t,r,e)=>{"use strict";var n=e(37703),o=e(43964),i=TypeError,a=Object.getOwnPropertyDescriptor,u=n&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(t){return t instanceof TypeError}}();t.exports=u?function(t,r){if(o(t)&&!a(t,"length").writable)throw i("Cannot set read only .length");return t.length=r}:function(t,r){return t.length=r}},31280:(t,r,e)=>{var n=e(11588),o=e(25902),i=e(32385),a=Array,u=Math.max;t.exports=function(t,r,e){for(var s=o(t),c=n(r,s),f=n(void 0===e?s:e,s),l=a(u(f-c,0)),h=0;c{var n=e(47585);t.exports=n([].slice)},33407:(t,r,e)=>{var n=e(31280),o=Math.floor;t.exports=function t(r,e){var i=r.length,a=o(i/2);return i<8?function(t,r){for(var e,n,o=t.length,i=1;i0;)t[n]=t[--n];n!==i++&&(t[n]=e)}return t}(r,e):function(t,r,e,n){for(var o=r.length,i=e.length,a=0,u=0;a{var n=e(43964),o=e(93722),i=e(42521),a=e(1386)("species"),u=Array;t.exports=function(t){var r;return n(t)&&(r=t.constructor,(o(r)&&(r===u||n(r.prototype))||i(r)&&null===(r=r[a]))&&(r=void 0)),void 0===r?u:r}},48347:(t,r,e)=>{var n=e(32021);t.exports=function(t,r){return new(n(t))(0===r?0:r)}},2788:(t,r,e)=>{var n=e(25902);t.exports=function(t,r){for(var e=n(t),o=new r(e),i=0;i{var n=e(25902),o=e(64725),i=RangeError;t.exports=function(t,r,e,a){var u=n(t),s=o(e),c=s<0?u+s:s;if(c>=u||c<0)throw i("Incorrect index");for(var f=new r(u),l=0;l{for(var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e={},n=0;n<66;n++)e[r.charAt(n)]=n;t.exports={itoc:r,ctoi:e}},95913:(t,r,e)=>{var n=e(86956),o=e(94556);t.exports=function(t,r,e,i){try{return i?r(n(e)[0],e[1]):r(e)}catch(r){o(t,"throw",r)}}},4684:(t,r,e)=>{var n=e(1386)("iterator"),o=!1;try{var i=0,a={next:function(){return{done:!!i++}},return:function(){o=!0}};a[n]=function(){return this},Array.from(a,(function(){throw 2}))}catch(t){}t.exports=function(t,r){if(!r&&!o)return!1;var e=!1;try{var i={};i[n]=function(){return{next:function(){return{done:e=!0}}}},t(i)}catch(t){}return e}},42849:(t,r,e)=>{var n=e(47585),o=n({}.toString),i=n("".slice);t.exports=function(t){return i(o(t),8,-1)}},79538:(t,r,e)=>{var n=e(16395),o=e(25222),i=e(42849),a=e(1386)("toStringTag"),u=Object,s="Arguments"==i(function(){return arguments}());t.exports=n?i:function(t){var r,e,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(e=function(t,r){try{return t[r]}catch(t){}}(r=u(t),a))?e:s?i(r):"Object"==(n=i(r))&&o(r.callee)?"Arguments":n}},95365:(t,r,e)=>{"use strict";var n=e(63571),o=e(3546),i=e(20267),a=e(43322),u=e(30680),s=e(29714),c=e(64572),f=e(19173),l=e(36238),h=e(8395),p=e(37703),v=e(9154).fastKey,d=e(2995),g=d.set,y=d.getterFor;t.exports={getConstructor:function(t,r,e,f){var l=t((function(t,o){u(t,h),g(t,{type:r,index:n(null),first:void 0,last:void 0,size:0}),p||(t.size=0),s(o)||c(o,t[f],{that:t,AS_ENTRIES:e})})),h=l.prototype,d=y(r),m=function(t,r,e){var n,o,i=d(t),a=b(t,r);return a?a.value=e:(i.last=a={index:o=v(r,!0),key:r,value:e,previous:n=i.last,next:void 0,removed:!1},i.first||(i.first=a),n&&(n.next=a),p?i.size++:t.size++,"F"!==o&&(i.index[o]=a)),t},b=function(t,r){var e,n=d(t),o=v(r);if("F"!==o)return n.index[o];for(e=n.first;e;e=e.next)if(e.key==r)return e};return i(h,{clear:function(){for(var t=d(this),r=t.index,e=t.first;e;)e.removed=!0,e.previous&&(e.previous=e.previous.next=void 0),delete r[e.index],e=e.next;t.first=t.last=void 0,p?t.size=0:this.size=0},delete:function(t){var r=this,e=d(r),n=b(r,t);if(n){var o=n.next,i=n.previous;delete e.index[n.index],n.removed=!0,i&&(i.next=o),o&&(o.previous=i),e.first==n&&(e.first=o),e.last==n&&(e.last=i),p?e.size--:r.size--}return!!n},forEach:function(t){for(var r,e=d(this),n=a(t,arguments.length>1?arguments[1]:void 0);r=r?r.next:e.first;)for(n(r.value,r.key,this);r&&r.removed;)r=r.previous},has:function(t){return!!b(this,t)}}),i(h,e?{get:function(t){var r=b(this,t);return r&&r.value},set:function(t,r){return m(this,0===t?0:t,r)}}:{add:function(t){return m(this,t=0===t?0:t,t)}}),p&&o(h,"size",{configurable:!0,get:function(){return d(this).size}}),l},setStrong:function(t,r,e){var n=r+" Iterator",o=y(r),i=y(n);f(t,r,(function(t,r){g(this,{type:n,target:t,state:o(t),kind:r,last:void 0})}),(function(){for(var t=i(this),r=t.kind,e=t.last;e&&e.removed;)e=e.previous;return t.target&&(t.last=e=e?e.next:t.state.first)?l("keys"==r?e.key:"values"==r?e.value:[e.key,e.value],!1):(t.target=void 0,l(void 0,!0))}),e?"entries":"values",!e,!0),h(r)}}},59285:(t,r,e)=>{"use strict";var n=e(47585),o=e(20267),i=e(9154).getWeakData,a=e(30680),u=e(86956),s=e(29714),c=e(42521),f=e(64572),l=e(25097),h=e(89146),p=e(2995),v=p.set,d=p.getterFor,g=l.find,y=l.findIndex,m=n([].splice),b=0,x=function(t){return t.frozen||(t.frozen=new w)},w=function(){this.entries=[]},S=function(t,r){return g(t.entries,(function(t){return t[0]===r}))};w.prototype={get:function(t){var r=S(this,t);if(r)return r[1]},has:function(t){return!!S(this,t)},set:function(t,r){var e=S(this,t);e?e[1]=r:this.entries.push([t,r])},delete:function(t){var r=y(this.entries,(function(r){return r[0]===t}));return~r&&m(this.entries,r,1),!!~r}},t.exports={getConstructor:function(t,r,e,n){var l=t((function(t,o){a(t,p),v(t,{type:r,id:b++,frozen:void 0}),s(o)||f(o,t[n],{that:t,AS_ENTRIES:e})})),p=l.prototype,g=d(r),y=function(t,r,e){var n=g(t),o=i(u(r),!0);return!0===o?x(n).set(r,e):o[n.id]=e,t};return o(p,{delete:function(t){var r=g(this);if(!c(t))return!1;var e=i(t);return!0===e?x(r).delete(t):e&&h(e,r.id)&&delete e[r.id]},has:function(t){var r=g(this);if(!c(t))return!1;var e=i(t);return!0===e?x(r).has(t):e&&h(e,r.id)}}),o(p,e?{get:function(t){var r=g(this);if(c(t)){var e=i(t);return!0===e?x(r).get(t):e?e[r.id]:void 0}},set:function(t,r){return y(this,t,r)}}:{add:function(t){return y(this,t,!0)}}),l}}},35246:(t,r,e)=>{"use strict";var n=e(7309),o=e(76121),i=e(47585),a=e(20676),u=e(73918),s=e(9154),c=e(64572),f=e(30680),l=e(25222),h=e(29714),p=e(42521),v=e(72763),d=e(4684),g=e(54849),y=e(31985);t.exports=function(t,r,e){var m=-1!==t.indexOf("Map"),b=-1!==t.indexOf("Weak"),x=m?"set":"add",w=o[t],S=w&&w.prototype,E=w,A={},O=function(t){var r=i(S[t]);u(S,t,"add"==t?function(t){return r(this,0===t?0:t),this}:"delete"==t?function(t){return!(b&&!p(t))&&r(this,0===t?0:t)}:"get"==t?function(t){return b&&!p(t)?void 0:r(this,0===t?0:t)}:"has"==t?function(t){return!(b&&!p(t))&&r(this,0===t?0:t)}:function(t,e){return r(this,0===t?0:t,e),this})};if(a(t,!l(w)||!(b||S.forEach&&!v((function(){(new w).entries().next()})))))E=e.getConstructor(r,t,m,x),s.enable();else if(a(t,!0)){var R=new E,T=R[x](b?{}:-0,1)!=R,I=v((function(){R.has(1)})),M=d((function(t){new w(t)})),k=!b&&v((function(){for(var t=new w,r=5;r--;)t[x](r,r);return!t.has(-0)}));M||((E=r((function(t,r){f(t,S);var e=y(new w,t,E);return h(r)||c(r,e[x],{that:e,AS_ENTRIES:m}),e}))).prototype=S,S.constructor=E),(I||k)&&(O("delete"),O("has"),m&&O("get")),(k||T)&&O(x),b&&S.clear&&delete S.clear}return A[t]=E,n({global:!0,constructor:!0,forced:E!=w},A),g(E,t),b||e.setStrong(E,t,m),E}},94488:(t,r,e)=>{var n=e(89146),o=e(79593),i=e(38769),a=e(67455);t.exports=function(t,r,e){for(var u=o(r),s=a.f,c=i.f,f=0;f{var n=e(1386)("match");t.exports=function(t){var r=/./;try{"/./"[t](r)}catch(e){try{return r[n]=!1,"/./"[t](r)}catch(t){}}return!1}},54264:(t,r,e)=>{var n=e(72763);t.exports=!n((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},8757:(t,r,e)=>{var n=e(47585),o=e(7263),i=e(93710),a=/"/g,u=n("".replace);t.exports=function(t,r,e,n){var s=i(o(t)),c="<"+r;return""!==e&&(c+=" "+e+'="'+u(i(n),a,""")+'"'),c+">"+s+""}},36238:t=>{t.exports=function(t,r){return{value:t,done:r}}},91471:(t,r,e)=>{var n=e(37703),o=e(67455),i=e(5938);t.exports=n?function(t,r,e){return o.f(t,r,i(1,e))}:function(t,r,e){return t[r]=e,t}},5938:t=>{t.exports=function(t,r){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:r}}},32385:(t,r,e)=>{"use strict";var n=e(5224),o=e(67455),i=e(5938);t.exports=function(t,r,e){var a=n(r);a in t?o.f(t,a,i(0,e)):t[a]=e}},59671:(t,r,e)=>{"use strict";var n=e(47585),o=e(72763),i=e(25427).start,a=RangeError,u=isFinite,s=Math.abs,c=Date.prototype,f=c.toISOString,l=n(c.getTime),h=n(c.getUTCDate),p=n(c.getUTCFullYear),v=n(c.getUTCHours),d=n(c.getUTCMilliseconds),g=n(c.getUTCMinutes),y=n(c.getUTCMonth),m=n(c.getUTCSeconds);t.exports=o((function(){return"0385-07-25T07:06:39.999Z"!=f.call(new Date(-50000000000001))}))||!o((function(){f.call(new Date(NaN))}))?function(){if(!u(l(this)))throw a("Invalid time value");var t=this,r=p(t),e=d(t),n=r<0?"-":r>9999?"+":"";return n+i(s(r),n?6:4,0)+"-"+i(y(t)+1,2,0)+"-"+i(h(t),2,0)+"T"+i(v(t),2,0)+":"+i(g(t),2,0)+":"+i(m(t),2,0)+"."+i(e,3,0)+"Z"}:f},83976:(t,r,e)=>{"use strict";var n=e(86956),o=e(1047),i=TypeError;t.exports=function(t){if(n(this),"string"===t||"default"===t)t="string";else if("number"!==t)throw i("Incorrect hint");return o(this,t)}},3546:(t,r,e)=>{var n=e(55076),o=e(67455);t.exports=function(t,r,e){return e.get&&n(e.get,r,{getter:!0}),e.set&&n(e.set,r,{setter:!0}),o.f(t,r,e)}},73918:(t,r,e)=>{var n=e(25222),o=e(67455),i=e(55076),a=e(90699);t.exports=function(t,r,e,u){u||(u={});var s=u.enumerable,c=void 0!==u.name?u.name:r;if(n(e)&&i(e,c,u),u.global)s?t[r]=e:a(r,e);else{try{u.unsafe?t[r]&&(s=!0):delete t[r]}catch(t){}s?t[r]=e:o.f(t,r,{value:e,enumerable:!1,configurable:!u.nonConfigurable,writable:!u.nonWritable})}return t}},20267:(t,r,e)=>{var n=e(73918);t.exports=function(t,r,e){for(var o in r)n(t,o,r[o],e);return t}},90699:(t,r,e)=>{var n=e(76121),o=Object.defineProperty;t.exports=function(t,r){try{o(n,t,{value:r,configurable:!0,writable:!0})}catch(e){n[t]=r}return r}},23156:(t,r,e)=>{"use strict";var n=e(23120),o=TypeError;t.exports=function(t,r){if(!delete t[r])throw o("Cannot delete property "+n(r)+" of "+n(t))}},37703:(t,r,e)=>{var n=e(72763);t.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},60656:t=>{function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}var e="object"==("undefined"==typeof document?"undefined":r(document))&&document.all,n=void 0===e&&void 0!==e;t.exports={all:e,IS_HTMLDDA:n}},6004:(t,r,e)=>{var n=e(76121),o=e(42521),i=n.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},21581:t=>{var r=TypeError;t.exports=function(t){if(t>9007199254740991)throw r("Maximum allowed index exceeded");return t}},5527:t=>{t.exports={IndexSizeError:{s:"INDEX_SIZE_ERR",c:1,m:1},DOMStringSizeError:{s:"DOMSTRING_SIZE_ERR",c:2,m:0},HierarchyRequestError:{s:"HIERARCHY_REQUEST_ERR",c:3,m:1},WrongDocumentError:{s:"WRONG_DOCUMENT_ERR",c:4,m:1},InvalidCharacterError:{s:"INVALID_CHARACTER_ERR",c:5,m:1},NoDataAllowedError:{s:"NO_DATA_ALLOWED_ERR",c:6,m:0},NoModificationAllowedError:{s:"NO_MODIFICATION_ALLOWED_ERR",c:7,m:1},NotFoundError:{s:"NOT_FOUND_ERR",c:8,m:1},NotSupportedError:{s:"NOT_SUPPORTED_ERR",c:9,m:1},InUseAttributeError:{s:"INUSE_ATTRIBUTE_ERR",c:10,m:1},InvalidStateError:{s:"INVALID_STATE_ERR",c:11,m:1},SyntaxError:{s:"SYNTAX_ERR",c:12,m:1},InvalidModificationError:{s:"INVALID_MODIFICATION_ERR",c:13,m:1},NamespaceError:{s:"NAMESPACE_ERR",c:14,m:1},InvalidAccessError:{s:"INVALID_ACCESS_ERR",c:15,m:1},ValidationError:{s:"VALIDATION_ERR",c:16,m:0},TypeMismatchError:{s:"TYPE_MISMATCH_ERR",c:17,m:1},SecurityError:{s:"SECURITY_ERR",c:18,m:1},NetworkError:{s:"NETWORK_ERR",c:19,m:1},AbortError:{s:"ABORT_ERR",c:20,m:1},URLMismatchError:{s:"URL_MISMATCH_ERR",c:21,m:1},QuotaExceededError:{s:"QUOTA_EXCEEDED_ERR",c:22,m:1},TimeoutError:{s:"TIMEOUT_ERR",c:23,m:1},InvalidNodeTypeError:{s:"INVALID_NODE_TYPE_ERR",c:24,m:1},DataCloneError:{s:"DATA_CLONE_ERR",c:25,m:1}}},83729:t=>{t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},72825:(t,r,e)=>{var n=e(6004)("span").classList,o=n&&n.constructor&&n.constructor.prototype;t.exports=o===Object.prototype?void 0:o},45249:(t,r,e)=>{var n=e(58635).match(/firefox\/(\d+)/i);t.exports=!!n&&+n[1]},67729:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(81245),i=e(1441);t.exports=!o&&!i&&"object"==("undefined"==typeof window?"undefined":n(window))&&"object"==("undefined"==typeof document?"undefined":n(document))},3364:t=>{t.exports="function"==typeof Bun&&Bun&&"string"==typeof Bun.version},81245:t=>{function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}t.exports="object"==("undefined"==typeof Deno?"undefined":r(Deno))&&Deno&&"object"==r(Deno.version)},32049:(t,r,e)=>{var n=e(58635);t.exports=/MSIE|Trident/.test(n)},15080:(t,r,e)=>{var n=e(58635);t.exports=/ipad|iphone|ipod/i.test(n)&&"undefined"!=typeof Pebble},60987:(t,r,e)=>{var n=e(58635);t.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},1441:(t,r,e)=>{var n=e(42849);t.exports="undefined"!=typeof process&&"process"==n(process)},53538:(t,r,e)=>{var n=e(58635);t.exports=/web0s(?!.*chrome)/i.test(n)},58635:t=>{t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},56962:(t,r,e)=>{var n,o,i=e(76121),a=e(58635),u=i.process,s=i.Deno,c=u&&u.versions||s&&s.version,f=c&&c.v8;f&&(o=(n=f.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!o&&a&&(!(n=a.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=a.match(/Chrome\/(\d+)/))&&(o=+n[1]),t.exports=o},58998:(t,r,e)=>{var n=e(58635).match(/AppleWebKit\/(\d+)\./);t.exports=!!n&&+n[1]},4251:(t,r,e)=>{var n=e(76121);t.exports=function(t){return n[t].prototype}},64731:t=>{t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},66433:(t,r,e)=>{var n=e(47585),o=Error,i=n("".replace),a=String(o("zxcasd").stack),u=/\n\s*at [^:]*:[^\n]*/,s=u.test(a);t.exports=function(t,r){if(s&&"string"==typeof t&&!o.prepareStackTrace)for(;r--;)t=i(t,u,"");return t}},34281:(t,r,e)=>{var n=e(91471),o=e(66433),i=e(81112),a=Error.captureStackTrace;t.exports=function(t,r,e,u){i&&(a?a(t,r):n(t,"stack",o(e,u)))}},81112:(t,r,e)=>{var n=e(72763),o=e(5938);t.exports=!n((function(){var t=Error("a");return!("stack"in t)||(Object.defineProperty(t,"stack",o(1,7)),7!==t.stack)}))},32447:(t,r,e)=>{"use strict";var n=e(37703),o=e(72763),i=e(86956),a=e(63571),u=e(72434),s=Error.prototype.toString,c=o((function(){if(n){var t=a(Object.defineProperty({},"name",{get:function(){return this===t}}));if("true"!==s.call(t))return!0}return"2: 1"!==s.call({message:1,name:2})||"Error"!==s.call({})}));t.exports=c?function(){var t=i(this),r=u(t.name,"Error"),e=u(t.message);return r?e?r+": "+e:r:e}:s},7309:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(76121),i=e(38769).f,a=e(91471),u=e(73918),s=e(90699),c=e(94488),f=e(20676);t.exports=function(t,r){var e,l,h,p,v,d=t.target,g=t.global,y=t.stat;if(e=g?o:y?o[d]||s(d,{}):(o[d]||{}).prototype)for(l in r){if(p=r[l],h=t.dontCallGetSet?(v=i(e,l))&&v.value:e[l],!f(g?l:d+(y?".":"#")+l,t.forced)&&void 0!==h){if(n(p)==n(h))continue;c(p,h)}(t.sham||h&&h.sham)&&a(p,"sham",!0),u(e,l,p,t)}}},72763:t=>{t.exports=function(t){try{return!!t()}catch(t){return!0}}},1325:(t,r,e)=>{"use strict";e(48775);var n=e(95305),o=e(73918),i=e(73546),a=e(72763),u=e(1386),s=e(91471),c=u("species"),f=RegExp.prototype;t.exports=function(t,r,e,l){var h=u(t),p=!a((function(){var r={};return r[h]=function(){return 7},7!=""[t](r)})),v=p&&!a((function(){var r=!1,e=/a/;return"split"===t&&((e={}).constructor={},e.constructor[c]=function(){return e},e.flags="",e[h]=/./[h]),e.exec=function(){return r=!0,null},e[h](""),!r}));if(!p||!v||e){var d=n(/./[h]),g=r(h,""[t],(function(t,r,e,o,a){var u=n(t),s=r.exec;return s===i||s===f.exec?p&&!a?{done:!0,value:d(r,e,o)}:{done:!0,value:u(e,r,o)}:{done:!1}}));o(String.prototype,t,g[0]),o(f,h,g[1])}l&&s(f[h],"sham",!0)}},25538:(t,r,e)=>{"use strict";var n=e(43964),o=e(25902),i=e(21581),a=e(43322);t.exports=function t(r,e,u,s,c,f,l,h){for(var p,v=c,d=0,g=!!l&&a(l,h);d0&&n(p)?v=t(r,e,p,o(p),v,f-1)-1:(i(v+1),r[v]=p),v++),d++;return v}},91104:(t,r,e)=>{var n=e(72763);t.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},79102:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(54893),i=Function.prototype,a=i.apply,u=i.call;t.exports="object"==("undefined"==typeof Reflect?"undefined":n(Reflect))&&Reflect.apply||(o?u.bind(a):function(){return u.apply(a,arguments)})},43322:(t,r,e)=>{var n=e(95305),o=e(19257),i=e(54893),a=n(n.bind);t.exports=function(t,r){return o(t),void 0===r?t:i?a(t,r):function(){return t.apply(r,arguments)}}},54893:(t,r,e)=>{var n=e(72763);t.exports=!n((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},48659:(t,r,e)=>{"use strict";var n=e(47585),o=e(19257),i=e(42521),a=e(89146),u=e(11939),s=e(54893),c=Function,f=n([].concat),l=n([].join),h={};t.exports=s?c.bind:function(t){var r=o(this),e=r.prototype,n=u(arguments,1),s=function(){var e=f(n,u(arguments));return this instanceof s?function(t,r,e){if(!a(h,r)){for(var n=[],o=0;o{var n=e(54893),o=Function.prototype.call;t.exports=n?o.bind(o):function(){return o.apply(o,arguments)}},13343:(t,r,e)=>{var n=e(37703),o=e(89146),i=Function.prototype,a=n&&Object.getOwnPropertyDescriptor,u=o(i,"name"),s=u&&"something"===function(){}.name,c=u&&(!n||n&&a(i,"name").configurable);t.exports={EXISTS:u,PROPER:s,CONFIGURABLE:c}},82962:(t,r,e)=>{var n=e(47585),o=e(19257);t.exports=function(t,r,e){try{return n(o(Object.getOwnPropertyDescriptor(t,r)[e]))}catch(t){}}},95305:(t,r,e)=>{var n=e(42849),o=e(47585);t.exports=function(t){if("Function"===n(t))return o(t)}},47585:(t,r,e)=>{var n=e(54893),o=Function.prototype,i=o.call,a=n&&o.bind.bind(i,i);t.exports=n?a:function(t){return function(){return i.apply(t,arguments)}}},77642:(t,r,e)=>{var n=e(76121),o=e(25222);t.exports=function(t,r){return arguments.length<2?(e=n[t],o(e)?e:void 0):n[t]&&n[t][r];var e}},85111:(t,r,e)=>{var n=e(79538),o=e(74692),i=e(29714),a=e(23403),u=e(1386)("iterator");t.exports=function(t){if(!i(t))return o(t,u)||o(t,"@@iterator")||a[n(t)]}},78977:(t,r,e)=>{var n=e(47702),o=e(19257),i=e(86956),a=e(23120),u=e(85111),s=TypeError;t.exports=function(t,r){var e=arguments.length<2?u(t):r;if(o(e))return i(n(e,t));throw s(a(t)+" is not iterable")}},80948:(t,r,e)=>{var n=e(47585),o=e(43964),i=e(25222),a=e(42849),u=e(93710),s=n([].push);t.exports=function(t){if(i(t))return t;if(o(t)){for(var r=t.length,e=[],n=0;n{var n=e(19257),o=e(29714);t.exports=function(t,r){var e=t[r];return o(e)?void 0:n(e)}},64008:(t,r,e)=>{var n=e(47585),o=e(84766),i=Math.floor,a=n("".charAt),u=n("".replace),s=n("".slice),c=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,f=/\$([$&'`]|\d{1,2})/g;t.exports=function(t,r,e,n,l,h){var p=e+t.length,v=n.length,d=f;return void 0!==l&&(l=o(l),d=c),u(h,d,(function(o,u){var c;switch(a(u,0)){case"$":return"$";case"&":return t;case"`":return s(r,0,e);case"'":return s(r,p);case"<":c=l[s(u,1,-1)];break;default:var f=+u;if(0===f)return o;if(f>v){var h=i(f/10);return 0===h?o:h<=v?void 0===n[h-1]?a(u,1):n[h-1]+a(u,1):o}c=n[f-1]}return void 0===c?"":c}))}},76121:function(t,r,e){function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=function(t){return t&&t.Math==Math&&t};t.exports=o("object"==("undefined"==typeof globalThis?"undefined":n(globalThis))&&globalThis)||o("object"==("undefined"==typeof window?"undefined":n(window))&&window)||o("object"==("undefined"==typeof self?"undefined":n(self))&&self)||o("object"==(void 0===e.g?"undefined":n(e.g))&&e.g)||function(){return this}()||this||Function("return this")()},89146:(t,r,e)=>{var n=e(47585),o=e(84766),i=n({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,r){return i(o(t),r)}},32048:t=>{t.exports={}},94113:t=>{t.exports=function(t,r){try{1==arguments.length?console.error(t):console.error(t,r)}catch(t){}}},24174:(t,r,e)=>{var n=e(77642);t.exports=n("document","documentElement")},27226:(t,r,e)=>{var n=e(37703),o=e(72763),i=e(6004);t.exports=!n&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},6601:t=>{var r=Array,e=Math.abs,n=Math.pow,o=Math.floor,i=Math.log,a=Math.LN2;t.exports={pack:function(t,u,s){var c,f,l,h=r(s),p=8*s-u-1,v=(1<>1,g=23===u?n(2,-24)-n(2,-77):0,y=t<0||0===t&&1/t<0?1:0,m=0;for((t=e(t))!=t||t===1/0?(f=t!=t?1:0,c=v):(c=o(i(t)/a),t*(l=n(2,-c))<1&&(c--,l*=2),(t+=c+d>=1?g/l:g*n(2,1-d))*l>=2&&(c++,l/=2),c+d>=v?(f=0,c=v):c+d>=1?(f=(t*l-1)*n(2,u),c+=d):(f=t*n(2,d-1)*n(2,u),c=0));u>=8;)h[m++]=255&f,f/=256,u-=8;for(c=c<0;)h[m++]=255&c,c/=256,p-=8;return h[--m]|=128*y,h},unpack:function(t,r){var e,o=t.length,i=8*o-r-1,a=(1<>1,s=i-7,c=o-1,f=t[c--],l=127&f;for(f>>=7;s>0;)l=256*l+t[c--],s-=8;for(e=l&(1<<-s)-1,l>>=-s,s+=r;s>0;)e=256*e+t[c--],s-=8;if(0===l)l=1-u;else{if(l===a)return e?NaN:f?-1/0:1/0;e+=n(2,r),l-=u}return(f?-1:1)*e*n(2,l-r)}}},23169:(t,r,e)=>{var n=e(47585),o=e(72763),i=e(42849),a=Object,u=n("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?u(t,""):a(t)}:a},31985:(t,r,e)=>{var n=e(25222),o=e(42521),i=e(86594);t.exports=function(t,r,e){var a,u;return i&&n(a=r.constructor)&&a!==e&&o(u=a.prototype)&&u!==e.prototype&&i(t,u),t}},99835:(t,r,e)=>{var n=e(47585),o=e(25222),i=e(4682),a=n(Function.toString);o(i.inspectSource)||(i.inspectSource=function(t){return a(t)}),t.exports=i.inspectSource},94547:(t,r,e)=>{var n=e(42521),o=e(91471);t.exports=function(t,r){n(r)&&"cause"in r&&o(t,"cause",r.cause)}},9154:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(7309),i=e(47585),a=e(32048),u=e(42521),s=e(89146),c=e(67455).f,f=e(2042),l=e(2525),h=e(18427),p=e(51735),v=e(91104),d=!1,g=p("meta"),y=0,m=function(t){c(t,g,{value:{objectID:"O"+y++,weakData:{}}})},b=t.exports={enable:function(){b.enable=function(){},d=!0;var t=f.f,r=i([].splice),e={};e[g]=1,t(e).length&&(f.f=function(e){for(var n=t(e),o=0,i=n.length;o{var n,o,i,a=e(93336),u=e(76121),s=e(42521),c=e(91471),f=e(89146),l=e(4682),h=e(52562),p=e(32048),v="Object already initialized",d=u.TypeError,g=u.WeakMap;if(a||l.state){var y=l.state||(l.state=new g);y.get=y.get,y.has=y.has,y.set=y.set,n=function(t,r){if(y.has(t))throw d(v);return r.facade=t,y.set(t,r),r},o=function(t){return y.get(t)||{}},i=function(t){return y.has(t)}}else{var m=h("state");p[m]=!0,n=function(t,r){if(f(t,m))throw d(v);return r.facade=t,c(t,m,r),r},o=function(t){return f(t,m)?t[m]:{}},i=function(t){return f(t,m)}}t.exports={set:n,get:o,has:i,enforce:function(t){return i(t)?o(t):n(t,{})},getterFor:function(t){return function(r){var e;if(!s(r)||(e=o(r)).type!==t)throw d("Incompatible receiver, "+t+" required");return e}}}},19439:(t,r,e)=>{var n=e(1386),o=e(23403),i=n("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||a[i]===t)}},43964:(t,r,e)=>{var n=e(42849);t.exports=Array.isArray||function(t){return"Array"==n(t)}},18049:(t,r,e)=>{var n=e(79538);t.exports=function(t){var r=n(t);return"BigInt64Array"==r||"BigUint64Array"==r}},25222:(t,r,e)=>{var n=e(60656),o=n.all;t.exports=n.IS_HTMLDDA?function(t){return"function"==typeof t||t===o}:function(t){return"function"==typeof t}},93722:(t,r,e)=>{var n=e(47585),o=e(72763),i=e(25222),a=e(79538),u=e(77642),s=e(99835),c=function(){},f=[],l=u("Reflect","construct"),h=/^\s*(?:class|function)\b/,p=n(h.exec),v=!h.exec(c),d=function(t){if(!i(t))return!1;try{return l(c,f,t),!0}catch(t){return!1}},g=function(t){if(!i(t))return!1;switch(a(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return v||!!p(h,s(t))}catch(t){return!0}};g.sham=!0,t.exports=!l||o((function(){var t;return d(d.call)||!d(Object)||!d((function(){t=!0}))||t}))?g:d},28442:(t,r,e)=>{var n=e(89146);t.exports=function(t){return void 0!==t&&(n(t,"value")||n(t,"writable"))}},20676:(t,r,e)=>{var n=e(72763),o=e(25222),i=/#|\.prototype\./,a=function(t,r){var e=s[u(t)];return e==f||e!=c&&(o(r)?n(r):!!r)},u=a.normalize=function(t){return String(t).replace(i,".").toLowerCase()},s=a.data={},c=a.NATIVE="N",f=a.POLYFILL="P";t.exports=a},74495:(t,r,e)=>{var n=e(42521),o=Math.floor;t.exports=Number.isInteger||function(t){return!n(t)&&isFinite(t)&&o(t)===t}},29714:t=>{t.exports=function(t){return null==t}},42521:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(25222),i=e(60656),a=i.all;t.exports=i.IS_HTMLDDA?function(t){return"object"==n(t)?null!==t:o(t)||t===a}:function(t){return"object"==n(t)?null!==t:o(t)}},8451:t=>{t.exports=!1},16272:(t,r,e)=>{var n=e(42521),o=e(42849),i=e(1386)("match");t.exports=function(t){var r;return n(t)&&(void 0!==(r=t[i])?!!r:"RegExp"==o(t))}},5057:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(77642),i=e(25222),a=e(8449),u=e(42020),s=Object;t.exports=u?function(t){return"symbol"==n(t)}:function(t){var r=o("Symbol");return i(r)&&a(r.prototype,s(t))}},64572:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(43322),i=e(47702),a=e(86956),u=e(23120),s=e(19439),c=e(25902),f=e(8449),l=e(78977),h=e(85111),p=e(94556),v=TypeError,d=function(t,r){this.stopped=t,this.result=r},g=d.prototype;t.exports=function(t,r,e){var y,m,b,x,w,S,E,A=e&&e.that,O=!(!e||!e.AS_ENTRIES),R=!(!e||!e.IS_RECORD),T=!(!e||!e.IS_ITERATOR),I=!(!e||!e.INTERRUPTED),M=o(r,A),k=function(t){return y&&p(y,"normal",t),new d(!0,t)},j=function(t){return O?(a(t),I?M(t[0],t[1],k):M(t[0],t[1])):I?M(t,k):M(t)};if(R)y=t.iterator;else if(T)y=t;else{if(!(m=h(t)))throw v(u(t)+" is not iterable");if(s(m)){for(b=0,x=c(t);x>b;b++)if((w=j(t[b]))&&f(g,w))return w;return new d(!1)}y=l(t,m)}for(S=R?t.next:y.next;!(E=i(S,y)).done;){try{w=j(E.value)}catch(t){p(y,"throw",t)}if("object"==n(w)&&w&&f(g,w))return w}return new d(!1)}},94556:(t,r,e)=>{var n=e(47702),o=e(86956),i=e(74692);t.exports=function(t,r,e){var a,u;o(t);try{if(!(a=i(t,"return"))){if("throw"===r)throw e;return e}a=n(a,t)}catch(t){u=!0,a=t}if("throw"===r)throw e;if(u)throw a;return o(a),e}},720:(t,r,e)=>{"use strict";var n=e(94109).IteratorPrototype,o=e(63571),i=e(5938),a=e(54849),u=e(23403),s=function(){return this};t.exports=function(t,r,e,c){var f=r+" Iterator";return t.prototype=o(n,{next:i(+!c,e)}),a(t,f,!1,!0),u[f]=s,t}},19173:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(8451),a=e(13343),u=e(25222),s=e(720),c=e(99366),f=e(86594),l=e(54849),h=e(91471),p=e(73918),v=e(1386),d=e(23403),g=e(94109),y=a.PROPER,m=a.CONFIGURABLE,b=g.IteratorPrototype,x=g.BUGGY_SAFARI_ITERATORS,w=v("iterator"),S="keys",E="values",A="entries",O=function(){return this};t.exports=function(t,r,e,a,v,g,R){s(e,r,a);var T,I,M,k=function(t){if(t===v&&_)return _;if(!x&&t in L)return L[t];switch(t){case S:case E:case A:return function(){return new e(this,t)}}return function(){return new e(this)}},j=r+" Iterator",P=!1,L=t.prototype,C=L[w]||L["@@iterator"]||v&&L[v],_=!x&&C||k(v),N="Array"==r&&L.entries||C;if(N&&(T=c(N.call(new t)))!==Object.prototype&&T.next&&(i||c(T)===b||(f?f(T,b):u(T[w])||p(T,w,O)),l(T,j,!0,!0),i&&(d[j]=O)),y&&v==E&&C&&C.name!==E&&(!i&&m?h(L,"name",E):(P=!0,_=function(){return o(C,this)})),v)if(I={values:k(E),keys:g?_:k(S),entries:k(A)},R)for(M in I)(x||P||!(M in L))&&p(L,M,I[M]);else n({target:r,proto:!0,forced:x||P},I);return i&&!R||L[w]===_||p(L,w,_,{name:v}),d[r]=_,I}},94109:(t,r,e)=>{"use strict";var n,o,i,a=e(72763),u=e(25222),s=e(42521),c=e(63571),f=e(99366),l=e(73918),h=e(1386),p=e(8451),v=h("iterator"),d=!1;[].keys&&("next"in(i=[].keys())?(o=f(f(i)))!==Object.prototype&&(n=o):d=!0),!s(n)||a((function(){var t={};return n[v].call(t)!==t}))?n={}:p&&(n=c(n)),u(n[v])||l(n,v,(function(){return this})),t.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:d}},23403:t=>{t.exports={}},25902:(t,r,e)=>{var n=e(48331);t.exports=function(t){return n(t.length)}},55076:(t,r,e)=>{var n=e(47585),o=e(72763),i=e(25222),a=e(89146),u=e(37703),s=e(13343).CONFIGURABLE,c=e(99835),f=e(2995),l=f.enforce,h=f.get,p=String,v=Object.defineProperty,d=n("".slice),g=n("".replace),y=n([].join),m=u&&!o((function(){return 8!==v((function(){}),"length",{value:8}).length})),b=String(String).split("String"),x=t.exports=function(t,r,e){"Symbol("===d(p(r),0,7)&&(r="["+g(p(r),/^Symbol\(([^)]*)\)/,"$1")+"]"),e&&e.getter&&(r="get "+r),e&&e.setter&&(r="set "+r),(!a(t,"name")||s&&t.name!==r)&&(u?v(t,"name",{value:r,configurable:!0}):t.name=r),m&&e&&a(e,"arity")&&t.length!==e.arity&&v(t,"length",{value:e.arity});try{e&&a(e,"constructor")&&e.constructor?u&&v(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var n=l(t);return a(n,"source")||(n.source=y(b,"string"==typeof r?r:"")),t};Function.prototype.toString=x((function(){return i(this)&&h(this).source||c(this)}),"toString")},5774:(t,r,e)=>{var n=e(47585),o=Map.prototype;t.exports={Map,set:n(o.set),get:n(o.get),has:n(o.has),remove:n(o.delete),proto:o}},89188:t=>{var r=Math.expm1,e=Math.exp;t.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||-2e-17!=r(-2e-17)?function(t){var r=+t;return 0==r?r:r>-1e-6&&r<1e-6?r+r*r/2:e(r)-1}:r},63094:(t,r,e)=>{var n=e(4380),o=Math.abs,i=Math.pow,a=i(2,-52),u=i(2,-23),s=i(2,127)*(2-u),c=i(2,-126);t.exports=Math.fround||function(t){var r,e,i=+t,f=o(i),l=n(i);return fs||e!=e?l*(1/0):l*e}},72199:t=>{var r=Math.log,e=Math.LOG10E;t.exports=Math.log10||function(t){return r(t)*e}},39370:t=>{var r=Math.log;t.exports=Math.log1p||function(t){var e=+t;return e>-1e-8&&e<1e-8?e-e*e/2:r(1+e)}},4380:t=>{t.exports=Math.sign||function(t){var r=+t;return 0==r||r!=r?r:r<0?-1:1}},26360:t=>{var r=Math.ceil,e=Math.floor;t.exports=Math.trunc||function(t){var n=+t;return(n>0?e:r)(n)}},26745:(t,r,e)=>{var n,o,i,a,u,s=e(76121),c=e(43322),f=e(38769).f,l=e(94825).set,h=e(60405),p=e(60987),v=e(15080),d=e(53538),g=e(1441),y=s.MutationObserver||s.WebKitMutationObserver,m=s.document,b=s.process,x=s.Promise,w=f(s,"queueMicrotask"),S=w&&w.value;if(!S){var E=new h,A=function(){var t,r;for(g&&(t=b.domain)&&t.exit();r=E.get();)try{r()}catch(t){throw E.head&&n(),t}t&&t.enter()};p||g||d||!y||!m?!v&&x&&x.resolve?((a=x.resolve(void 0)).constructor=x,u=c(a.then,a),n=function(){u(A)}):g?n=function(){b.nextTick(A)}:(l=c(l,s),n=function(){l(A)}):(o=!0,i=m.createTextNode(""),new y(A).observe(i,{characterData:!0}),n=function(){i.data=o=!o}),S=function(t){E.head||n(),E.add(t)}}t.exports=S},40500:(t,r,e)=>{"use strict";var n=e(19257),o=TypeError,i=function(t){var r,e;this.promise=new t((function(t,n){if(void 0!==r||void 0!==e)throw o("Bad Promise constructor");r=t,e=n})),this.resolve=n(r),this.reject=n(e)};t.exports.f=function(t){return new i(t)}},72434:(t,r,e)=>{var n=e(93710);t.exports=function(t,r){return void 0===t?arguments.length<2?"":r:n(t)}},11330:(t,r,e)=>{var n=e(16272),o=TypeError;t.exports=function(t){if(n(t))throw o("The method doesn't accept regular expressions");return t}},30097:(t,r,e)=>{var n=e(76121).isFinite;t.exports=Number.isFinite||function(t){return"number"==typeof t&&n(t)}},30706:(t,r,e)=>{var n=e(76121),o=e(72763),i=e(47585),a=e(93710),u=e(36842).trim,s=e(82350),c=i("".charAt),f=n.parseFloat,l=n.Symbol,h=l&&l.iterator,p=1/f(s+"-0")!=-1/0||h&&!o((function(){f(Object(h))}));t.exports=p?function(t){var r=u(a(t)),e=f(r);return 0===e&&"-"==c(r,0)?-0:e}:f},92437:(t,r,e)=>{var n=e(76121),o=e(72763),i=e(47585),a=e(93710),u=e(36842).trim,s=e(82350),c=n.parseInt,f=n.Symbol,l=f&&f.iterator,h=/^[+-]?0x/i,p=i(h.exec),v=8!==c(s+"08")||22!==c(s+"0x16")||l&&!o((function(){c(Object(l))}));t.exports=v?function(t,r){var e=u(a(t));return c(e,r>>>0||(p(h,e)?16:10))}:c},81179:(t,r,e)=>{"use strict";var n=e(37703),o=e(47585),i=e(47702),a=e(72763),u=e(31792),s=e(92719),c=e(77751),f=e(84766),l=e(23169),h=Object.assign,p=Object.defineProperty,v=o([].concat);t.exports=!h||a((function(){if(n&&1!==h({b:1},h(p({},"a",{enumerable:!0,get:function(){p(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},r={},e=Symbol(),o="abcdefghijklmnopqrst";return t[e]=7,o.split("").forEach((function(t){r[t]=t})),7!=h({},t)[e]||u(h({},r)).join("")!=o}))?function(t,r){for(var e=f(t),o=arguments.length,a=1,h=s.f,p=c.f;o>a;)for(var d,g=l(arguments[a++]),y=h?v(u(g),h(g)):u(g),m=y.length,b=0;m>b;)d=y[b++],n&&!i(p,g,d)||(e[d]=g[d]);return e}:h},63571:(t,r,e)=>{var n,o=e(86956),i=e(37532),a=e(64731),u=e(32048),s=e(24174),c=e(6004),f=e(52562),l="prototype",h="script",p=f("IE_PROTO"),v=function(){},d=function(t){return"<"+h+">"+t+""},g=function(t){t.write(d("")),t.close();var r=t.parentWindow.Object;return t=null,r},y=function(){try{n=new ActiveXObject("htmlfile")}catch(t){}var t,r,e;y="undefined"!=typeof document?document.domain&&n?g(n):(r=c("iframe"),e="java"+h+":",r.style.display="none",s.appendChild(r),r.src=String(e),(t=r.contentWindow.document).open(),t.write(d("document.F=Object")),t.close(),t.F):g(n);for(var o=a.length;o--;)delete y[l][a[o]];return y()};u[p]=!0,t.exports=Object.create||function(t,r){var e;return null!==t?(v[l]=o(t),e=new v,v[l]=null,e[p]=t):e=y(),void 0===r?e:i.f(e,r)}},37532:(t,r,e)=>{var n=e(37703),o=e(24064),i=e(67455),a=e(86956),u=e(19969),s=e(31792);r.f=n&&!o?Object.defineProperties:function(t,r){a(t);for(var e,n=u(r),o=s(r),c=o.length,f=0;c>f;)i.f(t,e=o[f++],n[e]);return t}},67455:(t,r,e)=>{var n=e(37703),o=e(27226),i=e(24064),a=e(86956),u=e(5224),s=TypeError,c=Object.defineProperty,f=Object.getOwnPropertyDescriptor,l="enumerable",h="configurable",p="writable";r.f=n?i?function(t,r,e){if(a(t),r=u(r),a(e),"function"==typeof t&&"prototype"===r&&"value"in e&&p in e&&!e[p]){var n=f(t,r);n&&n[p]&&(t[r]=e.value,e={configurable:h in e?e[h]:n[h],enumerable:l in e?e[l]:n[l],writable:!1})}return c(t,r,e)}:c:function(t,r,e){if(a(t),r=u(r),a(e),o)try{return c(t,r,e)}catch(t){}if("get"in e||"set"in e)throw s("Accessors not supported");return"value"in e&&(t[r]=e.value),t}},38769:(t,r,e)=>{var n=e(37703),o=e(47702),i=e(77751),a=e(5938),u=e(19969),s=e(5224),c=e(89146),f=e(27226),l=Object.getOwnPropertyDescriptor;r.f=n?l:function(t,r){if(t=u(t),r=s(r),f)try{return l(t,r)}catch(t){}if(c(t,r))return a(!o(i.f,t,r),t[r])}},2525:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(42849),i=e(19969),a=e(2042).f,u=e(31280),s="object"==("undefined"==typeof window?"undefined":n(window))&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return s&&"Window"==o(t)?function(t){try{return a(t)}catch(t){return u(s)}}(t):a(i(t))}},2042:(t,r,e)=>{var n=e(83224),o=e(64731).concat("length","prototype");r.f=Object.getOwnPropertyNames||function(t){return n(t,o)}},92719:(t,r)=>{r.f=Object.getOwnPropertySymbols},99366:(t,r,e)=>{var n=e(89146),o=e(25222),i=e(84766),a=e(52562),u=e(54264),s=a("IE_PROTO"),c=Object,f=c.prototype;t.exports=u?c.getPrototypeOf:function(t){var r=i(t);if(n(r,s))return r[s];var e=r.constructor;return o(e)&&r instanceof e?e.prototype:r instanceof c?f:null}},18427:(t,r,e)=>{var n=e(72763),o=e(42521),i=e(42849),a=e(65400),u=Object.isExtensible,s=n((function(){u(1)}));t.exports=s||a?function(t){return!!o(t)&&(!a||"ArrayBuffer"!=i(t))&&(!u||u(t))}:u},8449:(t,r,e)=>{var n=e(47585);t.exports=n({}.isPrototypeOf)},83224:(t,r,e)=>{var n=e(47585),o=e(89146),i=e(19969),a=e(59729).indexOf,u=e(32048),s=n([].push);t.exports=function(t,r){var e,n=i(t),c=0,f=[];for(e in n)!o(u,e)&&o(n,e)&&s(f,e);for(;r.length>c;)o(n,e=r[c++])&&(~a(f,e)||s(f,e));return f}},31792:(t,r,e)=>{var n=e(83224),o=e(64731);t.exports=Object.keys||function(t){return n(t,o)}},77751:(t,r)=>{"use strict";var e={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,o=n&&!e.call({1:2},1);r.f=o?function(t){var r=n(this,t);return!!r&&r.enumerable}:e},94926:(t,r,e)=>{"use strict";var n=e(8451),o=e(76121),i=e(72763),a=e(58998);t.exports=n||!i((function(){if(!(a&&a<535)){var t=Math.random();__defineSetter__.call(null,t,(function(){})),delete o[t]}}))},86594:(t,r,e)=>{var n=e(82962),o=e(86956),i=e(42193);t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,r=!1,e={};try{(t=n(Object.prototype,"__proto__","set"))(e,[]),r=e instanceof Array}catch(t){}return function(e,n){return o(e),i(n),r?t(e,n):e.__proto__=n,e}}():void 0)},90962:(t,r,e)=>{var n=e(37703),o=e(72763),i=e(47585),a=e(99366),u=e(31792),s=e(19969),c=i(e(77751).f),f=i([].push),l=n&&o((function(){var t=Object.create(null);return t[2]=2,!c(t,2)})),h=function(t){return function(r){for(var e,o=s(r),i=u(o),h=l&&null===a(o),p=i.length,v=0,d=[];p>v;)e=i[v++],n&&!(h?e in o:c(o,e))||f(d,t?[e,o[e]]:o[e]);return d}};t.exports={entries:h(!0),values:h(!1)}},5739:(t,r,e)=>{"use strict";var n=e(16395),o=e(79538);t.exports=n?{}.toString:function(){return"[object "+o(this)+"]"}},1047:(t,r,e)=>{var n=e(47702),o=e(25222),i=e(42521),a=TypeError;t.exports=function(t,r){var e,u;if("string"===r&&o(e=t.toString)&&!i(u=n(e,t)))return u;if(o(e=t.valueOf)&&!i(u=n(e,t)))return u;if("string"!==r&&o(e=t.toString)&&!i(u=n(e,t)))return u;throw a("Can't convert object to primitive value")}},79593:(t,r,e)=>{var n=e(77642),o=e(47585),i=e(2042),a=e(92719),u=e(86956),s=o([].concat);t.exports=n("Reflect","ownKeys")||function(t){var r=i.f(u(t)),e=a.f;return e?s(r,e(t)):r}},1035:(t,r,e)=>{var n=e(76121);t.exports=n},80224:t=>{t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},62676:(t,r,e)=>{var n=e(76121),o=e(19267),i=e(25222),a=e(20676),u=e(99835),s=e(1386),c=e(67729),f=e(81245),l=e(8451),h=e(56962),p=o&&o.prototype,v=s("species"),d=!1,g=i(n.PromiseRejectionEvent),y=a("Promise",(function(){var t=u(o),r=t!==String(o);if(!r&&66===h)return!0;if(l&&(!p.catch||!p.finally))return!0;if(!h||h<51||!/native code/.test(t)){var e=new o((function(t){t(1)})),n=function(t){t((function(){}),(function(){}))};if((e.constructor={})[v]=n,!(d=e.then((function(){}))instanceof n))return!0}return!r&&(c||f)&&!g}));t.exports={CONSTRUCTOR:y,REJECTION_EVENT:g,SUBCLASSING:d}},19267:(t,r,e)=>{var n=e(76121);t.exports=n.Promise},3722:(t,r,e)=>{var n=e(86956),o=e(42521),i=e(40500);t.exports=function(t,r){if(n(t),o(r)&&r.constructor===t)return r;var e=i.f(t);return(0,e.resolve)(r),e.promise}},59942:(t,r,e)=>{var n=e(19267),o=e(4684),i=e(62676).CONSTRUCTOR;t.exports=i||!o((function(t){n.all(t).then(void 0,(function(){}))}))},21228:(t,r,e)=>{var n=e(67455).f;t.exports=function(t,r,e){e in t||n(t,e,{configurable:!0,get:function(){return r[e]},set:function(t){r[e]=t}})}},60405:t=>{var r=function(){this.head=null,this.tail=null};r.prototype={add:function(t){var r={item:t,next:null},e=this.tail;e?e.next=r:this.head=r,this.tail=r},get:function(){var t=this.head;if(t)return null===(this.head=t.next)&&(this.tail=null),t.item}},t.exports=r},1750:(t,r,e)=>{var n=e(47702),o=e(86956),i=e(25222),a=e(42849),u=e(73546),s=TypeError;t.exports=function(t,r){var e=t.exec;if(i(e)){var c=n(e,t,r);return null!==c&&o(c),c}if("RegExp"===a(t))return n(u,t,r);throw s("RegExp#exec called on incompatible receiver")}},73546:(t,r,e)=>{"use strict";var n,o,i=e(47702),a=e(47585),u=e(93710),s=e(1346),c=e(65443),f=e(30896),l=e(63571),h=e(2995).get,p=e(24750),v=e(30477),d=f("native-string-replace",String.prototype.replace),g=RegExp.prototype.exec,y=g,m=a("".charAt),b=a("".indexOf),x=a("".replace),w=a("".slice),S=(o=/b*/g,i(g,n=/a/,"a"),i(g,o,"a"),0!==n.lastIndex||0!==o.lastIndex),E=c.BROKEN_CARET,A=void 0!==/()??/.exec("")[1];(S||A||E||p||v)&&(y=function(t){var r,e,n,o,a,c,f,p=this,v=h(p),O=u(t),R=v.raw;if(R)return R.lastIndex=p.lastIndex,r=i(y,R,O),p.lastIndex=R.lastIndex,r;var T=v.groups,I=E&&p.sticky,M=i(s,p),k=p.source,j=0,P=O;if(I&&(M=x(M,"y",""),-1===b(M,"g")&&(M+="g"),P=w(O,p.lastIndex),p.lastIndex>0&&(!p.multiline||p.multiline&&"\n"!==m(O,p.lastIndex-1))&&(k="(?: "+k+")",P=" "+P,j++),e=new RegExp("^(?:"+k+")",M)),A&&(e=new RegExp("^"+k+"$(?!\\s)",M)),S&&(n=p.lastIndex),o=i(g,I?e:p,P),I?o?(o.input=w(o.input,j),o[0]=w(o[0],j),o.index=p.lastIndex,p.lastIndex+=o[0].length):p.lastIndex=0:S&&o&&(p.lastIndex=p.global?o.index+o[0].length:n),A&&o&&o.length>1&&i(d,o[0],e,(function(){for(a=1;a{"use strict";var n=e(86956);t.exports=function(){var t=n(this),r="";return t.hasIndices&&(r+="d"),t.global&&(r+="g"),t.ignoreCase&&(r+="i"),t.multiline&&(r+="m"),t.dotAll&&(r+="s"),t.unicode&&(r+="u"),t.unicodeSets&&(r+="v"),t.sticky&&(r+="y"),r}},26752:(t,r,e)=>{var n=e(47702),o=e(89146),i=e(8449),a=e(1346),u=RegExp.prototype;t.exports=function(t){var r=t.flags;return void 0!==r||"flags"in u||o(t,"flags")||!i(u,t)?r:n(a,t)}},65443:(t,r,e)=>{var n=e(72763),o=e(76121).RegExp,i=n((function(){var t=o("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),a=i||n((function(){return!o("a","y").sticky})),u=i||n((function(){var t=o("^r","gy");return t.lastIndex=2,null!=t.exec("str")}));t.exports={BROKEN_CARET:u,MISSED_STICKY:a,UNSUPPORTED_Y:i}},24750:(t,r,e)=>{var n=e(72763),o=e(76121).RegExp;t.exports=n((function(){var t=o(".","s");return!(t.dotAll&&t.exec("\n")&&"s"===t.flags)}))},30477:(t,r,e)=>{var n=e(72763),o=e(76121).RegExp;t.exports=n((function(){var t=o("(?b)","g");return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$c")}))},7263:(t,r,e)=>{var n=e(29714),o=TypeError;t.exports=function(t){if(n(t))throw o("Can't call method on "+t);return t}},17162:t=>{t.exports=Object.is||function(t,r){return t===r?0!==t||1/t==1/r:t!=t&&r!=r}},79308:(t,r,e)=>{"use strict";var n,o=e(76121),i=e(79102),a=e(25222),u=e(3364),s=e(58635),c=e(11939),f=e(40699),l=o.Function,h=/MSIE .\./.test(s)||u&&((n=o.Bun.version.split(".")).length<3||0==n[0]&&(n[1]<3||3==n[1]&&0==n[2]));t.exports=function(t,r){var e=r?2:1;return h?function(n,o){var u=f(arguments.length,1)>e,s=a(n)?n:l(n),h=u?c(arguments,e):[],p=u?function(){i(s,this,h)}:s;return r?t(p,o):t(p)}:t}},18779:(t,r,e)=>{var n=e(47585),o=Set.prototype;t.exports={Set,add:n(o.add),has:n(o.has),remove:n(o.delete),proto:o}},8395:(t,r,e)=>{"use strict";var n=e(77642),o=e(3546),i=e(1386),a=e(37703),u=i("species");t.exports=function(t){var r=n(t);a&&r&&!r[u]&&o(r,u,{configurable:!0,get:function(){return this}})}},54849:(t,r,e)=>{var n=e(67455).f,o=e(89146),i=e(1386)("toStringTag");t.exports=function(t,r,e){t&&!e&&(t=t.prototype),t&&!o(t,i)&&n(t,i,{configurable:!0,value:r})}},52562:(t,r,e)=>{var n=e(30896),o=e(51735),i=n("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},4682:(t,r,e)=>{var n=e(76121),o=e(90699),i="__core-js_shared__",a=n[i]||o(i,{});t.exports=a},30896:(t,r,e)=>{var n=e(8451),o=e(4682);(t.exports=function(t,r){return o[t]||(o[t]=void 0!==r?r:{})})("versions",[]).push({version:"3.31.0",mode:n?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.31.0/LICENSE",source:"https://github.com/zloirock/core-js"})},18159:(t,r,e)=>{var n=e(86956),o=e(13834),i=e(29714),a=e(1386)("species");t.exports=function(t,r){var e,u=n(t).constructor;return void 0===u||i(e=n(u)[a])?r:o(e)}},53710:(t,r,e)=>{var n=e(72763);t.exports=function(t){return n((function(){var r=""[t]('"');return r!==r.toLowerCase()||r.split('"').length>3}))}},73832:(t,r,e)=>{var n=e(47585),o=e(64725),i=e(93710),a=e(7263),u=n("".charAt),s=n("".charCodeAt),c=n("".slice),f=function(t){return function(r,e){var n,f,l=i(a(r)),h=o(e),p=l.length;return h<0||h>=p?t?"":void 0:(n=s(l,h))<55296||n>56319||h+1===p||(f=s(l,h+1))<56320||f>57343?t?u(l,h):n:t?c(l,h,h+2):f-56320+(n-55296<<10)+65536}};t.exports={codeAt:f(!1),charAt:f(!0)}},32411:(t,r,e)=>{var n=e(58635);t.exports=/Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(n)},25427:(t,r,e)=>{var n=e(47585),o=e(48331),i=e(93710),a=e(59549),u=e(7263),s=n(a),c=n("".slice),f=Math.ceil,l=function(t){return function(r,e,n){var a,l,h=i(u(r)),p=o(e),v=h.length,d=void 0===n?" ":i(n);return p<=v||""==d?h:((l=s(d,f((a=p-v)/d.length))).length>a&&(l=c(l,0,a)),t?h+l:l+h)}};t.exports={start:l(!1),end:l(!0)}},81025:(t,r,e)=>{var n=e(47585),o=2147483647,i=/[^\0-\u007E]/,a=/[.\u3002\uFF0E\uFF61]/g,u="Overflow: input needs wider integers to process",s=RangeError,c=n(a.exec),f=Math.floor,l=String.fromCharCode,h=n("".charCodeAt),p=n([].join),v=n([].push),d=n("".replace),g=n("".split),y=n("".toLowerCase),m=function(t){return t+22+75*(t<26)},b=function(t,r,e){var n=0;for(t=e?f(t/700):t>>1,t+=f(t/r);t>455;)t=f(t/35),n+=36;return f(n+36*t/(t+38))},x=function(t){var r=[];t=function(t){for(var r=[],e=0,n=t.length;e=55296&&o<=56319&&e=a&&nf((o-c)/w))throw s(u);for(c+=(x-a)*w,a=x,e=0;eo)throw s(u);if(n==a){for(var S=c,E=36;;){var A=E<=d?1:E>=d+26?26:E-d;if(S{"use strict";var n=e(64725),o=e(93710),i=e(7263),a=RangeError;t.exports=function(t){var r=o(i(this)),e="",u=n(t);if(u<0||u==1/0)throw a("Wrong number of repetitions");for(;u>0;(u>>>=1)&&(r+=r))1&u&&(e+=r);return e}},14946:(t,r,e)=>{"use strict";var n=e(36842).end,o=e(9756);t.exports=o("trimEnd")?function(){return n(this)}:"".trimEnd},9756:(t,r,e)=>{var n=e(13343).PROPER,o=e(72763),i=e(82350);t.exports=function(t){return o((function(){return!!i[t]()||"​…᠎"!=="​…᠎"[t]()||n&&i[t].name!==t}))}},26941:(t,r,e)=>{"use strict";var n=e(36842).start,o=e(9756);t.exports=o("trimStart")?function(){return n(this)}:"".trimStart},36842:(t,r,e)=>{var n=e(47585),o=e(7263),i=e(93710),a=e(82350),u=n("".replace),s=RegExp("^["+a+"]+"),c=RegExp("(^|[^"+a+"])["+a+"]+$"),f=function(t){return function(r){var e=i(o(r));return 1&t&&(e=u(e,s,"")),2&t&&(e=u(e,c,"$1")),e}};t.exports={start:f(1),end:f(2),trim:f(3)}},79020:(t,r,e)=>{var n=e(76121),o=e(72763),i=e(56962),a=e(67729),u=e(81245),s=e(1441),c=n.structuredClone;t.exports=!!c&&!o((function(){if(u&&i>92||s&&i>94||a&&i>97)return!1;var t=new ArrayBuffer(8),r=c(t,{transfer:[t]});return 0!=t.byteLength||8!=r.byteLength}))},80859:(t,r,e)=>{var n=e(56962),o=e(72763),i=e(76121).String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol();return!i(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},51981:(t,r,e)=>{var n=e(47702),o=e(77642),i=e(1386),a=e(73918);t.exports=function(){var t=o("Symbol"),r=t&&t.prototype,e=r&&r.valueOf,u=i("toPrimitive");r&&!r[u]&&a(r,u,(function(t){return n(e,this)}),{arity:1})}},33956:(t,r,e)=>{var n=e(80859);t.exports=n&&!!Symbol.for&&!!Symbol.keyFor},94825:(t,r,e)=>{var n,o,i,a,u=e(76121),s=e(79102),c=e(43322),f=e(25222),l=e(89146),h=e(72763),p=e(24174),v=e(11939),d=e(6004),g=e(40699),y=e(60987),m=e(1441),b=u.setImmediate,x=u.clearImmediate,w=u.process,S=u.Dispatch,E=u.Function,A=u.MessageChannel,O=u.String,R=0,T={},I="onreadystatechange";h((function(){n=u.location}));var M=function(t){if(l(T,t)){var r=T[t];delete T[t],r()}},k=function(t){return function(){M(t)}},j=function(t){M(t.data)},P=function(t){u.postMessage(O(t),n.protocol+"//"+n.host)};b&&x||(b=function(t){g(arguments.length,1);var r=f(t)?t:E(t),e=v(arguments,1);return T[++R]=function(){s(r,void 0,e)},o(R),R},x=function(t){delete T[t]},m?o=function(t){w.nextTick(k(t))}:S&&S.now?o=function(t){S.now(k(t))}:A&&!y?(a=(i=new A).port2,i.port1.onmessage=j,o=c(a.postMessage,a)):u.addEventListener&&f(u.postMessage)&&!u.importScripts&&n&&"file:"!==n.protocol&&!h(P)?(o=P,u.addEventListener("message",j,!1)):o=I in d("script")?function(t){p.appendChild(d("script"))[I]=function(){p.removeChild(this),M(t)}}:function(t){setTimeout(k(t),0)}),t.exports={set:b,clear:x}},40262:(t,r,e)=>{var n=e(47585);t.exports=n(1..valueOf)},11588:(t,r,e)=>{var n=e(64725),o=Math.max,i=Math.min;t.exports=function(t,r){var e=n(t);return e<0?o(e+r,0):i(e,r)}},2321:(t,r,e)=>{var n=e(40687),o=TypeError;t.exports=function(t){var r=n(t,"number");if("number"==typeof r)throw o("Can't convert number to bigint");return BigInt(r)}},35639:(t,r,e)=>{var n=e(64725),o=e(48331),i=RangeError;t.exports=function(t){if(void 0===t)return 0;var r=n(t),e=o(r);if(r!==e)throw i("Wrong length or index");return e}},19969:(t,r,e)=>{var n=e(23169),o=e(7263);t.exports=function(t){return n(o(t))}},64725:(t,r,e)=>{var n=e(26360);t.exports=function(t){var r=+t;return r!=r||0===r?0:n(r)}},48331:(t,r,e)=>{var n=e(64725),o=Math.min;t.exports=function(t){return t>0?o(n(t),9007199254740991):0}},84766:(t,r,e)=>{var n=e(7263),o=Object;t.exports=function(t){return o(n(t))}},31085:(t,r,e)=>{var n=e(7006),o=RangeError;t.exports=function(t,r){var e=n(t);if(e%r)throw o("Wrong offset");return e}},7006:(t,r,e)=>{var n=e(64725),o=RangeError;t.exports=function(t){var r=n(t);if(r<0)throw o("The argument can't be less than 0");return r}},40687:(t,r,e)=>{var n=e(47702),o=e(42521),i=e(5057),a=e(74692),u=e(1047),s=e(1386),c=TypeError,f=s("toPrimitive");t.exports=function(t,r){if(!o(t)||i(t))return t;var e,s=a(t,f);if(s){if(void 0===r&&(r="default"),e=n(s,t,r),!o(e)||i(e))return e;throw c("Can't convert object to primitive value")}return void 0===r&&(r="number"),u(t,r)}},5224:(t,r,e)=>{var n=e(40687),o=e(5057);t.exports=function(t){var r=n(t,"string");return o(r)?r:r+""}},16395:(t,r,e)=>{var n={};n[e(1386)("toStringTag")]="z",t.exports="[object z]"===String(n)},93710:(t,r,e)=>{var n=e(79538),o=String;t.exports=function(t){if("Symbol"===n(t))throw TypeError("Cannot convert a Symbol value to a string");return o(t)}},46814:(t,r,e)=>{var n=e(1441);t.exports=function(t){try{if(n)return Function('return require("'+t+'")')()}catch(t){}}},23120:t=>{var r=String;t.exports=function(t){try{return r(t)}catch(t){return"Object"}}},31240:(t,r,e)=>{"use strict";var n=e(7309),o=e(76121),i=e(47702),a=e(37703),u=e(87928),s=e(44162),c=e(75117),f=e(30680),l=e(5938),h=e(91471),p=e(74495),v=e(48331),d=e(35639),g=e(31085),y=e(5224),m=e(89146),b=e(79538),x=e(42521),w=e(5057),S=e(63571),E=e(8449),A=e(86594),O=e(2042).f,R=e(21719),T=e(25097).forEach,I=e(8395),M=e(3546),k=e(67455),j=e(38769),P=e(2995),L=e(31985),C=P.get,_=P.set,N=P.enforce,U=k.f,D=j.f,F=Math.round,B=o.RangeError,z=c.ArrayBuffer,W=z.prototype,V=c.DataView,G=s.NATIVE_ARRAY_BUFFER_VIEWS,H=s.TYPED_ARRAY_TAG,q=s.TypedArray,Y=s.TypedArrayPrototype,$=s.aTypedArrayConstructor,K=s.isTypedArray,J="BYTES_PER_ELEMENT",X="Wrong length",Q=function(t,r){$(t);for(var e=0,n=r.length,o=new t(n);n>e;)o[e]=r[e++];return o},Z=function(t,r){M(t,r,{configurable:!0,get:function(){return C(this)[r]}})},tt=function(t){var r;return E(W,t)||"ArrayBuffer"==(r=b(t))||"SharedArrayBuffer"==r},rt=function(t,r){return K(t)&&!w(r)&&r in t&&p(+r)&&r>=0},et=function(t,r){return r=y(r),rt(t,r)?l(2,t[r]):D(t,r)},nt=function(t,r,e){return r=y(r),!(rt(t,r)&&x(e)&&m(e,"value"))||m(e,"get")||m(e,"set")||e.configurable||m(e,"writable")&&!e.writable||m(e,"enumerable")&&!e.enumerable?U(t,r,e):(t[r]=e.value,t)};a?(G||(j.f=et,k.f=nt,Z(Y,"buffer"),Z(Y,"byteOffset"),Z(Y,"byteLength"),Z(Y,"length")),n({target:"Object",stat:!0,forced:!G},{getOwnPropertyDescriptor:et,defineProperty:nt}),t.exports=function(t,r,e){var a=t.match(/\d+/)[0]/8,s=t+(e?"Clamped":"")+"Array",c="get"+t,l="set"+t,p=o[s],y=p,m=y&&y.prototype,b={},w=function(t,r){U(t,r,{get:function(){return function(t,r){var e=C(t);return e.view[c](r*a+e.byteOffset,!0)}(this,r)},set:function(t){return function(t,r,n){var o=C(t);e&&(n=(n=F(n))<0?0:n>255?255:255&n),o.view[l](r*a+o.byteOffset,n,!0)}(this,r,t)},enumerable:!0})};G?u&&(y=r((function(t,r,e,n){return f(t,m),L(x(r)?tt(r)?void 0!==n?new p(r,g(e,a),n):void 0!==e?new p(r,g(e,a)):new p(r):K(r)?Q(y,r):i(R,y,r):new p(d(r)),t,y)})),A&&A(y,q),T(O(p),(function(t){t in y||h(y,t,p[t])})),y.prototype=m):(y=r((function(t,r,e,n){f(t,m);var o,u,s,c=0,l=0;if(x(r)){if(!tt(r))return K(r)?Q(y,r):i(R,y,r);o=r,l=g(e,a);var h=r.byteLength;if(void 0===n){if(h%a)throw B(X);if((u=h-l)<0)throw B(X)}else if((u=v(n)*a)+l>h)throw B(X);s=u/a}else s=d(r),o=new z(u=s*a);for(_(t,{buffer:o,byteOffset:l,byteLength:u,length:s,view:new V(o)});c{var n=e(76121),o=e(72763),i=e(4684),a=e(44162).NATIVE_ARRAY_BUFFER_VIEWS,u=n.ArrayBuffer,s=n.Int8Array;t.exports=!a||!o((function(){s(1)}))||!o((function(){new s(-1)}))||!i((function(t){new s,new s(null),new s(1.5),new s(t)}),!0)||o((function(){return 1!==new s(new u(2),1,void 0).length}))},85908:(t,r,e)=>{var n=e(15078),o=e(55725);t.exports=function(t,r){return n(o(t),r)}},21719:(t,r,e)=>{var n=e(43322),o=e(47702),i=e(13834),a=e(84766),u=e(25902),s=e(78977),c=e(85111),f=e(19439),l=e(18049),h=e(44162).aTypedArrayConstructor,p=e(2321);t.exports=function(t){var r,e,v,d,g,y,m,b,x=i(this),w=a(t),S=arguments.length,E=S>1?arguments[1]:void 0,A=void 0!==E,O=c(w);if(O&&!f(O))for(b=(m=s(w,O)).next,w=[];!(y=o(b,m)).done;)w.push(y.value);for(A&&S>2&&(E=n(E,arguments[2])),e=u(w),v=new(h(x))(e),d=l(v),r=0;e>r;r++)g=A?E(w[r],r):w[r],v[r]=d?p(g):+g;return v}},55725:(t,r,e)=>{var n=e(44162),o=e(18159),i=n.aTypedArrayConstructor,a=n.getTypedArrayConstructor;t.exports=function(t){return i(o(t,a(t)))}},51735:(t,r,e)=>{var n=e(47585),o=0,i=Math.random(),a=n(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+a(++o+i,36)}},87638:(t,r,e)=>{var n=e(72763),o=e(1386),i=e(37703),a=e(8451),u=o("iterator");t.exports=!n((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),r=t.searchParams,e=new URLSearchParams("a=1&a=2"),n="";return t.pathname="c%20d",r.forEach((function(t,e){r.delete("b"),n+=e+t})),e.delete("a",2),a&&(!t.toJSON||!e.has("a",1)||e.has("a",2))||!r.size&&(a||!i)||!r.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==r.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!r[u]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host}))},42020:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=e(80859);t.exports=o&&!Symbol.sham&&"symbol"==n(Symbol.iterator)},24064:(t,r,e)=>{var n=e(37703),o=e(72763);t.exports=n&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},40699:t=>{var r=TypeError;t.exports=function(t,e){if(t{var n=e(76121),o=e(25222),i=n.WeakMap;t.exports=o(i)&&/native code/.test(String(i))},25671:(t,r,e)=>{var n=e(1035),o=e(89146),i=e(89103),a=e(67455).f;t.exports=function(t){var r=n.Symbol||(n.Symbol={});o(r,t)||a(r,t,{value:i.f(t)})}},89103:(t,r,e)=>{var n=e(1386);r.f=n},1386:(t,r,e)=>{var n=e(76121),o=e(30896),i=e(89146),a=e(51735),u=e(80859),s=e(42020),c=n.Symbol,f=o("wks"),l=s?c.for||c:c&&c.withoutSetter||a;t.exports=function(t){return i(f,t)||(f[t]=u&&i(c,t)?c[t]:l("Symbol."+t)),f[t]}},82350:t=>{t.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},86873:(t,r,e)=>{"use strict";var n=e(77642),o=e(89146),i=e(91471),a=e(8449),u=e(86594),s=e(94488),c=e(21228),f=e(31985),l=e(72434),h=e(94547),p=e(34281),v=e(37703),d=e(8451);t.exports=function(t,r,e,g){var y="stackTraceLimit",m=g?2:1,b=t.split("."),x=b[b.length-1],w=n.apply(null,b);if(w){var S=w.prototype;if(!d&&o(S,"cause")&&delete S.cause,!e)return w;var E=n("Error"),A=r((function(t,r){var e=l(g?r:t,void 0),n=g?new w(t):new w;return void 0!==e&&i(n,"message",e),p(n,A,n.stack,2),this&&a(S,this)&&f(n,this,A),arguments.length>m&&h(n,arguments[m]),n}));if(A.prototype=S,"Error"!==x?u?u(A,E):s(A,E,{name:!0}):v&&y in w&&(c(A,w,y),c(A,w,"prepareStackTrace")),s(A,w),!d)try{S.name!==x&&i(S,"name",x),S.constructor=A}catch(t){}return A}}},56689:(t,r,e)=>{var n=e(7309),o=e(77642),i=e(79102),a=e(72763),u=e(86873),s="AggregateError",c=o(s),f=!a((function(){return 1!==c([1]).errors[0]}))&&a((function(){return 7!==c([1],s,{cause:7}).cause}));n({global:!0,constructor:!0,arity:2,forced:f},{AggregateError:u(s,(function(t){return function(r,e){return i(t,this,arguments)}}),f,!0)})},45892:(t,r,e)=>{"use strict";var n=e(7309),o=e(8449),i=e(99366),a=e(86594),u=e(94488),s=e(63571),c=e(91471),f=e(5938),l=e(94547),h=e(34281),p=e(64572),v=e(72434),d=e(1386)("toStringTag"),g=Error,y=[].push,m=function(t,r){var e,n=o(b,this);a?e=a(g(),n?i(this):b):(e=n?this:s(b),c(e,d,"Error")),void 0!==r&&c(e,"message",v(r)),h(e,m,e.stack,1),arguments.length>2&&l(e,arguments[2]);var u=[];return p(t,y,{that:u}),c(e,"errors",u),e};a?a(m,g):u(m,g,{name:!0});var b=m.prototype=s(g.prototype,{constructor:f(1,m),message:f(1,""),name:f(1,"AggregateError")});n({global:!0,constructor:!0,arity:2},{AggregateError:m})},99298:(t,r,e)=>{e(45892)},45958:(t,r,e)=>{"use strict";var n=e(7309),o=e(76121),i=e(75117),a=e(8395),u="ArrayBuffer",s=i[u];n({global:!0,constructor:!0,forced:o[u]!==s},{ArrayBuffer:s}),a(u)},50266:(t,r,e)=>{var n=e(7309),o=e(44162);n({target:"ArrayBuffer",stat:!0,forced:!o.NATIVE_ARRAY_BUFFER_VIEWS},{isView:o.isView})},72471:(t,r,e)=>{"use strict";var n=e(7309),o=e(95305),i=e(72763),a=e(75117),u=e(86956),s=e(11588),c=e(48331),f=e(18159),l=a.ArrayBuffer,h=a.DataView,p=h.prototype,v=o(l.prototype.slice),d=o(p.getUint8),g=o(p.setUint8);n({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:i((function(){return!new l(2).slice(1,void 0).byteLength}))},{slice:function(t,r){if(v&&void 0===r)return v(u(this),t);for(var e=u(this).byteLength,n=s(t,e),o=s(void 0===r?e:r,e),i=new(f(this,l))(c(o-n)),a=new h(this),p=new h(i),y=0;n{"use strict";var n=e(7309),o=e(84766),i=e(25902),a=e(64725),u=e(29690);n({target:"Array",proto:!0},{at:function(t){var r=o(this),e=i(r),n=a(t),u=n>=0?n:e+n;return u<0||u>=e?void 0:r[u]}}),u("at")},26268:(t,r,e)=>{"use strict";var n=e(7309),o=e(72763),i=e(43964),a=e(42521),u=e(84766),s=e(25902),c=e(21581),f=e(32385),l=e(48347),h=e(1566),p=e(1386),v=e(56962),d=p("isConcatSpreadable"),g=v>=51||!o((function(){var t=[];return t[d]=!1,t.concat()[0]!==t})),y=function(t){if(!a(t))return!1;var r=t[d];return void 0!==r?!!r:i(t)};n({target:"Array",proto:!0,arity:1,forced:!g||!h("concat")},{concat:function(t){var r,e,n,o,i,a=u(this),h=l(a,0),p=0;for(r=-1,n=arguments.length;r{var n=e(7309),o=e(24579),i=e(29690);n({target:"Array",proto:!0},{copyWithin:o}),i("copyWithin")},20635:(t,r,e)=>{"use strict";var n=e(7309),o=e(25097).every;n({target:"Array",proto:!0,forced:!e(49719)("every")},{every:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},42498:(t,r,e)=>{var n=e(7309),o=e(6922),i=e(29690);n({target:"Array",proto:!0},{fill:o}),i("fill")},60306:(t,r,e)=>{"use strict";var n=e(7309),o=e(25097).filter;n({target:"Array",proto:!0,forced:!e(1566)("filter")},{filter:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},65750:(t,r,e)=>{"use strict";var n=e(7309),o=e(25097).findIndex,i=e(29690),a="findIndex",u=!0;a in[]&&Array(1)[a]((function(){u=!1})),n({target:"Array",proto:!0,forced:u},{findIndex:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i(a)},39741:(t,r,e)=>{"use strict";var n=e(7309),o=e(51486).findLastIndex,i=e(29690);n({target:"Array",proto:!0},{findLastIndex:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("findLastIndex")},99716:(t,r,e)=>{"use strict";var n=e(7309),o=e(51486).findLast,i=e(29690);n({target:"Array",proto:!0},{findLast:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i("findLast")},9670:(t,r,e)=>{"use strict";var n=e(7309),o=e(25097).find,i=e(29690),a="find",u=!0;a in[]&&Array(1)[a]((function(){u=!1})),n({target:"Array",proto:!0,forced:u},{find:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),i(a)},4304:(t,r,e)=>{"use strict";var n=e(7309),o=e(25538),i=e(19257),a=e(84766),u=e(25902),s=e(48347);n({target:"Array",proto:!0},{flatMap:function(t){var r,e=a(this),n=u(e);return i(t),(r=s(e,0)).length=o(r,e,e,n,0,1,t,arguments.length>1?arguments[1]:void 0),r}})},30812:(t,r,e)=>{"use strict";var n=e(7309),o=e(25538),i=e(84766),a=e(25902),u=e(64725),s=e(48347);n({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,r=i(this),e=a(r),n=s(r,0);return n.length=o(n,r,r,e,0,void 0===t?1:u(t)),n}})},25146:(t,r,e)=>{"use strict";var n=e(7309),o=e(20702);n({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},36147:(t,r,e)=>{var n=e(7309),o=e(54513);n({target:"Array",stat:!0,forced:!e(4684)((function(t){Array.from(t)}))},{from:o})},10304:(t,r,e)=>{"use strict";var n=e(7309),o=e(59729).includes,i=e(72763),a=e(29690);n({target:"Array",proto:!0,forced:i((function(){return!Array(1).includes()}))},{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),a("includes")},40233:(t,r,e)=>{"use strict";var n=e(7309),o=e(95305),i=e(59729).indexOf,a=e(49719),u=o([].indexOf),s=!!u&&1/u([1],1,-0)<0;n({target:"Array",proto:!0,forced:s||!a("indexOf")},{indexOf:function(t){var r=arguments.length>1?arguments[1]:void 0;return s?u(this,t,r)||0:i(this,t,r)}})},34364:(t,r,e)=>{e(7309)({target:"Array",stat:!0},{isArray:e(43964)})},43541:(t,r,e)=>{"use strict";var n=e(19969),o=e(29690),i=e(23403),a=e(2995),u=e(67455).f,s=e(19173),c=e(36238),f=e(8451),l=e(37703),h="Array Iterator",p=a.set,v=a.getterFor(h);t.exports=s(Array,"Array",(function(t,r){p(this,{type:h,target:n(t),index:0,kind:r})}),(function(){var t=v(this),r=t.target,e=t.kind,n=t.index++;return!r||n>=r.length?(t.target=void 0,c(void 0,!0)):c("keys"==e?n:"values"==e?r[n]:[n,r[n]],!1)}),"values");var d=i.Arguments=i.Array;if(o("keys"),o("values"),o("entries"),!f&&l&&"values"!==d.name)try{u(d,"name",{value:"values"})}catch(t){}},69911:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(23169),a=e(19969),u=e(49719),s=o([].join);n({target:"Array",proto:!0,forced:i!=Object||!u("join",",")},{join:function(t){return s(a(this),void 0===t?",":t)}})},28787:(t,r,e)=>{var n=e(7309),o=e(8139);n({target:"Array",proto:!0,forced:o!==[].lastIndexOf},{lastIndexOf:o})},50472:(t,r,e)=>{"use strict";var n=e(7309),o=e(25097).map;n({target:"Array",proto:!0,forced:!e(1566)("map")},{map:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},41031:(t,r,e)=>{"use strict";var n=e(7309),o=e(72763),i=e(93722),a=e(32385),u=Array;n({target:"Array",stat:!0,forced:o((function(){function t(){}return!(u.of.call(t)instanceof t)}))},{of:function(){for(var t=0,r=arguments.length,e=new(i(this)?this:u)(r);r>t;)a(e,t,arguments[t++]);return e.length=r,e}})},33976:(t,r,e)=>{"use strict";var n=e(7309),o=e(84766),i=e(25902),a=e(19506),u=e(21581);n({target:"Array",proto:!0,arity:1,forced:e(72763)((function(){return 4294967297!==[].push.call({length:4294967296},1)}))||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(t){return t instanceof TypeError}}()},{push:function(t){var r=o(this),e=i(r),n=arguments.length;u(e+n);for(var s=0;s{"use strict";var n=e(7309),o=e(59856).right,i=e(49719),a=e(56962);n({target:"Array",proto:!0,forced:!e(1441)&&a>79&&a<83||!i("reduceRight")},{reduceRight:function(t){return o(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},45519:(t,r,e)=>{"use strict";var n=e(7309),o=e(59856).left,i=e(49719),a=e(56962);n({target:"Array",proto:!0,forced:!e(1441)&&a>79&&a<83||!i("reduce")},{reduce:function(t){var r=arguments.length;return o(this,t,r,r>1?arguments[1]:void 0)}})},64487:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(43964),a=o([].reverse),u=[1,2];n({target:"Array",proto:!0,forced:String(u)===String(u.reverse())},{reverse:function(){return i(this)&&(this.length=this.length),a(this)}})},95452:(t,r,e)=>{"use strict";var n=e(7309),o=e(43964),i=e(93722),a=e(42521),u=e(11588),s=e(25902),c=e(19969),f=e(32385),l=e(1386),h=e(1566),p=e(11939),v=h("slice"),d=l("species"),g=Array,y=Math.max;n({target:"Array",proto:!0,forced:!v},{slice:function(t,r){var e,n,l,h=c(this),v=s(h),m=u(t,v),b=u(void 0===r?v:r,v);if(o(h)&&(e=h.constructor,(i(e)&&(e===g||o(e.prototype))||a(e)&&null===(e=e[d]))&&(e=void 0),e===g||void 0===e))return p(h,m,b);for(n=new(void 0===e?g:e)(y(b-m,0)),l=0;m{"use strict";var n=e(7309),o=e(25097).some;n({target:"Array",proto:!0,forced:!e(49719)("some")},{some:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},54070:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(19257),a=e(84766),u=e(25902),s=e(23156),c=e(93710),f=e(72763),l=e(33407),h=e(49719),p=e(45249),v=e(32049),d=e(56962),g=e(58998),y=[],m=o(y.sort),b=o(y.push),x=f((function(){y.sort(void 0)})),w=f((function(){y.sort(null)})),S=h("sort"),E=!f((function(){if(d)return d<70;if(!(p&&p>3)){if(v)return!0;if(g)return g<603;var t,r,e,n,o="";for(t=65;t<76;t++){switch(r=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:e=3;break;case 68:case 71:e=4;break;default:e=2}for(n=0;n<47;n++)y.push({k:r+n,v:e})}for(y.sort((function(t,r){return r.v-t.v})),n=0;nc(e)?1:-1}}(t)),e=u(o),n=0;n{e(8395)("Array")},80166:(t,r,e)=>{"use strict";var n=e(7309),o=e(84766),i=e(11588),a=e(64725),u=e(25902),s=e(19506),c=e(21581),f=e(48347),l=e(32385),h=e(23156),p=e(1566)("splice"),v=Math.max,d=Math.min;n({target:"Array",proto:!0,forced:!p},{splice:function(t,r){var e,n,p,g,y,m,b=o(this),x=u(b),w=i(t,x),S=arguments.length;for(0===S?e=n=0:1===S?(e=0,n=x-w):(e=S-2,n=d(v(a(r),0),x-w)),c(x+e-n),p=f(b,n),g=0;gx-n+e;g--)h(b,g-1)}else if(e>n)for(g=x-n;g>w;g--)m=g+e-1,(y=g+n-1)in b?b[m]=b[y]:h(b,m);for(g=0;g{"use strict";var n=e(7309),o=e(2788),i=e(19969),a=e(29690),u=Array;n({target:"Array",proto:!0},{toReversed:function(){return o(i(this),u)}}),a("toReversed")},90231:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(19257),a=e(19969),u=e(15078),s=e(4251),c=e(29690),f=Array,l=o(s("Array").sort);n({target:"Array",proto:!0},{toSorted:function(t){void 0!==t&&i(t);var r=a(this),e=u(f,r);return l(e,t)}}),c("toSorted")},8887:(t,r,e)=>{"use strict";var n=e(7309),o=e(29690),i=e(21581),a=e(25902),u=e(11588),s=e(19969),c=e(64725),f=Array,l=Math.max,h=Math.min;n({target:"Array",proto:!0},{toSpliced:function(t,r){var e,n,o,p,v=s(this),d=a(v),g=u(t,d),y=arguments.length,m=0;for(0===y?e=n=0:1===y?(e=0,n=d-g):(e=y-2,n=h(l(c(r),0),d-g)),o=i(d+e-n),p=f(o);m{e(29690)("flatMap")},29993:(t,r,e)=>{e(29690)("flat")},46365:(t,r,e)=>{"use strict";var n=e(7309),o=e(84766),i=e(25902),a=e(19506),u=e(23156),s=e(21581);n({target:"Array",proto:!0,arity:1,forced:1!==[].unshift(0)||!function(){try{Object.defineProperty([],"length",{writable:!1}).unshift()}catch(t){return t instanceof TypeError}}()},{unshift:function(t){var r=o(this),e=i(r),n=arguments.length;if(n){s(e+n);for(var c=e;c--;){var f=c+n;c in r?r[f]=r[c]:u(r,f)}for(var l=0;l{"use strict";var n=e(7309),o=e(71786),i=e(19969),a=Array;n({target:"Array",proto:!0},{with:function(t,r){return o(i(this),a,t,r)}})},80639:(t,r,e)=>{var n=e(7309),o=e(75117);n({global:!0,constructor:!0,forced:!e(35558)},{DataView:o.DataView})},68678:(t,r,e)=>{e(80639)},55187:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(72763)((function(){return 120!==new Date(16e11).getYear()})),a=o(Date.prototype.getFullYear);n({target:"Date",proto:!0,forced:i},{getYear:function(){return a(this)-1900}})},71468:(t,r,e)=>{var n=e(7309),o=e(47585),i=Date,a=o(i.prototype.getTime);n({target:"Date",stat:!0},{now:function(){return a(new i)}})},91852:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(64725),a=Date.prototype,u=o(a.getTime),s=o(a.setFullYear);n({target:"Date",proto:!0},{setYear:function(t){u(this);var r=i(t);return s(this,0<=r&&r<=99?r+1900:r)}})},68118:(t,r,e)=>{e(7309)({target:"Date",proto:!0},{toGMTString:Date.prototype.toUTCString})},74818:(t,r,e)=>{var n=e(7309),o=e(59671);n({target:"Date",proto:!0,forced:Date.prototype.toISOString!==o},{toISOString:o})},77026:(t,r,e)=>{"use strict";var n=e(7309),o=e(72763),i=e(84766),a=e(40687);n({target:"Date",proto:!0,arity:1,forced:o((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(t){var r=i(this),e=a(r,"number");return"number"!=typeof e||isFinite(e)?r.toISOString():null}})},38607:(t,r,e)=>{var n=e(89146),o=e(73918),i=e(83976),a=e(1386)("toPrimitive"),u=Date.prototype;n(u,a)||o(u,a,i)},20836:(t,r,e)=>{var n=e(47585),o=e(73918),i=Date.prototype,a="Invalid Date",u="toString",s=n(i[u]),c=n(i.getTime);String(new Date(NaN))!=a&&o(i,u,(function(){var t=c(this);return t==t?s(this):a}))},72965:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(79102),a=e(86873),u="WebAssembly",s=o[u],c=7!==Error("e",{cause:7}).cause,f=function(t,r){var e={};e[t]=a(t,r,c),n({global:!0,constructor:!0,arity:1,forced:c},e)},l=function(t,r){if(s&&s[t]){var e={};e[t]=a(u+"."+t,r,c),n({target:u,stat:!0,constructor:!0,arity:1,forced:c},e)}};f("Error",(function(t){return function(r){return i(t,this,arguments)}})),f("EvalError",(function(t){return function(r){return i(t,this,arguments)}})),f("RangeError",(function(t){return function(r){return i(t,this,arguments)}})),f("ReferenceError",(function(t){return function(r){return i(t,this,arguments)}})),f("SyntaxError",(function(t){return function(r){return i(t,this,arguments)}})),f("TypeError",(function(t){return function(r){return i(t,this,arguments)}})),f("URIError",(function(t){return function(r){return i(t,this,arguments)}})),l("CompileError",(function(t){return function(r){return i(t,this,arguments)}})),l("LinkError",(function(t){return function(r){return i(t,this,arguments)}})),l("RuntimeError",(function(t){return function(r){return i(t,this,arguments)}}))},6691:(t,r,e)=>{var n=e(73918),o=e(32447),i=Error.prototype;i.toString!==o&&n(i,"toString",o)},75150:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(93710),a=o("".charAt),u=o("".charCodeAt),s=o(/./.exec),c=o(1..toString),f=o("".toUpperCase),l=/[\w*+\-./@]/,h=function(t,r){for(var e=c(t,16);e.length{var n=e(7309),o=e(48659);n({target:"Function",proto:!0,forced:Function.bind!==o},{bind:o})},45192:(t,r,e)=>{"use strict";var n=e(25222),o=e(42521),i=e(67455),a=e(99366),u=e(1386),s=e(55076),c=u("hasInstance"),f=Function.prototype;c in f||i.f(f,c,{value:s((function(t){if(!n(this)||!o(t))return!1;var r=this.prototype;if(!o(r))return t instanceof this;for(;t=a(t);)if(r===t)return!0;return!1}),c)})},77441:(t,r,e)=>{var n=e(37703),o=e(13343).EXISTS,i=e(47585),a=e(3546),u=Function.prototype,s=i(u.toString),c=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,f=i(c.exec);n&&!o&&a(u,"name",{configurable:!0,get:function(){try{return f(c,s(this))[1]}catch(t){return""}}})},68428:(t,r,e)=>{var n=e(7309),o=e(76121);n({global:!0,forced:o.globalThis!==o},{globalThis:o})},83438:(t,r,e)=>{var n=e(7309),o=e(77642),i=e(79102),a=e(47702),u=e(47585),s=e(72763),c=e(25222),f=e(5057),l=e(11939),h=e(80948),p=e(80859),v=String,d=o("JSON","stringify"),g=u(/./.exec),y=u("".charAt),m=u("".charCodeAt),b=u("".replace),x=u(1..toString),w=/[\uD800-\uDFFF]/g,S=/^[\uD800-\uDBFF]$/,E=/^[\uDC00-\uDFFF]$/,A=!p||s((function(){var t=o("Symbol")();return"[null]"!=d([t])||"{}"!=d({a:t})||"{}"!=d(Object(t))})),O=s((function(){return'"\\udf06\\ud834"'!==d("\udf06\ud834")||'"\\udead"'!==d("\udead")})),R=function(t,r){var e=l(arguments),n=h(r);if(c(n)||void 0!==t&&!f(t))return e[1]=function(t,r){if(c(n)&&(r=a(n,this,v(t),r)),!f(r))return r},i(d,null,e)},T=function(t,r,e){var n=y(e,r-1),o=y(e,r+1);return g(S,t)&&!g(E,o)||g(E,t)&&!g(S,n)?"\\u"+x(m(t,0),16):t};d&&n({target:"JSON",stat:!0,arity:3,forced:A||O},{stringify:function(t,r,e){var n=l(arguments),o=i(A?R:d,null,n);return O&&"string"==typeof o?b(o,w,T):o}})},36087:(t,r,e)=>{var n=e(76121);e(54849)(n.JSON,"JSON",!0)},58562:(t,r,e)=>{"use strict";e(35246)("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),e(95365))},8974:(t,r,e)=>{e(58562)},84997:(t,r,e)=>{var n=e(7309),o=e(39370),i=Math.acosh,a=Math.log,u=Math.sqrt,s=Math.LN2;n({target:"Math",stat:!0,forced:!i||710!=Math.floor(i(Number.MAX_VALUE))||i(1/0)!=1/0},{acosh:function(t){var r=+t;return r<1?NaN:r>94906265.62425156?a(r)+s:o(r-1+u(r-1)*u(r+1))}})},6423:(t,r,e)=>{var n=e(7309),o=Math.asinh,i=Math.log,a=Math.sqrt;n({target:"Math",stat:!0,forced:!(o&&1/o(0)>0)},{asinh:function t(r){var e=+r;return isFinite(e)&&0!=e?e<0?-t(-e):i(e+a(e*e+1)):e}})},33319:(t,r,e)=>{var n=e(7309),o=Math.atanh,i=Math.log;n({target:"Math",stat:!0,forced:!(o&&1/o(-0)<0)},{atanh:function(t){var r=+t;return 0==r?r:i((1+r)/(1-r))/2}})},61134:(t,r,e)=>{var n=e(7309),o=e(4380),i=Math.abs,a=Math.pow;n({target:"Math",stat:!0},{cbrt:function(t){var r=+t;return o(r)*a(i(r),1/3)}})},47381:(t,r,e)=>{var n=e(7309),o=Math.floor,i=Math.log,a=Math.LOG2E;n({target:"Math",stat:!0},{clz32:function(t){var r=t>>>0;return r?31-o(i(r+.5)*a):32}})},67316:(t,r,e)=>{var n=e(7309),o=e(89188),i=Math.cosh,a=Math.abs,u=Math.E;n({target:"Math",stat:!0,forced:!i||i(710)===1/0},{cosh:function(t){var r=o(a(t)-1)+1;return(r+1/(r*u*u))*(u/2)}})},68536:(t,r,e)=>{var n=e(7309),o=e(89188);n({target:"Math",stat:!0,forced:o!=Math.expm1},{expm1:o})},3563:(t,r,e)=>{e(7309)({target:"Math",stat:!0},{fround:e(63094)})},5373:(t,r,e)=>{var n=e(7309),o=Math.hypot,i=Math.abs,a=Math.sqrt;n({target:"Math",stat:!0,arity:2,forced:!!o&&o(1/0,NaN)!==1/0},{hypot:function(t,r){for(var e,n,o=0,u=0,s=arguments.length,c=0;u0?(n=e/c)*n:e;return c===1/0?1/0:c*a(o)}})},64039:(t,r,e)=>{var n=e(7309),o=e(72763),i=Math.imul;n({target:"Math",stat:!0,forced:o((function(){return-5!=i(4294967295,5)||2!=i.length}))},{imul:function(t,r){var e=65535,n=+t,o=+r,i=e&n,a=e&o;return 0|i*a+((e&n>>>16)*a+i*(e&o>>>16)<<16>>>0)}})},72778:(t,r,e)=>{e(7309)({target:"Math",stat:!0},{log10:e(72199)})},29309:(t,r,e)=>{e(7309)({target:"Math",stat:!0},{log1p:e(39370)})},63104:(t,r,e)=>{var n=e(7309),o=Math.log,i=Math.LN2;n({target:"Math",stat:!0},{log2:function(t){return o(t)/i}})},56379:(t,r,e)=>{e(7309)({target:"Math",stat:!0},{sign:e(4380)})},59604:(t,r,e)=>{var n=e(7309),o=e(72763),i=e(89188),a=Math.abs,u=Math.exp,s=Math.E;n({target:"Math",stat:!0,forced:o((function(){return-2e-17!=Math.sinh(-2e-17)}))},{sinh:function(t){var r=+t;return a(r)<1?(i(r)-i(-r))/2:(u(r-1)-u(-r-1))*(s/2)}})},73387:(t,r,e)=>{var n=e(7309),o=e(89188),i=Math.exp;n({target:"Math",stat:!0},{tanh:function(t){var r=+t,e=o(r),n=o(-r);return e==1/0?1:n==1/0?-1:(e-n)/(i(r)+i(-r))}})},25120:(t,r,e)=>{e(54849)(Math,"Math",!0)},10084:(t,r,e)=>{e(7309)({target:"Math",stat:!0},{trunc:e(26360)})},3278:(t,r,e)=>{"use strict";var n=e(7309),o=e(8451),i=e(37703),a=e(76121),u=e(1035),s=e(47585),c=e(20676),f=e(89146),l=e(31985),h=e(8449),p=e(5057),v=e(40687),d=e(72763),g=e(2042).f,y=e(38769).f,m=e(67455).f,b=e(40262),x=e(36842).trim,w="Number",S=a[w],E=u[w],A=S.prototype,O=a.TypeError,R=s("".slice),T=s("".charCodeAt),I=c(w,!S(" 0o1")||!S("0b1")||S("+0x1")),M=function(t){var r,e=arguments.length<1?0:S(function(t){var r=v(t,"number");return"bigint"==typeof r?r:function(t){var r,e,n,o,i,a,u,s,c=v(t,"number");if(p(c))throw O("Cannot convert a Symbol value to a number");if("string"==typeof c&&c.length>2)if(c=x(c),43===(r=T(c,0))||45===r){if(88===(e=T(c,2))||120===e)return NaN}else if(48===r){switch(T(c,1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+c}for(a=(i=R(c,2)).length,u=0;uo)return NaN;return parseInt(i,n)}return+c}(r)}(t));return h(A,r=this)&&d((function(){b(r)}))?l(Object(e),this,M):e};M.prototype=A,I&&!o&&(A.constructor=M),n({global:!0,constructor:!0,wrap:!0,forced:I},{Number:M});var k=function(t,r){for(var e,n=i?g(r):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range".split(","),o=0;n.length>o;o++)f(r,e=n[o])&&!f(t,e)&&m(t,e,y(r,e))};o&&E&&k(u[w],E),(I||o)&&k(u[w],S)},31917:(t,r,e)=>{e(7309)({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{EPSILON:Math.pow(2,-52)})},10026:(t,r,e)=>{e(7309)({target:"Number",stat:!0},{isFinite:e(30097)})},83069:(t,r,e)=>{e(7309)({target:"Number",stat:!0},{isInteger:e(74495)})},96816:(t,r,e)=>{e(7309)({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},57022:(t,r,e)=>{var n=e(7309),o=e(74495),i=Math.abs;n({target:"Number",stat:!0},{isSafeInteger:function(t){return o(t)&&i(t)<=9007199254740991}})},89421:(t,r,e)=>{e(7309)({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991})},45725:(t,r,e)=>{e(7309)({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{MIN_SAFE_INTEGER:-9007199254740991})},26629:(t,r,e)=>{var n=e(7309),o=e(30706);n({target:"Number",stat:!0,forced:Number.parseFloat!=o},{parseFloat:o})},40694:(t,r,e)=>{var n=e(7309),o=e(92437);n({target:"Number",stat:!0,forced:Number.parseInt!=o},{parseInt:o})},35636:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(64725),a=e(40262),u=e(59549),s=e(72199),c=e(72763),f=RangeError,l=String,h=isFinite,p=Math.abs,v=Math.floor,d=Math.pow,g=Math.round,y=o(1..toExponential),m=o(u),b=o("".slice),x="-6.9000e-11"===y(-69e-12,4)&&"1.25e+0"===y(1.255,2)&&"1.235e+4"===y(12345,3)&&"3e+1"===y(25,0);n({target:"Number",proto:!0,forced:!x||!(c((function(){y(1,1/0)}))&&c((function(){y(1,-1/0)})))||!!c((function(){y(1/0,1/0),y(NaN,1/0)}))},{toExponential:function(t){var r=a(this);if(void 0===t)return y(r);var e=i(t);if(!h(r))return String(r);if(e<0||e>20)throw f("Incorrect fraction digits");if(x)return y(r,e);var n="",o="",u=0,c="",w="";if(r<0&&(n="-",r=-r),0===r)u=0,o=m("0",e+1);else{var S=s(r);u=v(S);var E=0,A=d(10,u-e);2*r>=(2*(E=g(r/A))+1)*A&&(E+=1),E>=d(10,e+1)&&(E/=10,u+=1),o=l(E)}return 0!==e&&(o=b(o,0,1)+"."+b(o,1)),0===u?(c="+",w="0"):(c=u>0?"+":"-",w=l(p(u))),n+(o+"e")+c+w}})},89994:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(64725),a=e(40262),u=e(59549),s=e(72763),c=RangeError,f=String,l=Math.floor,h=o(u),p=o("".slice),v=o(1..toFixed),d=function t(r,e,n){return 0===e?n:e%2==1?t(r,e-1,n*r):t(r*r,e/2,n)},g=function(t,r,e){for(var n=-1,o=e;++n<6;)o+=r*t[n],t[n]=o%1e7,o=l(o/1e7)},y=function(t,r){for(var e=6,n=0;--e>=0;)n+=t[e],t[e]=l(n/r),n=n%r*1e7},m=function(t){for(var r=6,e="";--r>=0;)if(""!==e||0===r||0!==t[r]){var n=f(t[r]);e=""===e?n:e+h("0",7-n.length)+n}return e};n({target:"Number",proto:!0,forced:s((function(){return"0.000"!==v(8e-5,3)||"1"!==v(.9,0)||"1.25"!==v(1.255,2)||"1000000000000000128"!==v(0xde0b6b3a7640080,0)}))||!s((function(){v({})}))},{toFixed:function(t){var r,e,n,o,u=a(this),s=i(t),l=[0,0,0,0,0,0],v="",b="0";if(s<0||s>20)throw c("Incorrect fraction digits");if(u!=u)return"NaN";if(u<=-1e21||u>=1e21)return f(u);if(u<0&&(v="-",u=-u),u>1e-21)if(e=(r=function(t){for(var r=0,e=t;e>=4096;)r+=12,e/=4096;for(;e>=2;)r+=1,e/=2;return r}(u*d(2,69,1))-69)<0?u*d(2,-r,1):u/d(2,r,1),e*=4503599627370496,(r=52-r)>0){for(g(l,0,e),n=s;n>=7;)g(l,1e7,0),n-=7;for(g(l,d(10,n,1),0),n=r-1;n>=23;)y(l,1<<23),n-=23;y(l,1<0?v+((o=b.length)<=s?"0."+h("0",s-o)+b:p(b,0,o-s)+"."+p(b,o-s)):v+b}})},66805:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(72763),a=e(40262),u=o(1..toPrecision);n({target:"Number",proto:!0,forced:i((function(){return"1"!==u(1,void 0)}))||!i((function(){u({})}))},{toPrecision:function(t){return void 0===t?u(a(this)):u(a(this),t)}})},19425:(t,r,e)=>{var n=e(7309),o=e(81179);n({target:"Object",stat:!0,arity:2,forced:Object.assign!==o},{assign:o})},81591:(t,r,e)=>{e(7309)({target:"Object",stat:!0,sham:!e(37703)},{create:e(63571)})},66925:(t,r,e)=>{"use strict";var n=e(7309),o=e(37703),i=e(94926),a=e(19257),u=e(84766),s=e(67455);o&&n({target:"Object",proto:!0,forced:i},{__defineGetter__:function(t,r){s.f(u(this),t,{get:a(r),enumerable:!0,configurable:!0})}})},27559:(t,r,e)=>{var n=e(7309),o=e(37703),i=e(37532).f;n({target:"Object",stat:!0,forced:Object.defineProperties!==i,sham:!o},{defineProperties:i})},64832:(t,r,e)=>{var n=e(7309),o=e(37703),i=e(67455).f;n({target:"Object",stat:!0,forced:Object.defineProperty!==i,sham:!o},{defineProperty:i})},92354:(t,r,e)=>{"use strict";var n=e(7309),o=e(37703),i=e(94926),a=e(19257),u=e(84766),s=e(67455);o&&n({target:"Object",proto:!0,forced:i},{__defineSetter__:function(t,r){s.f(u(this),t,{set:a(r),enumerable:!0,configurable:!0})}})},89064:(t,r,e)=>{var n=e(7309),o=e(90962).entries;n({target:"Object",stat:!0},{entries:function(t){return o(t)}})},75759:(t,r,e)=>{var n=e(7309),o=e(91104),i=e(72763),a=e(42521),u=e(9154).onFreeze,s=Object.freeze;n({target:"Object",stat:!0,forced:i((function(){s(1)})),sham:!o},{freeze:function(t){return s&&a(t)?s(u(t)):t}})},42612:(t,r,e)=>{var n=e(7309),o=e(64572),i=e(32385);n({target:"Object",stat:!0},{fromEntries:function(t){var r={};return o(t,(function(t,e){i(r,t,e)}),{AS_ENTRIES:!0}),r}})},20631:(t,r,e)=>{var n=e(7309),o=e(72763),i=e(19969),a=e(38769).f,u=e(37703);n({target:"Object",stat:!0,forced:!u||o((function(){a(1)})),sham:!u},{getOwnPropertyDescriptor:function(t,r){return a(i(t),r)}})},79556:(t,r,e)=>{var n=e(7309),o=e(37703),i=e(79593),a=e(19969),u=e(38769),s=e(32385);n({target:"Object",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(t){for(var r,e,n=a(t),o=u.f,c=i(n),f={},l=0;c.length>l;)void 0!==(e=o(n,r=c[l++]))&&s(f,r,e);return f}})},87081:(t,r,e)=>{var n=e(7309),o=e(72763),i=e(2525).f;n({target:"Object",stat:!0,forced:o((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:i})},12984:(t,r,e)=>{var n=e(7309),o=e(80859),i=e(72763),a=e(92719),u=e(84766);n({target:"Object",stat:!0,forced:!o||i((function(){a.f(1)}))},{getOwnPropertySymbols:function(t){var r=a.f;return r?r(u(t)):[]}})},74419:(t,r,e)=>{var n=e(7309),o=e(72763),i=e(84766),a=e(99366),u=e(54264);n({target:"Object",stat:!0,forced:o((function(){a(1)})),sham:!u},{getPrototypeOf:function(t){return a(i(t))}})},86155:(t,r,e)=>{e(7309)({target:"Object",stat:!0},{hasOwn:e(89146)})},33149:(t,r,e)=>{var n=e(7309),o=e(18427);n({target:"Object",stat:!0,forced:Object.isExtensible!==o},{isExtensible:o})},32755:(t,r,e)=>{var n=e(7309),o=e(72763),i=e(42521),a=e(42849),u=e(65400),s=Object.isFrozen;n({target:"Object",stat:!0,forced:u||o((function(){s(1)}))},{isFrozen:function(t){return!i(t)||!(!u||"ArrayBuffer"!=a(t))||!!s&&s(t)}})},6775:(t,r,e)=>{var n=e(7309),o=e(72763),i=e(42521),a=e(42849),u=e(65400),s=Object.isSealed;n({target:"Object",stat:!0,forced:u||o((function(){s(1)}))},{isSealed:function(t){return!i(t)||!(!u||"ArrayBuffer"!=a(t))||!!s&&s(t)}})},60521:(t,r,e)=>{e(7309)({target:"Object",stat:!0},{is:e(17162)})},97757:(t,r,e)=>{var n=e(7309),o=e(84766),i=e(31792);n({target:"Object",stat:!0,forced:e(72763)((function(){i(1)}))},{keys:function(t){return i(o(t))}})},56495:(t,r,e)=>{"use strict";var n=e(7309),o=e(37703),i=e(94926),a=e(84766),u=e(5224),s=e(99366),c=e(38769).f;o&&n({target:"Object",proto:!0,forced:i},{__lookupGetter__:function(t){var r,e=a(this),n=u(t);do{if(r=c(e,n))return r.get}while(e=s(e))}})},92825:(t,r,e)=>{"use strict";var n=e(7309),o=e(37703),i=e(94926),a=e(84766),u=e(5224),s=e(99366),c=e(38769).f;o&&n({target:"Object",proto:!0,forced:i},{__lookupSetter__:function(t){var r,e=a(this),n=u(t);do{if(r=c(e,n))return r.set}while(e=s(e))}})},67783:(t,r,e)=>{var n=e(7309),o=e(42521),i=e(9154).onFreeze,a=e(91104),u=e(72763),s=Object.preventExtensions;n({target:"Object",stat:!0,forced:u((function(){s(1)})),sham:!a},{preventExtensions:function(t){return s&&o(t)?s(i(t)):t}})},64893:(t,r,e)=>{"use strict";var n=e(37703),o=e(3546),i=e(42521),a=e(84766),u=e(7263),s=Object.getPrototypeOf,c=Object.setPrototypeOf,f=Object.prototype,l="__proto__";if(n&&s&&c&&!(l in f))try{o(f,l,{configurable:!0,get:function(){return s(a(this))},set:function(t){var r=u(this);(i(t)||null===t)&&i(r)&&c(r,t)}})}catch(t){}},61345:(t,r,e)=>{var n=e(7309),o=e(42521),i=e(9154).onFreeze,a=e(91104),u=e(72763),s=Object.seal;n({target:"Object",stat:!0,forced:u((function(){s(1)})),sham:!a},{seal:function(t){return s&&o(t)?s(i(t)):t}})},72451:(t,r,e)=>{e(7309)({target:"Object",stat:!0},{setPrototypeOf:e(86594)})},38465:(t,r,e)=>{var n=e(16395),o=e(73918),i=e(5739);n||o(Object.prototype,"toString",i,{unsafe:!0})},29080:(t,r,e)=>{var n=e(7309),o=e(90962).values;n({target:"Object",stat:!0},{values:function(t){return o(t)}})},47265:(t,r,e)=>{var n=e(7309),o=e(30706);n({global:!0,forced:parseFloat!=o},{parseFloat:o})},96742:(t,r,e)=>{var n=e(7309),o=e(92437);n({global:!0,forced:parseInt!=o},{parseInt:o})},48561:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(19257),a=e(40500),u=e(80224),s=e(64572);n({target:"Promise",stat:!0,forced:e(59942)},{allSettled:function(t){var r=this,e=a.f(r),n=e.resolve,c=e.reject,f=u((function(){var e=i(r.resolve),a=[],u=0,c=1;s(t,(function(t){var i=u++,s=!1;c++,o(e,r,t).then((function(t){s||(s=!0,a[i]={status:"fulfilled",value:t},--c||n(a))}),(function(t){s||(s=!0,a[i]={status:"rejected",reason:t},--c||n(a))}))})),--c||n(a)}));return f.error&&c(f.value),e.promise}})},64765:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(19257),a=e(40500),u=e(80224),s=e(64572);n({target:"Promise",stat:!0,forced:e(59942)},{all:function(t){var r=this,e=a.f(r),n=e.resolve,c=e.reject,f=u((function(){var e=i(r.resolve),a=[],u=0,f=1;s(t,(function(t){var i=u++,s=!1;f++,o(e,r,t).then((function(t){s||(s=!0,a[i]=t,--f||n(a))}),c)})),--f||n(a)}));return f.error&&c(f.value),e.promise}})},38130:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(19257),a=e(77642),u=e(40500),s=e(80224),c=e(64572),f=e(59942),l="No one promise resolved";n({target:"Promise",stat:!0,forced:f},{any:function(t){var r=this,e=a("AggregateError"),n=u.f(r),f=n.resolve,h=n.reject,p=s((function(){var n=i(r.resolve),a=[],u=0,s=1,p=!1;c(t,(function(t){var i=u++,c=!1;s++,o(n,r,t).then((function(t){c||p||(p=!0,f(t))}),(function(t){c||p||(c=!0,a[i]=t,--s||h(new e(a,l)))}))})),--s||h(new e(a,l))}));return p.error&&h(p.value),n.promise}})},3577:(t,r,e)=>{"use strict";var n=e(7309),o=e(8451),i=e(62676).CONSTRUCTOR,a=e(19267),u=e(77642),s=e(25222),c=e(73918),f=a&&a.prototype;if(n({target:"Promise",proto:!0,forced:i,real:!0},{catch:function(t){return this.then(void 0,t)}}),!o&&s(a)){var l=u("Promise").prototype.catch;f.catch!==l&&c(f,"catch",l,{unsafe:!0})}},98621:(t,r,e)=>{"use strict";var n,o,i,a=e(7309),u=e(8451),s=e(1441),c=e(76121),f=e(47702),l=e(73918),h=e(86594),p=e(54849),v=e(8395),d=e(19257),g=e(25222),y=e(42521),m=e(30680),b=e(18159),x=e(94825).set,w=e(26745),S=e(94113),E=e(80224),A=e(60405),O=e(2995),R=e(19267),T=e(62676),I=e(40500),M="Promise",k=T.CONSTRUCTOR,j=T.REJECTION_EVENT,P=T.SUBCLASSING,L=O.getterFor(M),C=O.set,_=R&&R.prototype,N=R,U=_,D=c.TypeError,F=c.document,B=c.process,z=I.f,W=z,V=!!(F&&F.createEvent&&c.dispatchEvent),G="unhandledrejection",H=function(t){var r;return!(!y(t)||!g(r=t.then))&&r},q=function(t,r){var e,n,o,i=r.value,a=1==r.state,u=a?t.ok:t.fail,s=t.resolve,c=t.reject,l=t.domain;try{u?(a||(2===r.rejection&&X(r),r.rejection=1),!0===u?e=i:(l&&l.enter(),e=u(i),l&&(l.exit(),o=!0)),e===t.promise?c(D("Promise-chain cycle")):(n=H(e))?f(n,e,s,c):s(e)):c(i)}catch(t){l&&!o&&l.exit(),c(t)}},Y=function(t,r){t.notified||(t.notified=!0,w((function(){for(var e,n=t.reactions;e=n.get();)q(e,t);t.notified=!1,r&&!t.rejection&&K(t)})))},$=function(t,r,e){var n,o;V?((n=F.createEvent("Event")).promise=r,n.reason=e,n.initEvent(t,!1,!0),c.dispatchEvent(n)):n={promise:r,reason:e},!j&&(o=c["on"+t])?o(n):t===G&&S("Unhandled promise rejection",e)},K=function(t){f(x,c,(function(){var r,e=t.facade,n=t.value;if(J(t)&&(r=E((function(){s?B.emit("unhandledRejection",n,e):$(G,e,n)})),t.rejection=s||J(t)?2:1,r.error))throw r.value}))},J=function(t){return 1!==t.rejection&&!t.parent},X=function(t){f(x,c,(function(){var r=t.facade;s?B.emit("rejectionHandled",r):$("rejectionhandled",r,t.value)}))},Q=function(t,r,e){return function(n){t(r,n,e)}},Z=function(t,r,e){t.done||(t.done=!0,e&&(t=e),t.value=r,t.state=2,Y(t,!0))},tt=function t(r,e,n){if(!r.done){r.done=!0,n&&(r=n);try{if(r.facade===e)throw D("Promise can't be resolved itself");var o=H(e);o?w((function(){var n={done:!1};try{f(o,e,Q(t,n,r),Q(Z,n,r))}catch(t){Z(n,t,r)}})):(r.value=e,r.state=1,Y(r,!1))}catch(t){Z({done:!1},t,r)}}};if(k&&(U=(N=function(t){m(this,U),d(t),f(n,this);var r=L(this);try{t(Q(tt,r),Q(Z,r))}catch(t){Z(r,t)}}).prototype,(n=function(t){C(this,{type:M,done:!1,notified:!1,parent:!1,reactions:new A,rejection:!1,state:0,value:void 0})}).prototype=l(U,"then",(function(t,r){var e=L(this),n=z(b(this,N));return e.parent=!0,n.ok=!g(t)||t,n.fail=g(r)&&r,n.domain=s?B.domain:void 0,0==e.state?e.reactions.add(n):w((function(){q(n,e)})),n.promise})),o=function(){var t=new n,r=L(t);this.promise=t,this.resolve=Q(tt,r),this.reject=Q(Z,r)},I.f=z=function(t){return t===N||void 0===t?new o(t):W(t)},!u&&g(R)&&_!==Object.prototype)){i=_.then,P||l(_,"then",(function(t,r){var e=this;return new N((function(t,r){f(i,e,t,r)})).then(t,r)}),{unsafe:!0});try{delete _.constructor}catch(t){}h&&h(_,U)}a({global:!0,constructor:!0,wrap:!0,forced:k},{Promise:N}),p(N,M,!1,!0),v(M)},59099:(t,r,e)=>{"use strict";var n=e(7309),o=e(8451),i=e(19267),a=e(72763),u=e(77642),s=e(25222),c=e(18159),f=e(3722),l=e(73918),h=i&&i.prototype;if(n({target:"Promise",proto:!0,real:!0,forced:!!i&&a((function(){h.finally.call({then:function(){}},(function(){}))}))},{finally:function(t){var r=c(this,u("Promise")),e=s(t);return this.then(e?function(e){return f(r,t()).then((function(){return e}))}:t,e?function(e){return f(r,t()).then((function(){throw e}))}:t)}}),!o&&s(i)){var p=u("Promise").prototype.finally;h.finally!==p&&l(h,"finally",p,{unsafe:!0})}},4769:(t,r,e)=>{e(98621),e(64765),e(3577),e(34696),e(92123),e(13587)},34696:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(19257),a=e(40500),u=e(80224),s=e(64572);n({target:"Promise",stat:!0,forced:e(59942)},{race:function(t){var r=this,e=a.f(r),n=e.reject,c=u((function(){var a=i(r.resolve);s(t,(function(t){o(a,r,t).then(e.resolve,n)}))}));return c.error&&n(c.value),e.promise}})},92123:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(40500);n({target:"Promise",stat:!0,forced:e(62676).CONSTRUCTOR},{reject:function(t){var r=i.f(this);return o(r.reject,void 0,t),r.promise}})},13587:(t,r,e)=>{"use strict";var n=e(7309),o=e(77642),i=e(8451),a=e(19267),u=e(62676).CONSTRUCTOR,s=e(3722),c=o("Promise"),f=i&&!u;n({target:"Promise",stat:!0,forced:i||u},{resolve:function(t){return s(f&&this===c?a:this,t)}})},93693:(t,r,e)=>{var n=e(7309),o=e(79102),i=e(19257),a=e(86956);n({target:"Reflect",stat:!0,forced:!e(72763)((function(){Reflect.apply((function(){}))}))},{apply:function(t,r,e){return o(i(t),r,a(e))}})},90836:(t,r,e)=>{var n=e(7309),o=e(77642),i=e(79102),a=e(48659),u=e(13834),s=e(86956),c=e(42521),f=e(63571),l=e(72763),h=o("Reflect","construct"),p=Object.prototype,v=[].push,d=l((function(){function t(){}return!(h((function(){}),[],t)instanceof t)})),g=!l((function(){h((function(){}))})),y=d||g;n({target:"Reflect",stat:!0,forced:y,sham:y},{construct:function(t,r){u(t),s(r);var e=arguments.length<3?t:u(arguments[2]);if(g&&!d)return h(t,r,e);if(t==e){switch(r.length){case 0:return new t;case 1:return new t(r[0]);case 2:return new t(r[0],r[1]);case 3:return new t(r[0],r[1],r[2]);case 4:return new t(r[0],r[1],r[2],r[3])}var n=[null];return i(v,n,r),new(i(a,t,n))}var o=e.prototype,l=f(c(o)?o:p),y=i(t,l,r);return c(y)?y:l}})},78621:(t,r,e)=>{var n=e(7309),o=e(37703),i=e(86956),a=e(5224),u=e(67455);n({target:"Reflect",stat:!0,forced:e(72763)((function(){Reflect.defineProperty(u.f({},1,{value:1}),1,{value:2})})),sham:!o},{defineProperty:function(t,r,e){i(t);var n=a(r);i(e);try{return u.f(t,n,e),!0}catch(t){return!1}}})},8460:(t,r,e)=>{var n=e(7309),o=e(86956),i=e(38769).f;n({target:"Reflect",stat:!0},{deleteProperty:function(t,r){var e=i(o(t),r);return!(e&&!e.configurable)&&delete t[r]}})},3698:(t,r,e)=>{var n=e(7309),o=e(37703),i=e(86956),a=e(38769);n({target:"Reflect",stat:!0,sham:!o},{getOwnPropertyDescriptor:function(t,r){return a.f(i(t),r)}})},10613:(t,r,e)=>{var n=e(7309),o=e(86956),i=e(99366);n({target:"Reflect",stat:!0,sham:!e(54264)},{getPrototypeOf:function(t){return i(o(t))}})},36334:(t,r,e)=>{var n=e(7309),o=e(47702),i=e(42521),a=e(86956),u=e(28442),s=e(38769),c=e(99366);n({target:"Reflect",stat:!0},{get:function t(r,e){var n,f,l=arguments.length<3?r:arguments[2];return a(r)===l?r[e]:(n=s.f(r,e))?u(n)?n.value:void 0===n.get?void 0:o(n.get,l):i(f=c(r))?t(f,e,l):void 0}})},1128:(t,r,e)=>{e(7309)({target:"Reflect",stat:!0},{has:function(t,r){return r in t}})},77880:(t,r,e)=>{var n=e(7309),o=e(86956),i=e(18427);n({target:"Reflect",stat:!0},{isExtensible:function(t){return o(t),i(t)}})},94772:(t,r,e)=>{e(7309)({target:"Reflect",stat:!0},{ownKeys:e(79593)})},3260:(t,r,e)=>{var n=e(7309),o=e(77642),i=e(86956);n({target:"Reflect",stat:!0,sham:!e(91104)},{preventExtensions:function(t){i(t);try{var r=o("Object","preventExtensions");return r&&r(t),!0}catch(t){return!1}}})},54829:(t,r,e)=>{var n=e(7309),o=e(86956),i=e(42193),a=e(86594);a&&n({target:"Reflect",stat:!0},{setPrototypeOf:function(t,r){o(t),i(r);try{return a(t,r),!0}catch(t){return!1}}})},50712:(t,r,e)=>{var n=e(7309),o=e(47702),i=e(86956),a=e(42521),u=e(28442),s=e(72763),c=e(67455),f=e(38769),l=e(99366),h=e(5938);n({target:"Reflect",stat:!0,forced:s((function(){var t=function(){},r=c.f(new t,"a",{configurable:!0});return!1!==Reflect.set(t.prototype,"a",1,r)}))},{set:function t(r,e,n){var s,p,v,d=arguments.length<4?r:arguments[3],g=f.f(i(r),e);if(!g){if(a(p=l(r)))return t(p,e,n,d);g=h(0)}if(u(g)){if(!1===g.writable||!a(d))return!1;if(s=f.f(d,e)){if(s.get||s.set||!1===s.writable)return!1;s.value=n,c.f(d,e,s)}else c.f(d,e,h(0,n))}else{if(void 0===(v=g.set))return!1;o(v,d,n)}return!0}})},18314:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(54849);n({global:!0},{Reflect:{}}),i(o.Reflect,"Reflect",!0)},76849:(t,r,e)=>{var n=e(37703),o=e(76121),i=e(47585),a=e(20676),u=e(31985),s=e(91471),c=e(2042).f,f=e(8449),l=e(16272),h=e(93710),p=e(26752),v=e(65443),d=e(21228),g=e(73918),y=e(72763),m=e(89146),b=e(2995).enforce,x=e(8395),w=e(1386),S=e(24750),E=e(30477),A=w("match"),O=o.RegExp,R=O.prototype,T=o.SyntaxError,I=i(R.exec),M=i("".charAt),k=i("".replace),j=i("".indexOf),P=i("".slice),L=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,C=/a/g,_=/a/g,N=new O(C)!==C,U=v.MISSED_STICKY,D=v.UNSUPPORTED_Y;if(a("RegExp",n&&(!N||U||S||E||y((function(){return _[A]=!1,O(C)!=C||O(_)==_||"/a/i"!=O(C,"i")}))))){for(var F=function(t,r){var e,n,o,i,a,c,v=f(R,this),d=l(t),g=void 0===r,y=[],x=t;if(!v&&d&&g&&t.constructor===F)return t;if((d||f(R,t))&&(t=t.source,g&&(r=p(x))),t=void 0===t?"":h(t),r=void 0===r?"":h(r),x=t,S&&"dotAll"in C&&(n=!!r&&j(r,"s")>-1)&&(r=k(r,/s/g,"")),e=r,U&&"sticky"in C&&(o=!!r&&j(r,"y")>-1)&&D&&(r=k(r,/y/g,"")),E&&(i=function(t){for(var r,e=t.length,n=0,o="",i=[],a={},u=!1,s=!1,c=0,f="";n<=e;n++){if("\\"===(r=M(t,n)))r+=M(t,++n);else if("]"===r)u=!1;else if(!u)switch(!0){case"["===r:u=!0;break;case"("===r:I(L,P(t,n+1))&&(n+=2,s=!0),o+=r,c++;continue;case">"===r&&s:if(""===f||m(a,f))throw new T("Invalid capture group name");a[f]=!0,i[i.length]=[f,c],s=!1,f="";continue}s?f+=r:o+=r}return[o,i]}(t),t=i[0],y=i[1]),a=u(O(t,r),v?this:R,F),(n||o||y.length)&&(c=b(a),n&&(c.dotAll=!0,c.raw=F(function(t){for(var r,e=t.length,n=0,o="",i=!1;n<=e;n++)"\\"!==(r=M(t,n))?i||"."!==r?("["===r?i=!0:"]"===r&&(i=!1),o+=r):o+="[\\s\\S]":o+=r+M(t,++n);return o}(t),e)),o&&(c.sticky=!0),y.length&&(c.groups=y)),t!==x)try{s(a,"source",""===x?"(?:)":x)}catch(t){}return a},B=c(O),z=0;B.length>z;)d(F,O,B[z++]);R.constructor=F,F.prototype=R,g(o,"RegExp",F,{constructor:!0})}x("RegExp")},94257:(t,r,e)=>{var n=e(37703),o=e(24750),i=e(42849),a=e(3546),u=e(2995).get,s=RegExp.prototype,c=TypeError;n&&o&&a(s,"dotAll",{configurable:!0,get:function(){if(this!==s){if("RegExp"===i(this))return!!u(this).dotAll;throw c("Incompatible receiver, RegExp required")}}})},48775:(t,r,e)=>{"use strict";var n=e(7309),o=e(73546);n({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},69990:(t,r,e)=>{var n=e(76121),o=e(37703),i=e(3546),a=e(1346),u=e(72763),s=n.RegExp,c=s.prototype;o&&u((function(){var t=!0;try{s(".","d")}catch(r){t=!1}var r={},e="",n=t?"dgimsy":"gimsy",o=function(t,n){Object.defineProperty(r,t,{get:function(){return e+=n,!0}})},i={dotAll:"s",global:"g",ignoreCase:"i",multiline:"m",sticky:"y"};for(var a in t&&(i.hasIndices="d"),i)o(a,i[a]);return Object.getOwnPropertyDescriptor(c,"flags").get.call(r)!==n||e!==n}))&&i(c,"flags",{configurable:!0,get:a})},46037:(t,r,e)=>{var n=e(37703),o=e(65443).MISSED_STICKY,i=e(42849),a=e(3546),u=e(2995).get,s=RegExp.prototype,c=TypeError;n&&o&&a(s,"sticky",{configurable:!0,get:function(){if(this!==s){if("RegExp"===i(this))return!!u(this).sticky;throw c("Incompatible receiver, RegExp required")}}})},96604:(t,r,e)=>{"use strict";e(48775);var n,o,i=e(7309),a=e(47702),u=e(25222),s=e(86956),c=e(93710),f=(n=!1,(o=/[ac]/).exec=function(){return n=!0,/./.exec.apply(this,arguments)},!0===o.test("abc")&&n),l=/./.test;i({target:"RegExp",proto:!0,forced:!f},{test:function(t){var r=s(this),e=c(t),n=r.exec;if(!u(n))return a(l,r,e);var o=a(n,r,e);return null!==o&&(s(o),!0)}})},5364:(t,r,e)=>{"use strict";var n=e(13343).PROPER,o=e(73918),i=e(86956),a=e(93710),u=e(72763),s=e(26752),c="toString",f=RegExp.prototype[c],l=u((function(){return"/a/b"!=f.call({source:"a",flags:"b"})})),h=n&&f.name!=c;(l||h)&&o(RegExp.prototype,c,(function(){var t=i(this);return"/"+a(t.source)+"/"+a(s(t))}),{unsafe:!0})},71981:(t,r,e)=>{"use strict";e(35246)("Set",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),e(95365))},77650:(t,r,e)=>{e(71981)},17214:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("anchor")},{anchor:function(t){return o(this,"a","name",t)}})},3108:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(7263),a=e(64725),u=e(93710),s=e(72763),c=o("".charAt);n({target:"String",proto:!0,forced:s((function(){return"\ud842"!=="𠮷".at(-2)}))},{at:function(t){var r=u(i(this)),e=r.length,n=a(t),o=n>=0?n:e+n;return o<0||o>=e?void 0:c(r,o)}})},90846:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("big")},{big:function(){return o(this,"big","","")}})},84240:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("blink")},{blink:function(){return o(this,"blink","","")}})},54617:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("bold")},{bold:function(){return o(this,"b","","")}})},48839:(t,r,e)=>{"use strict";var n=e(7309),o=e(73832).codeAt;n({target:"String",proto:!0},{codePointAt:function(t){return o(this,t)}})},84028:(t,r,e)=>{"use strict";var n,o=e(7309),i=e(95305),a=e(38769).f,u=e(48331),s=e(93710),c=e(11330),f=e(7263),l=e(10316),h=e(8451),p=i("".endsWith),v=i("".slice),d=Math.min,g=l("endsWith");o({target:"String",proto:!0,forced:!(!h&&!g&&(n=a(String.prototype,"endsWith"),n&&!n.writable)||g)},{endsWith:function(t){var r=s(f(this));c(t);var e=arguments.length>1?arguments[1]:void 0,n=r.length,o=void 0===e?n:d(u(e),n),i=s(t);return p?p(r,i,o):v(r,o-i.length,o)===i}})},31410:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("fixed")},{fixed:function(){return o(this,"tt","","")}})},41392:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("fontcolor")},{fontcolor:function(t){return o(this,"font","color",t)}})},47388:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("fontsize")},{fontsize:function(t){return o(this,"font","size",t)}})},41261:(t,r,e)=>{var n=e(7309),o=e(47585),i=e(11588),a=RangeError,u=String.fromCharCode,s=String.fromCodePoint,c=o([].join);n({target:"String",stat:!0,arity:1,forced:!!s&&1!=s.length},{fromCodePoint:function(t){for(var r,e=[],n=arguments.length,o=0;n>o;){if(r=+arguments[o++],i(r,1114111)!==r)throw a(r+" is not a valid code point");e[o]=r<65536?u(r):u(55296+((r-=65536)>>10),r%1024+56320)}return c(e,"")}})},38310:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(11330),a=e(7263),u=e(93710),s=e(10316),c=o("".indexOf);n({target:"String",proto:!0,forced:!s("includes")},{includes:function(t){return!!~c(u(a(this)),u(i(t)),arguments.length>1?arguments[1]:void 0)}})},78852:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(7263),a=e(93710),u=o("".charCodeAt);n({target:"String",proto:!0},{isWellFormed:function(){for(var t=a(i(this)),r=t.length,e=0;e=56320||++e>=r||56320!=(64512&u(t,e))))return!1}return!0}})},87693:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("italics")},{italics:function(){return o(this,"i","","")}})},56307:(t,r,e)=>{"use strict";var n=e(73832).charAt,o=e(93710),i=e(2995),a=e(19173),u=e(36238),s="String Iterator",c=i.set,f=i.getterFor(s);a(String,"String",(function(t){c(this,{type:s,string:o(t),index:0})}),(function(){var t,r=f(this),e=r.string,o=r.index;return o>=e.length?u(void 0,!0):(t=n(e,o),r.index+=t.length,u(t,!1))}))},48632:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("link")},{link:function(t){return o(this,"a","href",t)}})},73291:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(95305),a=e(720),u=e(36238),s=e(7263),c=e(48331),f=e(93710),l=e(86956),h=e(29714),p=e(42849),v=e(16272),d=e(26752),g=e(74692),y=e(73918),m=e(72763),b=e(1386),x=e(18159),w=e(67675),S=e(1750),E=e(2995),A=e(8451),O=b("matchAll"),R="RegExp String",T=R+" Iterator",I=E.set,M=E.getterFor(T),k=RegExp.prototype,j=TypeError,P=i("".indexOf),L=i("".matchAll),C=!!L&&!m((function(){L("a",/./)})),_=a((function(t,r,e,n){I(this,{type:T,regexp:t,string:r,global:e,unicode:n,done:!1})}),R,(function(){var t=M(this);if(t.done)return u(void 0,!0);var r=t.regexp,e=t.string,n=S(r,e);return null===n?(t.done=!0,u(void 0,!0)):t.global?(""===f(n[0])&&(r.lastIndex=w(e,c(r.lastIndex),t.unicode)),u(n,!1)):(t.done=!0,u(n,!1))})),N=function(t){var r,e,n,o=l(this),i=f(t),a=x(o,RegExp),u=f(d(o));return r=new a(a===RegExp?o.source:o,u),e=!!~P(u,"g"),n=!!~P(u,"u"),r.lastIndex=c(o.lastIndex),new _(r,i,e,n)};n({target:"String",proto:!0,forced:C},{matchAll:function(t){var r,e,n,i,a=s(this);if(h(t)){if(C)return L(a,t)}else{if(v(t)&&(r=f(s(d(t))),!~P(r,"g")))throw j("`.matchAll` does not allow non-global regexes");if(C)return L(a,t);if(void 0===(n=g(t,O))&&A&&"RegExp"==p(t)&&(n=N),n)return o(n,t,a)}return e=f(a),i=new RegExp(t,"g"),A?o(N,i,e):i[O](e)}}),A||O in k||y(k,O,N)},90971:(t,r,e)=>{"use strict";var n=e(47702),o=e(1325),i=e(86956),a=e(29714),u=e(48331),s=e(93710),c=e(7263),f=e(74692),l=e(67675),h=e(1750);o("match",(function(t,r,e){return[function(r){var e=c(this),o=a(r)?void 0:f(r,t);return o?n(o,r,e):new RegExp(r)[t](s(e))},function(t){var n=i(this),o=s(t),a=e(r,n,o);if(a.done)return a.value;if(!n.global)return h(n,o);var c=n.unicode;n.lastIndex=0;for(var f,p=[],v=0;null!==(f=h(n,o));){var d=s(f[0]);p[v]=d,""===d&&(n.lastIndex=l(o,u(n.lastIndex),c)),v++}return 0===v?null:p}]}))},6860:(t,r,e)=>{"use strict";var n=e(7309),o=e(25427).end;n({target:"String",proto:!0,forced:e(32411)},{padEnd:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},67599:(t,r,e)=>{"use strict";var n=e(7309),o=e(25427).start;n({target:"String",proto:!0,forced:e(32411)},{padStart:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}})},87138:(t,r,e)=>{var n=e(7309),o=e(47585),i=e(19969),a=e(84766),u=e(93710),s=e(25902),c=o([].push),f=o([].join);n({target:"String",stat:!0},{raw:function(t){var r=i(a(t).raw),e=s(r);if(!e)return"";for(var n=arguments.length,o=[],l=0;;){if(c(o,u(r[l++])),l===e)return f(o,"");l{e(7309)({target:"String",proto:!0},{repeat:e(59549)})},15461:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(47585),a=e(7263),u=e(25222),s=e(29714),c=e(16272),f=e(93710),l=e(74692),h=e(26752),p=e(64008),v=e(1386),d=e(8451),g=v("replace"),y=TypeError,m=i("".indexOf),b=i("".replace),x=i("".slice),w=Math.max,S=function(t,r,e){return e>t.length?-1:""===r?e:m(t,r,e)};n({target:"String",proto:!0},{replaceAll:function(t,r){var e,n,i,v,E,A,O,R,T,I=a(this),M=0,k=0,j="";if(!s(t)){if((e=c(t))&&(n=f(a(h(t))),!~m(n,"g")))throw y("`.replaceAll` does not allow non-global regexes");if(i=l(t,g))return o(i,t,I,r);if(d&&e)return b(f(I),t,r)}for(v=f(I),E=f(t),(A=u(r))||(r=f(r)),O=E.length,R=w(1,O),M=S(v,E,0);-1!==M;)T=A?f(r(E,M,v)):p(E,v,M,[],void 0,r),j+=x(v,k,M)+T,k=M+O,M=S(v,E,M+R);return k{"use strict";var n=e(79102),o=e(47702),i=e(47585),a=e(1325),u=e(72763),s=e(86956),c=e(25222),f=e(29714),l=e(64725),h=e(48331),p=e(93710),v=e(7263),d=e(67675),g=e(74692),y=e(64008),m=e(1750),b=e(1386)("replace"),x=Math.max,w=Math.min,S=i([].concat),E=i([].push),A=i("".indexOf),O=i("".slice),R="$0"==="a".replace(/./,"$0"),T=!!/./[b]&&""===/./[b]("a","$0");a("replace",(function(t,r,e){var i=T?"$":"$0";return[function(t,e){var n=v(this),i=f(t)?void 0:g(t,b);return i?o(i,t,n,e):o(r,p(n),t,e)},function(t,o){var a=s(this),u=p(t);if("string"==typeof o&&-1===A(o,i)&&-1===A(o,"$<")){var f=e(r,a,u,o);if(f.done)return f.value}var v=c(o);v||(o=p(o));var g=a.global;if(g){var b=a.unicode;a.lastIndex=0}for(var R=[];;){var T=m(a,u);if(null===T)break;if(E(R,T),!g)break;""===p(T[0])&&(a.lastIndex=d(u,h(a.lastIndex),b))}for(var I,M="",k=0,j=0;j=k&&(M+=O(u,k,L)+D,k=L+P.length)}return M+O(u,k)}]}),!!u((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}))||!R||T)},63256:(t,r,e)=>{"use strict";var n=e(47702),o=e(1325),i=e(86956),a=e(29714),u=e(7263),s=e(17162),c=e(93710),f=e(74692),l=e(1750);o("search",(function(t,r,e){return[function(r){var e=u(this),o=a(r)?void 0:f(r,t);return o?n(o,r,e):new RegExp(r)[t](c(e))},function(t){var n=i(this),o=c(t),a=e(r,n,o);if(a.done)return a.value;var u=n.lastIndex;s(u,0)||(n.lastIndex=0);var f=l(n,o);return s(n.lastIndex,u)||(n.lastIndex=u),null===f?-1:f.index}]}))},37309:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("small")},{small:function(){return o(this,"small","","")}})},60836:(t,r,e)=>{"use strict";var n=e(79102),o=e(47702),i=e(47585),a=e(1325),u=e(86956),s=e(29714),c=e(16272),f=e(7263),l=e(18159),h=e(67675),p=e(48331),v=e(93710),d=e(74692),g=e(31280),y=e(1750),m=e(73546),b=e(65443),x=e(72763),w=b.UNSUPPORTED_Y,S=4294967295,E=Math.min,A=[].push,O=i(/./.exec),R=i(A),T=i("".slice);a("split",(function(t,r,e){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,e){var i=v(f(this)),a=void 0===e?S:e>>>0;if(0===a)return[];if(void 0===t)return[i];if(!c(t))return o(r,i,t,a);for(var u,s,l,h=[],p=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,y=new RegExp(t.source,p+"g");(u=o(m,y,i))&&!((s=y.lastIndex)>d&&(R(h,T(i,d,u.index)),u.length>1&&u.index=a));)y.lastIndex===u.index&&y.lastIndex++;return d===i.length?!l&&O(y,"")||R(h,""):R(h,T(i,d)),h.length>a?g(h,0,a):h}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:o(r,this,t,e)}:r,[function(r,e){var n=f(this),a=s(r)?void 0:d(r,t);return a?o(a,r,n,e):o(i,v(n),r,e)},function(t,n){var o=u(this),a=v(t),s=e(i,o,a,n,i!==r);if(s.done)return s.value;var c=l(o,RegExp),f=o.unicode,d=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(w?"g":"y"),g=new c(w?"^(?:"+o.source+")":o,d),m=void 0===n?S:n>>>0;if(0===m)return[];if(0===a.length)return null===y(g,a)?[a]:[];for(var b=0,x=0,A=[];x{"use strict";var n,o=e(7309),i=e(95305),a=e(38769).f,u=e(48331),s=e(93710),c=e(11330),f=e(7263),l=e(10316),h=e(8451),p=i("".startsWith),v=i("".slice),d=Math.min,g=l("startsWith");o({target:"String",proto:!0,forced:!(!h&&!g&&(n=a(String.prototype,"startsWith"),n&&!n.writable)||g)},{startsWith:function(t){var r=s(f(this));c(t);var e=u(d(arguments.length>1?arguments[1]:void 0,r.length)),n=s(t);return p?p(r,n,e):v(r,e,e+n.length)===n}})},54805:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("strike")},{strike:function(){return o(this,"strike","","")}})},34862:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("sub")},{sub:function(){return o(this,"sub","","")}})},82224:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(7263),a=e(64725),u=e(93710),s=o("".slice),c=Math.max,f=Math.min;n({target:"String",proto:!0,forced:!"".substr||"b"!=="ab".substr(-1)},{substr:function(t,r){var e,n,o=u(i(this)),l=o.length,h=a(t);return h===1/0&&(h=0),h<0&&(h=c(l+h,0)),(e=void 0===r?l:a(r))<=0||e===1/0||h>=(n=f(h+e,l))?"":s(o,h,n)}})},52439:(t,r,e)=>{"use strict";var n=e(7309),o=e(8757);n({target:"String",proto:!0,forced:e(53710)("sup")},{sup:function(){return o(this,"sup","","")}})},92242:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702),i=e(47585),a=e(7263),u=e(93710),s=e(72763),c=Array,f=i("".charAt),l=i("".charCodeAt),h=i([].join),p="".toWellFormed,v=p&&s((function(){return"1"!==o(p,1)}));n({target:"String",proto:!0,forced:v},{toWellFormed:function(){var t=u(a(this));if(v)return o(p,t);for(var r=t.length,e=c(r),n=0;n=56320||n+1>=r||56320!=(64512&l(t,n+1))?e[n]="�":(e[n]=f(t,n),e[++n]=f(t,n))}return h(e,"")}})},77234:(t,r,e)=>{e(18340);var n=e(7309),o=e(14946);n({target:"String",proto:!0,name:"trimEnd",forced:"".trimEnd!==o},{trimEnd:o})},38927:(t,r,e)=>{var n=e(7309),o=e(26941);n({target:"String",proto:!0,name:"trimStart",forced:"".trimLeft!==o},{trimLeft:o})},18340:(t,r,e)=>{var n=e(7309),o=e(14946);n({target:"String",proto:!0,name:"trimEnd",forced:"".trimRight!==o},{trimRight:o})},94628:(t,r,e)=>{e(38927);var n=e(7309),o=e(26941);n({target:"String",proto:!0,name:"trimStart",forced:"".trimStart!==o},{trimStart:o})},81505:(t,r,e)=>{"use strict";var n=e(7309),o=e(36842).trim;n({target:"String",proto:!0,forced:e(9756)("trim")},{trim:function(){return o(this)}})},17789:(t,r,e)=>{e(25671)("asyncIterator")},80179:(t,r,e)=>{"use strict";var n=e(7309),o=e(76121),i=e(47702),a=e(47585),u=e(8451),s=e(37703),c=e(80859),f=e(72763),l=e(89146),h=e(8449),p=e(86956),v=e(19969),d=e(5224),g=e(93710),y=e(5938),m=e(63571),b=e(31792),x=e(2042),w=e(2525),S=e(92719),E=e(38769),A=e(67455),O=e(37532),R=e(77751),T=e(73918),I=e(3546),M=e(30896),k=e(52562),j=e(32048),P=e(51735),L=e(1386),C=e(89103),_=e(25671),N=e(51981),U=e(54849),D=e(2995),F=e(25097).forEach,B=k("hidden"),z="Symbol",W="prototype",V=D.set,G=D.getterFor(z),H=Object[W],q=o.Symbol,Y=q&&q[W],$=o.TypeError,K=o.QObject,J=E.f,X=A.f,Q=w.f,Z=R.f,tt=a([].push),rt=M("symbols"),et=M("op-symbols"),nt=M("wks"),ot=!K||!K[W]||!K[W].findChild,it=s&&f((function(){return 7!=m(X({},"a",{get:function(){return X(this,"a",{value:7}).a}})).a}))?function(t,r,e){var n=J(H,r);n&&delete H[r],X(t,r,e),n&&t!==H&&X(H,r,n)}:X,at=function(t,r){var e=rt[t]=m(Y);return V(e,{type:z,tag:t,description:r}),s||(e.description=r),e},ut=function(t,r,e){t===H&&ut(et,r,e),p(t);var n=d(r);return p(e),l(rt,n)?(e.enumerable?(l(t,B)&&t[B][n]&&(t[B][n]=!1),e=m(e,{enumerable:y(0,!1)})):(l(t,B)||X(t,B,y(1,{})),t[B][n]=!0),it(t,n,e)):X(t,n,e)},st=function(t,r){p(t);var e=v(r),n=b(e).concat(ht(e));return F(n,(function(r){s&&!i(ct,e,r)||ut(t,r,e[r])})),t},ct=function(t){var r=d(t),e=i(Z,this,r);return!(this===H&&l(rt,r)&&!l(et,r))&&(!(e||!l(this,r)||!l(rt,r)||l(this,B)&&this[B][r])||e)},ft=function(t,r){var e=v(t),n=d(r);if(e!==H||!l(rt,n)||l(et,n)){var o=J(e,n);return!o||!l(rt,n)||l(e,B)&&e[B][n]||(o.enumerable=!0),o}},lt=function(t){var r=Q(v(t)),e=[];return F(r,(function(t){l(rt,t)||l(j,t)||tt(e,t)})),e},ht=function(t){var r=t===H,e=Q(r?et:v(t)),n=[];return F(e,(function(t){!l(rt,t)||r&&!l(H,t)||tt(n,rt[t])})),n};c||(T(Y=(q=function(){if(h(Y,this))throw $("Symbol is not a constructor");var t=arguments.length&&void 0!==arguments[0]?g(arguments[0]):void 0,r=P(t);return s&&ot&&it(H,r,{configurable:!0,set:function t(e){this===H&&i(t,et,e),l(this,B)&&l(this[B],r)&&(this[B][r]=!1),it(this,r,y(1,e))}}),at(r,t)})[W],"toString",(function(){return G(this).tag})),T(q,"withoutSetter",(function(t){return at(P(t),t)})),R.f=ct,A.f=ut,O.f=st,E.f=ft,x.f=w.f=lt,S.f=ht,C.f=function(t){return at(L(t),t)},s&&(I(Y,"description",{configurable:!0,get:function(){return G(this).description}}),u||T(H,"propertyIsEnumerable",ct,{unsafe:!0}))),n({global:!0,constructor:!0,wrap:!0,forced:!c,sham:!c},{Symbol:q}),F(b(nt),(function(t){_(t)})),n({target:z,stat:!0,forced:!c},{useSetter:function(){ot=!0},useSimple:function(){ot=!1}}),n({target:"Object",stat:!0,forced:!c,sham:!s},{create:function(t,r){return void 0===r?m(t):st(m(t),r)},defineProperty:ut,defineProperties:st,getOwnPropertyDescriptor:ft}),n({target:"Object",stat:!0,forced:!c},{getOwnPropertyNames:lt}),N(),U(q,z),j[B]=!0},73635:(t,r,e)=>{"use strict";var n=e(7309),o=e(37703),i=e(76121),a=e(47585),u=e(89146),s=e(25222),c=e(8449),f=e(93710),l=e(3546),h=e(94488),p=i.Symbol,v=p&&p.prototype;if(o&&s(p)&&(!("description"in v)||void 0!==p().description)){var d={},g=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:f(arguments[0]),r=c(v,this)?new p(t):void 0===t?p():p(t);return""===t&&(d[r]=!0),r};h(g,p),g.prototype=v,v.constructor=g;var y="Symbol(test)"==String(p("test")),m=a(v.valueOf),b=a(v.toString),x=/^Symbol\((.*)\)[^)]+$/,w=a("".replace),S=a("".slice);l(v,"description",{configurable:!0,get:function(){var t=m(this);if(u(d,t))return"";var r=b(t),e=y?S(r,7,-1):w(r,x,"$1");return""===e?void 0:e}}),n({global:!0,constructor:!0,forced:!0},{Symbol:g})}},79129:(t,r,e)=>{var n=e(7309),o=e(77642),i=e(89146),a=e(93710),u=e(30896),s=e(33956),c=u("string-to-symbol-registry"),f=u("symbol-to-string-registry");n({target:"Symbol",stat:!0,forced:!s},{for:function(t){var r=a(t);if(i(c,r))return c[r];var e=o("Symbol")(r);return c[r]=e,f[e]=r,e}})},82866:(t,r,e)=>{e(25671)("hasInstance")},19571:(t,r,e)=>{e(25671)("isConcatSpreadable")},26411:(t,r,e)=>{e(25671)("iterator")},97514:(t,r,e)=>{e(80179),e(79129),e(57607),e(83438),e(12984)},57607:(t,r,e)=>{var n=e(7309),o=e(89146),i=e(5057),a=e(23120),u=e(30896),s=e(33956),c=u("symbol-to-string-registry");n({target:"Symbol",stat:!0,forced:!s},{keyFor:function(t){if(!i(t))throw TypeError(a(t)+" is not a symbol");if(o(c,t))return c[t]}})},80679:(t,r,e)=>{e(25671)("matchAll")},74330:(t,r,e)=>{e(25671)("match")},78689:(t,r,e)=>{e(25671)("replace")},93926:(t,r,e)=>{e(25671)("search")},14872:(t,r,e)=>{e(25671)("species")},62785:(t,r,e)=>{e(25671)("split")},15394:(t,r,e)=>{var n=e(25671),o=e(51981);n("toPrimitive"),o()},21724:(t,r,e)=>{var n=e(77642),o=e(25671),i=e(54849);o("toStringTag"),i(n("Symbol"),"Symbol")},71254:(t,r,e)=>{e(25671)("unscopables")},77984:(t,r,e)=>{"use strict";var n=e(44162),o=e(25902),i=e(64725),a=n.aTypedArray;(0,n.exportTypedArrayMethod)("at",(function(t){var r=a(this),e=o(r),n=i(t),u=n>=0?n:e+n;return u<0||u>=e?void 0:r[u]}))},24062:(t,r,e)=>{"use strict";var n=e(47585),o=e(44162),i=n(e(24579)),a=o.aTypedArray;(0,o.exportTypedArrayMethod)("copyWithin",(function(t,r){return i(a(this),t,r,arguments.length>2?arguments[2]:void 0)}))},82980:(t,r,e)=>{"use strict";var n=e(44162),o=e(25097).every,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("every",(function(t){return o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},76991:(t,r,e)=>{"use strict";var n=e(44162),o=e(6922),i=e(2321),a=e(79538),u=e(47702),s=e(47585),c=e(72763),f=n.aTypedArray,l=n.exportTypedArrayMethod,h=s("".slice);l("fill",(function(t){var r=arguments.length;f(this);var e="Big"===h(a(this),0,3)?i(t):+t;return u(o,this,e,r>1?arguments[1]:void 0,r>2?arguments[2]:void 0)}),c((function(){var t=0;return new Int8Array(2).fill({valueOf:function(){return t++}}),1!==t})))},87629:(t,r,e)=>{"use strict";var n=e(44162),o=e(25097).filter,i=e(85908),a=n.aTypedArray;(0,n.exportTypedArrayMethod)("filter",(function(t){var r=o(a(this),t,arguments.length>1?arguments[1]:void 0);return i(this,r)}))},27529:(t,r,e)=>{"use strict";var n=e(44162),o=e(25097).findIndex,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("findIndex",(function(t){return o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},64659:(t,r,e)=>{"use strict";var n=e(44162),o=e(51486).findLastIndex,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("findLastIndex",(function(t){return o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},92299:(t,r,e)=>{"use strict";var n=e(44162),o=e(51486).findLast,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("findLast",(function(t){return o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},31708:(t,r,e)=>{"use strict";var n=e(44162),o=e(25097).find,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("find",(function(t){return o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},37280:(t,r,e)=>{e(31240)("Float32",(function(t){return function(r,e,n){return t(this,r,e,n)}}))},9747:(t,r,e)=>{e(31240)("Float64",(function(t){return function(r,e,n){return t(this,r,e,n)}}))},16444:(t,r,e)=>{"use strict";var n=e(44162),o=e(25097).forEach,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("forEach",(function(t){o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},46562:(t,r,e)=>{"use strict";var n=e(87928);(0,e(44162).exportTypedArrayStaticMethod)("from",e(21719),n)},26897:(t,r,e)=>{"use strict";var n=e(44162),o=e(59729).includes,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("includes",(function(t){return o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},73196:(t,r,e)=>{"use strict";var n=e(44162),o=e(59729).indexOf,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("indexOf",(function(t){return o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},17607:(t,r,e)=>{e(31240)("Int16",(function(t){return function(r,e,n){return t(this,r,e,n)}}))},81829:(t,r,e)=>{e(31240)("Int32",(function(t){return function(r,e,n){return t(this,r,e,n)}}))},6830:(t,r,e)=>{e(31240)("Int8",(function(t){return function(r,e,n){return t(this,r,e,n)}}))},9491:(t,r,e)=>{"use strict";var n=e(76121),o=e(72763),i=e(47585),a=e(44162),u=e(43541),s=e(1386)("iterator"),c=n.Uint8Array,f=i(u.values),l=i(u.keys),h=i(u.entries),p=a.aTypedArray,v=a.exportTypedArrayMethod,d=c&&c.prototype,g=!o((function(){d[s].call([1])})),y=!!d&&d.values&&d[s]===d.values&&"values"===d.values.name,m=function(){return f(p(this))};v("entries",(function(){return h(p(this))}),g),v("keys",(function(){return l(p(this))}),g),v("values",m,g||!y,{name:"values"}),v(s,m,g||!y,{name:"values"})},33811:(t,r,e)=>{"use strict";var n=e(44162),o=e(47585),i=n.aTypedArray,a=n.exportTypedArrayMethod,u=o([].join);a("join",(function(t){return u(i(this),t)}))},61274:(t,r,e)=>{"use strict";var n=e(44162),o=e(79102),i=e(8139),a=n.aTypedArray;(0,n.exportTypedArrayMethod)("lastIndexOf",(function(t){var r=arguments.length;return o(i,a(this),r>1?[t,arguments[1]]:[t])}))},31010:(t,r,e)=>{"use strict";var n=e(44162),o=e(25097).map,i=e(55725),a=n.aTypedArray;(0,n.exportTypedArrayMethod)("map",(function(t){return o(a(this),t,arguments.length>1?arguments[1]:void 0,(function(t,r){return new(i(t))(r)}))}))},15167:(t,r,e)=>{"use strict";var n=e(44162),o=e(87928),i=n.aTypedArrayConstructor;(0,n.exportTypedArrayStaticMethod)("of",(function(){for(var t=0,r=arguments.length,e=new(i(this))(r);r>t;)e[t]=arguments[t++];return e}),o)},485:(t,r,e)=>{"use strict";var n=e(44162),o=e(59856).right,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("reduceRight",(function(t){var r=arguments.length;return o(i(this),t,r,r>1?arguments[1]:void 0)}))},19313:(t,r,e)=>{"use strict";var n=e(44162),o=e(59856).left,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("reduce",(function(t){var r=arguments.length;return o(i(this),t,r,r>1?arguments[1]:void 0)}))},58491:(t,r,e)=>{"use strict";var n=e(44162),o=n.aTypedArray,i=n.exportTypedArrayMethod,a=Math.floor;i("reverse",(function(){for(var t,r=this,e=o(r).length,n=a(e/2),i=0;i{"use strict";var n=e(76121),o=e(47702),i=e(44162),a=e(25902),u=e(31085),s=e(84766),c=e(72763),f=n.RangeError,l=n.Int8Array,h=l&&l.prototype,p=h&&h.set,v=i.aTypedArray,d=i.exportTypedArrayMethod,g=!c((function(){var t=new Uint8ClampedArray(2);return o(p,t,{length:1,0:3},1),3!==t[1]})),y=g&&i.NATIVE_ARRAY_BUFFER_VIEWS&&c((function(){var t=new l(2);return t.set(1),t.set("2",1),0!==t[0]||2!==t[1]}));d("set",(function(t){v(this);var r=u(arguments.length>1?arguments[1]:void 0,1),e=s(t);if(g)return o(p,this,e,r);var n=this.length,i=a(e),c=0;if(i+r>n)throw f("Wrong length");for(;c{"use strict";var n=e(44162),o=e(55725),i=e(72763),a=e(11939),u=n.aTypedArray;(0,n.exportTypedArrayMethod)("slice",(function(t,r){for(var e=a(u(this),t,r),n=o(this),i=0,s=e.length,c=new n(s);s>i;)c[i]=e[i++];return c}),i((function(){new Int8Array(1).slice()})))},80070:(t,r,e)=>{"use strict";var n=e(44162),o=e(25097).some,i=n.aTypedArray;(0,n.exportTypedArrayMethod)("some",(function(t){return o(i(this),t,arguments.length>1?arguments[1]:void 0)}))},12376:(t,r,e)=>{"use strict";var n=e(76121),o=e(95305),i=e(72763),a=e(19257),u=e(33407),s=e(44162),c=e(45249),f=e(32049),l=e(56962),h=e(58998),p=s.aTypedArray,v=s.exportTypedArrayMethod,d=n.Uint16Array,g=d&&o(d.prototype.sort),y=!(!g||i((function(){g(new d(2),null)}))&&i((function(){g(new d(2),{})}))),m=!!g&&!i((function(){if(l)return l<74;if(c)return c<67;if(f)return!0;if(h)return h<602;var t,r,e=new d(516),n=Array(516);for(t=0;t<516;t++)r=t%4,e[t]=515-t,n[t]=t-2*r+3;for(g(e,(function(t,r){return(t/4|0)-(r/4|0)})),t=0;t<516;t++)if(e[t]!==n[t])return!0}));v("sort",(function(t){return void 0!==t&&a(t),m?g(this,t):u(p(this),function(t){return function(r,e){return void 0!==t?+t(r,e)||0:e!=e?-1:r!=r?1:0===r&&0===e?1/r>0&&1/e<0?1:-1:r>e}}(t))}),!m||y)},11095:(t,r,e)=>{"use strict";var n=e(44162),o=e(48331),i=e(11588),a=e(55725),u=n.aTypedArray;(0,n.exportTypedArrayMethod)("subarray",(function(t,r){var e=u(this),n=e.length,s=i(t,n);return new(a(e))(e.buffer,e.byteOffset+s*e.BYTES_PER_ELEMENT,o((void 0===r?n:i(r,n))-s))}))},43888:(t,r,e)=>{"use strict";var n=e(76121),o=e(79102),i=e(44162),a=e(72763),u=e(11939),s=n.Int8Array,c=i.aTypedArray,f=i.exportTypedArrayMethod,l=[].toLocaleString,h=!!s&&a((function(){l.call(new s(1))}));f("toLocaleString",(function(){return o(l,h?u(c(this)):c(this),u(arguments))}),a((function(){return[1,2].toLocaleString()!=new s([1,2]).toLocaleString()}))||!a((function(){s.prototype.toLocaleString.call([1,2])})))},15308:(t,r,e)=>{"use strict";var n=e(2788),o=e(44162),i=o.aTypedArray,a=o.exportTypedArrayMethod,u=o.getTypedArrayConstructor;a("toReversed",(function(){return n(i(this),u(this))}))},96551:(t,r,e)=>{"use strict";var n=e(44162),o=e(47585),i=e(19257),a=e(15078),u=n.aTypedArray,s=n.getTypedArrayConstructor,c=n.exportTypedArrayMethod,f=o(n.TypedArrayPrototype.sort);c("toSorted",(function(t){void 0!==t&&i(t);var r=u(this),e=a(s(r),r);return f(e,t)}))},58509:(t,r,e)=>{"use strict";var n=e(44162).exportTypedArrayMethod,o=e(72763),i=e(76121),a=e(47585),u=i.Uint8Array,s=u&&u.prototype||{},c=[].toString,f=a([].join);o((function(){c.call({})}))&&(c=function(){return f(this)});var l=s.toString!=c;n("toString",c,l)},74225:(t,r,e)=>{e(31240)("Uint16",(function(t){return function(r,e,n){return t(this,r,e,n)}}))},73863:(t,r,e)=>{e(31240)("Uint32",(function(t){return function(r,e,n){return t(this,r,e,n)}}))},36014:(t,r,e)=>{e(31240)("Uint8",(function(t){return function(r,e,n){return t(this,r,e,n)}}))},57200:(t,r,e)=>{e(31240)("Uint8",(function(t){return function(r,e,n){return t(this,r,e,n)}}),!0)},78415:(t,r,e)=>{"use strict";var n=e(71786),o=e(44162),i=e(18049),a=e(64725),u=e(2321),s=o.aTypedArray,c=o.getTypedArrayConstructor,f=o.exportTypedArrayMethod,l=!!function(){try{new Int8Array(1).with(2,{valueOf:function(){throw 8}})}catch(t){return 8===t}}();f("with",{with:function(t,r){var e=s(this),o=a(t),f=i(e)?u(r):+r;return n(e,c(e),o,f)}}.with,!l)},97448:(t,r,e)=>{"use strict";var n=e(7309),o=e(47585),i=e(93710),a=String.fromCharCode,u=o("".charAt),s=o(/./.exec),c=o("".slice),f=/^[\da-f]{2}$/i,l=/^[\da-f]{4}$/i;n({global:!0},{unescape:function(t){for(var r,e,n=i(t),o="",h=n.length,p=0;p{"use strict";var n,o=e(91104),i=e(76121),a=e(47585),u=e(20267),s=e(9154),c=e(35246),f=e(59285),l=e(42521),h=e(2995).enforce,p=e(72763),v=e(93336),d=Object,g=Array.isArray,y=d.isExtensible,m=d.isFrozen,b=d.isSealed,x=d.freeze,w=d.seal,S={},E={},A=!i.ActiveXObject&&"ActiveXObject"in i,O=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},R=c("WeakMap",O,f),T=R.prototype,I=a(T.set);if(v)if(A){n=f.getConstructor(O,"WeakMap",!0),s.enable();var M=a(T.delete),k=a(T.has),j=a(T.get);u(T,{delete:function(t){if(l(t)&&!y(t)){var r=h(this);return r.frozen||(r.frozen=new n),M(this,t)||r.frozen.delete(t)}return M(this,t)},has:function(t){if(l(t)&&!y(t)){var r=h(this);return r.frozen||(r.frozen=new n),k(this,t)||r.frozen.has(t)}return k(this,t)},get:function(t){if(l(t)&&!y(t)){var r=h(this);return r.frozen||(r.frozen=new n),k(this,t)?j(this,t):r.frozen.get(t)}return j(this,t)},set:function(t,r){if(l(t)&&!y(t)){var e=h(this);e.frozen||(e.frozen=new n),k(this,t)?I(this,t,r):e.frozen.set(t,r)}else I(this,t,r);return this}})}else o&&p((function(){var t=x([]);return I(new R,t,1),!m(t)}))&&u(T,{set:function(t,r){var e;return g(t)&&(m(t)?e=S:b(t)&&(e=E)),I(this,t,r),e==S&&x(t),e==E&&w(t),this}})},38742:(t,r,e)=>{e(13751)},1485:(t,r,e)=>{"use strict";e(35246)("WeakSet",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),e(59285))},43554:(t,r,e)=>{e(1485)},23067:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(77642),a=e(47585),u=e(47702),s=e(72763),c=e(93710),f=e(89146),l=e(40699),h=e(15691).ctoi,p=/[^\d+/a-z]/i,v=/[\t\n\f\r ]+/g,d=/[=]{1,2}$/,g=i("atob"),y=String.fromCharCode,m=a("".charAt),b=a("".replace),x=a(p.exec),w=s((function(){return""!==g(" ")})),S=!s((function(){g("a")})),E=!w&&!S&&!s((function(){g()})),A=!w&&!S&&1!==g.length;n({global:!0,bind:!0,enumerable:!0,forced:w||S||E||A},{atob:function(t){if(l(arguments.length,1),E||A)return u(g,o,t);var r,e,n=b(c(t),v,""),a="",s=0,w=0;if(n.length%4==0&&(n=b(n,d,"")),n.length%4==1||x(p,n))throw new(i("DOMException"))("The string is not correctly encoded","InvalidCharacterError");for(;r=m(n,s++);)f(h,r)&&(e=w%4?64*e+h[r]:h[r],w++%4&&(a+=y(255&e>>(-2*w&6))));return a}})},28350:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(77642),a=e(47585),u=e(47702),s=e(72763),c=e(93710),f=e(40699),l=e(15691).itoc,h=i("btoa"),p=a("".charAt),v=a("".charCodeAt),d=!!h&&!s((function(){h()})),g=!!h&&s((function(){return"bnVsbA=="!==h(null)})),y=!!h&&1!==h.length;n({global:!0,bind:!0,enumerable:!0,forced:d||g||y},{btoa:function(t){if(f(arguments.length,1),d||g||y)return u(h,o,c(t));for(var r,e,n=c(t),a="",s=0,m=l;p(n,s)||(m="=",s%1);){if((e=v(n,s+=3/4))>255)throw new(i("DOMException"))("The string contains characters outside of the Latin1 range","InvalidCharacterError");a+=p(m,63&(r=r<<8|e)>>8-s%1*8)}return a}})},78607:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(94825).clear;n({global:!0,bind:!0,enumerable:!0,forced:o.clearImmediate!==i},{clearImmediate:i})},3962:(t,r,e)=>{var n=e(76121),o=e(83729),i=e(72825),a=e(20702),u=e(91471),s=function(t){if(t&&t.forEach!==a)try{u(t,"forEach",a)}catch(r){t.forEach=a}};for(var c in o)o[c]&&s(n[c]&&n[c].prototype);s(i)},68835:(t,r,e)=>{var n=e(76121),o=e(83729),i=e(72825),a=e(43541),u=e(91471),s=e(1386),c=s("iterator"),f=s("toStringTag"),l=a.values,h=function(t,r){if(t){if(t[c]!==l)try{u(t,c,l)}catch(r){t[c]=l}if(t[f]||u(t,f,r),o[r])for(var e in a)if(t[e]!==a[e])try{u(t,e,a[e])}catch(r){t[e]=a[e]}}};for(var p in o)h(n[p]&&n[p].prototype,p);h(i,"DOMTokenList")},19660:(t,r,e)=>{"use strict";var n=e(7309),o=e(46814),i=e(77642),a=e(72763),u=e(63571),s=e(5938),c=e(67455).f,f=e(73918),l=e(3546),h=e(89146),p=e(30680),v=e(86956),d=e(32447),g=e(72434),y=e(5527),m=e(66433),b=e(2995),x=e(37703),w=e(8451),S="DOMException",E="DATA_CLONE_ERR",A=i("Error"),O=i(S)||function(){try{(new(i("MessageChannel")||o("worker_threads").MessageChannel)).port1.postMessage(new WeakMap)}catch(t){if(t.name==E&&25==t.code)return t.constructor}}(),R=O&&O.prototype,T=A.prototype,I=b.set,M=b.getterFor(S),k="stack"in A(S),j=function(t){return h(y,t)&&y[t].m?y[t].c:0},P=function(){p(this,L);var t=arguments.length,r=g(t<1?void 0:arguments[0]),e=g(t<2?void 0:arguments[1],"Error"),n=j(e);if(I(this,{type:S,name:e,message:r,code:n}),x||(this.name=e,this.message=r,this.code=n),k){var o=A(r);o.name=S,c(this,"stack",s(1,m(o.stack,1)))}},L=P.prototype=u(T),C=function(t){return{enumerable:!0,configurable:!0,get:t}},_=function(t){return C((function(){return M(this)[t]}))};x&&(l(L,"code",_("code")),l(L,"message",_("message")),l(L,"name",_("name"))),c(L,"constructor",s(1,P));var N=a((function(){return!(new O instanceof A)})),U=N||a((function(){return T.toString!==d||"2: 1"!==String(new O(1,2))})),D=N||a((function(){return 25!==new O(1,"DataCloneError").code})),F=N||25!==O[E]||25!==R[E],B=w?U||D||F:N;n({global:!0,constructor:!0,forced:B},{DOMException:B?P:O});var z=i(S),W=z.prototype;for(var V in U&&(w||O===z)&&f(W,"toString",d),D&&x&&O===z&&l(W,"code",C((function(){return j(v(this).name)}))),y)if(h(y,V)){var G=y[V],H=G.s,q=s(6,G.c);h(z,H)||c(z,H,q),h(W,H)||c(W,H,q)}},9094:(t,r,e)=>{"use strict";var n=e(7309),o=e(76121),i=e(77642),a=e(5938),u=e(67455).f,s=e(89146),c=e(30680),f=e(31985),l=e(72434),h=e(5527),p=e(66433),v=e(37703),d=e(8451),g="DOMException",y=i("Error"),m=i(g),b=function(){c(this,x);var t=arguments.length,r=l(t<1?void 0:arguments[0]),e=l(t<2?void 0:arguments[1],"Error"),n=new m(r,e),o=y(r);return o.name=g,u(n,"stack",a(1,p(o.stack,1))),f(n,this,b),n},x=b.prototype=m.prototype,w="stack"in y(g),S="stack"in new m(1,2),E=m&&v&&Object.getOwnPropertyDescriptor(o,g),A=!(!E||E.writable&&E.configurable),O=w&&!A&&!S;n({global:!0,constructor:!0,forced:d||O},{DOMException:O?b:m});var R=i(g),T=R.prototype;if(T.constructor!==R)for(var I in d||u(T,"constructor",a(1,R)),h)if(s(h,I)){var M=h[I],k=M.s;s(R,k)||u(R,k,a(6,M.c))}},30951:(t,r,e)=>{var n=e(77642),o="DOMException";e(54849)(n(o),o)},81605:(t,r,e)=>{e(78607),e(80867)},53928:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(26745),a=e(19257),u=e(40699),s=e(1441),c=o.process;n({global:!0,enumerable:!0,dontCallGetSet:!0},{queueMicrotask:function(t){u(arguments.length,1),a(t);var r=s&&c.domain;i(r?r.bind(t):t)}})},8702:(t,r,e)=>{"use strict";var n=e(7309),o=e(76121),i=e(3546),a=e(37703),u=TypeError,s=Object.defineProperty,c=o.self!==o;try{if(a){var f=Object.getOwnPropertyDescriptor(o,"self");!c&&f&&f.get&&f.enumerable||i(o,"self",{get:function(){return o},set:function(t){if(this!==o)throw u("Illegal invocation");s(o,"self",{value:t,writable:!0,configurable:!0,enumerable:!0})},configurable:!0,enumerable:!0})}else n({global:!0,simple:!0,forced:c},{self:o})}catch(t){}},80867:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(94825).set,a=e(79308),u=o.setImmediate?a(i,!1):i;n({global:!0,bind:!0,enumerable:!0,forced:o.setImmediate!==u},{setImmediate:u})},73711:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(79308)(o.setInterval,!0);n({global:!0,bind:!0,forced:o.setInterval!==i},{setInterval:i})},98442:(t,r,e)=>{var n=e(7309),o=e(76121),i=e(79308)(o.setTimeout,!0);n({global:!0,bind:!0,forced:o.setTimeout!==i},{setTimeout:i})},56467:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o,i=e(8451),a=e(7309),u=e(76121),s=e(77642),c=e(47585),f=e(72763),l=e(51735),h=e(25222),p=e(93722),v=e(29714),d=e(42521),g=e(5057),y=e(64572),m=e(86956),b=e(79538),x=e(89146),w=e(32385),S=e(91471),E=e(25902),A=e(40699),O=e(26752),R=e(5774),T=e(18779),I=e(81112),M=e(79020),k=u.Object,j=u.Array,P=u.Date,L=u.Error,C=u.EvalError,_=u.RangeError,N=u.ReferenceError,U=u.SyntaxError,D=u.TypeError,F=u.URIError,B=u.PerformanceMark,z=u.WebAssembly,W=z&&z.CompileError||L,V=z&&z.LinkError||L,G=z&&z.RuntimeError||L,H=s("DOMException"),q=R.Map,Y=R.has,$=R.get,K=R.set,J=T.Set,X=T.add,Q=s("Object","keys"),Z=c([].push),tt=c((!0).valueOf),rt=c(1..valueOf),et=c("".valueOf),nt=c(P.prototype.getTime),ot=l("structuredClone"),it="DataCloneError",at="Transferring",ut=function(t){return!f((function(){var r=new u.Set([7]),e=t(r),o=t(k(7));return e==r||!e.has(7)||"object"!=n(o)||7!=o}))&&t},st=function(t,r){return!f((function(){var e=new r,n=t({a:e,b:e});return!(n&&n.a===n.b&&n.a instanceof r&&n.a.stack===e.stack)}))},ct=u.structuredClone,ft=i||!st(ct,L)||!st(ct,H)||(o=ct,!!f((function(){var t=o(new u.AggregateError([1],ot,{cause:3}));return"AggregateError"!=t.name||1!=t.errors[0]||t.message!=ot||3!=t.cause}))),lt=!ct&&ut((function(t){return new B(ot,{detail:t}).detail})),ht=ut(ct)||lt,pt=function(t){throw new H("Uncloneable type: "+t,it)},vt=function(t,r){throw new H((r||"Cloning")+" of "+t+" cannot be properly polyfilled in this engine",it)},dt=function(t,r){return ht||vt(r),ht(t)},gt=function t(r,e){if(g(r)&&pt("Symbol"),!d(r))return r;if(e){if(Y(e,r))return $(e,r)}else e=new q;var n,o,i,a,c,f,l,p,v,y,m,A=b(r),R=!1;switch(A){case"Array":i=j(E(r)),R=!0;break;case"Object":i={},R=!0;break;case"Map":i=new q,R=!0;break;case"Set":i=new J,R=!0;break;case"RegExp":i=new RegExp(r.source,O(r));break;case"Error":switch(o=r.name){case"AggregateError":i=s("AggregateError")([]);break;case"EvalError":i=C();break;case"RangeError":i=_();break;case"ReferenceError":i=N();break;case"SyntaxError":i=U();break;case"TypeError":i=D();break;case"URIError":i=F();break;case"CompileError":i=W();break;case"LinkError":i=V();break;case"RuntimeError":i=G();break;default:i=L()}R=!0;break;case"DOMException":i=new H(r.message,r.name),R=!0;break;case"DataView":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":n=u[A],d(n)||vt(A),i=new n(t(r.buffer,e),r.byteOffset,"DataView"===A?r.byteLength:r.length);break;case"DOMQuad":try{i=new DOMQuad(t(r.p1,e),t(r.p2,e),t(r.p3,e),t(r.p4,e))}catch(t){i=dt(r,A)}break;case"File":if(ht)try{i=ht(r),b(i)!==A&&(i=void 0)}catch(t){}if(!i)try{i=new File([r],r.name,r)}catch(t){}i||vt(A);break;case"FileList":if(a=function(){var t;try{t=new u.DataTransfer}catch(r){try{t=new u.ClipboardEvent("").clipboardData}catch(t){}}return t&&t.items&&t.files?t:null}()){for(c=0,f=E(r);c1&&!v(arguments[1])?m(arguments[1]):void 0,n=e?e.transfer:void 0;return void 0!==n&&function(t,r){if(!d(t))throw D("Transfer option cannot be converted to a sequence");var e=[];y(t,(function(t){Z(e,m(t))}));var n,o,i,a,s,c,f=0,l=E(e);if(M)for(a=ct(e,{transfer:e});f{e(73711),e(98442)},10977:(t,r,e)=>{"use strict";e(43541);var n=e(7309),o=e(76121),i=e(47702),a=e(47585),u=e(37703),s=e(87638),c=e(73918),f=e(3546),l=e(20267),h=e(54849),p=e(720),v=e(2995),d=e(30680),g=e(25222),y=e(89146),m=e(43322),b=e(79538),x=e(86956),w=e(42521),S=e(93710),E=e(63571),A=e(5938),O=e(78977),R=e(85111),T=e(40699),I=e(1386),M=e(33407),k=I("iterator"),j="URLSearchParams",P=j+"Iterator",L=v.set,C=v.getterFor(j),_=v.getterFor(P),N=Object.getOwnPropertyDescriptor,U=function(t){if(!u)return o[t];var r=N(o,t);return r&&r.value},D=U("fetch"),F=U("Request"),B=U("Headers"),z=F&&F.prototype,W=B&&B.prototype,V=o.RegExp,G=o.TypeError,H=o.decodeURIComponent,q=o.encodeURIComponent,Y=a("".charAt),$=a([].join),K=a([].push),J=a("".replace),X=a([].shift),Q=a([].splice),Z=a("".split),tt=a("".slice),rt=/\+/g,et=Array(4),nt=function(t){return et[t-1]||(et[t-1]=V("((?:%[\\da-f]{2}){"+t+"})","gi"))},ot=function(t){try{return H(t)}catch(r){return t}},it=function(t){var r=J(t,rt," "),e=4;try{return H(r)}catch(t){for(;e;)r=J(r,nt(e--),ot);return r}},at=/[!'()~]|%20/g,ut={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},st=function(t){return ut[t]},ct=function(t){return J(q(t),at,st)},ft=p((function(t,r){L(this,{type:P,iterator:O(C(t).entries),kind:r})}),"Iterator",(function(){var t=_(this),r=t.kind,e=t.iterator.next(),n=e.value;return e.done||(e.value="keys"===r?n.key:"values"===r?n.value:[n.key,n.value]),e}),!0),lt=function(t){this.entries=[],this.url=null,void 0!==t&&(w(t)?this.parseObject(t):this.parseQuery("string"==typeof t?"?"===Y(t,0)?tt(t,1):t:S(t)))};lt.prototype={type:j,bindURL:function(t){this.url=t,this.update()},parseObject:function(t){var r,e,n,o,a,u,s,c=R(t);if(c)for(e=(r=O(t,c)).next;!(n=i(e,r)).done;){if(a=(o=O(x(n.value))).next,(u=i(a,o)).done||(s=i(a,o)).done||!i(a,o).done)throw G("Expected sequence with length 2");K(this.entries,{key:S(u.value),value:S(s.value)})}else for(var f in t)y(t,f)&&K(this.entries,{key:f,value:S(t[f])})},parseQuery:function(t){if(t)for(var r,e,n=Z(t,"&"),o=0;o0?arguments[0]:void 0));u||(this.size=t.entries.length)},pt=ht.prototype;if(l(pt,{append:function(t,r){var e=C(this);T(arguments.length,2),K(e.entries,{key:S(t),value:S(r)}),u||this.length++,e.updateURL()},delete:function(t){for(var r=C(this),e=T(arguments.length,1),n=r.entries,o=S(t),i=e<2?void 0:arguments[1],a=void 0===i?i:S(i),s=0;sr.key?1:-1})),t.updateURL()},forEach:function(t){for(var r,e=C(this).entries,n=m(t,arguments.length>1?arguments[1]:void 0),o=0;o1?gt(arguments[1]):{})}}),g(F)){var yt=function(t){return d(this,z),new F(t,arguments.length>1?gt(arguments[1]):{})};z.constructor=yt,yt.prototype=z,n({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:yt})}}t.exports={URLSearchParams:ht,getState:C}},2980:(t,r,e)=>{"use strict";var n=e(73918),o=e(47585),i=e(93710),a=e(40699),u=URLSearchParams,s=u.prototype,c=o(s.append),f=o(s.delete),l=o(s.forEach),h=o([].push),p=new u("a=1&a=2");p.delete("a",1),p+""!="a=2"&&n(s,"delete",(function(t){var r=arguments.length,e=r<2?void 0:arguments[1];if(r&&void 0===e)return f(this,t);var n=[];l(this,(function(t,r){h(n,{key:r,value:t})})),a(r,1);for(var o,u=i(t),s=i(e),p=0,v=0,d=!1,g=n.length;p{"use strict";var n=e(73918),o=e(47585),i=e(93710),a=e(40699),u=URLSearchParams,s=u.prototype,c=o(s.getAll),f=o(s.has);new u("a=1").has("a",2)&&n(s,"has",(function(t){var r=arguments.length,e=r<2?void 0:arguments[1];if(r&&void 0===e)return f(this,t);var n=c(this,t);a(r,1);for(var o=i(e),u=0;u{e(10977)},33475:(t,r,e)=>{"use strict";var n=e(37703),o=e(47585),i=e(3546),a=URLSearchParams.prototype,u=o(a.forEach);n&&!("size"in a)&&i(a,"size",{get:function(){var t=0;return u(this,(function(){t++})),t},configurable:!0,enumerable:!0})},36028:(t,r,e)=>{var n=e(7309),o=e(77642),i=e(72763),a=e(40699),u=e(93710),s=e(87638),c=o("URL");n({target:"URL",stat:!0,forced:!(s&&i((function(){c.canParse()})))},{canParse:function(t){var r=a(arguments.length,1),e=u(t),n=r<2||void 0===arguments[1]?void 0:u(arguments[1]);try{return!!new c(e,n)}catch(t){return!1}}})},99489:(t,r,e)=>{"use strict";function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}e(56307);var o,i=e(7309),a=e(37703),u=e(87638),s=e(76121),c=e(43322),f=e(47585),l=e(73918),h=e(3546),p=e(30680),v=e(89146),d=e(81179),g=e(54513),y=e(31280),m=e(73832).codeAt,b=e(81025),x=e(93710),w=e(54849),S=e(40699),E=e(10977),A=e(2995),O=A.set,R=A.getterFor("URL"),T=E.URLSearchParams,I=E.getState,M=s.URL,k=s.TypeError,j=s.parseInt,P=Math.floor,L=Math.pow,C=f("".charAt),_=f(/./.exec),N=f([].join),U=f(1..toString),D=f([].pop),F=f([].push),B=f("".replace),z=f([].shift),W=f("".split),V=f("".slice),G=f("".toLowerCase),H=f([].unshift),q="Invalid scheme",Y="Invalid host",$="Invalid port",K=/[a-z]/i,J=/[\d+-.a-z]/i,X=/\d/,Q=/^0x/i,Z=/^[0-7]+$/,tt=/^\d+$/,rt=/^[\da-f]+$/i,et=/[\0\t\n\r #%/:<>?@[\\\]^|]/,nt=/[\0\t\n\r #/:<>?@[\\\]^|]/,ot=/^[\u0000-\u0020]+/,it=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,at=/[\t\n\r]/g,ut=function(t){var r,e,o,i;if("number"==typeof t){for(r=[],e=0;e<4;e++)H(r,t%256),t=P(t/256);return N(r,".")}if("object"==n(t)){for(r="",o=function(t){for(var r=null,e=1,n=null,o=0,i=0;i<8;i++)0!==t[i]?(o>e&&(r=n,e=o),n=null,o=0):(null===n&&(n=i),++o);return o>e&&(r=n,e=o),r}(t),e=0;e<8;e++)i&&0===t[e]||(i&&(i=!1),o===e?(r+=e?":":"::",i=!0):(r+=U(t[e],16),e<7&&(r+=":")));return"["+r+"]"}return t},st={},ct=d({},st,{" ":1,'"':1,"<":1,">":1,"`":1}),ft=d({},ct,{"#":1,"?":1,"{":1,"}":1}),lt=d({},ft,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),ht=function(t,r){var e=m(t,0);return e>32&&e<127&&!v(r,t)?t:encodeURIComponent(t)},pt={ftp:21,file:null,http:80,https:443,ws:80,wss:443},vt=function(t,r){var e;return 2==t.length&&_(K,C(t,0))&&(":"==(e=C(t,1))||!r&&"|"==e)},dt=function(t){var r;return t.length>1&&vt(V(t,0,2))&&(2==t.length||"/"===(r=C(t,2))||"\\"===r||"?"===r||"#"===r)},gt=function(t){return"."===t||"%2e"===G(t)},yt={},mt={},bt={},xt={},wt={},St={},Et={},At={},Ot={},Rt={},Tt={},It={},Mt={},kt={},jt={},Pt={},Lt={},Ct={},_t={},Nt={},Ut={},Dt=function t(r,e,n){var o,i,a,u=x(r);if(e){if(i=this.parse(u))throw k(i);this.searchParams=null}else{if(void 0!==n&&(o=new t(n,!0)),i=this.parse(u,null,o))throw k(i);(a=I(new T)).bindURL(this),this.searchParams=a}};Dt.prototype={type:"URL",parse:function(t,r,e){var n,i,a,u,s,c=this,f=r||yt,l=0,h="",p=!1,d=!1,m=!1;for(t=x(t),r||(c.scheme="",c.username="",c.password="",c.host=null,c.port=null,c.path=[],c.query=null,c.fragment=null,c.cannotBeABaseURL=!1,t=B(t,ot,""),t=B(t,it,"$1")),t=B(t,at,""),n=g(t);l<=n.length;){switch(i=n[l],f){case yt:if(!i||!_(K,i)){if(r)return q;f=bt;continue}h+=G(i),f=mt;break;case mt:if(i&&(_(J,i)||"+"==i||"-"==i||"."==i))h+=G(i);else{if(":"!=i){if(r)return q;h="",f=bt,l=0;continue}if(r&&(c.isSpecial()!=v(pt,h)||"file"==h&&(c.includesCredentials()||null!==c.port)||"file"==c.scheme&&!c.host))return;if(c.scheme=h,r)return void(c.isSpecial()&&pt[c.scheme]==c.port&&(c.port=null));h="","file"==c.scheme?f=kt:c.isSpecial()&&e&&e.scheme==c.scheme?f=xt:c.isSpecial()?f=At:"/"==n[l+1]?(f=wt,l++):(c.cannotBeABaseURL=!0,F(c.path,""),f=_t)}break;case bt:if(!e||e.cannotBeABaseURL&&"#"!=i)return q;if(e.cannotBeABaseURL&&"#"==i){c.scheme=e.scheme,c.path=y(e.path),c.query=e.query,c.fragment="",c.cannotBeABaseURL=!0,f=Ut;break}f="file"==e.scheme?kt:St;continue;case xt:if("/"!=i||"/"!=n[l+1]){f=St;continue}f=Ot,l++;break;case wt:if("/"==i){f=Rt;break}f=Ct;continue;case St:if(c.scheme=e.scheme,i==o)c.username=e.username,c.password=e.password,c.host=e.host,c.port=e.port,c.path=y(e.path),c.query=e.query;else if("/"==i||"\\"==i&&c.isSpecial())f=Et;else if("?"==i)c.username=e.username,c.password=e.password,c.host=e.host,c.port=e.port,c.path=y(e.path),c.query="",f=Nt;else{if("#"!=i){c.username=e.username,c.password=e.password,c.host=e.host,c.port=e.port,c.path=y(e.path),c.path.length--,f=Ct;continue}c.username=e.username,c.password=e.password,c.host=e.host,c.port=e.port,c.path=y(e.path),c.query=e.query,c.fragment="",f=Ut}break;case Et:if(!c.isSpecial()||"/"!=i&&"\\"!=i){if("/"!=i){c.username=e.username,c.password=e.password,c.host=e.host,c.port=e.port,f=Ct;continue}f=Rt}else f=Ot;break;case At:if(f=Ot,"/"!=i||"/"!=C(h,l+1))continue;l++;break;case Ot:if("/"!=i&&"\\"!=i){f=Rt;continue}break;case Rt:if("@"==i){p&&(h="%40"+h),p=!0,a=g(h);for(var b=0;b65535)return $;c.port=c.isSpecial()&&E===pt[c.scheme]?null:E,h=""}if(r)return;f=Lt;continue}return $}h+=i;break;case kt:if(c.scheme="file","/"==i||"\\"==i)f=jt;else{if(!e||"file"!=e.scheme){f=Ct;continue}if(i==o)c.host=e.host,c.path=y(e.path),c.query=e.query;else if("?"==i)c.host=e.host,c.path=y(e.path),c.query="",f=Nt;else{if("#"!=i){dt(N(y(n,l),""))||(c.host=e.host,c.path=y(e.path),c.shortenPath()),f=Ct;continue}c.host=e.host,c.path=y(e.path),c.query=e.query,c.fragment="",f=Ut}}break;case jt:if("/"==i||"\\"==i){f=Pt;break}e&&"file"==e.scheme&&!dt(N(y(n,l),""))&&(vt(e.path[0],!0)?F(c.path,e.path[0]):c.host=e.host),f=Ct;continue;case Pt:if(i==o||"/"==i||"\\"==i||"?"==i||"#"==i){if(!r&&vt(h))f=Ct;else if(""==h){if(c.host="",r)return;f=Lt}else{if(u=c.parseHost(h))return u;if("localhost"==c.host&&(c.host=""),r)return;h="",f=Lt}continue}h+=i;break;case Lt:if(c.isSpecial()){if(f=Ct,"/"!=i&&"\\"!=i)continue}else if(r||"?"!=i)if(r||"#"!=i){if(i!=o&&(f=Ct,"/"!=i))continue}else c.fragment="",f=Ut;else c.query="",f=Nt;break;case Ct:if(i==o||"/"==i||"\\"==i&&c.isSpecial()||!r&&("?"==i||"#"==i)){if(".."===(s=G(s=h))||"%2e."===s||".%2e"===s||"%2e%2e"===s?(c.shortenPath(),"/"==i||"\\"==i&&c.isSpecial()||F(c.path,"")):gt(h)?"/"==i||"\\"==i&&c.isSpecial()||F(c.path,""):("file"==c.scheme&&!c.path.length&&vt(h)&&(c.host&&(c.host=""),h=C(h,0)+":"),F(c.path,h)),h="","file"==c.scheme&&(i==o||"?"==i||"#"==i))for(;c.path.length>1&&""===c.path[0];)z(c.path);"?"==i?(c.query="",f=Nt):"#"==i&&(c.fragment="",f=Ut)}else h+=ht(i,ft);break;case _t:"?"==i?(c.query="",f=Nt):"#"==i?(c.fragment="",f=Ut):i!=o&&(c.path[0]+=ht(i,st));break;case Nt:r||"#"!=i?i!=o&&("'"==i&&c.isSpecial()?c.query+="%27":c.query+="#"==i?"%23":ht(i,st)):(c.fragment="",f=Ut);break;case Ut:i!=o&&(c.fragment+=ht(i,ct))}l++}},parseHost:function(t){var r,e,n;if("["==C(t,0)){if("]"!=C(t,t.length-1))return Y;if(r=function(t){var r,e,n,o,i,a,u,s=[0,0,0,0,0,0,0,0],c=0,f=null,l=0,h=function(){return C(t,l)};if(":"==h()){if(":"!=C(t,1))return;l+=2,f=++c}for(;h();){if(8==c)return;if(":"!=h()){for(r=e=0;e<4&&_(rt,h());)r=16*r+j(h(),16),l++,e++;if("."==h()){if(0==e)return;if(l-=e,c>6)return;for(n=0;h();){if(o=null,n>0){if(!("."==h()&&n<4))return;l++}if(!_(X,h()))return;for(;_(X,h());){if(i=j(h(),10),null===o)o=i;else{if(0==o)return;o=10*o+i}if(o>255)return;l++}s[c]=256*s[c]+o,2!=++n&&4!=n||c++}if(4!=n)return;break}if(":"==h()){if(l++,!h())return}else if(h())return;s[c++]=r}else{if(null!==f)return;l++,f=++c}}if(null!==f)for(a=c-f,c=7;0!=c&&a>0;)u=s[c],s[c--]=s[f+a-1],s[f+--a]=u;else if(8!=c)return;return s}(V(t,1,-1)),!r)return Y;this.host=r}else if(this.isSpecial()){if(t=b(t),_(et,t))return Y;if(r=function(t){var r,e,n,o,i,a,u,s=W(t,".");if(s.length&&""==s[s.length-1]&&s.length--,(r=s.length)>4)return t;for(e=[],n=0;n1&&"0"==C(o,0)&&(i=_(Q,o)?16:8,o=V(o,8==i?1:2)),""===o)a=0;else{if(!_(10==i?tt:8==i?Z:rt,o))return t;a=j(o,i)}F(e,a)}for(n=0;n=L(256,5-r))return null}else if(a>255)return null;for(u=D(e),n=0;n1?arguments[1]:void 0,n=O(r,new Dt(t,!1,e));a||(r.href=n.serialize(),r.origin=n.getOrigin(),r.protocol=n.getProtocol(),r.username=n.getUsername(),r.password=n.getPassword(),r.host=n.getHost(),r.hostname=n.getHostname(),r.port=n.getPort(),r.pathname=n.getPathname(),r.search=n.getSearch(),r.searchParams=n.getSearchParams(),r.hash=n.getHash())},Bt=Ft.prototype,zt=function(t,r){return{get:function(){return R(this)[t]()},set:r&&function(t){return R(this)[r](t)},configurable:!0,enumerable:!0}};if(a&&(h(Bt,"href",zt("serialize","setHref")),h(Bt,"origin",zt("getOrigin")),h(Bt,"protocol",zt("getProtocol","setProtocol")),h(Bt,"username",zt("getUsername","setUsername")),h(Bt,"password",zt("getPassword","setPassword")),h(Bt,"host",zt("getHost","setHost")),h(Bt,"hostname",zt("getHostname","setHostname")),h(Bt,"port",zt("getPort","setPort")),h(Bt,"pathname",zt("getPathname","setPathname")),h(Bt,"search",zt("getSearch","setSearch")),h(Bt,"searchParams",zt("getSearchParams")),h(Bt,"hash",zt("getHash","setHash"))),l(Bt,"toJSON",(function(){return R(this).serialize()}),{enumerable:!0}),l(Bt,"toString",(function(){return R(this).serialize()}),{enumerable:!0}),M){var Wt=M.createObjectURL,Vt=M.revokeObjectURL;Wt&&l(Ft,"createObjectURL",c(Wt,M)),Vt&&l(Ft,"revokeObjectURL",c(Vt,M))}w(Ft,"URL"),i({global:!0,constructor:!0,forced:!u,sham:!a},{URL:Ft})},11425:(t,r,e)=>{e(99489)},62793:(t,r,e)=>{"use strict";var n=e(7309),o=e(47702);n({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return o(URL.prototype.toString,this)}})},32743:(t,r,e)=>{e(97514),e(73635),e(17789),e(82866),e(19571),e(26411),e(74330),e(80679),e(78689),e(93926),e(14872),e(62785),e(15394),e(21724),e(71254),e(72965),e(6691),e(99298),e(56689),e(12305),e(26268),e(68350),e(20635),e(42498),e(60306),e(9670),e(65750),e(99716),e(39741),e(30812),e(4304),e(25146),e(36147),e(10304),e(40233),e(34364),e(43541),e(69911),e(28787),e(50472),e(41031),e(33976),e(45519),e(18843),e(64487),e(95452),e(50462),e(54070),e(71025),e(80166),e(39295),e(90231),e(8887),e(29993),e(82519),e(46365),e(99327),e(45958),e(50266),e(72471),e(68678),e(55187),e(71468),e(91852),e(68118),e(74818),e(77026),e(38607),e(20836),e(75150),e(23080),e(45192),e(77441),e(68428),e(83438),e(36087),e(8974),e(84997),e(6423),e(33319),e(61134),e(47381),e(67316),e(68536),e(3563),e(5373),e(64039),e(72778),e(29309),e(63104),e(56379),e(59604),e(73387),e(25120),e(10084),e(3278),e(31917),e(10026),e(83069),e(96816),e(57022),e(89421),e(45725),e(26629),e(40694),e(35636),e(89994),e(66805),e(19425),e(81591),e(66925),e(27559),e(64832),e(92354),e(89064),e(75759),e(42612),e(20631),e(79556),e(87081),e(74419),e(86155),e(60521),e(33149),e(32755),e(6775),e(97757),e(56495),e(92825),e(67783),e(64893),e(61345),e(72451),e(38465),e(29080),e(47265),e(96742),e(4769),e(48561),e(38130),e(59099),e(93693),e(90836),e(78621),e(8460),e(36334),e(3698),e(10613),e(1128),e(77880),e(94772),e(3260),e(50712),e(54829),e(18314),e(76849),e(94257),e(48775),e(69990),e(46037),e(96604),e(5364),e(77650),e(3108),e(48839),e(84028),e(41261),e(38310),e(78852),e(56307),e(90971),e(73291),e(6860),e(67599),e(87138),e(40079),e(38494),e(15461),e(63256),e(60836),e(6782),e(82224),e(92242),e(81505),e(77234),e(94628),e(17214),e(90846),e(84240),e(54617),e(31410),e(41392),e(47388),e(87693),e(48632),e(37309),e(54805),e(34862),e(52439),e(37280),e(9747),e(6830),e(17607),e(81829),e(36014),e(57200),e(74225),e(73863),e(77984),e(24062),e(82980),e(76991),e(87629),e(31708),e(27529),e(92299),e(64659),e(16444),e(46562),e(26897),e(73196),e(9491),e(33811),e(61274),e(31010),e(15167),e(19313),e(485),e(58491),e(24230),e(52826),e(80070),e(12376),e(11095),e(43888),e(15308),e(96551),e(58509),e(78415),e(97448),e(38742),e(43554),e(23067),e(28350),e(3962),e(68835),e(19660),e(9094),e(30951),e(81605),e(53928),e(8702),e(56467),e(42113),e(11425),e(36028),e(62793),e(52894),e(2980),e(79485),e(33475),e(1035)},36760:(t,r,e)=>{function n(t){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},n(t)}var o=function(t){"use strict";var r,e=Object.prototype,o=e.hasOwnProperty,i=Object.defineProperty||function(t,r,e){t[r]=e.value},a="function"==typeof Symbol?Symbol:{},u=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",c=a.toStringTag||"@@toStringTag";function f(t,r,e){return Object.defineProperty(t,r,{value:e,enumerable:!0,configurable:!0,writable:!0}),t[r]}try{f({},"")}catch(t){f=function(t,r,e){return t[r]=e}}function l(t,r,e,n){var o=r&&r.prototype instanceof m?r:m,a=Object.create(o.prototype),u=new j(n||[]);return i(a,"_invoke",{value:T(t,e,u)}),a}function h(t,r,e){try{return{type:"normal",arg:t.call(r,e)}}catch(t){return{type:"throw",arg:t}}}t.wrap=l;var p="suspendedStart",v="suspendedYield",d="executing",g="completed",y={};function m(){}function b(){}function x(){}var w={};f(w,u,(function(){return this}));var S=Object.getPrototypeOf,E=S&&S(S(P([])));E&&E!==e&&o.call(E,u)&&(w=E);var A=x.prototype=m.prototype=Object.create(w);function O(t){["next","throw","return"].forEach((function(r){f(t,r,(function(t){return this._invoke(r,t)}))}))}function R(t,r){function e(i,a,u,s){var c=h(t[i],t,a);if("throw"!==c.type){var f=c.arg,l=f.value;return l&&"object"===n(l)&&o.call(l,"__await")?r.resolve(l.__await).then((function(t){e("next",t,u,s)}),(function(t){e("throw",t,u,s)})):r.resolve(l).then((function(t){f.value=t,u(f)}),(function(t){return e("throw",t,u,s)}))}s(c.arg)}var a;i(this,"_invoke",{value:function(t,n){function o(){return new r((function(r,o){e(t,n,r,o)}))}return a=a?a.then(o,o):o()}})}function T(t,r,e){var n=p;return function(o,i){if(n===d)throw new Error("Generator is already running");if(n===g){if("throw"===o)throw i;return L()}for(e.method=o,e.arg=i;;){var a=e.delegate;if(a){var u=I(a,e);if(u){if(u===y)continue;return u}}if("next"===e.method)e.sent=e._sent=e.arg;else if("throw"===e.method){if(n===p)throw n=g,e.arg;e.dispatchException(e.arg)}else"return"===e.method&&e.abrupt("return",e.arg);n=d;var s=h(t,r,e);if("normal"===s.type){if(n=e.done?g:v,s.arg===y)continue;return{value:s.arg,done:e.done}}"throw"===s.type&&(n=g,e.method="throw",e.arg=s.arg)}}}function I(t,e){var n=e.method,o=t.iterator[n];if(o===r)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=r,I(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=h(o,t.iterator,e.arg);if("throw"===i.type)return e.method="throw",e.arg=i.arg,e.delegate=null,y;var a=i.arg;return a?a.done?(e[t.resultName]=a.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=r),e.delegate=null,y):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,y)}function M(t){var r={tryLoc:t[0]};1 in t&&(r.catchLoc=t[1]),2 in t&&(r.finallyLoc=t[2],r.afterLoc=t[3]),this.tryEntries.push(r)}function k(t){var r=t.completion||{};r.type="normal",delete r.arg,t.completion=r}function j(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(M,this),this.reset(!0)}function P(t){if(t){var e=t[u];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function e(){for(;++n=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var s=o.call(a,"catchLoc"),c=o.call(a,"finallyLoc");if(s&&c){if(this.prev=0;--e){var n=this.tryEntries[e];if(n.tryLoc<=this.prev&&o.call(n,"finallyLoc")&&this.prev=0;--r){var e=this.tryEntries[r];if(e.finallyLoc===t)return this.complete(e.completion,e.afterLoc),k(e),y}},catch:function(t){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc===t){var n=e.completion;if("throw"===n.type){var o=n.arg;k(e)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:P(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=r),y}},t}("object"===n(t=e.nmd(t))?t.exports:{});try{regeneratorRuntime=o}catch(t){"object"===("undefined"==typeof globalThis?"undefined":n(globalThis))?globalThis.regeneratorRuntime=o:Function("r","regeneratorRuntime = r")(o)}}},r={};function e(n){var o=r[n];if(void 0!==o)return o.exports;var i=r[n]={id:n,loaded:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}e.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),e.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),(()=>{"use strict";e(32743),e(36760),Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(t){var r=this;do{if(Element.prototype.matches.call(r,t))return r;r=r.parentElement||r.parentNode}while(null!==r&&1===r.nodeType);return null})})()})(); \ No newline at end of file diff --git a/script/viewer.js b/script/viewer.js new file mode 100644 index 0000000..b231d20 --- /dev/null +++ b/script/viewer.js @@ -0,0 +1,23 @@ +const viewer = OpenSeadragon({ + id: "viewer", + showNavigator: true, + showZoomControl: false, + showHomeControl: false, + showFullPageControl: false, + showRotationControl: false + }); + +viewer.smartScrollZoom({ + minScrolls: 1, + timeThreshold: 0.01, + zoomIncrement: 1000 +}); + +viewer.viewport.minZoomLevel = 0.033; +viewer.viewport.maxZoomLevel = 100; +viewer.viewport.defaultZoomLevel = 0.5; +viewer.viewport.scrollHandlerSpeed = 1000; +viewer.drawer.context.imageSmoothingEnabled = false; +viewer.gestureSettingsMouse.clickToZoom = false; + +viewer.viewport.goHome(true); \ No newline at end of file diff --git a/style.css b/style.css new file mode 100644 index 0000000..8e8dbca --- /dev/null +++ b/style.css @@ -0,0 +1,181 @@ +body { + background-color: #222; + margin: 0; + font-family: sans-serif; + color: white; + overflow: hidden; +} + +#viewer { + width: 100vw; + height: 100vh; + background-color: #222; + background-image: url("image/su.png"); + background-repeat: no-repeat; + background-size: auto; + background-position: center; + image-rendering: pixelated; +} + +.r6o-editor { + z-index: 3; + height: auto; +} + +.r6o-widget.comment { + font-size: 1.5em; + background-color: #333 +} + +.r6o-editor .r6o-arrow:after { + background-color: #333; + border: 3px white solid; +} + +.r6o-editor .r6o-editor-inner .r6o-widget { + border: 3px white solid; +} + +.r6o-editor .r6o-editor-inner { + background-color: transparent !important; +} + +.r6o-footer { + display: none; +} + +div { + color: white; +} + +a { + color: white; + font-weight: bold; +} + +#here-now { + position: fixed; + bottom: 0; + left: 0; + font-size: 1.5vh; + color: white; + padding: 15px; + z-index: 2; +} + +#question { + font-size: 3vh; + width: 3vh; + height: 3vh; + position: fixed; + bottom: 0; + right: 0; + background-color: #333; + color: #fff; + border: 3px solid white; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + padding: 15px; + margin: 10px; +} + +#question img { + max-width: 100%; + height: auto; + display: block; +} + +#modal-overlay { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + z-index: 3; +} + +#banner { + max-width: 100%; +} +#modal { + display: none; + font-size: 18pt; + position: fixed; + top: 50%; + opacity: 0; + transition: opacity 0.3s ease-in-out; + left: 50%; + transform: translate(-50%, -50%); + justify-content: center; + border-radius: 1rem; + box-shadow: 0 0 10px 10px #000; + background-color: #333; + align-items: center; + z-index: 4; + width: 80%; + height: 80%; + overflow-y: auto; +} + +#modal-content { + position: relative; + padding: 33px; + text-align: center; + max-height: 100%; + font-size: 15pt; +} + +@keyframes animateBg { + 0% { + background-position: 0 0; + } + 100% { + background-position: 100% 0; + } +} + +.rainbow { + background: linear-gradient(90deg, #f1672b, #fea419, #efd515, #89d842, #35c2f9, #9b5fe0, #ff68cf, #f1672b, #fea419, #efd515, #89d842, #35c2f9, #9b5fe0, #ff68cf, #f1672b, #fea419, #efd515, #89d842, #35c2f9, #9b5fe0, #ff68cf, #f1672b); + background-size: 300% 100%; + -webkit-background-clip: text; + animation: animateBg 5s infinite linear; + background-clip: text; + color: transparent; +} + +#close-button { + position: absolute; + font-size: 3rem; + top: 15px; + right: 30px; + cursor: pointer; + width: 3vh; + height: 3vh; + background-color: #333; + color: #fff; + border: 3px solid white; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + padding: 15px; + margin: 10px; +} + +#open-button { + cursor: pointer; +} + +@media screen and (max-width: 1081px) { + #viewer { + width: 100vw; + height: 66vh; + } + #modal-content { + font-size: 20pt; + } +} diff --git a/websocket/requirements.txt b/websocket/requirements.txt new file mode 100644 index 0000000..716f2ab --- /dev/null +++ b/websocket/requirements.txt @@ -0,0 +1 @@ +tornado \ No newline at end of file diff --git a/websocket/websocket.py b/websocket/websocket.py new file mode 100644 index 0000000..07fdaf2 --- /dev/null +++ b/websocket/websocket.py @@ -0,0 +1,32 @@ +import tornado.ioloop +import tornado.web +import tornado.websocket + +class WebSocketHandler(tornado.websocket.WebSocketHandler): + clients = set() + + def open(self): + WebSocketHandler.clients.add(self) + self.send_client_count() + + def on_close(self): + WebSocketHandler.clients.remove(self) + self.send_client_count() + + def send_client_count(self): + count = len(WebSocketHandler.clients) + for client in WebSocketHandler.clients: + try: + client.write_message(str(count)) + except Exception as e: + print(f"Error sending message to client: {e}") + +app = tornado.web.Application([ + (r"/funsocket", WebSocketHandler), +]) + +if __name__ == "__main__": + app.listen(8080) + print("WebSocket server is running on port 8080") + tornado.ioloop.IOLoop.current().start() +

    {P?NgQ)|F~+AV_ja4pc$x=M*k+3YqQh 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