From f5fe2bfe1022ce9616cbb2a20673b39c8d2ded9c Mon Sep 17 00:00:00 2001
From: oyvind <oyvindlg@gmail.com>
Date: Mon, 18 Apr 2016 15:52:59 +0200
Subject: [PATCH] =?UTF-8?q?commit=20alle=20endringer=20p=C3=A5=20marcus?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 components/includes/dzi.inc                   |     2 +-
 components/services/home/html.template        |    14 +-
 .../instance%2Fcollection/html.template       |     5 +-
 .../queries/haspart.query                     |     3 +-
 .../images/fullpage_grouphover.png            |   Bin 4907 -> 0 bytes
 .../openseadragon/images/fullpage_hover.png   |   Bin 5214 -> 0 bytes
 .../openseadragon/images/fullpage_pressed.png |   Bin 5213 -> 0 bytes
 .../js/openseadragon/images/fullpage_rest.png |   Bin 5155 -> 0 bytes
 .../openseadragon/images/home_grouphover.png  |   Bin 4808 -> 0 bytes
 .../js/openseadragon/images/home_hover.png    |   Bin 5107 -> 0 bytes
 .../js/openseadragon/images/home_pressed.png  |   Bin 5138 -> 0 bytes
 .../js/openseadragon/images/home_rest.png     |   Bin 5061 -> 0 bytes
 .../openseadragon/images/next_grouphover.png  |   Bin 3004 -> 0 bytes
 .../js/openseadragon/images/next_hover.png    |   Bin 3433 -> 0 bytes
 .../js/openseadragon/images/next_pressed.png  |   Bin 3503 -> 0 bytes
 .../js/openseadragon/images/next_rest.png     |   Bin 3061 -> 0 bytes
 .../images/previous_grouphover.png            |   Bin 2987 -> 0 bytes
 .../openseadragon/images/previous_hover.png   |   Bin 3461 -> 0 bytes
 .../openseadragon/images/previous_pressed.png |   Bin 3499 -> 0 bytes
 .../js/openseadragon/images/previous_rest.png |   Bin 3064 -> 0 bytes
 .../images/rotateleft_grouphover.png          |   Bin 1902 -> 0 bytes
 .../openseadragon/images/rotateleft_hover.png |   Bin 2289 -> 0 bytes
 .../images/rotateleft_pressed.png             |   Bin 2242 -> 0 bytes
 .../openseadragon/images/rotateleft_rest.png  |   Bin 1943 -> 0 bytes
 .../images/rotateright_grouphover.png         |   Bin 1970 -> 0 bytes
 .../images/rotateright_hover.png              |   Bin 2338 -> 0 bytes
 .../images/rotateright_pressed.png            |   Bin 2228 -> 0 bytes
 .../openseadragon/images/rotateright_rest.png |   Bin 1961 -> 0 bytes
 .../images/zoomin_grouphover.png              |   Bin 4794 -> 0 bytes
 .../js/openseadragon/images/zoomin_hover.png  |   Bin 5126 -> 0 bytes
 .../openseadragon/images/zoomin_pressed.png   |   Bin 5172 -> 0 bytes
 .../js/openseadragon/images/zoomin_rest.png   |   Bin 5041 -> 0 bytes
 .../images/zoomout_grouphover.png             |   Bin 4596 -> 0 bytes
 .../js/openseadragon/images/zoomout_hover.png |   Bin 4931 -> 0 bytes
 .../openseadragon/images/zoomout_pressed.png  |   Bin 5007 -> 0 bytes
 .../js/openseadragon/images/zoomout_rest.png  |   Bin 4811 -> 0 bytes
 .../static/js/openseadragon/openseadragon.js  | 14365 ----------------
 .../js/openseadragon/openseadragon.min.js     |    10 -
 .../js/openseadragon/openseadragon.min.js.map |     1 -
 components/types/bibo__Document/html.template |    45 +-
 .../types/bibo__Document/queries/main.query   |    23 +-
 41 files changed, 71 insertions(+), 14397 deletions(-)
 delete mode 100755 components/static/js/openseadragon/images/fullpage_grouphover.png
 delete mode 100755 components/static/js/openseadragon/images/fullpage_hover.png
 delete mode 100755 components/static/js/openseadragon/images/fullpage_pressed.png
 delete mode 100755 components/static/js/openseadragon/images/fullpage_rest.png
 delete mode 100755 components/static/js/openseadragon/images/home_grouphover.png
 delete mode 100755 components/static/js/openseadragon/images/home_hover.png
 delete mode 100755 components/static/js/openseadragon/images/home_pressed.png
 delete mode 100755 components/static/js/openseadragon/images/home_rest.png
 delete mode 100755 components/static/js/openseadragon/images/next_grouphover.png
 delete mode 100755 components/static/js/openseadragon/images/next_hover.png
 delete mode 100755 components/static/js/openseadragon/images/next_pressed.png
 delete mode 100755 components/static/js/openseadragon/images/next_rest.png
 delete mode 100755 components/static/js/openseadragon/images/previous_grouphover.png
 delete mode 100755 components/static/js/openseadragon/images/previous_hover.png
 delete mode 100755 components/static/js/openseadragon/images/previous_pressed.png
 delete mode 100755 components/static/js/openseadragon/images/previous_rest.png
 delete mode 100755 components/static/js/openseadragon/images/rotateleft_grouphover.png
 delete mode 100755 components/static/js/openseadragon/images/rotateleft_hover.png
 delete mode 100755 components/static/js/openseadragon/images/rotateleft_pressed.png
 delete mode 100755 components/static/js/openseadragon/images/rotateleft_rest.png
 delete mode 100755 components/static/js/openseadragon/images/rotateright_grouphover.png
 delete mode 100755 components/static/js/openseadragon/images/rotateright_hover.png
 delete mode 100755 components/static/js/openseadragon/images/rotateright_pressed.png
 delete mode 100755 components/static/js/openseadragon/images/rotateright_rest.png
 delete mode 100755 components/static/js/openseadragon/images/zoomin_grouphover.png
 delete mode 100755 components/static/js/openseadragon/images/zoomin_hover.png
 delete mode 100755 components/static/js/openseadragon/images/zoomin_pressed.png
 delete mode 100755 components/static/js/openseadragon/images/zoomin_rest.png
 delete mode 100755 components/static/js/openseadragon/images/zoomout_grouphover.png
 delete mode 100755 components/static/js/openseadragon/images/zoomout_hover.png
 delete mode 100755 components/static/js/openseadragon/images/zoomout_pressed.png
 delete mode 100755 components/static/js/openseadragon/images/zoomout_rest.png
 delete mode 100755 components/static/js/openseadragon/openseadragon.js
 delete mode 100755 components/static/js/openseadragon/openseadragon.min.js
 delete mode 100755 components/static/js/openseadragon/openseadragon.min.js.map

diff --git a/components/includes/dzi.inc b/components/includes/dzi.inc
index c125ab7e..f91e54b4 100755
--- a/components/includes/dzi.inc
+++ b/components/includes/dzi.inc
@@ -17,7 +17,7 @@
 				</ul>
 			</div>
 			<!-- <div id="navigatorDiv" style="width: 100px; height: 100px;"></div> -->
-    <script type="text/javascript" src="{{lodspk.home}}js/bower_components/openseadragon/built-openseadragon/openseadragon/openseadragon.js"></script>
+    <script type="text/javascript" src="{{lodspk.home}}js/bower_components/openseadragon/bower_components/openseadragon/built-openseadragon/openseadragon/openseadragon.js"></script>
 		
     <script type="text/javascript"> 
 	    var viewer = OpenSeadragon({
diff --git a/components/services/home/html.template b/components/services/home/html.template
index 4dd5f378..8a2cf040 100644
--- a/components/services/home/html.template
+++ b/components/services/home/html.template
@@ -370,6 +370,16 @@
 			<div class="col-md-12">
 				<h3 class="slim-section-h">Utstillinger</h3>
 			</div>
+			
+			<div class="col-md-6">
+				<div class="col-lg-4 col-md-4 col-xs-3">
+				<a href="exhibition/fiskeriutstillingen-1865"><img style="margin-top: 15px;" class="img-responsive img-circle" src="http://marcus.uib.no/exhibition/kvinner-i-arbeid/images/atelierKK_ill3.png" alt="EM-01456-Christie" width="" height="" /></a>
+			</div>
+			<h3><a href="exhibition/kvinner-i-arbeid">Kvinner i arbeid</a></h3>
+				<p>Statistikken sier at kvinnene hadde en lav yrkesaktivitet fra mellomkrigstiden til 1960-årene. Fotografisk arbeidslivsdokumentasjon viser derimot at kvinnene var svært synlig tilstede i store deler av arbeidslivet. Vi håper at denne portalen om kvinner i arbeidslivet kan bidra til å visuelt fylle ut tomrommet i statistikken og vise kvinnenes innsats i handel, industri og andre yrker.</p>
+        <p>Artiklene på denne nettutstillingen viser to forskjellige måter å bruke fotografi i kvinnehistorien.</p>
+			</div>
+			
 
 			<div class="col-md-6">
 				<div class="col-lg-4 col-md-4 col-xs-3">
@@ -380,14 +390,14 @@
 				<p>Fremskrittet stod i fokus da Stortinget vedtok opprettelsen av Universitetet i Bergen på den symboltunge dagen 9. April 1946. UiB var det første universitetet i Norge opprettet av et norsk storting, og det første i Norden etter krigen. To år senere trådte Loven om Universitet i Bergen i kraft og UiB ble høytidelig åpnet av Kronprins Olav 30. August 1948, som for anledningen ankom seremonien med studenterlue.</p>
 			</div>
 			
-			<div class="col-md-6">
+			<!--<div class="col-md-6">
 				<div class="col-lg-4 col-md-4 col-xs-3">
 				<a href="exhibition/fiskeriutstillingen-1865"><img style="margin-top: 15px;" class="img-responsive img-circle" src="../img/strilebaad-crop.jpg" alt="EM-01456-Christie" width="" height="" /></a>
 			</div>
 			<h3><a href="exhibition/fiskeriutstillingen-1865">«Hvalfart» til Bergens Museum 1865</a></h3>
 				<p>7. august 2015 er det 150 år siden «Den Internationale fiskeriudstilling i Bergen 1865» ble åpnet i Bergen Museums uferdige lokaler.</p>
 				<p>Hvalskjeletter, utstoppede delfiner og strilebåter, vårsild i «birketønder og aspetønder», slosild på sprit, håkjerringtran og tunfisktran fra Adriaterhavet, kulefisk fra «Ægypten» og «sælhundgarn»: Utstillingen var konsentrert om fiskeredskaper, båter og fiskeprodukter, og ble avsluttet med utdeling av diplomer og hedersbevisninger for de beste produktene. Til sammen deltok 474 utstillere med hele 2832 katalognummer. Utstillingen fikk stor oppmerksomhet i tidens presse, og utenlandske representanter sendte hjem utførlige rapporter fra begivenheten. Da utstillingen ble avsluttet 18. september var det løst ikke mindre enn 23.748 billetter, og dette i en by med 27.700 innbyggere!</p>
-			</div>		
+			</div>	-->
 
 			<!--<div class="col-md-6">
 				<div class="col-lg-4 col-md-4 col-xs-3">
diff --git a/components/services/instance%2Fcollection/html.template b/components/services/instance%2Fcollection/html.template
index 224026ce..5f0a39b0 100755
--- a/components/services/instance%2Fcollection/html.template
+++ b/components/services/instance%2Fcollection/html.template
@@ -142,7 +142,7 @@
 	{% endif %}
 	
 	{% for row in models.haspart %}
-	<div itemprop="hasPart" itemscope itemtype="{% if row.classLabel.value != "Samling" %}http://schema.org/CreativeWork{%else%}http://schema.org/CollectionPage{%endif%}" itemid="{{row.uri.value}}" class="row">
+	<div itemprop="hasPart" itemscope itemtype="{% if row.classLabel.value != "Samling" %}http://schema.org/CreativeWork{%else%}http://schema.org/CollectionPage{%endif%}" itemid="{{row.uri.value}}" class="row" style="margin-bottom: 15px; padding-bottom: 15px; border-bottom: 1px solid #ddd;">
 	   {% ifchanged row.uri.value %}
 	   <div  class="col-sm-12 col-md-12">
 	    	{% if row.classLabel.value != "Samling" %}
@@ -172,8 +172,7 @@
 				<p> {% if row.classLabel %}<span class="label label-info">{{row.classLabel.value}}</span> {% endif %} {% if row.hasTranscription.value == "true" %}<span data-trigger="hover" data-toggle="tooltip" data-placement="left" title="Dokumentet har en moderne avskrift" class="label label-primary">Transkribert</span>{% endif %} {% if row.hasPage.value == "true" %}<span data-trigger="hover" data-toggle="tooltip" data-placement="left" title="Dokumentet er digitalisert" class="label label-default">Faksimile</span>{% endif %} <span class="text-muted"><i style="margin-right: 5px;" data-trigger="hover" data-toggle="tooltip" data-placement="left" title="Arkivnøkkel" class="fa fa-key"></i>{{row.identifier.value}}</span></p>
 			</div>
 		</div>
-		<hr>
-		{% endifchanged %}		
+		{% endifchanged %}	
 	</div>
 	{% endfor %}
 	{% endif %}
diff --git a/components/services/instance%2Fcollection/queries/haspart.query b/components/services/instance%2Fcollection/queries/haspart.query
index d9268a9c..c05fde63 100755
--- a/components/services/instance%2Fcollection/queries/haspart.query
+++ b/components/services/instance%2Fcollection/queries/haspart.query
@@ -21,10 +21,11 @@ SELECT DISTINCT ?uri ?title ?label ?description  ?classLabel ?identifier (group_
             OPTIONAL { ?uri dct:subject ?subject . ?subject skos:prefLabel ?subjectLabel . }
             OPTIONAL { ?uri foaf:maker ?maker . ?maker foaf:name ?makerName . }
             OPTIONAL { ?uri ubbont:hasThumbnail ?thumb . }
+            OPTIONAL { ?uri foaf:logo ?logo . }
             OPTIONAL { ?uri ubbont:hasRepresentation/dct:hasPart/ubbont:hasSMView ?img1 . }
             BIND ( EXISTS { ?uri ubbont:hasPage ?page } AS ?hasPage )
             BIND ( EXISTS { ?uri ubbont:hasTranscription ?transcription } AS ?hasTranscription )
-            BIND(COALESCE(?img1, ?thumb) AS ?img ) 
+            BIND(COALESCE(?img1, ?thumb, ?logo) AS ?img ) 
             GRAPH ubbont:ubbont { 
             ?class rdfs:label ?classLabel .
             FILTER(langMatches(lang(?classLabel), ""))}
diff --git a/components/static/js/openseadragon/images/fullpage_grouphover.png b/components/static/js/openseadragon/images/fullpage_grouphover.png
deleted file mode 100755
index 3ca4e1e3c366d44e9dbbde415f6addaef941b129..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4907
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

diff --git a/components/static/js/openseadragon/images/fullpage_hover.png b/components/static/js/openseadragon/images/fullpage_hover.png
deleted file mode 100755
index d08eb2d0b077754ea9ad8906bf3c376f3fb178d4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5214
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
Y03r6Layo57ga7~l07*qoM6N<$f{F*rYybcN

diff --git a/components/static/js/openseadragon/images/fullpage_pressed.png b/components/static/js/openseadragon/images/fullpage_pressed.png
deleted file mode 100755
index 0ee45b5fc68aea79b511fa35b2a0be387aa35351..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5213
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
XkSH*Bx~K^}00000NkvXXu0mjf%Gk;7

diff --git a/components/static/js/openseadragon/images/fullpage_rest.png b/components/static/js/openseadragon/images/fullpage_rest.png
deleted file mode 100755
index 3172005c6e1f43e5183c589197112aa135320cc8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5155
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
R`k?>-002ovPDHLkV1ijn#q9t9

diff --git a/components/static/js/openseadragon/images/home_grouphover.png b/components/static/js/openseadragon/images/home_grouphover.png
deleted file mode 100755
index 204e1cc94b5057e04a42f0d4483ba0c96c05e7cc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4808
zcmV;(5;yIMP)<h;3K|Lk000e1NJLTq001KZ001Hg1^@s6)rDaE00009a7bBm000XU
z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag
z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uh<iVD~V
z<RPMtgQJLw%KPDaqifc@_vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H
zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T
zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z@C0AMG7=F<Rxo%or10RUT+Ar%3j
zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p
z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i
z0%4j!F2Z@488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i
z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf
z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G
zw+sLL9n&JjNn*KJDiq^U5^;`1nvC-@r6P$!k}1U{(*I=Q-z@tBKHoI}uxdU5dyy@u
zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm
z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v
zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW
zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6@fL%FCo
z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X
zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t
z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl
zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4
z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_
zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l
znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U
zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*SAPZv|vv@2aYYnT0
zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O
zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w@D1)b+p
z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya?
z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y
zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB
zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt
z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc=
zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C
z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB
zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe
zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0
z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ
zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$
z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4
z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu
zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu
z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E
ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw
zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX
z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i&
z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01
z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R
z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw
zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD
zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3|
zawq-H%e&ckC+@AhPrP6BK<z=<L*0kfKU@CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy
zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z
zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h
z1DNytV>2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F}
z000N`Nkl<Zc-pL(Pi)lK9ml`^Gaiq#%p@=)Xh;ItNFi)WRiy|-p+(gmR-%Cwmu-ZE
z5~x}ZRS#S%K)q0LKuE2GmRxc`K~VJ%3KFCvKq8PF7D7scm}C>F{K=4vlF5)6&y1h#
zXTKiS&-Hi$t-7`J({r3R_Q${fKMRa8e49fM1R;Elz2~Nku^Mq**IzYFgZw`{m_J+y
z2>+XT`<Qpmp_pY^EDXR`*L4Blzk>-t2mnL?lDG16AppYwxB#5sswfHrz>38p;{ZYV
zk1*>%$eu(1L<R;1ntFSCJ1ol*UDp*xM@JW~UAwmG0Z;(8C)5)+kw`EA?CsmPEDTd;
zM=l`%6~IRTHk~_n?)xuazWjZuRQj3_!VJS;)oPVhDiu~LmDtkK(mx+Retf0BzyAP$
zb^y%)HhI5Sz59s(gt@sn%+AgtlgYdvCIAuv5Cf1nd-m)nuU@?xtX8Xx5W=d}st>^>
z2$jp_*n<ZTt{y*r{3jmNW&jEAei05dH8q9F$;odl!5yE2NRq_OB6)8SefsoiUuS3M
zm!c@vIA1Vm__-*G5Cj2&Ab=2p)zwvujg9^0)TvW{22cS|1z>t+a{#chu`zb=;6aG|
zX0~m^vaGOqqEk~-zie-B|B~-9O%t|lgHj5|aeSL|NJ^={PnKn*QYq}&v*&kLu3Y(r
zr<n!-(V)31l}fE<bX`Y09_Lz-0jRfc-~P0xr{}Mlrh!uGI~srU_3}ti%Un~8F=R3s
zjEs!@`qHIKcL9_<Et#H!GXTtwCet(#Fi!+Pw6(SM=Zd1hG)=g!3qcTkGw?Nd1T_V~
z*OVxVXlrZ3jvYJt06Y#vS1|mUZze(rKNSH)(&_X-JRbikr4*KB!Eqb_fFwy+TwFvh
zm-7Md-@oshg#&Uh$8lhqCR9~LM@Ps0)2C1O0odS07I);@Jk#3R8cb+PQ&ZDGG#d3G
zMN#zE!NEbuvWycaPT<j_M|kt*4Q6I$(AU?8R4P>m<2Vi|rD$(&M{{%Y=K%f^aAd1a
zGl7&YpFe;8dy1lb!kv*jDA!CZ7DFr+!^p@8R#sLJi^X7?Cazw+ikX=iD2f7EmVHw>
zjsx4aAxRQasno~&_wWC%7vhSi5CK6I1*2&D_U)fWqfy^H+y^8{@?kVhgDlI4Mx#(w
z6|q<hvMl4yojbU9?;aFIK_n9K9hg!ILI}2O*@CvVwjX+CQi4$xE(hF9J5AGsuIrFx
z8S!}BciK!Q165Ta%Q7TM@_mFc23eM2+cus(dxoW@B^*9{*oPs6z;#`Sq6kTnJ`RL8
zuXA;^NdO>PmX)HEqEsruG)=6mtYG8DjTj#v$CD>dkV>Vnb?a6ric$l^BPpNHV{UE^
zqobqf@9#%4nS@~&{(jrGn?fMM`(OlJ*Imo9U|AMS(*&gyxm*s(WD>o-y*PI4nE!)@
zh6e20w-3w9%b1>?_OEw$cjLl^3s_rQL$zAv2^FsEqFgSsbt?Y)Rl8U$z9WRdaU58d
z1wjxHjYiSY(E&-4YW8+_cjLy58vuZ0GFb!J+1ZI~HjA~jHBd?+%QDL4GIU+n*L!X_
zniv3<&*#4`6bfLB!8A<}LQttxpzAse!>G%;wrwNa+%d*btyWPkmr<!yKnMY23=0bj
zc=ztzn_#lzP1t%c?(FRB*!=uF6h#3~dV~;P!iQ;^b&vpH7zPZ(@J+2K3MMBfv9z@G
zcdrca49wOulM8^R)9Fl0OUv_JyLRmoMG=G$h@x0ydwwi0FJowEsID|nN}=mIOw)vA
zS<o~M#bOc9pFe+<&*$g7Wal?sVVGdMXlAq78{^~SyY}wgi*mUP+qR+WIyP+BfWg5*
zXqpB=5d1e6MG-?oL%udCrO4;=s8lL&T^EgwjTjyt#_H<oJumwbF9ZA9k=HR31z@Ms
z=|3^Xe%#g7^;tth0}6!#DwPT-rO-6Z&oQxB42q(BQ(I)&FB^{IV0CpBlu|S{HsbZ`
z*O-`?c(S~_oCZ+#fOtz<Yo?<|kFuLLZ*t9807y2Qy*4~N{MpHqC(+Q*;D>3cRPtMi
z_l+bx!6gz22!eo%7cZhzD*X*W(Ssp@y5!c>Cf?w9|F8fUnM`IPo6Y|A^5x5jL?TF~
zQs6#B2=N^>EQAmUf`DW)2}&u>oH>I+p)gdfR=)zU=D`@AW?VnX@sK=l-~c8jCW6gX
z)a%OPEiEmdtE&35BS((>VE69bC=?1P7K?t0=Z7RoP*oN2cpOblO?de5A+BG)4#P11
zVB7Xx0C@m~P;<r2#C({Zo*p=kgX!t%VE?NE&;V?ZWqI?aO`CodkH^0_bm$Ov?%at)
zA_1Npc>&Gka(MCL1#aECg+if_rj-7XF_!Zn)&S@M2d05s^KZ>`b#=jYUChtV3!&*C
z>XrMCJgD!)VzDm-LHH44ti8Fp8Jea+*L5r`EWmM`dB)g3T-UwJ7+dllUh-CM9y0_|
z3$tz8Howp<E-r>A1U|CFJWX*?MN!-aAkG*w7-NgxLrhPq0WktjTL)4Dvw8F8nsIY&
zZ7n>`M!fzb8W6?1E(OM0$8$_80L44HaMrD<AwEnZk*FKW2_fr^w;U`I7<a?7HVuup
zP9W2=^+0N1R8_4T&_WYt5Gp+Ui=mR@hKBzSLe#-Xl2j9>@7w=@Pa<{IKln-HLlAWz
iaQ+X6@NIAKuK@t~);ikP`%{Ae0000<MNUMnLSTZ|!{rA6

diff --git a/components/static/js/openseadragon/images/home_hover.png b/components/static/js/openseadragon/images/home_hover.png
deleted file mode 100755
index ec218a00a0b18b6997b37b5f3c1ddc4ec413ca6f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5107
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
VNa*~d>WBaU002ovPDHLkV1k<ts!RX?

diff --git a/components/static/js/openseadragon/images/home_pressed.png b/components/static/js/openseadragon/images/home_pressed.png
deleted file mode 100755
index 4439508bc6ebb6c3d9aee81ae8df4da592bd1cb6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5138
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
AvH$=8

diff --git a/components/static/js/openseadragon/images/home_rest.png b/components/static/js/openseadragon/images/home_rest.png
deleted file mode 100755
index 009d1bbf4c410ca89adb6bdb3e1fa8192db2ff41..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5061
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
b3;cHgLwsQRRRSox00000NkvXXu0mjfcv_4p

diff --git a/components/static/js/openseadragon/images/next_grouphover.png b/components/static/js/openseadragon/images/next_grouphover.png
deleted file mode 100755
index 8d83d8a142854fedbee4bccee591fafb5be7f179..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3004
zcmV;t3q$mYP)<h;3K|Lk000e1NJLTq001KZ001Hg1^@s6)rDaE0008+X+uL$Nkc;*
zP;zf(X>4Tx0C)j~RL^S@K@|QrZmG~B2wH0nvUrdpNm;9CMbtL^5n^i$+aI<?kYqDS
z)^0ZI?k2URh~(nYD&9ryp$Gqf9(wR(FG_`4MJV2@C}N=(E%D86Otz)!z|Ma2-Z$@k
zZ+71R4RX>n^?(HA4aZWV5ov6ELTdbo0FI&wK{O>*+w4vx20?>!`FrQsdJlnHR>OPy
zcd~b_n$otK2Za4V;76L-DzNVtaSB-y0*E}{p()372;bw_^6ZZ}PI-92wGS&j#91PI
zKs7DSe@(bk%_Y-7gGe}(^>I=@oY#w#*Bu9GZf3^F5WP>3rn}7Ut74&?PWBFvy`A)a
zPP5)V!Xd&78LdA?xQ(9mjMYElVd13a#D+Z_7&Y|xU=_C-srWU*6kiZcC!$nw*)9$7
zn6CX+@=AhmkT}X@VSsa5NKe;HZuq)~1$`#h6R+ZTR#D-3j}vF!)ZOnz+5)dI4jl{{
z44Mr{P!L4~VVJN`K!!XTF*LGrKO?IK8<Tr7btG!LbYeuYL3=jbJ-1P$-8}v%B5{;M
zwFr{@LH;VQ$xr2Z`O93e*jD$Ht(%&<^58qg<(at}9@o>z<8w`3e3jI8lUGNUta*C8
zn(P`s>{pjD=7Kek#B;Fw@hxAK%$F&Q6vg9J^Xf~4by_hu-=A!MJ3Znq&n~srbFGPs
zH&&aMXZ>nO`|hf|ljc?VPhR!${AbO?W8x_>CU%PFA&Hm8F7cAsOREdwU~R_;ot1_u
z(ruCYB-LPGn!NQdT|ZlRy+(fw^-+`=%+gee_kY4FWHg<*4sZI8+sFJD<oAl_pC|$^
zY~aY5x@}W&?+~G7rEYVs0vEs0eekw!YomTR`~+A$s}`+NHJ>270UUORdLHO0nA4V)
z%{fwsET5CQ>B?eK%uw4yQc~9?*JVo<vzb+5>2}ze(;aRcp*ceL#HUJSllrgm5wQKR
zQu+C;QrUh^8rFfA`ftFz{YAidi-`aL010qNS#tmYE+YT{E+YYWr9XB600?wRL_t(o
z37wZ&Y*fh=hU@lXcYC+NHU<xPz$k1^A|rx?%s?VE8fAGHW)KoeBzPm@VP1H$6p1|Y
znkX90W8M&uK}y6H;u#1DgT#)&#w^BcX0U^e+j!~i-h6+#tLe6zA(N6$SKYdG>-_bf
z|5R0bK@gb#w|JBT2M&1dd)oQQm^a^c@84B>-{%`SXF>tcydnLZJ$qJ_nV6XH)~{c0
z+jsBY4d@pb2T0gl+m0#uqcQI?J`{-1jvYI~IE>OR%UPVd2CK#DuxhMQ#<+^Mwze2;
zjSpi2Zx{bIf8WWBV`A&pt)Y&Nj_|Q#$3jn^K8@_&y}NSZ!iDigixxF3Tehq<lgUKW
z>9ohY;emmH;pfkvCyyULKHb{dnq0MNRd#G_EPdt5l{8>{%rXX``AoeHrB;E301}}V
z6XjTKcX#&>uV26ZyW!#Cug1s6AB`u*hjAtwp>OE^{rle#qCf24zkeI!-@}@)`n7A<
zR#A&7%~z78lFT?ppgPQoLR}pl6}vzCtZmb#O`kM3H-B7KR`woaDyc(mF*q=i)b#YU
zfvG7p^q>Cz{^RG)o%{QV6DN9a+_*7TUtgaBbc&%FEQ^VtJVW!q6arbicyaXV)vNKN
zM~{BIa^=e3<Gdvrje6N^)}&G?%_Q1wadU<!kx0aZ!(oGC|K-b<)7P$D`xBx4^O7Y?
z63jnEIH&n&9-vZS6q*oJi_UWD?d|RD-3t~hXrGyxF=)fbvCS%>5F4&IKs;Mr2pGlO
zxpQZ%=j)z7e)0JiUp{;GYy@FX4Gs<_8E19m7G=}ZO(s^z7*A<RU-ZzSLz|W^UD{n)
zS=mmXPY41+5b}NB!%AkM`eDw~xKui&@ji3ZcmBBZw>x+4{HUs`s(xx}s+^EXhsrW7
z$gZdejQTYIorL%8+t<J(zb-E?Z%-zZ237>XGFb>jZ41E9+S)y<&ZILQ3$Q+5qjANG
z6`yY0xbc029;>ab)wbZ$z9bm)`t@teN>^9cPx;_OF%FPGtCd#dMB$JXwiOuH@80RX
zzR_YTDk=g}{YPY#vaA-(MVVh<Y-Um0hH6Wdv~u#~Nw2Z7v9hVD=~qm!aC&-1V$B1Q
z18X_$76Nc>2SPw(61xB`U%osFpr7HcX=rGuoP^MJp-?GOUQw8wR`%@Kvzn~wR4AFq
z&tx<CRrBF&$t9%5$ZW|~5-s0b&}c@Yw_tE?&`SG;4I9=nzJ@W<O@80WgVBM9Ry>eL
zNx}6Dtk#N{%nSTk&q`N0K}Xg!xt?Wemoaxd9#^Q%lP6D1EEX#QC3foS>Y^<zEgb>_
zYvG!j8VAOrvWvQX`?l8QX)xsnd>9`Y8L^C1S65qSWPznzpk!jevEp>1Jw`wd9z1Ba
zZQEu(*z$p?s;shF)c1@Jv6%PqRYf=>SpM7+s-gm=VFcTVMH7jH(F9_muCCVf_un-a
zFJ3fq*u1FO#A9&_Mt}syiIu&?T)uqS^z`(Y&6_tHc5Xu^8FVP7LyW7(X}N&#oz;v$
z%mt&=^(H4LJyEJyYkOBMXZP;iGlvf!wgB0CEGRLgwm?fC`i_Mt9EOma^XJbS&M>om
z`*z!>(DPnV2oZr0^V^7&0%Jx;M+3I;1e0f3aWtnJ8xoEOvuoEb>s0IrU}4d-LZ@#|
zpFV9t?cKZAtXsFv>PP)7G(c06e5a#CK=LKe%#kBU?93qb(aHdTX4nT}nn0;4cC^|p
zTeetHijlcRVAQYhDrBoyuQrI)f)WTs?s2{FS@00wGIc6o!SZW;=fP;=wzf9I!IpXO
z;K5ZW9>;kdKmyS!FbaVfvBC|J(!~q2OgUycJ3Fn`Sd;~(j1$mDj~=CO-MV#$g-$Z3
z4@i4@%YP9V90eSRnF|*#^l}vRA-ZKu?ui{&=7z@g7uFKA3`hBFQ|hyi8N@AC`bqoA
z7cX82h)!>N`seo<Isz_6ek765i^<22AAimDVTw%hSe4kZS`b6;GJ$sqFq52NI%D@A
z?lxp({}mob0j3q|<Q5?L42qah$3!%mMW`wEov#4VMYw(eAb}2W!h(x5NB7%{(~!0X
z7H7C%^|A;3v!S8k6}k~h0dipq^33p|MC3zV1`(%m{O!Ys5C3xN)TuG8lASV;e$;j*
z24*dpt7jR}doii;q`faOb0<#r_V%9T+#3LhvPl;#F=N9d|9LQUy5b|cH2Rrg-?-S<
z*Z29EGiOGbJj5m3Bi1^>1BL1hm^W?hHFAzd0?r``KSY{mVCAnY=wGDuD2}EufhoMC
z7Ymq|mL2L0F-@|vaaMNp(xppj!2EK}nl&9{TuhmvO%6vvmV3->VsiYFEi6KSO)MVs
zxZ!2Fyr*y8y!kig{F22#gY^V$F{3aQfhl$Elqj@`NKY}Y5uAPTT2g*Fm+{}Ar=PQl
z)o>LJIJ0b~i3z2&v_S~W;NW0DNCe{FF!c|{-KPE)AQQ|fFt0Ip?aV4fJkS2AQp1&;
zLIp@6)a6HjVu-Gii*z&3EBUYVAtCq)Otiv8R9gbhbk+3H%i~wCUfpNxH;nCLs~8a*
zFexBnL?IF@?n16Rb!jjR(%v92g$(Hu6lV`C13(2VweZ}C>0hM&7wKQ5CYK(@u?fbG
z;A4VwNudx3$A&UUeKw^X5T55VqfV6qKw?N?(?zI^ki~EW8IcIUbausIBZ7`R!ju*}
zu%Mka!#jnd&>RSx&V@i2_jWM$<r{_^OHNA`7-J%cRejQ4NGVOx1}2u|SS+aROz-Rl
zHx~%~-wj3sROYZGrW{)W;+{2B#W{4K3ZHd;>A7T?mrW%{<vI&MsmF<2_1q#sx@|)5
yM1&RT+<}G9-wRCPhlTANNZa+lI4%6Pu>D`wx$;w|NdKw;0000<MNUMnLSTXpeZpD*

diff --git a/components/static/js/openseadragon/images/next_hover.png b/components/static/js/openseadragon/images/next_hover.png
deleted file mode 100755
index ba24ca988f1536d596c595fd0beef8b985a17c35..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3433
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
LNkvXXu0mjf%T$KU

diff --git a/components/static/js/openseadragon/images/next_pressed.png b/components/static/js/openseadragon/images/next_pressed.png
deleted file mode 100755
index 95f169d65150b1e5162585bd0695e4617363afbe..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3503
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

diff --git a/components/static/js/openseadragon/images/next_rest.png b/components/static/js/openseadragon/images/next_rest.png
deleted file mode 100755
index 5ead544b5d7ef6de16e83f9d28aee515666fcb89..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3061
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
DA#uj9

diff --git a/components/static/js/openseadragon/images/previous_grouphover.png b/components/static/js/openseadragon/images/previous_grouphover.png
deleted file mode 100755
index 016e63957a87778ba2562ec7a91dee22248590d8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2987
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

diff --git a/components/static/js/openseadragon/images/previous_hover.png b/components/static/js/openseadragon/images/previous_hover.png
deleted file mode 100755
index d4a5c1552c7a8a5e7ddae0d2a94f235e00e44c62..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3461
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

diff --git a/components/static/js/openseadragon/images/previous_pressed.png b/components/static/js/openseadragon/images/previous_pressed.png
deleted file mode 100755
index f999fe498500de4f891f898be1fc09c368162864..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3499
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
Z{{Y0&G1asaZ{h#|002ovPDHLkV1h%en=b$W

diff --git a/components/static/js/openseadragon/images/previous_rest.png b/components/static/js/openseadragon/images/previous_rest.png
deleted file mode 100755
index 9716dac67b7ccd4c68b427eeca7de3548eed0726..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3064
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
GLSTYxvD0G!

diff --git a/components/static/js/openseadragon/images/rotateleft_grouphover.png b/components/static/js/openseadragon/images/rotateleft_grouphover.png
deleted file mode 100755
index 9aec7ac9454f6e5d71401d2994f7929823da57a8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1902
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

diff --git a/components/static/js/openseadragon/images/rotateleft_hover.png b/components/static/js/openseadragon/images/rotateleft_hover.png
deleted file mode 100755
index ba32c5a45591526ae2e2e7b21bc0d337569b8161..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2289
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
LNkvXXu0mjfWXDWt

diff --git a/components/static/js/openseadragon/images/rotateleft_pressed.png b/components/static/js/openseadragon/images/rotateleft_pressed.png
deleted file mode 100755
index b968ebf8ca3bff215d92ac0b41af76e317cff80b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2242
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
Q-2eap07*qoM6N<$f~^ohNdN!<

diff --git a/components/static/js/openseadragon/images/rotateleft_rest.png b/components/static/js/openseadragon/images/rotateleft_rest.png
deleted file mode 100755
index ebbf081b8aa0a038f4ecdd594087150cba1e8ea8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1943
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

diff --git a/components/static/js/openseadragon/images/rotateright_grouphover.png b/components/static/js/openseadragon/images/rotateright_grouphover.png
deleted file mode 100755
index 86e8689c14b1ef1af96adc7aa3ba9531113a31c4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1970
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
Eg7A5stN;K2

diff --git a/components/static/js/openseadragon/images/rotateright_hover.png b/components/static/js/openseadragon/images/rotateright_hover.png
deleted file mode 100755
index d22a728fe9b973f28df270e165fe57ee10353d1a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2338
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
IM6N<$g4cO(DgXcg

diff --git a/components/static/js/openseadragon/images/rotateright_pressed.png b/components/static/js/openseadragon/images/rotateright_pressed.png
deleted file mode 100755
index fc2ead64e506a0639e5af55332d2afdb74e4fe4e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2228
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
CxIS|L

diff --git a/components/static/js/openseadragon/images/rotateright_rest.png b/components/static/js/openseadragon/images/rotateright_rest.png
deleted file mode 100755
index 0721967874ba838a41230b4730b9eaf903227171..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1961
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

diff --git a/components/static/js/openseadragon/images/zoomin_grouphover.png b/components/static/js/openseadragon/images/zoomin_grouphover.png
deleted file mode 100755
index c985d0f958d78c8233c4fc3c3a48a240392c8ea8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4794
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
U<@`%&ga7~l07*qoM6N<$f_Nk7;{X5v

diff --git a/components/static/js/openseadragon/images/zoomin_hover.png b/components/static/js/openseadragon/images/zoomin_hover.png
deleted file mode 100755
index 3cab721f1bd5b0360dd1eac094c36a409b517738..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5126
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

diff --git a/components/static/js/openseadragon/images/zoomin_pressed.png b/components/static/js/openseadragon/images/zoomin_pressed.png
deleted file mode 100755
index 9c3a75169cefbc031e7b1f0d0baf7472580552c3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5172
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

diff --git a/components/static/js/openseadragon/images/zoomin_rest.png b/components/static/js/openseadragon/images/zoomin_rest.png
deleted file mode 100755
index f4219a50aed7503f63e9b553cf6159e2cca36d11..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5041
zcmV;i6He@jP)<h;3K|Lk000e1NJLTq001KZ001Hg1^@s6)rDaE00009a7bBm000XU
z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+<Lqi~Na&Km7Y-Iodc-oy)XH-+^7Crag
z^g>IBfRsybQWXdwQbLP>6p<z>Aqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uh<iVD~V
z<RPMtgQJLw%KPDaqifc@_vX$1wbwr9tn;0-&j-K=43<bUQ8j=JsX`tR;Dg7+#^K~H
zK!FM*Z~zbpvt%K2{UZSY_<lS*D<Z%Lz5oGu(+dayz)hRLFdT>f59&ghTmgWD0l;*T
zI7<kC6aYYajzXpYKt=(8otP$50H6c_V9R4-;{Z@C0AMG7=F<Rxo%or10RUT+Ar%3j
zkpLhQWr#!oXgdI`&sK^>09Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p
z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-<?i
z0%4j!F2Z@488U%158(66005wo6%pWr^Zj_v4zAA5HjcIqUoGmt2LB>rV&neh&#Q1i
z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_<lS*MWK+n+1cgf
z<k(8YLR(?VSAG6x!e78w{cQPuJpA|d;J)G{fihizM+Erb!p!tcr5w+a34~(Y=8s4G
zw+sLL9n&JjNn*KJDiq^U5^;`1nvC-@r6P$!k}1U{(*I=Q-z@tBKHoI}uxdU5dyy@u
zU1J0GOD7Ombim^G008p4Z^6_k2m^p<gW=D2|L;HjN1!DDfM!XOaR2~bL?kX$%CkSm
z2mk;?pn)o|K^yeJ7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_v
zKpix|QD}yfa1JiQRk#j4a1Z)n2%f<xynzV>LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW
zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_Ifq<Ex{*7`05XF7hP+2Hl!3BQJ=6@fL%FCo
z8iYoo3(#bAF`ADSpqtQgv>H8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X
zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ<AYmRsNLWl*PS{AOARHt#5!wki2?K;t
z!Y3k=s7tgax)J%r7-BLphge7~Bi0g+6E6^Zh(p9TBoc{3GAFr^0!gu?RMHaCM$&Fl
zBk3%un>0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4
z<uv66WtcKSRim0x-Ke2d5jBrmLam{;Qm;{ms1r1GnmNsb7D-E`t)i9F8fX`2_i3-_
zbh;7Ul^#x)&{xvS=|||7=mYe33=M`AgU5(xC>fg=2N-7=cNnjjOr{yriy6mMFgG#l
znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U
zt5vF<Q0r40Q)j6=sE4X&sBct1q<&fbi3VB2Ov6t@q*0);U*o*SAPZv|vv@2aYYnT0
zb%8a+Cb7-ge0D0knEf5Qi#@8Tp*ce{N;6lpQuCB%KL_KOarm5cP6_8Ir<e17iry6O
zDdH&`rZh~sF=bq9s+O0QSgS~@QL9Jmy*94xr=6y~MY~!1fet~(N+(<=M`w@D1)b+p
z*;C!83a1uLJv#NSE~;y#8=<>IcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya?
z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y
zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB
zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt
z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a<fJbF^|4I#xQ~n$Dc=
zKYhjYmgz5NSkDm8*fZm{6U!;YX`NG>(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C
z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB
zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe
zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0
z?2xS?_ve_-k<Mujg;0Lz*3buG=3$G&ehepthlN*$KaOySSQ^nWmo<0M+(UEUMEXRQ
zMBbZcF;6+KElM>iKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$
z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4
z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu
zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu
z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E
ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw
zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX
z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i&
z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01
z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R
z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw
zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD
zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3|
zawq-H%e&ckC+@AhPrP6BK<z=<L*0kfKU@CX*zeqbYQT4(^U>T#_XdT7&;F71j}Joy
zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z
zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot<a{81DF0~rvGr5Xr~8u`lav1h
z1DNytV>2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F}
z000QwNkl<Zc-o|xON<*;7KZ<GZ$0g9yWLKAC*9Lcl8F*e=OGf(Gt4BTu!trSpv(dd
zLLd-gp9NvfV}aPPV8aqvfE0vSge5`=fdC3Kk$O-onq(4^5s95{65DN;U9Q)C%z|=v
z#cjf9DCy{y%eU%&b<VlxQKYrTuQ`Z_2CwO#d8pR<9#KlIjk#P7#{aQ!e{sr4|F=%(
z>GZr0rQ<l(g8=<eDFp!k8%zd*05AYN9sB2$fzbdI0GS;v%hCXJyWQ4(fUNu?%n%48
z6%&AY^ytz2V~;&H5yvqTLeQBrXIkgZo$ICm0zi_ANJSNkMGZjLYBfCwLqF#;8IUZ5
z{p_>PmS1}5r9aHh&Q|jI{Djt;Wqd$28jaP<moHy?^UXIGKmYvmRRB>&)}R3Bt5>hC
z0nN|P4~NNs@D##&{`u$2Cr_SyWXFyjhZtjHT5C;2s_(C<pD?8q2_aao*K1w4aAEQ7
zx8J^a_Uzfa0D1sI0C5T=0qDiWMXi*=!Gj0aVft^!IUfYEKmGL6g+qr9{f%>8O8<+M
zQc3>}`%c=|BoP?^tRM(@y<Ts8^wCFWUVZh|e**ARs3;5c<(FUTBS(&``%ID~ecNSC
zW1l^H_RstG@Bb@ftgMuZwboIp6#`%q5zB044M3%!iEZ1~<mBY0<HwKxg)x?U`Q?}Y
zp4okC^L^jfNEZbFL{S9Sb^8+;0Q0@~-mA>d&mT7oqb!67q?D0TiUY6!xB&713XHKa
z##oVva$0L!Yi%i|n3OVPjCpf&b7M!2969{VGtc}Ez({(pnQ9-8KKdwafXSH01Yqyp
zz57qLZI_i&p;Ag|t<4m~2H-Nr3Y_yv&iQ7>*aQ(3G7DK+Yg0-oh^V`5+qSU-2M+85
zPy~=mpJ8M|!@8NmFho`>AAb1Z!&|m&*$+SpAp~R01Yi-734jxk!x$^R_10T^YPFhG
zC=}Eyue|bIx;wPiI#Eh#rIb`kMXu}ehaP(9x6eKI+=K7G|NcKxM@}-nv#y!h+1YGB
zv*zaJe(yNWh!7&yTJuyZrq<d_&ut>g=ks}<&*$N~E{JG^h}`t8EdZuc%8*i06h*zQ
zTemuuN@ZtiUN@c751_;bcQpXx#EBEX866#+BO)oK)LLt!Zz3YHiOA`T<2Z0#7mnkA
zh#UY;I@;+yhSu7UQYzcFgSol6iQT(*PiJ6^zM0qn2m@fu&(H649A_j+l0+#*T5E%d
zY{pogb6(_}mpJERjIq3Fns6Kkj^hwxEXO%7q;ralu~8y&Qs1E@N#g10>D;z$+hzec
z85jnD2Gaopz%9#~3d67yhT)H{>lO-yLV+>n_IkZ?r_(7JhG7|oVG<E%jFD~IFbo6B
z%gcGKwG+p2B!q}_xm+`!&r1MN5CmZy$AMDHux)#6z=7GY+(ZDF5Mo3KAy!vco4sDI
z=DO~GW@l%&pFe;8=(%&}rY0sPFf%jL_Y+u_1t}$+K7HB^f&e#f-W+K*o7l5wk9zXS
zCofd1)$6|R_j0+MOGFb=N@oCseh!AZ-L8(J2uYG4j$;s!YPZ|%D_5>`PMtcnA$`ou
z%%E1QZMgpQ(@%$;PR9$wP{wf#(=?%!g75nnlJSRU?bX%QAPhr8O39-rg4SAfI-PLu
z-o4+SIB_E9x~^+kmJ0yyzWeT2tyVMg`Mi4Z#TT1tG!KIy2zKt=dDZj0AP52#MG+jw
z;oWZ6@H{UWw(cN|2B23~R_->NO>$k=jG_oa2&I(rH*enjucw}R>XvQW&gkgqc)48O
ze){z3eap+shU>ce<jIq_8jZ&Hp64~9C<?pXZnx2BbbGy?lv09-%xbkttE;QsOs%t4
zgbjmHmo8npv17-MWMN?;C#7u1ajfDvj(y)3^?JR_IcJlTlO4k_asc-AZ|-zDKUS;N
zn=30Tccqj{2%+Rphh~g1+qQETFJ4SmR#xh1z?0czI|!oyh;P6BcBN9OEbrU5Z;NS~
z%^(PZ^goqGOc;jYPfSdB*_*rFuGea{{Cd3}44R-&C^(HqqrAAd*!4WGo+%~z_02tT
zCR;8>*RNk+`ugjysa!6PYpr=4$H+<$1hU<3dr=g{_$gIO&-2>8?<a$Ewbp!me7yAW
z#~)L@Uca5GZKAAphM7qKNWS{&tM54H+js5SHD4-~{N?3kPfDpWP99m7Re$H5cTTyk
z>%?&!-MV$_ZmZRb;y7M=U~1CQ8#iuj`QnQ&R+`P`4FKH~sGplO0Pxpddkp}vw6ugP
zSFU6uF()EXtyXs)Ja}-NF&1>Y-6Tm8Ev1AILWf}}JkRSj8jaSSJ9pZRM#Im}AtJVE
z)230*`PSE8e?4wCn^&cjw*jmI=l}>(b4dVtt<pPo>=-`#>@$`rA#wl;+qZ9jczSyJ
zkr!Tg!88n`TC3GsK@bRipN5Nw$aP&~dV0F(`~K`3Z@iJz>-Fnl7+wN!2S5`*djLkQ
z!5lt(7~g#JO+Nq`X}Hb<C`?UFJ($nu_dfB&6LSj-3++~`)oeDKzVG{q5Ms@AhGDRg
zkrAs@D&>mB;`sUV=ZhbF@Ilz?_5Lk{xC)@2f_P~O8fDD1u9*V|4nRtYrKP28{p+L}
z8s(gqOQq5u$H&KaJ^uLPcBN8@#>dCIVHhS#Da9CLuIpOWYIWrD<;&J5pL`P4>-Cis
zqLD(hQuFj3SY%?&dO=>PRG^f?wQJY1EsEK%>e6y?lrdIzU3U*-YzDyS%*+fM85tqZ
z^Yjlt{Gg<iU8U5jQtDO;&`CAXNgX#BEXX&&Jn+B+YYo-y+qVZh1TzJ4Q%&{7A)*oh
zM{6z9#YCo0>SZJt)~aN>i*=Z(si}L~%~q>5*v@9_UprgPWfGoF7fI4ZvkhE4B<kL?
z3D#hW#o~shJPgBO?QI{-%ygQAy|x%=Z)LWV90qa^jN>@>fMjLhivt_d{Ih|Sq6V7(
z`$BAh;he8E;P?9$aGy^i8?ygExB1H-f--OaYY+Oh5BTo@DH&Dz(PINW00000NkvXX
Hu0mjf@M4@K

diff --git a/components/static/js/openseadragon/images/zoomout_grouphover.png b/components/static/js/openseadragon/images/zoomout_grouphover.png
deleted file mode 100755
index 46d21b3e507e7363b4e8afd0e77343814ad63748..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4596
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

diff --git a/components/static/js/openseadragon/images/zoomout_hover.png b/components/static/js/openseadragon/images/zoomout_hover.png
deleted file mode 100755
index 7b924c26d8f587e030293036a7230d3faba88918..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4931
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
BHPZk9

diff --git a/components/static/js/openseadragon/images/zoomout_pressed.png b/components/static/js/openseadragon/images/zoomout_pressed.png
deleted file mode 100755
index c028db72405a925425228819f7e348df331d9afd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5007
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
ZcL1+4p0OE`yDI<y002ovPDHLkV1g<;cmx0d

diff --git a/components/static/js/openseadragon/images/zoomout_rest.png b/components/static/js/openseadragon/images/zoomout_rest.png
deleted file mode 100755
index a13e07de798ec32c5bcbec32001427df6bade43b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4811
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

diff --git a/components/static/js/openseadragon/openseadragon.js b/components/static/js/openseadragon/openseadragon.js
deleted file mode 100755
index 7501cfce..00000000
--- a/components/static/js/openseadragon/openseadragon.js
+++ /dev/null
@@ -1,14365 +0,0 @@
-//! OpenSeadragon 1.0.0
-//! Built on 2014-03-11
-//! Git commit: v1.0.0-58-g13fa798
-//! http://openseadragon.github.io
-//! License: http://openseadragon.github.io/license/
-
-/*
- * OpenSeadragon
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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-2013 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.
- */
-
-
-/**
- * @version  OpenSeadragon 1.0.0
- *
- * @file
- * <h2><strong>OpenSeadragon - Javascript Deep Zooming</strong></h2>
- * <p>
- * OpenSeadragon provides an html interface for creating
- * deep zoom user interfaces.  The simplest examples include deep
- * zoom for large resolution images, and complex examples include
- * zoomable map interfaces driven by SVG files.
- * </p>
- *
- */
-
-/**
- * @module OpenSeadragon
- *
- */
-
-/**
- * @namespace OpenSeadragon
- *
- * @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[]|Array[]|String[]|Function[]} [tileSources=null]
-  *     As an Array, the tileSource can hold either Objects or mixed
-  *     types of Arrays of Objects, Strings, or Functions. When a value is a String,
-  *     the tileSource is used to create a {@link OpenSeadragon.DziTileSource}.
-  *     When a value is a Function, the function is used to create a new
-  *     {@link OpenSeadragon.TileSource} whose abstract method
-  *     getUrl( level, x, y ) is implemented by the function. Finally, when it
-  *     is an Array of objects, it is used to create a
-  *     {@link OpenSeadragon.LegacyTileSource}.
-  *
-  * @property {String} [xmlPath=null]
-  *     <strong>DEPRECATED</strong>. 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 {Object} [tileHost=null]
-  *     TODO: Implement this. Currently not used.
-  *
-  * @property {Boolean} [debugMode=false]
-  *     TODO: provide an in-screen panel providing event detail feedback.
-  *
-  * @property {String} [debugGridColor='#437AB2']
-  *
-  * @property {Number} [animationTime=1.2]
-  *     Specifies the animation duration per each {@link OpenSeadragon.Spring}
-  *     which occur when the image is dragged or zoomed.
-  *
-  * @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} [degrees=0]
-  *     Initial rotation.
-  *
-  * @property {Number} [minZoomLevel=null]
-  *
-  * @property {Number} [maxZoomLevel=null]
-  *
-  * @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 infinitly.
-  *
-  * @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
-  *     availble on the viewing device.
-  *
-  * @property {Boolean} [autoResize=true]
-  *     Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior.
-  *
-  * @property {Number} [pixelsPerWheelLine=40]
-  *     For pixel-resolution scrolling devices, the number of pixels equal to one scroll line.
-  *
-  * @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 ration is
-  *     achieved.  Setting this to 0 and wrapHorizontal ( or wrapVertical ) to
-  *     true will provide the effect of an infinitely scrolling viewport.
-  *
-  * @property {Number} [springStiffness=7.0]
-  *
-  * @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]
-  *     If multiple mouse clicks occurs within less than this number of
-  *     milliseconds, treat them as a single click.
-  *
-  * @property {Number} [clickDistThreshold=5]
-  *     If a mouse or touch drag occurs and the distance to the starting drag
-  *     point is less than this many pixels, ignore the drag event.
-  *
-  * @property {Number} [zoomPerClick=2.0]
-  *     The "zoom distance" per mouse click or touch tap. <em><strong>Note:</strong> Setting this to 1.0 effectively disables the click-to-zoom feature.</em>
-  *
-  * @property {Number} [zoomPerScroll=1.2]
-  *     The "zoom distance" per mouse scroll or touch pinch. <em><strong>Note:</strong> Setting this to 1.0 effectively disables the mouse-wheel zoom feature.</em>
-  *
-  * @property {Number} [zoomPerSecond=1.0]
-  *     The number of seconds to animate a single zoom event over.
-  *
-  * @property {Boolean} [showNavigationControl=true]
-  *     Set to false to prevent the appearance of the default navigation controls.
-  *
-  * @property {OpenSeadragon.ControlAnchor} [navigationControlAnchor=TOP_LEFT]
-  *     Placement of the default navigation controls.
-  *
-  * @property {Boolean} [showNavigator=false]
-  *     Set to true to make the navigator minimap appear.
-  *
-  * @property {Boolean} [navigatorId=navigator-GENERATED DATE]
-  *     The ID of a div to hold the navigator minimap.
-  *     If an ID is specified, the navigatorPosition, navigatorSizeRatio, navigatorMaintainSizeRatio, and navigatorTop|Left|Height|Width 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'.<br>
-  *     If 'ABSOLUTE' is specified, then navigatorTop|Left|Height|Width determines the size and position of the navigator minimap in the viewer, and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
-  *     For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT', the navigatorSizeRatio or navigatorHeight|Width values determine the size of the navigator minimap.
-  *
-  * @property {Number} [navigatorSizeRatio=0.2]
-  *     Ratio of navigator size to viewer size. Ignored if navigatorHeight|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 {Number} [controlsFadeDelay=2000]
-  *     The number of milliseconds to wait once the user has stopped interacting
-  *     with the interface before begining 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]
-  *
-  * @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 bandwith 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} [navPrevNextWrap=false]
-  *     If the 'previous' button will wrap to the last image when viewing the first
-  *     image and if the 'next' button will wrap to the first image when viewing
-  *     the last image.
-  *
-  * @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()).
-  *
-  * @property {Boolean} [showSequenceControl=true]
-  *     If the viewer has been configured with a sequence of tile sources, then
-  *     provide buttons for navigating forward and backward through the images.
-  *
-  * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT]
-  *     Placement of the default sequence controls.
-  *
-  * @property {Number} [initialPage=0]
-  *     If the viewer has been configured with a sequence of tile sources, display this page initially.
-  *
-  * @property {Boolean} [preserveViewport=false]
-  *     If the viewer has been configured with a sequence of tile sources, then
-  *     normally navigating to 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} [showReferenceStrip=false]
-  *     If the viewer has been configured with a sequence of tile sources, 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]
-  *
-  * @property {Number} [collectionRows=3]
-  *
-  * @property {String} [collectionLayout='horizontal']
-  *
-  * @property {Number} [collectionTileSize=800]
-  *
-  */
-
-/**
-  * 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} 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
-  *
-  */
-
-
- /**
-  * This function serves as a single point of instantiation for an {@link OpenSeadragon.Viewer}, including all
-  * combinations of out-of-the-box configurable features.
-  *
-  * @function OpenSeadragon
-  * @memberof module:OpenSeadragon
-  * @param {OpenSeadragon.Options} options - Viewer options.
-  * @returns {OpenSeadragon.Viewer}
-  */
-window.OpenSeadragon = window.OpenSeadragon || function( 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
-     */
-    /* jshint ignore:start */
-    $.version = {
-        versionStr: '1.0.0',
-        major: 1,
-        minor: 0,
-        revision: 0
-    };
-    /* jshint ignore:end */
-
-
-    /**
-     * 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 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 key;
-        for ( key in obj ) {}
-
-        return key === undefined || hasOwn.call( obj, key );
-    };
-
-
-    /**
-     * 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;
-    };
-
-
-    /**
-     * 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' ) );
-    }());
-
-
-}( OpenSeadragon ));
-
-/**
- *  This closure defines all static methods available to the OpenSeadragon
- *  namespace.  Many, if not most, are taked 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 ) {
-                    src = target[ name ];
-                    copy = options[ name ];
-
-                    // 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 ) ) ) ) {
-                        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;
-    };
-
-
-    $.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,
-            
-            //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,
-
-            //UI RESPONSIVENESS AND FEEL
-            springStiffness:        7.0,
-            clickTimeThreshold:     300,
-            clickDistThreshold:     5,
-            zoomPerClick:           2,
-            zoomPerScroll:          1.2,
-            zoomPerSecond:          1.0,
-            animationTime:          1.2,
-            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
-            pixelsPerWheelLine:     40,
-            autoResize:             true,
-
-            //DEFAULT CONTROL SETTINGS
-            showSequenceControl:     true,  //SEQUENCE
-            sequenceControlAnchor:   null,  //SEQUENCE
-            preserveViewport:        false, //SEQUENCE
-            showNavigationControl:   true,  //ZOOM/HOME/FULL/SEQUENCE
-            navigationControlAnchor: null,  //ZOOM/HOME/FULL
-            controlsFadeDelay:       2000,  //ZOOM/HOME/FULL/SEQUENCE
-            controlsFadeLength:      1500,  //ZOOM/HOME/FULL/SEQUENCE
-            mouseNavEnabled:         true,  //GENERAL MOUSE INTERACTIVITY
-
-            //VIEWPORT NAVIGATOR SETTINGS
-            showNavigator:              false,
-            navigatorId:                null,
-            navigatorPosition:          null,
-            navigatorSizeRatio:         0.2,
-            navigatorMaintainSizeRatio: false,
-            navigatorTop:               null,
-            navigatorLeft:              null,
-            navigatorHeight:            null,
-            navigatorWidth:             null,
-            navigatorAutoResize:        true,
-
-            // INITIAL ROTATION
-            degrees:                0,
-
-            //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
-            collectionLayout:       'horizontal', //vertical
-            collectionMode:         false,
-            collectionTileSize:     800,
-
-            //PERFORMANCE SETTINGS
-            imageLoaderLimit:       0,
-            maxImageCacheCount:     200,
-            timeout:                30000,
-            useCanvas:              true,  // Use canvas element for drawing if available
-
-            //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'
-                },
-                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'
-                }
-            },
-            navPrevNextWrap:        false,
-            showRotationControl:    false,
-
-            //DEVELOPER SETTINGS
-            debugMode:              false,
-            debugGridColor:         '#437AB2'
-        },
-
-
-        /**
-         * 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
-         */
-        BROWSERS: {
-            UNKNOWN:    0,
-            IE:         1,
-            FIREFOX:    2,
-            SAFARI:     3,
-            CHROME:     4,
-            OPERA:      5
-        },
-
-
-        /**
-         * 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 elemenet 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, "" );
-            },
-
-
-        /**
-         * Gets the latest event, really only useful internally since its
-         * specific to IE behavior.
-         * @function
-         * @param {Event} [event]
-         * @returns {Event}
-         * @deprecated For internal use only
-         * @private
-         */
-        getEvent: function( event ) {
-            if( event ){
-                $.getEvent = function( event ) {
-                    return event;
-                };
-            } else {
-                $.getEvent = function() {
-                    return window.event;
-                };
-            }
-            return $.getEvent( event );
-        },
-
-
-        /**
-         * 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();
-
-                    event = $.getEvent( event );
-                    result.x = event.pageX;
-                    result.y = event.pageY;
-
-                    return result;
-                };
-            } else if ( typeof( event.clientX ) == "number" ) {
-                $.getMousePosition = function( event ){
-                    var result = new $.Point();
-
-                    event = $.getEvent( event );
-                    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 ) {
-                };
-            }
-
-            return $.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.
-         * Generally only IE has issues doing this correctly for formats like
-         * png.
-         * @function
-         * @param {String} src
-         * @returns {Element}
-         */
-        makeTransparentImage: function( src ) {
-
-            $.makeTransparentImage = function( src ){
-                var img = $.makeNeutralElement( "img" );
-
-                img.src = src;
-
-                return img;
-            };
-
-            if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 7 ) {
-
-                $.makeTransparentImage = function( src ){
-                    var img     = $.makeNeutralElement( "img" ),
-                        element = null;
-
-                    element = $.makeNeutralElement("span");
-                    element.style.display = "inline-block";
-
-                    img.onload = function() {
-                        element.style.width  = element.style.width || img.width + "px";
-                        element.style.height = element.style.height || img.height + "px";
-
-                        img.onload = null;
-                        img = null;     // to prevent memory leaks in IE
-                    };
-
-                    img.src = src;
-                    element.style.filter =
-                        "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
-                        src +
-                        "', sizingMethod='scale')";
-
-                    return element;
-                };
-
-            }
-
-            return $.makeTransparentImage( src );
-        },
-
-
-        /**
-         * 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 = "";
-                }
-            }
-        },
-
-
-        /**
-         * 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;
-            }
-        },
-
-
-        /**
-         * 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(' ');
-        },
-
-
-        /**
-         * Adds an event listener for the given element, eventName and handler.
-         * @function
-         * @param {Element|String} element
-         * @param {String} eventName
-         * @param {Function} handler
-         * @param {Boolean} [useCapture]
-         */
-        addEvent: (function () {
-            if ( window.addEventListener ) {
-                return function ( element, eventName, handler, useCapture ) {
-                    element = $.getElement( element );
-                    element.addEventListener( eventName, handler, useCapture );
-                };
-            } else if ( window.attachEvent ) {
-                return function ( element, eventName, handler, useCapture ) {
-                    element = $.getElement( element );
-                    element.attachEvent( 'on' + eventName, handler );
-                    if ( useCapture && element.setCapture ) {
-                        element.setCapture();
-                    }
-                };
-            } 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} [useCapture]
-         */
-        removeEvent: (function () {
-            if ( window.removeEventListener ) {
-                return function ( element, eventName, handler, useCapture ) {
-                    element = $.getElement( element );
-                    element.removeEventListener( eventName, handler, useCapture );
-                };
-            } else if ( window.detachEvent ) {
-                return function( element, eventName, handler, useCapture ) {
-                    element = $.getElement( element );
-                    element.detachEvent( 'on' + eventName, handler );
-                    if ( useCapture && element.releaseCapture ) {
-                        element.releaseCapture();
-                    }
-                };
-            } 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 = $.getEvent( event );
-
-            if ( event.preventDefault ) {
-                $.cancelEvent = function( event ){
-                    // W3C for preventing default
-                    event.preventDefault();
-                };
-            } else {
-                $.cancelEvent = function( event ){
-                    event = $.getEvent( event );
-                    // legacy for preventing default
-                    event.cancel = true;
-                    // IE for preventing default
-                    event.returnValue = false;
-                };
-            }
-            $.cancelEvent( event );
-        },
-
-
-        /**
-         * Stops the propagation of the event up the DOM.
-         * @function
-         * @param {Event} [event]
-         */
-        stopEvent: function( event ) {
-            event = $.getEvent( event );
-
-            if ( event.stopPropagation ) {
-                // W3C for stopping propagation
-                $.stopEvent = function( event ){
-                    event.stopPropagation();
-                };
-            } else {
-                // IE for stopping propagation
-                $.stopEvent = function( event ){
-                    event = $.getEvent( event );
-                    event.cancelBubble = true;
-                };
-
-            }
-
-            $.stopEvent( event );
-        },
-
-
-        /**
-         * 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 additonal 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 );
-            };
-        },
-
-
-        /**
-         * Retreives 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 ) {
-            var value = URLPARAMS[ key ];
-            return value ? value : null;
-        },
-
-
-        createAjaxRequest: function(){
-            var request;
-
-            if ( window.XMLHttpRequest ) {
-                $.createAjaxRequest = function( ){
-                    return new XMLHttpRequest();
-                };
-                request = new XMLHttpRequest();
-            } else if ( window.ActiveXObject ) {
-                /*jshint loopfunc:true*/
-                /* global ActiveXObject:true */
-                for ( var i = 0; i < ACTIVEX.length; i++ ) {
-                    try {
-                        request = new ActiveXObject( ACTIVEX[ i ] );
-                        $.createAjaxRequest = function( ){
-                            return new ActiveXObject( ACTIVEX[ i ] );
-                        };
-                        break;
-                    } catch (e) {
-                        continue;
-                    }
-                }
-            }
-
-            if ( !request ) {
-                throw new Error( "Browser doesn't support XMLHttpRequest." );
-            }
-
-            return request;
-        },
-
-
-        /**
-         * Makes an AJAX request.
-         * @function
-         * @param {String} url - the url to request
-         * @param {Function} onSuccess - a function to call on a successful response
-         * @param {Function} onError - a function to call on when an error occurs
-         * @throws {Error}
-         */
-        makeAjaxRequest: function( url, onSuccess, onError ) {
-            var request = $.createAjaxRequest();
-
-            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(){};
-
-                    if ( request.status == 200 ) {
-                        onSuccess( request );
-                    } else {
-                        $.console.log( "AJAX request returned %s: %s", request.status, url );
-
-                        if ( $.isFunction( onError ) ) {
-                            onError( request );
-                        }
-                    }
-                }
-            };
-
-            try {
-                request.open( "GET", url, true );
-                request.send( null );
-            } catch (e) {
-                var msg = e.message;
-
-                /*
-                    IE < 10 does not support CORS and an XHR request to a different origin will fail as soon
-                    as send() is called. This is particularly easy to miss during development and appear in
-                    production if you use a CDN or domain sharding and the security policy is likely to break
-                    exception handlers since any attempt to access a property of the request object will
-                    raise an access denied TypeError inside the catch block.
-
-                    To be friendlier, we'll check for this specific error and add a documentation pointer
-                    to point developers in the right direction. We test the exception number because IE's
-                    error messages are localized.
-                */
-                var oldIE = $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 10;
-                if ( oldIE && typeof( e.number ) != "undefined" && e.number == -2147024891 ) {
-                    msg += "\nSee http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx#xdomain";
-                }
-
-                $.console.log( "%s while making AJAX request: %s", e.name, msg );
-
-                request.onreadystatechange = function(){};
-
-                if ( $.isFunction( onError ) ) {
-                    onError( request, e );
-                }
-            }
-        },
-
-        /**
-         * 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 ) {
-            //TODO: yet another example where we can determine the correct
-            //      implementation once at start-up instead of everytime we use
-            //      the function. DONE.
-            if ( window.ActiveXObject ) {
-
-                $.parseXml = function( string ){
-                    var xmlDoc = null;
-
-                    xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
-                    xmlDoc.async = false;
-                    xmlDoc.loadXML( string );
-                    return xmlDoc;
-                };
-
-            } else if ( window.DOMParser ) {
-
-                $.parseXml = function( string ){
-                    var xmlDoc = null,
-                        parser;
-
-                    parser = new DOMParser();
-                    xmlDoc = parser.parseFromString( string, "text/xml" );
-                    return xmlDoc;
-                };
-
-            } else {
-                throw new Error( "Browser doesn't support XML DOM." );
-            }
-
-            return $.parseXml( 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 : "";
-            return !!FILEFORMATS[ extension.toLowerCase() ];
-        }
-
-    });
-
-
-    /**
-     * 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 ACTIVEX = [
-            "Msxml2.XMLHTTP",
-            "Msxml3.XMLHTTP",
-            "Microsoft.XMLHTTP"
-        ],
-        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 app = navigator.appName,
-            ver = navigator.appVersion,
-            ua  = navigator.userAgent;
-
-        //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( "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" )
-                            )
-                        );
-                    }
-                }
-                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 ) {
-                URLPARAMS[ part.substring( 0, sep ) ] =
-                    decodeURIComponent( part.substring( sep + 1 ) );
-            }
-        }
-
-        //determine if this browser supports image alpha transparency
-        $.Browser.alpha = !(
-            (
-                $.Browser.vendor == $.BROWSERS.IE &&
-                $.Browser.version < 9
-            ) || (
-                $.Browser.vendor == $.BROWSERS.CHROME &&
-                $.Browser.version < 2
-            )
-        );
-
-        //determine if this browser supports element.style.opacity
-        $.Browser.opacity = !(
-            $.Browser.vendor == $.BROWSERS.IE &&
-            $.Browser.version < 9
-        );
-
-    })();
-
-
-    //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 propogate 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
-    };
-
-
-    // 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;
-        }
-    }
-
-    /**
-     * @private
-     * @inner
-     * @function
-     * @param {XMLHttpRequest} xhr
-     * @param {String} tilesUrl
-     * @deprecated
-     */
-    function processDZIResponse( xhr, tilesUrl ) {
-        var status,
-            statusText,
-            doc = null;
-
-        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 ( xhr.responseXML && xhr.responseXML.documentElement ) {
-            doc = xhr.responseXML;
-        } else if ( xhr.responseText ) {
-            doc = $.parseXml( xhr.responseText );
-        }
-
-        return processDZIXml( doc, tilesUrl );
-    }
-
-    /**
-     * @private
-     * @inner
-     * @function
-     * @param {Document} xmlDoc
-     * @param {String} tilesUrl
-     * @deprecated
-     */
-    function processDZIXml( xmlDoc, tilesUrl ) {
-
-        if ( !xmlDoc || !xmlDoc.documentElement ) {
-            throw new Error( $.getString( "Errors.Xml" ) );
-        }
-
-        var root     = xmlDoc.documentElement,
-            rootName = root.tagName;
-
-        if ( rootName == "Image" ) {
-            try {
-                return processDZI( root, tilesUrl );
-            } 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" ) {
-            return $._processDZIError( root );
-        }
-
-        throw new Error( $.getString( "Errors.Dzi" ) );
-    }
-
-    /**
-     * @private
-     * @inner
-     * @function
-     * @param {Element} imageNode
-     * @param {String} tilesUrl
-     * @deprecated
-     */
-    function processDZI( imageNode, tilesUrl ) {
-        var fileFormat    = imageNode.getAttribute( "Format" ),
-            sizeNode      = imageNode.getElementsByTagName( "Size" )[ 0 ],
-            dispRectNodes = imageNode.getElementsByTagName( "DisplayRect" ),
-            width         = parseInt( sizeNode.getAttribute( "Width" ), 10 ),
-            height        = parseInt( sizeNode.getAttribute( "Height" ), 10 ),
-            tileSize      = parseInt( imageNode.getAttribute( "TileSize" ), 10 ),
-            tileOverlap   = parseInt( imageNode.getAttribute( "Overlap" ), 10 ),
-            dispRects     = [],
-            dispRectNode,
-            rectNode,
-            i;
-
-        if ( !$.imageFormatSupported( fileFormat ) ) {
-            throw new Error(
-                $.getString( "Errors.ImageFormat", fileFormat.toUpperCase() )
-            );
-        }
-
-        for ( i = 0; i < dispRectNodes.length; i++ ) {
-            dispRectNode = dispRectNodes[ i ];
-            rectNode     = dispRectNode.getElementsByTagName( "Rect" )[ 0 ];
-
-            dispRects.push( new $.DisplayRect(
-                parseInt( rectNode.getAttribute( "X" ), 10 ),
-                parseInt( rectNode.getAttribute( "Y" ), 10 ),
-                parseInt( rectNode.getAttribute( "Width" ), 10 ),
-                parseInt( rectNode.getAttribute( "Height" ), 10 ),
-                0,  // ignore MinLevel attribute, bug in Deep Zoom Composer
-                parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 )
-            ));
-        }
-        return new $.DziTileSource(
-            width,
-            height,
-            tileSize,
-            tileOverlap,
-            tilesUrl,
-            fileFormat,
-            dispRects
-        );
-    }
-
-    /**
-     * @private
-     * @inner
-     * @function
-     * @param {Element} imageNode
-     * @param {String} tilesUrl
-     * @deprecated
-     */
-    function processDZIJSON( imageData, tilesUrl ) {
-        var 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 ),
-            dispRects     = [],
-            rectData,
-            i;
-
-        if ( !$.imageFormatSupported( fileFormat ) ) {
-            throw new Error(
-                $.getString( "Errors.ImageFormat", fileFormat.toUpperCase() )
-            );
-        }
-
-        for ( i = 0; i < dispRectData.length; i++ ) {
-            rectData     = dispRectData[ i ].Rect;
-
-            dispRects.push( new $.DisplayRect(
-                parseInt( rectData.X, 10 ),
-                parseInt( rectData.Y, 10 ),
-                parseInt( rectData.Width, 10 ),
-                parseInt( rectData.Height, 10 ),
-                0,  // ignore MinLevel attribute, bug in Deep Zoom Composer
-                parseInt( rectData.MaxLevel, 10 )
-            ));
-        }
-        return new $.DziTileSource(
-            width,
-            height,
-            tileSize,
-            tileOverlap,
-            tilesUrl,
-            fileFormat,
-            dispRects
-        );
-    }
-
-    /**
-     * @private
-     * @inner
-     * @function
-     * @param {Document} errorNode
-     * @throws {Error}
-     * @deprecated
-     */
-    $._processDZIError = function ( errorNode ) {
-        var messageNode = errorNode.getElementsByTagName( "Message" )[ 0 ],
-            message     = messageNode.firstChild.nodeValue;
-
-        throw new Error(message);
-    };
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - full-screen support functions
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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.
- */
-
-/*
- * Implementation and research by John Dyer in:
- * http://johndyer.name/native-fullscreen-javascript-api-plus-jquery-plugin/
- * John Dyer has released this fullscreen code under the MIT license; see
- * <https://github.com/openseadragon/openseadragon/issues/81>.
- *
- * Copyright (C) 2011 John Dyer
- *
- * 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.
- */
-
-
-(function( $ ) {
-    /**
-     * Determined native full screen support we can get from the browser.
-     * @member fullScreenApi
-     * @memberof OpenSeadragon
-     * @type {object}
-     * @property {Boolean} supportsFullScreen
-     * @property {Function} isFullScreen
-     * @property {Function} requestFullScreen
-     * @property {Function} cancelFullScreen
-     * @property {String} fullScreenEventName
-     * @property {String} fullScreenErrorEventName
-     * @property {String} prefix
-     */
-    var fullScreenApi = {
-            supportsFullScreen: false,
-            isFullScreen: function() { return false; },
-            requestFullScreen: function() {},
-            cancelFullScreen: function() {},
-            fullScreenEventName: '',
-            fullScreenErrorEventName: '',
-            prefix: ''
-        },
-        browserPrefixes = 'webkit moz o ms khtml'.split(' ');
-
-    // check for native support
-    if (typeof document.cancelFullScreen != 'undefined') {
-        fullScreenApi.supportsFullScreen = true;
-    } else {
-        // check for fullscreen support by vendor prefix
-        for (var i = 0, il = browserPrefixes.length; i < il; i++ ) {
-            fullScreenApi.prefix = browserPrefixes[i];
-
-            if (typeof document[fullScreenApi.prefix + 'CancelFullScreen' ] != 'undefined' ) {
-                fullScreenApi.supportsFullScreen = true;
-
-                break;
-            }
-        }
-    }
-
-    // update methods to do something useful
-    if (fullScreenApi.supportsFullScreen) {
-        fullScreenApi.fullScreenEventName = fullScreenApi.prefix + 'fullscreenchange';
-        fullScreenApi.fullScreenErrorEventName = fullScreenApi.prefix + 'fullscreenerror';
-
-        fullScreenApi.isFullScreen = function() {
-            switch (this.prefix) {
-                case '':
-                    return document.fullScreen;
-                case 'webkit':
-                    return document.webkitIsFullScreen;
-                default:
-                    return document[this.prefix + 'FullScreen'];
-            }
-        };
-        fullScreenApi.requestFullScreen = function( element ) {
-            return (this.prefix === '') ?
-                element.requestFullScreen() :
-                element[this.prefix + 'RequestFullScreen']();
-
-        };
-        fullScreenApi.cancelFullScreen = function() {
-            return (this.prefix === '') ?
-                document.cancelFullScreen() :
-                document[this.prefix + 'CancelFullScreen']();
-        };
-    } else if ( typeof window.ActiveXObject !== "undefined" ){
-        // Older IE.  Support based on:
-        // http://stackoverflow.com/questions/1125084/how-to-make-in-javascript-full-screen-windows-stretching-all-over-the-screen/7525760
-        fullScreenApi.requestFullScreen = function(){
-            /* global ActiveXObject:true */
-            var wscript = new ActiveXObject("WScript.Shell");
-            if ( wscript !== null ) {
-                wscript.SendKeys("{F11}");
-            }
-            return false;
-        };
-        fullScreenApi.cancelFullScreen = fullScreenApi.requestFullScreen;
-    }
-
-    // export api
-    $.extend( $, fullScreenApi );
-
-})( OpenSeadragon );
-
-/*
- * OpenSeadragon - EventSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 = {};
-};
-
-$.EventSource.prototype = /** @lends OpenSeadragon.EventSource.prototype */{
-
-    // TODO: Add a method 'one' which automatically unbinds a listener after the first triggered event that matches.
-
-    /**
-     * 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.
-     */
-    addHandler: function ( eventName, handler, userData ) {
-        var events = this.events[ eventName ];
-        if ( !events ) {
-            this.events[ eventName ] = events = [];
-        }
-        if ( handler && $.isFunction( handler ) ) {
-            events[ events.length ] = { handler: handler, userData: userData || null };
-        }
-    },
-
-    /**
-     * 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;
-        }
-    },
-
-
-    /**
-     * 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 ) {
-            if ( !eventArgs ) {
-                eventArgs = {};
-            }
-
-            handler( this, eventArgs );
-        }
-    }
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - MouseTracker
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 ( $ ) {
-
-        // is any button currently being pressed while mouse events occur
-    var IS_BUTTON_DOWN = false,
-        // is any tracker currently capturing?
-        IS_CAPTURING   = false,
-        // dictionary from hash to MouseTracker
-        ACTIVE         = {},
-        // list of trackers interested in capture
-        CAPTURING      = [],
-        // dictionary from hash to private properties
-        THIS           = {};
-
-    /**
-     * @class MouseTracker
-     * @classdesc Provides simplified handling of common mouse, touch, and keyboard
-     * events on a specific element, like 'enter', 'exit', 'press', 'release',
-     * 'scroll', 'click', and 'drag'.
-     *
-     * @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 mouse/touch/key
-     *      events will be monitored.
-     * @param {Number} options.clickTimeThreshold
-     *      The number of milliseconds within which multiple mouse clicks
-     *      will be treated as a single event.
-     * @param {Number} options.clickDistThreshold
-     *      The distance between mouse click within multiple mouse clicks
-     *      will be treated as a single event.
-     * @param {Number} [options.stopDelay=50]
-     *      The number of milliseconds without mouse move before the mouse stop
-     *      event is fired.
-     * @param {OpenSeadragon.EventHandler} [options.enterHandler=null]
-     *      An optional handler for mouse enter.
-     * @param {OpenSeadragon.EventHandler} [options.exitHandler=null]
-     *      An optional handler for mouse exit.
-     * @param {OpenSeadragon.EventHandler} [options.pressHandler=null]
-     *      An optional handler for mouse press.
-     * @param {OpenSeadragon.EventHandler} [options.releaseHandler=null]
-     *      An optional handler for mouse release.
-     * @param {OpenSeadragon.EventHandler} [options.moveHandler=null]
-     *      An optional handler for mouse move.
-     * @param {OpenSeadragon.EventHandler} [options.scrollHandler=null]
-     *      An optional handler for mouse scroll.
-     * @param {OpenSeadragon.EventHandler} [options.clickHandler=null]
-     *      An optional handler for mouse click.
-     * @param {OpenSeadragon.EventHandler} [options.dragHandler=null]
-     *      An optional handler for mouse drag.
-     * @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 ) {
-
-        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 mouse/touch/key events are being monitored.
-         * @member {Element} element
-         * @memberof OpenSeadragon.MouseTracker#
-         */
-        this.element            = $.getElement( options.element );
-        /**
-         * The number of milliseconds within which mutliple mouse clicks will be treated as a single event.
-         * @member {Number} clickTimeThreshold
-         * @memberof OpenSeadragon.MouseTracker#
-         */
-        this.clickTimeThreshold = options.clickTimeThreshold;
-        /**
-         * The distance between mouse click within multiple mouse clicks will be treated as a single event.
-         * @member {Number} clickDistThreshold
-         * @memberof OpenSeadragon.MouseTracker#
-         */
-        this.clickDistThreshold = options.clickDistThreshold;
-        this.userData           = options.userData       || null;
-        this.stopDelay          = options.stopDelay      || 50;
-
-        this.enterHandler       = options.enterHandler   || null;
-        this.exitHandler        = options.exitHandler    || null;
-        this.pressHandler       = options.pressHandler   || null;
-        this.releaseHandler     = options.releaseHandler || null;
-        this.moveHandler        = options.moveHandler    || null;
-        this.scrollHandler      = options.scrollHandler  || null;
-        this.clickHandler       = options.clickHandler   || null;
-        this.dragHandler        = options.dragHandler    || null;
-        this.stopHandler        = options.stopHandler    || null;
-        this.keyHandler         = options.keyHandler     || null;
-        this.focusHandler       = options.focusHandler   || null;
-        this.blurHandler        = options.blurHandler    || null;
-
-        //Store private properties in a scope sealed hash map
-        var _this = this;
-
-        /**
-         * @private
-         * @property {Boolean} tracking
-         *      Are we currently tracking mouse events.
-         * @property {Boolean} capturing
-         *      Are we curruently capturing mouse events.
-         * @property {Boolean} insideElementPressed
-         *      True if the left mouse button is currently being pressed and was
-         *      initiated inside the tracked element, otherwise false.
-         * @property {Boolean} insideElement
-         *      Are we currently inside the screen area of the tracked element.
-         * @property {OpenSeadragon.Point} lastPoint
-         *      Position of last mouse down/move
-         * @property {Number} lastMouseDownTime
-         *      Time of last mouse down.
-         * @property {OpenSeadragon.Point} lastMouseDownPoint
-         *      Position of last mouse down
-         */
-        THIS[ this.hash ] = {
-            mouseover:             function ( event ) { onMouseOver( _this, event, false ); },
-            mouseout:              function ( event ) { onMouseOut( _this, event, false ); },
-            mousedown:             function ( event ) { onMouseDown( _this, event ); },
-            mouseup:               function ( event ) { onMouseUp( _this, event, false ); },
-            mousemove:             function ( event ) { onMouseMove( _this, event ); },
-            click:                 function ( event ) { onMouseClick( _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 ); },
-            mouseupie:             function ( event ) { onMouseUpIE( _this, event ); },
-            mousemovecapturedie:   function ( event ) { onMouseMoveCapturedIE( _this, event ); },
-            mouseupcaptured:       function ( event ) { onMouseUpCaptured( _this, event ); },
-            mousemovecaptured:     function ( event ) { onMouseMoveCaptured( _this, event, false ); },
-            touchstart:            function ( event ) { onTouchStart( _this, event ); },
-            touchmove:             function ( event ) { onTouchMove( _this, event ); },
-            touchend:              function ( event ) { onTouchEnd( _this, event ); },
-            keypress:              function ( event ) { onKeyPress( _this, event ); },
-            focus:                 function ( event ) { onFocus( _this, event ); },
-            blur:                  function ( event ) { onBlur( _this, event ); },
-            tracking:              false,
-            capturing:             false,
-            insideElementPressed:  false,
-            insideElement:         false,
-            lastPoint:             null,
-            lastMouseDownTime:     null,
-            lastMouseDownPoint:    null,
-            lastPinchDelta:        0
-        };
-
-    };
-
-    $.MouseTracker.prototype = /** @lends OpenSeadragon.MouseTracker.prototype */{
-
-        /**
-         * Clean up any events or objects created by the mouse tracker.
-         * @function
-         */
-        destroy: function () {
-            stopTracking( this );
-            this.element = null;
-        },
-
-        /**
-         * 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;
-        },
-
-        /**
-         * 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 {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.
-         * @param {Boolean} event.isTouchEvent
-         *      True if the original event is a touch event, otherwise false.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @param {Object} event.userData
-         *      Arbitrary user-defined object.
-         */
-        enterHandler: 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 {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.
-         * @param {Boolean} event.isTouchEvent
-         *      True if the original event is a touch event, otherwise false.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @param {Object} event.userData
-         *      Arbitrary user-defined object.
-         */
-        exitHandler: 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 {Boolean} event.isTouchEvent
-         *      True if the original event is a touch event, otherwise false.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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 {OpenSeadragon.Point} event.position
-         *      The position of the event relative to 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.insideElementReleased
-         *      True if the cursor still inside the tracked element when the button was released.
-         * @param {Boolean} event.isTouchEvent
-         *      True if the original event is a touch event, otherwise false.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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 {OpenSeadragon.Point} event.position
-         *      The position of the event relative to the tracked element.
-         * @param {Boolean} event.isTouchEvent
-         *      True if the original event is a touch event, otherwise false.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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 {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.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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 {OpenSeadragon.Point} event.position
-         *      The position of the event relative to the tracked element.
-         * @param {Number} event.quick
-         *      True only if the clickDistThreshold and clickDeltaThreshold are both passed. Useful for ignoring 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.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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 {OpenSeadragon.Point} event.position
-         *      The position of the event relative to the tracked element.
-         * @param {OpenSeadragon.Point} event.delta
-         *      The x,y components of the difference between start drag and end drag.  Usefule for ignoring or weighting the 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.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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 {OpenSeadragon.Point} event.position
-         *      The position of the event relative to the tracked element.
-         * @param {Boolean} event.isTouchEvent
-         *      True if the original event is a touch event, otherwise false.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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.shift
-         *      True if the shift key was pressed during this event.
-         * @param {Object} event.originalEvent
-         *      The original event object.
-         * @param {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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 {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @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 {Boolean} event.preventDefaultAction
-         *      Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.
-         * @param {Object} event.userData
-         *      Arbitrary user-defined object.
-         */
-        blurHandler: function () { }
-    };
-
-    /**
-     * Detect available mouse wheel event.
-     */
-    $.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
-
-    /**
-     * Starts tracking mouse events on this element.
-     * @private
-     * @inner
-     */
-    function startTracking( tracker ) {
-        var events = [
-                "mouseover", "mouseout", "mousedown", "mouseup", "mousemove",
-                "click",
-                $.MouseTracker.wheelEventName,
-                "touchstart", "touchmove", "touchend",
-                "keypress",
-                "focus", "blur"
-            ],
-            delegate = THIS[ tracker.hash ],
-            event,
-            i;
-
-        // Add 'MozMousePixelScroll' event handler for older Firefox
-        if( $.MouseTracker.wheelEventName == "DOMMouseScroll" ) {
-            events.push( "MozMousePixelScroll" );
-        }
-
-        if ( !delegate.tracking ) {
-            for ( i = 0; i < events.length; i++ ) {
-                event = events[ i ];
-                $.addEvent(
-                    tracker.element,
-                    event,
-                    delegate[ event ],
-                    false
-                );
-            }
-            delegate.tracking = true;
-            ACTIVE[ tracker.hash ] = tracker;
-        }
-    }
-
-    /**
-     * Stops tracking mouse events on this element.
-     * @private
-     * @inner
-     */
-    function stopTracking( tracker ) {
-        var events = [
-                "mouseover", "mouseout", "mousedown", "mouseup", "mousemove",
-                "click",
-                $.MouseTracker.wheelEventName,
-                "touchstart", "touchmove", "touchend",
-                "keypress",
-                "focus", "blur"
-            ],
-            delegate = THIS[ tracker.hash ],
-            event,
-            i;
-
-        // Remove 'MozMousePixelScroll' event handler for older Firefox
-        if( $.MouseTracker.wheelEventName == "DOMMouseScroll" ) {
-            events.push( "MozMousePixelScroll" );
-        }
-
-        if ( delegate.tracking ) {
-            for ( i = 0; i < events.length; i++ ) {
-                event = events[ i ];
-                $.removeEvent(
-                    tracker.element,
-                    event,
-                    delegate[ event ],
-                    false
-                );
-            }
-
-            releaseMouse( tracker );
-            delegate.tracking = false;
-            delete ACTIVE[ tracker.hash ];
-        }
-    }
-
-    /**
-     * @private
-     * @inner
-     */
-    function hasMouse( tracker ) {
-        return THIS[ tracker.hash ].insideElement;
-    }
-
-    /**
-     * Begin capturing mouse events on this element.
-     * @private
-     * @inner
-     */
-    function captureMouse( tracker ) {
-        var delegate = THIS[ tracker.hash ];
-        if ( !delegate.capturing ) {
-
-            if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 ) {
-                $.removeEvent(
-                    tracker.element,
-                    "mouseup",
-                    delegate.mouseup,
-                    false
-                );
-                $.addEvent(
-                    tracker.element,
-                    "mouseup",
-                    delegate.mouseupie,
-                    true
-                );
-                $.addEvent(
-                    tracker.element,
-                    "mousemove",
-                    delegate.mousemovecapturedie,
-                    true
-                );
-            } else {
-                $.addEvent(
-                    window,
-                    "mouseup",
-                    delegate.mouseupcaptured,
-                    true
-                );
-                $.addEvent(
-                    window,
-                    "mousemove",
-                    delegate.mousemovecaptured,
-                    true
-                );
-            }
-            delegate.capturing = true;
-        }
-    }
-
-
-    /**
-     * Stop capturing mouse events on this element.
-     * @private
-     * @inner
-     */
-    function releaseMouse( tracker ) {
-        var delegate = THIS[ tracker.hash ];
-        if ( delegate.capturing ) {
-
-            if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 ) {
-                $.removeEvent(
-                    tracker.element,
-                    "mousemove",
-                    delegate.mousemovecapturedie,
-                    true
-                );
-                $.removeEvent(
-                    tracker.element,
-                    "mouseup",
-                    delegate.mouseupie,
-                    true
-                );
-                $.addEvent(
-                    tracker.element,
-                    "mouseup",
-                    delegate.mouseup,
-                    false
-                );
-            } else {
-                $.removeEvent(
-                    window,
-                    "mousemove",
-                    delegate.mousemovecaptured,
-                    true
-                );
-                $.removeEvent(
-                    window,
-                    "mouseup",
-                    delegate.mouseupcaptured,
-                    true
-                );
-            }
-            delegate.capturing = false;
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function triggerOthers( tracker, handler, event, isTouch ) {
-        var otherHash;
-        for ( otherHash in ACTIVE ) {
-            if ( ACTIVE.hasOwnProperty( otherHash ) && tracker.hash != otherHash ) {
-                handler( ACTIVE[ otherHash ], event, isTouch );
-            }
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onFocus( tracker, event ) {
-        //console.log( "focus %s", event );
-        var propagate;
-        if ( tracker.focusHandler ) {
-            propagate = tracker.focusHandler(
-                {
-                    eventSource:          tracker,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( event );
-            }
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onBlur( tracker, event ) {
-        //console.log( "blur %s", event );
-        var propagate;
-        if ( tracker.blurHandler ) {
-            propagate = tracker.blurHandler(
-                {
-                    eventSource:          tracker,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( 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 propagate;
-        if ( tracker.keyHandler ) {
-            propagate = tracker.keyHandler(
-                {
-                    eventSource:          tracker,
-                    position:             getMouseRelative( event, tracker.element ),
-                    keyCode:              event.keyCode ? event.keyCode : event.charCode,
-                    shift:                event.shiftKey,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( !propagate ) {
-                $.cancelEvent( event );
-            }
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onMouseOver( tracker, event, isTouch ) {
-
-        var delegate = THIS[ tracker.hash ],
-            propagate;
-
-        isTouch = isTouch || false;
-
-        event = $.getEvent( event );
-
-        if ( !isTouch ) {
-            if ( $.Browser.vendor == $.BROWSERS.IE &&
-                 $.Browser.version < 9 &&
-                 delegate.capturing &&
-                 !isChild( event.srcElement, tracker.element ) ) {
-
-                triggerOthers( tracker, onMouseOver, event, isTouch );
-            }
-
-            var to = event.target ?
-                    event.target :
-                    event.srcElement,
-                from = event.relatedTarget ?
-                    event.relatedTarget :
-                    event.fromElement;
-
-            if ( !isChild( tracker.element, to ) ||
-                  isChild( tracker.element, from ) ) {
-                return;
-            }
-        }
-
-        delegate.insideElement = true;
-
-        if ( tracker.enterHandler ) {
-            propagate = tracker.enterHandler(
-                {
-                    eventSource:          tracker,
-                    position:             getMouseRelative( isTouch ? event.changedTouches[ 0 ] : event, tracker.element ),
-                    insideElementPressed: delegate.insideElementPressed,
-                    buttonDownAny:        IS_BUTTON_DOWN,
-                    isTouchEvent:         isTouch,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( event );
-            }
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onMouseOut( tracker, event, isTouch ) {
-        var delegate = THIS[ tracker.hash ],
-            propagate;
-
-        isTouch = isTouch || false;
-
-        event = $.getEvent( event );
-
-        if ( !isTouch ) {
-            if ( $.Browser.vendor == $.BROWSERS.IE &&
-                 $.Browser.version < 9 &&
-                 delegate.capturing &&
-                 !isChild( event.srcElement, tracker.element ) ) {
-
-                triggerOthers( tracker, onMouseOut, event, isTouch );
-
-            }
-
-            var from = event.target ?
-                    event.target :
-                    event.srcElement,
-                to = event.relatedTarget ?
-                    event.relatedTarget :
-                    event.toElement;
-
-            if ( !isChild( tracker.element, from ) ||
-                  isChild( tracker.element, to ) ) {
-                return;
-            }
-        }
-
-        delegate.insideElement = false;
-
-        if ( tracker.exitHandler ) {
-            propagate = tracker.exitHandler(
-                {
-                    eventSource:          tracker,
-                    position:             getMouseRelative( isTouch ? event.changedTouches[ 0 ] : event, tracker.element ),
-                    insideElementPressed: delegate.insideElementPressed,
-                    buttonDownAny:        IS_BUTTON_DOWN,
-                    isTouchEvent:         isTouch,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-
-            if ( propagate === false ) {
-                $.cancelEvent( event );
-            }
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onMouseDown( tracker, event, noCapture, isTouch ) {
-        var delegate = THIS[ tracker.hash ],
-            propagate;
-
-        isTouch = isTouch || false;
-
-        event = $.getEvent(event);
-
-        var eventOrTouchPoint = isTouch ? event.touches[ 0 ] : event;
-
-        if ( event.button == 2 ) {
-            return;
-        }
-
-        delegate.insideElementPressed = true;
-
-        delegate.lastPoint = getMouseAbsolute( eventOrTouchPoint );
-        delegate.lastMouseDownPoint = delegate.lastPoint;
-        delegate.lastMouseDownTime = $.now();
-
-        if ( tracker.pressHandler ) {
-            propagate = tracker.pressHandler(
-                {
-                    eventSource:          tracker,
-                    position:             getMouseRelative( eventOrTouchPoint, tracker.element ),
-                    isTouchEvent:         isTouch,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( event );
-            }
-        }
-
-        if ( tracker.pressHandler || tracker.dragHandler ) {
-            $.cancelEvent( event );
-        }
-
-        if ( noCapture ) {
-            return;
-        }
-
-        if ( isTouch ||
-             !( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 ) ||
-             !IS_CAPTURING ) {
-            captureMouse( tracker );
-            IS_CAPTURING = true;
-            // reset to empty & add us
-            CAPTURING = [ tracker ];
-        } else if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 ) {
-            // add us to the list
-            CAPTURING.push( tracker );
-        }
-    }
-
-    /**
-     * @private
-     * @inner
-     */
-    function onTouchStart( tracker, event ) {
-        var touchA,
-            touchB;
-
-        if ( event.touches.length == 1 &&
-            event.targetTouches.length == 1 &&
-            event.changedTouches.length == 1 ) {
-
-            THIS[ tracker.hash ].lastTouch = event.touches[ 0 ];
-            onMouseOver( tracker, event, true );
-            // call with no capture as the onMouseMoveCaptured will 
-            // be triggered by onTouchMove
-            onMouseDown( tracker, event, true, true );
-        }
-
-        if ( event.touches.length == 2 ) {
-
-            touchA = getMouseAbsolute( event.touches[ 0 ] );
-            touchB = getMouseAbsolute( event.touches[ 1 ] );
-            THIS[ tracker.hash ].lastPinchDelta =
-                Math.abs( touchA.x - touchB.x ) +
-                Math.abs( touchA.y - touchB.y );
-            THIS[ tracker.hash ].pinchMidpoint = new $.Point(
-                ( touchA.x + touchB.x ) / 2,
-                ( touchA.y + touchB.y ) / 2
-            );
-            //$.console.debug("pinch start : "+THIS[ tracker.hash ].lastPinchDelta);
-        }
-
-        event.preventDefault();
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onMouseUp( tracker, event, isTouch ) {
-        var delegate = THIS[ tracker.hash ],
-            //were we inside the tracked element when we were pressed
-            insideElementPressed = delegate.insideElementPressed,
-            //are we still inside the tracked element when we released
-            insideElementReleased = delegate.insideElement,
-            propagate;
-
-        isTouch = isTouch || false;
-
-        event = $.getEvent(event);
-
-        if ( event.button == 2 ) {
-            return;
-        }
-
-        delegate.insideElementPressed = false;
-
-        if ( tracker.releaseHandler ) {
-            propagate = tracker.releaseHandler(
-                {
-                    eventSource:           tracker,
-                    position:              getMouseRelative( isTouch ? event.changedTouches[ 0 ] : event, tracker.element ),
-                    insideElementPressed:  insideElementPressed,
-                    insideElementReleased: insideElementReleased,
-                    isTouchEvent:          isTouch,
-                    originalEvent:         event,
-                    preventDefaultAction:  false,
-                    userData:              tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( event );
-            }
-        }
-
-        if ( insideElementPressed && insideElementReleased ) {
-            handleMouseClick( tracker, event, isTouch );
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onTouchEnd( tracker, event ) {
-
-        if ( event.touches.length === 0 &&
-            event.targetTouches.length === 0 &&
-            event.changedTouches.length == 1 ) {
-
-            THIS[ tracker.hash ].lastTouch = null;
-
-            // call with no release, as the mouse events are 
-            // not registered in onTouchStart
-            onMouseUpCaptured( tracker, event, true, true );
-            onMouseOut( tracker, event, true );
-        }
-        if ( event.touches.length + event.changedTouches.length == 2 ) {
-            THIS[ tracker.hash ].lastPinchDelta = null;
-            THIS[ tracker.hash ].pinchMidpoint = null;
-            //$.console.debug("pinch end");
-        }
-        event.preventDefault();
-    }
-
-
-    /**
-     * Only triggered once by the deepest element that initially received
-     * the mouse down event. We want to make sure THIS event doesn't bubble.
-     * Instead, we want to trigger the elements that initially received the
-     * mouse down event (including this one) only if the mouse is no longer
-     * inside them. Then, we want to release capture, and emulate a regular
-     * mouseup on the event that this event was meant for.
-     * @private
-     * @inner
-     */
-    function onMouseUpIE( tracker, event ) {
-        var othertracker,
-            i;
-
-        event = $.getEvent( event );
-
-        if ( event.button == 2 ) {
-            return;
-        }
-
-        for ( i = 0; i < CAPTURING.length; i++ ) {
-            othertracker = CAPTURING[ i ];
-            if ( !hasMouse( othertracker ) ) {
-                onMouseUp( othertracker, event, false );
-            }
-        }
-
-        releaseMouse( tracker );
-        IS_CAPTURING = false;
-        event.srcElement.fireEvent(
-            "on" + event.type,
-            document.createEventObject( event )
-        );
-
-        $.stopEvent( event );
-    }
-
-
-    /**
-     * Only triggered in W3C browsers by elements within which the mouse was
-     * initially pressed, since they are now listening to the window for
-     * mouseup during the capture phase. We shouldn't handle the mouseup
-     * here if the mouse is still inside this element, since the regular
-     * mouseup handler will still fire.
-     * @private
-     * @inner
-     */
-    function onMouseUpCaptured( tracker, event, noRelease, isTouch ) {
-        isTouch = isTouch || false;
-
-        if ( !THIS[ tracker.hash ].insideElement || isTouch ) {
-            onMouseUp( tracker, event, isTouch );
-        }
-
-        if ( noRelease ) {
-            return;
-        }
-
-        releaseMouse( tracker );
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onMouseMove( tracker, event ) {
-        if ( tracker.moveHandler ) {
-            event = $.getEvent( event );
-
-            var propagate = tracker.moveHandler(
-                {
-                    eventSource:          tracker,
-                    position:             getMouseRelative( event, tracker.element ),
-                    isTouchEvent:         false,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( event );
-            }
-        }
-        if ( tracker.stopHandler ) {
-            clearTimeout( tracker.stopTimeOut );
-            tracker.stopTimeOut = setTimeout( function() {
-                onMouseStop( tracker, event );
-            }, tracker.stopDelay );
-        }
-    }
-    
-    /**
-     * @private
-     * @inner
-     */
-    function onMouseStop( tracker, originalMoveEvent ) {
-        if ( tracker.stopHandler ) {
-            tracker.stopHandler( {
-                eventSource:          tracker,
-                position:             getMouseRelative( originalMoveEvent, tracker.element ),
-                isTouchEvent:         false,
-                originalEvent:        originalMoveEvent,
-                preventDefaultAction: false,
-                userData:             tracker.userData
-            } );
-        }
-    }
-
-    /**
-     * @private
-     * @inner
-     */
-    function onMouseClick( tracker, event ) {
-        if ( tracker.clickHandler ) {
-            $.cancelEvent( event );
-        }
-    }
-
-
-    /**
-     * Handler for 'wheel' events
-     *
-     * @private
-     * @inner
-     */
-    function onWheel( tracker, event ) {
-        handleWheelEvent( tracker, event, event, false );
-    }
-
-
-    /**
-     * Handler for 'mousewheel', 'DOMMouseScroll', and 'MozMousePixelScroll' events
-     *
-     * @private
-     * @inner
-     */
-    function onMouseWheel( tracker, event ) {
-        // For legacy IE, access the global (window) event object
-        event = event || window.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 = - 1 / $.DEFAULT_SETTINGS.pixelsPerWheelLine * event.wheelDelta;
-        } else {
-            simulatedEvent.deltaY = event.detail;
-        }
-
-        handleWheelEvent( tracker, simulatedEvent, event, false );
-    }
-
-
-    /**
-     * Handles 'wheel' events. 
-     * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()) or onTouchMove().
-     *
-     * @private
-     * @inner
-     */
-    function handleWheelEvent( tracker, event, originalEvent, isTouch ) {
-        var nDelta = 0,
-            propagate;
-
-        isTouch = isTouch || false;
-
-        // 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;
-
-        if ( tracker.scrollHandler ) {
-            propagate = tracker.scrollHandler(
-                {
-                    eventSource:          tracker,
-                    position:             getMouseRelative( event, tracker.element ),
-                    scroll:               nDelta,
-                    shift:                event.shiftKey,
-                    isTouchEvent:         isTouch,
-                    originalEvent:        originalEvent,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( originalEvent );
-            }
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function handleMouseClick( tracker, event, isTouch ) {
-        var delegate = THIS[ tracker.hash ],
-            propagate;
-
-        isTouch = isTouch || false;
-
-        event = $.getEvent( event );
-
-        var eventOrTouchPoint = isTouch ? event.changedTouches[ 0 ] : event;
-
-        if ( event.button == 2 ) {
-            return;
-        }
-
-        var time = $.now() - delegate.lastMouseDownTime,
-            point = getMouseAbsolute( eventOrTouchPoint ),
-            distance = delegate.lastMouseDownPoint.distanceTo( point ),
-            quick = time <= tracker.clickTimeThreshold &&
-                       distance <= tracker.clickDistThreshold;
-
-        if ( tracker.clickHandler ) {
-            propagate = tracker.clickHandler(
-                {
-                    eventSource:          tracker,
-                    position:             getMouseRelative( eventOrTouchPoint, tracker.element ),
-                    quick:                quick,
-                    shift:                event.shiftKey,
-                    isTouchEvent:         isTouch,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( event );
-            }
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onMouseMoveCaptured( tracker, event, isTouch ) {
-        var delegate = THIS[ tracker.hash ],
-            delta,
-            propagate,
-            point;
-
-        isTouch = isTouch || false;
-
-        event = $.getEvent(event);
-        var eventOrTouchPoint = isTouch ? event.touches[ 0 ] : event;
-        point = getMouseAbsolute( eventOrTouchPoint );
-        delta = point.minus( delegate.lastPoint );
-
-        delegate.lastPoint = point;
-
-        if ( tracker.dragHandler ) {
-            propagate = tracker.dragHandler(
-                {
-                    eventSource:          tracker,
-                    position:             getMouseRelative( eventOrTouchPoint, tracker.element ),
-                    delta:                delta,
-                    shift:                event.shiftKey,
-                    isTouchEvent:         isTouch,
-                    originalEvent:        event,
-                    preventDefaultAction: false,
-                    userData:             tracker.userData
-                }
-            );
-            if ( propagate === false ) {
-                $.cancelEvent( event );
-            }
-        }
-    }
-
-
-    /**
-     * @private
-     * @inner
-     */
-    function onTouchMove( tracker, event ) {
-        var touchA,
-            touchB,
-            pinchDelta;
-
-        if ( !THIS[ tracker.hash ].lastTouch ) {
-            return;
-        }
-
-        if ( event.touches.length === 1 &&
-            event.targetTouches.length === 1 &&
-            event.changedTouches.length === 1 &&
-            THIS[ tracker.hash ].lastTouch.identifier === event.touches[ 0 ].identifier ) {
-
-            onMouseMoveCaptured( tracker, event, true );
-
-        } else if ( event.touches.length === 2 ) {
-
-            touchA = getMouseAbsolute( event.touches[ 0 ] );
-            touchB = getMouseAbsolute( event.touches[ 1 ] );
-            pinchDelta =
-                Math.abs( touchA.x - touchB.x ) +
-                Math.abs( touchA.y - touchB.y );
-
-            //TODO: make the 75px pinch threshold configurable
-            if ( Math.abs( THIS[ tracker.hash ].lastPinchDelta - pinchDelta ) > 75 ) {
-                //$.console.debug( "pinch delta : " + pinchDelta + " | previous : " + THIS[ tracker.hash ].lastPinchDelta);
-
-                // Simulate a 'wheel' event
-                var simulatedEvent = {
-                    target:     event.target || event.srcElement,
-                    type:       "wheel",
-                    shiftKey:   event.shiftKey || false,
-                    clientX:    THIS[ tracker.hash ].pinchMidpoint.x,
-                    clientY:    THIS[ tracker.hash ].pinchMidpoint.y,
-                    pageX:      THIS[ tracker.hash ].pinchMidpoint.x,
-                    pageY:      THIS[ tracker.hash ].pinchMidpoint.y,
-                    deltaMode:  1, // 0=pixel, 1=line, 2=page
-                    deltaX:     0,
-                    deltaY:     ( THIS[ tracker.hash ].lastPinchDelta > pinchDelta ) ? 1 : -1,
-                    deltaZ:     0
-                };
-
-                handleWheelEvent( tracker, simulatedEvent, event, true );
-
-                THIS[ tracker.hash ].lastPinchDelta = pinchDelta;
-            }
-        }
-        event.preventDefault();
-    }
-
-    /**
-     * Only triggered once by the deepest element that initially received
-     * the mouse down event. Since no other element has captured the mouse,
-     * we want to trigger the elements that initially received the mouse
-     * down event (including this one). The the param tracker isn't used
-     * but for consistency with the other event handlers we include it.
-     * @private
-     * @inner
-     */
-    function onMouseMoveCapturedIE( tracker, event ) {
-        var i;
-        for ( i = 0; i < CAPTURING.length; i++ ) {
-            onMouseMoveCaptured( CAPTURING[ i ], event, false );
-        }
-
-        $.stopEvent( event );
-    }
-
-    /**
-     * @private
-     * @inner
-     */
-    function getMouseAbsolute( event ) {
-        return $.getMousePosition( event );
-    }
-
-    /**
-     * @private
-     * @inner
-     */
-    function getMouseRelative( event, element ) {
-        var mouse  = $.getMousePosition( event ),
-            offset = $.getElementOffset( element );
-
-        return mouse.minus( offset );
-    }
-
-    /**
-     * @private
-     * @inner
-     * Returns true if elementB is a child node of elementA, or if they're equal.
-     */
-    function isChild( elementA, elementB ) {
-        var body = document.body;
-        while ( elementB && elementA != elementB && body != elementB ) {
-            try {
-                elementB = elementB.parentNode;
-            } catch ( e ) {
-                return false;
-            }
-        }
-        return elementA == elementB;
-    }
-
-    /**
-     * @private
-     * @inner
-     */
-    function onGlobalMouseDown() {
-        IS_BUTTON_DOWN = true;
-    }
-
-    /**
-     * @private
-     * @inner
-     */
-    function onGlobalMouseUp() {
-        IS_BUTTON_DOWN = false;
-    }
-
-
-    (function () {
-        if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 9 ) {
-            $.addEvent( document, "mousedown", onGlobalMouseDown, false );
-            $.addEvent( document, "mouseup", onGlobalMouseUp, false );
-        } else {
-            $.addEvent( window, "mousedown", onGlobalMouseDown, true );
-            $.addEvent( window, "mouseup", onGlobalMouseUp, true );
-        }
-    } )();
-
-} ( OpenSeadragon ) );
-
-/*
- * OpenSeadragon - Control
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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( "span" );
-        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 );
-    }
-};
-
-$.Control.prototype = /** @lends OpenSeadragon.Control.prototype */{
-
-    /**
-     * Removes the control from the container.
-     * @function
-     */
-    destroy: function() {
-        this.wrapper.removeChild( this.element );
-        this.container.removeChild( this.wrapper );
-    },
-
-    /**
-     * Determines if the control is currently visible.
-     * @function
-     * @return {Boolean} true if currenly 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-2013 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 &lt;form&gt; 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('form'),
-            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 );
-    };
-
-    $.ControlDock.prototype = /** @lends OpenSeadragon.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
-         * @return {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
-         * @return {OpenSeadragon.ControlDock} Chainable.
-         */
-        clearControls: function () {
-            while ( this.controls.length > 0 ) {
-                this.controls.pop().destroy();
-            }
-
-            return this;
-        },
-
-
-        /**
-         * @function
-         * @return {Boolean}
-         */
-        areControlsEnabled: function () {
-            var i;
-
-            for ( i = this.controls.length - 1; i >= 0; i-- ) {
-                if ( this.controls[ i ].isVisible() ) {
-                    return true;
-                }
-            }
-
-            return false;
-        },
-
-
-        /**
-         * @function
-         * @return {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 - Viewer
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 = {},
-// We keep a list of viewers so we can 'wake-up' each viewer on
-// a page after toggling between fullpage modes
-    VIEWERS = {};
-
-/**
- *
- * 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.
- *
- * @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 prefering 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,
-            overlayControls:    args.length > 5 ? args[ 5 ] : 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 || options.id,
-
-        //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 &lt;form&gt; element (provided by {@link OpenSeadragon.ControlDock}), the base element of this Viewer instance.<br><br>
-         * Child element of {@link OpenSeadragon.Viewer#element}.
-         * @member {Element} container
-         * @memberof OpenSeadragon.Viewer#
-         */
-        container:      null,
-        /**
-         * A &lt;textarea&gt; element, the element where keyboard events are handled.<br><br>
-         * Child element of {@link OpenSeadragon.Viewer#container},
-         * positioned below {@link OpenSeadragon.Viewer#canvas}. 
-         * @member {Element} keyboardCommandArea
-         * @memberof OpenSeadragon.Viewer#
-         */
-        keyboardCommandArea: null,
-        /**
-         * A &lt;div&gt; element, the element where user-input events are handled for panning and zooming.<br><br>
-         * Child element of {@link OpenSeadragon.Viewer#container},
-         * positioned on top of {@link OpenSeadragon.Viewer#keyboardCommandArea}.<br><br>
-         * The parent of {@link OpenSeadragon.Drawer#canvas} instances. 
-         * @member {Element} canvas
-         * @memberof OpenSeadragon.Viewer#
-         */
-        canvas:         null,
-
-        //TODO: not sure how to best describe these
-        overlays:       [],
-        overlayControls:[],
-
-        //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:         null,
-        /**
-         * Handles rendering of tiles in the viewer. Created for each TileSource opened.
-         * @member {OpenSeadragon.Drawer} drawer
-         * @memberof OpenSeadragon.Viewer#
-         */
-        drawer:         null,
-        drawers:        [],
-        /**
-         * 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
-        buttons:        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,
-        "mouseInside":       false,
-        "group":             null,
-        // whether we should be continuously zooming
-        "zooming":           false,
-        // how much we should be continuously zooming by
-        "zoomFactor":        null,
-        "lastZoomTime":      null,
-        // did we decide this viewer has a sequence of tile sources
-        "sequenced":         false,
-        "sequence":          0,
-        "fullPage":          false,
-        "onfullscreenchange": null
-    };
-
-    this._updateRequestId = null;
-
-    //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
-    var initialTileSource;
-
-    if ( this.xmlPath  ){
-        //Deprecated option.  Now it is preferred to use the tileSources option
-        this.tileSources = [ this.xmlPath ];
-    }
-
-    if ( this.tileSources  ){
-        // tileSources is a complex option...
-        //
-        // It can be a string, object, or an array of any of strings and objects.
-        // At this point we only care about if it is an Array or not.
-        //
-        if( $.isArray( this.tileSources ) ){
-
-            //must be a sequence of tileSource since the first item
-            //is a legacy tile source
-            if( this.tileSources.length > 1 ){
-                THIS[ this.hash ].sequenced = true;
-            }
-            
-            //Keeps the initial page within bounds
-            if ( this.initialPage > this.tileSources.length - 1 ){
-                this.initialPage = this.tileSources.length - 1;
-            }
-            
-            initialTileSource = this.tileSources[ this.initialPage ];
-            
-            //Update the sequence (aka currrent page) property
-            THIS[ this.hash ].sequence = this.initialPage;
-        } else {
-            initialTileSource = this.tileSources;
-        }
-    }
-
-    this.element              = this.element || document.getElementById( this.id );
-    this.canvas               = $.makeNeutralElement( "div" );
-    this.keyboardCommandArea  = $.makeNeutralElement( "textarea" );
-
-    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 ));
-
-    //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 ));
-
-    this.keyboardCommandArea.className = "keyboard-command-area";
-    (function( style ){
-        style.width    = "100%";
-        style.height   = "100%";
-        style.overflow = "hidden";
-        style.position = "absolute";
-        style.top      = "0px";
-        style.left     = "0px";
-        style.resize   = "none";
-    }(  this.keyboardCommandArea.style ));
-
-    this.container.insertBefore( this.canvas, this.container.firstChild );
-    this.container.insertBefore( this.keyboardCommandArea, 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.keyboardCommandArea.innerTracker = new $.MouseTracker({
-            _this : this,
-            element:            this.keyboardCommandArea,
-            focusHandler:       function( event ){
-                if ( !event.preventDefaultAction ) {
-                    var point    = $.getElementPosition( this.element );
-                    window.scrollTo( 0, point.y );
-                }
-            },
-
-            keyHandler:         function( event ){
-                if ( !event.preventDefaultAction ) {
-                    switch( event.keyCode ){
-                        case 61://=|+
-                            _this.viewport.zoomBy(1.1);
-                            _this.viewport.applyConstraints();
-                            return false;
-                        case 45://-|_
-                            _this.viewport.zoomBy(0.9);
-                            _this.viewport.applyConstraints();
-                            return false;
-                        case 48://0|)
-                            _this.viewport.goHome();
-                            _this.viewport.applyConstraints();
-                            return false;
-                        case 119://w
-                        case 87://W
-                        case 38://up arrow
-                            if ( event.shift ) {
-                                _this.viewport.zoomBy(1.1);
-                            } else {
-                                _this.viewport.panBy(new $.Point(0, -0.05));
-                            }
-                            _this.viewport.applyConstraints();
-                            return false;
-                        case 115://s
-                        case 83://S
-                        case 40://down arrow
-                            if ( event.shift ) {
-                                _this.viewport.zoomBy(0.9);
-                            } else {
-                                _this.viewport.panBy(new $.Point(0, 0.05));
-                            }
-                            _this.viewport.applyConstraints();
-                            return false;
-                        case 97://a
-                        case 37://left arrow
-                            _this.viewport.panBy(new $.Point(-0.05, 0));
-                            _this.viewport.applyConstraints();
-                            return false;
-                        case 100://d
-                        case 39://right arrow
-                            _this.viewport.panBy(new $.Point(0.05, 0));
-                            _this.viewport.applyConstraints();
-                            return false;
-                        default:
-                            //console.log( 'navigator keycode %s', event.keyCode );
-                            return true;
-                    }
-                }
-            }
-        }).setTracking( true ); // default state
-
-
-    this.innerTracker = new $.MouseTracker({
-        element:            this.canvas,
-        clickTimeThreshold: this.clickTimeThreshold,
-        clickDistThreshold: this.clickDistThreshold,
-        clickHandler:       $.delegate( this, onCanvasClick ),
-        dragHandler:        $.delegate( this, onCanvasDrag ),
-        releaseHandler:     $.delegate( this, onCanvasRelease ),
-        scrollHandler:      $.delegate( this, onCanvasScroll )
-    }).setTracking( this.mouseNavEnabled ? true : false ); // default state
-
-    this.outerTracker = new $.MouseTracker({
-        element:            this.container,
-        clickTimeThreshold: this.clickTimeThreshold,
-        clickDistThreshold: this.clickDistThreshold,
-        enterHandler:       $.delegate( this, onContainerEnter ),
-        exitHandler:        $.delegate( this, onContainerExit ),
-        releaseHandler:     $.delegate( this, onContainerRelease )
-    }).setTracking( this.mouseNavEnabled ? true : false ); // always tracking
-
-    if( this.toolbar ){
-        this.toolbar = new $.ControlDock({ element: this.toolbar });
-    }
-
-    this.bindStandardControls();
-    this.bindSequenceControls();
-
-    if ( initialTileSource ) {
-        this.open( initialTileSource );
-
-        if ( this.tileSources.length > 1 ) {
-            this._updateSequenceButtons( this.initialPage );
-        }
-    }
-
-    for ( i = 0; i < this.customControls.length; i++ ) {
-        this.addControl(
-            this.customControls[ i ].id,
-            {anchor: this.customControls[ i ].anchor}
-        );
-    }
-
-    $.requestAnimationFrame( function(){
-        beginControlsAutoHide( _this );
-    } );    // initial fade out
-
-};
-
-$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{
-
-
-    /**
-     * @function
-     * @return {Boolean}
-     */
-    isOpen: function () {
-        return !!this.source;
-    },
-
-    /**
-     * A deprecated function, renamed to 'open' to match event name and
-     * match current 'close' method.
-     * @function
-     * @param {String} dzi xml string or the url to a DZI xml document.
-     * @return {OpenSeadragon.Viewer} Chainable.
-     *
-     * @deprecated - use {@link OpenSeadragon.Viewer#open} instead.
-     */
-    openDzi: function ( dzi ) {
-        return this.open( dzi );
-    },
-
-    /**
-     * A deprecated function, renamed to 'open' to match event name and
-     * match current 'close' method.
-     * @function
-     * @param {String|Object|Function} See OpenSeadragon.Viewer.prototype.open
-     * @return {OpenSeadragon.Viewer} Chainable.
-     *
-     * @deprecated - use {@link OpenSeadragon.Viewer#open} instead.
-     */
-    openTileSource: function ( tileSource ) {
-        return this.open( tileSource );
-    },
-
-    /**
-     * Open a TileSource object into the viewer.
-     *
-     * tileSources is a complex option...
-     *
-     * It can be a string, object, function, or an array of any of these:
-     *
-     * - 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.
-     * @function
-     * @param {String|Object|Function}
-     * @return {OpenSeadragon.Viewer} Chainable.
-     * @fires OpenSeadragon.Viewer.event:open
-     * @fires OpenSeadragon.Viewer.event:open-failed
-     */
-    open: function ( tileSource ) {
-        var _this = this,
-            customTileSource,
-            readySource,
-            $TileSource,
-            options;
-
-        _this._hideMessage();
-
-        //allow plain xml strings or json strings to be parsed here
-        if( $.type( tileSource ) == 'string' ){
-            if( tileSource.match(/\s*<.*/) ){
-                tileSource = $.parseXml( tileSource );
-            }else if( tileSource.match(/\s*[\{\[].*/) ){
-                /*jshint evil:true*/
-                tileSource = eval( '('+tileSource+')' );
-            }
-        }
-
-        setTimeout(function(){
-            if ( $.type( tileSource ) == 'string') {
-                //If its still a string it means it must be a url at this point
-                tileSource = new $.TileSource( tileSource, function( event ){
-                    openTileSource( _this, event.tileSource );
-                });
-                tileSource.addHandler( 'open-failed', function ( event ) {
-                    /**
-                     * 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
-                     * @property {String} source
-                     * @property {?Object} userData - Arbitrary subscriber-defined object.
-                     */
-                    _this.raiseEvent( 'open-failed', event );
-                });
-
-            } else if ( $.isPlainObject( tileSource ) || tileSource.nodeType ){
-                if( $.isFunction( tileSource.getTileUrl ) ){
-                    //Custom tile source
-                    customTileSource = new $.TileSource(tileSource);
-                    customTileSource.getTileUrl = tileSource.getTileUrl;
-                    openTileSource( _this, customTileSource );
-                } else {
-                    //inline configuration
-                    $TileSource = $.TileSource.determineType( _this, tileSource );
-                    if ( !$TileSource ) {
-                        /***
-                         * 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
-                         * @property {String} source
-                         * @property {?Object} userData - Arbitrary subscriber-defined object.
-                         */
-                        _this.raiseEvent( 'open-failed', {
-                            message: "Unable to load TileSource",
-                            source: tileSource
-                        });
-                        return;
-                    }
-                    options = $TileSource.prototype.configure.apply( _this, [ tileSource ]);
-                    readySource = new $TileSource( options );
-                    openTileSource( _this, readySource );
-                }
-            } else {
-                //can assume it's already a tile source implementation
-                openTileSource( _this, tileSource );
-            }
-        }, 1);
-
-        return this;
-    },
-
-
-    /**
-     * @function
-     * @return {OpenSeadragon.Viewer} Chainable.
-     * @fires OpenSeadragon.Viewer.event:close
-     */
-    close: function ( ) {
-        if ( this._updateRequestId !== null ) {
-            $.cancelAnimationFrame( this._updateRequestId );
-            this._updateRequestId = null;
-        }
-
-        if ( this.navigator ) {
-            this.navigator.close();
-        }
-
-        if ( this.drawer ) {
-            this.drawer.clearOverlays();
-        }
-
-        this.source     = null;
-        this.drawer     = null;
-
-        this.viewport   = this.preserveViewport ? this.viewport : null;
-        //this.profiler   = null;
-        if (this.canvas){
-            this.canvas.innerHTML = "";
-        }
-
-        VIEWERS[ this.hash ] = null;
-        delete VIEWERS[ this.hash ];
-
-        /**
-         * 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.
-     * @function
-     */
-    destroy: function( ) {
-        this.close();
-
-        this.removeAllHandlers();
-
-        // 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);
-            }
-        }
-
-        // destroy the mouse trackers
-        if (this.keyboardCommandArea){
-            this.keyboardCommandArea.innerTracker.destroy();
-        }
-        if (this.innerTracker){
-            this.innerTracker.destroy();
-        }
-        if (this.outerTracker){
-            this.outerTracker.destroy();
-        }
-
-        // clear all our references to dom objects
-        this.canvas = null;
-        this.keyboardCommandArea = null;
-        this.container = null;
-
-        // clear our reference to the main element - they will need to pass it in again, creating a new viewer
-        this.element = null;
-    },
-
-
-    /**
-     * @function
-     * @return {Boolean}
-     */
-    isMouseNavEnabled: function () {
-        return this.innerTracker.isTracking();
-    },
-
-    /**
-     * @function
-     * @param {Boolean} enabled - true to enable, false to disable
-     * @return {OpenSeadragon.Viewer} Chainable.
-     * @fires OpenSeadragon.Viewer.event:mouse-enabled
-     */
-    setMouseNavEnabled: function( enabled ){
-        this.innerTracker.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
-     * @return {Boolean}
-     */
-    areControlsEnabled: function () {
-        var enabled = this.controls.length,
-            i;
-        for( i = 0; i < this.controls.length; i++ ){
-            enabled = enabled && this.controls[ i ].isVisibile();
-        }
-        return enabled;
-    },
-
-
-    /**
-     * Shows or hides the controls (e.g. the default navigation buttons).
-     *
-     * @function
-     * @param {Boolean} true to show, false to hide.
-     * @return {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;
-    },
-
-
-    /**
-     * @function
-     * @return {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.
-     * @return {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,
-            hash,
-            nodes,
-            i;
-
-        //dont 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.bodyHeight = bodyStyle.height;
-            bodyStyle.width = "100%";
-            bodyStyle.height = "100%";
-
-            //when entering full screen on the ipad it wasnt 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 = $.getWindowSize().y + 'px';
-            this.element.style.width = $.getWindowSize().x + 'px';
-
-            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;
-            bodyStyle.height = this.bodyHeight;
-
-            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, onContainerExit )( { } );
-
-        }
-
-        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.
-     * @return {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}).
-         *
-         * @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 ) {
-                    _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 {
-            $.cancelFullScreen();
-        }
-        return this;
-    },
-
-    /**
-     * @function
-     * @return {Boolean}
-     */
-    isVisible: function () {
-        return this.container.style.visibility != "hidden";
-    },
-
-
-    /**
-     * @function
-     * @param {Boolean} visible
-     * @return {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;
-    },
-
-
-    /**
-     * @function
-     * @return {OpenSeadragon.Viewer} Chainable.
-     */
-    bindSequenceControls: function(){
-
-        //////////////////////////////////////////////////////////////////////////
-        // Image Sequence Controls
-        //////////////////////////////////////////////////////////////////////////
-        var onFocusHandler          = $.delegate( this, onFocus ),
-            onBlurHandler           = $.delegate( this, onBlur ),
-            onNextHandler           = $.delegate( this, onNext ),
-            onPreviousHandler       = $.delegate( this, onPrevious ),
-            navImages               = this.navImages,
-            useGroup                = true ;
-
-        if( this.showSequenceControl && THIS[ this.hash ].sequenced ){
-
-            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( 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
-     * @return {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 ),
-            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 ){
-                //if we are binding to custom buttons then layout and
-                //grouping is the responsibility of the page author
-                useGroup = false;
-            }
-
-            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
-            }));
-
-            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
-            }));
-
-            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.rotateLeft = 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.rotateRight = 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( useGroup ){
-                this.buttons = new $.ButtonGroup({
-                    buttons:            buttons,
-                    clickTimeThreshold: this.clickTimeThreshold,
-                    clickDistThreshold: this.clickDistThreshold
-                });
-
-                this.navControl  = this.buttons.element;
-                this.addHandler( 'open', $.delegate( this, lightUp ) );
-
-                if( this.toolbar ){
-                    this.toolbar.addControl(
-                        this.navControl,
-                        {anchor: $.ControlAnchor.TOP_LEFT}
-                    );
-                }else{
-                    this.addControl(
-                        this.navControl,
-                        {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT}
-                    );
-                }
-            }
-
-        }
-        return this;
-    },
-    
-    /**
-     * Gets the active page of a sequence
-     * @function
-     * @return {Number}
-     */
-    currentPage: function () {
-        return THIS[ this.hash ].sequence;
-      },
-
-    /**
-     * @function
-     * @return {OpenSeadragon.Viewer} Chainable.
-     * @fires OpenSeadragon.Viewer.event:page
-     */
-    goToPage: function( page ){
-        if( page >= 0 && page < this.tileSources.length ){
-            /**
-             * 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 } );
-
-            THIS[ this.hash ].sequence = page;
-
-            this._updateSequenceButtons( page );
-
-            this.open( this.tileSources[ page ] );
-
-            if( this.referenceStrip ){
-                this.referenceStrip.setFocus( page );
-            }
-        }
-
-        return this;
-    },
-
-    /**
-     * Updates the sequence buttons.
-     * @function OpenSeadragon.Viewer.prototype._updateSequenceButtons
-     * @private
-     * @param {Number} Sequence Value
-     */
-    _updateSequenceButtons: function (page) {
-
-            if( this.nextButton ){
-                if( ( 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;
-        }
-    }
-});
-
-
-/**
- * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y,
- * which was causing some calling operations in updateOnce and openTileSource 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 openTileSource( viewer, source ) {
-    var _this = viewer,
-        overlay,
-        i;
-
-    if ( _this.source ) {
-        _this.close( );
-    }
-
-    _this.canvas.innerHTML = "";
-    THIS[ _this.hash ].prevContainerSize = _getSafeElemSize( _this.container );
-
-
-    if( _this.collectionMode ){
-        _this.source = new $.TileSourceCollection({
-            rows: _this.collectionRows,
-            layout: _this.collectionLayout,
-            tileSize: _this.collectionTileSize,
-            tileSources: _this.tileSources,
-            tileMargin: _this.collectionTileMargin
-        });
-        _this.viewport = _this.viewport ? _this.viewport : new $.Viewport({
-            collectionMode:         true,
-            collectionTileSource:   _this.source,
-            containerSize:          THIS[ _this.hash ].prevContainerSize,
-            contentSize:            _this.source.dimensions,
-            springStiffness:        _this.springStiffness,
-            animationTime:          _this.animationTime,
-            showNavigator:          false,
-            minZoomImageRatio:      1,
-            maxZoomPixelRatio:      1,
-            viewer:                 _this,
-            degrees:                 _this.degrees //,
-            //TODO: figure out how to support these in a way that makes sense
-            //minZoomLevel:           this.minZoomLevel,
-            //maxZoomLevel:           this.maxZoomLevel
-        });
-    }else{
-        if( source ){
-            _this.source = source;
-        }
-        _this.viewport = _this.viewport ? _this.viewport : new $.Viewport({
-            containerSize:      THIS[ _this.hash ].prevContainerSize,
-            contentSize:        _this.source.dimensions,
-            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
-        });
-    }
-
-    if( _this.preserveViewport ){
-        _this.viewport.resetContentSize( _this.source.dimensions );
-    }
-
-    _this.source.overlays = _this.source.overlays || [];
-
-    _this.drawer = new $.Drawer({
-        viewer:             _this,
-        source:             _this.source,
-        viewport:           _this.viewport,
-        element:            _this.canvas,
-        overlays:           [].concat( _this.overlays ).concat( _this.source.overlays ),
-        maxImageCacheCount: _this.maxImageCacheCount,
-        imageLoaderLimit:   _this.imageLoaderLimit,
-        minZoomImageRatio:  _this.minZoomImageRatio,
-        wrapHorizontal:     _this.wrapHorizontal,
-        wrapVertical:       _this.wrapVertical,
-        immediateRender:    _this.immediateRender,
-        blendTime:          _this.blendTime,
-        alwaysBlend:        _this.alwaysBlend,
-        minPixelRatio:      _this.collectionMode ? 0 : _this.minPixelRatio,
-        timeout:            _this.timeout,
-        debugMode:          _this.debugMode,
-        debugGridColor:     _this.debugGridColor
-    });
-
-    // 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.buttons.buttons.indexOf(_this.rotateLeft);
-            _this.buttons.buttons.splice(i, 1);
-            _this.buttons.element.removeChild(_this.rotateLeft.element);
-        }
-        if (_this.rotateRight) {
-            i = _this.buttons.buttons.indexOf(_this.rotateRight);
-            _this.buttons.buttons.splice(i, 1);
-            _this.buttons.element.removeChild(_this.rotateRight.element);
-        }
-    }
-
-    //Instantiate a navigator if configured
-    if ( _this.showNavigator  && !_this.collectionMode ){
-        // Note: By passing the fully parsed source, the navigator doesn't
-        // have to load it again.
-        if ( _this.navigator ) {
-            _this.navigator.open( source );
-        } else {
-            _this.navigator = new $.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,
-                tileSources:       source,
-                tileHost:          _this.tileHost,
-                prefixUrl:         _this.prefixUrl,
-                overlays:          _this.overlays,
-                viewer:            _this
-            });
-        }
-    }
-
-    //Instantiate a referencestrip if configured
-    if ( _this.showReferenceStrip  && !_this.referenceStrip ){
-        _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,
-            tileHost:    _this.tileHost,
-            prefixUrl:   _this.prefixUrl,
-            overlays:    _this.overlays,
-            viewer:      _this
-        });
-    }
-
-    //this.profiler = new $.Profiler();
-
-    THIS[ _this.hash ].animating = false;
-    THIS[ _this.hash ].forceRedraw = true;
-    _this._updateRequestId = scheduleUpdate( _this, updateMulti );
-
-    //Assuming you had programatically created a bunch of overlays
-    //and added them via configuration
-    for ( i = 0; i < _this.overlayControls.length; i++ ) {
-
-        overlay = _this.overlayControls[ i ];
-
-        if ( overlay.point ) {
-
-            _this.drawer.addOverlay(
-                overlay.id,
-                new $.Point(
-                    overlay.point.X,
-                    overlay.point.Y
-                ),
-                $.OverlayPlacement.TOP_LEFT
-            );
-
-        } else {
-
-            _this.drawer.addOverlay(
-                overlay.id,
-                new $.Rect(
-                    overlay.rect.Point.X,
-                    overlay.rect.Point.Y,
-                    overlay.rect.Width,
-                    overlay.rect.Height
-                ),
-                overlay.placement
-            );
-
-        }
-    }
-    VIEWERS[ _this.hash ] = _this;
-
-    /**
-     * 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
-     * @property {?Object} userData - Arbitrary subscriber-defined object.
-     */
-    _this.raiseEvent( 'open', { source: source } );
-
-    return _this;
-}
-
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-// 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 onCanvasClick( event ) {
-    var zoomPerClick,
-        factor;
-    if ( !event.preventDefaultAction && this.viewport && event.quick ) {    // ignore clicks where mouse moved
-        zoomPerClick = this.zoomPerClick;
-        factor = event.shift ? 1.0 / zoomPerClick : zoomPerClick;
-        this.viewport.zoomBy(
-            factor,
-            this.viewport.pointFromPixel( event.position, true )
-        );
-        this.viewport.applyConstraints();
-    }
-    /**
-     * 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 clickDeltaThreshold 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.
-     */
-    this.raiseEvent( 'canvas-click', {
-        tracker: event.eventSource,
-        position: event.position,
-        quick: event.quick,
-        shift: event.shift,
-        originalEvent: event.originalEvent
-    });
-}
-
-function onCanvasDrag( event ) {
-    if ( !event.preventDefaultAction && this.viewport ) {
-        if( !this.panHorizontal ){
-            event.delta.x = 0;
-        }
-        if( !this.panVertical ){
-            event.delta.y = 0;
-        }
-        this.viewport.panBy(
-            this.viewport.deltaPointsFromPixels(
-                event.delta.negate()
-            )
-        );
-        if( this.constrainDuringPan ){
-            this.viewport.applyConstraints();
-        }
-    }
-    /**
-     * 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 {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 {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.
-     */
-    this.raiseEvent( 'canvas-drag', {
-        tracker: event.eventSource,
-        position: event.position,
-        delta: event.delta,
-        shift: event.shift,
-        originalEvent: event.originalEvent
-    });
-}
-
-function onCanvasRelease( event ) {
-    if ( event.insideElementPressed && this.viewport ) {
-        this.viewport.applyConstraints();
-    }
-    /**
-     * Raised when the 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 {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,
-        position: event.position,
-        insideElementPressed: event.insideElementPressed,
-        insideElementReleased: event.insideElementReleased,
-        originalEvent: event.originalEvent
-    });
-}
-
-function onCanvasScroll( event ) {
-    var factor;
-    if ( !event.preventDefaultAction && this.viewport ) {
-        factor = Math.pow( this.zoomPerScroll, event.scroll );
-        this.viewport.zoomBy(
-            factor,
-            this.viewport.pointFromPixel( event.position, true )
-        );
-        this.viewport.applyConstraints();
-    }
-    /**
-     * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#canvas} element (mouse wheel, touch pinch, etc.).
-     *
-     * @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 {?Object} userData - Arbitrary subscriber-defined object.
-     */
-    this.raiseEvent( 'canvas-scroll', {
-        tracker: event.eventSource,
-        position: event.position,
-        scroll: event.scroll,
-        shift: event.shift,
-        originalEvent: event.originalEvent
-    });
-    //cancels event
-    return false;
-}
-
-function onContainerExit( event ) {
-    if ( !event.insideElementPressed ) {
-        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 {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} buttonDownAny - Was the button down anywhere in the screen during the event.
-     * @property {Object} originalEvent - The original DOM event.
-     * @property {?Object} userData - Arbitrary subscriber-defined object.
-     */
-    this.raiseEvent( 'container-exit', {
-        tracker: event.eventSource,
-        position: event.position,
-        insideElementPressed: event.insideElementPressed,
-        buttonDownAny: event.buttonDownAny,
-        originalEvent: event.originalEvent
-    });
-}
-
-function onContainerRelease( event ) {
-    if ( !event.insideElementReleased ) {
-        THIS[ this.hash ].mouseInside = false;
-        if ( !THIS[ this.hash ].animating ) {
-            beginControlsAutoHide( this );
-        }
-    }
-    /**
-     * Raised when the mouse button is released or touch ends on the {@link OpenSeadragon.Viewer#container} element.
-     *
-     * @event container-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 {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( 'container-release', {
-        tracker: event.eventSource,
-        position: event.position,
-        insideElementPressed: event.insideElementPressed,
-        insideElementReleased: event.insideElementReleased,
-        originalEvent: event.originalEvent
-    });
-}
-
-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 {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} buttonDownAny - Was the button down anywhere in the screen during the event.
-     * @property {Object} originalEvent - The original DOM event.
-     * @property {?Object} userData - Arbitrary subscriber-defined object.
-     */
-    this.raiseEvent( 'container-enter', {
-        tracker: event.eventSource,
-        position: event.position,
-        insideElementPressed: event.insideElementPressed,
-        buttonDownAny: event.buttonDownAny,
-        originalEvent: event.originalEvent
-    });
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Page update routines ( aka Views - for future reference )
-///////////////////////////////////////////////////////////////////////////////
-
-function updateMulti( viewer ) {
-    if ( !viewer.source ) {
-        viewer._updateRequestId = null;
-        return;
-    }
-
-    updateOnce( viewer );
-
-    // Request the next frame, unless we've been closed during the updateOnce()
-    if ( viewer.source ) {
-        viewer._updateRequestId = scheduleUpdate( viewer, updateMulti );
-    }
-}
-
-function updateOnce( viewer ) {
-
-    var containerSize,
-        animated;
-
-    if ( !viewer.source ) {
-        return;
-    }
-
-    //viewer.profiler.beginUpdate();
-
-    if ( viewer.autoResize ) {
-        containerSize = _getSafeElemSize( viewer.container );
-        if ( !containerSize.equals( THIS[ viewer.hash ].prevContainerSize ) ) {
-            // maintain image position
-            var oldBounds = viewer.viewport.getBounds();
-            var oldCenter = viewer.viewport.getCenter();
-            resizeViewportAndRecenter(viewer, containerSize, oldBounds, oldCenter);
-            THIS[ viewer.hash ].prevContainerSize = containerSize;
-            THIS[ viewer.hash ].forceRedraw = true;
-        }
-    }
-
-    animated = viewer.viewport.update();
-
-    if( viewer.referenceStrip ){
-        animated = viewer.referenceStrip.update( viewer.viewport ) || animated;
-    }
-
-    if ( !THIS[ viewer.hash ].animating && 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 );
-    }
-
-    if ( animated ) {
-        viewer.drawer.update();
-        if( viewer.navigator ){
-            viewer.navigator.update( viewer.viewport );
-        }
-        /**
-         * Raised when any spring animation update occurs (zoom, pan, etc.).
-         *
-         * @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" );
-    } else if ( THIS[ viewer.hash ].forceRedraw || viewer.drawer.needsUpdate() ) {
-        viewer.drawer.update();
-        if( viewer.navigator ){
-            viewer.navigator.update( viewer.viewport );
-        }
-        THIS[ viewer.hash ].forceRedraw = false;
-    }
-
-    if ( THIS[ viewer.hash ].animating && !animated ) {
-        /**
-         * 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();
-}
-
-// This function resizes the viewport and recenters the image
-// as it was before resizing.
-// TODO: better adjust width and height. The new width and height
-// should depend on the image dimensions and on the dimensions
-// of the viewport before and after switching mode.
-function resizeViewportAndRecenter( viewer, containerSize, oldBounds, oldCenter ) {
-    var viewport = viewer.viewport;
-
-    viewport.resize( containerSize, true );
-
-    // We try to remove blanks as much as possible
-    var imageHeight = 1 / viewer.source.aspectRatio;
-    var newWidth = oldBounds.width <= 1 ? oldBounds.width : 1;
-    var newHeight = oldBounds.height <= imageHeight ?
-        oldBounds.height : imageHeight;
-
-    var newBounds = new $.Rect(
-        oldCenter.x - ( newWidth / 2.0 ),
-        oldCenter.y - ( newHeight / 2.0 ),
-        newWidth,
-        newHeight
-        );
-    viewport.fitBounds( newBounds, true );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// 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() {
-    this.buttons.emulateEnter();
-    this.buttons.emulateExit();
-}
-
-
-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.buttons ) {
-        this.buttons.emulateExit();
-    }
-    this.fullPageButton.element.focus();
-    if ( this.viewport ) {
-        this.viewport.applyConstraints();
-    }
-}
-
-/**
- * Note: The current rotation feature is limited to 90 degree turns.
- */
-function onRotateLeft() {
-    if ( this.viewport ) {
-        var currRotation = this.viewport.getRotation();
-        if (currRotation === 0) {
-            currRotation = 270;
-        }
-        else {
-            currRotation -= 90;
-        }
-        this.viewport.setRotation(currRotation);
-    }
-}
-
-/**
- * Note: The current rotation feature is limited to 90 degree turns.
- */
-function onRotateRight() {
-    if ( this.viewport ) {
-        var currRotation = this.viewport.getRotation();
-        if (currRotation === 270) {
-            currRotation = 0;
-        }
-        else {
-            currRotation += 90;
-        }
-        this.viewport.setRotation(currRotation);
-    }
-}
-
-
-function onPrevious(){
-    var previous = THIS[ this.hash ].sequence - 1;
-    if(this.navPrevNextWrap && previous < 0){
-        previous += this.tileSources.length;
-    }
-    this.goToPage( previous );
-}
-
-
-function onNext(){
-    var next = THIS[ this.hash ].sequence + 1;
-    if(this.navPrevNextWrap && next >= this.tileSources.length){
-        next = 0;
-    }
-    this.goToPage( next );
-}
-
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Navigator
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 = function( options ){
-
-    var viewer      = options.viewer,
-        viewerSize,
-        navigatorSize,
-        unneededElement;
-
-    //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              = 'navigator-' + $.now();
-        this.element            = $.makeNeutralElement( "div" );
-        options.controlOptions  = {
-            anchor:           $.ControlAnchor.TOP_RIGHT,
-            attachToViewer:   true,
-            autoFade:         true
-        };
-
-        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;
-            }
-        }
-        
-    } else {
-        this.element            = document.getElementById( options.id );
-        options.controlOptions  = {
-            anchor:           $.ControlAnchor.NONE,
-            attachToViewer:   false,
-            autoFade:         false
-        };
-    }
-    this.element.id         = options.id;
-    this.element.className  += ' navigator';
-
-    options = $.extend( true, {
-        sizeRatio:     $.DEFAULT_SETTINGS.navigatorSizeRatio
-    }, options, {
-        element:                this.element,
-        //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:          0,
-        autoResize:             options.autoResize
-    });
-
-    options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;
-
-    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 #555';
-            style.padding       = '0px';
-            style.background    = '#000';
-            style.opacity       = 0.8;
-            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 #900';
-        style.margin        = '0px';
-        style.padding       = '0px';
-        //TODO: IE doesnt 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';
-    }( this.displayRegion.style, this.borderWidth ));
-
-
-    this.element.innerTracker = new $.MouseTracker({
-        element:         this.element,
-        dragHandler:     $.delegate( this, onCanvasDrag ),
-        clickHandler:    $.delegate( this, onCanvasClick ),
-        releaseHandler:  $.delegate( this, onCanvasRelease ),
-        scrollHandler:   $.delegate( this, onCanvasScroll )
-    }).setTracking( true );
-
-    /*this.displayRegion.outerTracker = new $.MouseTracker({
-        element:            this.container,
-        clickTimeThreshold: this.clickTimeThreshold,
-        clickDistThreshold: this.clickDistThreshold,
-        enterHandler:       $.delegate( this, onContainerEnter ),
-        exitHandler:        $.delegate( this, onContainerExit ),
-        releaseHandler:     $.delegate( this, onContainerRelease )
-    }).setTracking( this.mouseNavEnabled ? true : false ); // always tracking*/
-
-
-    viewer.addControl(
-        this.element,
-        options.controlOptions
-    );
-
-    if ( options.controlOptions.anchor != $.ControlAnchor.ABSOLUTE && options.controlOptions.anchor != $.ControlAnchor.NONE ) {
-        if ( options.width && options.height ) {
-            this.element.style.height = typeof ( options.height )  == "number" ? ( options.height + 'px' ) : options.height;
-            this.element.style.width  = typeof ( options.width )  == "number" ? ( options.width + 'px' ) : options.width;
-        } else {
-            viewerSize = $.getElementSize( viewer.element );
-            this.element.style.height = ( viewerSize.y * options.sizeRatio ) + 'px';
-            this.element.style.width  = ( 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.element.getElementsByTagName('form')[0].appendChild( this.displayRegion );
-    unneededElement = this.element.getElementsByTagName('textarea')[0];
-    if (unneededElement) {
-        unneededElement.parentNode.removeChild(unneededElement);
-    }
-
-};
-
-$.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 ) ) {
-                var oldBounds = this.viewport.getBounds();
-                var oldCenter = this.viewport.getCenter();
-                this.viewport.resize( containerSize, true );
-                var imageHeight = 1 / this.source.aspectRatio;
-                var newWidth = oldBounds.width <= 1 ? oldBounds.width : 1;
-                var newHeight = oldBounds.height <= imageHeight ?
-                    oldBounds.height : imageHeight;
-                var newBounds = new $.Rect(
-                    oldCenter.x - ( newWidth / 2.0 ),
-                    oldCenter.y - ( newHeight / 2.0 ),
-                    newWidth,
-                    newHeight
-                    );
-                this.viewport.fitBounds( newBounds, true );
-                this.oldContainerSize = containerSize;
-                this.drawer.update();
-            }
-        }
-    },
-
-    /**
-     * 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 ( !viewerSize.equals( this.oldViewerSize ) ) {
-            this.oldViewerSize = viewerSize;
-            if ( this.maintainSizeRatio ) {
-                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  = newWidth + 'px';
-            this.element.style.height = newHeight + 'px';
-            this.updateSize();
-        }
-
-        if( viewport && this.viewport ) {
-            bounds      = viewport.getBounds( true );
-            topleft     = this.viewport.pixelFromPoint( bounds.getTopLeft(), false );
-            bottomright = this.viewport.pixelFromPoint( bounds.getBottomRight(), false ).minus( this.totalBorderWidths );
-
-            //update style for navigator-box
-            (function(style) {
-
-                style.top    = topleft.y + 'px';
-                style.left   = topleft.x + 'px';
-
-                var width = Math.abs( topleft.x - bottomright.x );
-                var height = Math.abs( topleft.y - bottomright.y );
-                // make sure width and height are non-negative so IE doesn't throw
-                style.width  = Math.max( width, 0 ) + 'px';
-                style.height = Math.max( height, 0 ) + 'px';
-
-            }( this.displayRegion.style ));
-        }
-
-    },
-
-    open: function( source ) {
-        this.updateSize();
-        var containerSize = this.viewer.viewport.containerSize.times( this.sizeRatio );
-        if( source.tileSize > containerSize.x ||
-            source.tileSize > containerSize.y ){
-            this.minPixelRatio = Math.min(
-                containerSize.x,
-                containerSize.y
-            ) / source.tileSize;
-        } else {
-            this.minPixelRatio = this.viewer.minPixelRatio;
-        }
-        return $.Viewer.prototype.open.apply( this, [ source ] );
-    }
-
-});
-
-/**
- * @private
- * @inner
- * @function
- */
-function onCanvasClick( event ) {
-    var newBounds,
-        viewerPosition,
-        dimensions;
-    if (! this.drag) {
-        if ( this.viewer.viewport ) {
-            this.viewer.viewport.panTo( this.viewport.pointFromPixel( event.position ) );
-            this.viewer.viewport.applyConstraints();
-        }
-    }
-    else {
-        this.drag = false;
-    }
-}
-
-/**
- * @private
- * @inner
- * @function
- */
-function onCanvasDrag( event ) {
-    if ( this.viewer.viewport ) {
-        this.drag = true;
-        if( !this.panHorizontal ){
-            event.delta.x = 0;
-        }
-        if( !this.panVertical ){
-            event.delta.y = 0;
-        }
-        this.viewer.viewport.panBy(
-            this.viewport.deltaPointsFromPixels(
-                event.delta
-            )
-        );
-    }
-}
-
-
-/**
- * @private
- * @inner
- * @function
- */
-function onCanvasRelease( event ) {
-    if ( event.insideElementPressed && this.viewer.viewport ) {
-        this.viewer.viewport.applyConstraints();
-    }
-}
-
-
-/**
- * @private
- * @inner
- * @function
- */
-function onCanvasScroll( event ) {
-    /**
-     * 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 {?Object} userData - Arbitrary subscriber-defined object.
-     */
-    this.viewer.raiseEvent( 'navigator-scroll', {
-        tracker: event.eventSource,
-        position: event.position,
-        scroll: event.scroll,
-        shift: event.shift,
-        originalEvent: event.originalEvent
-    });
-
-    //dont scroll the page up and down if the user is scrolling
-    //in the navigator
-    return false;
-}
-
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - getString/setString
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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"
-    }
-};
-
-$.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.debug( "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-2013 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;
-};
-
-$.Point.prototype = /** @lends OpenSeadragon.Point.prototype */{
-
-    /**
-     * 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
-        );
-    },
-
-    /**
-     * 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
-     */
-    minus: function( point ) {
-        return new $.Point(
-            this.x - point.x,
-            this.y - point.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
-     */
-    times: function( factor ) {
-        return new $.Point(
-            this.x * factor,
-            this.y * factor
-        );
-    },
-
-    /**
-     * 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
-     */
-    divide: function( factor ) {
-        return new $.Point(
-            this.x / factor,
-            this.y / factor
-        );
-    },
-
-    /**
-     * 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
-     */
-    negate: 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
-     */
-    distanceTo: function( point ) {
-        return Math.sqrt(
-            Math.pow( this.x - point.x, 2 ) +
-            Math.pow( this.y - point.y, 2 )
-        );
-    },
-
-    /**
-     * 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
-     */
-    apply: function( func ) {
-        return new $.Point( func( this.x ), func( 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
-     */
-    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 Point about which to rotate.
-     * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot
-     */
-    rotate: function ( degrees, pivot ) {
-        var angle = degrees * Math.PI / 180.0,
-            x = Math.cos( angle ) * ( this.x - pivot.x ) - Math.sin( angle ) * ( this.y - pivot.y ) + pivot.x,
-            y = Math.sin( angle ) * ( this.x - pivot.x ) + Math.cos( angle ) * ( this.y - pivot.y ) + pivot.y;
-        return new $.Point( x, 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
-     */
-    toString: function() {
-        return "(" + Math.round(this.x) + "," + Math.round(this.y) + ")";
-    }
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - TileSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 layer in an image pyramid. It has only a single key
- * interface that must be implemented to complete it 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 retreival of a document on the network ala AJAX or JSONP,
- * ('getImageInfo').
- * <br/>
- * By default the image pyramid is split into N layers where the images longest
- * side in M (in pixels), where N is the smallest integer which satisfies
- *      <strong>2^(N+1) >= M</strong>.
- *
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.EventSource
- * @param {Number|Object|Array|String} width
- *      If more than a single argument is supplied, the traditional use of
- *      positional parameters is supplied and width is expected to be the width
- *      source image at its max resolution in pixels.  If a single argument is supplied and
- *      it is an Object or Array, the construction is assumed to occur through
- *      the extending classes implementation of 'configure'.  Finally if only a
- *      single argument is supplied and it is a String, the extending class is
- *      expected to implement 'getImageInfo' and 'configure'.
- * @param {Number} height
- *      Width of the source image at max resolution in pixels.
- * @param {Number} 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.
- * @param {Number} tileOverlap
- *      The number of pixels each tile is expected to overlap touching tiles.
- * @param {Number} minLevel
- *      The minimum level to attempt to load.
- * @param {Number} maxLevel
- *      The maximum level to attempt to load.
- */
-$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) {
-    var callback = null,
-        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 dont 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 );
-
-    //Any functions that are passed as arguments are bound to the ready callback
-    /*jshint loopfunc:true*/
-    for ( i = 0; i < arguments.length; i++ ) {
-        if ( $.isFunction( arguments[ i ] ) ) {
-            callback = arguments[ i ];
-            this.addHandler( 'ready', function ( event ) {
-                callback( event );
-            } );
-            //only one callback per constructor
-            break;
-        }
-    }
-
-    /**
-     * 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 size of the image tiles used to compose the image.
-     * @member {Number} tileSize
-     * @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 ] ) ){
-        //in case the getImageInfo method is overriden and/or implies an
-        //async mechanism set some safe defaults first
-        this.aspectRatio = 1;
-        this.dimensions  = new $.Point( 10, 10 );
-        this.tileSize    = 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( arguments[ 0 ] );
-
-    } 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 );
-        this.tileSize    = options.tileSize ? options.tileSize : 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( callback && $.isFunction( callback ) ){
-            callback( this );
-        }
-    }
-
-
-};
-
-
-$.TileSource.prototype = /** @lends OpenSeadragon.TileSource.prototype */{
-
-    /**
-     * @function
-     * @param {Number} level
-     */
-    getLevelScale: function( level ) {
-
-        // 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 ];
-        };
-        return this.getLevelScale( level );
-    },
-
-    /**
-     * @function
-     * @param {Number} level
-     */
-    getNumTiles: function( level ) {
-        var scale = this.getLevelScale( level ),
-            x = Math.ceil( scale * this.dimensions.x / this.tileSize ),
-            y = Math.ceil( scale * this.dimensions.y / this.tileSize );
-
-        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,
-            ry = 1.0 / imageSizeScaled.y;
-
-        return new $.Point(rx, ry);
-    },
-
-
-    /**
-     * @function
-     * @param {Number} level
-     */
-    getClosestLevel: function( rect ) {
-        var i,
-            tilesPerSide = Math.floor( Math.max( rect.x, rect.y ) / this.tileSize ),
-            tiles;
-        for( i = this.minLevel; i < this.maxLevel; i++ ){
-            tiles = this.getNumTiles( i );
-            if( Math.max( tiles.x, tiles.y ) + 1 >= tilesPerSide ){
-                break;
-            }
-        }
-        return Math.max( 0, i - 1 );
-    },
-
-    /**
-     * @function
-     * @param {Number} level
-     * @param {OpenSeadragon.Point} point
-     */
-    getTileAtPoint: function( level, point ) {
-        var pixel = point.times( this.dimensions.x ).times( this.getLevelScale(level ) ),
-            tx = Math.floor( pixel.x / this.tileSize ),
-            ty = Math.floor( pixel.y / this.tileSize );
-
-        return new $.Point( tx, ty );
-    },
-
-    /**
-     * @function
-     * @param {Number} level
-     * @param {Number} x
-     * @param {Number} y
-     */
-    getTileBounds: function( level, x, y ) {
-        var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ),
-            px = ( x === 0 ) ? 0 : this.tileSize * x - this.tileOverlap,
-            py = ( y === 0 ) ? 0 : this.tileSize * y - this.tileOverlap,
-            sx = this.tileSize + ( x === 0 ? 1 : 2 ) * this.tileOverlap,
-            sy = this.tileSize + ( 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 );
-
-        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 );
-            }
-        }
-
-        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 ]);
-            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, function( xhr ) {
-                var data = processResponse( xhr );
-                callback( data );
-            }, 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";
-                } catch ( e ) {
-                    var formattedExc;
-                    if ( typeof( exc ) == "undefined" || !exc.toString ) {
-                        formattedExc = "Unknown error";
-                    } else {
-                        formattedExc = exc.toString();
-                    }
-
-                    msg = formattedExc + " attempting to load 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: msg,
-                    source: url
-                });
-            });
-        }
-
-    },
-
-    /**
-     * 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.
-     * @return {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.
-     * @return {Object} options - A dictionary of keyword arguments sufficient
-     *      to configure this tile sources constructor.
-     * @throws {Error}
-     */
-    configure: function( data, url ) {
-        throw new Error( "Method not implemented." );
-    },
-
-    /**
-     * Responsible for retriving the url which will return an image for the
-     * region speified 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
-     * @throws {Error}
-     */
-    getTileUrl: function( level, x, y ) {
-        throw new Error( "Method not implemented." );
-    },
-
-    /**
-     * @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;
-    }
-};
-
-
-$.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*[\{\[].*/) ){
-        /*jshint evil:true*/
-        data = eval( '('+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 );
-};
-
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - DziTileSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 && "Image" == data.documentElement.tagName ) {
-            ns = data.documentElement.namespaceURI;
-        }
-
-        return ( "http://schemas.microsoft.com/deepzoom/2008" == ns ||
-            "http://schemas.microsoft.com/deepzoom/2009" == ns );
-    },
-
-    /**
-     *
-     * @function
-     * @param {Object|XMLDocument} data - the raw configuration
-     * @param {String} url - the url the data was retreived from if any.
-     * @return {Object} options - A dictionary of keyword arguments sufficient
-     *      to configure this tile sources constructor.
-     */
-    configure: function( data, url ){
-
-        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/');
-        }
-
-        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 ].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 ( !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.tileSize );
-            yMin = Math.floor( yMin / this.tileSize );
-            xMax = Math.ceil( xMax / this.tileSize );
-            yMax = Math.ceil( yMax / this.tileSize );
-
-            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.tagName,
-        configuration  = null,
-        displayRects   = [],
-        dispRectNodes,
-        dispRectNode,
-        rectNode,
-        sizeNode,
-        i;
-
-    if ( rootName == "Image" ) {
-
-        try {
-            sizeNode = root.getElementsByTagName( "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" );
-            for ( i = 0; i < dispRectNodes.length; i++ ) {
-                dispRectNode = dispRectNodes[ i ];
-                rectNode     = dispRectNode.getElementsByTagName( "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" ) {
-        return $._processDZIError( root );
-    }
-
-    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-2013 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.
- */
-
-/*
- * The getTileUrl implementation is based on Jon Stroop's Python version,
- * which is released under the New BSD license:
- * https://gist.github.com/jpstroop/4624253
- */
-
-
-(function( $ ){
-
-/**
- * @class IIIFTileSource
- * @classdesc A client implementation of the International Image Interoperability
- * Format: Image API Draft 0.2
- *
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.TileSource
- * @see http://library.stanford.edu/iiif/image-api/
- */
-$.IIIFTileSource = function( options ){
-
-    $.extend( true, this, options );
-
-    if( !(this.height && this.width && this.identifier && this.tilesUrl ) ){
-        throw new Error('IIIF required parameters not provided.');
-    }
-
-    //TODO: at this point the base tile source implementation assumes
-    //      a tile is a square and so only has one property tileSize
-    //      to store it.  It may be possible to make tileSize a vector
-    //      OpenSeadraon.Point but would require careful implementation
-    //      to preserve backward compatibility.
-    options.tileSize = this.tile_width;
-
-    if (! options.maxLevel ) {
-        var mf = -1;
-        var scfs = this.scale_factors || this.scale_factor;
-        if ( scfs instanceof Array ) {
-            for ( var i = 0; i < scfs.length; i++ ) {
-                var cf = Number( scfs[i] );
-                if ( !isNaN( cf ) && cf > mf ) { mf = cf; }
-            }
-        }
-        if ( mf < 0 ) { options.maxLevel = Number(Math.ceil(Math.log(Math.max(this.width, this.height), 2))); }
-        else { options.maxLevel = mf; }
-    }
-
-    $.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.
-     * @method
-     * @param {Object|Array} data
-     * @param {String} optional - url
-     */
-    supports: function( data, url ){
-        return (
-            data.ns &&
-            "http://library.stanford.edu/iiif/image-api/ns/" == data.ns
-        ) || (
-            data.profile && (
-                "http://library.stanford.edu/iiif/image-api/compliance.html#level1" == data.profile ||
-                "http://library.stanford.edu/iiif/image-api/compliance.html#level2" == data.profile ||
-                "http://library.stanford.edu/iiif/image-api/compliance.html#level3" == data.profile ||
-                "http://library.stanford.edu/iiif/image-api/compliance.html" == data.profile
-            )
-        ) || (
-            data.documentElement &&
-            "info" == data.documentElement.tagName &&
-            "http://library.stanford.edu/iiif/image-api/ns/" ==
-                data.documentElement.namespaceURI
-        );
-    },
-
-   /**
-     *
-     * @method
-     * @param {Object|XMLDocument} data - the raw configuration
-     * @param {String} url - the url the data was retreived from if any.
-     * @return {Object} options - A dictionary of keyword arguments sufficient
-     *      to configure this tile source via its constructor.
-     */
-    configure: function( data, url ){
-        var service,
-            options,
-            host;
-
-        if( !$.isPlainObject(data) ){
-
-            options = configureFromXml( this, data );
-
-        }else{
-
-            options = configureFromObject( this, data );
-        }
-
-        if( url && !options.tilesUrl ){
-            service = url.split('/');
-            service.pop(); //info.json or info.xml
-            service = service.join('/');
-            if( 'http' !== url.substring( 0, 4 ) ){
-                host = location.protocol + '//' + location.host;
-                service = host + service;
-            }
-            options.tilesUrl = service.replace(
-                data.identifier,
-                ''
-            );
-        }
-
-        return options;
-    },
-
-    /**
-     * Responsible for retreiving the url which will return an image for the
-     * region speified by the given x, y, and level components.
-     * @method
-     * @param {Number} level - z index
-     * @param {Number} x
-     * @param {Number} y
-     * @throws {Error}
-     */
-    getTileUrl: function( level, x, y ){
-
-        //# constants
-        var IIIF_ROTATION = '0',
-            IIIF_QUALITY = 'native.jpg',
-
-            //## get the scale (level as a decimal)
-            scale = Math.pow( 0.5, this.maxLevel - level ),
-
-            //## get iiif size
-            // iiif_size = 'pct:' + ( scale * 100 ),
-
-            //# image dimensions at this level
-            level_width = Math.ceil( this.width * scale ),
-            level_height = Math.ceil( this.height * scale ),
-
-            //## iiif region
-            iiif_tile_size_width = Math.ceil( this.tileSize / scale ),
-            iiif_tile_size_height = Math.ceil( this.tileSize / scale ),
-            iiif_region,
-            iiif_tile_x,
-            iiif_tile_y,
-            iiif_tile_w,
-            iiif_tile_h,
-            iiif_size;
-
-
-        if ( level_width < this.tile_width && level_height < this.tile_height ){
-            iiif_size = level_width + ","; // + level_height; only one dim. for IIIF level 1 compliance
-            iiif_region = 'full';
-        } else {
-            iiif_tile_x = x * iiif_tile_size_width;
-            iiif_tile_y = y * iiif_tile_size_height;
-            iiif_tile_w = Math.min( iiif_tile_size_width, this.width - iiif_tile_x );
-            iiif_tile_h = Math.min( iiif_tile_size_height, this.height - iiif_tile_y );
-            iiif_size = Math.ceil(iiif_tile_w * scale) + ",";
-            iiif_region = [ iiif_tile_x, iiif_tile_y, iiif_tile_w, iiif_tile_h ].join(',');
-        }
-
-        return [
-            this.tilesUrl,
-            this.identifier,
-            iiif_region,
-            iiif_size,
-            IIIF_ROTATION,
-            IIIF_QUALITY
-        ].join('/');
-    }
-
-
-});
-
-/**
- * @private
- * @inner
- * @function
- * @example
- *   <?xml version="1.0" encoding="UTF-8"?>
- *   <info xmlns="http://library.stanford.edu/iiif/image-api/ns/">
- *     <identifier>1E34750D-38DB-4825-A38A-B60A345E591C</identifier>
- *     <width>6000</width>
- *     <height>4000</height>
- *     <scale_factors>
- *       <scale_factor>1</scale_factor>
- *       <scale_factor>2</scale_factor>
- *       <scale_factor>4</scale_factor>
- *     </scale_factors>
- *     <tile_width>1024</tile_width>
- *     <tile_height>1024</tile_height>
- *     <formats>
- *       <format>jpg</format>
- *       <format>png</format>
- *     </formats>
- *     <qualities>
- *       <quality>native</quality>
- *       <quality>grey</quality>
- *     </qualities>
- *   </info>
- */
-function configureFromXml( tileSource, 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 = {
-                "ns": root.namespaceURI
-            };
-
-            parseXML( root, configuration );
-
-            return configureFromObject( tileSource, configuration );
-
-        } catch ( e ) {
-            throw (e instanceof Error) ?
-                e :
-                new Error( $.getString("Errors.IIIF") );
-        }
-    }
-
-    throw new Error( $.getString( "Errors.IIIF" ) );
-
-}
-
-
-/**
- * @private
- * @inner
- * @function
- */
-function parseXML( 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++ ){
-            parseXML( node.childNodes[ i ], configuration, node.nodeName );
-        }
-    }
-}
-
-
-/**
- * @private
- * @inner
- * @function
- * @example
- *   {
- *       "profile" : "http://library.stanford.edu/iiif/image-api/compliance.html#level1",
- *       "identifier" : "1E34750D-38DB-4825-A38A-B60A345E591C",
- *       "width" : 6000,
- *       "height" : 4000,
- *       "scale_factors" : [ 1, 2, 4 ],
- *       "tile_width" : 1024,
- *       "tile_height" : 1024,
- *       "formats" : [ "jpg", "png" ],
- *       "quality" : [ "native", "grey" ]
- *   }
- */
-function configureFromObject( tileSource, configuration ){
-    //the image_host property is not part of the iiif standard but is included here to
-    //allow the info.json and info.xml specify a different server to load the
-    //images from so we can test the implementation.
-    if( configuration.image_host ){
-        configuration.tilesUrl = configuration.image_host;
-    }
-    return configuration;
-}
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - IIIF1_1TileSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 IIIF1_1TileSource
- * @classdesc A client implementation of the International Image Interoperability
- * Format: Image API 1.1
- *
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.TileSource
- * @see http://library.stanford.edu/iiif/image-api/
- */
-$.IIIF1_1TileSource = function( options ){
-
-
-    $.extend( true, this, options );
-
-
-    if ( !( this.height && this.width && this['@id'] ) ){
-        throw new Error( 'IIIF required parameters not provided.' );
-    }
-
-    if ( ( this.profile &&
-        this.profile == "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0" ) ){
-        // what if not reporting a profile?
-        throw new Error( 'IIIF Image API 1.1 compliance level 1 or greater is required.' );
-    }
-
-    if ( this.tile_width ) {
-        options.tileSize = this.tile_width;
-    } else if ( this.tile_height ) {
-        options.tileSize = this.tile_height;
-    } else {
-        // 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;
-        }
-        this.tile_width = options.tileSize;  // So that 'full' gets used for 
-        this.tile_height = options.tileSize; // the region below
-    }
-
-    if ( !options.maxLevel ) {
-        var mf = -1;
-        var scfs = this.scale_factors || this.scale_factor;
-        if ( scfs instanceof Array ) {
-            for ( var i = 0; i < scfs.length; i++ ) {
-                var cf = Number( scfs[i] );
-                if ( !isNaN( cf ) && cf > mf ) { mf = cf; }
-            }
-        }
-        if ( mf < 0 ) { options.maxLevel = Number( Math.ceil( Math.log( Math.max( this.width, this.height ), 2 ) ) ); }
-        else { options.maxLevel = mf; }
-    }
-
-    $.TileSource.apply( this, [ options ] );
-};
-
-$.extend( $.IIIF1_1TileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.IIIF1_1TileSource.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['@context'] &&
-            data['@context'] == "http://library.stanford.edu/iiif/image-api/1.1/context.json" );
-    },
-
-    /**
-     *
-     * @function
-     * @param {Object} data - the raw configuration
-     * @example <caption>IIIF 1.1 Info Looks like this (XML syntax is no more)</caption>
-     * {
-     *   "@context" : "http://library.stanford.edu/iiif/image-api/1.1/context.json",
-     *   "@id" : "http://iiif.example.com/prefix/1E34750D-38DB-4825-A38A-B60A345E591C",
-     *   "width" : 6000,
-     *   "height" : 4000,
-     *   "scale_factors" : [ 1, 2, 4 ],
-     *   "tile_width" : 1024,
-     *   "tile_height" : 1024,
-     *   "formats" : [ "jpg", "png" ],
-     *   "qualities" : [ "native", "grey" ],
-     *   "profile" : "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0"
-     * }
-     */
-    configure: function( data ){
-      return data;
-    },
-    /**
-     * Responsible for retreiving 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 ){
-
-        //# constants
-
-        var IIIF_ROTATION = '0',
-            IIIF_QUALITY = 'native.jpg',
-
-            //## get the scale (level as a decimal)
-            scale = Math.pow( 0.5, this.maxLevel - level ),
-
-            //# image dimensions at this level
-            levelWidth = Math.ceil( this.width * scale ),
-            levelHeight = Math.ceil( this.height * scale ),
-
-            //## iiif region
-            iiifTileSizeWidth = Math.ceil( this.tileSize / scale ),
-            iiifTileSizeHeight = Math.ceil( this.tileSize / scale ),
-            iiifRegion,
-            iiifTileX,
-            iiifTileY,
-            iiifTileW,
-            iiifTileH,
-            iiifSize,
-            uri;
-
-        if ( levelWidth < this.tile_width && levelHeight < this.tile_height ){
-            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 );
-
-            iiifSize = Math.ceil( iiifTileW * scale ) + ",";
-
-            iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' );
-        }
-        uri = [ this['@id'], iiifRegion, iiifSize, IIIF_ROTATION, IIIF_QUALITY ].join( '/' );
-        return uri;
-    }
-  });
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - OsmTileSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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
- * <http://github.com/rsimon/seajax-utils>.  Rainer Simon has contributed
- * the included code to the OpenSeadragon project under the New BSD license;
- * see <https://github.com/openseadragon/openseadragon/issues/58>.
- */
-
-
-(function( $ ){
-
-/**
- * @class OsmTileSource
- * @classdesc A tilesource implementation for OpenStreetMap.<br><br>
- *
- * 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.<br><br>
- *
- * 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 retreived from if any.
-     * @return {Object} options - A dictionary of keyword arguments sufficient
-     *      to configure this tile sources constructor.
-     */
-    configure: function( data, url ){
-        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-2013 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
- * <http://github.com/rsimon/seajax-utils>.  Rainer Simon has contributed
- * the included code to the OpenSeadragon project under the New BSD license;
- * see <https://github.com/openseadragon/openseadragon/issues/58>.
- */
-
-
-(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 retreived from if any.
-     * @return {Object} options - A dictionary of keyword arguments sufficient
-     *      to configure this tile sources constructor.
-     */
-    configure: function( data, url ){
-        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 ));
-
-/*
- * OpenSeadragon - LegacyTileSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 retreived from if any.
-     * @return {Object} options - A dictionary of keyword arguments sufficient
-     *      to configure this tile sources constructor.
-     */
-    configure: function( configuration, dataUrl ){
-
-        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 );
-        }
-    },
-
-    /**
-     * @function
-     * @param {Number} level
-     * @param {OpenSeadragon.Point} point
-     */
-    getTileAtPoint: function( level, point ) {
-        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 dont 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 && (
-                file.url.toLowerCase().match(/^.*\.(png|jpg|jpeg|gif)$/) || (
-                    file.mimetype &&
-                    file.mimetype.toLowerCase().match(/^.*\/(png|jpg|jpeg|gif)$/)
-                )
-            ) ){
-            //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 : '<no 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 - TileSourceCollection
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 TileSourceCollection
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.TileSource
- */
-$.TileSourceCollection = function( tileSize, tileSources, rows, layout  ) {
-    var options;
-
-    if( $.isPlainObject( tileSize ) ){
-        options = tileSize;
-    }else{
-        options = {
-            tileSize: arguments[ 0 ],
-            tileSources: arguments[ 1 ],
-            rows: arguments[ 2 ],
-            layout: arguments[ 3 ]
-        };
-    }
-
-    if( !options.layout ){
-        options.layout = 'horizontal';
-    }
-
-    var minLevel = 0,
-        levelSize = 1.0,
-        tilesPerRow = Math.ceil( options.tileSources.length / options.rows ),
-        longSide = tilesPerRow >= options.rows ?
-            tilesPerRow :
-            options.rows;
-
-    if( 'horizontal' == options.layout ){
-        options.width = ( options.tileSize ) * tilesPerRow;
-        options.height = ( options.tileSize ) * options.rows;
-    } else {
-        options.height = ( options.tileSize ) * tilesPerRow;
-        options.width = ( options.tileSize ) * options.rows;
-    }
-
-    options.tileOverlap = -options.tileMargin;
-    options.tilesPerRow = tilesPerRow;
-
-    //Set min level to avoid loading sublevels since collection is a
-    //different kind of abstraction
-
-    while( levelSize  <  ( options.tileSize ) * longSide ){
-        //$.console.log( '%s levelSize %s minLevel %s', options.tileSize * longSide, levelSize, minLevel );
-        levelSize = levelSize * 2.0;
-        minLevel++;
-    }
-    options.minLevel = minLevel;
-
-    //for( var name in options ){
-    //    $.console.log( 'Collection %s %s', name, options[ name ] );
-    //}
-
-    $.TileSource.apply( this, [ options ] );
-
-};
-
-$.extend( $.TileSourceCollection.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.TileSourceCollection.prototype */{
-
-    /**
-     * @function
-     * @param {Number} level
-     * @param {Number} x
-     * @param {Number} y
-     */
-    getTileBounds: function( level, x, y ) {
-        var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ),
-            px = this.tileSize * x - this.tileOverlap,
-            py = this.tileSize * y - this.tileOverlap,
-            sx = this.tileSize + 1 * this.tileOverlap,
-            sy = this.tileSize + 1 * this.tileOverlap,
-            scale = 1.0 / dimensionsScaled.x;
-
-        sx = Math.min( sx, dimensionsScaled.x - px );
-        sy = Math.min( sy, dimensionsScaled.y - py );
-
-        return new $.Rect( px * scale, py * scale, sx * scale, sy * scale );
-    },
-
-    /**
-     *
-     * @function
-     */
-    configure: function( data, url ){
-        return;
-    },
-
-
-    /**
-     * @function
-     * @param {Number} level
-     * @param {Number} x
-     * @param {Number} y
-     */
-    getTileUrl: function( level, x, y ) {
-        //$.console.log([  level, '/', x, '_', y ].join( '' ));
-        return null;
-    }
-
-
-
-});
-
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Button
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 &lt;button&gt; 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}.
- */
-$.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
-
-    }, options );
-
-    /**
-     * The button element.
-     * @member {Element} element
-     * @memberof OpenSeadragon.Button#
-     */
-    this.element        = options.element   || $.makeNeutralElement( "button" );
-
-    //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.imgDiv       = $.makeNeutralElement( "div" );
-
-        this.imgDiv.style.position = "relative";
-
-        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.imgDiv.appendChild( this.imgRest );
-        this.imgDiv.appendChild( this.imgGroup );
-        this.imgDiv.appendChild( this.imgHover );
-        this.imgDiv.appendChild( this.imgDown );
-        this.element.appendChild( this.imgDiv );
-    }
-
-
-    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({
-
-        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.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 } );
-        },
-
-        exitHandler: 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.exitHandler( 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 } );
-                return false;
-            }
-            return true;
-        }
-
-    }).setTracking( true );
-
-    outTo( this, $.ButtonState.REST );
-};
-
-$.extend( $.Button.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.Button.prototype */{
-
-    /**
-     * TODO: Determine what this function is intended to do and if it's actually
-     * useful as an API point.
-     * @function
-     */
-    notifyGroupEnter: function() {
-        inTo( this, $.ButtonState.GROUP );
-    },
-
-    /**
-     * TODO: Determine what this function is intended to do and if it's actually
-     * useful as an API point.
-     * @function
-     */
-    notifyGroupExit: function() {
-        outTo( this, $.ButtonState.REST );
-    },
-
-    /**
-     * @function
-     */
-    disable: function(){
-        this.notifyGroupExit();
-        this.element.disabled = true;
-        $.setElementOpacity( this.element, 0.2, true );
-    },
-
-    /**
-     * @function
-     */
-    enable: function(){
-        this.element.disabled = false;
-        $.setElementOpacity( this.element, 1.0, true );
-        this.notifyGroupEnter();
-    }
-
-});
-
-
-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-2013 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( "fieldgroup" );
-
-    // TODO What if there IS an options.group specified? 
-    if( !options.group ){
-        this.label   = $.makeNeutralElement( "label" );
-        //TODO: support labels for ButtonGroups
-        //this.label.innerHTML = this.labelText;
-        this.element.style.display = "inline-block";
-        this.element.appendChild( this.label );
-        for ( i = 0; i < buttons.length; i++ ) {
-            this.element.appendChild( buttons[ i ].element );
-        }
-    }
-
-    /**
-     * Tracks mouse/touch/key events accross the group of buttons.
-     * @member {OpenSeadragon.MouseTracker} tracker
-     * @memberof OpenSeadragon.ButtonGroup#
-     */
-    this.tracker = new $.MouseTracker({
-        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();
-            }
-        },
-        exitHandler: function ( event ) {
-            var i;
-            if ( !event.insideElementPressed ) {
-                for ( i = 0; i < _this.buttons.length; i++ ) {
-                    _this.buttons[ i ].notifyGroupExit();
-                }
-            }
-        },
-        releaseHandler: function ( event ) {
-            var i;
-            if ( !event.insideElementReleased ) {
-                for ( i = 0; i < _this.buttons.length; i++ ) {
-                    _this.buttons[ i ].notifyGroupExit();
-                }
-            }
-        }
-    }).setTracking( true );
-};
-
-$.ButtonGroup.prototype = /** @lends OpenSeadragon.ButtonGroup.prototype */{
-
-    /**
-     * 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
-     */
-    emulateExit: function() {
-        this.tracker.exitHandler( { eventSource: this.tracker } );
-    }
-};
-
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Rect
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 really represents a 2x2 matrix where each row represents a
- * 2 dimensional vector component, the first is (x,y) and the second is
- * (width, height).  The latter component implies the equation of a simple
- * plane.
- *
- * @memberof OpenSeadragon
- * @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'.
- */
-$.Rect = function( x, y, width, height ) {
-    /**
-     * 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;
-};
-
-$.Rect.prototype = /** @lends OpenSeadragon.Rect.prototype */{
-
-    /**
-     * 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
-        );
-    },
-
-    /**
-     * 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
-        );
-    },
-
-    /**
-     * 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
-        );
-    },
-
-    /**
-     * 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
-        );
-    },
-
-    /**
-     * Returns the width and height component as a vector OpenSeadragon.Point
-     * @function
-     * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the
-     *  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.
-     * @return {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 );
-    },
-
-    /**
-     * Rotates a rectangle around a point. Currently only 90, 180, and 270
-     * degrees are supported.
-     * @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.
-     * @return {OpenSeadragon.Rect}
-     */
-    rotate: function( degrees, pivot ) {
-        // TODO support arbitrary rotation
-        var width = this.width,
-            height = this.height,
-            newTopLeft;
-
-        degrees = ( degrees + 360 ) % 360;
-        if( degrees % 90 !== 0 ) {
-            throw new Error('Currently only 0, 90, 180, and 270 degrees are supported.');
-        }
-
-        if( degrees === 0 ){
-            return new $.Rect(
-                this.x,
-                this.y,
-                this.width,
-                this.height
-            );
-        }
-
-        pivot = pivot || this.getCenter();
-
-        switch ( degrees ) {
-            case 90:
-                newTopLeft = this.getBottomLeft();
-                width = this.height;
-                height = this.width;
-                break;
-            case 180:
-                newTopLeft = this.getBottomRight();
-                break;
-            case 270:
-                newTopLeft = this.getTopRight();
-                width = this.height;
-                height = this.width;
-                break;
-            default:
-                newTopLeft = this.getTopLeft();
-                break;
-        }
-
-        newTopLeft = newTopLeft.rotate(degrees, pivot);
-
-        return new $.Rect(newTopLeft.x, newTopLeft.y, width, height);
-    },
-
-    /**
-     * 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) + "," +
-            Math.round(this.y*100) + "," +
-            Math.round(this.width*100) + "x" +
-            Math.round(this.height*100) +
-        "]";
-    }
-};
-
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - ReferenceStrip
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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 effeciently
- *          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, {
-        //required overrides
-        element:                this.element,
-        //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
-    } );
-
-    $.extend( this, options );
-    //Private state properties
-    THIS[this.id] = {
-        "animating":           false
-    };
-
-    this.minPixelRatio = this.viewer.minPixelRatio;
-
-    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';
-
-    $.setElementOpacity( this.element, 0.8 );
-
-    this.viewer = viewer;
-    this.innerTracker = new $.MouseTracker( {
-        element:        this.element,
-        dragHandler:    $.delegate( this, onStripDrag ),
-        scrollHandler:  $.delegate( this, onStripScroll ),
-        enterHandler:   $.delegate( this, onStripEnter ),
-        exitHandler:    $.delegate( this, onStripExit ),
-        keyHandler:     $.delegate( this, onKeyPress )
-    } ).setTracking( 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 = [];
-
-    /*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';
-
-        element.innerTracker = new $.MouseTracker( {
-            element:            element,
-            clickTimeThreshold: this.clickTimeThreshold,
-            clickDistThreshold: this.clickDistThreshold,
-            pressHandler: function ( event ) {
-                event.eventSource.dragging = $.now();
-            },
-            releaseHandler: function ( event ) {
-                var tracker = event.eventSource,
-                    id      = tracker.element.id,
-                    page    = Number( id.split( '-' )[2] ),
-                    now     = $.now();
-
-                if ( event.insideElementPressed &&
-                     event.insideElementReleased &&
-                     tracker.dragging &&
-                     ( now - tracker.dragging ) < tracker.clickTimeThreshold ) {
-                    tracker.dragging = null;
-                    viewer.goToPage( page );
-                }
-            }
-        } ).setTracking( true );
-
-        this.element.appendChild( element );
-
-        element.activePanel = false;
-
-        this.panels.push( element );
-
-    }
-    loadPanels( this, this.scroll == 'vertical' ? viewerSize.y : viewerSize.y, 0 );
-    this.setFocus( 0 );
-
-};
-
-$.extend( $.ReferenceStrip.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.ReferenceStrip.prototype */{
-
-    /**
-     * @function
-     */
-    setFocus: function ( page ) {
-        var element      = $.getElement( 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;
-            $.getElement( element.id + '-displayregion' ).focus();
-            onStripEnter.call( this, { eventSource: this.innerTracker } );
-        }
-    },
-
-    /**
-     * @function
-     */
-    update: function () {
-        if ( THIS[this.id].animating ) {
-            $.console.log( 'image reference strip update' );
-            return true;
-        }
-        return false;
-    }
-
-} );
-
-
-
-
-/**
- * @private
- * @inner
- * @function
- */
-function onStripDrag( event ) {
-
-    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 );
-    this.dragging = true;
-    if ( this.element ) {
-        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 ) );
-                }
-            }
-        }
-    }
-    return false;
-
-}
-
-
-
-/**
- * @private
- * @inner
- * @function
- */
-function onStripScroll( event ) {
-    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 ( this.element ) {
-        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 ) );
-                }
-            }
-        }
-    }
-    //cancels event
-    return false;
-}
-
-
-function loadPanels( strip, viewerSize, scroll ) {
-    var panelSize,
-        activePanelsStart,
-        activePanelsEnd,
-        miniViewer,
-        style,
-        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 ) {
-            miniViewer = new $.Viewer( {
-                id:                     element.id,
-                tileSources:            [strip.viewer.tileSources[i]],
-                element:                element,
-                navigatorSizeRatio:     strip.sizeRatio,
-                showNavigator:          false,
-                mouseNavEnabled:        false,
-                showNavigationControl:  false,
-                showSequenceControl:    false,
-                immediateRender:        true,
-                blendTime:              0,
-                animationTime:          0
-            } );
-
-            miniViewer.displayRegion           = $.makeNeutralElement( "textarea" );
-            miniViewer.displayRegion.id        = element.id + '-displayregion';
-            miniViewer.displayRegion.className = 'displayregion';
-
-            style               = miniViewer.displayRegion.style;
-            style.position      = 'relative';
-            style.top           = '0px';
-            style.left          = '0px';
-            style.fontSize      = '0px';
-            style.overflow      = 'hidden';
-            style.float         = 'left'; //Webkit
-            style.cssFloat      = 'left'; //Firefox
-            style.styleFloat    = 'left'; //IE
-            style.zIndex        = 999999999;
-            style.cursor        = 'default';
-            style.width         = ( strip.panelWidth - 4 ) + 'px';
-            style.height        = ( strip.panelHeight - 4 ) + 'px';
-
-            miniViewer.displayRegion.innerTracker = new $.MouseTracker( {
-                element: miniViewer.displayRegion
-            } );
-
-            element.getElementsByTagName( 'form' )[0].appendChild(
-                miniViewer.displayRegion
-            );
-
-            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";
-
-    }
-    return false;
-}
-
-
-/**
- * @private
- * @inner
- * @function
- */
-function onStripExit( 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";
-
-    }
-    return false;
-}
-
-
-
-/**
- * @private
- * @inner
- * @function
- */
-function onKeyPress( event ) {
-    //console.log( event.keyCode );
-
-    switch ( event.keyCode ) {
-        case 61: //=|+
-            onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );
-            return false;
-        case 45: //-|_
-            onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );
-            return false;
-        case 48: //0|)
-        case 119: //w
-        case 87: //W
-        case 38: //up arrow
-            onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );
-            return false;
-        case 115: //s
-        case 83: //S
-        case 40: //down arrow
-            onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );
-            return false;
-        case 97: //a
-        case 37: //left arrow
-            onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );
-            return false;
-        case 100: //d
-        case 39: //right arrow
-            onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );
-            return false;
-        default:
-            //console.log( 'navigator keycode %s', event.keyCode );
-            return true;
-    }
-}
-
-
-
-} ( OpenSeadragon ) );
-
-/*
- * OpenSeadragon - DisplayRect
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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-2013 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.initial - Initial value of spring, default to 0 so
- *  spring is not in motion initally by default.
- * @param {Number} options.springStiffness - Spring stiffness.
- * @param {Number} options.animationTime - Animation duration per spring.
- */
-$.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 ] :
-                0,
-            /**
-             * 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
-        };
-    }
-
-    $.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 :
-            0,
-        time:  $.now() // always work in milliseconds
-    };
-
-    /**
-     * @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
-    };
-};
-
-$.Spring.prototype = /** @lends OpenSeadragon.Spring.prototype */{
-
-    /**
-     * @function
-     * @param {Number} target
-     */
-    resetTo: function( target ) {
-        this.target.value = target;
-        this.target.time  = this.current.time;
-        this.start.value  = this.target.value;
-        this.start.time   = this.target.time;
-    },
-
-    /**
-     * @function
-     * @param {Number} target
-     */
-    springTo: function( target ) {
-        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;
-    },
-
-    /**
-     * @function
-     * @param {Number} delta
-     */
-    shiftBy: function( delta ) {
-        this.start.value  += delta;
-        this.target.value += delta;
-    },
-
-    /**
-     * @function
-     */
-    update: function() {
-        this.current.time  = $.now();
-        this.current.value = (this.current.time >= this.target.time) ?
-            this.target.value :
-            this.start.value +
-                ( this.target.value - this.start.value ) *
-                transform(
-                    this.springStiffness,
-                    ( this.current.time - this.start.time ) /
-                    ( this.target.time  - this.start.time )
-                );
-    }
-};
-
-/**
- * @private
- */
-function transform( stiffness, x ) {
-    return ( 1.0 - Math.exp( stiffness * -x ) ) /
-        ( 1.0 - Math.exp( -stiffness ) );
-}
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Tile
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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( $ ){
-    var TILE_CACHE       = {};
-/**
- * @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.Point} 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} url The URL of this tile's image.
- */
-$.Tile = function(level, x, y, bounds, exists, url) {
-    /**
-     * 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.Point} bounds
-     * @memberof OpenSeadragon.Tile#
-     */
-    this.bounds  = bounds;
-    /**
-     * 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;
-    /**
-     * The URL of this tile's image.
-     * @member {String} url
-     * @memberof OpenSeadragon.Tile#
-     */
-    this.url     = url;
-    /**
-     * 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 Image object for this tile.
-     * @member {Object} image
-     * @memberof OpenSeadragon.Tile#
-     */
-    this.image      = 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;
-    /**
-     * 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 distance of this tile to the viewport center.
-     * @member {Number} distance
-     * @memberof OpenSeadragon.Tile#
-     */
-    this.distance   = null;
-    /**
-     * The visibility score of this tile.
-     * @member {Number} visibility
-     * @memberof OpenSeadragon.Tile#
-     */
-    this.visibility = null;
-
-    /**
-     * 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;
-};
-
-$.Tile.prototype = /** @lends OpenSeadragon.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;
-    },
-
-    /**
-     * Renders the tile in an html container.
-     * @function
-     * @param {Element} container
-     */
-    drawHTML: function( container ) {
-        if ( !this.loaded || !this.image ) {
-            $.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 ) {
-            this.element                              = $.makeNeutralElement( "div" );
-            this.imgElement                           = $.makeNeutralElement( "img" );
-            this.imgElement.src                       = this.url;
-            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";
-
-        $.setElementOpacity( this.element, this.opacity );
-    },
-
-    /**
-     * Renders the tile in a canvas-based context.
-     * @function
-     * @param {Canvas} context
-     * @param {Function} method for firing the drawing event. drawingHandler({context, tile, rendered})
-     * where <code>rendered</code> is the context with the pre-drawn image.
-     */
-    drawCanvas: function( context, drawingHandler ) {
-
-        var position = this.position,
-            size     = this.size,
-            rendered,
-            canvas;
-
-        if ( !this.loaded || !( this.image || TILE_CACHE[ this.url ] ) ){
-            $.console.warn(
-                "Attempting to draw tile %s when it's not yet loaded.",
-                this.toString()
-            );
-            return;
-        }
-        context.globalAlpha = this.opacity;
-
-        //context.save();
-
-        //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.url.match('.png') ){
-            //clearing only the inside of the rectangle occupied
-            //by the png prevents edge flikering
-            context.clearRect(
-                position.x+1,
-                position.y+1,
-                size.x-2,
-                size.y-2
-            );
-
-        }
-
-        if( !TILE_CACHE[ this.url ] ){
-            canvas = document.createElement( 'canvas' );
-            canvas.width = this.image.width;
-            canvas.height = this.image.height;
-            rendered = canvas.getContext('2d');
-            rendered.drawImage( this.image, 0, 0 );
-            TILE_CACHE[ this.url ] = rendered;
-            //since we are caching the prerendered image on a canvas
-            //allow the image to not be held in memory
-            this.image = null;
-        }
-
-        rendered = TILE_CACHE[ this.url ];
-
-        // This gives the application a chance to make image manipulation changes as we are rendering the image
-        drawingHandler({context: context, tile: this, rendered: rendered});
-
-        //rendered.save();
-        context.drawImage(
-            rendered.canvas,
-            0,
-            0,
-            rendered.canvas.width,
-            rendered.canvas.height,
-            position.x,
-            position.y,
-            size.x,
-            size.y
-        );
-        //rendered.restore();
-
-        //context.restore();
-    },
-
-    /**
-     * 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 );
-        }
-        if ( TILE_CACHE[ this.url ]){
-            delete TILE_CACHE[ this.url ];
-        }
-
-        this.element    = null;
-        this.imgElement = null;
-        this.image      = null;
-        this.loaded     = false;
-        this.loading    = false;
-    }
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Overlay
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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.
-     * @member OverlayPlacement
-     * @memberof OpenSeadragon
-     * @static
-     * @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 = {
-        CENTER:       0,
-        TOP_LEFT:     1,
-        TOP:          2,
-        TOP_RIGHT:    3,
-        RIGHT:        4,
-        BOTTOM_RIGHT: 5,
-        BOTTOM:       6,
-        BOTTOM_LEFT:  7,
-        LEFT:         8
-    };
-
-    /**
-     * @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
-     * @param {OpenSeadragon.OverlayPlacement} options.placement - Only used if location is an {@link OpenSeadragon.Point}.
-     * @param {OpenSeadragon.Overlay.OnDrawCallback} options.onDraw
-     */
-    $.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.scales     = options.location instanceof $.Rect;
-        this.bounds     = new $.Rect(
-            options.location.x,
-            options.location.y,
-            options.location.width,
-            options.location.height
-        );
-        this.position   = new $.Point(
-            options.location.x,
-            options.location.y
-        );
-        this.size       = new $.Point(
-            options.location.width,
-            options.location.height
-        );
-        this.style      = options.element.style;
-        // rects are always top-left
-        this.placement  = options.location instanceof $.Point ?
-            options.placement :
-            $.OverlayPlacement.TOP_LEFT;
-        this.onDraw = options.onDraw;
-    };
-
-    $.Overlay.prototype = /** @lends OpenSeadragon.Overlay.prototype */{
-
-        /**
-         * @function
-         * @param {OpenSeadragon.OverlayPlacement} position
-         * @param {OpenSeadragon.Point} size
-         */
-        adjust: function( position, size ) {
-            switch ( this.placement ) {
-                case $.OverlayPlacement.TOP_LEFT:
-                    break;
-                case $.OverlayPlacement.TOP:
-                    position.x -= size.x / 2;
-                    break;
-                case $.OverlayPlacement.TOP_RIGHT:
-                    position.x -= size.x;
-                    break;
-                case $.OverlayPlacement.RIGHT:
-                    position.x -= size.x;
-                    position.y -= size.y / 2;
-                    break;
-                case $.OverlayPlacement.BOTTOM_RIGHT:
-                    position.x -= size.x;
-                    position.y -= size.y;
-                    break;
-                case $.OverlayPlacement.BOTTOM:
-                    position.x -= size.x / 2;
-                    position.y -= size.y;
-                    break;
-                case $.OverlayPlacement.BOTTOM_LEFT:
-                    position.y -= size.y;
-                    break;
-                case $.OverlayPlacement.LEFT:
-                    position.y -= size.y / 2;
-                    break;
-                default:
-                case $.OverlayPlacement.CENTER:
-                    position.x -= size.x / 2;
-                    position.y -= size.y / 2;
-                    break;
-            }
-        },
-
-        /**
-         * @function
-         */
-        destroy: function() {
-            var element = this.element,
-                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.scales ) {
-                style.width = "";
-                style.height = "";
-            }
-        },
-
-        /**
-         * @function
-         * @param {Element} container
-         */
-        drawHTML: function( container, viewport ) {
-            var element = this.element,
-                style   = this.style,
-                scales  = this.scales,
-                drawerCenter = new $.Point(
-                    viewport.viewer.drawer.canvas.width / 2,
-                    viewport.viewer.drawer.canvas.height / 2
-                ),
-                degrees = viewport.degrees,
-                position,
-                size,
-                overlayCenter;
-
-            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 );
-            }
-
-            if ( !scales ) {
-                this.size = $.getElementSize( element );
-            }
-
-            position = this.position;
-            size     = this.size;
-
-            this.adjust( position, size );
-
-            position = position.apply( Math.floor );
-            size     = size.apply( Math.ceil );
-
-            // rotate the position of the overlay
-            // TODO only rotate overlays if in canvas mode
-            // TODO replace the size rotation with CSS3 transforms
-            // TODO add an option to overlays to not rotate with the image
-            // Currently only rotates position and size
-            if( degrees !== 0 && this.scales ) {
-                overlayCenter = new $.Point( size.x / 2, size.y / 2 );
-
-                position = position.plus( overlayCenter ).rotate(
-                    degrees,
-                    drawerCenter
-                ).minus( overlayCenter );
-
-                size = size.rotate( degrees, new $.Point( 0, 0 ) );
-                size = new $.Point( Math.abs( size.x ), Math.abs( size.y ) );
-            }
-
-            // call the onDraw callback if there is one to allow, this allows someone to overwrite
-            // the drawing/positioning/sizing of the overlay
-            if (this.onDraw) {
-                this.onDraw(position, size, element);
-            } else {
-                style.left     = position.x + "px";
-                style.top      = position.y + "px";
-                style.position = "absolute";
-                style.display  = 'block';
-
-                if ( scales ) {
-                    style.width  = size.x + "px";
-                    style.height = size.y + "px";
-                }
-            }
-        },
-
-        /**
-         * @function
-         * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location
-         * @param {OpenSeadragon.OverlayPlacement} position
-         */
-        update: function( location, placement ) {
-            this.scales     = location instanceof $.Rect;
-            this.bounds     = new $.Rect(
-                location.x,
-                location.y,
-                location.width,
-                location.height
-            );
-            // rects are always top-left
-            this.placement  = location instanceof $.Point ?
-                placement :
-                $.OverlayPlacement.TOP_LEFT;
-        }
-
-    };
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Drawer
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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( $ ){
-
-var DEVICE_SCREEN       = $.getWindowSize(),
-    BROWSER             = $.Browser.vendor,
-    BROWSER_VERSION     = $.Browser.version,
-
-    SUBPIXEL_RENDERING = (
-        ( BROWSER == $.BROWSERS.FIREFOX ) ||
-        ( BROWSER == $.BROWSERS.OPERA )   ||
-        ( BROWSER == $.BROWSERS.SAFARI && BROWSER_VERSION >= 4 ) ||
-        ( BROWSER == $.BROWSERS.CHROME && BROWSER_VERSION >= 2 ) ||
-        ( BROWSER == $.BROWSERS.IE     && BROWSER_VERSION >= 9 )
-    );
-
-
-/**
- * @class Drawer
- * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}. 
- * A new instance is created for each TileSource opened (see {@link OpenSeadragon.Viewer#drawer}).
- *
- * @memberof OpenSeadragon
- * @param {OpenSeadragon.TileSource} source - Reference to Viewer tile source.
- * @param {OpenSeadragon.Viewport} viewport - Reference to Viewer viewport.
- * @param {Element} element - Parent element.
- */
-$.Drawer = function( options ) {
-
-    //backward compatibility for positional args while prefering more
-    //idiomatic javascript options object as the only argument
-    var args  = arguments,
-        i;
-
-    if( !$.isPlainObject( options ) ){
-        options = {
-            source:     args[ 0 ], // Reference to Viewer tile source.
-            viewport:   args[ 1 ], // Reference to Viewer viewport.
-            element:    args[ 2 ]  // Parent element.
-        };
-    }
-
-    $.extend( true, this, {
-
-        //internal state properties
-        viewer:         null,
-        downloading:    0,     // How many images are currently being loaded in parallel.
-        tilesMatrix:    {},    // A '3d' dictionary [level][x][y] --> Tile.
-        tilesLoaded:    [],    // An unordered list of Tiles with loaded images.
-        coverage:       {},    // A '3d' dictionary [level][x][y] --> Boolean.
-        lastDrawn:      [],    // An unordered list of Tiles drawn last frame.
-        lastResetTime:  0,     // Last time for which the drawer was reset.
-        midUpdate:      false, // Is the drawer currently updating the viewport?
-        updateAgain:    true,  // Does the drawer need to update the viewort again?
-
-
-        //internal state / configurable settings
-        overlays:           [], // An unordered list of Overlays added.
-        collectionOverlays: {},
-
-        //configurable settings
-        maxImageCacheCount: $.DEFAULT_SETTINGS.maxImageCacheCount,
-        imageLoaderLimit:   $.DEFAULT_SETTINGS.imageLoaderLimit,
-        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,
-        debugMode:          $.DEFAULT_SETTINGS.debugMode,
-        timeout:            $.DEFAULT_SETTINGS.timeout
-
-    }, options );
-
-    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( this.element );
-    /**
-     * A &lt;canvas&gt; element if the browser supports them, otherwise a &lt;div&gt; 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 &lt;canvas&gt; element, otherwise null.
-     * @member {Object} context
-     * @memberof OpenSeadragon.Drawer#
-     */
-    this.context    = this.useCanvas ? this.canvas.getContext( "2d" ) : null;
-    // Ratio of zoomable image height to width.
-    this.normHeight = this.source.dimensions.y / this.source.dimensions.x;
-    /**
-     * @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';
-
-    this.canvas.style.width     = "100%";
-    this.canvas.style.height    = "100%";
-    this.canvas.style.position  = "absolute";
-
-    // explicit left-align
-    this.container.style.textAlign = "left";
-    this.container.appendChild( this.canvas );
-
-    //create the correct type of overlay by convention if the overlays
-    //are not already OpenSeadragon.Overlays
-    for( i = 0; i < this.overlays.length; i++ ){
-        if( $.isPlainObject( this.overlays[ i ] ) ){
-
-            this.overlays[ i ] = addOverlayFromConfiguration( this, this.overlays[ i ]);
-
-        } else if ( $.isFunction( this.overlays[ i ] ) ){
-            //TODO
-        }
-    }
-
-    //this.profiler    = new $.Profiler();
-};
-
-$.Drawer.prototype = /** @lends OpenSeadragon.Drawer.prototype */{
-
-    /**
-     * 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.
-     * @method
-     * @param {Element|String|Object} element - A reference to an element or an id for
-     *      the element which will overlayed. Or an Object specifying the configuration for the overlay
-     * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
-     *      rectangle which will be overlayed.
-     * @param {OpenSeadragon.OverlayPlacement} placement - 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.
-     * @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.overlays, element ) >= 0 ) {
-            // they're trying to add a duplicate overlay
-            return;
-        }
-
-        this.overlays.push( new $.Overlay({
-            element: element,
-            location: options.location,
-            placement: options.placement,
-            onDraw: options.onDraw
-        }) );
-        this.updateAgain = true;
-        if( this.viewer ){
-            /**
-             * Raised when an overlay is added to the viewer (see {@link OpenSeadragon.Drawer#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.OverlayPlacement} placement
-             * @property {?Object} userData - Arbitrary subscriber-defined object.
-             */
-            this.viewer.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 {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
-     *      rectangle which will be overlayed.
-     * @param {OpenSeadragon.OverlayPlacement} placement - The position of the
-     *      viewport which the location coordinates will be treated as relative
-     *      to.
-     * @return {OpenSeadragon.Drawer} Chainable.
-     * @fires OpenSeadragon.Viewer.event:update-overlay
-     */
-    updateOverlay: function( element, location, placement ) {
-        var i;
-
-        element = $.getElement( element );
-        i = getOverlayIndex( this.overlays, element );
-
-        if ( i >= 0 ) {
-            this.overlays[ i ].update( location, placement );
-            this.updateAgain = true;
-        }
-        if( this.viewer ){
-            /**
-             * Raised when an overlay's location or placement changes (see {@link OpenSeadragon.Drawer#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.OverlayPlacement} placement
-             * @property {?Object} userData - Arbitrary subscriber-defined object.
-             */
-            this.viewer.raiseEvent( 'update-overlay', {
-                element: element,
-                location: location,
-                placement: placement
-            });
-        }
-        return this;
-    },
-
-    /**
-     * Removes and overlay identified by the reference element or element id
-     *      and schedules and update.
-     * @method
-     * @param {Element|String} element - A reference to the element or an
-     *      element id which represent the ovelay content to be removed.
-     * @return {OpenSeadragon.Drawer} Chainable.
-     * @fires OpenSeadragon.Viewer.event:remove-overlay
-     */
-    removeOverlay: function( element ) {
-        var i;
-
-        element = $.getElement( element );
-        i = getOverlayIndex( this.overlays, element );
-
-        if ( i >= 0 ) {
-            this.overlays[ i ].destroy();
-            this.overlays.splice( i, 1 );
-            this.updateAgain = true;
-        }
-        if( this.viewer ){
-            /**
-             * Raised when an overlay is removed from the viewer (see {@link OpenSeadragon.Drawer#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.viewer.raiseEvent( 'remove-overlay', {
-                element: element
-            });
-        }
-        return this;
-    },
-
-    /**
-     * Removes all currently configured Overlays from this Drawer and schedules
-     *      and update.
-     * @method
-     * @return {OpenSeadragon.Drawer} Chainable.
-     * @fires OpenSeadragon.Viewer.event:clear-overlay
-     */
-    clearOverlays: function() {
-        while ( this.overlays.length > 0 ) {
-            this.overlays.pop().destroy();
-            this.updateAgain = true;
-        }
-        if( this.viewer ){
-            /**
-             * 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.viewer.raiseEvent( 'clear-overlay', {} );
-        }
-        return this;
-    },
-
-
-    /**
-     * Returns whether the Drawer is scheduled for an update at the
-     *      soonest possible opportunity.
-     * @method
-     * @returns {Boolean} - Whether the Drawer is scheduled for an update at the
-     *      soonest possible opportunity.
-     */
-    needsUpdate: function() {
-        return this.updateAgain;
-    },
-
-    /**
-     * Returns the total number of tiles that have been loaded by this Drawer.
-     * @method
-     * @returns {Number} - The total number of tiles that have been loaded by
-     *      this Drawer.
-     */
-    numTilesLoaded: function() {
-        return this.tilesLoaded.length;
-    },
-
-    /**
-     * Clears all tiles and triggers an update on the next call to
-     * Drawer.prototype.update().
-     * @method
-     * @return {OpenSeadragon.Drawer} Chainable.
-     */
-    reset: function() {
-        clearTiles( this );
-        this.lastResetTime = $.now();
-        this.updateAgain = true;
-        return this;
-    },
-
-    /**
-     * Forces the Drawer to update.
-     * @method
-     * @return {OpenSeadragon.Drawer} Chainable.
-     */
-    update: function() {
-        //this.profiler.beginUpdate();
-        this.midUpdate = true;
-        updateViewport( this );
-        this.midUpdate = false;
-        //this.profiler.endUpdate();
-        return this;
-    },
-
-    /**
-     * Used internally to load images when required.  May also be used to
-     * preload a set of images so the browser will have them available in
-     * the local cache to optimize user experience in certain cases. Because
-     * the number of parallel image loads is configurable, if too many images
-     * are currently being loaded, the request will be ignored.  Since by
-     * default drawer.imageLoaderLimit is 0, the native browser parallel
-     * image loading policy will be used.
-     * @method
-     * @param {String} src - The url of the image to load.
-     * @param {Function} callback - The function that will be called with the
-     *      Image object as the only parameter if it was loaded successfully.
-     *      If an error occured, or the request timed out or was aborted,
-     *      the parameter is null instead.
-     * @return {Boolean} loading - Whether the request was submitted or ignored
-     *      based on OpenSeadragon.DEFAULT_SETTINGS.imageLoaderLimit.
-     */
-    loadImage: function( src, callback ) {
-        var _this = this,
-            loading = false,
-            image,
-            jobid,
-            complete;
-
-        if ( !this.imageLoaderLimit ||
-              this.downloading < this.imageLoaderLimit ) {
-
-            this.downloading++;
-
-            image = new Image();
-            image.crossOrigin = 'Anonymous';
-
-            complete = function( imagesrc, resultingImage ){
-                _this.downloading--;
-                if (typeof ( callback ) == "function") {
-                    try {
-                        callback( resultingImage );
-                    } catch ( e ) {
-                        $.console.error(
-                            "%s while executing %s callback: %s",
-                            e.name,
-                            src,
-                            e.message,
-                            e
-                        );
-                    }
-                }
-            };
-
-            image.onload = function(){
-                finishLoadingImage( image, complete, true, jobid );
-            };
-
-            image.onabort = image.onerror = function(){
-                finishLoadingImage( image, complete, false, jobid );
-            };
-
-            jobid = window.setTimeout( function(){
-                finishLoadingImage( image, complete, false, jobid );
-            }, this.timeout );
-
-            loading   = true;
-            image.src = src;
-        }
-
-        return loading;
-    },
-
-    /**
-     * Returns whether rotation is supported or not.
-     * @method
-     * @return {Boolean} True if rotation is supported.
-     */
-    canRotate: function() {
-        return this.useCanvas;
-    }
-};
-
-/**
- * @private
- * @inner
- */
- function addOverlayFromConfiguration( drawer, overlay ){
-
-    var element  = null,
-        rect = ( overlay.height && overlay.width ) ? new $.Rect(
-            overlay.x || overlay.px,
-            overlay.y || overlay.py,
-            overlay.width,
-            overlay.height
-        ) : new $.Point(
-            overlay.x || overlay.px,
-            overlay.y || overlay.py
-        ),
-        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"
-    );
-
-
-    if(overlay.px !== undefined){
-        //if they specified 'px' so it's in pixel coordinates so
-        //we need to translate to viewport coordinates
-        rect = drawer.viewport.imageToViewportRectangle( rect );
-    }
-    
-    if( overlay.placement ){
-        return new $.Overlay({
-            element: element,
-            location: drawer.viewport.pointFromPixel(rect),
-            placement: $.OverlayPlacement[overlay.placement.toUpperCase()],
-            onDraw: overlay.onDraw
-        });
-    }else{
-        return new $.Overlay({
-            element: element,
-            location: rect,
-            onDraw: overlay.onDraw
-        });
-    }
-
-}
-
-/**
- * @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.
- */
-function updateViewport( drawer ) {
-
-    drawer.updateAgain = false;
-
-    if( drawer.viewer ){
-        /**
-         * <em>- Needs documentation -</em>
-         *
-         * @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.
-         */
-        drawer.viewer.raiseEvent( 'update-viewport', {} );
-    }
-
-    var tile,
-        level,
-        best            = null,
-        haveDrawn       = false,
-        currentTime     = $.now(),
-        viewportSize    = drawer.viewport.getContainerSize(),
-        viewportBounds  = drawer.viewport.getBounds( true ),
-        viewportTL      = viewportBounds.getTopLeft(),
-        viewportBR      = viewportBounds.getBottomRight(),
-        zeroRatioC      = drawer.viewport.deltaPixelsFromPoints(
-            drawer.source.getPixelRatio( 0 ),
-            true
-        ).x,
-        lowestLevel     = Math.max(
-            drawer.source.minLevel,
-            Math.floor(
-                Math.log( drawer.minZoomImageRatio ) /
-                Math.log( 2 )
-            )
-        ),
-        highestLevel    = Math.min(
-            Math.abs(drawer.source.maxLevel),
-            Math.abs(Math.floor(
-                Math.log( zeroRatioC / drawer.minPixelRatio ) /
-                Math.log( 2 )
-            ))
-        ),
-        degrees         = drawer.viewport.degrees,
-        renderPixelRatioC,
-        renderPixelRatioT,
-        zeroRatioT,
-        optimalRatio,
-        levelOpacity,
-        levelVisibility;
-
-    //TODO
-    while ( drawer.lastDrawn.length > 0 ) {
-        tile = drawer.lastDrawn.pop();
-        tile.beingDrawn = false;
-    }
-
-    //TODO
-    drawer.canvas.innerHTML   = "";
-    if ( drawer.useCanvas ) {
-        if( drawer.canvas.width  != viewportSize.x ||
-            drawer.canvas.height != viewportSize.y ){
-            drawer.canvas.width  = viewportSize.x;
-            drawer.canvas.height = viewportSize.y;
-        }
-        drawer.context.clearRect( 0, 0, viewportSize.x, viewportSize.y );
-    }
-
-    //Change bounds for rotation
-    if (degrees === 90 || degrees === 270) {
-        var rotatedBounds = viewportBounds.rotate( degrees );
-        viewportTL = rotatedBounds.getTopLeft();
-        viewportBR = rotatedBounds.getBottomRight();
-    }
-
-    //Don't draw if completely outside of the viewport
-    if  ( !drawer.wrapHorizontal &&
-        ( viewportBR.x < 0 || viewportTL.x > 1 ) ) {
-        return;
-    } else if
-        ( !drawer.wrapVertical &&
-        ( viewportBR.y < 0 || viewportTL.y > drawer.normHeight ) ) {
-        return;
-    }
-
-    //TODO
-    if ( !drawer.wrapHorizontal ) {
-        viewportTL.x = Math.max( viewportTL.x, 0 );
-        viewportBR.x = Math.min( viewportBR.x, 1 );
-    }
-    if ( !drawer.wrapVertical ) {
-        viewportTL.y = Math.max( viewportTL.y, 0 );
-        viewportBR.y = Math.min( viewportBR.y, drawer.normHeight );
-    }
-
-    //TODO
-    lowestLevel = Math.min( lowestLevel, highestLevel );
-
-    //TODO
-    var drawLevel; // FIXME: drawLevel should have a more explanatory name
-    for ( level = highestLevel; level >= lowestLevel; level-- ) {
-        drawLevel = false;
-
-        //Avoid calculations for draw if we have already drawn this
-        renderPixelRatioC = drawer.viewport.deltaPixelsFromPoints(
-            drawer.source.getPixelRatio( level ),
-            true
-        ).x;
-
-        if ( ( !haveDrawn && renderPixelRatioC >= drawer.minPixelRatio ) ||
-             ( level == lowestLevel ) ) {
-            drawLevel = true;
-            haveDrawn = true;
-        } else if ( !haveDrawn ) {
-            continue;
-        }
-
-        //Perform calculations for draw if we haven't drawn this
-        renderPixelRatioT = drawer.viewport.deltaPixelsFromPoints(
-            drawer.source.getPixelRatio( level ),
-            false
-        ).x;
-
-        zeroRatioT      = drawer.viewport.deltaPixelsFromPoints(
-            drawer.source.getPixelRatio(
-                Math.max(
-                    drawer.source.getClosestLevel( drawer.viewport.containerSize ) - 1,
-                    0
-                )
-            ),
-            false
-        ).x;
-
-        optimalRatio    = drawer.immediateRender ?
-            1 :
-            zeroRatioT;
-
-        levelOpacity    = Math.min( 1, ( renderPixelRatioC - 0.5 ) / 0.5 );
-
-        levelVisibility = optimalRatio / Math.abs(
-            optimalRatio - renderPixelRatioT
-        );
-
-        //TODO
-        best = updateLevel(
-            drawer,
-            haveDrawn,
-            drawLevel,
-            level,
-            levelOpacity,
-            levelVisibility,
-            viewportTL,
-            viewportBR,
-            currentTime,
-            best
-        );
-
-        //TODO
-        if (  providesCoverage( drawer.coverage, level ) ) {
-            break;
-        }
-    }
-
-    //TODO
-    drawTiles( drawer, drawer.lastDrawn );
-    drawOverlays( drawer.viewport, drawer.overlays, drawer.container );
-
-    //TODO
-    if ( best ) {
-        loadTile( drawer, best, currentTime );
-        // because we haven't finished drawing, so
-        drawer.updateAgain = true;
-    }
-
-}
-
-
-function updateLevel( drawer, haveDrawn, drawLevel, level, levelOpacity, levelVisibility, viewportTL, viewportBR, currentTime, best ){
-
-    var x, y,
-        tileTL,
-        tileBR,
-        numberOfTiles,
-        viewportCenter  = drawer.viewport.pixelFromPoint( drawer.viewport.getCenter() );
-
-
-    if( drawer.viewer ){
-        /**
-         * <em>- Needs documentation -</em>
-         *
-         * @event update-level
-         * @memberof OpenSeadragon.Viewer
-         * @type {object}
-         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
-         * @property {Object} havedrawn
-         * @property {Object} level
-         * @property {Object} opacity
-         * @property {Object} visibility
-         * @property {Object} topleft
-         * @property {Object} bottomright
-         * @property {Object} currenttime
-         * @property {Object} best
-         * @property {?Object} userData - Arbitrary subscriber-defined object.
-         */
-        drawer.viewer.raiseEvent( 'update-level', {
-            havedrawn: haveDrawn,
-            level: level,
-            opacity: levelOpacity,
-            visibility: levelVisibility,
-            topleft: viewportTL,
-            bottomright: viewportBR,
-            currenttime: currentTime,
-            best: best
-        });
-    }
-
-    //OK, a new drawing so do your calculations
-    tileTL    = drawer.source.getTileAtPoint( level, viewportTL );
-    tileBR    = drawer.source.getTileAtPoint( level, viewportBR );
-    numberOfTiles  = drawer.source.getNumTiles( level );
-
-    resetCoverage( drawer.coverage, level );
-
-    if ( !drawer.wrapHorizontal ) {
-        tileBR.x = Math.min( tileBR.x, numberOfTiles.x - 1 );
-    }
-    if ( !drawer.wrapVertical ) {
-        tileBR.y = Math.min( tileBR.y, numberOfTiles.y - 1 );
-    }
-
-    for ( x = tileTL.x; x <= tileBR.x; x++ ) {
-        for ( y = tileTL.y; y <= tileBR.y; y++ ) {
-
-            best = updateTile(
-                drawer,
-                drawLevel,
-                haveDrawn,
-                x, y,
-                level,
-                levelOpacity,
-                levelVisibility,
-                viewportCenter,
-                numberOfTiles,
-                currentTime,
-                best
-            );
-
-        }
-    }
-
-    return best;
-}
-
-function updateTile( drawer, drawLevel, haveDrawn, x, y, level, levelOpacity, levelVisibility, viewportCenter, numberOfTiles, currentTime, best){
-
-    var tile = getTile(
-            x, y,
-            level,
-            drawer.source,
-            drawer.tilesMatrix,
-            currentTime,
-            numberOfTiles,
-            drawer.normHeight
-        ),
-        drawTile = drawLevel;
-
-    if( drawer.viewer ){
-        /**
-         * <em>- Needs documentation -</em>
-         *
-         * @event update-tile
-         * @memberof OpenSeadragon.Viewer
-         * @type {object}
-         * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
-         * @property {OpenSeadragon.Tile} tile
-         * @property {?Object} userData - Arbitrary subscriber-defined object.
-         */
-        drawer.viewer.raiseEvent( 'update-tile', {
-            tile: tile
-        });
-    }
-
-    setCoverage( drawer.coverage, level, x, y, false );
-
-    if ( !tile.exists ) {
-        return best;
-    }
-
-    if ( haveDrawn && !drawTile ) {
-        if ( isCovered( drawer.coverage, level, x, y ) ) {
-            setCoverage( drawer.coverage, level, x, y, true );
-        } else {
-            drawTile = true;
-        }
-    }
-
-    if ( !drawTile ) {
-        return best;
-    }
-
-    positionTile(
-        tile,
-        drawer.source.tileOverlap,
-        drawer.viewport,
-        viewportCenter,
-        levelVisibility
-    );
-
-    if ( tile.loaded ) {
-        var needsUpdate = blendTile(
-            drawer,
-            tile,
-            x, y,
-            level,
-            levelOpacity,
-            currentTime
-        );
-
-        if ( needsUpdate ) {
-            drawer.updateAgain = true;
-        }
-    } else if ( tile.loading ) {
-        // the tile is already in the download queue
-        // thanks josh1093 for finally translating this typo
-    } else {
-        best = compareTiles( best, tile );
-    }
-
-    return best;
-}
-
-function getTile( x, y, level, tileSource, tilesMatrix, time, numTiles, normHeight ) {
-    var xMod,
-        yMod,
-        bounds,
-        exists,
-        url,
-        tile;
-
-    if ( !tilesMatrix[ level ] ) {
-        tilesMatrix[ level ] = {};
-    }
-    if ( !tilesMatrix[ level ][ x ] ) {
-        tilesMatrix[ level ][ x ] = {};
-    }
-
-    if ( !tilesMatrix[ level ][ x ][ y ] ) {
-        xMod    = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x;
-        yMod    = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y;
-        bounds  = tileSource.getTileBounds( level, xMod, yMod );
-        exists  = tileSource.tileExists( level, xMod, yMod );
-        url     = tileSource.getTileUrl( level, xMod, yMod );
-
-        bounds.x += 1.0 * ( x - xMod ) / numTiles.x;
-        bounds.y += normHeight * ( y - yMod ) / numTiles.y;
-
-        tilesMatrix[ level ][ x ][ y ] = new $.Tile(
-            level,
-            x,
-            y,
-            bounds,
-            exists,
-            url
-        );
-    }
-
-    tile = tilesMatrix[ level ][ x ][ y ];
-    tile.lastTouchTime = time;
-
-    return tile;
-}
-
-
-function loadTile( drawer, tile, time ) {
-    if( drawer.viewport.collectionMode ){
-        drawer.midUpdate = false;
-        onTileLoad( drawer, tile, time );
-    } else {
-        tile.loading = drawer.loadImage(
-            tile.url,
-            function( image ){
-                onTileLoad( drawer, tile, time, image );
-            }
-        );
-    }
-}
-
-function onTileLoad( drawer, tile, time, image ) {
-    var insertionIndex,
-        cutoff,
-        worstTile,
-        worstTime,
-        worstLevel,
-        worstTileIndex,
-        prevTile,
-        prevTime,
-        prevLevel,
-        i;
-
-    tile.loading = false;
-
-    if ( drawer.midUpdate ) {
-        $.console.warn( "Tile load callback in middle of drawing routine." );
-        return;
-    } else if ( !image  && !drawer.viewport.collectionMode ) {
-        $.console.log( "Tile %s failed to load: %s", tile, tile.url );
-        if( !drawer.debugMode ){
-            tile.exists = false;
-            return;
-        }
-    } else if ( time < drawer.lastResetTime ) {
-        $.console.log( "Ignoring tile %s loaded before reset: %s", tile, tile.url );
-        return;
-    }
-
-    tile.loaded = true;
-    tile.image  = image;
-
-
-    insertionIndex = drawer.tilesLoaded.length;
-
-    if ( drawer.tilesLoaded.length >= drawer.maxImageCacheCount ) {
-        cutoff = Math.ceil( Math.log( drawer.source.tileSize ) / Math.log( 2 ) );
-
-        worstTile       = null;
-        worstTileIndex  = -1;
-
-        for ( i = drawer.tilesLoaded.length - 1; i >= 0; i-- ) {
-            prevTile = drawer.tilesLoaded[ i ];
-
-            if ( prevTile.level <= drawer.cutoff || prevTile.beingDrawn ) {
-                continue;
-            } else if ( !worstTile ) {
-                worstTile       = prevTile;
-                worstTileIndex  = i;
-                continue;
-            }
-
-            prevTime    = prevTile.lastTouchTime;
-            worstTime   = worstTile.lastTouchTime;
-            prevLevel   = prevTile.level;
-            worstLevel  = worstTile.level;
-
-            if ( prevTime < worstTime ||
-               ( prevTime == worstTime && prevLevel > worstLevel ) ) {
-                worstTile       = prevTile;
-                worstTileIndex  = i;
-            }
-        }
-
-        if ( worstTile && worstTileIndex >= 0 ) {
-            worstTile.unload();
-            insertionIndex = worstTileIndex;
-        }
-    }
-
-    drawer.tilesLoaded[ insertionIndex ] = tile;
-    drawer.updateAgain = true;
-}
-
-
-function positionTile( tile, overlap, viewport, viewportCenter, levelVisibility ){
-    var boundsTL     = tile.bounds.getTopLeft(),
-        boundsSize   = tile.bounds.getSize(),
-        positionC    = viewport.pixelFromPoint( boundsTL, true ),
-        positionT    = viewport.pixelFromPoint( boundsTL, false ),
-        sizeC        = viewport.deltaPixelsFromPoints( boundsSize, true ),
-        sizeT        = viewport.deltaPixelsFromPoints( boundsSize, false ),
-        tileCenter   = positionT.plus( sizeT.divide( 2 ) ),
-        tileDistance = viewportCenter.distanceTo( tileCenter );
-
-    if ( !overlap ) {
-        sizeC = sizeC.plus( new $.Point( 1, 1 ) );
-    }
-
-    tile.position   = positionC;
-    tile.size       = sizeC;
-    tile.distance   = tileDistance;
-    tile.visibility = levelVisibility;
-}
-
-
-function blendTile( drawer, tile, x, y, level, levelOpacity, currentTime ){
-    var blendTimeMillis = 1000 * drawer.blendTime,
-        deltaTime,
-        opacity;
-
-    if ( !tile.blendStart ) {
-        tile.blendStart = currentTime;
-    }
-
-    deltaTime   = currentTime - tile.blendStart;
-    opacity     = blendTimeMillis ? Math.min( 1, deltaTime / ( blendTimeMillis ) ) : 1;
-
-    if ( drawer.alwaysBlend ) {
-        opacity *= levelOpacity;
-    }
-
-    tile.opacity = opacity;
-
-    drawer.lastDrawn.push( tile );
-
-    if ( opacity == 1 ) {
-        setCoverage( drawer.coverage, level, x, y, true );
-    } else if ( deltaTime < blendTimeMillis ) {
-        return true;
-    }
-
-    return false;
-}
-
-
-function clearTiles( drawer ) {
-    drawer.tilesMatrix = {};
-    drawer.tilesLoaded = [];
-}
-
-/**
- * @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.
- */
-function providesCoverage( 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 ( rows.hasOwnProperty( i ) ) {
-                cols = rows[ i ];
-                for ( j in cols ) {
-                    if ( cols.hasOwnProperty( 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.
- */
-function isCovered( coverage, level, x, y ) {
-    if ( x === undefined || y === undefined ) {
-        return providesCoverage( coverage, level + 1 );
-    } else {
-        return (
-             providesCoverage( coverage, level + 1, 2 * x, 2 * y ) &&
-             providesCoverage( coverage, level + 1, 2 * x, 2 * y + 1 ) &&
-             providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y ) &&
-             providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y + 1 )
-        );
-    }
-}
-
-/**
- * @private
- * @inner
- * Sets whether the given tile provides coverage or not.
- */
-function setCoverage( 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.
- */
-function resetCoverage( coverage, level ) {
-    coverage[ level ] = {};
-}
-
-/**
- * @private
- * @inner
- * Determines the 'z-index' of the given overlay.  Overlays are ordered in
- * a z-index based on the order they are added to the Drawer.
- */
-function getOverlayIndex( overlays, element ) {
-    var i;
-    for ( i = overlays.length - 1; i >= 0; i-- ) {
-        if ( overlays[ i ].element == element ) {
-            return i;
-        }
-    }
-
-    return -1;
-}
-
-/**
- * @private
- * @inner
- * Determines whether the 'last best' tile for the area is better than the
- * tile in question.
- */
-function compareTiles( previousBest, tile ) {
-    if ( !previousBest ) {
-        return tile;
-    }
-
-    if ( tile.visibility > previousBest.visibility ) {
-        return tile;
-    } else if ( tile.visibility == previousBest.visibility ) {
-        if ( tile.distance < previousBest.distance ) {
-            return tile;
-        }
-    }
-
-    return previousBest;
-}
-
-function finishLoadingImage( image, callback, successful, jobid ){
-
-    image.onload = null;
-    image.onabort = null;
-    image.onerror = null;
-
-    if ( jobid ) {
-        window.clearTimeout( jobid );
-    }
-    $.requestAnimationFrame( function() {
-        callback( image.src, successful ? image : null);
-    });
-
-}
-
-
-function drawOverlays( viewport, overlays, container ){
-    var i,
-        length = overlays.length;
-    for ( i = 0; i < length; i++ ) {
-        drawOverlay( viewport, overlays[ i ], container );
-    }
-}
-
-function drawOverlay( viewport, overlay, container ){
-
-    overlay.position = viewport.pixelFromPoint(
-        overlay.bounds.getTopLeft(),
-        true
-    );
-    overlay.size     = viewport.deltaPixelsFromPoints(
-        overlay.bounds.getSize(),
-        true
-    );
-    overlay.drawHTML( container, viewport );
-}
-
-function drawTiles( drawer, lastDrawn ){
-    var i,
-        tile,
-        tileKey,
-        viewer,
-        viewport,
-        position,
-        tileSource,
-        collectionTileSource;
-
-    // We need a callback to give image manipulation a chance to happen
-    var drawingHandler = function(args) {
-        if (drawer.viewer) {
-          /**
-           * 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
-           * @property {?Object} userData - 'context', 'tile' and 'rendered'.
-           */
-            drawer.viewer.raiseEvent('tile-drawing', args);
-        }
-    };
-
-    for ( i = lastDrawn.length - 1; i >= 0; i-- ) {
-        tile = lastDrawn[ i ];
-
-        //We dont actually 'draw' a collection tile, rather its used to house
-        //an overlay which does the drawing in its own viewport
-        if( drawer.viewport.collectionMode ){
-
-            tileKey = tile.x + '/' + tile.y;
-            viewport = drawer.viewport;
-            collectionTileSource = viewport.collectionTileSource;
-
-            if( !drawer.collectionOverlays[ tileKey ] ){
-
-                position = collectionTileSource.layout == 'horizontal' ?
-                    tile.y + ( tile.x * collectionTileSource.rows ) :
-                    tile.x + ( tile.y * collectionTileSource.rows );
-
-                if (position < collectionTileSource.tileSources.length) {
-                    tileSource = collectionTileSource.tileSources[ position ];
-                } else {
-                    tileSource = null;
-                }
-
-                //$.console.log("Rendering collection tile %s | %s | %s", tile.y, tile.y, position);
-                if( tileSource ){
-                    drawer.collectionOverlays[ tileKey ] = viewer = new $.Viewer({
-                        hash:                   viewport.viewer.hash + "-" + tileKey,
-                        element:                $.makeNeutralElement( "div" ),
-                        mouseNavEnabled:        false,
-                        showNavigator:          false,
-                        showSequenceControl:    false,
-                        showNavigationControl:  false,
-                        tileSources: [
-                            tileSource
-                        ]
-                    });
-
-                    //TODO: IE seems to barf on this, not sure if its just the border
-                    //      but we probably need to clear this up with a better
-                    //      test of support for various css features
-                    if( SUBPIXEL_RENDERING ){
-                        viewer.element.style.border = '1px solid rgba(255,255,255,0.38)';
-                        viewer.element.style['-webkit-box-reflect'] =
-                            'below 0px -webkit-gradient('+
-                                'linear,left '+
-                                'top,left '+
-                                'bottom,from(transparent),color-stop(62%,transparent),to(rgba(255,255,255,0.62))'+
-                            ')';
-                    }
-
-                    drawer.addOverlay(
-                        viewer.element,
-                        tile.bounds
-                    );
-                }
-
-            }else{
-                viewer = drawer.collectionOverlays[ tileKey ];
-                if( viewer.viewport ){
-                    viewer.viewport.resize( tile.size, true );
-                    viewer.viewport.goHome( true );
-                }
-            }
-
-        } else {
-
-            if ( drawer.useCanvas ) {
-                // TODO do this in a more performant way
-                // specifically, don't save,rotate,restore every time we draw a tile
-                if( drawer.viewport.degrees !== 0 ) {
-                    offsetForRotation( tile, drawer.canvas, drawer.context, drawer.viewport.degrees );
-                    tile.drawCanvas( drawer.context, drawingHandler );
-                    restoreRotationChanges( tile, drawer.canvas, drawer.context );
-                } else {
-                    tile.drawCanvas( drawer.context, drawingHandler );
-                }
-            } else {
-                tile.drawHTML( drawer.canvas );
-            }
-
-
-            tile.beingDrawn = true;
-        }
-
-        if( drawer.debugMode ){
-            try{
-                drawDebugInfo( drawer, tile, lastDrawn.length, i );
-            }catch(e){
-                $.console.error(e);
-            }
-        }
-
-        if( drawer.viewer ){
-            /**
-             * <em>- Needs documentation -</em>
-             *
-             * @event tile-drawn
-             * @memberof OpenSeadragon.Viewer
-             * @type {object}
-             * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
-             * @property {OpenSeadragon.Tile} tile
-             * @property {?Object} userData - Arbitrary subscriber-defined object.
-             */
-            drawer.viewer.raiseEvent( 'tile-drawn', {
-                tile: tile
-            });
-        }
-    }
-}
-
-function offsetForRotation( tile, canvas, context, degrees ){
-    var cx = canvas.width / 2,
-        cy = canvas.height / 2,
-        px = tile.position.x - cx,
-        py = tile.position.y - cy;
-
-    context.save();
-
-    context.translate(cx, cy);
-    context.rotate( Math.PI / 180 * degrees);
-    tile.position.x = px;
-    tile.position.y = py;
-}
-
-function restoreRotationChanges( tile, canvas, context ){
-    var cx = canvas.width / 2,
-        cy = canvas.height / 2,
-        px = tile.position.x + cx,
-        py = tile.position.y + cy;
-
-    tile.position.x = px;
-    tile.position.y = py;
-
-    context.restore();
-}
-
-
-function drawDebugInfo( drawer, tile, count, i ){
-
-    if ( drawer.useCanvas ) {
-        drawer.context.save();
-        drawer.context.lineWidth = 2;
-        drawer.context.font = 'small-caps bold 13px ariel';
-        drawer.context.strokeStyle = drawer.debugGridColor;
-        drawer.context.fillStyle = drawer.debugGridColor;
-        drawer.context.strokeRect(
-            tile.position.x,
-            tile.position.y,
-            tile.size.x,
-            tile.size.y
-        );
-        if( tile.x === 0 && tile.y === 0 ){
-            drawer.context.fillText(
-                "Zoom: " + drawer.viewport.getZoom(),
-                tile.position.x,
-                tile.position.y - 30
-            );
-            drawer.context.fillText(
-                "Pan: " + drawer.viewport.getBounds().toString(),
-                tile.position.x,
-                tile.position.y - 20
-            );
-        }
-        drawer.context.fillText(
-            "Level: " + tile.level,
-            tile.position.x + 10,
-            tile.position.y + 20
-        );
-        drawer.context.fillText(
-            "Column: " + tile.x,
-            tile.position.x + 10,
-            tile.position.y + 30
-        );
-        drawer.context.fillText(
-            "Row: " + tile.y,
-            tile.position.x + 10,
-            tile.position.y + 40
-        );
-        drawer.context.fillText(
-            "Order: " + i + " of " + count,
-            tile.position.x + 10,
-            tile.position.y + 50
-        );
-        drawer.context.fillText(
-            "Size: " + tile.size.toString(),
-            tile.position.x + 10,
-            tile.position.y + 60
-        );
-        drawer.context.fillText(
-            "Position: " + tile.position.toString(),
-            tile.position.x + 10,
-            tile.position.y + 70
-        );
-        drawer.context.restore();
-    }
-}
-
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Viewport
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-2013 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
- * @classdesc Handles coordinate-related functionality (zoom, pan, rotation, etc.) for an {@link OpenSeadragon.Viewer}.
- * A new instance is created for each TileSource opened (see {@link OpenSeadragon.Viewer#viewport}).
- *
- * @memberof OpenSeadragon
- */
-$.Viewport = function( options ) {
-
-    //backward compatibility for positional args while prefering 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;
-    }
-
-    $.extend( true, this, {
-
-        //required settings
-        containerSize:      null,
-        contentSize:        null,
-
-        //internal state properties
-        zoomPoint:          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,
-        degrees:            $.DEFAULT_SETTINGS.degrees
-
-    }, options );
-
-    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({
-        initial: 1,
-        springStiffness: this.springStiffness,
-        animationTime:   this.animationTime
-    });
-
-    this.resetContentSize( this.contentSize );
-    this.goHome( true );
-    this.update();
-};
-
-$.Viewport.prototype = /** @lends OpenSeadragon.Viewport.prototype */{
-
-    /**
-     * @function
-     * @return {OpenSeadragon.Viewport} Chainable.
-     * @fires OpenSeadragon.Viewer.event:reset-size
-     */
-    resetContentSize: function( contentSize ){
-        this.contentSize    = contentSize;
-        this.contentAspectX = this.contentSize.x / this.contentSize.y;
-        this.contentAspectY = this.contentSize.y / this.contentSize.x;
-        this.fitWidthBounds = new $.Rect( 0, 0, 1, this.contentAspectY );
-        this.fitHeightBounds = new $.Rect( 0, 0, this.contentAspectY, this.contentAspectY);
-
-        this.homeBounds = new $.Rect( 0, 0, 1, this.contentAspectY );
-
-        if( this.viewer ){
-            /**
-             * Raised when the viewer's content size is 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 {?Object} userData - Arbitrary subscriber-defined object.
-             */
-            this.viewer.raiseEvent( 'reset-size', {
-                contentSize: contentSize
-            });
-        }
-
-        return this;
-    },
-
-    /**
-     * @function
-     */
-    getHomeZoom: function() {
-        var aspectFactor =
-            this.contentAspectX / this.getAspectRatio();
-
-        if( this.defaultZoomLevel ){
-            return this.defaultZoomLevel;
-        } else {
-            return ( aspectFactor >= 1 ) ?
-                1 :
-                aspectFactor;
-        }
-    },
-
-    /**
-     * @function
-     */
-    getHomeBounds: function() {
-        var center = this.homeBounds.getCenter( ),
-            width  = 1.0 / this.getHomeZoom( ),
-            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 Math.min( zoom, homeZoom );
-    },
-
-    /**
-     * @function
-     */
-    getMaxZoom: function() {
-        var zoom = this.maxZoomLevel ?
-            this.maxZoomLevel :
-                ( this.contentSize.x * this.maxZoomPixelRatio / this.containerSize.x );
-
-        return Math.max( zoom, this.getHomeZoom() );
-    },
-
-    /**
-     * @function
-     */
-    getAspectRatio: function() {
-        return this.containerSize.x / this.containerSize.y;
-    },
-
-    /**
-     * @function
-     */
-    getContainerSize: function() {
-        return new $.Point(
-            this.containerSize.x,
-            this.containerSize.y
-        );
-    },
-
-    /**
-     * @function
-     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
-     */
-    getBounds: function( current ) {
-        var center = this.getCenter( current ),
-            width  = 1.0 / this.getZoom( current ),
-            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).
-     */
-    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.zoomPoint.minus(
-            bounds.getTopLeft()
-        ).times(
-            this.containerSize.x / bounds.width
-        );
-        deltaZoomPixels = newZoomPixel.minus( oldZoomPixel );
-        deltaZoomPoints = deltaZoomPixels.divide( this.containerSize.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;
-        }
-    },
-
-    /**
-     * @function
-     * @return {OpenSeadragon.Viewport} Chainable.
-     * @fires OpenSeadragon.Viewer.event:constrain
-     */
-    applyConstraints: function( immediately ) {
-        var actualZoom = this.getZoom(),
-            constrainedZoom = Math.max(
-                Math.min( actualZoom, this.getMaxZoom() ),
-                this.getMinZoom()
-            ),
-            bounds,
-            horizontalThreshold,
-            verticalThreshold,
-            left,
-            right,
-            top,
-            bottom,
-            dx = 0,
-            dy = 0;
-
-        if ( actualZoom != constrainedZoom ) {
-            this.zoomTo( constrainedZoom, this.zoomPoint, immediately );
-        }
-
-        bounds = this.getBounds();
-
-        horizontalThreshold = this.visibilityRatio * bounds.width;
-        verticalThreshold   = this.visibilityRatio * bounds.height;
-
-        left   = bounds.x + bounds.width;
-        right  = 1 - bounds.x;
-        top    = bounds.y + bounds.height;
-        bottom = this.contentAspectY - bounds.y;
-
-        if ( this.wrapHorizontal ) {
-            //do nothing
-        } else {
-            if ( left < horizontalThreshold ) {
-                dx = horizontalThreshold - left;
-            }
-            if ( right < horizontalThreshold ) {
-                dx = dx ?
-                    ( dx + right - horizontalThreshold ) / 2 :
-                    ( right - horizontalThreshold );
-            }
-        }
-
-        if ( this.wrapVertical ) {
-            //do nothing
-        } else {
-            if ( top < verticalThreshold ) {
-                dy = ( verticalThreshold - top );
-            }
-            if ( bottom < verticalThreshold ) {
-                dy =  dy ?
-                    ( dy + bottom - verticalThreshold ) / 2 :
-                    ( bottom - verticalThreshold );
-            }
-        }
-
-        if ( dx || dy || immediately ) {
-            bounds.x += dx;
-            bounds.y += dy;
-            if( bounds.width > 1  ){
-                bounds.x = 0.5 - bounds.width/2;
-            }
-            if( bounds.height > this.contentAspectY ){
-                bounds.y = this.contentAspectY/2 - bounds.height/2;
-            }
-            this.fitBounds( bounds, 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
-             * @property {?Object} userData - Arbitrary subscriber-defined object.
-             */
-            this.viewer.raiseEvent( 'constrain', {
-                immediately: immediately
-            });
-        }
-
-        return this;
-    },
-
-    /**
-     * @function
-     * @param {Boolean} immediately
-     */
-    ensureVisible: function( immediately ) {
-        return this.applyConstraints( immediately );
-    },
-
-    /**
-     * @function
-     * @param {OpenSeadragon.Rect} bounds
-     * @param {Boolean} immediately
-     * @return {OpenSeadragon.Viewport} Chainable.
-     */
-    fitBounds: function( bounds, immediately ) {
-        var aspect = this.getAspectRatio(),
-            center = bounds.getCenter(),
-            newBounds = new $.Rect(
-                bounds.x,
-                bounds.y,
-                bounds.width,
-                bounds.height
-            ),
-            oldBounds,
-            oldZoom,
-            newZoom,
-            referencePoint;
-
-        if ( newBounds.getAspectRatio() >= aspect ) {
-            newBounds.height = bounds.width / aspect;
-            newBounds.y      = center.y - newBounds.height / 2;
-        } else {
-            newBounds.width = bounds.height * aspect;
-            newBounds.x     = center.x - newBounds.width / 2;
-        }
-
-        this.panTo( this.getCenter( true ), true );
-        this.zoomTo( this.getZoom( true ), null, true );
-
-        oldBounds = this.getBounds();
-        oldZoom   = this.getZoom();
-        newZoom   = 1.0 / newBounds.width;
-        if ( newZoom == oldZoom || newBounds.width == oldBounds.width ) {
-            return this.panTo( center, immediately );
-        }
-
-        referencePoint = oldBounds.getTopLeft().times(
-            this.containerSize.x / oldBounds.width
-        ).minus(
-            newBounds.getTopLeft().times(
-                this.containerSize.x / newBounds.width
-            )
-        ).divide(
-            this.containerSize.x / oldBounds.width -
-            this.containerSize.x / newBounds.width
-        );
-
-        return this.zoomTo( newZoom, referencePoint, immediately );
-    },
-
-
-    /**
-     * @function
-     * @param {Boolean} immediately
-     * @return {OpenSeadragon.Viewport} Chainable.
-     */
-    fitVertically: function( immediately ) {
-        var center = this.getCenter();
-
-        if ( this.wrapHorizontal ) {
-            center.x = ( 1 + ( center.x % 1 ) ) % 1;
-            this.centerSpringX.resetTo( center.x );
-            this.centerSpringX.update();
-        }
-
-        if ( this.wrapVertical ) {
-            center.y = (
-                this.contentAspectY + ( center.y % this.contentAspectY )
-            ) % this.contentAspectY;
-            this.centerSpringY.resetTo( center.y );
-            this.centerSpringY.update();
-        }
-
-        return this.fitBounds( this.fitHeightBounds, immediately );
-    },
-
-    /**
-     * @function
-     * @param {Boolean} immediately
-     * @return {OpenSeadragon.Viewport} Chainable.
-     */
-    fitHorizontally: function( immediately ) {
-        var center = this.getCenter();
-
-        if ( this.wrapHorizontal ) {
-            center.x = (
-                this.contentAspectX + ( center.x % this.contentAspectX )
-            ) % this.contentAspectX;
-            this.centerSpringX.resetTo( center.x );
-            this.centerSpringX.update();
-        }
-
-        if ( this.wrapVertical ) {
-            center.y = ( 1 + ( center.y % 1 ) ) % 1;
-            this.centerSpringY.resetTo( center.y );
-            this.centerSpringY.update();
-        }
-
-        return this.fitBounds( this.fitWidthBounds, immediately );
-    },
-
-
-    /**
-     * @function
-     * @param {OpenSeadragon.Point} delta
-     * @param {Boolean} immediately
-     * @return {OpenSeadragon.Viewport} Chainable.
-     * @fires OpenSeadragon.Viewer.event:pan
-     */
-    panBy: function( delta, immediately ) {
-        var center = new $.Point(
-            this.centerSpringX.target.value,
-            this.centerSpringY.target.value
-        );
-        delta = delta.rotate( -this.degrees, new $.Point( 0, 0 ) );
-        return this.panTo( center.plus( delta ), immediately );
-    },
-
-    /**
-     * @function
-     * @param {OpenSeadragon.Point} center
-     * @param {Boolean} immediately
-     * @return {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
-     * @return {OpenSeadragon.Viewport} Chainable.
-     * @fires OpenSeadragon.Viewer.event:zoom
-     */
-    zoomBy: function( factor, refPoint, immediately ) {
-        if( refPoint instanceof $.Point && !isNaN( refPoint.x ) && !isNaN( refPoint.y ) ) {
-            refPoint = refPoint.rotate(
-                -this.degrees,
-                new $.Point( this.centerSpringX.target.value, this.centerSpringY.target.value )
-            );
-        }
-        return this.zoomTo( this.zoomSpring.target.value * factor, refPoint, immediately );
-    },
-
-    /**
-     * @function
-     * @return {OpenSeadragon.Viewport} Chainable.
-     * @fires OpenSeadragon.Viewer.event:zoom
-     */
-    zoomTo: function( zoom, refPoint, immediately ) {
-
-        this.zoomPoint = refPoint instanceof $.Point &&
-            !isNaN(refPoint.x) &&
-            !isNaN(refPoint.y) ?
-            refPoint :
-            null;
-
-        if ( immediately ) {
-            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;
-    },
-
-    /**
-     * Currently only 90 degree rotation is supported and it only works
-     * with the canvas. Additionally, the navigator does not rotate yet,
-     * debug mode doesn't rotate yet, and overlay rotation is only
-     * partially supported.
-     * @function
-     * @return {OpenSeadragon.Viewport} Chainable.
-     */
-    setRotation: function( degrees ) {
-        if( !( this.viewer && this.viewer.drawer.canRotate() ) ) {
-            return this;
-        }
-
-        degrees = ( degrees + 360 ) % 360;
-        if( degrees % 90 !== 0 ) {
-            throw new Error('Currently only 0, 90, 180, and 270 degrees are supported.');
-        }
-        this.degrees = degrees;
-        this.viewer.drawer.update();
-        
-        return this;
-    },
-
-    /**
-     * Gets the current rotation in degrees.
-     * @function
-     * @return {Number} The current rotation in degrees.
-     */
-    getRotation: function() {
-        return this.degrees;
-    },
-
-    /**
-     * @function
-     * @return {OpenSeadragon.Viewport} Chainable.
-     * @fires OpenSeadragon.Viewer.event:resize
-     */
-    resize: function( newContainerSize, maintain ) {
-        var oldBounds = this.getBounds(),
-            newBounds = oldBounds,
-            widthDeltaFactor;
-
-        this.containerSize = new $.Point(
-            newContainerSize.x,
-            newContainerSize.y
-        );
-
-        if ( maintain ) {
-            widthDeltaFactor = newContainerSize.x / this.containerSize.x;
-            newBounds.width  = oldBounds.width * widthDeltaFactor;
-            newBounds.height = newBounds.width / this.getAspectRatio();
-        }
-
-        if( this.viewer ){
-            /**
-             * Raised when the viewer is resized (see {@link OpenSeadragon.Viewport#resize}).
-             *
-             * @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
-            });
-        }
-
-        return this.fitBounds( newBounds, true );
-    },
-
-    /**
-     * @function
-     */
-    update: function() {
-        var oldCenterX = this.centerSpringX.current.value,
-            oldCenterY = this.centerSpringY.current.value,
-            oldZoom    = this.zoomSpring.current.value,
-            oldZoomPixel,
-            newZoomPixel,
-            deltaZoomPixels,
-            deltaZoomPoints;
-
-        if (this.zoomPoint) {
-            oldZoomPixel = this.pixelFromPoint( this.zoomPoint, true );
-        }
-
-        this.zoomSpring.update();
-
-        if (this.zoomPoint && this.zoomSpring.current.value != oldZoom) {
-            newZoomPixel    = this.pixelFromPoint( this.zoomPoint, true );
-            deltaZoomPixels = newZoomPixel.minus( oldZoomPixel );
-            deltaZoomPoints = this.deltaPointsFromPixels( deltaZoomPixels, true );
-
-            this.centerSpringX.shiftBy( deltaZoomPoints.x );
-            this.centerSpringY.shiftBy( deltaZoomPoints.y );
-        } else {
-            this.zoomPoint = null;
-        }
-
-        this.centerSpringX.update();
-        this.centerSpringY.update();
-
-        return this.centerSpringX.current.value != oldCenterX ||
-            this.centerSpringY.current.value != oldCenterY ||
-            this.zoomSpring.current.value != oldZoom;
-    },
-
-
-    /**
-     * Convert a delta (translation vector) from pixels coordinates to viewport coordinates
-     * @function
-     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
-     */
-    deltaPixelsFromPoints: function( deltaPoints, current ) {
-        return deltaPoints.times(
-            this.containerSize.x * this.getZoom( current )
-        );
-    },
-
-    /**
-     * Convert a delta (translation vector) from viewport coordinates to pixels coordinates.
-     * @function
-     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
-     */
-    deltaPointsFromPixels: function( deltaPixels, current ) {
-        return deltaPixels.divide(
-            this.containerSize.x * this.getZoom( current )
-        );
-    },
-
-    /**
-     * Convert image pixel coordinates to viewport coordinates.
-     * @function
-     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
-     */
-    pixelFromPoint: function( point, current ) {
-        var bounds = this.getBounds( current );
-        return point.minus(
-            bounds.getTopLeft()
-        ).times(
-            this.containerSize.x / bounds.width
-        );
-    },
-
-    /**
-     * Convert viewport coordinates to image pixel coordinates.
-     * @function
-     * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
-     */
-    pointFromPixel: function( pixel, current ) {
-        var bounds = this.getBounds( current );
-        return pixel.divide(
-            this.containerSize.x / bounds.width
-        ).plus(
-            bounds.getTopLeft()
-        );
-    },
-
-    /**
-     * 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
-     * @function
-     * @param {OpenSeadragon.Point} viewerX the point in viewport coordinate system.
-     * @param {Number} viewerX X coordinate in viewport coordinate system.
-     * @param {Number} viewerY Y coordinate in viewport coordinate system.
-     * @return {OpenSeadragon.Point} a point representing the coordinates in the image.
-     */
-    viewportToImageCoordinates: function( viewerX, viewerY ) {
-        if ( arguments.length == 1 ) {
-            //they passed a point instead of individual components
-            return this.viewportToImageCoordinates( viewerX.x, viewerX.y );
-        }
-        return new $.Point( viewerX * this.contentSize.x, viewerY * this.contentSize.y * this.contentAspectX );
-    },
-
-    /**
-     * 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
-     * @function
-     * @param {OpenSeadragon.Point} imageX the point in image coordinate system.
-     * @param {Number} imageX X coordinate in image coordinate system.
-     * @param {Number} imageY Y coordinate in image coordinate system.
-     * @return {OpenSeadragon.Point} a point representing the coordinates in the viewport.
-     */
-    imageToViewportCoordinates: function( imageX, imageY ) {
-        if ( arguments.length == 1 ) {
-            //they passed a point instead of individual components
-            return this.imageToViewportCoordinates( imageX.x, imageX.y );
-        }
-        return new $.Point( imageX / this.contentSize.x, imageY / this.contentSize.y / this.contentAspectX );
-    },
-
-    /**
-     * 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
-     * @function
-     * @param {OpenSeadragon.Rect} imageX the rectangle in image coordinate system.
-     * @param {Number} imageX 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.
-     */
-    imageToViewportRectangle: function( imageX, imageY, pixelWidth, pixelHeight ) {
-        var coordA,
-            coordB,
-            rect;
-        if( arguments.length == 1 ) {
-            //they passed a rectangle instead of individual components
-            rect = imageX;
-            return this.imageToViewportRectangle(
-                rect.x, rect.y, rect.width, rect.height
-            );
-        }
-        coordA = this.imageToViewportCoordinates(
-            imageX, imageY
-        );
-        coordB = this.imageToViewportCoordinates(
-            pixelWidth, pixelHeight
-        );
-        return new $.Rect(
-            coordA.x,
-            coordA.y,
-            coordB.x,
-            coordB.y
-        );
-    },
-
-    /**
-     * 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
-     * @function
-     * @param {OpenSeadragon.Rect} viewerX the rectangle in viewport coordinate system.
-     * @param {Number} viewerX the X coordinate of the top left corner of the rectangle
-     * in viewport coordinate system.
-     * @param {Number} imageY 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 coordA,
-            coordB,
-            rect;
-        if ( arguments.length == 1 ) {
-            //they passed a rectangle instead of individual components
-            rect = viewerX;
-            return this.viewportToImageRectangle(
-                rect.x, rect.y, rect.width, rect.height
-            );
-        }
-        coordA = this.viewportToImageCoordinates( viewerX, viewerY );
-        coordB = this.viewportToImageCoordinates( pointWidth, pointHeight );
-        return new $.Rect(
-            coordA.x,
-            coordA.y,
-            coordB.x,
-            coordB.y
-        );
-    },
-
-    /**
-     * Convert pixel coordinates relative to the viewer element to image
-     * coordinates.
-     * @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.
-     * @param {OpenSeadragon.Point} point
-     * @returns {OpenSeadragon.Point}
-     */
-    imageToViewerElementCoordinates: function( point ) {
-        var pixel = this.pixelFromPoint( point, true );
-        return this.imageToViewportCoordinates( pixel );
-    },
-
-    /**
-     * 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 ));
-    },
-
-    /**
-     * 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 pixel coordinates relative to the window to viewport coordinates.
-     * @param {OpenSeadragon.Point} pixel
-     * @returns {OpenSeadragon.Point}
-     */
-    windowToViewportCoordinates: function( pixel ) {
-        var viewerCoordinates = pixel.minus(
-                OpenSeadragon.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 ) {
-        var viewerCoordinates = this.viewportToViewerElementCoordinates( point );
-        return viewerCoordinates.plus(
-                OpenSeadragon.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...
-     * @function
-     * @param {Number} viewportZoom The viewport zoom
-     * target zoom.
-     * @returns {Number} imageZoom The image zoom
-     */
-    viewportToImageZoom: function( viewportZoom ) {
-        var imageWidth = this.viewer.source.dimensions.x;
-        var containerWidth = this.getContainerSize().x;
-        var viewportToImageZoomRatio = containerWidth / imageWidth;
-        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...
-     * @function
-     * @param {Number} imageZoom The image zoom
-     * target zoom.
-     * @returns {Number} viewportZoom The viewport zoom
-     */
-    imageToViewportZoom: function( imageZoom ) {
-        var imageWidth = this.viewer.source.dimensions.x;
-        var containerWidth = this.getContainerSize().x;
-        var viewportToImageZoomRatio = imageWidth / containerWidth;
-        return imageZoom * viewportToImageZoomRatio;
-    }
-};
-
-}( OpenSeadragon ));
diff --git a/components/static/js/openseadragon/openseadragon.min.js b/components/static/js/openseadragon/openseadragon.min.js
deleted file mode 100755
index 00ffb0ad..00000000
--- a/components/static/js/openseadragon/openseadragon.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-//! OpenSeadragon 1.0.0
-//! Built on 2014-03-11
-//! Git commit: v1.0.0-58-g13fa798
-//! http://openseadragon.github.io
-//! License: http://openseadragon.github.io/license/
-window.OpenSeadragon=window.OpenSeadragon||function(a){return new OpenSeadragon.Viewer(a)},function(a){a.version={versionStr:"1.0.0",major:1,minor:0,revision:0};var b={"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regexp","[object Object]":"object"},c=Object.prototype.toString,d=Object.prototype.hasOwnProperty;a.isFunction=function(b){return"function"===a.type(b)},a.isArray=Array.isArray||function(b){return"array"===a.type(b)},a.isWindow=function(a){return a&&"object"==typeof a&&"setInterval"in a},a.type=function(a){return null===a||void 0===a?String(a):b[c.call(a)]||"object"},a.isPlainObject=function(b){if(!b||"object"!==OpenSeadragon.type(b)||b.nodeType||a.isWindow(b))return!1;if(b.constructor&&!d.call(b,"constructor")&&!d.call(b.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in b);return void 0===c||d.call(b,c)},a.isEmptyObject=function(a){for(var b in a)return!1;return!0},a.supportsCanvas=function(){var b=document.createElement("canvas");return!(!a.isFunction(b.getContext)||!b.getContext("2d"))}()}(OpenSeadragon),function(a){function b(a,b){return b&&a!=document.body?document.body:a.offsetParent}a.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=arguments.length,i=!1,j=1;for("boolean"==typeof g&&(i=g,g=arguments[1]||{},j=2),"object"==typeof g||OpenSeadragon.isFunction(g)||(g={}),h===j&&(g=this,--j);h>j;j++)if(a=arguments[j],null!==a||void 0!==a)for(b in a)c=g[b],d=a[b],g!==d&&(i&&d&&(OpenSeadragon.isPlainObject(d)||(e=OpenSeadragon.isArray(d)))?(e?(e=!1,f=c&&OpenSeadragon.isArray(c)?c:[]):f=c&&OpenSeadragon.isPlainObject(c)?c:{},g[b]=OpenSeadragon.extend(i,f,d)):void 0!==d&&(g[b]=d));return g},a.extend(a,{DEFAULT_SETTINGS:{xmlPath:null,tileSources:null,tileHost:null,initialPage:0,panHorizontal:!0,panVertical:!0,constrainDuringPan:!1,wrapHorizontal:!1,wrapVertical:!1,visibilityRatio:.5,minPixelRatio:.5,defaultZoomLevel:0,minZoomLevel:null,maxZoomLevel:null,springStiffness:7,clickTimeThreshold:300,clickDistThreshold:5,zoomPerClick:2,zoomPerScroll:1.2,zoomPerSecond:1,animationTime:1.2,blendTime:0,alwaysBlend:!1,autoHideControls:!0,immediateRender:!1,minZoomImageRatio:.9,maxZoomPixelRatio:1.1,pixelsPerWheelLine:40,autoResize:!0,showSequenceControl:!0,sequenceControlAnchor:null,preserveViewport:!1,showNavigationControl:!0,navigationControlAnchor:null,controlsFadeDelay:2e3,controlsFadeLength:1500,mouseNavEnabled:!0,showNavigator:!1,navigatorId:null,navigatorPosition:null,navigatorSizeRatio:.2,navigatorMaintainSizeRatio:!1,navigatorTop:null,navigatorLeft:null,navigatorHeight:null,navigatorWidth:null,navigatorAutoResize:!0,degrees:0,showReferenceStrip:!1,referenceStripScroll:"horizontal",referenceStripElement:null,referenceStripHeight:null,referenceStripWidth:null,referenceStripPosition:"BOTTOM_LEFT",referenceStripSizeRatio:.2,collectionRows:3,collectionLayout:"horizontal",collectionMode:!1,collectionTileSize:800,imageLoaderLimit:0,maxImageCacheCount:200,timeout:3e4,useCanvas:!0,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"},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"}},navPrevNextWrap:!1,showRotationControl:!1,debugMode:!1,debugGridColor:"#437AB2"},SIGNAL:"----seadragon----",delegate:function(a,b){return function(){var c=arguments;return void 0===c&&(c=[]),b.apply(a,c)}},BROWSERS:{UNKNOWN:0,IE:1,FIREFOX:2,SAFARI:3,CHROME:4,OPERA:5},getElement:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a},getElementPosition:function(c){var d,e,f=new a.Point;for(c=a.getElement(c),d="fixed"==a.getElementStyle(c).position,e=b(c,d);e;)f.x+=c.offsetLeft,f.y+=c.offsetTop,d&&(f=f.plus(a.getPageScroll())),c=e,d="fixed"==a.getElementStyle(c).position,e=b(c,d);return f},getElementOffset:function(b){b=a.getElement(b);var c,d,e=b&&b.ownerDocument,f={top:0,left:0};return e?(c=e.documentElement,"undefined"!=typeof b.getBoundingClientRect&&(f=b.getBoundingClientRect()),d=e==e.window?e:9===e.nodeType?e.defaultView||e.parentWindow:!1,new a.Point(f.left+(d.pageXOffset||c.scrollLeft)-(c.clientLeft||0),f.top+(d.pageYOffset||c.scrollTop)-(c.clientTop||0))):new a.Point},getElementSize:function(b){return b=a.getElement(b),new a.Point(b.clientWidth,b.clientHeight)},getElementStyle:document.documentElement.currentStyle?function(b){return b=a.getElement(b),b.currentStyle}:function(b){return b=a.getElement(b),window.getComputedStyle(b,"")},getEvent:function(b){return a.getEvent=b?function(a){return a}:function(){return window.event},a.getEvent(b)},getMousePosition:function(b){if("number"==typeof b.pageX)a.getMousePosition=function(b){var c=new a.Point;return b=a.getEvent(b),c.x=b.pageX,c.y=b.pageY,c};else{if("number"!=typeof b.clientX)throw new Error("Unknown event mouse position, no known technique.");a.getMousePosition=function(b){var c=new a.Point;return b=a.getEvent(b),c.x=b.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,c.y=b.clientY+document.body.scrollTop+document.documentElement.scrollTop,c}}return a.getMousePosition(b)},getPageScroll:function(){var b=document.documentElement||{},c=document.body||{};if("number"==typeof window.pageXOffset)a.getPageScroll=function(){return new a.Point(window.pageXOffset,window.pageYOffset)};else if(c.scrollLeft||c.scrollTop)a.getPageScroll=function(){return new a.Point(document.body.scrollLeft,document.body.scrollTop)};else{if(!b.scrollLeft&&!b.scrollTop)return new a.Point(0,0);a.getPageScroll=function(){return new a.Point(document.documentElement.scrollLeft,document.documentElement.scrollTop)}}return a.getPageScroll()},setPageScroll:function(b){if("undefined"!=typeof window.scrollTo)a.setPageScroll=function(a){window.scrollTo(a.x,a.y)};else{var c=a.getPageScroll();if(c.x===b.x&&c.y===b.y)return;document.body.scrollLeft=b.x,document.body.scrollTop=b.y;var d=a.getPageScroll();if(d.x!==c.x&&d.y!==c.y)return void(a.setPageScroll=function(a){document.body.scrollLeft=a.x,document.body.scrollTop=a.y});if(document.documentElement.scrollLeft=b.x,document.documentElement.scrollTop=b.y,d=a.getPageScroll(),d.x!==c.x&&d.y!==c.y)return void(a.setPageScroll=function(a){document.documentElement.scrollLeft=a.x,document.documentElement.scrollTop=a.y});a.setPageScroll=function(){}}return a.setPageScroll(b)},getWindowSize:function(){var b=document.documentElement||{},c=document.body||{};if("number"==typeof window.innerWidth)a.getWindowSize=function(){return new a.Point(window.innerWidth,window.innerHeight)};else if(b.clientWidth||b.clientHeight)a.getWindowSize=function(){return new a.Point(document.documentElement.clientWidth,document.documentElement.clientHeight)};else{if(!c.clientWidth&&!c.clientHeight)throw new Error("Unknown window size, no known technique.");a.getWindowSize=function(){return new a.Point(document.body.clientWidth,document.body.clientHeight)}}return a.getWindowSize()},makeCenteredNode:function(b){b=a.getElement(b);var c=[a.makeNeutralElement("div"),a.makeNeutralElement("div"),a.makeNeutralElement("div")];return a.extend(c[0].style,{display:"table",height:"100%",width:"100%"}),a.extend(c[1].style,{display:"table-row"}),a.extend(c[2].style,{display:"table-cell",verticalAlign:"middle",textAlign:"center"}),c[0].appendChild(c[1]),c[1].appendChild(c[2]),c[2].appendChild(b),c[0]},makeNeutralElement:function(a){var b=document.createElement(a),c=b.style;return c.background="transparent none",c.border="none",c.margin="0px",c.padding="0px",c.position="static",b},now:function(){return a.now=Date.now?Date.now:function(){return(new Date).getTime()},a.now()},makeTransparentImage:function(b){return a.makeTransparentImage=function(b){var c=a.makeNeutralElement("img");return c.src=b,c},a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<7&&(a.makeTransparentImage=function(b){var c=a.makeNeutralElement("img"),d=null;return d=a.makeNeutralElement("span"),d.style.display="inline-block",c.onload=function(){d.style.width=d.style.width||c.width+"px",d.style.height=d.style.height||c.height+"px",c.onload=null,c=null},c.src=b,d.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+b+"', sizingMethod='scale')",d}),a.makeTransparentImage(b)},setElementOpacity:function(b,c,d){var e,f;b=a.getElement(b),d&&!a.Browser.alpha&&(c=Math.round(c)),a.Browser.opacity?b.style.opacity=1>c?c:"":1>c?(e=Math.round(100*c),f="alpha(opacity="+e+")",b.style.filter=f):b.style.filter=""},addClass:function(b,c){b=a.getElement(b),b.className?-1===(" "+b.className+" ").indexOf(" "+c+" ")&&(b.className+=" "+c):b.className=c},removeClass:function(b,c){var d,e,f=[];for(b=a.getElement(b),d=b.className.split(/\s+/),e=0;e<d.length;e++)d[e]&&d[e]!==c&&f.push(d[e]);b.className=f.join(" ")},addEvent:function(){if(window.addEventListener)return function(b,c,d,e){b=a.getElement(b),b.addEventListener(c,d,e)};if(window.attachEvent)return function(b,c,d,e){b=a.getElement(b),b.attachEvent("on"+c,d),e&&b.setCapture&&b.setCapture()};throw new Error("No known event model.")}(),removeEvent:function(){if(window.removeEventListener)return function(b,c,d,e){b=a.getElement(b),b.removeEventListener(c,d,e)};if(window.detachEvent)return function(b,c,d,e){b=a.getElement(b),b.detachEvent("on"+c,d),e&&b.releaseCapture&&b.releaseCapture()};throw new Error("No known event model.")}(),cancelEvent:function(b){b=a.getEvent(b),a.cancelEvent=b.preventDefault?function(a){a.preventDefault()}:function(b){b=a.getEvent(b),b.cancel=!0,b.returnValue=!1},a.cancelEvent(b)},stopEvent:function(b){b=a.getEvent(b),a.stopEvent=b.stopPropagation?function(a){a.stopPropagation()}:function(b){b=a.getEvent(b),b.cancelBubble=!0},a.stopEvent(b)},createCallback:function(a,b){var c,d=[];for(c=2;c<arguments.length;c++)d.push(arguments[c]);return function(){var c,e=d.concat([]);for(c=0;c<arguments.length;c++)e.push(arguments[c]);return b.apply(a,e)}},getUrlParameter:function(a){var b=e[a];return b?b:null},createAjaxRequest:function(){var b;if(window.XMLHttpRequest)a.createAjaxRequest=function(){return new XMLHttpRequest},b=new XMLHttpRequest;else if(window.ActiveXObject)for(var d=0;d<c.length;d++)try{b=new ActiveXObject(c[d]),a.createAjaxRequest=function(){return new ActiveXObject(c[d])};break}catch(e){continue}if(!b)throw new Error("Browser doesn't support XMLHttpRequest.");return b},makeAjaxRequest:function(b,c,d){var e=a.createAjaxRequest();if(!a.isFunction(c))throw new Error("makeAjaxRequest requires a success callback");e.onreadystatechange=function(){4==e.readyState&&(e.onreadystatechange=function(){},200==e.status?c(e):(a.console.log("AJAX request returned %s: %s",e.status,b),a.isFunction(d)&&d(e)))};try{e.open("GET",b,!0),e.send(null)}catch(f){var g=f.message,h=a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<10;h&&"undefined"!=typeof f.number&&-2147024891==f.number&&(g+="\nSee http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx#xdomain"),a.console.log("%s while making AJAX request: %s",f.name,g),e.onreadystatechange=function(){},a.isFunction(d)&&d(e,f)}},jsonp:function(b){var c,d=b.url,e=document.head||document.getElementsByTagName("head")[0]||document.documentElement,f=b.callbackName||"openseadragon"+a.now(),g=window[f],h="$1"+f+"$2",i=b.param||"callback",j=b.callback;d=d.replace(/(\=)\?(&|$)|\?\?/i,h),d+=(/\?/.test(d)?"&":"?")+i+"="+f,window[f]=function(b){if(g)window[f]=g;else try{delete window[f]}catch(c){}j&&a.isFunction(j)&&j(b)},c=document.createElement("script"),(void 0!==b.async||!1!==b.async)&&(c.async="async"),b.scriptCharset&&(c.charset=b.scriptCharset),c.src=d,c.onload=c.onreadystatechange=function(a,b){(b||!c.readyState||/loaded|complete/.test(c.readyState))&&(c.onload=c.onreadystatechange=null,e&&c.parentNode&&e.removeChild(c),c=void 0)},e.insertBefore(c,e.firstChild)},createFromDZI:function(){throw"OpenSeadragon.createFromDZI is deprecated, use Viewer.open."},parseXml:function(b){if(window.ActiveXObject)a.parseXml=function(a){var b=null;return b=new ActiveXObject("Microsoft.XMLDOM"),b.async=!1,b.loadXML(a),b};else{if(!window.DOMParser)throw new Error("Browser doesn't support XML DOM.");a.parseXml=function(a){var b,c=null;return b=new DOMParser,c=b.parseFromString(a,"text/xml")}}return a.parseXml(b)},imageFormatSupported:function(a){return a=a?a:"",!!d[a.toLowerCase()]}}),a.Browser={vendor:a.BROWSERS.UNKNOWN,version:0,alpha:!0};var c=["Msxml2.XMLHTTP","Msxml3.XMLHTTP","Microsoft.XMLHTTP"],d={bmp:!1,jpeg:!0,jpg:!0,png:!0,tif:!1,wdp:!1},e={};!function(){var b=(navigator.appName,navigator.appVersion),c=navigator.userAgent;switch(navigator.appName){case"Microsoft Internet Explorer":window.attachEvent&&window.ActiveXObject&&(a.Browser.vendor=a.BROWSERS.IE,a.Browser.version=parseFloat(c.substring(c.indexOf("MSIE")+5,c.indexOf(";",c.indexOf("MSIE")))));break;case"Netscape":window.addEventListener&&(c.indexOf("Firefox")>=0?(a.Browser.vendor=a.BROWSERS.FIREFOX,a.Browser.version=parseFloat(c.substring(c.indexOf("Firefox")+8))):c.indexOf("Safari")>=0&&(a.Browser.vendor=c.indexOf("Chrome")>=0?a.BROWSERS.CHROME:a.BROWSERS.SAFARI,a.Browser.version=parseFloat(c.substring(c.substring(0,c.indexOf("Safari")).lastIndexOf("/")+1,c.indexOf("Safari")))));break;case"Opera":a.Browser.vendor=a.BROWSERS.OPERA,a.Browser.version=parseFloat(b)}var d,f,g,h=window.location.search.substring(1),i=h.split("&");for(g=0;g<i.length;g++)d=i[g],f=d.indexOf("="),f>0&&(e[d.substring(0,f)]=decodeURIComponent(d.substring(f+1)));a.Browser.alpha=!(a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9||a.Browser.vendor==a.BROWSERS.CHROME&&a.Browser.version<2),a.Browser.opacity=!(a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9)}();var f=function(){};a.console=window.console||{log:f,debug:f,info:f,warn:f,error:f},function(b){var c=b.requestAnimationFrame||b.mozRequestAnimationFrame||b.webkitRequestAnimationFrame||b.msRequestAnimationFrame,d=b.cancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelAnimationFrame||b.msCancelAnimationFrame;if(c&&d)a.requestAnimationFrame=function(){return c.apply(b,arguments)},a.cancelAnimationFrame=function(){return d.apply(b,arguments)};else{var e,f=[],g=[],h=0;a.requestAnimationFrame=function(b){return f.push([++h,b]),e||(e=setInterval(function(){if(f.length){var b=a.now(),c=g;for(g=f,f=c;g.length;)g.shift()[1](b)}else clearInterval(e),e=void 0},20)),h},a.cancelAnimationFrame=function(a){var b,c;for(b=0,c=f.length;c>b;b+=1)if(f[b][0]===a)return void f.splice(b,1);for(b=0,c=g.length;c>b;b+=1)if(g[b][0]===a)return void g.splice(b,1)}}}(window),a._processDZIError=function(a){var b=a.getElementsByTagName("Message")[0],c=b.firstChild.nodeValue;throw new Error(c)}}(OpenSeadragon),function(a){var b={supportsFullScreen:!1,isFullScreen:function(){return!1},requestFullScreen:function(){},cancelFullScreen:function(){},fullScreenEventName:"",fullScreenErrorEventName:"",prefix:""},c="webkit moz o ms khtml".split(" ");if("undefined"!=typeof document.cancelFullScreen)b.supportsFullScreen=!0;else for(var d=0,e=c.length;e>d;d++)if(b.prefix=c[d],"undefined"!=typeof document[b.prefix+"CancelFullScreen"]){b.supportsFullScreen=!0;break}b.supportsFullScreen?(b.fullScreenEventName=b.prefix+"fullscreenchange",b.fullScreenErrorEventName=b.prefix+"fullscreenerror",b.isFullScreen=function(){switch(this.prefix){case"":return document.fullScreen;case"webkit":return document.webkitIsFullScreen;default:return document[this.prefix+"FullScreen"]}},b.requestFullScreen=function(a){return""===this.prefix?a.requestFullScreen():a[this.prefix+"RequestFullScreen"]()},b.cancelFullScreen=function(){return""===this.prefix?document.cancelFullScreen():document[this.prefix+"CancelFullScreen"]()}):"undefined"!=typeof window.ActiveXObject&&(b.requestFullScreen=function(){var a=new ActiveXObject("WScript.Shell");return null!==a&&a.SendKeys("{F11}"),!1},b.cancelFullScreen=b.requestFullScreen),a.extend(a,b)}(OpenSeadragon),function(a){a.EventSource=function(){this.events={}},a.EventSource.prototype={addHandler:function(b,c,d){var e=this.events[b];e||(this.events[b]=e=[]),c&&a.isFunction(c)&&(e[e.length]={handler:c,userData:d||null})},removeHandler:function(b,c){var d,e=this.events[b],f=[];if(e&&a.isArray(e)){for(d=0;d<e.length;d++)e[d].handler!==c&&f.push(e[d]);this.events[b]=f}},removeAllHandlers:function(a){if(a)this.events[a]=[];else for(var b in this.events)this.events[b]=[]},getHandler:function(a){var b=this.events[a];return b&&b.length?(b=1===b.length?[b[0]]:Array.apply(null,b),function(a,c){var d,e=b.length;for(d=0;e>d;d++)b[d]&&(c.eventSource=a,c.userData=b[d].userData,b[d].handler(c))}):null},raiseEvent:function(a,b){var c=this.getHandler(a);c&&(b||(b={}),c(this,b))}}}(OpenSeadragon),function(a){function b(b){var c,d,e=["mouseover","mouseout","mousedown","mouseup","mousemove","click",a.MouseTracker.wheelEventName,"touchstart","touchmove","touchend","keypress","focus","blur"],f=L[b.hash];if("DOMMouseScroll"==a.MouseTracker.wheelEventName&&e.push("MozMousePixelScroll"),!f.tracking){for(d=0;d<e.length;d++)c=e[d],a.addEvent(b.element,c,f[c],!1);f.tracking=!0,J[b.hash]=b}}function c(b){var c,d,e=["mouseover","mouseout","mousedown","mouseup","mousemove","click",a.MouseTracker.wheelEventName,"touchstart","touchmove","touchend","keypress","focus","blur"],g=L[b.hash];if("DOMMouseScroll"==a.MouseTracker.wheelEventName&&e.push("MozMousePixelScroll"),g.tracking){for(d=0;d<e.length;d++)c=e[d],a.removeEvent(b.element,c,g[c],!1);f(b),g.tracking=!1,delete J[b.hash]}}function d(a){return L[a.hash].insideElement}function e(b){var c=L[b.hash];c.capturing||(a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9?(a.removeEvent(b.element,"mouseup",c.mouseup,!1),a.addEvent(b.element,"mouseup",c.mouseupie,!0),a.addEvent(b.element,"mousemove",c.mousemovecapturedie,!0)):(a.addEvent(window,"mouseup",c.mouseupcaptured,!0),a.addEvent(window,"mousemove",c.mousemovecaptured,!0)),c.capturing=!0)}function f(b){var c=L[b.hash];c.capturing&&(a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9?(a.removeEvent(b.element,"mousemove",c.mousemovecapturedie,!0),a.removeEvent(b.element,"mouseup",c.mouseupie,!0),a.addEvent(b.element,"mouseup",c.mouseup,!1)):(a.removeEvent(window,"mousemove",c.mousemovecaptured,!0),a.removeEvent(window,"mouseup",c.mouseupcaptured,!0)),c.capturing=!1)}function g(a,b,c,d){var e;for(e in J)J.hasOwnProperty(e)&&a.hash!=e&&b(J[e],c,d)}function h(b,c){var d;b.focusHandler&&(d=b.focusHandler({eventSource:b,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),d===!1&&a.cancelEvent(c))}function i(b,c){var d;b.blurHandler&&(d=b.blurHandler({eventSource:b,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),d===!1&&a.cancelEvent(c))}function j(b,c){var d;b.keyHandler&&(d=b.keyHandler({eventSource:b,position:D(c,b.element),keyCode:c.keyCode?c.keyCode:c.charCode,shift:c.shiftKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),d||a.cancelEvent(c))}function k(b,c,d){var e,f=L[b.hash];if(d=d||!1,c=a.getEvent(c),!d){a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9&&f.capturing&&!E(c.srcElement,b.element)&&g(b,k,c,d);var h=c.target?c.target:c.srcElement,i=c.relatedTarget?c.relatedTarget:c.fromElement;if(!E(b.element,h)||E(b.element,i))return}f.insideElement=!0,b.enterHandler&&(e=b.enterHandler({eventSource:b,position:D(d?c.changedTouches[0]:c,b.element),insideElementPressed:f.insideElementPressed,buttonDownAny:H,isTouchEvent:d,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),e===!1&&a.cancelEvent(c))}function l(b,c,d){var e,f=L[b.hash];if(d=d||!1,c=a.getEvent(c),!d){a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9&&f.capturing&&!E(c.srcElement,b.element)&&g(b,l,c,d);var h=c.target?c.target:c.srcElement,i=c.relatedTarget?c.relatedTarget:c.toElement;if(!E(b.element,h)||E(b.element,i))return}f.insideElement=!1,b.exitHandler&&(e=b.exitHandler({eventSource:b,position:D(d?c.changedTouches[0]:c,b.element),insideElementPressed:f.insideElementPressed,buttonDownAny:H,isTouchEvent:d,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),e===!1&&a.cancelEvent(c))}function m(b,c,d,f){var g,h=L[b.hash];f=f||!1,c=a.getEvent(c);var i=f?c.touches[0]:c;2!=c.button&&(h.insideElementPressed=!0,h.lastPoint=C(i),h.lastMouseDownPoint=h.lastPoint,h.lastMouseDownTime=a.now(),b.pressHandler&&(g=b.pressHandler({eventSource:b,position:D(i,b.element),isTouchEvent:f,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),g===!1&&a.cancelEvent(c)),(b.pressHandler||b.dragHandler)&&a.cancelEvent(c),d||(!f&&a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9&&I?a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9&&K.push(b):(e(b),I=!0,K=[b])))}function n(b,c){var d,e;1==c.touches.length&&1==c.targetTouches.length&&1==c.changedTouches.length&&(L[b.hash].lastTouch=c.touches[0],k(b,c,!0),m(b,c,!0,!0)),2==c.touches.length&&(d=C(c.touches[0]),e=C(c.touches[1]),L[b.hash].lastPinchDelta=Math.abs(d.x-e.x)+Math.abs(d.y-e.y),L[b.hash].pinchMidpoint=new a.Point((d.x+e.x)/2,(d.y+e.y)/2)),c.preventDefault()}function o(b,c,d){var e,f=L[b.hash],g=f.insideElementPressed,h=f.insideElement;d=d||!1,c=a.getEvent(c),2!=c.button&&(f.insideElementPressed=!1,b.releaseHandler&&(e=b.releaseHandler({eventSource:b,position:D(d?c.changedTouches[0]:c,b.element),insideElementPressed:g,insideElementReleased:h,isTouchEvent:d,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),e===!1&&a.cancelEvent(c)),g&&h&&y(b,c,d))}function p(a,b){0===b.touches.length&&0===b.targetTouches.length&&1==b.changedTouches.length&&(L[a.hash].lastTouch=null,r(a,b,!0,!0),l(a,b,!0)),b.touches.length+b.changedTouches.length==2&&(L[a.hash].lastPinchDelta=null,L[a.hash].pinchMidpoint=null),b.preventDefault()}function q(b,c){var e,g;if(c=a.getEvent(c),2!=c.button){for(g=0;g<K.length;g++)e=K[g],d(e)||o(e,c,!1);f(b),I=!1,c.srcElement.fireEvent("on"+c.type,document.createEventObject(c)),a.stopEvent(c)}}function r(a,b,c,d){d=d||!1,(!L[a.hash].insideElement||d)&&o(a,b,d),c||f(a)}function s(b,c){if(b.moveHandler){c=a.getEvent(c);var d=b.moveHandler({eventSource:b,position:D(c,b.element),isTouchEvent:!1,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d===!1&&a.cancelEvent(c)}b.stopHandler&&(clearTimeout(b.stopTimeOut),b.stopTimeOut=setTimeout(function(){t(b,c)},b.stopDelay))}function t(a,b){a.stopHandler&&a.stopHandler({eventSource:a,position:D(b,a.element),isTouchEvent:!1,originalEvent:b,preventDefaultAction:!1,userData:a.userData})}function u(b,c){b.clickHandler&&a.cancelEvent(c)}function v(a,b){x(a,b,b,!1)}function w(b,c){c=c||window.event;var d={target:c.target||c.srcElement,type:"wheel",shiftKey:c.shiftKey||!1,clientX:c.clientX,clientY:c.clientY,pageX:c.pageX?c.pageX:c.clientX,pageY:c.pageY?c.pageY:c.clientY,deltaMode:"MozMousePixelScroll"==c.type?0:1,deltaX:0,deltaZ:0};d.deltaY="mousewheel"==a.MouseTracker.wheelEventName?-1/a.DEFAULT_SETTINGS.pixelsPerWheelLine*c.wheelDelta:c.detail,x(b,d,c,!1)}function x(b,c,d,e){var f,g=0;e=e||!1,g=c.deltaY<0?1:-1,b.scrollHandler&&(f=b.scrollHandler({eventSource:b,position:D(c,b.element),scroll:g,shift:c.shiftKey,isTouchEvent:e,originalEvent:d,preventDefaultAction:!1,userData:b.userData}),f===!1&&a.cancelEvent(d))}function y(b,c,d){var e,f=L[b.hash];d=d||!1,c=a.getEvent(c);var g=d?c.changedTouches[0]:c;if(2!=c.button){var h=a.now()-f.lastMouseDownTime,i=C(g),j=f.lastMouseDownPoint.distanceTo(i),k=h<=b.clickTimeThreshold&&j<=b.clickDistThreshold;b.clickHandler&&(e=b.clickHandler({eventSource:b,position:D(g,b.element),quick:k,shift:c.shiftKey,isTouchEvent:d,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),e===!1&&a.cancelEvent(c))}}function z(b,c,d){var e,f,g,h=L[b.hash];d=d||!1,c=a.getEvent(c);var i=d?c.touches[0]:c;g=C(i),e=g.minus(h.lastPoint),h.lastPoint=g,b.dragHandler&&(f=b.dragHandler({eventSource:b,position:D(i,b.element),delta:e,shift:c.shiftKey,isTouchEvent:d,originalEvent:c,preventDefaultAction:!1,userData:b.userData}),f===!1&&a.cancelEvent(c))}function A(a,b){var c,d,e;if(L[a.hash].lastTouch){if(1===b.touches.length&&1===b.targetTouches.length&&1===b.changedTouches.length&&L[a.hash].lastTouch.identifier===b.touches[0].identifier)z(a,b,!0);else if(2===b.touches.length&&(c=C(b.touches[0]),d=C(b.touches[1]),e=Math.abs(c.x-d.x)+Math.abs(c.y-d.y),Math.abs(L[a.hash].lastPinchDelta-e)>75)){var f={target:b.target||b.srcElement,type:"wheel",shiftKey:b.shiftKey||!1,clientX:L[a.hash].pinchMidpoint.x,clientY:L[a.hash].pinchMidpoint.y,pageX:L[a.hash].pinchMidpoint.x,pageY:L[a.hash].pinchMidpoint.y,deltaMode:1,deltaX:0,deltaY:L[a.hash].lastPinchDelta>e?1:-1,deltaZ:0};x(a,f,b,!0),L[a.hash].lastPinchDelta=e}b.preventDefault()}}function B(b,c){var d;for(d=0;d<K.length;d++)z(K[d],c,!1);a.stopEvent(c)}function C(b){return a.getMousePosition(b)}function D(b,c){var d=a.getMousePosition(b),e=a.getElementOffset(c);return d.minus(e)}function E(a,b){for(var c=document.body;b&&a!=b&&c!=b;)try{b=b.parentNode}catch(d){return!1}return a==b}function F(){H=!0}function G(){H=!1}var H=!1,I=!1,J={},K=[],L={};a.MouseTracker=function(b){var c=arguments;a.isPlainObject(b)||(b={element:c[0],clickTimeThreshold:c[1],clickDistThreshold:c[2]}),this.hash=Math.random(),this.element=a.getElement(b.element),this.clickTimeThreshold=b.clickTimeThreshold,this.clickDistThreshold=b.clickDistThreshold,this.userData=b.userData||null,this.stopDelay=b.stopDelay||50,this.enterHandler=b.enterHandler||null,this.exitHandler=b.exitHandler||null,this.pressHandler=b.pressHandler||null,this.releaseHandler=b.releaseHandler||null,this.moveHandler=b.moveHandler||null,this.scrollHandler=b.scrollHandler||null,this.clickHandler=b.clickHandler||null,this.dragHandler=b.dragHandler||null,this.stopHandler=b.stopHandler||null,this.keyHandler=b.keyHandler||null,this.focusHandler=b.focusHandler||null,this.blurHandler=b.blurHandler||null;var d=this;L[this.hash]={mouseover:function(a){k(d,a,!1)},mouseout:function(a){l(d,a,!1)},mousedown:function(a){m(d,a)},mouseup:function(a){o(d,a,!1)},mousemove:function(a){s(d,a)},click:function(a){u(d,a)},wheel:function(a){v(d,a)},mousewheel:function(a){w(d,a)},DOMMouseScroll:function(a){w(d,a)},MozMousePixelScroll:function(a){w(d,a)},mouseupie:function(a){q(d,a)},mousemovecapturedie:function(a){B(d,a)},mouseupcaptured:function(a){r(d,a)},mousemovecaptured:function(a){z(d,a,!1)},touchstart:function(a){n(d,a)},touchmove:function(a){A(d,a)},touchend:function(a){p(d,a)},keypress:function(a){j(d,a)},focus:function(a){h(d,a)},blur:function(a){i(d,a)},tracking:!1,capturing:!1,insideElementPressed:!1,insideElement:!1,lastPoint:null,lastMouseDownTime:null,lastMouseDownPoint:null,lastPinchDelta:0}},a.MouseTracker.prototype={destroy:function(){c(this),this.element=null},isTracking:function(){return L[this.hash].tracking},setTracking:function(a){return a?b(this):c(this),this},enterHandler:function(){},exitHandler:function(){},pressHandler:function(){},releaseHandler:function(){},moveHandler:function(){},scrollHandler:function(){},clickHandler:function(){},dragHandler:function(){},stopHandler:function(){},keyHandler:function(){},focusHandler:function(){},blurHandler:function(){}},a.MouseTracker.wheelEventName=a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version>8||"onwheel"in document.createElement("div")?"wheel":void 0!==document.onmousewheel?"mousewheel":"DOMMouseScroll",function(){a.Browser.vendor==a.BROWSERS.IE&&a.Browser.version<9?(a.addEvent(document,"mousedown",F,!1),a.addEvent(document,"mouseup",G,!1)):(a.addEvent(window,"mousedown",F,!0),a.addEvent(window,"mouseup",G,!0))}()}(OpenSeadragon),function(a){a.ControlAnchor={NONE:0,TOP_LEFT:1,TOP_RIGHT:2,BOTTOM_RIGHT:3,BOTTOM_LEFT:4,ABSOLUTE:5},a.Control=function(b,c,d){var e=b.parentNode;"number"==typeof c&&(a.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"),c={anchor:c}),c.attachToViewer="undefined"==typeof c.attachToViewer?!0:c.attachToViewer,this.autoFade="undefined"==typeof c.autoFade?!0:c.autoFade,this.element=b,this.anchor=c.anchor,this.container=d,this.anchor==a.ControlAnchor.ABSOLUTE?(this.wrapper=a.makeNeutralElement("div"),this.wrapper.style.position="absolute",this.wrapper.style.top="number"==typeof c.top?c.top+"px":c.top,this.wrapper.style.left="number"==typeof c.left?c.left+"px":c.left,this.wrapper.style.height="number"==typeof c.height?c.height+"px":c.height,this.wrapper.style.width="number"==typeof c.width?c.width+"px":c.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=a.makeNeutralElement("span"),this.wrapper.style.display="inline-block",this.anchor==a.ControlAnchor.NONE&&(this.wrapper.style.width=this.wrapper.style.height="100%")),this.wrapper.appendChild(this.element),c.attachToViewer?this.anchor==a.ControlAnchor.TOP_RIGHT||this.anchor==a.ControlAnchor.BOTTOM_RIGHT?this.container.insertBefore(this.wrapper,this.container.firstChild):this.container.appendChild(this.wrapper):e.appendChild(this.wrapper)},a.Control.prototype={destroy:function(){this.wrapper.removeChild(this.element),this.container.removeChild(this.wrapper)},isVisible:function(){return"none"!=this.wrapper.style.display},setVisible:function(b){this.wrapper.style.display=b?this.anchor==a.ControlAnchor.ABSOLUTE?"block":"inline-block":"none"},setOpacity:function(b){this.element[a.SIGNAL]&&a.Browser.vendor==a.BROWSERS.IE?a.setElementOpacity(this.element,b,!0):a.setElementOpacity(this.wrapper,b,!0)}}}(OpenSeadragon),function(a){function b(a,b){var c,d=a.controls;for(c=d.length-1;c>=0;c--)if(d[c].element==b)return c;return-1}a.ControlDock=function(b){var c,d,e=["topleft","topright","bottomright","bottomleft"];for(a.extend(!0,this,{id:"controldock-"+a.now()+"-"+Math.floor(1e6*Math.random()),container:a.makeNeutralElement("form"),controls:[]},b),this.container.onsubmit=function(){return!1},this.element&&(this.element=a.getElement(this.element),this.element.appendChild(this.container),this.element.style.position="relative",this.container.style.width="100%",this.container.style.height="100%"),d=0;d<e.length;d++)c=e[d],this.controls[c]=a.makeNeutralElement("div"),this.controls[c].style.position="absolute",c.match("left")&&(this.controls[c].style.left="0px"),c.match("right")&&(this.controls[c].style.right="0px"),c.match("top")&&(this.controls[c].style.top="0px"),c.match("bottom")&&(this.controls[c].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)},a.ControlDock.prototype={addControl:function(c,d){c=a.getElement(c);var e=null;if(!(b(this,c)>=0)){switch(d.anchor){case a.ControlAnchor.TOP_RIGHT:e=this.controls.topright,c.style.position="relative",c.style.paddingRight="0px",c.style.paddingTop="0px";break;case a.ControlAnchor.BOTTOM_RIGHT:e=this.controls.bottomright,c.style.position="relative",c.style.paddingRight="0px",c.style.paddingBottom="0px";break;case a.ControlAnchor.BOTTOM_LEFT:e=this.controls.bottomleft,c.style.position="relative",c.style.paddingLeft="0px",c.style.paddingBottom="0px";
-break;case a.ControlAnchor.TOP_LEFT:e=this.controls.topleft,c.style.position="relative",c.style.paddingLeft="0px",c.style.paddingTop="0px";break;case a.ControlAnchor.ABSOLUTE:e=this.container,c.style.margin="0px",c.style.padding="0px";break;default:case a.ControlAnchor.NONE:e=this.container,c.style.margin="0px",c.style.padding="0px"}this.controls.push(new a.Control(c,d,e)),c.style.display="inline-block"}},removeControl:function(c){c=a.getElement(c);var d=b(this,c);return d>=0&&(this.controls[d].destroy(),this.controls.splice(d,1)),this},clearControls:function(){for(;this.controls.length>0;)this.controls.pop().destroy();return this},areControlsEnabled:function(){var a;for(a=this.controls.length-1;a>=0;a--)if(this.controls[a].isVisible())return!0;return!1},setControlsEnabled:function(a){var b;for(b=this.controls.length-1;b>=0;b--)this.controls[b].setVisible(a);return this}}}(OpenSeadragon),function($){function _getSafeElemSize(a){return a=$.getElement(a),new $.Point(0===a.clientWidth?1:a.clientWidth,0===a.clientHeight?1:a.clientHeight)}function openTileSource(a,b){var c,d,e=a;for(e.source&&e.close(),e.canvas.innerHTML="",THIS[e.hash].prevContainerSize=_getSafeElemSize(e.container),e.collectionMode?(e.source=new $.TileSourceCollection({rows:e.collectionRows,layout:e.collectionLayout,tileSize:e.collectionTileSize,tileSources:e.tileSources,tileMargin:e.collectionTileMargin}),e.viewport=e.viewport?e.viewport:new $.Viewport({collectionMode:!0,collectionTileSource:e.source,containerSize:THIS[e.hash].prevContainerSize,contentSize:e.source.dimensions,springStiffness:e.springStiffness,animationTime:e.animationTime,showNavigator:!1,minZoomImageRatio:1,maxZoomPixelRatio:1,viewer:e,degrees:e.degrees})):(b&&(e.source=b),e.viewport=e.viewport?e.viewport:new $.Viewport({containerSize:THIS[e.hash].prevContainerSize,contentSize:e.source.dimensions,springStiffness:e.springStiffness,animationTime:e.animationTime,minZoomImageRatio:e.minZoomImageRatio,maxZoomPixelRatio:e.maxZoomPixelRatio,visibilityRatio:e.visibilityRatio,wrapHorizontal:e.wrapHorizontal,wrapVertical:e.wrapVertical,defaultZoomLevel:e.defaultZoomLevel,minZoomLevel:e.minZoomLevel,maxZoomLevel:e.maxZoomLevel,viewer:e,degrees:e.degrees})),e.preserveViewport&&e.viewport.resetContentSize(e.source.dimensions),e.source.overlays=e.source.overlays||[],e.drawer=new $.Drawer({viewer:e,source:e.source,viewport:e.viewport,element:e.canvas,overlays:[].concat(e.overlays).concat(e.source.overlays),maxImageCacheCount:e.maxImageCacheCount,imageLoaderLimit:e.imageLoaderLimit,minZoomImageRatio:e.minZoomImageRatio,wrapHorizontal:e.wrapHorizontal,wrapVertical:e.wrapVertical,immediateRender:e.immediateRender,blendTime:e.blendTime,alwaysBlend:e.alwaysBlend,minPixelRatio:e.collectionMode?0:e.minPixelRatio,timeout:e.timeout,debugMode:e.debugMode,debugGridColor:e.debugGridColor}),e.drawer.canRotate()||(e.rotateLeft&&(d=e.buttons.buttons.indexOf(e.rotateLeft),e.buttons.buttons.splice(d,1),e.buttons.element.removeChild(e.rotateLeft.element)),e.rotateRight&&(d=e.buttons.buttons.indexOf(e.rotateRight),e.buttons.buttons.splice(d,1),e.buttons.element.removeChild(e.rotateRight.element))),e.showNavigator&&!e.collectionMode&&(e.navigator?e.navigator.open(b):e.navigator=new $.Navigator({id:e.navigatorId,position:e.navigatorPosition,sizeRatio:e.navigatorSizeRatio,maintainSizeRatio:e.navigatorMaintainSizeRatio,top:e.navigatorTop,left:e.navigatorLeft,width:e.navigatorWidth,height:e.navigatorHeight,autoResize:e.navigatorAutoResize,tileSources:b,tileHost:e.tileHost,prefixUrl:e.prefixUrl,overlays:e.overlays,viewer:e})),e.showReferenceStrip&&!e.referenceStrip&&(e.referenceStrip=new $.ReferenceStrip({id:e.referenceStripElement,position:e.referenceStripPosition,sizeRatio:e.referenceStripSizeRatio,scroll:e.referenceStripScroll,height:e.referenceStripHeight,width:e.referenceStripWidth,tileSources:e.tileSources,tileHost:e.tileHost,prefixUrl:e.prefixUrl,overlays:e.overlays,viewer:e})),THIS[e.hash].animating=!1,THIS[e.hash].forceRedraw=!0,e._updateRequestId=scheduleUpdate(e,updateMulti),d=0;d<e.overlayControls.length;d++)c=e.overlayControls[d],c.point?e.drawer.addOverlay(c.id,new $.Point(c.point.X,c.point.Y),$.OverlayPlacement.TOP_LEFT):e.drawer.addOverlay(c.id,new $.Rect(c.rect.Point.X,c.rect.Point.Y,c.rect.Width,c.rect.Height),c.placement);return VIEWERS[e.hash]=e,e.raiseEvent("open",{source:b}),e}function scheduleUpdate(a,b){return $.requestAnimationFrame(function(){b(a)})}function scheduleControlsFade(a){$.requestAnimationFrame(function(){updateControlsFade(a)})}function beginControlsAutoHide(a){a.autoHideControls&&(a.controlsShouldFade=!0,a.controlsFadeBeginTime=$.now()+a.controlsFadeDelay,window.setTimeout(function(){scheduleControlsFade(a)},a.controlsFadeDelay))}function updateControlsFade(a){var b,c,d,e;if(a.controlsShouldFade){for(b=$.now(),c=b-a.controlsFadeBeginTime,d=1-c/a.controlsFadeLength,d=Math.min(1,d),d=Math.max(0,d),e=a.controls.length-1;e>=0;e--)a.controls[e].autoFade&&a.controls[e].setOpacity(d);d>0&&scheduleControlsFade(a)}}function abortControlsAutoHide(a){var b;for(a.controlsShouldFade=!1,b=a.controls.length-1;b>=0;b--)a.controls[b].setOpacity(1)}function onFocus(){abortControlsAutoHide(this)}function onBlur(){beginControlsAutoHide(this)}function onCanvasClick(a){var b,c;!a.preventDefaultAction&&this.viewport&&a.quick&&(b=this.zoomPerClick,c=a.shift?1/b:b,this.viewport.zoomBy(c,this.viewport.pointFromPixel(a.position,!0)),this.viewport.applyConstraints()),this.raiseEvent("canvas-click",{tracker:a.eventSource,position:a.position,quick:a.quick,shift:a.shift,originalEvent:a.originalEvent})}function onCanvasDrag(a){!a.preventDefaultAction&&this.viewport&&(this.panHorizontal||(a.delta.x=0),this.panVertical||(a.delta.y=0),this.viewport.panBy(this.viewport.deltaPointsFromPixels(a.delta.negate())),this.constrainDuringPan&&this.viewport.applyConstraints()),this.raiseEvent("canvas-drag",{tracker:a.eventSource,position:a.position,delta:a.delta,shift:a.shift,originalEvent:a.originalEvent})}function onCanvasRelease(a){a.insideElementPressed&&this.viewport&&this.viewport.applyConstraints(),this.raiseEvent("canvas-release",{tracker:a.eventSource,position:a.position,insideElementPressed:a.insideElementPressed,insideElementReleased:a.insideElementReleased,originalEvent:a.originalEvent})}function onCanvasScroll(a){var b;return!a.preventDefaultAction&&this.viewport&&(b=Math.pow(this.zoomPerScroll,a.scroll),this.viewport.zoomBy(b,this.viewport.pointFromPixel(a.position,!0)),this.viewport.applyConstraints()),this.raiseEvent("canvas-scroll",{tracker:a.eventSource,position:a.position,scroll:a.scroll,shift:a.shift,originalEvent:a.originalEvent}),!1}function onContainerExit(a){a.insideElementPressed||(THIS[this.hash].mouseInside=!1,THIS[this.hash].animating||beginControlsAutoHide(this)),this.raiseEvent("container-exit",{tracker:a.eventSource,position:a.position,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function onContainerRelease(a){a.insideElementReleased||(THIS[this.hash].mouseInside=!1,THIS[this.hash].animating||beginControlsAutoHide(this)),this.raiseEvent("container-release",{tracker:a.eventSource,position:a.position,insideElementPressed:a.insideElementPressed,insideElementReleased:a.insideElementReleased,originalEvent:a.originalEvent})}function onContainerEnter(a){THIS[this.hash].mouseInside=!0,abortControlsAutoHide(this),this.raiseEvent("container-enter",{tracker:a.eventSource,position:a.position,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function updateMulti(a){return a.source?(updateOnce(a),void(a.source&&(a._updateRequestId=scheduleUpdate(a,updateMulti)))):void(a._updateRequestId=null)}function updateOnce(a){var b,c;if(a.source){if(a.autoResize&&(b=_getSafeElemSize(a.container),!b.equals(THIS[a.hash].prevContainerSize))){var d=a.viewport.getBounds(),e=a.viewport.getCenter();resizeViewportAndRecenter(a,b,d,e),THIS[a.hash].prevContainerSize=b,THIS[a.hash].forceRedraw=!0}c=a.viewport.update(),a.referenceStrip&&(c=a.referenceStrip.update(a.viewport)||c),!THIS[a.hash].animating&&c&&(a.raiseEvent("animation-start"),abortControlsAutoHide(a)),c?(a.drawer.update(),a.navigator&&a.navigator.update(a.viewport),a.raiseEvent("animation")):(THIS[a.hash].forceRedraw||a.drawer.needsUpdate())&&(a.drawer.update(),a.navigator&&a.navigator.update(a.viewport),THIS[a.hash].forceRedraw=!1),THIS[a.hash].animating&&!c&&(a.raiseEvent("animation-finish"),THIS[a.hash].mouseInside||beginControlsAutoHide(a)),THIS[a.hash].animating=c}}function resizeViewportAndRecenter(a,b,c,d){var e=a.viewport;e.resize(b,!0);var f=1/a.source.aspectRatio,g=c.width<=1?c.width:1,h=c.height<=f?c.height:f,i=new $.Rect(d.x-g/2,d.y-h/2,g,h);e.fitBounds(i,!0)}function resolveUrl(a,b){return a?a+b:b}function beginZoomingIn(){THIS[this.hash].lastZoomTime=$.now(),THIS[this.hash].zoomFactor=this.zoomPerSecond,THIS[this.hash].zooming=!0,scheduleZoom(this)}function beginZoomingOut(){THIS[this.hash].lastZoomTime=$.now(),THIS[this.hash].zoomFactor=1/this.zoomPerSecond,THIS[this.hash].zooming=!0,scheduleZoom(this)}function endZooming(){THIS[this.hash].zooming=!1}function scheduleZoom(a){$.requestAnimationFrame($.delegate(a,doZoom))}function doZoom(){var a,b,c;THIS[this.hash].zooming&&this.viewport&&(a=$.now(),b=a-THIS[this.hash].lastZoomTime,c=Math.pow(THIS[this.hash].zoomFactor,b/1e3),this.viewport.zoomBy(c),this.viewport.applyConstraints(),THIS[this.hash].lastZoomTime=a,scheduleZoom(this))}function doSingleZoomIn(){this.viewport&&(THIS[this.hash].zooming=!1,this.viewport.zoomBy(this.zoomPerClick/1),this.viewport.applyConstraints())}function doSingleZoomOut(){this.viewport&&(THIS[this.hash].zooming=!1,this.viewport.zoomBy(1/this.zoomPerClick),this.viewport.applyConstraints())}function lightUp(){this.buttons.emulateEnter(),this.buttons.emulateExit()}function onHome(){this.viewport&&this.viewport.goHome()}function onFullScreen(){this.isFullPage()&&!$.isFullScreen()?this.setFullPage(!1):this.setFullScreen(!this.isFullPage()),this.buttons&&this.buttons.emulateExit(),this.fullPageButton.element.focus(),this.viewport&&this.viewport.applyConstraints()}function onRotateLeft(){if(this.viewport){var a=this.viewport.getRotation();0===a?a=270:a-=90,this.viewport.setRotation(a)}}function onRotateRight(){if(this.viewport){var a=this.viewport.getRotation();270===a?a=0:a+=90,this.viewport.setRotation(a)}}function onPrevious(){var a=THIS[this.hash].sequence-1;this.navPrevNextWrap&&0>a&&(a+=this.tileSources.length),this.goToPage(a)}function onNext(){var a=THIS[this.hash].sequence+1;this.navPrevNextWrap&&a>=this.tileSources.length&&(a=0),this.goToPage(a)}var THIS={},VIEWERS={};$.Viewer=function(a){var b,c=arguments,d=this;if($.isPlainObject(a)||(a={id:c[0],xmlPath:c.length>1?c[1]:void 0,prefixUrl:c.length>2?c[2]:void 0,controls:c.length>3?c[3]:void 0,overlays:c.length>4?c[4]:void 0,overlayControls:c.length>5?c[5]:void 0}),a.config&&($.extend(!0,a,a.config),delete a.config),$.extend(!0,this,{id:a.id,hash:a.hash||a.id,element:null,container:null,keyboardCommandArea:null,canvas:null,overlays:[],overlayControls:[],previousBody:[],customControls:[],source:null,drawer:null,drawers:[],viewport:null,navigator:null,collectionViewport:null,collectionDrawer:null,navImages:null,buttons:null,profiler:null},$.DEFAULT_SETTINGS,a),"undefined"==typeof this.hash)throw new Error("A hash must be defined, either by specifying options.id or options.hash.");"undefined"!=typeof THIS[this.hash]&&$.console.warn("Hash "+this.hash+" has already been used."),THIS[this.hash]={fsBoundsDelta:new $.Point(1,1),prevContainerSize:null,animating:!1,forceRedraw:!1,mouseInside:!1,group:null,zooming:!1,zoomFactor:null,lastZoomTime:null,sequenced:!1,sequence:0,fullPage:!1,onfullscreenchange:null},this._updateRequestId=null,$.EventSource.call(this),this.addHandler("open-failed",function(a){var b=$.getString("Errors.OpenFailed",a.eventSource,a.message);d._showMessage(b)}),$.ControlDock.call(this,a);var e;for(this.xmlPath&&(this.tileSources=[this.xmlPath]),this.tileSources&&($.isArray(this.tileSources)?(this.tileSources.length>1&&(THIS[this.hash].sequenced=!0),this.initialPage>this.tileSources.length-1&&(this.initialPage=this.tileSources.length-1),e=this.tileSources[this.initialPage],THIS[this.hash].sequence=this.initialPage):e=this.tileSources),this.element=this.element||document.getElementById(this.id),this.canvas=$.makeNeutralElement("div"),this.keyboardCommandArea=$.makeNeutralElement("textarea"),this.canvas.className="openseadragon-canvas",function(a){a.width="100%",a.height="100%",a.overflow="hidden",a.position="absolute",a.top="0px",a.left="0px"}(this.canvas.style),this.container.className="openseadragon-container",function(a){a.width="100%",a.height="100%",a.position="relative",a.overflow="hidden",a.left="0px",a.top="0px",a.textAlign="left"}(this.container.style),this.keyboardCommandArea.className="keyboard-command-area",function(a){a.width="100%",a.height="100%",a.overflow="hidden",a.position="absolute",a.top="0px",a.left="0px",a.resize="none"}(this.keyboardCommandArea.style),this.container.insertBefore(this.canvas,this.container.firstChild),this.container.insertBefore(this.keyboardCommandArea,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.keyboardCommandArea.innerTracker=new $.MouseTracker({_this:this,element:this.keyboardCommandArea,focusHandler:function(a){if(!a.preventDefaultAction){var b=$.getElementPosition(this.element);window.scrollTo(0,b.y)}},keyHandler:function(a){if(!a.preventDefaultAction)switch(a.keyCode){case 61:return d.viewport.zoomBy(1.1),d.viewport.applyConstraints(),!1;case 45:return d.viewport.zoomBy(.9),d.viewport.applyConstraints(),!1;case 48:return d.viewport.goHome(),d.viewport.applyConstraints(),!1;case 119:case 87:case 38:return a.shift?d.viewport.zoomBy(1.1):d.viewport.panBy(new $.Point(0,-.05)),d.viewport.applyConstraints(),!1;case 115:case 83:case 40:return a.shift?d.viewport.zoomBy(.9):d.viewport.panBy(new $.Point(0,.05)),d.viewport.applyConstraints(),!1;case 97:case 37:return d.viewport.panBy(new $.Point(-.05,0)),d.viewport.applyConstraints(),!1;case 100:case 39:return d.viewport.panBy(new $.Point(.05,0)),d.viewport.applyConstraints(),!1;default:return!0}}}).setTracking(!0),this.innerTracker=new $.MouseTracker({element:this.canvas,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,clickHandler:$.delegate(this,onCanvasClick),dragHandler:$.delegate(this,onCanvasDrag),releaseHandler:$.delegate(this,onCanvasRelease),scrollHandler:$.delegate(this,onCanvasScroll)}).setTracking(this.mouseNavEnabled?!0:!1),this.outerTracker=new $.MouseTracker({element:this.container,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,enterHandler:$.delegate(this,onContainerEnter),exitHandler:$.delegate(this,onContainerExit),releaseHandler:$.delegate(this,onContainerRelease)}).setTracking(this.mouseNavEnabled?!0:!1),this.toolbar&&(this.toolbar=new $.ControlDock({element:this.toolbar})),this.bindStandardControls(),this.bindSequenceControls(),e&&(this.open(e),this.tileSources.length>1&&this._updateSequenceButtons(this.initialPage)),b=0;b<this.customControls.length;b++)this.addControl(this.customControls[b].id,{anchor:this.customControls[b].anchor});$.requestAnimationFrame(function(){beginControlsAutoHide(d)})},$.extend($.Viewer.prototype,$.EventSource.prototype,$.ControlDock.prototype,{isOpen:function(){return!!this.source},openDzi:function(a){return this.open(a)},openTileSource:function(a){return this.open(a)},open:function(tileSource){var _this=this,customTileSource,readySource,$TileSource,options;return _this._hideMessage(),"string"==$.type(tileSource)&&(tileSource.match(/\s*<.*/)?tileSource=$.parseXml(tileSource):tileSource.match(/\s*[\{\[].*/)&&(tileSource=eval("("+tileSource+")"))),setTimeout(function(){if("string"==$.type(tileSource))tileSource=new $.TileSource(tileSource,function(a){openTileSource(_this,a.tileSource)}),tileSource.addHandler("open-failed",function(a){_this.raiseEvent("open-failed",a)});else if($.isPlainObject(tileSource)||tileSource.nodeType)if($.isFunction(tileSource.getTileUrl))customTileSource=new $.TileSource(tileSource),customTileSource.getTileUrl=tileSource.getTileUrl,openTileSource(_this,customTileSource);else{if($TileSource=$.TileSource.determineType(_this,tileSource),!$TileSource)return void _this.raiseEvent("open-failed",{message:"Unable to load TileSource",source:tileSource});options=$TileSource.prototype.configure.apply(_this,[tileSource]),readySource=new $TileSource(options),openTileSource(_this,readySource)}else openTileSource(_this,tileSource)},1),this},close:function(){return null!==this._updateRequestId&&($.cancelAnimationFrame(this._updateRequestId),this._updateRequestId=null),this.navigator&&this.navigator.close(),this.drawer&&this.drawer.clearOverlays(),this.source=null,this.drawer=null,this.viewport=this.preserveViewport?this.viewport:null,this.canvas&&(this.canvas.innerHTML=""),VIEWERS[this.hash]=null,delete VIEWERS[this.hash],this.raiseEvent("close"),this},destroy:function(){if(this.close(),this.removeAllHandlers(),this.element)for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);this.keyboardCommandArea&&this.keyboardCommandArea.innerTracker.destroy(),this.innerTracker&&this.innerTracker.destroy(),this.outerTracker&&this.outerTracker.destroy(),this.canvas=null,this.keyboardCommandArea=null,this.container=null,this.element=null},isMouseNavEnabled:function(){return this.innerTracker.isTracking()},setMouseNavEnabled:function(a){return this.innerTracker.setTracking(a),this.raiseEvent("mouse-enabled",{enabled:a}),this},areControlsEnabled:function(){var a,b=this.controls.length;for(a=0;a<this.controls.length;a++)b=b&&this.controls[a].isVisibile();return b},setControlsEnabled:function(a){return a?abortControlsAutoHide(this):beginControlsAutoHide(this),this.raiseEvent("controls-enabled",{enabled:a}),this},isFullPage:function(){return THIS[this.hash].fullPage},setFullPage:function(a){var b,c,d=document.body,e=d.style,f=document.documentElement.style,g=this;if(a==this.isFullPage())return this;var h={fullPage:a,preventDefaultAction:!1};if(this.raiseEvent("pre-full-page",h),h.preventDefaultAction)return this;if(a){for(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=e.margin,this.docMargin=f.margin,e.margin="0",f.margin="0",this.bodyPadding=e.padding,this.docPadding=f.padding,e.padding="0",f.padding="0",this.bodyWidth=e.width,this.bodyHeight=e.height,e.width="100%",e.height="100%",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,b=d.childNodes.length,c=0;b>c;c++)this.previousBody.push(d.childNodes[0]),d.removeChild(d.childNodes[0]);this.toolbar&&this.toolbar.element&&(this.toolbar.parentNode=this.toolbar.element.parentNode,this.toolbar.nextSibling=this.toolbar.element.nextSibling,d.appendChild(this.toolbar.element),$.addClass(this.toolbar.element,"fullpage")),$.addClass(this.element,"fullpage"),d.appendChild(this.element),this.element.style.height=$.getWindowSize().y+"px",this.element.style.width=$.getWindowSize().x+"px",this.toolbar&&this.toolbar.element&&(this.element.style.height=$.getElementSize(this.element).y-$.getElementSize(this.toolbar.element).y+"px"),THIS[this.hash].fullPage=!0,$.delegate(this,onContainerEnter)({})}else{for(this.element.style.margin=this.elementMargin,this.element.style.padding=this.elementPadding,e.margin=this.bodyMargin,f.margin=this.docMargin,e.padding=this.bodyPadding,f.padding=this.docPadding,e.width=this.bodyWidth,e.height=this.bodyHeight,d.removeChild(this.element),b=this.previousBody.length,c=0;b>c;c++)d.appendChild(this.previousBody.shift());$.removeClass(this.element,"fullpage"),THIS[this.hash].prevElementParent.insertBefore(this.element,THIS[this.hash].prevNextSibling),this.toolbar&&this.toolbar.element&&(d.removeChild(this.toolbar.element),$.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;var i=0,j=function(){$.setPageScroll(g.pageScroll);var a=$.getPageScroll();i++,(10>i&&a.x!==g.pageScroll.x||a.y!==g.pageScroll.y)&&$.requestAnimationFrame(j)};$.requestAnimationFrame(j),THIS[this.hash].fullPage=!1,$.delegate(this,onContainerExit)({})}return this.navigator&&this.viewport&&this.navigator.update(this.viewport),this.raiseEvent("full-page",{fullPage:a}),this},setFullScreen:function(a){var b=this;if(!$.supportsFullScreen)return this.setFullPage(a);if($.isFullScreen()===a)return this;var c={fullScreen:a,preventDefaultAction:!1};if(this.raiseEvent("pre-full-screen",c),c.preventDefaultAction)return this;if(a){if(this.setFullPage(!0),!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 d=function(){var a=$.isFullScreen();a||($.removeEvent(document,$.fullScreenEventName,d),$.removeEvent(document,$.fullScreenErrorEventName,d),b.setFullPage(!1),b.isFullPage()&&(b.element.style.width=b.fullPageStyleWidth,b.element.style.height=b.fullPageStyleHeight)),b.navigator&&b.viewport&&b.navigator.update(b.viewport),b.raiseEvent("full-screen",{fullScreen:a})};$.addEvent(document,$.fullScreenEventName,d),$.addEvent(document,$.fullScreenErrorEventName,d),$.requestFullScreen(document.body)}else $.cancelFullScreen();return this},isVisible:function(){return"hidden"!=this.container.style.visibility},setVisible:function(a){return this.container.style.visibility=a?"":"hidden",this.raiseEvent("visible",{visible:a}),this},bindSequenceControls:function(){var a=$.delegate(this,onFocus),b=$.delegate(this,onBlur),c=$.delegate(this,onNext),d=$.delegate(this,onPrevious),e=this.navImages,f=!0;return this.showSequenceControl&&THIS[this.hash].sequenced&&((this.previousButton||this.nextButton)&&(f=!1),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,e.previous.REST),srcGroup:resolveUrl(this.prefixUrl,e.previous.GROUP),srcHover:resolveUrl(this.prefixUrl,e.previous.HOVER),srcDown:resolveUrl(this.prefixUrl,e.previous.DOWN),onRelease:d,onFocus:a,onBlur:b}),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,e.next.REST),srcGroup:resolveUrl(this.prefixUrl,e.next.GROUP),srcHover:resolveUrl(this.prefixUrl,e.next.HOVER),srcDown:resolveUrl(this.prefixUrl,e.next.DOWN),onRelease:c,onFocus:a,onBlur:b}),this.navPrevNextWrap||this.previousButton.disable(),f&&(this.paging=new $.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:$.ControlAnchor.BOTTOM_RIGHT}):this.addControl(this.pagingControl,{anchor:this.sequenceControlAnchor||$.ControlAnchor.TOP_LEFT}))),this},bindStandardControls:function(){var a=$.delegate(this,beginZoomingIn),b=$.delegate(this,endZooming),c=$.delegate(this,doSingleZoomIn),d=$.delegate(this,beginZoomingOut),e=$.delegate(this,doSingleZoomOut),f=$.delegate(this,onHome),g=$.delegate(this,onFullScreen),h=$.delegate(this,onRotateLeft),i=$.delegate(this,onRotateRight),j=$.delegate(this,onFocus),k=$.delegate(this,onBlur),l=this.navImages,m=[],n=!0;return this.showNavigationControl&&((this.zoomInButton||this.zoomOutButton||this.homeButton||this.fullPageButton)&&(n=!1),m.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,l.zoomIn.REST),srcGroup:resolveUrl(this.prefixUrl,l.zoomIn.GROUP),srcHover:resolveUrl(this.prefixUrl,l.zoomIn.HOVER),srcDown:resolveUrl(this.prefixUrl,l.zoomIn.DOWN),onPress:a,onRelease:b,onClick:c,onEnter:a,onExit:b,onFocus:j,onBlur:k})),m.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,l.zoomOut.REST),srcGroup:resolveUrl(this.prefixUrl,l.zoomOut.GROUP),srcHover:resolveUrl(this.prefixUrl,l.zoomOut.HOVER),srcDown:resolveUrl(this.prefixUrl,l.zoomOut.DOWN),onPress:d,onRelease:b,onClick:e,onEnter:d,onExit:b,onFocus:j,onBlur:k})),m.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,l.home.REST),srcGroup:resolveUrl(this.prefixUrl,l.home.GROUP),srcHover:resolveUrl(this.prefixUrl,l.home.HOVER),srcDown:resolveUrl(this.prefixUrl,l.home.DOWN),onRelease:f,onFocus:j,onBlur:k})),m.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,l.fullpage.REST),srcGroup:resolveUrl(this.prefixUrl,l.fullpage.GROUP),srcHover:resolveUrl(this.prefixUrl,l.fullpage.HOVER),srcDown:resolveUrl(this.prefixUrl,l.fullpage.DOWN),onRelease:g,onFocus:j,onBlur:k})),this.showRotationControl&&(m.push(this.rotateLeft=new $.Button({element:this.rotateLeftButton?$.getElement(this.rotateLeftButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:$.getString("Tooltips.RotateLeft"),srcRest:resolveUrl(this.prefixUrl,l.rotateleft.REST),srcGroup:resolveUrl(this.prefixUrl,l.rotateleft.GROUP),srcHover:resolveUrl(this.prefixUrl,l.rotateleft.HOVER),srcDown:resolveUrl(this.prefixUrl,l.rotateleft.DOWN),onRelease:h,onFocus:j,onBlur:k})),m.push(this.rotateRight=new $.Button({element:this.rotateRightButton?$.getElement(this.rotateRightButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:$.getString("Tooltips.RotateRight"),srcRest:resolveUrl(this.prefixUrl,l.rotateright.REST),srcGroup:resolveUrl(this.prefixUrl,l.rotateright.GROUP),srcHover:resolveUrl(this.prefixUrl,l.rotateright.HOVER),srcDown:resolveUrl(this.prefixUrl,l.rotateright.DOWN),onRelease:i,onFocus:j,onBlur:k}))),n&&(this.buttons=new $.ButtonGroup({buttons:m,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold}),this.navControl=this.buttons.element,this.addHandler("open",$.delegate(this,lightUp)),this.toolbar?this.toolbar.addControl(this.navControl,{anchor:$.ControlAnchor.TOP_LEFT}):this.addControl(this.navControl,{anchor:this.navigationControlAnchor||$.ControlAnchor.TOP_LEFT}))),this},currentPage:function(){return THIS[this.hash].sequence},goToPage:function(a){return a>=0&&a<this.tileSources.length&&(this.raiseEvent("page",{page:a}),THIS[this.hash].sequence=a,this._updateSequenceButtons(a),this.open(this.tileSources[a]),this.referenceStrip&&this.referenceStrip.setFocus(a)),this},_updateSequenceButtons:function(a){this.nextButton&&(this.tileSources.length-1===a?this.navPrevNextWrap||this.nextButton.disable():this.nextButton.enable()),this.previousButton&&(a>0?this.previousButton.enable():this.navPrevNextWrap||this.previousButton.disable())},_showMessage:function(a){this._hideMessage();var b=$.makeNeutralElement("div");b.appendChild(document.createTextNode(a)),this.messageDiv=$.makeCenteredNode(b),$.addClass(this.messageDiv,"openseadragon-message"),this.container.appendChild(this.messageDiv)},_hideMessage:function(){var a=this.messageDiv;a&&(a.parentNode.removeChild(a),delete this.messageDiv)}})}(OpenSeadragon),function(a){function b(a){this.drag?this.drag=!1:this.viewer.viewport&&(this.viewer.viewport.panTo(this.viewport.pointFromPixel(a.position)),this.viewer.viewport.applyConstraints())}function c(a){this.viewer.viewport&&(this.drag=!0,this.panHorizontal||(a.delta.x=0),this.panVertical||(a.delta.y=0),this.viewer.viewport.panBy(this.viewport.deltaPointsFromPixels(a.delta)))}function d(a){a.insideElementPressed&&this.viewer.viewport&&this.viewer.viewport.applyConstraints()}function e(a){return this.viewer.raiseEvent("navigator-scroll",{tracker:a.eventSource,position:a.position,scroll:a.scroll,shift:a.shift,originalEvent:a.originalEvent}),!1}a.Navigator=function(f){var g,h,i,j=f.viewer;f.id?(this.element=document.getElementById(f.id),f.controlOptions={anchor:a.ControlAnchor.NONE,attachToViewer:!1,autoFade:!1}):(f.id="navigator-"+a.now(),this.element=a.makeNeutralElement("div"),f.controlOptions={anchor:a.ControlAnchor.TOP_RIGHT,attachToViewer:!0,autoFade:!0},f.position&&("BOTTOM_RIGHT"==f.position?f.controlOptions.anchor=a.ControlAnchor.BOTTOM_RIGHT:"BOTTOM_LEFT"==f.position?f.controlOptions.anchor=a.ControlAnchor.BOTTOM_LEFT:"TOP_RIGHT"==f.position?f.controlOptions.anchor=a.ControlAnchor.TOP_RIGHT:"TOP_LEFT"==f.position?f.controlOptions.anchor=a.ControlAnchor.TOP_LEFT:"ABSOLUTE"==f.position&&(f.controlOptions.anchor=a.ControlAnchor.ABSOLUTE,f.controlOptions.top=f.top,f.controlOptions.left=f.left,f.controlOptions.height=f.height,f.controlOptions.width=f.width))),this.element.id=f.id,this.element.className+=" navigator",f=a.extend(!0,{sizeRatio:a.DEFAULT_SETTINGS.navigatorSizeRatio},f,{element:this.element,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:0,autoResize:f.autoResize}),f.minPixelRatio=this.minPixelRatio=j.minPixelRatio,this.borderWidth=2,this.fudge=new a.Point(1,1),this.totalBorderWidths=new a.Point(2*this.borderWidth,2*this.borderWidth).minus(this.fudge),f.controlOptions.anchor!=a.ControlAnchor.NONE&&!function(a,b){a.margin="0px",a.border=b+"px solid #555",a.padding="0px",a.background="#000",a.opacity=.8,a.overflow="hidden"}(this.element.style,this.borderWidth),this.displayRegion=a.makeNeutralElement("div"),this.displayRegion.id=this.element.id+"-displayregion",this.displayRegion.className="displayregion",function(a,b){a.position="relative",a.top="0px",a.left="0px",a.fontSize="0px",a.overflow="hidden",a.border=b+"px solid #900",a.margin="0px",a.padding="0px",a.background="transparent",a["float"]="left",a.cssFloat="left",a.styleFloat="left",a.zIndex=999999999,a.cursor="default"}(this.displayRegion.style,this.borderWidth),this.element.innerTracker=new a.MouseTracker({element:this.element,dragHandler:a.delegate(this,c),clickHandler:a.delegate(this,b),releaseHandler:a.delegate(this,d),scrollHandler:a.delegate(this,e)}).setTracking(!0),j.addControl(this.element,f.controlOptions),f.controlOptions.anchor!=a.ControlAnchor.ABSOLUTE&&f.controlOptions.anchor!=a.ControlAnchor.NONE&&(f.width&&f.height?(this.element.style.height="number"==typeof f.height?f.height+"px":f.height,this.element.style.width="number"==typeof f.width?f.width+"px":f.width):(g=a.getElementSize(j.element),this.element.style.height=g.y*f.sizeRatio+"px",this.element.style.width=g.x*f.sizeRatio+"px",this.oldViewerSize=g),h=a.getElementSize(this.element),this.elementArea=h.x*h.y),this.oldContainerSize=new a.Point(0,0),a.Viewer.apply(this,[f]),this.element.getElementsByTagName("form")[0].appendChild(this.displayRegion),i=this.element.getElementsByTagName("textarea")[0],i&&i.parentNode.removeChild(i)
-},a.extend(a.Navigator.prototype,a.EventSource.prototype,a.Viewer.prototype,{updateSize:function(){if(this.viewport){var b=new a.Point(0===this.container.clientWidth?1:this.container.clientWidth,0===this.container.clientHeight?1:this.container.clientHeight);if(!b.equals(this.oldContainerSize)){var c=this.viewport.getBounds(),d=this.viewport.getCenter();this.viewport.resize(b,!0);var e=1/this.source.aspectRatio,f=c.width<=1?c.width:1,g=c.height<=e?c.height:e,h=new a.Rect(d.x-f/2,d.y-g/2,f,g);this.viewport.fitBounds(h,!0),this.oldContainerSize=b,this.drawer.update()}}},update:function(b){var c,d,e,f,g,h;c=a.getElementSize(this.viewer.element),c.equals(this.oldViewerSize)||(this.oldViewerSize=c,this.maintainSizeRatio?(d=c.x*this.sizeRatio,e=c.y*this.sizeRatio):(d=Math.sqrt(this.elementArea*(c.x/c.y)),e=this.elementArea/d),this.element.style.width=d+"px",this.element.style.height=e+"px",this.updateSize()),b&&this.viewport&&(f=b.getBounds(!0),g=this.viewport.pixelFromPoint(f.getTopLeft(),!1),h=this.viewport.pixelFromPoint(f.getBottomRight(),!1).minus(this.totalBorderWidths),function(a){a.top=g.y+"px",a.left=g.x+"px";var b=Math.abs(g.x-h.x),c=Math.abs(g.y-h.y);a.width=Math.max(b,0)+"px",a.height=Math.max(c,0)+"px"}(this.displayRegion.style))},open:function(b){this.updateSize();var c=this.viewer.viewport.containerSize.times(this.sizeRatio);return this.minPixelRatio=b.tileSize>c.x||b.tileSize>c.y?Math.min(c.x,c.y)/b.tileSize:this.viewer.minPixelRatio,a.Viewer.prototype.open.apply(this,[b])}})}(OpenSeadragon),function(a){var b={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"}};a.extend(a,{getString:function(c){var d,e=c.split("."),f=null,g=arguments,h=b;for(d=0;d<e.length-1;d++)h=h[e[d]]||{};return f=h[e[d]],"string"!=typeof f&&(a.console.debug("Untranslated source string:",c),f=""),f.replace(/\{\d+\}/g,function(a){var b=parseInt(a.match(/\d+/),10)+1;return b<g.length?g[b]:""})},setString:function(a,c){var d,e=a.split("."),f=b;for(d=0;d<e.length-1;d++)f[e[d]]||(f[e[d]]={}),f=f[e[d]];f[e[d]]=c}})}(OpenSeadragon),function(a){a.Point=function(a,b){this.x="number"==typeof a?a:0,this.y="number"==typeof b?b:0},a.Point.prototype={plus:function(b){return new a.Point(this.x+b.x,this.y+b.y)},minus:function(b){return new a.Point(this.x-b.x,this.y-b.y)},times:function(b){return new a.Point(this.x*b,this.y*b)},divide:function(b){return new a.Point(this.x/b,this.y/b)},negate:function(){return new a.Point(-this.x,-this.y)},distanceTo:function(a){return Math.sqrt(Math.pow(this.x-a.x,2)+Math.pow(this.y-a.y,2))},apply:function(b){return new a.Point(b(this.x),b(this.y))},equals:function(b){return b instanceof a.Point&&this.x===b.x&&this.y===b.y},rotate:function(b,c){var d=b*Math.PI/180,e=Math.cos(d)*(this.x-c.x)-Math.sin(d)*(this.y-c.y)+c.x,f=Math.sin(d)*(this.x-c.x)+Math.cos(d)*(this.y-c.y)+c.y;return new a.Point(e,f)},toString:function(){return"("+Math.round(this.x)+","+Math.round(this.y)+")"}}}(OpenSeadragon),function($){function processResponse(xhr){var responseText=xhr.responseText,status=xhr.status,statusText,data;if(!xhr)throw new Error($.getString("Errors.Security"));if(200!==xhr.status&&0!==xhr.status)throw status=xhr.status,statusText=404==status?"Not Found":xhr.statusText,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 data=responseText.match(/\s*[\{\[].*/)?eval("("+responseText+")"):responseText;return data}$.TileSource=function(a){var b,c,d=null,e=arguments;for(b=$.isPlainObject(a)?a:{width:e[0],height:e[1],tileSize:e[2],tileOverlap:e[3],minLevel:e[4],maxLevel:e[5]},$.EventSource.call(this),$.extend(!0,this,b),c=0;c<arguments.length;c++)if($.isFunction(arguments[c])){d=arguments[c],this.addHandler("ready",function(a){d(a)});break}"string"==$.type(arguments[0])?(this.aspectRatio=1,this.dimensions=new $.Point(10,10),this.tileSize=0,this.tileOverlap=0,this.minLevel=0,this.maxLevel=0,this.ready=!1,this.getImageInfo(arguments[0])):(this.ready=!0,this.aspectRatio=b.width&&b.height?b.width/b.height:1,this.dimensions=new $.Point(b.width,b.height),this.tileSize=b.tileSize?b.tileSize:0,this.tileOverlap=b.tileOverlap?b.tileOverlap:0,this.minLevel=b.minLevel?b.minLevel:0,this.maxLevel=void 0!==b.maxLevel&&null!==b.maxLevel?b.maxLevel:b.width&&b.height?Math.ceil(Math.log(Math.max(b.width,b.height))/Math.log(2)):0,d&&$.isFunction(d)&&d(this))},$.TileSource.prototype={getLevelScale:function(a){var b,c={};for(b=0;b<=this.maxLevel;b++)c[b]=1/Math.pow(2,this.maxLevel-b);return this.getLevelScale=function(a){return c[a]},this.getLevelScale(a)},getNumTiles:function(a){var b=this.getLevelScale(a),c=Math.ceil(b*this.dimensions.x/this.tileSize),d=Math.ceil(b*this.dimensions.y/this.tileSize);return new $.Point(c,d)},getPixelRatio:function(a){var b=this.dimensions.times(this.getLevelScale(a)),c=1/b.x,d=1/b.y;return new $.Point(c,d)},getClosestLevel:function(a){var b,c,d=Math.floor(Math.max(a.x,a.y)/this.tileSize);for(b=this.minLevel;b<this.maxLevel&&(c=this.getNumTiles(b),!(Math.max(c.x,c.y)+1>=d));b++);return Math.max(0,b-1)},getTileAtPoint:function(a,b){var c=b.times(this.dimensions.x).times(this.getLevelScale(a)),d=Math.floor(c.x/this.tileSize),e=Math.floor(c.y/this.tileSize);return new $.Point(d,e)},getTileBounds:function(a,b,c){var d=this.dimensions.times(this.getLevelScale(a)),e=0===b?0:this.tileSize*b-this.tileOverlap,f=0===c?0:this.tileSize*c-this.tileOverlap,g=this.tileSize+(0===b?1:2)*this.tileOverlap,h=this.tileSize+(0===c?1:2)*this.tileOverlap,i=1/d.x;return g=Math.min(g,d.x-e),h=Math.min(h,d.y-f),new $.Rect(e*i,f*i,g*i,h*i)},getImageInfo:function(a){var b,c,d,e,f,g,h,i=this;a&&(f=a.split("/"),g=f[f.length-1],h=g.lastIndexOf("."),h>-1&&(f[f.length-1]=g.slice(0,h))),c=function(b){"string"==typeof b&&(b=$.parseXml(b));var c=$.TileSource.determineType(i,b,a);return c?(e=c.prototype.configure.apply(i,[b,a]),d=new c(e),i.ready=!0,void i.raiseEvent("ready",{tileSource:d})):void i.raiseEvent("open-failed",{message:"Unable to load TileSource",source:a})},a.match(/\.js$/)?(b=a.split("/").pop().replace(".js",""),$.jsonp({url:a,async:!1,callbackName:b,callback:c})):$.makeAjaxRequest(a,function(a){var b=processResponse(a);c(b)},function(b,c){var d;try{d="HTTP "+b.status+" attempting to load TileSource"}catch(e){var f;f="undefined"!=typeof c&&c.toString?c.toString():"Unknown error",d=f+" attempting to load TileSource"}i.raiseEvent("open-failed",{message:d,source:a})})},supports:function(){return!1},configure:function(){throw new Error("Method not implemented.")},getTileUrl:function(){throw new Error("Method not implemented.")},tileExists:function(a,b,c){var d=this.getNumTiles(a);return a>=this.minLevel&&a<=this.maxLevel&&b>=0&&c>=0&&b<d.x&&c<d.y}},$.extend(!0,$.TileSource.prototype,$.EventSource.prototype),$.TileSource.determineType=function(a,b,c){var d;for(d in OpenSeadragon)if(d.match(/.+TileSource$/)&&$.isFunction(OpenSeadragon[d])&&$.isFunction(OpenSeadragon[d].prototype.supports)&&OpenSeadragon[d].prototype.supports.call(a,b,c))return OpenSeadragon[d];$.console.error("No TileSource was able to open %s %s",c,b)}}(OpenSeadragon),function(a){function b(b,d){if(!d||!d.documentElement)throw new Error(a.getString("Errors.Xml"));var e,f,g,h,i,j=d.documentElement,k=j.tagName,l=null,m=[];if("Image"==k)try{if(h=j.getElementsByTagName("Size")[0],l={Image:{xmlns:"http://schemas.microsoft.com/deepzoom/2008",Url:j.getAttribute("Url"),Format:j.getAttribute("Format"),DisplayRect:null,Overlap:parseInt(j.getAttribute("Overlap"),10),TileSize:parseInt(j.getAttribute("TileSize"),10),Size:{Height:parseInt(h.getAttribute("Height"),10),Width:parseInt(h.getAttribute("Width"),10)}}},!a.imageFormatSupported(l.Image.Format))throw new Error(a.getString("Errors.ImageFormat",l.Image.Format.toUpperCase()));for(e=j.getElementsByTagName("DisplayRect"),i=0;i<e.length;i++)f=e[i],g=f.getElementsByTagName("Rect")[0],m.push({Rect:{X:parseInt(g.getAttribute("X"),10),Y:parseInt(g.getAttribute("Y"),10),Width:parseInt(g.getAttribute("Width"),10),Height:parseInt(g.getAttribute("Height"),10),MinLevel:parseInt(f.getAttribute("MinLevel"),10),MaxLevel:parseInt(f.getAttribute("MaxLevel"),10)}});return m.length&&(l.Image.DisplayRect=m),c(b,l)}catch(n){throw n instanceof Error?n:new Error(a.getString("Errors.Dzi"))}else{if("Collection"==k)throw new Error(a.getString("Errors.Dzc"));if("Error"==k)return a._processDZIError(j)}throw new Error(a.getString("Errors.Dzi"))}function c(b,c){var d,e,f=c.Image,g=f.Url,h=f.Format,i=f.Size,j=f.DisplayRect||[],k=parseInt(i.Width,10),l=parseInt(i.Height,10),m=parseInt(f.TileSize,10),n=parseInt(f.Overlap,10),o=[];for(e=0;e<j.length;e++)d=j[e].Rect,o.push(new a.DisplayRect(parseInt(d.X,10),parseInt(d.Y,10),parseInt(d.Width,10),parseInt(d.Height,10),parseInt(d.MinLevel,10),parseInt(d.MaxLevel,10)));return a.extend(!0,{width:k,height:l,tileSize:m,tileOverlap:n,minLevel:null,maxLevel:null,tilesUrl:g,fileFormat:h,displayRects:o},c)}a.DziTileSource=function(b){var c,d,e,f;if(f=a.isPlainObject(b)?b:{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=f.tilesUrl,this.fileFormat=f.fileFormat,this.displayRects=f.displayRects,this.displayRects)for(c=this.displayRects.length-1;c>=0;c--)for(d=this.displayRects[c],e=d.minLevel;e<=d.maxLevel;e++)this._levelRects[e]||(this._levelRects[e]=[]),this._levelRects[e].push(d);a.TileSource.apply(this,[f])},a.extend(a.DziTileSource.prototype,a.TileSource.prototype,{supports:function(a){var b;return a.Image?b=a.Image.xmlns:a.documentElement&&"Image"==a.documentElement.tagName&&(b=a.documentElement.namespaceURI),"http://schemas.microsoft.com/deepzoom/2008"==b||"http://schemas.microsoft.com/deepzoom/2009"==b},configure:function(d,e){var f;return f=a.isPlainObject(d)?c(this,d):b(this,d),e&&!f.tilesUrl&&(f.tilesUrl=e.replace(/([^\/]+)\.(dzi|xml|js)$/,"$1_files/")),f},getTileUrl:function(a,b,c){return[this.tilesUrl,a,"/",b,"_",c,".",this.fileFormat].join("")},tileExists:function(a,b,c){var d,e,f,g,h,i,j,k=this._levelRects[a];if(!k||!k.length)return!0;for(j=k.length-1;j>=0;j--)if(d=k[j],!(a<d.minLevel||a>d.maxLevel)&&(e=this.getLevelScale(a),f=d.x*e,g=d.y*e,h=f+d.width*e,i=g+d.height*e,f=Math.floor(f/this.tileSize),g=Math.floor(g/this.tileSize),h=Math.ceil(h/this.tileSize),i=Math.ceil(i/this.tileSize),b>=f&&h>b&&c>=g&&i>c))return!0;return!1}})}(OpenSeadragon),function(a){function b(b,e){if(!e||!e.documentElement)throw new Error(a.getString("Errors.Xml"));var f=e.documentElement,g=f.tagName,h=null;if("info"==g)try{return h={ns:f.namespaceURI},c(f,h),d(b,h)}catch(i){throw i instanceof Error?i:new Error(a.getString("Errors.IIIF"))}throw new Error(a.getString("Errors.IIIF"))}function c(b,d,e){var f,g;if(3==b.nodeType&&e)g=b.nodeValue.trim(),g.match(/^\d*$/)&&(g=Number(g)),d[e]?(a.isArray(d[e])||(d[e]=[d[e]]),d[e].push(g)):d[e]=g;else if(1==b.nodeType)for(f=0;f<b.childNodes.length;f++)c(b.childNodes[f],d,b.nodeName)}function d(a,b){return b.image_host&&(b.tilesUrl=b.image_host),b}a.IIIFTileSource=function(b){if(a.extend(!0,this,b),!(this.height&&this.width&&this.identifier&&this.tilesUrl))throw new Error("IIIF required parameters not provided.");if(b.tileSize=this.tile_width,!b.maxLevel){var c=-1,d=this.scale_factors||this.scale_factor;if(d instanceof Array)for(var e=0;e<d.length;e++){var f=Number(d[e]);!isNaN(f)&&f>c&&(c=f)}b.maxLevel=0>c?Number(Math.ceil(Math.log(Math.max(this.width,this.height),2))):c}a.TileSource.apply(this,[b])},a.extend(a.IIIFTileSource.prototype,a.TileSource.prototype,{supports:function(a){return a.ns&&"http://library.stanford.edu/iiif/image-api/ns/"==a.ns||a.profile&&("http://library.stanford.edu/iiif/image-api/compliance.html#level1"==a.profile||"http://library.stanford.edu/iiif/image-api/compliance.html#level2"==a.profile||"http://library.stanford.edu/iiif/image-api/compliance.html#level3"==a.profile||"http://library.stanford.edu/iiif/image-api/compliance.html"==a.profile)||a.documentElement&&"info"==a.documentElement.tagName&&"http://library.stanford.edu/iiif/image-api/ns/"==a.documentElement.namespaceURI},configure:function(c,e){var f,g,h;return g=a.isPlainObject(c)?d(this,c):b(this,c),e&&!g.tilesUrl&&(f=e.split("/"),f.pop(),f=f.join("/"),"http"!==e.substring(0,4)&&(h=location.protocol+"//"+location.host,f=h+f),g.tilesUrl=f.replace(c.identifier,"")),g},getTileUrl:function(a,b,c){var d,e,f,g,h,i,j="0",k="native.jpg",l=Math.pow(.5,this.maxLevel-a),m=Math.ceil(this.width*l),n=Math.ceil(this.height*l),o=Math.ceil(this.tileSize/l),p=Math.ceil(this.tileSize/l);return m<this.tile_width&&n<this.tile_height?(i=m+",",d="full"):(e=b*o,f=c*p,g=Math.min(o,this.width-e),h=Math.min(p,this.height-f),i=Math.ceil(g*l)+",",d=[e,f,g,h].join(",")),[this.tilesUrl,this.identifier,d,i,j,k].join("/")}})}(OpenSeadragon),function(a){a.IIIF1_1TileSource=function(b){if(a.extend(!0,this,b),!(this.height&&this.width&&this["@id"]))throw new Error("IIIF required parameters not provided.");if(this.profile&&"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0"==this.profile)throw new Error("IIIF Image API 1.1 compliance level 1 or greater is required.");if(this.tile_width)b.tileSize=this.tile_width;else if(this.tile_height)b.tileSize=this.tile_height;else{for(var c=Math.min(this.height,this.width),d=[256,512,1024],e=[],f=0;f<d.length;f++)d[f]<=c&&e.push(d[f]);b.tileSize=e.length>0?Math.max.apply(null,e):c,this.tile_width=b.tileSize,this.tile_height=b.tileSize}if(!b.maxLevel){var g=-1,h=this.scale_factors||this.scale_factor;if(h instanceof Array)for(var i=0;i<h.length;i++){var j=Number(h[i]);!isNaN(j)&&j>g&&(g=j)}b.maxLevel=0>g?Number(Math.ceil(Math.log(Math.max(this.width,this.height),2))):g}a.TileSource.apply(this,[b])},a.extend(a.IIIF1_1TileSource.prototype,a.TileSource.prototype,{supports:function(a){return a["@context"]&&"http://library.stanford.edu/iiif/image-api/1.1/context.json"==a["@context"]},configure:function(a){return a},getTileUrl:function(a,b,c){var d,e,f,g,h,i,j,k="0",l="native.jpg",m=Math.pow(.5,this.maxLevel-a),n=Math.ceil(this.width*m),o=Math.ceil(this.height*m),p=Math.ceil(this.tileSize/m),q=Math.ceil(this.tileSize/m);return n<this.tile_width&&o<this.tile_height?(i=n+",",d="full"):(e=b*p,f=c*q,g=Math.min(p,this.width-e),h=Math.min(q,this.height-f),i=Math.ceil(g*m)+",",d=[e,f,g,h].join(",")),j=[this["@id"],d,i,k,l].join("/")}})}(OpenSeadragon),function(a){a.OsmTileSource=function(b){var c;c=a.isPlainObject(b)?b:{width:arguments[0],height:arguments[1],tileSize:arguments[2],tileOverlap:arguments[3],tilesUrl:arguments[4]},c.width&&c.height||(c.width=65572864,c.height=65572864),c.tileSize||(c.tileSize=256,c.tileOverlap=0),c.tilesUrl||(c.tilesUrl="http://tile.openstreetmap.org/"),c.minLevel=8,a.TileSource.apply(this,[c])},a.extend(a.OsmTileSource.prototype,a.TileSource.prototype,{supports:function(a){return a.type&&"openstreetmaps"==a.type},configure:function(a){return a},getTileUrl:function(a,b,c){return this.tilesUrl+(a-8)+"/"+b+"/"+c+".png"}})}(OpenSeadragon),function(a){a.TmsTileSource=function(b){var c;c=a.isPlainObject(b)?b:{width:arguments[0],height:arguments[1],tileSize:arguments[2],tileOverlap:arguments[3],tilesUrl:arguments[4]};var d,e=256*Math.ceil(c.width/256),f=256*Math.ceil(c.height/256);d=e>f?e/256:f/256,c.maxLevel=Math.ceil(Math.log(d)/Math.log(2))-1,c.tileSize=256,c.width=e,c.height=f,a.TileSource.apply(this,[c])},a.extend(a.TmsTileSource.prototype,a.TileSource.prototype,{supports:function(a){return a.type&&"tiledmapservice"==a.type},configure:function(a){return a},getTileUrl:function(a,b,c){var d=this.getNumTiles(a).y-1;return this.tilesUrl+a+"/"+b+"/"+(d-c)+".png"}})}(OpenSeadragon),function(a){function b(b){var c,d,e=[];for(d=0;d<b.length;d++)c=b[d],c.height&&c.width&&c.url&&(c.url.toLowerCase().match(/^.*\.(png|jpg|jpeg|gif)$/)||c.mimetype&&c.mimetype.toLowerCase().match(/^.*\/(png|jpg|jpeg|gif)$/))?e.push({url:c.url,width:Number(c.width),height:Number(c.height)}):a.console.error("Unsupported image format: %s",c.url?c.url:"<no URL>");return e.sort(function(a,b){return a.height-b.height})}function c(b,c){if(!c||!c.documentElement)throw new Error(a.getString("Errors.Xml"));var e,f,g=c.documentElement,h=g.tagName,i=null,j=[];if("image"==h)try{for(i={type:g.getAttribute("type"),levels:[]},j=g.getElementsByTagName("level"),f=0;f<j.length;f++)e=j[f],i.levels.push({url:e.getAttribute("url"),width:parseInt(e.getAttribute("width"),10),height:parseInt(e.getAttribute("height"),10)});return d(b,i)}catch(k){throw k instanceof Error?k:new Error("Unknown error parsing Legacy Image Pyramid XML.")}else{if("collection"==h)throw new Error("Legacy Image Pyramid Collections not yet supported.");if("error"==h)throw new Error("Error: "+c)}throw new Error("Unknown element "+h)}function d(a,b){return b.levels}a.LegacyTileSource=function(c){var d,e,f;a.isArray(c)&&(d={type:"legacy-image-pyramid",levels:c}),d.levels=b(d.levels),d.levels.length>0?(e=d.levels[d.levels.length-1].width,f=d.levels[d.levels.length-1].height):(e=0,f=0,a.console.error("No supported image formats found")),a.extend(!0,d,{width:e,height:f,tileSize:Math.max(f,e),tileOverlap:0,minLevel:0,maxLevel:d.levels.length>0?d.levels.length-1:0}),a.TileSource.apply(this,[d]),this.levels=d.levels},a.extend(a.LegacyTileSource.prototype,a.TileSource.prototype,{supports:function(a){return a.type&&"legacy-image-pyramid"==a.type||a.documentElement&&"legacy-image-pyramid"==a.documentElement.getAttribute("type")},configure:function(b){var e;return e=a.isPlainObject(b)?d(this,b):c(this,b)},getLevelScale:function(a){var b=0/0;return this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(b=this.levels[a].width/this.levels[this.maxLevel].width),b},getNumTiles:function(b){var c=this.getLevelScale(b);return c?new a.Point(1,1):new a.Point(0,0)},getTileAtPoint:function(){return new a.Point(0,0)},getTileUrl:function(a){var b=null;return this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(b=this.levels[a].url),b}})}(OpenSeadragon),function(a){a.TileSourceCollection=function(b){var c;c=a.isPlainObject(b)?b:{tileSize:arguments[0],tileSources:arguments[1],rows:arguments[2],layout:arguments[3]},c.layout||(c.layout="horizontal");var d=0,e=1,f=Math.ceil(c.tileSources.length/c.rows),g=f>=c.rows?f:c.rows;for("horizontal"==c.layout?(c.width=c.tileSize*f,c.height=c.tileSize*c.rows):(c.height=c.tileSize*f,c.width=c.tileSize*c.rows),c.tileOverlap=-c.tileMargin,c.tilesPerRow=f;e<c.tileSize*g;)e=2*e,d++;c.minLevel=d,a.TileSource.apply(this,[c])},a.extend(a.TileSourceCollection.prototype,a.TileSource.prototype,{getTileBounds:function(b,c,d){var e=this.dimensions.times(this.getLevelScale(b)),f=this.tileSize*c-this.tileOverlap,g=this.tileSize*d-this.tileOverlap,h=this.tileSize+1*this.tileOverlap,i=this.tileSize+1*this.tileOverlap,j=1/e.x;return h=Math.min(h,e.x-f),i=Math.min(i,e.y-g),new a.Rect(f*j,g*j,h*j,i*j)},configure:function(){},getTileUrl:function(){return null}})}(OpenSeadragon),function(a){function b(b){a.requestAnimationFrame(function(){c(b)})}function c(c){var d,e,f;c.shouldFade&&(d=a.now(),e=d-c.fadeBeginTime,f=1-e/c.fadeLength,f=Math.min(1,f),f=Math.max(0,f),c.imgGroup&&a.setElementOpacity(c.imgGroup,f,!0),f>0&&b(c))}function d(c){c.shouldFade=!0,c.fadeBeginTime=a.now()+c.fadeDelay,window.setTimeout(function(){b(c)},c.fadeDelay)}function e(b){b.shouldFade=!1,b.imgGroup&&a.setElementOpacity(b.imgGroup,1,!0)}function f(b,c){b.element.disabled||(c>=a.ButtonState.GROUP&&b.currentState==a.ButtonState.REST&&(e(b),b.currentState=a.ButtonState.GROUP),c>=a.ButtonState.HOVER&&b.currentState==a.ButtonState.GROUP&&(b.imgHover&&(b.imgHover.style.visibility=""),b.currentState=a.ButtonState.HOVER),c>=a.ButtonState.DOWN&&b.currentState==a.ButtonState.HOVER&&(b.imgDown&&(b.imgDown.style.visibility=""),b.currentState=a.ButtonState.DOWN))}function g(b,c){b.element.disabled||(c<=a.ButtonState.HOVER&&b.currentState==a.ButtonState.DOWN&&(b.imgDown&&(b.imgDown.style.visibility="hidden"),b.currentState=a.ButtonState.HOVER),c<=a.ButtonState.GROUP&&b.currentState==a.ButtonState.HOVER&&(b.imgHover&&(b.imgHover.style.visibility="hidden"),b.currentState=a.ButtonState.GROUP),c<=a.ButtonState.REST&&b.currentState==a.ButtonState.GROUP&&(d(b),b.currentState=a.ButtonState.REST))}a.ButtonState={REST:0,GROUP:1,HOVER:2,DOWN:3},a.Button=function(b){var c=this;a.EventSource.call(this),a.extend(!0,this,{tooltip:null,srcRest:null,srcGroup:null,srcHover:null,srcDown:null,clickTimeThreshold:a.DEFAULT_SETTINGS.clickTimeThreshold,clickDistThreshold:a.DEFAULT_SETTINGS.clickDistThreshold,fadeDelay:0,fadeLength:2e3,onPress:null,onRelease:null,onClick:null,onEnter:null,onExit:null,onFocus:null,onBlur:null},b),this.element=b.element||a.makeNeutralElement("button"),b.element||(this.imgRest=a.makeTransparentImage(this.srcRest),this.imgGroup=a.makeTransparentImage(this.srcGroup),this.imgHover=a.makeTransparentImage(this.srcHover),this.imgDown=a.makeTransparentImage(this.srcDown),this.imgDiv=a.makeNeutralElement("div"),this.imgDiv.style.position="relative",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",a.Browser.vendor==a.BROWSERS.FIREFOX&&a.Browser.version<3&&(this.imgGroup.style.top=this.imgHover.style.top=this.imgDown.style.top=""),this.imgDiv.appendChild(this.imgRest),this.imgDiv.appendChild(this.imgGroup),this.imgDiv.appendChild(this.imgHover),this.imgDiv.appendChild(this.imgDown),this.element.appendChild(this.imgDiv)),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),this.currentState=a.ButtonState.GROUP,this.fadeBeginTime=null,this.shouldFade=!1,this.element.style.display="inline-block",this.element.style.position="relative",this.element.title=this.tooltip,this.tracker=new a.MouseTracker({element:this.element,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,enterHandler:function(b){b.insideElementPressed?(f(c,a.ButtonState.DOWN),c.raiseEvent("enter",{originalEvent:b.originalEvent})):b.buttonDownAny||f(c,a.ButtonState.HOVER)},focusHandler:function(a){this.enterHandler(a),c.raiseEvent("focus",{originalEvent:a.originalEvent})},exitHandler:function(b){g(c,a.ButtonState.GROUP),b.insideElementPressed&&c.raiseEvent("exit",{originalEvent:b.originalEvent})},blurHandler:function(a){this.exitHandler(a),c.raiseEvent("blur",{originalEvent:a.originalEvent})},pressHandler:function(b){f(c,a.ButtonState.DOWN),c.raiseEvent("press",{originalEvent:b.originalEvent})},releaseHandler:function(b){b.insideElementPressed&&b.insideElementReleased?(g(c,a.ButtonState.HOVER),c.raiseEvent("release",{originalEvent:b.originalEvent})):b.insideElementPressed?g(c,a.ButtonState.GROUP):f(c,a.ButtonState.HOVER)},clickHandler:function(a){a.quick&&c.raiseEvent("click",{originalEvent:a.originalEvent})},keyHandler:function(a){return 13===a.keyCode?(c.raiseEvent("click",{originalEvent:a.originalEvent}),c.raiseEvent("release",{originalEvent:a.originalEvent}),!1):!0}}).setTracking(!0),g(this,a.ButtonState.REST)},a.extend(a.Button.prototype,a.EventSource.prototype,{notifyGroupEnter:function(){f(this,a.ButtonState.GROUP)},notifyGroupExit:function(){g(this,a.ButtonState.REST)},disable:function(){this.notifyGroupExit(),this.element.disabled=!0,a.setElementOpacity(this.element,.2,!0)},enable:function(){this.element.disabled=!1,a.setElementOpacity(this.element,1,!0),this.notifyGroupEnter()}})}(OpenSeadragon),function(a){a.ButtonGroup=function(b){a.extend(!0,this,{buttons:[],clickTimeThreshold:a.DEFAULT_SETTINGS.clickTimeThreshold,clickDistThreshold:a.DEFAULT_SETTINGS.clickDistThreshold,labelText:""},b);var c,d=this.buttons.concat([]),e=this;if(this.element=b.element||a.makeNeutralElement("fieldgroup"),!b.group)for(this.label=a.makeNeutralElement("label"),this.element.style.display="inline-block",this.element.appendChild(this.label),c=0;c<d.length;c++)this.element.appendChild(d[c].element);this.tracker=new a.MouseTracker({element:this.element,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,enterHandler:function(){var a;for(a=0;a<e.buttons.length;a++)e.buttons[a].notifyGroupEnter()},exitHandler:function(a){var b;if(!a.insideElementPressed)for(b=0;b<e.buttons.length;b++)e.buttons[b].notifyGroupExit()},releaseHandler:function(a){var b;if(!a.insideElementReleased)for(b=0;b<e.buttons.length;b++)e.buttons[b].notifyGroupExit()}}).setTracking(!0)},a.ButtonGroup.prototype={emulateEnter:function(){this.tracker.enterHandler({eventSource:this.tracker})},emulateExit:function(){this.tracker.exitHandler({eventSource:this.tracker})}}}(OpenSeadragon),function(a){a.Rect=function(a,b,c,d){this.x="number"==typeof a?a:0,this.y="number"==typeof b?b:0,this.width="number"==typeof c?c:0,this.height="number"==typeof d?d:0},a.Rect.prototype={getAspectRatio:function(){return this.width/this.height},getTopLeft:function(){return new a.Point(this.x,this.y)},getBottomRight:function(){return new a.Point(this.x+this.width,this.y+this.height)},getTopRight:function(){return new a.Point(this.x+this.width,this.y)},getBottomLeft:function(){return new a.Point(this.x,this.y+this.height)},getCenter:function(){return new a.Point(this.x+this.width/2,this.y+this.height/2)},getSize:function(){return new a.Point(this.width,this.height)},equals:function(b){return b instanceof a.Rect&&this.x===b.x&&this.y===b.y&&this.width===b.width&&this.height===b.height},rotate:function(b,c){var d,e=this.width,f=this.height;if(b=(b+360)%360,b%90!==0)throw new Error("Currently only 0, 90, 180, and 270 degrees are supported.");if(0===b)return new a.Rect(this.x,this.y,this.width,this.height);switch(c=c||this.getCenter(),b){case 90:d=this.getBottomLeft(),e=this.height,f=this.width;break;case 180:d=this.getBottomRight();break;case 270:d=this.getTopRight(),e=this.height,f=this.width;break;default:d=this.getTopLeft()}return d=d.rotate(b,c),new a.Rect(d.x,d.y,e,f)},toString:function(){return"["+Math.round(100*this.x)+","+Math.round(100*this.y)+","+Math.round(100*this.width)+"x"+Math.round(100*this.height)+"]"}}}(OpenSeadragon),function(a){function b(b){var c=Number(this.element.style.marginLeft.replace("px","")),e=Number(this.element.style.marginTop.replace("px","")),f=Number(this.element.style.width.replace("px","")),g=Number(this.element.style.height.replace("px","")),h=a.getElementSize(this.viewer.canvas);return this.dragging=!0,this.element&&("horizontal"==this.scroll?-b.delta.x>0?c>-(f-h.x)&&(this.element.style.marginLeft=c+2*b.delta.x+"px",d(this,h.x,c+2*b.delta.x)):-b.delta.x<0&&0>c&&(this.element.style.marginLeft=c+2*b.delta.x+"px",d(this,h.x,c+2*b.delta.x)):-b.delta.y>0?e>-(g-h.y)&&(this.element.style.marginTop=e+2*b.delta.y+"px",d(this,h.y,e+2*b.delta.y)):-b.delta.y<0&&0>e&&(this.element.style.marginTop=e+2*b.delta.y+"px",d(this,h.y,e+2*b.delta.y))),!1}function c(b){var c=Number(this.element.style.marginLeft.replace("px","")),e=Number(this.element.style.marginTop.replace("px","")),f=Number(this.element.style.width.replace("px","")),g=Number(this.element.style.height.replace("px","")),h=a.getElementSize(this.viewer.canvas);return this.element&&("horizontal"==this.scroll?b.scroll>0?c>-(f-h.x)&&(this.element.style.marginLeft=c-60*b.scroll+"px",d(this,h.x,c-60*b.scroll)):b.scroll<0&&0>c&&(this.element.style.marginLeft=c-60*b.scroll+"px",d(this,h.x,c-60*b.scroll)):b.scroll<0?e>h.y-g&&(this.element.style.marginTop=e+60*b.scroll+"px",d(this,h.y,e+60*b.scroll)):b.scroll>0&&0>e&&(this.element.style.marginTop=e+60*b.scroll+"px",d(this,h.y,e+60*b.scroll))),!1}function d(b,c,d){var e,f,g,h,i,j,k;for(e="horizontal"==b.scroll?b.panelWidth:b.panelHeight,f=Math.ceil(c/e)+5,g=Math.ceil((Math.abs(d)+c)/e)+1,f=g-f,f=0>f?0:f,j=f;g>j&&j<b.panels.length;j++)k=b.panels[j],k.activePanel||(h=new a.Viewer({id:k.id,tileSources:[b.viewer.tileSources[j]],element:k,navigatorSizeRatio:b.sizeRatio,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:0}),h.displayRegion=a.makeNeutralElement("textarea"),h.displayRegion.id=k.id+"-displayregion",h.displayRegion.className="displayregion",i=h.displayRegion.style,i.position="relative",i.top="0px",i.left="0px",i.fontSize="0px",i.overflow="hidden",i.float="left",i.cssFloat="left",i.styleFloat="left",i.zIndex=999999999,i.cursor="default",i.width=b.panelWidth-4+"px",i.height=b.panelHeight-4+"px",h.displayRegion.innerTracker=new a.MouseTracker({element:h.displayRegion}),k.getElementsByTagName("form")[0].appendChild(h.displayRegion),k.activePanel=!0)}function e(a){var b=a.eventSource.element;return"horizontal"==this.scroll?b.style.marginBottom="0px":b.style.marginLeft="0px",!1}function f(b){var c=b.eventSource.element;return"horizontal"==this.scroll?c.style.marginBottom="-"+a.getElementSize(c).y/2+"px":c.style.marginLeft="-"+a.getElementSize(c).x/2+"px",!1}function g(a){switch(a.keyCode){case 61:return c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null}),!1;case 45:return c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null}),!1;case 48:case 119:case 87:case 38:return c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null}),!1;case 115:case 83:case 40:return c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null}),!1;case 97:case 37:return c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null}),!1;case 100:case 39:return c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null}),!1;default:return!0}}var h={};a.ReferenceStrip=function(i){var j,k,l,m=this,n=i.viewer,o=a.getElementSize(n.element);for(i.id||(i.id="referencestrip-"+a.now(),this.element=a.makeNeutralElement("div"),this.element.id=i.id,this.element.className="referencestrip"),i=a.extend(!0,{sizeRatio:a.DEFAULT_SETTINGS.referenceStripSizeRatio,position:a.DEFAULT_SETTINGS.referenceStripPosition,scroll:a.DEFAULT_SETTINGS.referenceStripScroll,clickTimeThreshold:a.DEFAULT_SETTINGS.clickTimeThreshold},i,{element:this.element,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1}),a.extend(this,i),h[this.id]={animating:!1},this.minPixelRatio=this.viewer.minPixelRatio,k=this.element.style,k.marginTop="0px",k.marginRight="0px",k.marginBottom="0px",k.marginLeft="0px",k.left="0px",k.bottom="0px",k.border="0px",k.background="#000",k.position="relative",a.setElementOpacity(this.element,.8),this.viewer=n,this.innerTracker=new a.MouseTracker({element:this.element,dragHandler:a.delegate(this,b),scrollHandler:a.delegate(this,c),enterHandler:a.delegate(this,e),exitHandler:a.delegate(this,f),keyHandler:a.delegate(this,g)}).setTracking(!0),i.width&&i.height?(this.element.style.width=i.width+"px",this.element.style.height=i.height+"px",n.addControl(this.element,{anchor:a.ControlAnchor.BOTTOM_LEFT})):"horizontal"==i.scroll?(this.element.style.width=o.x*i.sizeRatio*n.tileSources.length+12*n.tileSources.length+"px",this.element.style.height=o.y*i.sizeRatio+"px",n.addControl(this.element,{anchor:a.ControlAnchor.BOTTOM_LEFT})):(this.element.style.height=o.y*i.sizeRatio*n.tileSources.length+12*n.tileSources.length+"px",this.element.style.width=o.x*i.sizeRatio+"px",n.addControl(this.element,{anchor:a.ControlAnchor.TOP_LEFT})),this.panelWidth=o.x*this.sizeRatio+8,this.panelHeight=o.y*this.sizeRatio+8,this.panels=[],l=0;l<n.tileSources.length;l++)j=a.makeNeutralElement("div"),j.id=this.element.id+"-"+l,j.style.width=m.panelWidth+"px",j.style.height=m.panelHeight+"px",j.style.display="inline",j.style.float="left",j.style.cssFloat="left",j.style.styleFloat="left",j.style.padding="2px",j.innerTracker=new a.MouseTracker({element:j,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,pressHandler:function(b){b.eventSource.dragging=a.now()
-},releaseHandler:function(b){var c=b.eventSource,d=c.element.id,e=Number(d.split("-")[2]),f=a.now();b.insideElementPressed&&b.insideElementReleased&&c.dragging&&f-c.dragging<c.clickTimeThreshold&&(c.dragging=null,n.goToPage(e))}}).setTracking(!0),this.element.appendChild(j),j.activePanel=!1,this.panels.push(j);d(this,"vertical"==this.scroll?o.y:o.y,0),this.setFocus(0)},a.extend(a.ReferenceStrip.prototype,a.EventSource.prototype,a.Viewer.prototype,{setFocus:function(b){var c,f=a.getElement(this.element.id+"-"+b),g=a.getElementSize(this.viewer.canvas),h=Number(this.element.style.width.replace("px","")),i=Number(this.element.style.height.replace("px","")),j=-Number(this.element.style.marginLeft.replace("px","")),k=-Number(this.element.style.marginTop.replace("px",""));this.currentSelected!==f&&(this.currentSelected&&(this.currentSelected.style.background="#000"),this.currentSelected=f,this.currentSelected.style.background="#999","horizontal"==this.scroll?(c=Number(b)*(this.panelWidth+3),c>j+g.x-this.panelWidth?(c=Math.min(c,h-g.x),this.element.style.marginLeft=-c+"px",d(this,g.x,-c)):j>c&&(c=Math.max(0,c-g.x/2),this.element.style.marginLeft=-c+"px",d(this,g.x,-c))):(c=Number(b)*(this.panelHeight+3),c>k+g.y-this.panelHeight?(c=Math.min(c,i-g.y),this.element.style.marginTop=-c+"px",d(this,g.y,-c)):k>c&&(c=Math.max(0,c-g.y/2),this.element.style.marginTop=-c+"px",d(this,g.y,-c))),this.currentPage=b,a.getElement(f.id+"-displayregion").focus(),e.call(this,{eventSource:this.innerTracker}))},update:function(){return h[this.id].animating?(a.console.log("image reference strip update"),!0):!1}})}(OpenSeadragon),function(a){a.DisplayRect=function(b,c,d,e,f,g){a.Rect.apply(this,[b,c,d,e]),this.minLevel=f,this.maxLevel=g},a.extend(a.DisplayRect.prototype,a.Rect.prototype)}(OpenSeadragon),function(a){function b(a,b){return(1-Math.exp(a*-b))/(1-Math.exp(-a))}a.Spring=function(b){var c=arguments;"object"!=typeof b&&(b={initial:c.length&&"number"==typeof c[0]?c[0]:0,springStiffness:c.length>1?c[1].springStiffness:5,animationTime:c.length>1?c[1].animationTime:1.5}),a.extend(!0,this,b),this.current={value:"number"==typeof this.initial?this.initial:0,time:a.now()},this.start={value:this.current.value,time:this.current.time},this.target={value:this.current.value,time:this.current.time}},a.Spring.prototype={resetTo:function(a){this.target.value=a,this.target.time=this.current.time,this.start.value=this.target.value,this.start.time=this.target.time},springTo:function(a){this.start.value=this.current.value,this.start.time=this.current.time,this.target.value=a,this.target.time=this.start.time+1e3*this.animationTime},shiftBy:function(a){this.start.value+=a,this.target.value+=a},update:function(){this.current.time=a.now(),this.current.value=this.current.time>=this.target.time?this.target.value:this.start.value+(this.target.value-this.start.value)*b(this.springStiffness,(this.current.time-this.start.time)/(this.target.time-this.start.time))}}}(OpenSeadragon),function(a){var b={};a.Tile=function(a,b,c,d,e,f){this.level=a,this.x=b,this.y=c,this.bounds=d,this.exists=e,this.url=f,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.blendStart=null,this.opacity=null,this.distance=null,this.visibility=null,this.beingDrawn=!1,this.lastTouchTime=0},a.Tile.prototype={toString:function(){return this.level+"/"+this.x+"_"+this.y},drawHTML:function(b){return this.loaded&&this.image?(this.element||(this.element=a.makeNeutralElement("div"),this.imgElement=a.makeNeutralElement("img"),this.imgElement.src=this.url,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!=b&&b.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",void a.setElementOpacity(this.element,this.opacity)):void a.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString())},drawCanvas:function(c,d){var e,f,g=this.position,h=this.size;return this.loaded&&(this.image||b[this.url])?(c.globalAlpha=this.opacity,1==c.globalAlpha&&this.url.match(".png")&&c.clearRect(g.x+1,g.y+1,h.x-2,h.y-2),b[this.url]||(f=document.createElement("canvas"),f.width=this.image.width,f.height=this.image.height,e=f.getContext("2d"),e.drawImage(this.image,0,0),b[this.url]=e,this.image=null),e=b[this.url],d({context:c,tile:this,rendered:e}),void c.drawImage(e.canvas,0,0,e.canvas.width,e.canvas.height,g.x,g.y,h.x,h.y)):void a.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString())},unload:function(){this.imgElement&&this.imgElement.parentNode&&this.imgElement.parentNode.removeChild(this.imgElement),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),b[this.url]&&delete b[this.url],this.element=null,this.imgElement=null,this.image=null,this.loaded=!1,this.loading=!1}}}(OpenSeadragon),function(a){a.OverlayPlacement={CENTER:0,TOP_LEFT:1,TOP:2,TOP_RIGHT:3,RIGHT:4,BOTTOM_RIGHT:5,BOTTOM:6,BOTTOM_LEFT:7,LEFT:8},a.Overlay=function(b,c,d){var e;e=a.isPlainObject(b)?b:{element:b,location:c,placement:d},this.element=e.element,this.scales=e.location instanceof a.Rect,this.bounds=new a.Rect(e.location.x,e.location.y,e.location.width,e.location.height),this.position=new a.Point(e.location.x,e.location.y),this.size=new a.Point(e.location.width,e.location.height),this.style=e.element.style,this.placement=e.location instanceof a.Point?e.placement:a.OverlayPlacement.TOP_LEFT,this.onDraw=e.onDraw},a.Overlay.prototype={adjust:function(b,c){switch(this.placement){case a.OverlayPlacement.TOP_LEFT:break;case a.OverlayPlacement.TOP:b.x-=c.x/2;break;case a.OverlayPlacement.TOP_RIGHT:b.x-=c.x;break;case a.OverlayPlacement.RIGHT:b.x-=c.x,b.y-=c.y/2;break;case a.OverlayPlacement.BOTTOM_RIGHT:b.x-=c.x,b.y-=c.y;break;case a.OverlayPlacement.BOTTOM:b.x-=c.x/2,b.y-=c.y;break;case a.OverlayPlacement.BOTTOM_LEFT:b.y-=c.y;break;case a.OverlayPlacement.LEFT:b.y-=c.y/2;break;default:case a.OverlayPlacement.CENTER:b.x-=c.x/2,b.y-=c.y/2}},destroy:function(){var a=this.element,b=this.style;a.parentNode&&(a.parentNode.removeChild(a),a.prevElementParent&&(b.display="none",document.body.appendChild(a))),this.onDraw=null,b.top="",b.left="",b.position="",this.scales&&(b.width="",b.height="")},drawHTML:function(b,c){var d,e,f,g=this.element,h=this.style,i=this.scales,j=new a.Point(c.viewer.drawer.canvas.width/2,c.viewer.drawer.canvas.height/2),k=c.degrees;g.parentNode!=b&&(g.prevElementParent=g.parentNode,g.prevNextSibling=g.nextSibling,b.appendChild(g)),i||(this.size=a.getElementSize(g)),d=this.position,e=this.size,this.adjust(d,e),d=d.apply(Math.floor),e=e.apply(Math.ceil),0!==k&&this.scales&&(f=new a.Point(e.x/2,e.y/2),d=d.plus(f).rotate(k,j).minus(f),e=e.rotate(k,new a.Point(0,0)),e=new a.Point(Math.abs(e.x),Math.abs(e.y))),this.onDraw?this.onDraw(d,e,g):(h.left=d.x+"px",h.top=d.y+"px",h.position="absolute",h.display="block",i&&(h.width=e.x+"px",h.height=e.y+"px"))},update:function(b,c){this.scales=b instanceof a.Rect,this.bounds=new a.Rect(b.x,b.y,b.width,b.height),this.placement=b instanceof a.Point?c:a.OverlayPlacement.TOP_LEFT}}}(OpenSeadragon),function(a){function b(b,c){var d=null,e=c.height&&c.width?new a.Rect(c.x||c.px,c.y||c.py,c.width,c.height):new a.Point(c.x||c.px,c.y||c.py),f=c.id?c.id:"openseadragon-overlay-"+Math.floor(1e7*Math.random());return d=a.getElement(c.id),d||(d=document.createElement("a"),d.href="#/overlay/"+f),d.id=f,a.addClass(d,c.className?c.className:"openseadragon-overlay"),void 0!==c.px&&(e=b.viewport.imageToViewportRectangle(e)),new a.Overlay(c.placement?{element:d,location:b.viewport.pointFromPixel(e),placement:a.OverlayPlacement[c.placement.toUpperCase()],onDraw:c.onDraw}:{element:d,location:e,onDraw:c.onDraw})}function c(b){b.updateAgain=!1,b.viewer&&b.viewer.raiseEvent("update-viewport",{});for(var c,e,f,h,i,j,k,m,n=null,o=!1,p=a.now(),q=b.viewport.getContainerSize(),r=b.viewport.getBounds(!0),t=r.getTopLeft(),v=r.getBottomRight(),w=b.viewport.deltaPixelsFromPoints(b.source.getPixelRatio(0),!0).x,x=Math.max(b.source.minLevel,Math.floor(Math.log(b.minZoomImageRatio)/Math.log(2))),y=Math.min(Math.abs(b.source.maxLevel),Math.abs(Math.floor(Math.log(w/b.minPixelRatio)/Math.log(2)))),z=b.viewport.degrees;b.lastDrawn.length>0;)c=b.lastDrawn.pop(),c.beingDrawn=!1;if(b.canvas.innerHTML="",b.useCanvas&&((b.canvas.width!=q.x||b.canvas.height!=q.y)&&(b.canvas.width=q.x,b.canvas.height=q.y),b.context.clearRect(0,0,q.x,q.y)),90===z||270===z){var A=r.rotate(z);t=A.getTopLeft(),v=A.getBottomRight()}if(!(!b.wrapHorizontal&&(v.x<0||t.x>1)||!b.wrapVertical&&(v.y<0||t.y>b.normHeight))){b.wrapHorizontal||(t.x=Math.max(t.x,0),v.x=Math.min(v.x,1)),b.wrapVertical||(t.y=Math.max(t.y,0),v.y=Math.min(v.y,b.normHeight)),x=Math.min(x,y);var B;for(e=y;e>=x;e--){if(B=!1,f=b.viewport.deltaPixelsFromPoints(b.source.getPixelRatio(e),!0).x,!o&&f>=b.minPixelRatio||e==x)B=!0,o=!0;else if(!o)continue;if(h=b.viewport.deltaPixelsFromPoints(b.source.getPixelRatio(e),!1).x,i=b.viewport.deltaPixelsFromPoints(b.source.getPixelRatio(Math.max(b.source.getClosestLevel(b.viewport.containerSize)-1,0)),!1).x,j=b.immediateRender?1:i,k=Math.min(1,(f-.5)/.5),m=j/Math.abs(j-h),n=d(b,o,B,e,k,m,t,v,p,n),l(b.coverage,e))break}u(b,b.lastDrawn),s(b.viewport,b.overlays,b.container),n&&(g(b,n,p),b.updateAgain=!0)}}function d(a,b,c,d,f,g,h,i,j,k){var l,m,n,p,q,r=a.viewport.pixelFromPoint(a.viewport.getCenter());for(a.viewer&&a.viewer.raiseEvent("update-level",{havedrawn:b,level:d,opacity:f,visibility:g,topleft:h,bottomright:i,currenttime:j,best:k}),n=a.source.getTileAtPoint(d,h),p=a.source.getTileAtPoint(d,i),q=a.source.getNumTiles(d),o(a.coverage,d),a.wrapHorizontal||(p.x=Math.min(p.x,q.x-1)),a.wrapVertical||(p.y=Math.min(p.y,q.y-1)),l=n.x;l<=p.x;l++)for(m=n.y;m<=p.y;m++)k=e(a,c,b,l,m,d,f,g,r,q,j,k);return k}function e(a,b,c,d,e,g,h,k,l,o,p,r){var s=f(d,e,g,a.source,a.tilesMatrix,p,o,a.normHeight),t=b;if(a.viewer&&a.viewer.raiseEvent("update-tile",{tile:s}),n(a.coverage,g,d,e,!1),!s.exists)return r;if(c&&!t&&(m(a.coverage,g,d,e)?n(a.coverage,g,d,e,!0):t=!0),!t)return r;if(i(s,a.source.tileOverlap,a.viewport,l,k),s.loaded){var u=j(a,s,d,e,g,h,p);u&&(a.updateAgain=!0)}else s.loading||(r=q(r,s));return r}function f(b,c,d,e,f,g,h,i){var j,k,l,m,n,o;return f[d]||(f[d]={}),f[d][b]||(f[d][b]={}),f[d][b][c]||(j=(h.x+b%h.x)%h.x,k=(h.y+c%h.y)%h.y,l=e.getTileBounds(d,j,k),m=e.tileExists(d,j,k),n=e.getTileUrl(d,j,k),l.x+=1*(b-j)/h.x,l.y+=i*(c-k)/h.y,f[d][b][c]=new a.Tile(d,b,c,l,m,n)),o=f[d][b][c],o.lastTouchTime=g,o}function g(a,b,c){a.viewport.collectionMode?(a.midUpdate=!1,h(a,b,c)):b.loading=a.loadImage(b.url,function(d){h(a,b,c,d)})}function h(b,c,d,e){var f,g,h,i,j,k,l,m,n,o;if(c.loading=!1,b.midUpdate)return void a.console.warn("Tile load callback in middle of drawing routine.");if(e||b.viewport.collectionMode){if(d<b.lastResetTime)return void a.console.log("Ignoring tile %s loaded before reset: %s",c,c.url)}else if(a.console.log("Tile %s failed to load: %s",c,c.url),!b.debugMode)return void(c.exists=!1);if(c.loaded=!0,c.image=e,f=b.tilesLoaded.length,b.tilesLoaded.length>=b.maxImageCacheCount){for(g=Math.ceil(Math.log(b.source.tileSize)/Math.log(2)),h=null,k=-1,o=b.tilesLoaded.length-1;o>=0;o--)l=b.tilesLoaded[o],l.level<=b.cutoff||l.beingDrawn||(h?(m=l.lastTouchTime,i=h.lastTouchTime,n=l.level,j=h.level,(i>m||m==i&&n>j)&&(h=l,k=o)):(h=l,k=o));h&&k>=0&&(h.unload(),f=k)}b.tilesLoaded[f]=c,b.updateAgain=!0}function i(b,c,d,e,f){var g=b.bounds.getTopLeft(),h=b.bounds.getSize(),i=d.pixelFromPoint(g,!0),j=d.pixelFromPoint(g,!1),k=d.deltaPixelsFromPoints(h,!0),l=d.deltaPixelsFromPoints(h,!1),m=j.plus(l.divide(2)),n=e.distanceTo(m);c||(k=k.plus(new a.Point(1,1))),b.position=i,b.size=k,b.distance=n,b.visibility=f}function j(a,b,c,d,e,f,g){var h,i,j=1e3*a.blendTime;if(b.blendStart||(b.blendStart=g),h=g-b.blendStart,i=j?Math.min(1,h/j):1,a.alwaysBlend&&(i*=f),b.opacity=i,a.lastDrawn.push(b),1==i)n(a.coverage,e,c,d,!0);else if(j>h)return!0;return!1}function k(a){a.tilesMatrix={},a.tilesLoaded=[]}function l(a,b,c,d){var e,f,g,h;if(!a[b])return!1;if(void 0===c||void 0===d){e=a[b];for(g in e)if(e.hasOwnProperty(g)){f=e[g];for(h in f)if(f.hasOwnProperty(h)&&!f[h])return!1}return!0}return void 0===a[b][c]||void 0===a[b][c][d]||a[b][c][d]===!0}function m(a,b,c,d){return void 0===c||void 0===d?l(a,b+1):l(a,b+1,2*c,2*d)&&l(a,b+1,2*c,2*d+1)&&l(a,b+1,2*c+1,2*d)&&l(a,b+1,2*c+1,2*d+1)}function n(b,c,d,e,f){return b[c]?(b[c][d]||(b[c][d]={}),void(b[c][d][e]=f)):void a.console.warn("Setting coverage for a tile before its level's coverage has been reset: %s",c)}function o(a,b){a[b]={}}function p(a,b){var c;for(c=a.length-1;c>=0;c--)if(a[c].element==b)return c;return-1}function q(a,b){return a?b.visibility>a.visibility?b:b.visibility==a.visibility&&b.distance<a.distance?b:a:b}function r(b,c,d,e){b.onload=null,b.onabort=null,b.onerror=null,e&&window.clearTimeout(e),a.requestAnimationFrame(function(){c(b.src,d?b:null)})}function s(a,b,c){var d,e=b.length;for(d=0;e>d;d++)t(a,b[d],c)}function t(a,b,c){b.position=a.pixelFromPoint(b.bounds.getTopLeft(),!0),b.size=a.deltaPixelsFromPoints(b.bounds.getSize(),!0),b.drawHTML(c,a)}function u(b,c){var d,e,f,g,h,i,j,k,l=function(a){b.viewer&&b.viewer.raiseEvent("tile-drawing",a)};for(d=c.length-1;d>=0;d--){if(e=c[d],b.viewport.collectionMode?(f=e.x+"/"+e.y,h=b.viewport,k=h.collectionTileSource,b.collectionOverlays[f]?(g=b.collectionOverlays[f],g.viewport&&(g.viewport.resize(e.size,!0),g.viewport.goHome(!0))):(i="horizontal"==k.layout?e.y+e.x*k.rows:e.x+e.y*k.rows,j=i<k.tileSources.length?k.tileSources[i]:null,j&&(b.collectionOverlays[f]=g=new a.Viewer({hash:h.viewer.hash+"-"+f,element:a.makeNeutralElement("div"),mouseNavEnabled:!1,showNavigator:!1,showSequenceControl:!1,showNavigationControl:!1,tileSources:[j]}),A&&(g.element.style.border="1px solid rgba(255,255,255,0.38)",g.element.style["-webkit-box-reflect"]="below 0px -webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(62%,transparent),to(rgba(255,255,255,0.62)))"),b.addOverlay(g.element,e.bounds)))):(b.useCanvas?0!==b.viewport.degrees?(v(e,b.canvas,b.context,b.viewport.degrees),e.drawCanvas(b.context,l),w(e,b.canvas,b.context)):e.drawCanvas(b.context,l):e.drawHTML(b.canvas),e.beingDrawn=!0),b.debugMode)try{x(b,e,c.length,d)}catch(m){a.console.error(m)}b.viewer&&b.viewer.raiseEvent("tile-drawn",{tile:e})}}function v(a,b,c,d){var e=b.width/2,f=b.height/2,g=a.position.x-e,h=a.position.y-f;c.save(),c.translate(e,f),c.rotate(Math.PI/180*d),a.position.x=g,a.position.y=h}function w(a,b,c){var d=b.width/2,e=b.height/2,f=a.position.x+d,g=a.position.y+e;a.position.x=f,a.position.y=g,c.restore()}function x(a,b,c,d){a.useCanvas&&(a.context.save(),a.context.lineWidth=2,a.context.font="small-caps bold 13px ariel",a.context.strokeStyle=a.debugGridColor,a.context.fillStyle=a.debugGridColor,a.context.strokeRect(b.position.x,b.position.y,b.size.x,b.size.y),0===b.x&&0===b.y&&(a.context.fillText("Zoom: "+a.viewport.getZoom(),b.position.x,b.position.y-30),a.context.fillText("Pan: "+a.viewport.getBounds().toString(),b.position.x,b.position.y-20)),a.context.fillText("Level: "+b.level,b.position.x+10,b.position.y+20),a.context.fillText("Column: "+b.x,b.position.x+10,b.position.y+30),a.context.fillText("Row: "+b.y,b.position.x+10,b.position.y+40),a.context.fillText("Order: "+d+" of "+c,b.position.x+10,b.position.y+50),a.context.fillText("Size: "+b.size.toString(),b.position.x+10,b.position.y+60),a.context.fillText("Position: "+b.position.toString(),b.position.x+10,b.position.y+70),a.context.restore())}var y=(a.getWindowSize(),a.Browser.vendor),z=a.Browser.version,A=y==a.BROWSERS.FIREFOX||y==a.BROWSERS.OPERA||y==a.BROWSERS.SAFARI&&z>=4||y==a.BROWSERS.CHROME&&z>=2||y==a.BROWSERS.IE&&z>=9;a.Drawer=function(c){var d,e=arguments;for(a.isPlainObject(c)||(c={source:e[0],viewport:e[1],element:e[2]}),a.extend(!0,this,{viewer:null,downloading:0,tilesMatrix:{},tilesLoaded:[],coverage:{},lastDrawn:[],lastResetTime:0,midUpdate:!1,updateAgain:!0,overlays:[],collectionOverlays:{},maxImageCacheCount:a.DEFAULT_SETTINGS.maxImageCacheCount,imageLoaderLimit:a.DEFAULT_SETTINGS.imageLoaderLimit,minZoomImageRatio:a.DEFAULT_SETTINGS.minZoomImageRatio,wrapHorizontal:a.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:a.DEFAULT_SETTINGS.wrapVertical,immediateRender:a.DEFAULT_SETTINGS.immediateRender,blendTime:a.DEFAULT_SETTINGS.blendTime,alwaysBlend:a.DEFAULT_SETTINGS.alwaysBlend,minPixelRatio:a.DEFAULT_SETTINGS.minPixelRatio,debugMode:a.DEFAULT_SETTINGS.debugMode,timeout:a.DEFAULT_SETTINGS.timeout},c),this.useCanvas=a.supportsCanvas&&(this.viewer?this.viewer.useCanvas:!0),this.container=a.getElement(this.element),this.canvas=a.makeNeutralElement(this.useCanvas?"canvas":"div"),this.context=this.useCanvas?this.canvas.getContext("2d"):null,this.normHeight=this.source.dimensions.y/this.source.dimensions.x,this.element=this.container,this.container.dir="ltr",this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.position="absolute",this.container.style.textAlign="left",this.container.appendChild(this.canvas),d=0;d<this.overlays.length;d++)a.isPlainObject(this.overlays[d])?this.overlays[d]=b(this,this.overlays[d]):a.isFunction(this.overlays[d])},a.Drawer.prototype={addOverlay:function(b,c,d,e){var f;return f=a.isPlainObject(b)?b:{element:b,location:c,placement:d,onDraw:e},b=a.getElement(f.element),p(this.overlays,b)>=0?void 0:(this.overlays.push(new a.Overlay({element:b,location:f.location,placement:f.placement,onDraw:f.onDraw})),this.updateAgain=!0,this.viewer&&this.viewer.raiseEvent("add-overlay",{element:b,location:f.location,placement:f.placement}),this)},updateOverlay:function(b,c,d){var e;return b=a.getElement(b),e=p(this.overlays,b),e>=0&&(this.overlays[e].update(c,d),this.updateAgain=!0),this.viewer&&this.viewer.raiseEvent("update-overlay",{element:b,location:c,placement:d}),this},removeOverlay:function(b){var c;return b=a.getElement(b),c=p(this.overlays,b),c>=0&&(this.overlays[c].destroy(),this.overlays.splice(c,1),this.updateAgain=!0),this.viewer&&this.viewer.raiseEvent("remove-overlay",{element:b}),this},clearOverlays:function(){for(;this.overlays.length>0;)this.overlays.pop().destroy(),this.updateAgain=!0;return this.viewer&&this.viewer.raiseEvent("clear-overlay",{}),this},needsUpdate:function(){return this.updateAgain},numTilesLoaded:function(){return this.tilesLoaded.length},reset:function(){return k(this),this.lastResetTime=a.now(),this.updateAgain=!0,this},update:function(){return this.midUpdate=!0,c(this),this.midUpdate=!1,this},loadImage:function(b,c){var d,e,f,g=this,h=!1;return(!this.imageLoaderLimit||this.downloading<this.imageLoaderLimit)&&(this.downloading++,d=new Image,d.crossOrigin="Anonymous",f=function(d,e){if(g.downloading--,"function"==typeof c)try{c(e)}catch(f){a.console.error("%s while executing %s callback: %s",f.name,b,f.message,f)}},d.onload=function(){r(d,f,!0,e)},d.onabort=d.onerror=function(){r(d,f,!1,e)},e=window.setTimeout(function(){r(d,f,!1,e)},this.timeout),h=!0,d.src=b),h},canRotate:function(){return this.useCanvas}}}(OpenSeadragon),function(a){a.Viewport=function(b){var c=arguments;c.length&&c[0]instanceof a.Point&&(b={containerSize:c[0],contentSize:c[1],config:c[2]}),b.config&&(a.extend(!0,b,b.config),delete b.config),a.extend(!0,this,{containerSize:null,contentSize:null,zoomPoint:null,viewer:null,springStiffness:a.DEFAULT_SETTINGS.springStiffness,animationTime:a.DEFAULT_SETTINGS.animationTime,minZoomImageRatio:a.DEFAULT_SETTINGS.minZoomImageRatio,maxZoomPixelRatio:a.DEFAULT_SETTINGS.maxZoomPixelRatio,visibilityRatio:a.DEFAULT_SETTINGS.visibilityRatio,wrapHorizontal:a.DEFAULT_SETTINGS.wrapHorizontal,wrapVertical:a.DEFAULT_SETTINGS.wrapVertical,defaultZoomLevel:a.DEFAULT_SETTINGS.defaultZoomLevel,minZoomLevel:a.DEFAULT_SETTINGS.minZoomLevel,maxZoomLevel:a.DEFAULT_SETTINGS.maxZoomLevel,degrees:a.DEFAULT_SETTINGS.degrees},b),this.centerSpringX=new a.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime}),this.centerSpringY=new a.Spring({initial:0,springStiffness:this.springStiffness,animationTime:this.animationTime}),this.zoomSpring=new a.Spring({initial:1,springStiffness:this.springStiffness,animationTime:this.animationTime}),this.resetContentSize(this.contentSize),this.goHome(!0),this.update()},a.Viewport.prototype={resetContentSize:function(b){return this.contentSize=b,this.contentAspectX=this.contentSize.x/this.contentSize.y,this.contentAspectY=this.contentSize.y/this.contentSize.x,this.fitWidthBounds=new a.Rect(0,0,1,this.contentAspectY),this.fitHeightBounds=new a.Rect(0,0,this.contentAspectY,this.contentAspectY),this.homeBounds=new a.Rect(0,0,1,this.contentAspectY),this.viewer&&this.viewer.raiseEvent("reset-size",{contentSize:b}),this},getHomeZoom:function(){var a=this.contentAspectX/this.getAspectRatio();return this.defaultZoomLevel?this.defaultZoomLevel:a>=1?1:a},getHomeBounds:function(){var b=this.homeBounds.getCenter(),c=1/this.getHomeZoom(),d=c/this.getAspectRatio();return new a.Rect(b.x-c/2,b.y-d/2,c,d)},goHome:function(a){return this.viewer&&this.viewer.raiseEvent("home",{immediately:a}),this.fitBounds(this.getHomeBounds(),a)},getMinZoom:function(){var a=this.getHomeZoom(),b=this.minZoomLevel?this.minZoomLevel:this.minZoomImageRatio*a;return Math.min(b,a)},getMaxZoom:function(){var a=this.maxZoomLevel?this.maxZoomLevel:this.contentSize.x*this.maxZoomPixelRatio/this.containerSize.x;return Math.max(a,this.getHomeZoom())},getAspectRatio:function(){return this.containerSize.x/this.containerSize.y},getContainerSize:function(){return new a.Point(this.containerSize.x,this.containerSize.y)},getBounds:function(b){var c=this.getCenter(b),d=1/this.getZoom(b),e=d/this.getAspectRatio();return new a.Rect(c.x-d/2,c.y-e/2,d,e)},getCenter:function(b){var c,d,e,f,g,h,i,j,k=new a.Point(this.centerSpringX.current.value,this.centerSpringY.current.value),l=new a.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);return b?k:this.zoomPoint?(c=this.pixelFromPoint(this.zoomPoint,!0),d=this.getZoom(),e=1/d,f=e/this.getAspectRatio(),g=new a.Rect(k.x-e/2,k.y-f/2,e,f),h=this.zoomPoint.minus(g.getTopLeft()).times(this.containerSize.x/g.width),i=h.minus(c),j=i.divide(this.containerSize.x*d),l.plus(j)):l},getZoom:function(a){return a?this.zoomSpring.current.value:this.zoomSpring.target.value},applyConstraints:function(a){var b,c,d,e,f,g,h,i=this.getZoom(),j=Math.max(Math.min(i,this.getMaxZoom()),this.getMinZoom()),k=0,l=0;return i!=j&&this.zoomTo(j,this.zoomPoint,a),b=this.getBounds(),c=this.visibilityRatio*b.width,d=this.visibilityRatio*b.height,e=b.x+b.width,f=1-b.x,g=b.y+b.height,h=this.contentAspectY-b.y,this.wrapHorizontal||(c>e&&(k=c-e),c>f&&(k=k?(k+f-c)/2:f-c)),this.wrapVertical||(d>g&&(l=d-g),d>h&&(l=l?(l+h-d)/2:h-d)),(k||l||a)&&(b.x+=k,b.y+=l,b.width>1&&(b.x=.5-b.width/2),b.height>this.contentAspectY&&(b.y=this.contentAspectY/2-b.height/2),this.fitBounds(b,a)),this.viewer&&this.viewer.raiseEvent("constrain",{immediately:a}),this},ensureVisible:function(a){return this.applyConstraints(a)},fitBounds:function(b,c){var d,e,f,g,h=this.getAspectRatio(),i=b.getCenter(),j=new a.Rect(b.x,b.y,b.width,b.height);return j.getAspectRatio()>=h?(j.height=b.width/h,j.y=i.y-j.height/2):(j.width=b.height*h,j.x=i.x-j.width/2),this.panTo(this.getCenter(!0),!0),this.zoomTo(this.getZoom(!0),null,!0),d=this.getBounds(),e=this.getZoom(),f=1/j.width,f==e||j.width==d.width?this.panTo(i,c):(g=d.getTopLeft().times(this.containerSize.x/d.width).minus(j.getTopLeft().times(this.containerSize.x/j.width)).divide(this.containerSize.x/d.width-this.containerSize.x/j.width),this.zoomTo(f,g,c))},fitVertically:function(a){var b=this.getCenter();return this.wrapHorizontal&&(b.x=(1+b.x%1)%1,this.centerSpringX.resetTo(b.x),this.centerSpringX.update()),this.wrapVertical&&(b.y=(this.contentAspectY+b.y%this.contentAspectY)%this.contentAspectY,this.centerSpringY.resetTo(b.y),this.centerSpringY.update()),this.fitBounds(this.fitHeightBounds,a)},fitHorizontally:function(a){var b=this.getCenter();return this.wrapHorizontal&&(b.x=(this.contentAspectX+b.x%this.contentAspectX)%this.contentAspectX,this.centerSpringX.resetTo(b.x),this.centerSpringX.update()),this.wrapVertical&&(b.y=(1+b.y%1)%1,this.centerSpringY.resetTo(b.y),this.centerSpringY.update()),this.fitBounds(this.fitWidthBounds,a)},panBy:function(b,c){var d=new a.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);return b=b.rotate(-this.degrees,new a.Point(0,0)),this.panTo(d.plus(b),c)},panTo:function(a,b){return b?(this.centerSpringX.resetTo(a.x),this.centerSpringY.resetTo(a.y)):(this.centerSpringX.springTo(a.x),this.centerSpringY.springTo(a.y)),this.viewer&&this.viewer.raiseEvent("pan",{center:a,immediately:b}),this},zoomBy:function(b,c,d){return c instanceof a.Point&&!isNaN(c.x)&&!isNaN(c.y)&&(c=c.rotate(-this.degrees,new a.Point(this.centerSpringX.target.value,this.centerSpringY.target.value))),this.zoomTo(this.zoomSpring.target.value*b,c,d)},zoomTo:function(b,c,d){return this.zoomPoint=c instanceof a.Point&&!isNaN(c.x)&&!isNaN(c.y)?c:null,d?this.zoomSpring.resetTo(b):this.zoomSpring.springTo(b),this.viewer&&this.viewer.raiseEvent("zoom",{zoom:b,refPoint:c,immediately:d}),this},setRotation:function(a){if(!this.viewer||!this.viewer.drawer.canRotate())return this;if(a=(a+360)%360,a%90!==0)throw new Error("Currently only 0, 90, 180, and 270 degrees are supported.");return this.degrees=a,this.viewer.drawer.update(),this},getRotation:function(){return this.degrees},resize:function(b,c){var d,e=this.getBounds(),f=e;return this.containerSize=new a.Point(b.x,b.y),c&&(d=b.x/this.containerSize.x,f.width=e.width*d,f.height=f.width/this.getAspectRatio()),this.viewer&&this.viewer.raiseEvent("resize",{newContainerSize:b,maintain:c}),this.fitBounds(f,!0)},update:function(){var a,b,c,d,e=this.centerSpringX.current.value,f=this.centerSpringY.current.value,g=this.zoomSpring.current.value;return this.zoomPoint&&(a=this.pixelFromPoint(this.zoomPoint,!0)),this.zoomSpring.update(),this.zoomPoint&&this.zoomSpring.current.value!=g?(b=this.pixelFromPoint(this.zoomPoint,!0),c=b.minus(a),d=this.deltaPointsFromPixels(c,!0),this.centerSpringX.shiftBy(d.x),this.centerSpringY.shiftBy(d.y)):this.zoomPoint=null,this.centerSpringX.update(),this.centerSpringY.update(),this.centerSpringX.current.value!=e||this.centerSpringY.current.value!=f||this.zoomSpring.current.value!=g},deltaPixelsFromPoints:function(a,b){return a.times(this.containerSize.x*this.getZoom(b))},deltaPointsFromPixels:function(a,b){return a.divide(this.containerSize.x*this.getZoom(b))},pixelFromPoint:function(a,b){var c=this.getBounds(b);return a.minus(c.getTopLeft()).times(this.containerSize.x/c.width)},pointFromPixel:function(a,b){var c=this.getBounds(b);return a.divide(this.containerSize.x/c.width).plus(c.getTopLeft())},viewportToImageCoordinates:function(b,c){return 1==arguments.length?this.viewportToImageCoordinates(b.x,b.y):new a.Point(b*this.contentSize.x,c*this.contentSize.y*this.contentAspectX)},imageToViewportCoordinates:function(b,c){return 1==arguments.length?this.imageToViewportCoordinates(b.x,b.y):new a.Point(b/this.contentSize.x,c/this.contentSize.y/this.contentAspectX)},imageToViewportRectangle:function(b,c,d,e){var f,g,h;return 1==arguments.length?(h=b,this.imageToViewportRectangle(h.x,h.y,h.width,h.height)):(f=this.imageToViewportCoordinates(b,c),g=this.imageToViewportCoordinates(d,e),new a.Rect(f.x,f.y,g.x,g.y))},viewportToImageRectangle:function(b,c,d,e){var f,g,h;return 1==arguments.length?(h=b,this.viewportToImageRectangle(h.x,h.y,h.width,h.height)):(f=this.viewportToImageCoordinates(b,c),g=this.viewportToImageCoordinates(d,e),new a.Rect(f.x,f.y,g.x,g.y))},viewerElementToImageCoordinates:function(a){var b=this.pointFromPixel(a,!0);return this.viewportToImageCoordinates(b)},imageToViewerElementCoordinates:function(a){var b=this.pixelFromPoint(a,!0);return this.imageToViewportCoordinates(b)},windowToImageCoordinates:function(a){var b=a.minus(OpenSeadragon.getElementPosition(this.viewer.element));return this.viewerElementToImageCoordinates(b)},imageToWindowCoordinates:function(a){var b=this.imageToViewerElementCoordinates(a);return b.plus(OpenSeadragon.getElementPosition(this.viewer.element))},viewerElementToViewportCoordinates:function(a){return this.pointFromPixel(a,!0)},viewportToViewerElementCoordinates:function(a){return this.pixelFromPoint(a,!0)},windowToViewportCoordinates:function(a){var b=a.minus(OpenSeadragon.getElementPosition(this.viewer.element));return this.viewerElementToViewportCoordinates(b)},viewportToWindowCoordinates:function(a){var b=this.viewportToViewerElementCoordinates(a);return b.plus(OpenSeadragon.getElementPosition(this.viewer.element))},viewportToImageZoom:function(a){var b=this.viewer.source.dimensions.x,c=this.getContainerSize().x,d=c/b;return a*d},imageToViewportZoom:function(a){var b=this.viewer.source.dimensions.x,c=this.getContainerSize().x,d=b/c;return a*d}}}(OpenSeadragon);
-//# sourceMappingURL=openseadragon.min.js.map
\ No newline at end of file
diff --git a/components/static/js/openseadragon/openseadragon.min.js.map b/components/static/js/openseadragon/openseadragon.min.js.map
deleted file mode 100755
index 9f1e580c..00000000
--- a/components/static/js/openseadragon/openseadragon.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"openseadragon.min.js","sources":["openseadragon.js"],"names":["window","OpenSeadragon","options","Viewer","$","version","versionStr","major","minor","revision","class2type","[object Boolean]","[object Number]","[object String]","[object Function]","[object Array]","[object Date]","[object RegExp]","[object Object]","toString","Object","prototype","hasOwn","hasOwnProperty","isFunction","obj","type","isArray","Array","isWindow","undefined","String","call","isPlainObject","nodeType","constructor","key","isEmptyObject","name","supportsCanvas","canvasElement","document","createElement","getContext","getOffsetParent","element","isFixed","body","offsetParent","extend","src","copy","copyIsArray","clone","target","arguments","length","deep","i","this","DEFAULT_SETTINGS","xmlPath","tileSources","tileHost","initialPage","panHorizontal","panVertical","constrainDuringPan","wrapHorizontal","wrapVertical","visibilityRatio","minPixelRatio","defaultZoomLevel","minZoomLevel","maxZoomLevel","springStiffness","clickTimeThreshold","clickDistThreshold","zoomPerClick","zoomPerScroll","zoomPerSecond","animationTime","blendTime","alwaysBlend","autoHideControls","immediateRender","minZoomImageRatio","maxZoomPixelRatio","pixelsPerWheelLine","autoResize","showSequenceControl","sequenceControlAnchor","preserveViewport","showNavigationControl","navigationControlAnchor","controlsFadeDelay","controlsFadeLength","mouseNavEnabled","showNavigator","navigatorId","navigatorPosition","navigatorSizeRatio","navigatorMaintainSizeRatio","navigatorTop","navigatorLeft","navigatorHeight","navigatorWidth","navigatorAutoResize","degrees","showReferenceStrip","referenceStripScroll","referenceStripElement","referenceStripHeight","referenceStripWidth","referenceStripPosition","referenceStripSizeRatio","collectionRows","collectionLayout","collectionMode","collectionTileSize","imageLoaderLimit","maxImageCacheCount","timeout","useCanvas","prefixUrl","navImages","zoomIn","REST","GROUP","HOVER","DOWN","zoomOut","home","fullpage","rotateleft","rotateright","previous","next","navPrevNextWrap","showRotationControl","debugMode","debugGridColor","SIGNAL","delegate","object","method","args","apply","BROWSERS","UNKNOWN","IE","FIREFOX","SAFARI","CHROME","OPERA","getElement","getElementById","getElementPosition","result","Point","getElementStyle","position","x","offsetLeft","y","offsetTop","plus","getPageScroll","getElementOffset","docElement","win","doc","ownerDocument","boundingRect","top","left","documentElement","getBoundingClientRect","defaultView","parentWindow","pageXOffset","scrollLeft","clientLeft","pageYOffset","scrollTop","clientTop","getElementSize","clientWidth","clientHeight","currentStyle","getComputedStyle","getEvent","event","getMousePosition","pageX","pageY","Error","clientX","clientY","setPageScroll","scroll","scrollTo","originalScroll","currentScroll","getWindowSize","innerWidth","innerHeight","makeCenteredNode","wrappers","makeNeutralElement","style","display","height","width","verticalAlign","textAlign","appendChild","tagName","background","border","margin","padding","now","Date","getTime","makeTransparentImage","img","Browser","vendor","onload","filter","setElementOpacity","opacity","usesAlpha","ieOpacity","ieFilter","alpha","Math","round","addClass","className","indexOf","removeClass","oldClasses","newClasses","split","push","join","addEvent","addEventListener","eventName","handler","useCapture","attachEvent","setCapture","removeEvent","removeEventListener","detachEvent","releaseCapture","cancelEvent","preventDefault","cancel","returnValue","stopEvent","stopPropagation","cancelBubble","createCallback","initialArgs","concat","getUrlParameter","value","URLPARAMS","createAjaxRequest","request","XMLHttpRequest","ActiveXObject","ACTIVEX","e","makeAjaxRequest","url","onSuccess","onError","onreadystatechange","readyState","status","console","log","open","send","msg","message","oldIE","number","jsonp","script","head","getElementsByTagName","jsonpCallback","callbackName","replace","callbackParam","param","callback","test","response","async","scriptCharset","charset","_","isAbort","parentNode","removeChild","insertBefore","firstChild","createFromDZI","parseXml","string","xmlDoc","loadXML","DOMParser","parser","parseFromString","imageFormatSupported","extension","FILEFORMATS","toLowerCase","bmp","jpeg","jpg","png","tif","wdp","ver","navigator","appName","appVersion","ua","userAgent","parseFloat","substring","lastIndexOf","part","sep","query","location","search","parts","decodeURIComponent","nullfunction","debug","info","warn","error","w","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","msCancelAnimationFrame","iIntervalId","aAnimQueue","processing","iRequestId","setInterval","time","temp","shift","clearInterval","requestId","j","splice","_processDZIError","errorNode","messageNode","nodeValue","fullScreenApi","supportsFullScreen","isFullScreen","requestFullScreen","cancelFullScreen","fullScreenEventName","fullScreenErrorEventName","prefix","browserPrefixes","il","fullScreen","webkitIsFullScreen","wscript","SendKeys","EventSource","events","addHandler","userData","removeHandler","handlers","removeAllHandlers","eventType","getHandler","source","eventSource","raiseEvent","eventArgs","startTracking","tracker","MouseTracker","wheelEventName","THIS","hash","tracking","ACTIVE","stopTracking","releaseMouse","hasMouse","insideElement","captureMouse","capturing","mouseup","mouseupie","mousemovecapturedie","mouseupcaptured","mousemovecaptured","triggerOthers","isTouch","otherHash","onFocus","propagate","focusHandler","originalEvent","preventDefaultAction","onBlur","blurHandler","onKeyPress","keyHandler","getMouseRelative","keyCode","charCode","shiftKey","onMouseOver","isChild","srcElement","to","from","relatedTarget","fromElement","enterHandler","changedTouches","insideElementPressed","buttonDownAny","IS_BUTTON_DOWN","isTouchEvent","onMouseOut","toElement","exitHandler","onMouseDown","noCapture","eventOrTouchPoint","touches","button","lastPoint","getMouseAbsolute","lastMouseDownPoint","lastMouseDownTime","pressHandler","dragHandler","IS_CAPTURING","CAPTURING","onTouchStart","touchA","touchB","targetTouches","lastTouch","lastPinchDelta","abs","pinchMidpoint","onMouseUp","insideElementReleased","releaseHandler","handleMouseClick","onTouchEnd","onMouseUpCaptured","onMouseUpIE","othertracker","fireEvent","createEventObject","noRelease","onMouseMove","moveHandler","stopHandler","clearTimeout","stopTimeOut","setTimeout","onMouseStop","stopDelay","originalMoveEvent","onMouseClick","clickHandler","onWheel","handleWheelEvent","onMouseWheel","simulatedEvent","deltaMode","deltaX","deltaZ","deltaY","wheelDelta","detail","nDelta","scrollHandler","point","distance","distanceTo","quick","onMouseMoveCaptured","delta","minus","onTouchMove","pinchDelta","identifier","onMouseMoveCapturedIE","mouse","offset","elementA","elementB","onGlobalMouseDown","onGlobalMouseUp","random","_this","mouseover","mouseout","mousedown","mousemove","click","wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll","touchstart","touchmove","touchend","keypress","focus","blur","destroy","isTracking","setTracking","track","onmousewheel","ControlAnchor","NONE","TOP_LEFT","TOP_RIGHT","BOTTOM_RIGHT","BOTTOM_LEFT","ABSOLUTE","Control","container","parent","anchor","attachToViewer","autoFade","wrapper","isVisible","setVisible","visible","setOpacity","getControlIndex","dock","controls","ControlDock","layout","layouts","id","floor","onsubmit","match","right","bottom","topleft","topright","bottomright","bottomleft","addControl","controlOptions","div","paddingRight","paddingTop","paddingBottom","paddingLeft","removeControl","clearControls","pop","areControlsEnabled","setControlsEnabled","enabled","_getSafeElemSize","oElement","openTileSource","viewer","overlay","close","canvas","innerHTML","prevContainerSize","TileSourceCollection","rows","tileSize","tileMargin","collectionTileMargin","viewport","Viewport","collectionTileSource","containerSize","contentSize","dimensions","resetContentSize","overlays","drawer","Drawer","canRotate","rotateLeft","buttons","rotateRight","Navigator","sizeRatio","maintainSizeRatio","referenceStrip","ReferenceStrip","animating","forceRedraw","_updateRequestId","scheduleUpdate","updateMulti","overlayControls","addOverlay","X","Y","OverlayPlacement","Rect","rect","Width","Height","placement","VIEWERS","updateFunc","scheduleControlsFade","updateControlsFade","beginControlsAutoHide","controlsShouldFade","controlsFadeBeginTime","currentTime","deltaTime","min","max","abortControlsAutoHide","onCanvasClick","factor","zoomBy","pointFromPixel","applyConstraints","onCanvasDrag","panBy","deltaPointsFromPixels","negate","onCanvasRelease","onCanvasScroll","pow","onContainerExit","mouseInside","onContainerRelease","onContainerEnter","updateOnce","animated","equals","oldBounds","getBounds","oldCenter","getCenter","resizeViewportAndRecenter","update","needsUpdate","resize","imageHeight","aspectRatio","newWidth","newHeight","newBounds","fitBounds","resolveUrl","beginZoomingIn","lastZoomTime","zoomFactor","zooming","scheduleZoom","beginZoomingOut","endZooming","doZoom","adjustedFactor","doSingleZoomIn","doSingleZoomOut","lightUp","emulateEnter","emulateExit","onHome","goHome","onFullScreen","isFullPage","setFullPage","setFullScreen","fullPageButton","onRotateLeft","currRotation","getRotation","setRotation","onRotateRight","onPrevious","sequence","goToPage","onNext","config","keyboardCommandArea","previousBody","customControls","drawers","collectionViewport","collectionDrawer","profiler","fsBoundsDelta","group","sequenced","fullPage","onfullscreenchange","getString","_showMessage","initialTileSource","overflow","bodyWidth","bodyHeight","bodyOverflow","docOverflow","innerTracker","outerTracker","toolbar","bindStandardControls","bindSequenceControls","_updateSequenceButtons","isOpen","openDzi","dzi","tileSource","customTileSource","readySource","$TileSource","_hideMessage","eval","TileSource","getTileUrl","determineType","configure","clearOverlays","isMouseNavEnabled","setMouseNavEnabled","isVisibile","nodes","bodyStyle","docStyle","fullPageEventArgs","elementSize","pageScroll","elementMargin","elementPadding","bodyMargin","docMargin","bodyPadding","docPadding","prevElementParent","prevNextSibling","nextSibling","prevElementWidth","prevElementHeight","childNodes","restoreScrollCounter","restoreScroll","fullScreeEventArgs","fullPageStyleWidth","fullPageStyleHeight","onFullScreenChange","visibility","onFocusHandler","onBlurHandler","onNextHandler","onPreviousHandler","useGroup","previousButton","nextButton","Button","tooltip","srcRest","srcGroup","srcHover","srcDown","onRelease","disable","paging","ButtonGroup","pagingControl","beginZoomingInHandler","endZoomingHandler","doSingleZoomInHandler","beginZoomingOutHandler","doSingleZoomOutHandler","onHomeHandler","onFullScreenHandler","onRotateLeftHandler","onRotateRightHandler","zoomInButton","zoomOutButton","homeButton","onPress","onClick","onEnter","onExit","rotateLeftButton","rotateRightButton","navControl","currentPage","page","setFocus","enable","createTextNode","messageDiv","drag","panTo","viewerSize","navigatorSize","unneededElement","borderWidth","fudge","totalBorderWidths","displayRegion","fontSize","cssFloat","styleFloat","zIndex","cursor","oldViewerSize","elementArea","oldContainerSize","updateSize","bounds","sqrt","pixelFromPoint","getTopLeft","getBottomRight","times","I18N","Errors","Dzc","Dzi","Xml","ImageFormat","Security","Status","OpenFailed","Tooltips","FullPage","Home","ZoomIn","ZoomOut","NextPage","PreviousPage","RotateLeft","RotateRight","prop","props","capture","parseInt","setString","divide","func","rotate","pivot","angle","PI","cos","sin","processResponse","xhr","responseText","statusText","data","responseXML","tileOverlap","minLevel","maxLevel","ready","getImageInfo","ceil","getLevelScale","level","levelScaleCache","_level","getNumTiles","scale","getPixelRatio","imageSizeScaled","rx","ry","getClosestLevel","tiles","tilesPerSide","getTileAtPoint","pixel","tx","ty","getTileBounds","dimensionsScaled","px","py","sx","sy","urlParts","filename","lastDot","slice","exc","formattedExc","supports","tileExists","numTiles","property","configureFromXML","dispRectNodes","dispRectNode","rectNode","sizeNode","root","rootName","configuration","displayRects","Image","xmlns","Url","getAttribute","Format","DisplayRect","Overlap","TileSize","Size","toUpperCase","MinLevel","MaxLevel","configureFromObject","rectData","imageData","tilesUrl","fileFormat","sizeData","dispRectData","DziTileSource","_levelRects","ns","namespaceURI","xMin","yMin","xMax","yMax","rects","configureFromXml","parseXML","node","trim","Number","nodeName","image_host","IIIFTileSource","tile_width","mf","scfs","scale_factors","scale_factor","cf","isNaN","profile","service","host","protocol","iiif_region","iiif_tile_x","iiif_tile_y","iiif_tile_w","iiif_tile_h","iiif_size","IIIF_ROTATION","IIIF_QUALITY","level_width","level_height","iiif_tile_size_width","iiif_tile_size_height","tile_height","IIIF1_1TileSource","shortDim","tileOptions","smallerTiles","c","iiifRegion","iiifTileX","iiifTileY","iiifTileW","iiifTileH","iiifSize","uri","levelWidth","levelHeight","iiifTileSizeWidth","iiifTileSizeHeight","OsmTileSource","TmsTileSource","bufferedWidth","bufferedHeight","yTiles","filterFiles","files","file","filtered","mimetype","sort","a","b","conf","levels","LegacyTileSource","levelScale","NaN","levelSize","tilesPerRow","longSide","scheduleFade","updateFade","shouldFade","fadeBeginTime","fadeLength","imgGroup","beginFading","fadeDelay","stopFading","inTo","newState","disabled","ButtonState","currentState","imgHover","imgDown","outTo","imgRest","imgDiv","title","notifyGroupEnter","notifyGroupExit","labelText","label","getAspectRatio","getTopRight","getBottomLeft","getSize","other","newTopLeft","onStripDrag","marginLeft","marginTop","scrollWidth","scrollHeight","dragging","loadPanels","onStripScroll","strip","panelSize","activePanelsStart","activePanelsEnd","miniViewer","panelWidth","panelHeight","panels","activePanel","float","onStripEnter","marginBottom","onStripExit","marginRight","currentSelected","transform","stiffness","exp","Spring","initial","current","start","resetTo","springTo","shiftBy","TILE_CACHE","Tile","exists","loaded","loading","imgElement","image","size","blendStart","beingDrawn","lastTouchTime","drawHTML","msInterpolationMode","drawCanvas","context","drawingHandler","rendered","globalAlpha","clearRect","drawImage","tile","unload","CENTER","TOP","RIGHT","BOTTOM","LEFT","Overlay","scales","onDraw","adjust","overlayCenter","drawerCenter","addOverlayFromConfiguration","href","imageToViewportRectangle","updateViewport","updateAgain","renderPixelRatioC","renderPixelRatioT","zeroRatioT","optimalRatio","levelOpacity","levelVisibility","best","haveDrawn","viewportSize","getContainerSize","viewportBounds","viewportTL","viewportBR","zeroRatioC","deltaPixelsFromPoints","lowestLevel","highestLevel","lastDrawn","rotatedBounds","normHeight","drawLevel","updateLevel","providesCoverage","coverage","drawTiles","drawOverlays","loadTile","tileTL","tileBR","numberOfTiles","viewportCenter","havedrawn","currenttime","resetCoverage","updateTile","getTile","tilesMatrix","drawTile","setCoverage","isCovered","positionTile","blendTile","compareTiles","xMod","yMod","midUpdate","onTileLoad","loadImage","insertionIndex","cutoff","worstTile","worstTime","worstLevel","worstTileIndex","prevTile","prevTime","prevLevel","lastResetTime","tilesLoaded","overlap","boundsTL","boundsSize","positionC","positionT","sizeC","sizeT","tileCenter","tileDistance","blendTimeMillis","clearTiles","cols","covers","getOverlayIndex","previousBest","finishLoadingImage","successful","jobid","onabort","onerror","drawOverlay","tileKey","collectionOverlays","SUBPIXEL_RENDERING","offsetForRotation","restoreRotationChanges","drawDebugInfo","cx","cy","save","translate","restore","count","lineWidth","font","strokeStyle","fillStyle","strokeRect","fillText","getZoom","BROWSER","BROWSER_VERSION","downloading","dir","updateOverlay","removeOverlay","numTilesLoaded","reset","complete","crossOrigin","imagesrc","resultingImage","zoomPoint","centerSpringX","centerSpringY","zoomSpring","contentAspectX","contentAspectY","fitWidthBounds","fitHeightBounds","homeBounds","getHomeZoom","aspectFactor","getHomeBounds","center","immediately","getMinZoom","homeZoom","zoom","getMaxZoom","oldZoomPixel","newZoomPixel","deltaZoomPixels","deltaZoomPoints","centerCurrent","centerTarget","horizontalThreshold","verticalThreshold","actualZoom","constrainedZoom","dx","dy","zoomTo","ensureVisible","oldZoom","newZoom","referencePoint","aspect","fitVertically","fitHorizontally","refPoint","newContainerSize","maintain","widthDeltaFactor","oldCenterX","oldCenterY","deltaPoints","deltaPixels","viewportToImageCoordinates","viewerX","viewerY","imageToViewportCoordinates","imageX","imageY","pixelWidth","pixelHeight","coordA","coordB","viewportToImageRectangle","pointWidth","pointHeight","viewerElementToImageCoordinates","imageToViewerElementCoordinates","windowToImageCoordinates","viewerCoordinates","imageToWindowCoordinates","viewerElementToViewportCoordinates","viewportToViewerElementCoordinates","windowToViewportCoordinates","viewportToWindowCoordinates","viewportToImageZoom","viewportZoom","imageWidth","containerWidth","viewportToImageZoomRatio","imageToViewportZoom","imageZoom"],"mappings":"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"}
\ No newline at end of file
diff --git a/components/types/bibo__Document/html.template b/components/types/bibo__Document/html.template
index 5d05f2cf..5930e289 100755
--- a/components/types/bibo__Document/html.template
+++ b/components/types/bibo__Document/html.template
@@ -8,7 +8,7 @@
 			<div class="col-md-10">
 		    	
 		    	<div class="page-header">
-    			    <h1 itemprop="name">{% if first.main.title.value != "" %}{{first.main.title.value}}{% else %}{% if first.main.label.value != "" %}{{first.main.label.value}}{% else %} {{row.identifier.value}}{%endif%}{%endif%}</h1>
+    			    <h1 itemprop="name">{% if first.main.title.value != "" %}{{first.main.title.value}}{% else %}{% if first.main.label.value != "" %}{{first.main.label.value}}{% else %}{% if first.bibsys.main.label.value != "" %}{{first.bibsys.main.label.value}}  {% else %} {{row.identifier.value}}{%endif%}{%endif%}{%endif%}</h1>
             {% for row in models.main %}
               {% if row.alternative %}<h2 itemprop="alternativeHeadline"><small>{{row.alternative.value}}</small></h2>{% endif %}
   			    {% endfor %}
@@ -103,6 +103,18 @@
 			</ul>
 		    {% endif %}
 
+        <!-- BIBSYS MAKER -->
+        {% if models.bibsys.maker %}  
+          <ul class="list-unstyled">
+			    {% for row in models.bibsys.maker %}
+			    {% ifchanged row.maker.value %}
+			    	<li class="h4" itemprop="creator" itemscope itemtype="http://schema.org/Person"><i class="fa fa-pencil-square-o"></i> <a itemprop="url" href="{{ row.maker.value }}"><span itemprop="name">{{ row.makerName.value }}</span></a> <img style="width: 55px; margin-bottom: 2px;" src="{{lodspk.home}}img/BIBSYS_logo_boks.png"></li>
+			    {% endifchanged %}
+			    {% endfor %}
+			</ul>
+		    {% endif %}
+
+
 			<!-- RECIPIENT -->
 	    	{% if models.recipient|length != 0 %}
 	    	<p><small>Mottaker</small><br>
@@ -133,6 +145,13 @@
 			    </p>
 			{% endif %}
 			
+			  <!-- BIBSYS CREATION -->
+		    {% if first.bibsys.main.created != null %}
+		    	<p><strong><i class="fa fa-calendar"></i> 
+			    	Dato: <span itemprop="dateCreated">{{ first.bibsys.main.created.value }}</span>
+			    </strong></p>
+        {% endif %}  
+			
 			<!-- STARDARD SIDEBAR METADATA-->
 		    <!-- PUBLISHED -->
 		    {% for row in models.published %}
@@ -157,7 +176,13 @@
 						<a target="_blank" href="{{row.uri.value}}">{{row.label.value}}</a> <i class="text-muted fa fa-external-link"></i><br>
 						{% endfor %}
 					</p>
-					{% endif %}	
+		  {% endif %}	
+		  
+		  {% if first.bibsys.main|length != 0 %}
+					<p>
+						<a target="_blank" href="{{first.bibsys.main.uri.value}}">BIBSYS data</a> <i class="text-muted fa fa-external-link"></i><br>
+					</p>
+		  {% endif %}	
 
 		    
 			<hr class="slim">
@@ -293,9 +318,23 @@
 		    
 		<!-- SUBJECTS -->
 		{% if models.subjects|length != 0 %}
-		<p class="lead">Dette bildet er knyttet til {% if models.subjects|length > 1 %}emnene{%else%}emnet{%endif%}  
+		<p class="lead">Dette dokumentet er knyttet til {% if models.subjects|length > 1 %}emnene{%else%}emnet{%endif%}  
 			{%for row in models.subjects%}{%ifchanged row.uri.value%}{%if forloop.first%}{%else%}, {%endif%}<span itemprop="keywords"><a href="{{ row.uri.value }}">{{ row.label.value }}</a></span>{%endifchanged%}{%endfor%} 
 		</p>
+		{% endif %}
+		
+		<!-- BIBSYS SUBJECTS -->
+		{% if models.bibsys.subjects|length != 0 %}
+		<p class="lead">Dette dokumentet er knyttet til {% if models.subjects|length > 1 %}emnene{%else%}emnet{%endif%}  
+			{%for row in models.bibsys.subjects%}{%ifchanged row.uri.value%}{%if forloop.first%}{%else%}, {%endif%}<span itemprop="keywords"><a href="{{ row.uri.value }}">{{ row.label.value }}</a></span>{%endifchanged%}{%endfor%} <img style="width: 55px; margin-bottom: 2px;" src="{{lodspk.home}}img/BIBSYS_logo_boks.png">
+		</p>
+		{% endif %}
+		
+		<!-- RELATIONS -->
+		{% if models.relation|length != 0 %}
+		<p class="lead">Relatert til:  
+			{%for row in models.relation%}{%ifchanged row.uri.value%}{%if forloop.first%}{%else%}, {%endif%}<span itemprop="keywords"><a href="{{ row.uri.value }}">{{ row.label.value }}</a></span>{%endifchanged%}{%endfor%} 
+		</p>
 		{% endif %}
 			
 			<!-- ALBUM -->
diff --git a/components/types/bibo__Document/queries/main.query b/components/types/bibo__Document/queries/main.query
index 376afc9a..f106687b 100755
--- a/components/types/bibo__Document/queries/main.query
+++ b/components/types/bibo__Document/queries/main.query
@@ -1,10 +1,10 @@
-SELECT DISTINCT ?title ?label ?alternative ?created ?madeafter ?madebefore ?available ?identifier ?classLabel ?isbn ?hasLong ?img WHERE {
-    GRAPH <urn:x-arq:UnionGraph>  {
+SELECT DISTINCT ?title ?label ?alternative ?created ?madeafter ?madebefore ?available ?identifier ?classLabel ?isbn ?hasLong ?img ?bibsysid WHERE {
+  GRAPH <urn:x-arq:UnionGraph>  {
     <{{ uri }}> rdf:type ?class .
      GRAPH ubbont:ubbont {
-	?class rdfs:label ?classLabel .
-	FILTER(langMatches(lang(?classLabel), ""))
- }
+      ?class rdfs:label ?classLabel .
+      FILTER(langMatches(lang(?classLabel), ""))
+      }
     OPTIONAL { <{{ uri }}> dct:title ?title . }
     OPTIONAL { <{{ uri }}> rdfs:label ?label . }
     OPTIONAL { <{{ uri }}> skos:prefLabel ?label . }
@@ -13,10 +13,11 @@ SELECT DISTINCT ?title ?label ?alternative ?created ?madeafter ?madebefore ?avai
     OPTIONAL { <{{ uri }}> dct:created ?created .}
     OPTIONAL { <{{ uri }}> ubbont:madeAfter ?madeafter .}
     OPTIONAL { <{{ uri }}> ubbont:madeBefore ?madebefore .}
-	OPTIONAL { <{{ uri }}> dct:available ?available .}
-	OPTIONAL { <{{ uri }}> foaf:logo ?img . }
-	OPTIONAL { <{{ uri }}> ubbont:hasThumbnail ?img . }
-	OPTIONAL { <{{ uri }}> bibo:isbn ?isbn . }
-	BIND ( EXISTS { <{{ uri }}> dct:spatial ?place . ?place geo:long ?long } AS ?hasLong )
-}
+  	OPTIONAL { <{{ uri }}> dct:available ?available .}
+  	OPTIONAL { <{{ uri }}> foaf:logo ?img . }
+  	OPTIONAL { <{{ uri }}> ubbont:hasThumbnail ?img . }
+  	OPTIONAL { <{{ uri }}> bibo:isbn ?isbn . }
+  	OPTIONAL { <{{ uri }}> ubbont:bibsysID ?bibsysid . }
+  	BIND ( EXISTS { <{{ uri }}> dct:spatial ?place . ?place geo:long ?long } AS ?hasLong )
+    }
 }
-- 
GitLab