Page MenuHomec4science

No OneTemporary

File Metadata

Created
Sun, May 5, 00:06
This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/desuto-images/Dockerfile b/desuto-images/Dockerfile
deleted file mode 100755
index a5915d1..0000000
--- a/desuto-images/Dockerfile
+++ /dev/null
@@ -1,2 +0,0 @@
-FROM nginx:alpine
-COPY cors.conf /etc/nginx/conf.d/
diff --git a/desuto-images/cors.conf b/desuto-images/cors.conf
deleted file mode 100755
index c4b06c8..0000000
--- a/desuto-images/cors.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-## Basic CORS support.
-add_header Access-Control-Allow-Origin "$http_origin" always;
-add_header Access-Control-Allow-Credentials true always;
-add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization, X-Erento-Foobar, X-Erento-Environment, X-Erento-Filename" always;
-add_header Access-Control-Expose-Headers 'Authorization';
diff --git a/desuto-proxy/proxy.conf b/desuto-proxy/proxy.conf
index c646fde..f179ce7 100755
--- a/desuto-proxy/proxy.conf
+++ b/desuto-proxy/proxy.conf
@@ -1,70 +1,34 @@
server
{
listen 80;
location /
{
proxy_pass http://webviewer:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /couchdb/
{
proxy_pass http://couchdb:5984/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
- location /retrieval/
- {
- proxy_pass http://retrieval/;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $remote_addr;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
-
- location /backend/
- {
- proxy_pass http://paradise-gf:8080/;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $remote_addr;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
-
- location /uploads
- {
- proxy_pass http://uploads/uploads/;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $remote_addr;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
-
- location /images
- {
- proxy_pass http://images/images/;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $remote_addr;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
-
location /iipsrv/
{
proxy_pass http://iipsrv/iipsrv/;
}
location /slide_properties/
{
proxy_pass http://slideprops/slide_properties/;
}
}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/.htaccess b/desuto-retrieval/Desuto-retrievalinterface/.htaccess
deleted file mode 100755
index 9b9ed6d..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/.htaccess
+++ /dev/null
@@ -1,556 +0,0 @@
-# Apache configuration file
-# httpd.apache.org/docs/2.2/mod/quickreference.html
-
-# Note .htaccess files are an overhead, this logic should be in your Apache
-# config if possible: httpd.apache.org/docs/2.2/howto/htaccess.html
-
-# Techniques in here adapted from all over, including:
-# Kroc Camen: camendesign.com/.htaccess
-# perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/
-# Sample .htaccess file of CMS MODx: modxcms.com
-
-
-# ----------------------------------------------------------------------
-# Better website experience for IE users
-# ----------------------------------------------------------------------
-
-# Force the latest IE version, in various cases when it may fall back to IE7 mode
-# github.com/rails/rails/commit/123eb25#commitcomment-118920
-# Use ChromeFrame if it's installed for a better experience for the poor IE folk
-
-<IfModule mod_headers.c>
- Header set X-UA-Compatible "IE=Edge,chrome=1"
- # mod_headers can't match by content-type, but we don't want to send this header on *everything*...
- <FilesMatch "\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot|ttf|otf|woff|ico|webp|appcache|manifest|htc|crx|oex|xpi|safariextz|vcf)$" >
- Header unset X-UA-Compatible
- </FilesMatch>
-</IfModule>
-
-
-# ----------------------------------------------------------------------
-# Cross-domain AJAX requests
-# ----------------------------------------------------------------------
-
-# Serve cross-domain Ajax requests, disabled by default.
-# enable-cors.org
-# code.google.com/p/html5security/wiki/CrossOriginRequestSecurity
-
-# <IfModule mod_headers.c>
-# Header set Access-Control-Allow-Origin "*"
-# </IfModule>
-
-
-# ----------------------------------------------------------------------
-# CORS-enabled images (@crossorigin)
-# ----------------------------------------------------------------------
-
-# Send CORS headers if browsers request them; enabled by default for images.
-# developer.mozilla.org/en/CORS_Enabled_Image
-# blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html
-# hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/
-# wiki.mozilla.org/Security/Reviews/crossoriginAttribute
-
-<IfModule mod_setenvif.c>
- <IfModule mod_headers.c>
- # mod_headers, y u no match by Content-Type?!
- <FilesMatch "\.(gif|png|jpe?g|svg|svgz|ico|webp)$">
- SetEnvIf Origin ":" IS_CORS
- Header set Access-Control-Allow-Origin "*" env=IS_CORS
- </FilesMatch>
- </IfModule>
-</IfModule>
-
-
-# ----------------------------------------------------------------------
-# Webfont access
-# ----------------------------------------------------------------------
-
-# Allow access from all domains for webfonts.
-# Alternatively you could only whitelist your
-# subdomains like "subdomain.example.com".
-
-<IfModule mod_headers.c>
- <FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css)$">
- Header set Access-Control-Allow-Origin "*"
- </FilesMatch>
-</IfModule>
-
-
-# ----------------------------------------------------------------------
-# Proper MIME type for all files
-# ----------------------------------------------------------------------
-
-# JavaScript
-# Normalize to standard type (it's sniffed in IE anyways)
-# tools.ietf.org/html/rfc4329#section-7.2
-AddType application/javascript js jsonp
-AddType application/json json
-
-# Audio
-AddType audio/ogg oga ogg
-AddType audio/mp4 m4a f4a f4b
-
-# Video
-AddType video/ogg ogv
-AddType video/mp4 mp4 m4v f4v f4p
-AddType video/webm webm
-AddType video/x-flv flv
-
-# SVG
-# Required for svg webfonts on iPad
-# twitter.com/FontSquirrel/status/14855840545
-AddType image/svg+xml svg svgz
-AddEncoding gzip svgz
-
-# Webfonts
-AddType application/vnd.ms-fontobject eot
-AddType application/x-font-ttf ttf ttc
-AddType font/opentype otf
-AddType application/x-font-woff woff
-
-# Assorted types
-AddType image/x-icon ico
-AddType image/webp webp
-AddType text/cache-manifest appcache manifest
-AddType text/x-component htc
-AddType application/xml rss atom xml rdf
-AddType application/x-chrome-extension crx
-AddType application/x-opera-extension oex
-AddType application/x-xpinstall xpi
-AddType application/octet-stream safariextz
-AddType application/x-web-app-manifest+json webapp
-AddType text/x-vcard vcf
-AddType application/x-shockwave-flash swf
-AddType text/vtt vtt
-
-
-# ----------------------------------------------------------------------
-# Allow concatenation from within specific js and css files
-# ----------------------------------------------------------------------
-
-# e.g. Inside of script.combined.js you could have
-# <!--#include file="libs/jquery-1.5.0.min.js" -->
-# <!--#include file="plugins/jquery.idletimer.js" -->
-# and they would be included into this single file.
-
-# This is not in use in the boilerplate as it stands. You may
-# choose to use this technique if you do not have a build process.
-
-#<FilesMatch "\.combined\.js$">
-# Options +Includes
-# AddOutputFilterByType INCLUDES application/javascript application/json
-# SetOutputFilter INCLUDES
-#</FilesMatch>
-
-#<FilesMatch "\.combined\.css$">
-# Options +Includes
-# AddOutputFilterByType INCLUDES text/css
-# SetOutputFilter INCLUDES
-#</FilesMatch>
-
-
-# ----------------------------------------------------------------------
-# Gzip compression
-# ----------------------------------------------------------------------
-
-<IfModule mod_deflate.c>
-
- # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
- <IfModule mod_setenvif.c>
- <IfModule mod_headers.c>
- SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
- RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
- </IfModule>
- </IfModule>
-
- # Compress all output labeled with one of the following MIME-types
- <IfModule mod_filter.c>
- AddOutputFilterByType DEFLATE application/atom+xml \
- application/javascript \
- application/json \
- application/rss+xml \
- application/vnd.ms-fontobject \
- application/x-font-ttf \
- application/xhtml+xml \
- application/xml \
- font/opentype \
- image/svg+xml \
- image/x-icon \
- text/css \
- text/html \
- text/plain \
- text/x-component \
- text/xml
- </IfModule>
-
-</IfModule>
-
-
-# ----------------------------------------------------------------------
-# Expires headers (for better cache control)
-# ----------------------------------------------------------------------
-
-# These are pretty far-future expires headers.
-# They assume you control versioning with filename-based cache busting
-# Additionally, consider that outdated proxies may miscache
-# www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/
-
-# If you don't use filenames to version, lower the CSS and JS to something like
-# "access plus 1 week".
-
-<IfModule mod_expires.c>
- ExpiresActive on
-
-# Perhaps better to whitelist expires rules? Perhaps.
- ExpiresDefault "access plus 1 month"
-
-# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
- ExpiresByType text/cache-manifest "access plus 0 seconds"
-
-# Your document html
- ExpiresByType text/html "access plus 0 seconds"
-
-# Data
- ExpiresByType text/xml "access plus 0 seconds"
- ExpiresByType application/xml "access plus 0 seconds"
- ExpiresByType application/json "access plus 0 seconds"
-
-# Feed
- ExpiresByType application/rss+xml "access plus 1 hour"
- ExpiresByType application/atom+xml "access plus 1 hour"
-
-# Favicon (cannot be renamed)
- ExpiresByType image/x-icon "access plus 1 week"
-
-# Media: images, video, audio
- ExpiresByType image/gif "access plus 1 month"
- ExpiresByType image/png "access plus 1 month"
- ExpiresByType image/jpeg "access plus 1 month"
- ExpiresByType video/ogg "access plus 1 month"
- ExpiresByType audio/ogg "access plus 1 month"
- ExpiresByType video/mp4 "access plus 1 month"
- ExpiresByType video/webm "access plus 1 month"
-
-# HTC files (css3pie)
- ExpiresByType text/x-component "access plus 1 month"
-
-# Webfonts
- ExpiresByType application/x-font-ttf "access plus 1 month"
- ExpiresByType font/opentype "access plus 1 month"
- ExpiresByType application/x-font-woff "access plus 1 month"
- ExpiresByType image/svg+xml "access plus 1 month"
- ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
-
-# CSS and JavaScript
- ExpiresByType text/css "access plus 1 year"
- ExpiresByType application/javascript "access plus 1 year"
-
-</IfModule>
-
-
-# ----------------------------------------------------------------------
-# Prevent mobile network providers from modifying your site
-# ----------------------------------------------------------------------
-
-# The following header prevents modification of your code over 3G on some
-# European providers.
-# This is the official 'bypass' suggested by O2 in the UK.
-
-# <IfModule mod_headers.c>
-# Header set Cache-Control "no-transform"
-# </IfModule>
-
-
-# ----------------------------------------------------------------------
-# ETag removal
-# ----------------------------------------------------------------------
-
-# FileETag None is not enough for every server.
-<IfModule mod_headers.c>
- Header unset ETag
-</IfModule>
-
-# Since we're sending far-future expires, we don't need ETags for
-# static content.
-# developer.yahoo.com/performance/rules.html#etags
-FileETag None
-
-
-# ----------------------------------------------------------------------
-# Stop screen flicker in IE on CSS rollovers
-# ----------------------------------------------------------------------
-
-# The following directives stop screen flicker in IE on CSS rollovers - in
-# combination with the "ExpiresByType" rules for images (see above).
-
-# BrowserMatch "MSIE" brokenvary=1
-# BrowserMatch "Mozilla/4.[0-9]{2}" brokenvary=1
-# BrowserMatch "Opera" !brokenvary
-# SetEnvIf brokenvary 1 force-no-vary
-
-
-# ----------------------------------------------------------------------
-# Set Keep-Alive Header
-# ----------------------------------------------------------------------
-
-# Keep-Alive allows the server to send multiple requests through one
-# TCP-connection. Be aware of possible disadvantages of this setting. Turn on
-# if you serve a lot of static content.
-
-# <IfModule mod_headers.c>
-# Header set Connection Keep-Alive
-# </IfModule>
-
-
-# ----------------------------------------------------------------------
-# Cookie setting from iframes
-# ----------------------------------------------------------------------
-
-# Allow cookies to be set from iframes (for IE only)
-# If needed, specify a path or regex in the Location directive.
-
-# <IfModule mod_headers.c>
-# Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""
-# </IfModule>
-
-
-# ----------------------------------------------------------------------
-# Start rewrite engine
-# ----------------------------------------------------------------------
-
-# Turning on the rewrite engine is necessary for the following rules and
-# features. FollowSymLinks must be enabled for this to work.
-
-# Some cloud hosting services require RewriteBase to be set: goo.gl/HOcPN
-# If using the h5bp in a subdirectory, use `RewriteBase /foo` instead where
-# 'foo' is your directory.
-
-# If your web host doesn't allow the FollowSymlinks option, you may need to
-# comment it out and use `Options +SymLinksIfOwnerMatch`, but be aware of the
-# performance impact: http://goo.gl/Mluzd
-
-<IfModule mod_rewrite.c>
- Options +FollowSymlinks
-# Options +SymLinksIfOwnerMatch
- RewriteEngine On
-# RewriteBase /
-</IfModule>
-
-
-# ----------------------------------------------------------------------
-# Suppress or force the "www." at the beginning of URLs
-# ----------------------------------------------------------------------
-
-# The same content should never be available under two different URLs -
-# especially not with and without "www." at the beginning, since this can cause
-# SEO problems (duplicate content). That's why you should choose one of the
-# alternatives and redirect the other one.
-
-# By default option 1 (no "www.") is activated.
-# no-www.org/faq.php?q=class_b
-
-# If you'd prefer to use option 2, just comment out all option 1 lines
-# and uncomment option 2.
-
-# IMPORTANT: NEVER USE BOTH RULES AT THE SAME TIME!
-
-# ----------------------------------------------------------------------
-
-# Option 1:
-# Rewrite "www.example.com -> example.com".
-
-<IfModule mod_rewrite.c>
- RewriteEngine On
- #RewriteCond %{HTTPS} !=on
- #RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
- #RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- #RewriteCond %{REQUEST_URI} !index
- RewriteRule (.*) index.html [QSA,L]
-</IfModule>
-
-# ----------------------------------------------------------------------
-
-# Option 2:
-# Rewrite "example.com -> www.example.com".
-# Be aware that the following rule might not be a good idea if you use "real"
-# subdomains for certain parts of your website.
-
-# <IfModule mod_rewrite.c>
-# RewriteCond %{HTTPS} !=on
-# RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
-# RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
-# </IfModule>
-
-
-# ----------------------------------------------------------------------
-# Built-in filename-based cache busting
-# ----------------------------------------------------------------------
-
-# If you're not using the build script to manage your filename version revving,
-# you might want to consider enabling this, which will route requests for
-# `/css/style.20110203.css` to `/css/style.css`.
-
-# To understand why this is important and a better idea than all.css?v1231,
-# please refer to the bundled documentation about `.htaccess`.
-
-# <IfModule mod_rewrite.c>
-# RewriteCond %{REQUEST_FILENAME} !-f
-# RewriteCond %{REQUEST_FILENAME} !-d
-# RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L]
-# </IfModule>
-
-
-# ----------------------------------------------------------------------
-# Prevent SSL cert warnings
-# ----------------------------------------------------------------------
-
-# Rewrite secure requests properly to prevent SSL cert warnings, e.g. prevent
-# https://www.example.com when your cert only allows https://secure.example.com
-
-# <IfModule mod_rewrite.c>
-# RewriteCond %{SERVER_PORT} !^443
-# RewriteRule ^ https://example-domain-please-change-me.com%{REQUEST_URI} [R=301,L]
-# </IfModule>
-
-
-# ----------------------------------------------------------------------
-# Prevent 404 errors for non-existing redirected folders
-# ----------------------------------------------------------------------
-
-# without -MultiViews, Apache will give a 404 for a rewrite if a folder of the
-# same name does not exist.
-# webmasterworld.com/apache/3808792.htm
-
-Options -MultiViews
-
-
-# ----------------------------------------------------------------------
-# Custom 404 page
-# ----------------------------------------------------------------------
-
-# You can add custom pages to handle 500 or 403 pretty easily, if you like.
-# If you are hosting your site in subdirectory, adjust this accordingly
-# e.g. ErrorDocument 404 /subdir/404.html
-ErrorDocument 404 /404.html
-
-
-# ----------------------------------------------------------------------
-# UTF-8 encoding
-# ----------------------------------------------------------------------
-
-# Use UTF-8 encoding for anything served text/plain or text/html
-AddDefaultCharset utf-8
-
-# Force UTF-8 for a number of file formats
-AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
-
-
-# ----------------------------------------------------------------------
-# A little more security
-# ----------------------------------------------------------------------
-
-# To avoid displaying the exact version number of Apache being used, add the
-# following to httpd.conf (it will not work in .htaccess):
-# ServerTokens Prod
-
-# "-Indexes" will have Apache block users from browsing folders without a
-# default document Usually you should leave this activated, because you
-# shouldn't allow everybody to surf through every folder on your server (which
-# includes rather private places like CMS system folders).
-<IfModule mod_autoindex.c>
- Options -Indexes
-</IfModule>
-
-# Block access to "hidden" directories or files whose names begin with a
-# period. This includes directories used by version control systems such as
-# Subversion or Git.
-<IfModule mod_rewrite.c>
- RewriteCond %{SCRIPT_FILENAME} -d [OR]
- RewriteCond %{SCRIPT_FILENAME} -f
- RewriteRule "(^|/)\." - [F]
-</IfModule>
-
-# Block access to backup and source files. These files may be left by some
-# text/html editors and pose a great security danger, when anyone can access
-# them.
-<FilesMatch "(\.(bak|config|sql|fla|psd|ini|log|sh|inc|swp|dist)|~)$">
- Order allow,deny
- Deny from all
- Satisfy All
-</FilesMatch>
-
-# If your server is not already configured as such, the following directive
-# should be uncommented in order to set PHP's register_globals option to OFF.
-# This closes a major security hole that is abused by most XSS (cross-site
-# scripting) attacks. For more information: http://php.net/register_globals
-#
-# IF REGISTER_GLOBALS DIRECTIVE CAUSES 500 INTERNAL SERVER ERRORS:
-#
-# Your server does not allow PHP directives to be set via .htaccess. In that
-# case you must make this change in your php.ini file instead. If you are
-# using a commercial web host, contact the administrators for assistance in
-# doing this. Not all servers allow local php.ini files, and they should
-# include all PHP configurations (not just this one), or you will effectively
-# reset everything to PHP defaults. Consult www.php.net for more detailed
-# information about setting PHP directives.
-
-# php_flag register_globals Off
-
-# Rename session cookie to something else, than PHPSESSID
-# php_value session.name sid
-
-# Disable magic quotes (This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.)
-# php_flag magic_quotes_gpc Off
-
-# Do not show you are using PHP
-# Note: Move this line to php.ini since it won't work in .htaccess
-# php_flag expose_php Off
-
-# Level of log detail - log all errors
-# php_value error_reporting -1
-
-# Write errors to log file
-# php_flag log_errors On
-
-# Do not display errors in browser (production - Off, development - On)
-# php_flag display_errors Off
-
-# Do not display startup errors (production - Off, development - On)
-# php_flag display_startup_errors Off
-
-# Format errors in plain text
-# Note: Leave this setting 'On' for xdebug's var_dump() output
-# php_flag html_errors Off
-
-# Show multiple occurrence of error
-# php_flag ignore_repeated_errors Off
-
-# Show same errors from different sources
-# php_flag ignore_repeated_source Off
-
-# Size limit for error messages
-# php_value log_errors_max_len 1024
-
-# Don't precede error with string (doesn't accept empty string, use whitespace if you need)
-# php_value error_prepend_string " "
-
-# Don't prepend to error (doesn't accept empty string, use whitespace if you need)
-# php_value error_append_string " "
-
-# Increase cookie security
-<IfModule php5_module>
- php_value session.cookie_httponly true
-</IfModule>
-
-# Do not cache (for dev purposes)
-<FilesMatch "\.(html|htm|js|css)$">
-FileETag None
-<ifModule mod_headers.c>
-Header unset ETag
-Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
-Header set Pragma "no-cache"
-Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
-</ifModule>
-</FilesMatch>
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/README.md b/desuto-retrieval/Desuto-retrievalinterface/README.md
deleted file mode 100755
index ef7743c..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# Desuto-retrievalinterface
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/caman.css b/desuto-retrieval/Desuto-retrievalinterface/css/caman.css
deleted file mode 100755
index 172524b..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/caman.css
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- File required to use the CamanJS plugin.
- This File define all default styles for the CamanJS plugin.
-*/
-
-body {
-font-family:Raleway,"Helvetica Neue",Helvetica,Arial,sans-serif;
-margin:0 0 50px;
-padding:0 0 50px;
-}
-
-p,li {
-font-size:15px;
-}
-
-p {
-line-height:24px;
-color:#343431;
-}
-
-li {
-color:#343431;
-}
-
-a {
-text-decoration:none;
-color:#343431;
--webkit-transition:filont-weight .3s ease-out;
--moz-transition:font-weight .3s ease-out;
-transition:font-weight .3s ease-out;
-}
-
-a:hover {
-color:#368ad2;
-}
-
-code {
-font-family:'Source Code Pro',monospace;
-font-size:13px;
-}
-
-#HeaderContainer {
-width:100%;
-background-color:#fff;
-}
-
-#HeaderContainer.Fixed {
-position:fixed;
-top:0;
-left:0;
-}
-
-#HeaderContainer.Fixed ~ #Content {
-padding-top:140px;
-}
-
-#Header {
-width:600px;
-height:50px;
-margin:0 auto;
-padding:20px 0;
-}
-
-#Header h1 {
-font-weight:200;
-line-height:50px;
-font-size:36px;
-margin:0;
-}
-
-#Header ul {
-list-style:none;
-margin:0;
-}
-
-#Header ul li {
-float:left;
-line-height:50px;
-font-weight:200;
-padding:0 20px;
-}
-
-#GuideSections {
-width:100%;
-margin-top:10px!important;
-padding:0;
-}
-
-#GuideSections li {
-width:25%;
-text-align:center;
-margin:0;
-padding:0!important;
-}
-
-.Clear {
-clear:both;
-}
-
-.Left {
-float:left;
-text-align:left;
-}
-
-.Right {
-float:right;
-text-align:right;
-}
-
-#Content {
-width:auto;
-margin:10px auto;
-padding:20px 0;
-}
-
-.SectionBreak {
-width:100%;
-height:1px;
-background-color:#f8f8f2;
-margin:50px 0;
-}
-
-.TableList {
-list-style:none;
-margin:0;
-padding:0;
-}
-
-.TableList li {
--moz-box-sizing:border-box;
--webkit-box-sizing:border-box;
-box-sizing:border-box;
-float:left;
-display:block;
-height:40px;
-background-color:#f8f8f8;
-line-height:40px;
-margin:3px;
-padding:0 10px;
-}
-
-.TableList.Across3 li {
-width:194px;
-}
-
-.TableList.Across5 li {
-width:114px;
-}
-
-.CopyCommand {
--webkit-border-radius:3px;
--moz-border-radius:3px;
-border-radius:3px;
-background-color:#f8f8f8;
-cursor:pointer;
-display:block;
-text-align:center;
-padding:10px 20px;
-}
-
-#Filters .Filter {
-float:left;
-width:300px;
-}
-
-#Filters .Filter>div {
-padding:5px 10px;
-}
-
-#Filters .Filter .FilterName {
-float:left;
-padding-left:0;
-padding-right:0;
-}
-
-#Filters .Filter .FilterSetting {
-float:right;
-}
-
-#Filters .Filter .FilterSetting input[type="range"] {
-width:150px;
-/*-webkit-appearance:none!important;
-width:150px;
-background-color:#434341;
-height:1px;
-vertical-align:1px;*/
-}
-
-#Filters .Filter .FilterSetting input[type="range"]::-webkit-slider-thumb {
-/*-webkit-appearance:none!important;
-height:12px;
-width:15px;
-background-color:#368ad2;
-cursor:pointer;*/
-}
-
-#Filters .Filter .FilterSetting .FilterValue {
-width:30px;
-display:inline-block;
-}
-
-#PresetFilters a {
--webkit-border-radius:3px;
--moz-border-radius:3px;
-border-radius:3px;
--webkit-transition:background-color .3s ease-out;
--moz-transition:background-color .3s ease-out;
-transition:background-color .3s ease-out;
-background-color:#368ad2;
-display:block;
-float:left;
-text-align:center;
-color:#f8f8f2;
-border:none;
-font-size:13px;
-width:120px;
-cursor:pointer;
-margin:5px;
-padding:8px 10px;
-}
-
-#PresetFilters a.Active {
-background-color:#e69751;
-}
-
-#HomeExamples .Left,#HomeExamples .Right {
-text-align:center;
-}
-
-.HomeLinks.Across2 .LinksSection {
-width:280px;
-}
-
-.HomeLinks .LinksSection {
-float:left;
-width:180px;
-margin:0 10px 10px;
-}
-
-.HomeLinks .LinksSection a {
--webkit-border-radius:3px;
--moz-border-radius:3px;
-border-radius:3px;
-background-color:#368ad2;
-display:block;
-text-align:center;
-color:#f8f8f2;
-cursor:pointer;
-margin:10px 0;
-padding:10px 20px;
-}
-
-.HomeLinks .LinksSection .CopyCommand {
-margin:10px 0!important;
-}
-
-.hll {
-background-color:#ffc;
-}
-
-.err {
-border:1px solid red;
-}
-
-.k {
-color:#434341;
-font-weight:700;
-}
-
-.cp {
-color:#cbcbcb;
-}
-
-.gd {
-color:#a00000;
-}
-
-.ge {
-font-style:italic;
-}
-
-.gr {
-color:red;
-}
-
-.gi {
-color:#00a000;
-}
-
-.go {
-color:gray;
-}
-
-.gs {
-font-weight:700;
-}
-
-.gu {
-color:purple;
-font-weight:700;
-}
-
-.gt {
-color:#0040d0;
-}
-
-.kr {
-color:green;
-font-weight:700;
-}
-
-.kt {
-color:#b00040;
-}
-
-.no {
-color:#800;
-}
-
-.nd {
-color:#a2f;
-}
-
-.ni {
-color:#999;
-font-weight:700;
-}
-
-.ne {
-color:#d2413a;
-font-weight:700;
-}
-
-.nf {
-color:#00f;
-}
-
-.nl {
-color:#a0a000;
-}
-
-.ow {
-color:#a2f;
-font-weight:700;
-}
-
-.w {
-color:#bbb;
-}
-
-.sd {
-color:#ba2121;
-font-style:italic;
-}
-
-.se {
-color:#b62;
-font-weight:700;
-}
-
-.si {
-color:#b68;
-font-weight:700;
-}
-
-.sr {
-color:#b68;
-}
-
-#Header ul li.Active a,#GuideSections li.Active a {
-color:#368ad2;
-font-weight:400;
-}
-
-#Filters,.HomeLinks .LinksSection iframe {
-margin:0px;
-}
-
-#Filters .Filter .FilterName p,.HomeLinks .LinksSection h4,.HomeLinks .LinksSection p {
-margin:0;
-}
-
-#PresetFilters a:hover,.HomeLinks .LinksSection a:hover {
-background-color:#4b96d7;
-}
-
-#PresetFilters a:active,.HomeLinks .LinksSection a:active {
--webkit-box-shadow:inset 1px 1px 3px rgba(0,0,0,0.3);
--moz-box-shadow:inset 1px 1px 3px rgba(0,0,0,0.3);
-box-shadow:inset 1px 1px 3px rgba(0,0,0,0.3);
-}
-
-.c,.cm,.c1,.cs {
-color:#cbcbcb;
-font-style:italic;
-}
-
-.o,.il {
-color:#666;
-}
-
-.p,.na,.nx {
-color:#434341;
-}
-
-.gh,.gp {
-color:navy;
-font-weight:700;
-}
-
-.kc,.kd,.kn,.nt {
-color:#368ad2;
-font-weight:700;
-}
-
-.kp,.nb,.sx,.bp {
-color:green;
-}
-
-.m,.mf,.mh,.mi,.mo {
-color:#ad85fc;
-}
-
-.s,.s2,.s1 {
-color:#e69751;
-}
-
-.nc,.nn {
-color:#00f;
-font-weight:700;
-}
-
-.nv,.ss,.vc,.vg,.vi {
-color:#19177c;
-}
-
-.sb,.sc,.sh {
-color:#ba2121;
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/dropzone.css b/desuto-retrieval/Desuto-retrievalinterface/css/dropzone.css
deleted file mode 100755
index 111bced..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/dropzone.css
+++ /dev/null
@@ -1,394 +0,0 @@
-/* The MIT License */
-.dropzone,
-.dropzone *,
-.dropzone-previews,
-.dropzone-previews * {
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-.dropzone {
- position: relative;
- border: 1px solid rgba(0,0,0,0.08);
- background: rgba(0,0,0,0.02);
- padding: 1em;
-}
-.dropzone.dz-clickable {
- cursor: pointer;
-}
-.dropzone.dz-clickable .dz-message,
-.dropzone.dz-clickable .dz-message span {
- cursor: pointer;
-}
-.dropzone.dz-clickable * {
- cursor: default;
-}
-.dropzone .dz-message {
- opacity: 1;
- -ms-filter: none;
- filter: none;
-}
-.dropzone.dz-drag-hover {
- border-color: rgba(0,0,0,0.15);
- background: rgba(0,0,0,0.04);
-}
-.dropzone.dz-started .dz-message {
- display: none;
-}
-.dropzone .dz-preview,
-.dropzone-previews .dz-preview {
- background: rgba(255,255,255,0.8);
- position: relative;
- display: inline-block;
- margin: 17px;
- vertical-align: top;
- border: 1px solid #acacac;
- padding: 6px 6px 6px 6px;
-}
-.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],
-.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {
- display: none;
-}
-.dropzone .dz-preview .dz-details,
-.dropzone-previews .dz-preview .dz-details {
- max-width: 120px;
- max-height: 120px;
- position: relative;
- background: #ebebeb;
- padding: 5px;
- margin-bottom: 22px;
-}
-.dropzone .dz-preview .dz-details .dz-filename,
-.dropzone-previews .dz-preview .dz-details .dz-filename {
- overflow: hidden;
- height: 100%;
-}
-.dropzone .dz-preview .dz-details img,
-.dropzone-previews .dz-preview .dz-details img {
- position: absolute;
- top: 0;
- left: 0;
- width: 100px;
- height: 100px;
-}
-.dropzone .dz-preview .dz-details .dz-size,
-.dropzone-previews .dz-preview .dz-details .dz-size {
- position: absolute;
- bottom: -28px;
- left: 3px;
- height: 28px;
- line-height: 28px;
-}
-.dropzone .dz-preview.dz-error .dz-error-mark,
-.dropzone-previews .dz-preview.dz-error .dz-error-mark {
- display: block;
-}
-.dropzone .dz-preview.dz-success .dz-success-mark,
-.dropzone-previews .dz-preview.dz-success .dz-success-mark {
- display: block;
-}
-/*CUSTOM STYLE*/
-/*
-.dropzone .dz-preview:hover .dz-details img,
-.dropzone-previews .dz-preview:hover .dz-details img {
- display: none;
-}
-*/
-.dropzone .dz-preview .dz-success-mark,
-.dropzone-previews .dz-preview .dz-success-mark,
-.dropzone .dz-preview .dz-error-mark,
-.dropzone-previews .dz-preview .dz-error-mark {
- display: none;
- position: absolute;
- width: 40px;
- height: 40px;
- font-size: 30px;
- text-align: center;
- right: -10px;
- top: -10px;
-}
-.dropzone .dz-preview .dz-success-mark,
-.dropzone-previews .dz-preview .dz-success-mark {
- color: #8cc657;
-}
-.dropzone .dz-preview .dz-error-mark,
-.dropzone-previews .dz-preview .dz-error-mark {
- color: #ee162d;
-}
-.dropzone .dz-preview .dz-progress,
-.dropzone-previews .dz-preview .dz-progress {
- position: absolute;
- top: 100px;
- left: 6px;
- right: 6px;
- height: 6px;
- background: #d7d7d7;
- display: none;
-}
-.dropzone .dz-preview .dz-progress .dz-upload,
-.dropzone-previews .dz-preview .dz-progress .dz-upload {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- width: 0%;
- background-color: #8cc657;
-}
-.dropzone .dz-preview.dz-processing .dz-progress,
-.dropzone-previews .dz-preview.dz-processing .dz-progress {
- display: block;
-}
-.dropzone .dz-preview .dz-error-message,
-.dropzone-previews .dz-preview .dz-error-message {
- display: none;
- position: absolute;
- top: -5px;
- left: -20px;
- background: rgba(245,245,245,0.8);
- padding: 8px 10px;
- color: #800;
- min-width: 140px;
- max-width: 500px;
- z-index: 500;
-}
-.dropzone .dz-preview:hover.dz-error .dz-error-message,
-.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
- display: block;
-}
-.dropzone {
- border: 1px solid rgba(0,0,0,0.03);
- min-height: 360px;
- -webkit-border-radius: 3px;
- border-radius: 3px;
- background: rgba(0,0,0,0.03);
- padding: 23px;
-}
-.dropzone .dz-default.dz-message {
- opacity: 1;
- -ms-filter: none;
- filter: none;
- -webkit-transition: opacity 0.3s ease-in-out;
- -moz-transition: opacity 0.3s ease-in-out;
- -o-transition: opacity 0.3s ease-in-out;
- -ms-transition: opacity 0.3s ease-in-out;
- transition: opacity 0.3s ease-in-out;
- background-image: url("../img/spritemap.png");
- background-repeat: no-repeat;
- background-position: 0 0;
- position: absolute;
- width: 428px;
- height: 123px;
- margin-left: -214px;
- margin-top: -61.5px;
- top: 50%;
- left: 50%;
-}
-@media all and (-webkit-min-device-pixel-ratio: 1.5) {
- .dropzone .dz-default.dz-message {
- background-image: url("../img/spritemap@2x.png");
- -webkit-background-size: 428px 406px;
- -moz-background-size: 428px 406px;
- background-size: 428px 406px;
- }
-}
-.dropzone .dz-default.dz-message span {
- display: none;
-}
-.dropzone.dz-square .dz-default.dz-message {
- background-position: 0 -123px;
- width: 268px;
- margin-left: -134px;
- height: 174px;
- margin-top: -87px;
-}
-.dropzone.dz-drag-hover .dz-message {
- opacity: 0.15;
- filter: alpha(opacity=15);
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)";
-}
-.dropzone.dz-started .dz-message {
- display: block;
- opacity: 0;
- filter: alpha(opacity=0);
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
-}
-.dropzone .dz-preview,
-.dropzone-previews .dz-preview {
- -webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16);
- box-shadow: 1px 1px 4px rgba(0,0,0,0.16);
- font-size: 14px;
-}
-/*CUSTOM STYLE*/
-/*
-.dropzone .dz-preview.dz-image-preview:hover .dz-details img,
-.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img {
- display: block;
- opacity: 0.1;
- filter: alpha(opacity=10);
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)";
-}
-*/
-.dropzone .dz-preview.dz-success .dz-success-mark,
-.dropzone-previews .dz-preview.dz-success .dz-success-mark {
- opacity: 1;
- -ms-filter: none;
- filter: none;
-}
-.dropzone .dz-preview.dz-error .dz-error-mark,
-.dropzone-previews .dz-preview.dz-error .dz-error-mark {
- opacity: 1;
- -ms-filter: none;
- filter: none;
-}
-.dropzone .dz-preview.dz-error .dz-progress .dz-upload,
-.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload {
- background: #ee1e2d;
-}
-.dropzone .dz-preview .dz-error-mark,
-.dropzone-previews .dz-preview .dz-error-mark,
-.dropzone .dz-preview .dz-success-mark,
-.dropzone-previews .dz-preview .dz-success-mark {
- display: block;
- opacity: 0;
- filter: alpha(opacity=0);
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
- -webkit-transition: opacity 0.4s ease-in-out;
- -moz-transition: opacity 0.4s ease-in-out;
- -o-transition: opacity 0.4s ease-in-out;
- -ms-transition: opacity 0.4s ease-in-out;
- transition: opacity 0.4s ease-in-out;
- background-image: url("../img/spritemap.png");
- background-repeat: no-repeat;
-}
-@media all and (-webkit-min-device-pixel-ratio: 1.5) {
- .dropzone .dz-preview .dz-error-mark,
- .dropzone-previews .dz-preview .dz-error-mark,
- .dropzone .dz-preview .dz-success-mark,
- .dropzone-previews .dz-preview .dz-success-mark {
- background-image: url("../img/spritemap@2x.png");
- -webkit-background-size: 428px 406px;
- -moz-background-size: 428px 406px;
- background-size: 428px 406px;
- }
-}
-.dropzone .dz-preview .dz-error-mark span,
-.dropzone-previews .dz-preview .dz-error-mark span,
-.dropzone .dz-preview .dz-success-mark span,
-.dropzone-previews .dz-preview .dz-success-mark span {
- display: none;
-}
-.dropzone .dz-preview .dz-error-mark,
-.dropzone-previews .dz-preview .dz-error-mark {
- background-position: -268px -123px;
-}
-.dropzone .dz-preview .dz-success-mark,
-.dropzone-previews .dz-preview .dz-success-mark {
- background-position: -268px -163px;
-}
-.dropzone .dz-preview .dz-progress .dz-upload,
-.dropzone-previews .dz-preview .dz-progress .dz-upload {
- -webkit-animation: loading 0.4s linear infinite;
- -moz-animation: loading 0.4s linear infinite;
- -o-animation: loading 0.4s linear infinite;
- -ms-animation: loading 0.4s linear infinite;
- animation: loading 0.4s linear infinite;
- -webkit-transition: width 0.3s ease-in-out;
- -moz-transition: width 0.3s ease-in-out;
- -o-transition: width 0.3s ease-in-out;
- -ms-transition: width 0.3s ease-in-out;
- transition: width 0.3s ease-in-out;
- -webkit-border-radius: 2px;
- border-radius: 2px;
- position: absolute;
- top: 0;
- left: 0;
- width: 0%;
- height: 100%;
- background-image: url("../img/spritemap.png");
- background-repeat: repeat-x;
- background-position: 0px -400px;
-}
-@media all and (-webkit-min-device-pixel-ratio: 1.5) {
- .dropzone .dz-preview .dz-progress .dz-upload,
- .dropzone-previews .dz-preview .dz-progress .dz-upload {
- background-image: url("../img/spritemap@2x.png");
- -webkit-background-size: 428px 406px;
- -moz-background-size: 428px 406px;
- background-size: 428px 406px;
- }
-}
-.dropzone .dz-preview.dz-success .dz-progress,
-.dropzone-previews .dz-preview.dz-success .dz-progress {
- display: block;
- opacity: 0;
- filter: alpha(opacity=0);
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
- -webkit-transition: opacity 0.4s ease-in-out;
- -moz-transition: opacity 0.4s ease-in-out;
- -o-transition: opacity 0.4s ease-in-out;
- -ms-transition: opacity 0.4s ease-in-out;
- transition: opacity 0.4s ease-in-out;
-}
-.dropzone .dz-preview .dz-error-message,
-.dropzone-previews .dz-preview .dz-error-message {
- display: block;
- opacity: 0;
- filter: alpha(opacity=0);
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
- -webkit-transition: opacity 0.3s ease-in-out;
- -moz-transition: opacity 0.3s ease-in-out;
- -o-transition: opacity 0.3s ease-in-out;
- -ms-transition: opacity 0.3s ease-in-out;
- transition: opacity 0.3s ease-in-out;
-}
-.dropzone .dz-preview:hover.dz-error .dz-error-message,
-.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
- opacity: 1;
- -ms-filter: none;
- filter: none;
-}
-@-moz-keyframes loading {
- 0% {
- background-position: 0 -400px;
- }
-
- 100% {
- background-position: -7px -400px;
- }
-}
-@-webkit-keyframes loading {
- 0% {
- background-position: 0 -400px;
- }
-
- 100% {
- background-position: -7px -400px;
- }
-}
-@-o-keyframes loading {
- 0% {
- background-position: 0 -400px;
- }
-
- 100% {
- background-position: -7px -400px;
- }
-}
-@-ms-keyframes loading {
- 0% {
- background-position: 0 -400px;
- }
-
- 100% {
- background-position: -7px -400px;
- }
-}
-@keyframes loading {
- 0% {
- background-position: 0 -400px;
- }
-
- 100% {
- background-position: -7px -400px;
- }
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/edit-sober.css b/desuto-retrieval/Desuto-retrievalinterface/css/edit-sober.css
deleted file mode 100755
index a034da7..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/edit-sober.css
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- Document : main
- Created on : 5 juin 2013, 08:22:17
- Author : voc
- Description:
- Main styles for the project.
-*/
-
-/* Styles for the editionPage.html */
-
-#bodyEdition{
- margin: 0 !important;
- padding: 0 !important;
-}
-
-/* div where the image to edit is*/
-/*#editionImage canvas{
- max-height: 400px;
-}*/
-
-#content{
- padding:1em;
- overflow: hidden;
-}
-
-#editionImage{
- float: left;
- width: 450px;
- text-align: center !important;
- position:relative;
-}
-
-#editionOverlay{
- background-color: rgba(0,0,0,0.8);
- position: absolute;
- width: 100%;
- height:100%;
- display: none;
-}
-
-#editionOverlay img{
- position:absolute;
- top:50%;
- margin-top:-16px;
- margin-left: -16px;
-}
-
-#editionTools{
- float: right;
- width : 300px;
-}
-
-/*
-#resetButtonDiv{
- text-align: center;
- margin-left: 60px;
-}
-*/
-
-/* attribute for the image to edit */
-#example{
- max-width: 400px;
-}
-
-#Filters{
- margin: 0px !important;
- /*width: 300px;*/
-}
-
-.FilterName{
- margin-right: -2em;
-}
-
-.FilterName p{
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size:1em;
-}
-
-.FilterSetting span{
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-
-.fancybox fancybox.iframe{
- margin : 0 !important;
-}
-
-.unselectable {
- -moz-user-select: none; /* These user-select properties are inheritable, used to prevent text selection */
- -webkit-user-select: none;
- -ms-user-select: none; /* From IE10 only */
- user-select: none; /* Not valid CSS yet, as of July 2012 */
- -webkit-user-drag: none; /* Prevents dragging of images/divs etc */
- user-drag: none;
- cursor: pointer;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: -moz-none;
-}
-
-.clearfix:before,
-.clearfix:after {
- content: " ";
- display: table;
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.clearfix {
- *zoom: 1;
-}
-
-.clear{
- clear: both;
- background-color: green;
- height:10px;
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/leap.css b/desuto-retrieval/Desuto-retrievalinterface/css/leap.css
deleted file mode 100755
index 778cb44..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/leap.css
+++ /dev/null
@@ -1,55 +0,0 @@
-#leap-canvas{
- position: absolute;
- z-index: 50;
- display:none;
- top:0;
- left:0;
-}
-
-#front{
- display:none;
- position:absolute;
- left:0px;
- right:0px;
- top:0px;
- bottom:0px;
- margin-left:auto;
- margin-right:auto;
- /*max-width: 100%;
- max-height: 100%;*/
- background: rgba(0, 0, 0, 0.4);
- text-align:center;
- z-index:100;
- vertical-align: middle;
-}
-
-#front img{
- min-width: 200px;
-}
-
-#drag-image{
- position: absolute;
- top:0;
- left:0;
- z-index:100;
-}
-
-#drag-image *{
- list-style-type: none;
-}
-
-#pCaption{
- margin: auto;
- border-radius: 15 px;
- max-width: 80%;
- color:white;
- background: rgba(0, 0, 0, 0.8);
-}
-
-.leap-selected{
- background-color: rgba(255,255,0,0.5);
-}
-
-.leap-grabbed{
- background-color: rgba(0,255,0,0.5);
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/main.css b/desuto-retrieval/Desuto-retrievalinterface/css/main.css
deleted file mode 100755
index f417cc2..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/main.css
+++ /dev/null
@@ -1,223 +0,0 @@
-/* ==========================================================================
- HTML5 Boilerplate styles - h5bp.com (generated via initializr.com)
- ========================================================================== */
-
-html,
-button,
-input,
-select,
-textarea {
- color: #222;
-}
-
-body {
- font-size: 1em;
- line-height: 1.4;
-}
-
-::-moz-selection {
- background: #b3d4fc;
- text-shadow: none;
-}
-
-::selection {
- background: #b3d4fc;
- text-shadow: none;
-}
-
-hr {
- display: block;
- height: 1px;
- border: 0;
- border-top: 1px solid #ccc;
- margin: 1em 0;
- padding: 0;
-}
-
-img {
- vertical-align: middle;
-}
-
-fieldset {
- border: 0;
- margin: 0;
- padding: 0;
-}
-
-textarea {
- resize: vertical;
-}
-
-.chromeframe {
- margin: 0.2em 0;
- background: #ccc;
- color: #000;
- padding: 0.2em 0;
-}
-
-
-/* ==========================================================================
- Author's custom styles
- ========================================================================== */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/* ==========================================================================
- Media Queries
- ========================================================================== */
-
-@media only screen and (min-width: 35em) {
-
-}
-
-@media print,
- (-o-min-device-pixel-ratio: 5/4),
- (-webkit-min-device-pixel-ratio: 1.25),
- (min-resolution: 120dpix) {
-
-}
-
-/* ==========================================================================
- Helper classes
- ========================================================================== */
-
-.ir {
- background-color: transparent;
- border: 0;
- overflow: hidden;
- *text-indent: -9999px;
-}
-
-.ir:before {
- content: "";
- display: block;
- width: 0;
- height: 150%;
-}
-
-.hidden {
- display: none !important;
- visibility: hidden;
-}
-
-.visuallyhidden {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-
-.visuallyhidden.focusable:active,
-.visuallyhidden.focusable:focus {
- clip: auto;
- height: auto;
- margin: 0;
- overflow: visible;
- position: static;
- width: auto;
-}
-
-.invisible {
- visibility: hidden;
-}
-
-.clearfix:before,
-.clearfix:after {
- content: " ";
- display: table;
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.clearfix {
- *zoom: 1;
-}
-
-/* ==========================================================================
- Print styles
- ========================================================================== */
-
-@media print {
- * {
- background: transparent !important;
- color: #000 !important; /* Black prints faster: h5bp.com/s */
- box-shadow: none !important;
- text-shadow: none !important;
- }
-
- a,
- a:visited {
- text-decoration: underline;
- }
-
- a[href]:after {
- content: " (" attr(href) ")";
- }
-
- abbr[title]:after {
- content: " (" attr(title) ")";
- }
-
- /*
- * Don't show links for images, or javascript/internal links
- */
-
- .ir a:after,
- a[href^="javascript:"]:after,
- a[href^="#"]:after {
- content: "";
- }
-
- pre,
- blockquote {
- border: 1px solid #999;
- page-break-inside: avoid;
- }
-
- thead {
- display: table-header-group; /* h5bp.com/t */
- }
-
- tr,
- img {
- page-break-inside: avoid;
- }
-
- img {
- max-width: 100% !important;
- }
-
- @page {
- margin: 0.5cm;
- }
-
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
-
- h2,
- h3 {
- page-break-after: avoid;
- }
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/normalize.css b/desuto-retrieval/Desuto-retrievalinterface/css/normalize.css
deleted file mode 100755
index 4d4d01d..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/normalize.css
+++ /dev/null
@@ -1,527 +0,0 @@
-/*! normalize.css v1.1.0 | MIT License | git.io/normalize */
-
-/* ==========================================================================
- HTML5 display definitions
- ========================================================================== */
-
-/**
- * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-summary {
- display: block;
-}
-
-/**
- * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3.
- */
-
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-
-/**
- * Prevent modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-
-audio:not([controls]) {
- display: none;
- height: 0;
-}
-
-/**
- * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4.
- * Known issue: no IE 6 support.
- */
-
-[hidden] {
- display: none;
-}
-
-/* ==========================================================================
- Base
- ========================================================================== */
-
-/**
- * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using
- * `em` units.
- * 2. Prevent iOS text size adjust after orientation change, without disabling
- * user zoom.
- */
-
-html {
- font-size: 100%; /* 1 */
- -webkit-text-size-adjust: 100%; /* 2 */
- -ms-text-size-adjust: 100%; /* 2 */
-}
-
-/**
- * Address `font-family` inconsistency between `textarea` and other form
- * elements.
- */
-
-html,
-button,
-input,
-select,
-textarea {
- font-family: sans-serif;
-}
-
-/**
- * Address margins handled incorrectly in IE 6/7.
- */
-
-body {
- margin: 0;
-}
-
-/* ==========================================================================
- Links
- ========================================================================== */
-
-/**
- * Address `outline` inconsistency between Chrome and other browsers.
- */
-
-a:focus {
- outline: thin dotted;
-}
-
-/**
- * Improve readability when focused and also mouse hovered in all browsers.
- */
-
-a:active,
-a:hover {
- outline: 0;
-}
-
-/* ==========================================================================
- Typography
- ========================================================================== */
-
-/**
- * Address font sizes and margins set differently in IE 6/7.
- * Address font sizes within `section` and `article` in Firefox 4+, Safari 5,
- * and Chrome.
- */
-
-h1 {
- font-size: 2em;
- margin: 0.67em 0;
-}
-
-h2 {
- font-size: 1.5em;
- margin: 0.83em 0;
-}
-
-h3 {
- font-size: 1.17em;
- margin: 1em 0;
-}
-
-h4 {
- font-size: 1em;
- margin: 1.33em 0;
-}
-
-h5 {
- font-size: 0.83em;
- margin: 1.67em 0;
-}
-
-h6 {
- font-size: 0.67em;
- margin: 2.33em 0;
-}
-
-/**
- * Address styling not present in IE 7/8/9, Safari 5, and Chrome.
- */
-
-abbr[title] {
- border-bottom: 1px dotted;
-}
-
-/**
- * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome.
- */
-
-b,
-strong {
- font-weight: bold;
-}
-
-blockquote {
- margin: 1em 40px;
-}
-
-/**
- * Address styling not present in Safari 5 and Chrome.
- */
-
-dfn {
- font-style: italic;
-}
-
-/**
- * Address differences between Firefox and other browsers.
- * Known issue: no IE 6/7 normalization.
- */
-
-hr {
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- height: 0;
-}
-
-/**
- * Address styling not present in IE 6/7/8/9.
- */
-
-mark {
- background: #ff0;
- color: #000;
-}
-
-/**
- * Address margins set differently in IE 6/7.
- */
-
-p,
-pre {
- margin: 1em 0;
-}
-
-/**
- * Correct font family set oddly in IE 6, Safari 4/5, and Chrome.
- */
-
-code,
-kbd,
-pre,
-samp {
- font-family: monospace, serif;
- _font-family: 'courier new', monospace;
- font-size: 1em;
-}
-
-/**
- * Improve readability of pre-formatted text in all browsers.
- */
-
-pre {
- white-space: pre;
- white-space: pre-wrap;
- word-wrap: break-word;
-}
-
-/**
- * Address CSS quotes not supported in IE 6/7.
- */
-
-q {
- quotes: none;
-}
-
-/**
- * Address `quotes` property not supported in Safari 4.
- */
-
-q:before,
-q:after {
- content: '';
- content: none;
-}
-
-/**
- * Address inconsistent and variable font size in all browsers.
- */
-
-small {
- font-size: 80%;
-}
-
-/**
- * Prevent `sub` and `sup` affecting `line-height` in all browsers.
- */
-
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-
-sup {
- top: -0.5em;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-/* ==========================================================================
- Lists
- ========================================================================== */
-
-/**
- * Address margins set differently in IE 6/7.
- */
-
-dl,
-menu,
-ol,
-ul {
- margin: 1em 0;
-}
-
-dd {
- margin: 0 0 0 40px;
-}
-
-/**
- * Address paddings set differently in IE 6/7.
- */
-
-menu,
-ol,
-ul {
- padding: 0 0 0 40px;
-}
-
-/**
- * Correct list images handled incorrectly in IE 7.
- */
-
-nav ul,
-nav ol {
- list-style: none;
- list-style-image: none;
-}
-
-/* ==========================================================================
- Embedded content
- ========================================================================== */
-
-/**
- * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3.
- * 2. Improve image quality when scaled in IE 7.
- */
-
-img {
- border: 0; /* 1 */
- -ms-interpolation-mode: bicubic; /* 2 */
-}
-
-/**
- * Correct overflow displayed oddly in IE 9.
- */
-
-svg:not(:root) {
- overflow: hidden;
-}
-
-/* ==========================================================================
- Figures
- ========================================================================== */
-
-/**
- * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11.
- */
-
-figure {
- margin: 0;
-}
-
-/* ==========================================================================
- Forms
- ========================================================================== */
-
-/**
- * Correct margin displayed oddly in IE 6/7.
- */
-
-form {
- margin: 0;
-}
-
-/**
- * Define consistent border, margin, and padding.
- */
-
-fieldset {
- border: 1px solid #c0c0c0;
- margin: 0 2px;
- padding: 0.35em 0.625em 0.75em;
-}
-
-/**
- * 1. Correct color not being inherited in IE 6/7/8/9.
- * 2. Correct text not wrapping in Firefox 3.
- * 3. Correct alignment displayed oddly in IE 6/7.
- */
-
-legend {
- border: 0; /* 1 */
- padding: 0;
- white-space: normal; /* 2 */
- *margin-left: -7px; /* 3 */
-}
-
-/**
- * 1. Correct font size not being inherited in all browsers.
- * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5,
- * and Chrome.
- * 3. Improve appearance and consistency in all browsers.
- */
-
-button,
-input,
-select,
-textarea {
- font-size: 100%; /* 1 */
- margin: 0; /* 2 */
- vertical-align: baseline; /* 3 */
- *vertical-align: middle; /* 3 */
-}
-
-/**
- * Address Firefox 3+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-
-button,
-input {
- line-height: normal;
-}
-
-/**
- * Address inconsistent `text-transform` inheritance for `button` and `select`.
- * All other form control elements do not inherit `text-transform` values.
- * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+.
- * Correct `select` style inheritance in Firefox 4+ and Opera.
- */
-
-button,
-select {
- text-transform: none;
-}
-
-/**
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- * and `video` controls.
- * 2. Correct inability to style clickable `input` types in iOS.
- * 3. Improve usability and consistency of cursor style between image-type
- * `input` and others.
- * 4. Remove inner spacing in IE 7 without affecting normal text inputs.
- * Known issue: inner spacing remains in IE 6.
- */
-
-button,
-html input[type="button"], /* 1 */
-input[type="reset"],
-input[type="submit"] {
- -webkit-appearance: button; /* 2 */
- cursor: pointer; /* 3 */
- *overflow: visible; /* 4 */
-}
-
-/**
- * Re-set default cursor for disabled elements.
- */
-
-button[disabled],
-html input[disabled] {
- cursor: default;
-}
-
-/**
- * 1. Address box sizing set to content-box in IE 8/9.
- * 2. Remove excess padding in IE 8/9.
- * 3. Remove excess padding in IE 7.
- * Known issue: excess padding remains in IE 6.
- */
-
-input[type="checkbox"],
-input[type="radio"] {
- box-sizing: border-box; /* 1 */
- padding: 0; /* 2 */
- *height: 13px; /* 3 */
- *width: 13px; /* 3 */
-}
-
-/**
- * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
- * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
- * (include `-moz` to future-proof).
- */
-
-input[type="search"] {
- -webkit-appearance: textfield; /* 1 */
- -moz-box-sizing: content-box;
- -webkit-box-sizing: content-box; /* 2 */
- box-sizing: content-box;
-}
-
-/**
- * Remove inner padding and search cancel button in Safari 5 and Chrome
- * on OS X.
- */
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-/**
- * Remove inner padding and border in Firefox 3+.
- */
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-
-/**
- * 1. Remove default vertical scrollbar in IE 6/7/8/9.
- * 2. Improve readability and alignment in all browsers.
- */
-
-textarea {
- overflow: auto; /* 1 */
- vertical-align: top; /* 2 */
-}
-
-/* ==========================================================================
- Tables
- ========================================================================== */
-
-/**
- * Remove most spacing between table cells.
- */
-
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/normalize.min.css b/desuto-retrieval/Desuto-retrievalinterface/css/normalize.min.css
deleted file mode 100755
index cdfbdb2..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/normalize.min.css
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! normalize.css v1.1.0 | MIT License | git.io/normalize */
-article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/user-sober.css b/desuto-retrieval/Desuto-retrievalinterface/css/user-sober.css
deleted file mode 100755
index d05f4b1..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/user-sober.css
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- Document : user
- Created on : Mar 7, 2013, 3:38:01 PM
- Author : sro
- Description:
- Purpose of the stylesheet follows.
-*/
-
-/* Used Colors
-
-blue : #597DA4 (89, 125, 164)
-red : red
-
-*/
-
-/* Wrapping container */
-
-#container{
- /*min-height: 100%;*/
- /*height: 100%;*/
- min-height: 100%;
- position: relative;
-}
-
-/* Middle container */
-#content{
- margin: 0 0 0 200px;
- position: relative;
- text-align: top;
- /*padding-bottom: 50px;*/
- /*z-index: -1;*/
-}
-
-/* Left container */
-#left{
- left:0;
-}
-
-/* Right container */
-#right{
- right:0;
- display: none;
-}
-
-/* Expert mode */
-#expertmode-overlay{
- position: absolute;
- background-color: rgba(0,0,0,0.9);
- padding:1.5em;
- width:420px;
- left:50%;
- top:40%;
- margin-left: -250px;
- margin-top:-100px;
- z-index: 999;
- border-radius: 20px;
- text-align: center;
- display: none;
-}
-
-#expertmode{
- position: relative;
- top:50%;
- left:50%;
- margin-left: -210px;
- width:400px;
- border-radius: 3px;
- background-color: #597DA4;
- padding:10px;
- color:white;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: x-large;
- text-align: center;
-}
-
-#expertmode span{
- display:block;
- background-color: #fafafa;
- color:#597DA4;
- border-radius: 3px;
-}
-
-.expert-option{
- width:300px;
- margin-top: 0.25em;
- font-size: small;
-}
-
-/* Speech */
-.mic{
- width:32px;
- float:left;
- cursor:pointer;
-}
-
-/* Left & Right boxes */
-.query-box{
- width:200px;
- background-color: #eee;
- overflow-x: hidden;
- overflow-y:auto;
- position: fixed;
- top: 0;
- bottom:0px;
- border: 0 solid #ccc;
- -moz-box-shadow:0px 0px 10px 0px #777;
- -webkit-box-shadow:0px 0px 10px 0px #777;
- box-shadow:0px 0px 10px 0px #777;
- background-image: url('../img/plus.png');
- background-repeat: no-repeat;
- background-position:-9000px -9000px;
- z-index: 8;
- text-align: center;
-}
-
-/* Illuminate on hover */
-.box-hover{
- background-position: center;
- background-color: #ddd;
-}
-
-/* Query box title */
-.box-title{
- text-align: center;
- color:#fff;
- margin:0.5em;
- margin-bottom: 0px;
- background-color: #597da4;
- border-radius: 5px;
- padding:0.1em;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-weight: bold;
-}
-
-/* Tabs */
-#tabs {
- background: transparent;
- border: none;
- font-size: 0.7em;
- /*font-weight: normal;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;*/
-}
-#tabs *{
- border-radius: 3px 3px 0 0;
-}
-#tabs ul{
- background-color: transparent;
-}
-
-#tabs .ui-widget-header {
- background: transparent;
- border: none;
- border-bottom: 1px solid #c0c0c0;
- -moz-border-radius: 0px;
- -webkit-border-radius: 0px;
- border-radius: 0px;
-}
-
-#tabs .ui-tabs-nav .ui-state-default a {
- color: #666;
-}
-#tabs .ui-tabs-nav .ui-state-active a {
- color: #d00;
-}
-
-/* Footer title */
-.footer-title{
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size:x-large;
- color:#1a1a1a;
-}
-
-/* ParaDISE Logo */
-.logo-paradise, .logo-khresmoi{
- position:relative;
- margin:0;
- margin-bottom: 0px;
- height: 70px;
-}
-
-.logo-paradise img{
- position: relative;
- top:10px;
- left:10px;
- width: 120px;
- z-index: 1;
- transform:rotate(-17deg);
- -ms-transform:rotate(-17deg); /* IE 9 */
- -moz-transform:rotate(-17deg); /* Firefox */
- -webkit-transform:rotate(-17deg); /* Safari and Chrome */
- -o-transform:rotate(-17deg); /* Opera */
-}
-
-.logo-khresmoi img{
- position: relative;
- top:5px;
- left:5px;
- z-index: 1;
- width: 180px;
-}
-
-/* Search config */
-#search-config{
- padding:1em;
- margin-left:1em;
-}
-
-#search-config .ui-button{
- padding: .25em 0.5em;
-}
-
-#search-config .ui-state-active{
- background-color: #597da4;
- border: 1px solid #0b54a4;
-}
-
-#search-config .ui-state-active .ui-icon-background{
- border-color: #0b54a4;
-}
-
-/* USERTEST */
-/*#select-feature{
- display: none !important;
-}*/
-
-/* Arrow in the footer */
-#updown{
- cursor:pointer;
- background-color: #d00;
- padding: 0.15em 0;
- border-radius: 5px 5px 0px 0px;
-}
-
-/* Refresh buttons */
-.refresh {
- cursor: pointer;
- position:absolute;
- right:10px;
-}
-
-.refresh img{
- width:40px;
-}
-
-#refresh-diagnostic{
- top:45px;
-}
-
-#refresh-radiology{
- top:105px;
-}
-
-#refresh-imageclef{
- top:165px;
-}
-
-
-/* Global image container settings */
-.image-container, #results{
- list-style-type: none;
- padding: 0;
-}
-
-.image-container li{
- text-indent: 0;
- position:relative;
-}
-
-.image-container li a{
- cursor: move;
-}
-
-.image-container li .overlay{
- height:0;
- bottom: 0;
- color: #EEEEEE;
- font-size: 0.09em;
- left: 0;
- line-height: 0.8em;
- overflow: hidden;
- position: absolute;
- right: 0;
- background: none repeat scroll 0 0 rgba(50, 50, 50, 0.64);
- pointer-events: none;
-}
-
-.image-container li:hover .overlay{
- height: 100%;
-}
-
-.image-container li .trash{
- width:32px;
- height: 32px;
- position: absolute;
- top:50%;
- left:50%;
- margin-left: -16px;
- margin-top:-16px;
- background-image: url('../img/trash-can-32.png');
- visibility: hidden;
- cursor: pointer;
-}
-
-.image-container li:hover .trash{
- visibility: visible;
-}
-
-.overlayVisible{
- height:100% !important;
-}
-
-.trashVisible{
- visibility: visible !important;
-}
-
-/* All query & example images */
-.thumbnail{
- max-width: 120px;
- max-height: 120px;
-}
-
-/* Result images */
-.big{
- border:4px solid transparent;
- max-width: 100%;
-}
-
-/* Bottom images */
-#query-images{
- float: right;
- position: relative;
- left: -50%;
-}
-
-#query-images ul{
- position: relative;
- left: 50%;
-}
-
-#query-images li{
- display:block;
- float:left;
- margin: 0 2em;
-}
-
-#query-images li a{
- cursor: move;
-}
-
-#examples-loader{
- position: absolute;
- left:50%;
- top:50%;
- margin-left: -32px;
- margin-top: 16px;
- display: none;
-}
-
-/* Left & Right images */
-#relevant-images, #irrelevant-images{
- margin: 0;
- text-align:center;
- min-height: calc(100% - 103px);
-}
-
-#relevant-images li, #irrelevant-images li{
- display: block;
- padding:0.5em 0;
-}
-
-/* Results */
-#results{
- padding-top:0px;
- padding-bottom: 0px;
- margin: 0em;
- clear: left;
-}
-
-#results li{
- float:left;
- width: 16.5%;
- margin: 0em;
- display:block;
- padding: 10px;
- box-sizing:border-box;
- -moz-box-sizing:border-box;
- -webkit-box-sizing:border-box;
- z-index: 9;
-}
-
-#results li a{
- cursor: move;
-}
-
-.gleason-grade{
- position: absolute;
- top: 18px;
- left: 18px;
- width: 40px;
- height: 20px;
- font-size: 14px;
- text-align: center;
- border-radius: 10px;
- opacity: 0.8;
- color:white;
-}
-
-.gleason-grade-B{
- background-color: green;
-}
-
-.gleason-grade-3{
- background-color: blue;
-}
-
-.gleason-grade-3-4{
- background-color: red;
-}
-
-.gleason-grade-4{
- background-color: darkred;
-}
-
-.gleason-grade-4-5{
- background-color: #333;
-}
-
-.gleason-grade-5{
- background-color: black;
-}
-
-.unselectable {
- pointer-events: none;
-}
-
-#results-loader{
- position: absolute;
- width: 100%;
- text-align: center;
- clear:both;
- top:50%;
- margin-top: -128px;
- margin-left: 100px;
- display: none;
-}
-
-#info-message{
- text-align: center;
- font-size: xx-large;
- margin-top: 1em;
-}
-
-#load-more{
- width:100%;
- /*position: absolute;*/
- font-size:2em;
- top: -1.5em;
- display:none;
- text-align: center;
- cursor:pointer;
-}
-
-#load-more a{
- background-color: rgba(0,0,0,0.7);
- border-radius: 7px;
- padding:0 0.25em;
- color:white;
- text-decoration: none;
-}
-
-#load-more a:hover{
- background-color: rgba(0,0,0,0.8);
-}
-
-/* Dropzone */
-.dz-filename, .dz-size{
- visibility: hidden;
-}
-
-.dz-image-preview:hover .dz-filename{
- visibility: visible;
-}
-
-.dropzone .dz-preview,
-.dropzone-previews .dz-preview{
- margin: 6px;
-}
-
-.dropzone {
- min-height: 150px;
- padding: 0px;
-}
-
-#dropzone{
- background-color: #b00;
- height:150px;
- width: 75%;
- margin: 0 auto;
- margin-top: 0.5em;
-}
-
-/* Basic tags & classes */
-h1{
- text-align: center;
- font-size:4em;
- margin: 0;
- margin-top: -0.4em;
- padding-top: 0.2em;
-}
-
-html { height: 100%; }
-
-body { height: 100%; overflow-x: hidden;}
-
-/* DROPZONEJS */
-
-/* Preview Element */
-.dz-filename{
- display: none;
-}
-
-/* TextAreas */
-.query-box textarea {
- padding: 9px;
- border: solid 1px #E5E5E5;
- border-radius: 5px;
- outline: 0;
- color:#777;
- font: Helvetica, "Lucida Grande", Verdana, Tahoma, sans-serif;
- font-weight: bold;
- font-size: 14px;
- width: 160px;
- min-height: 10px;
- background: #FFFFFF url('bg_form.png') left top repeat-x;
- background: -webkit-gradient(linear, left top, left 25, from(#FFFFFF), color-stop(4%, #EEEEEE), to(#FFFFFF));
- background: -moz-linear-gradient(top, #FFFFFF, #EEEEEE 1px, #FFFFFF 25px);
- box-shadow: rgba(0,0,0, 0.3) 0px 0px 8px;
- -moz-box-shadow: rgba(0,0,0, 0.3) 0px 0px 8px;
- -webkit-box-shadow: rgba(0,0,0, 0.3) 0px 0px 8px;
-}
-
-.typing-text{
- color:#777;
- text-align: center;
- margin-top: 3px;
- margin-bottom: -10px;
- font-size: x-small;
-}
-
-/* Fancybox customization */
-.fancybox-title{
- padding:0.25em 0.5em;
- background-color: rgba(0,0,0,0.7);
- text-align: justify;
- border-radius: 5px;
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/css/viewer-sober.css b/desuto-retrieval/Desuto-retrievalinterface/css/viewer-sober.css
deleted file mode 100755
index 2a82ac9..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/css/viewer-sober.css
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- Document : main
- Created on : 5 juin 2013, 08:22:17
- Author : voc
- Description:
- Main styles for the project.
-*/
-
-/* Styles for the editionPage.html */
-
-#bodyEdition{
- margin: 0 !important;
- padding: 0 !important;
-}
-
-#openseadragon{
- height: 600px;
-}
-
-#tools a{
- color: black;
- text-decoration: none;
-}
-
-#tools a.text-link{
- text-decoration: underline;
-}
-
-/* div where the image to edit is*/
-/*#editionImage canvas{
- max-height: 400px;
-}*/
-
-#content{
- padding:1em;
- overflow: hidden;
-}
-
-
-.fancybox fancybox.iframe{
- margin : 0 !important;
-}
-
-.unselectable {
- -moz-user-select: none; /* These user-select properties are inheritable, used to prevent text selection */
- -webkit-user-select: none;
- -ms-user-select: none; /* From IE10 only */
- user-select: none; /* Not valid CSS yet, as of July 2012 */
- -webkit-user-drag: none; /* Prevents dragging of images/divs etc */
- user-drag: none;
- cursor: pointer;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -moz-user-select: -moz-none;
-}
-
-.no-cursor{
- pointer-events: none;
-}
-
-.clearfix:before,
-.clearfix:after {
- content: " ";
- display: table;
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.clearfix {
- *zoom: 1;
-}
-
-.clear{
- clear: both;
- background-color: green;
- height:10px;
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/edit.html b/desuto-retrieval/Desuto-retrievalinterface/edit.html
deleted file mode 100755
index 8666989..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/edit.html
+++ /dev/null
@@ -1,181 +0,0 @@
-<!--
-Page to edit an image
--->
-<!DOCTYPE html>
-<html>
- <head>
- <base href="/retrieval/">
- <title></title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link rel="stylesheet" href="css/edit-sober.css"/>
- <link rel="stylesheet" href="css/caman.css"/>
-
- <link href='//fonts.googleapis.com/css?family=Rancho' rel='stylesheet' type='text/css'>
- <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet">
-
- <!-- Configuration -->
- <script src="js/config/config.js"></script>
-
- <!-- jQuery (local) -->
- <script src="js/vendor/jquery-1.10.2.min.js"></script>
- <script src="js/vendor/jquery-libs/jquery.migrate-1.1.1.js"></script>
- <script src="js/vendor/jquery-libs/jquery.imagemapster.js"></script>
- <script src="js/vendor/underscore-min.js"></script>
- <script src="js/vendor/caman.full.js"></script>
-
- <script src="js/vendor/getImageData.js"></script>
- <script src="js/edit/edit.js"></script>
-
- <script>
- //Actions to do when the page is loading
- $(function() {
-
- var imageID = getParameterByName("id");
- imageID = imageID.substring(imageID.lastIndexOf("/") + 1, imageID.lastIndexOf("."));
- //get article url (if available)
- $.getJSON(config.getArticleForImageURL, {
- "imageID": imageID,
- "indexID": config.articlesLuceneIndexID,
- }, function(data) {
-
- if(Object.keys(data).length !== 0 && data.hasOwnProperty("url") && data.url !== ""){
- var linkElement = $("<a><i class='fa fa-file-text-o'></i> &nbsp;Go To Article</a>").attr("href", data.url).attr("target", "_blank");
- $("#gotoArticle").append(linkElement);
- }
- });
-
- //get the value of the parameter id in the URL
- var idImageDetail = getParameterByName("id");
-
- updateCanvas();
-
- // Set the source of the canvas image to the current URL
- $('#example').attr({'src': idImageDetail});
- addImageOnCanvas('example');
-
- /* Required for importing images from another domain */
- /*$.getImageData({url: idImageDetail,
- success: function(image) {
- $('#example').attr({'src': image.src});
- addImageOnCanvas('example');
- }
- });*/
-
- });
- </script>
- </head>
- <body id="bodyEdition">
- <!-- Div with the content -->
- <div id="content">
- <!-- Div with the image to edit -->
- <div id="editionImage">
- <div id="editionOverlay"><img src="img/loader-white-32.gif" /></div>
- <img
- id="example"
- class="unselectable"
- src="//placeholdit.imgix.net/~text?txtsize=33&txt=loading...&w=300&h=300"
- >
- <div id="gotoArticle"></div>
- </div>
- <!-- Div with all tools to edit the image -->
- <div id="editionTools">
- <div id="Filters">
-
- <div class="Filter">
- <div class="FilterName">
- <p>brightness</p>
- </div>
- <div class="FilterSetting">
- <input
- type="range"
- id="slider1"
- min="-100"
- max="100"
- step="1"
- value="0"
- data-filter="brightness"
- >
- <span id="sliderCaption1" class="FilterValue">0</span>
- </div>
- </div>
-
- <div class="Filter">
- <div class="FilterName">
- <p>contrast</p>
- </div>
- <div class="FilterSetting">
- <input
- type="range"
- id="slider2"
- min="-100"
- max="100"
- step="1"
- value="0"
- data-filter="contrast"
- >
- <span id="sliderCaption2" class="FilterValue">0</span>
- </div>
- </div>
-
- <div class="Filter">
- <div class="FilterName">
- <p>saturation</p>
- </div>
- <div class="FilterSetting">
- <input
- type="range"
- id="slider3"
- min="-100"
- max="100"
- step="1"
- value="0"
- data-filter="saturation"
- >
- <span id="sliderCaption3" class="FilterValue">0</span>
- </div>
- </div>
-
- <div class="Filter">
- <div class="FilterName">
- <p>vibrance</p>
- </div>
- <div class="FilterSetting">
- <input
- type="range"
- id="slider4"
- min="-100"
- max="100"
- step="1"
- value="0"
- data-filter="vibrance"
- >
- <span id="sliderCaption4" class="FilterValue">0</span>
- </div>
- </div>
-
- <div class="Filter">
- <div class="FilterName">
- <p>exposure</p>
- </div>
- <div class="FilterSetting">
- <input
- type="range"
- id="slider5"
- min="-100"
- max="100"
- step="1"
- value="0"
- data-filter="exposure"
- >
- <span id="sliderCaption5" class="FilterValue">0</span>
- </div>
- </div>
- </div>
- <!-- A div with a reset button, to put all value to zero -->
- <div id="resetButtonDiv">
- <button onclick="reset();">Reset</button>
- </div>
- </div>
- </div>
- </body>
-</html>
diff --git a/desuto-retrieval/Desuto-retrievalinterface/favicon.ico b/desuto-retrieval/Desuto-retrievalinterface/favicon.ico
deleted file mode 100755
index 44e4db4..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/favicon.ico and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-down-24.png b/desuto-retrieval/Desuto-retrievalinterface/img/arrow-down-24.png
deleted file mode 100755
index 65c0e38..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-down-24.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-out-blue.png b/desuto-retrieval/Desuto-retrievalinterface/img/arrow-out-blue.png
deleted file mode 100755
index fa7f7ee..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-out-blue.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-out.png b/desuto-retrieval/Desuto-retrievalinterface/img/arrow-out.png
deleted file mode 100755
index 2e9bc42..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-out.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-up-24-white.png b/desuto-retrieval/Desuto-retrievalinterface/img/arrow-up-24-white.png
deleted file mode 100755
index cc5e93c..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-up-24-white.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-up-24.png b/desuto-retrieval/Desuto-retrievalinterface/img/arrow-up-24.png
deleted file mode 100755
index 827466a..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/arrow-up-24.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/caduceus-icon.png b/desuto-retrieval/Desuto-retrievalinterface/img/caduceus-icon.png
deleted file mode 100755
index 235b79c..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/caduceus-icon.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/desuto-logo.png b/desuto-retrieval/Desuto-retrievalinterface/img/desuto-logo.png
deleted file mode 100755
index 4f70eb7..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/desuto-logo.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/diagnostic-icon.png b/desuto-retrieval/Desuto-retrievalinterface/img/diagnostic-icon.png
deleted file mode 100755
index b760696..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/diagnostic-icon.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/drawing-icon.png b/desuto-retrieval/Desuto-retrievalinterface/img/drawing-icon.png
deleted file mode 100755
index abf0aad..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/drawing-icon.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/flickr-icon.png b/desuto-retrieval/Desuto-retrievalinterface/img/flickr-icon.png
deleted file mode 100755
index bb857e4..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/flickr-icon.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/icon-info-red.gif b/desuto-retrieval/Desuto-retrievalinterface/img/icon-info-red.gif
deleted file mode 100755
index 8e109f8..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/icon-info-red.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/icon-info.gif b/desuto-retrieval/Desuto-retrievalinterface/img/icon-info.gif
deleted file mode 100755
index 9dfa0e1..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/icon-info.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/imageclef-icon.png b/desuto-retrieval/Desuto-retrievalinterface/img/imageclef-icon.png
deleted file mode 100755
index e93aa76..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/imageclef-icon.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/loader-128.gif b/desuto-retrieval/Desuto-retrievalinterface/img/loader-128.gif
deleted file mode 100755
index 0124f7d..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/loader-128.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/loader-red-64.gif b/desuto-retrieval/Desuto-retrievalinterface/img/loader-red-64.gif
deleted file mode 100755
index 04d2f87..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/loader-red-64.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/loader-white-32.gif b/desuto-retrieval/Desuto-retrievalinterface/img/loader-white-32.gif
deleted file mode 100755
index 2b6e461..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/loader-white-32.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/mic-animate.gif b/desuto-retrieval/Desuto-retrievalinterface/img/mic-animate.gif
deleted file mode 100755
index afe0c9f..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/mic-animate.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/mic-slash.gif b/desuto-retrieval/Desuto-retrievalinterface/img/mic-slash.gif
deleted file mode 100755
index 227e427..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/mic-slash.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/mic.gif b/desuto-retrieval/Desuto-retrievalinterface/img/mic.gif
deleted file mode 100755
index ea72fc0..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/mic.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/plus.png b/desuto-retrieval/Desuto-retrievalinterface/img/plus.png
deleted file mode 100755
index e2fc813..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/plus.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/refresh-32.png b/desuto-retrieval/Desuto-retrievalinterface/img/refresh-32.png
deleted file mode 100755
index bcc32eb..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/refresh-32.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/spritemap.png b/desuto-retrieval/Desuto-retrievalinterface/img/spritemap.png
deleted file mode 100755
index 9f21314..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/spritemap.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/spritemap@2x.png b/desuto-retrieval/Desuto-retrievalinterface/img/spritemap@2x.png
deleted file mode 100755
index e877eea..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/spritemap@2x.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/trash-can-32.png b/desuto-retrieval/Desuto-retrievalinterface/img/trash-can-32.png
deleted file mode 100755
index 2826cac..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/trash-can-32.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/ui-tabs-arrow.png b/desuto-retrieval/Desuto-retrievalinterface/img/ui-tabs-arrow.png
deleted file mode 100755
index e6791d6..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/ui-tabs-arrow.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/img/x-ray-icon.png b/desuto-retrieval/Desuto-retrievalinterface/img/x-ray-icon.png
deleted file mode 100755
index f33e357..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/img/x-ray-icon.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/index.html b/desuto-retrieval/Desuto-retrievalinterface/index.html
deleted file mode 100755
index d325335..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/index.html
+++ /dev/null
@@ -1,167 +0,0 @@
-<!DOCTYPE html>
-<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
-<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
-<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
-<!--[if gt IE 8]><!--><html class="no-js"> <!--<![endif]-->
- <head>
- <base href="/retrieval/">
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
- <title>Desuto Retrieval (beta)</title>
- <meta name="description" content="">
- <meta name="viewport" content="width=device-width">
-
- <link rel="stylesheet" href="css/normalize.min.css">
- <link rel="stylesheet" href="css/main.css">
- <link rel="stylesheet" href="css/user-sober.css">
- <link rel="stylesheet" href="css/leap.css">
-
- <!-- jQuery UI style -->
- <link rel="stylesheet" href="js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.min.css">
-
- <!-- Dropzone style -->
- <link rel="stylesheet" href="css/dropzone.css" />
-
- <!-- fancyBox styles -->
- <link rel="stylesheet" href="js/vendor/fancybox/jquery.fancybox.css" type="text/css" media="screen" />
-
- <link href='//fonts.googleapis.com/css?family=Rancho' rel='stylesheet' type='text/css'>
- <script src="js/vendor/modernizr-2.6.2.min.js"></script>
-
- </head>
- <body>
- <canvas id="leap-canvas"></canvas>
- <div id="front">
- <img src="" alt=""/>
- <p id="pCaption"></p>
- </div>
- <div id="drag-image"></div>
- <div id="expertmode-overlay">
- <div id="expertmode">
- <span>expert mode options</span>
- <label for="caption-index">caption idx</label>&nbsp;
- <input id="caption-index" class="expert-option" type="text"/>
- </div>
- </div>
- <div id="container">
- <div id="left" class="query-box">
- <p class="logo-khresmoi"><img src="img/desuto-logo.png" alt="logo"/></p>
- <div id="text-box-relevant">
- <div class="box-title">
- Relevant &nbsp;&nbsp;Text
- </div>
- <img onclick="startButton(event, 'relevant-caption')" alt="start" id="start-img-relevant" class="mic" src="img/mic.gif">
- <textarea id="relevant-caption" class="caption-query" placeholder="Relevant words..."></textarea>
- <div class="typing-text">&nbsp;</div>
- </div>
- <div class="box-title">
- Relevant &nbsp;&nbsp;Images
- </div>
- <ul id="relevant-images" class="image-container"></ul>
- </div>
- <div id="results-loader">
- <img src="img/loader-128.gif" alt="loading..."/>
- </div>
- <div id="content">
- <div id="search-config">
- <div id="select-dataset" style="display: inline-block">
- <span style="color: #597da4"><strong>Select dataset</strong></span>
- <br />
- <div id="datasets" style="display: inline-block">
- <!-- Datasets come here -->
- </div>
- </div>
- <div id="select-magnification" style="display: inline-block;">
- <span style="color: #597da4;"><strong>Select magnification</strong></span>
- <br />
- <div id="magnifications" style="display: inline-block;">
- <!-- Datasets come here -->
- </div>
- </div>
- <div id="select-feature" style="display: inline-block">
- <span style="color: #597da4"><strong>Select feature</strong></span>
- <br />
- <div id="features" style="display: inline-block">
- <!-- Features come here -->
- </div>
- </div>
- </div>
- <ul id="results"></ul>
- <div id="load-more"><a class="notdavis" title="Load more results...">Load more results...</a></div>
- <div id ="info-message"></div>
- </div>
- <div id="right" class="query-box">
- <div class="box-title">
- Irrelevant &nbsp;&nbsp;Text
- </div>
- <img onclick="startButton(event, 'irrelevant-caption')" alt="start" id="start-img-irrelevant" class="mic" src="img/mic.gif">
- <textarea id="irrelevant-caption" class="caption-query" placeholder="Irrelevant words..."></textarea>
- <div class="typing-text">&nbsp;</div>
- <div class="box-title">
- Irrelevant &nbsp;&nbsp;Images
- </div>
- <ul id="irrelevant-images" class="image-container"></ul>
- </div>
- </div>
-
- <!-- Configuration -->
- <script src="js/config/config.js"></script>
-
- <!-- jQuery (local) -->
- <script src="js/vendor/jquery-1.10.2.min.js"></script>
-
- <!-- jQuery plugins -->
- <script src="js/vendor/jquery-libs/jquery.outerhtml.js"></script>
- <script src="js/vendor/jquery-libs/jquery.textchange.min.js"></script>
- <script src="js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.min.js"></script>
- <script src="js/vendor/jquery-libs/jQueryRotateCompressed.2.2.js"></script>
- <script src="js/vendor/jquery-libs/jquery.throttledresize.js"></script>
- <script src="js/vendor/jquery-libs/jquery.mousewheel-3.0.6.pack.js"></script>
- <script src="js/vendor/jquery-libs/jquery.hotkeys.js"></script>
- <script src="js/vendor/jquery-libs/jquery.centerabsolute.js"></script>
-
- <!-- Add Masonry -->
- <script src="js/vendor/imagesloaded.pkgd.min.js"></script>
- <script src="js/vendor/masonry.pkgd.min.js"></script>
-
- <!-- Add fancyBox -->
- <script src="js/vendor/fancybox/jquery.fancybox.pack.js?v=2.1.4"></script>
-
- <!-- Optionally add helpers - button, thumbnail and/or media -->
- <script src="js/vendor/fancybox/helpers/jquery.fancybox-buttons.js?v=1.0.5"></script>
- <script src="js/vendor/fancybox/helpers/jquery.fancybox-media.js?v=1.0.5"></script>
- <script src="js/vendor/fancybox/helpers/jquery.fancybox-thumbs.js?v=1.0.7"></script>
-
- <!-- Palette -->
- <script src="js/vendor/palette.js"></script>
-
- <!-- Add Dropzone -->
- <script src="js/vendor/dropzone.js"></script>
-
- <!-- Add Davis -->
- <script src="js/vendor/davis.js"></script>
-
- <!-- Underscore -->
- <script src="js/vendor/underscore-min.js"></script>
-
- <!-- User JS code -->
- <script src="js/main/main.js"></script>
- <script src="js/main/main-events.js"></script>
- <script src="js/main/main-functions-search.js"></script>
- <script src="js/main/main-functions-images.js"></script>
- <script src="js/main/main-functions-state.js"></script>
- <script src="js/main/main-functions-config.js"></script>
- <script src="js/main/main-functions-utils.js"></script>
- <script src="js/main/main-functions-ui.js"></script>
- <script src="js/main/main-davis.js"></script>
-
- <!-- Disable Dropzone autoDiscovery -->
- <script>
- Dropzone.autoDiscover = false;
- </script>
-
- <ul id="preview-template" style="display: none;">
- <li><img class="thumbnail" data-dz-thumbnail /><div class='overlay'></div><div class='trash'></div></li>
- </ul>
- </body>
-</html>
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/config/config.js b/desuto-retrieval/Desuto-retrievalinterface/js/config/config.js
deleted file mode 100755
index c88a17f..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/config/config.js
+++ /dev/null
@@ -1,71 +0,0 @@
-var config = {
- // APP VERSION (for LocalStorage)
- appVersion: '1.3',
-
- // Server and WS prefixes
- paradiseRootURL: 'http://localhost/backend/',
- paradiseWSKhresmoiPrefix: 'ParaDISEWSKhresmoi/',
- paradiseWSVisualPrefix: 'ParaDISEWSVisual/',
- paradiseWSFullTextPrefix: 'KhresmoiWSFullText/',
-
- // Other URLs
- iipRootURL: 'http://pathology.hevs.ch/iipsrv/iipsrv.fcgi',
- webviewerRootURL: 'http://pathology.hevs.ch/',
- slidePropertiesRootURL: 'http://pathology.hevs.ch/',
-
- // Paths
- iipBaseDir: '/mnt/nas2/results/IntermediateResults/Desuto/SlideViewerData/',
-
- // Global prefix (if the app lives in a subdirectory)
- prefix : '/retrieval',
-
- // Article Lucene index (for mapping images to articles)
- articlesLuceneIndexID : 'pubmedcentral-fulltext-2016'
-}
-
-// URLs
-config.globalSearchURL = config.paradiseRootURL + config.paradiseWSKhresmoiPrefix + 'resources/searchResource/searchImages';
-config.uploadURL = config.paradiseRootURL + config.paradiseWSKhresmoiPrefix + 'resources/uploadResource/uploadImage';
-config.imageInfosURL = config.paradiseRootURL + config.paradiseWSKhresmoiPrefix + 'resources/searchResource/imageInformationHandler';
-config.getArticleForImageURL = config.paradiseRootURL + config.paradiseWSFullTextPrefix + 'resources/fulltext/getArticleForImage';
-config.editPath = 'edit.html';
-config.viewerPath = 'viewer.html';
-
-// Datasets
-config.datasets = {
- contextvision: {
- title: 'ContextVision',
- magnifications: {
- '5': {
- visualIndices: [
- {title: 'CEDD', indexID: 'contextvision100_5x_cedd'},
- {title: 'DL', indexID: 'contextvision100_5x_dl'}
- ]
- },
- '10': {
- visualIndices: [
- {title: 'CEDD', indexID: 'contextvision100_10x_cedd'},
- {title: 'DL', indexID: 'contextvision100_10x_dl'}
- ]
- },
- '20': {
- visualIndices: [
- {title: 'CEDD', indexID: 'contextvision100_20x_cedd'},
- {title: 'DL', indexID: 'contextvision100_20x_dl'}
- ]
- },
- '40': {
- visualIndices: [
- {title: 'CEDD', indexID: 'contextvision100_40x_cedd'},
- {title: 'DL', indexID: 'contextvision100_40x_dl'}
- ]
- }
- },
- captionIndex: null
- },
- dmli: {
- title: 'PubMed Central',
- visualIndices: [{title: 'CEDD', indexID: 'all-dmli-pubmed-urls-cedd'}],
- captionIndex: 'pubmedcentral-captions-2016-dmli'
- }
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/edit/edit.js b/desuto-retrieval/Desuto-retrievalinterface/js/edit/edit.js
deleted file mode 100755
index 95cfc42..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/edit/edit.js
+++ /dev/null
@@ -1,187 +0,0 @@
-/* Main functions
- * All main functions needed to this project
- */
-
-var caman;
-var throttledSettings = _.throttle(applySettings, 500);
-
-/* Function to extract parameters of an url */
-function getParameterByName(name) {
- name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
- var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
- results = regex.exec(location.search);
- return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
-}
-
-/* Function to add an image in a Canvas (used for the edition of an image) */
-function addImageOnCanvas(idCanvas) {
- caman = Caman('#' + idCanvas, function() {
- this.render();
- //Call the function to add the edition of the image with the mouse movement
- addClickCanvas();
- window.top.postMessage('image-loaded', '*');
- });
-}
-
-/* Function to add click event on the image to provide the possibility to change the image brightness & contrast with the mouse move */
-function addClickCanvas() {
- var startX;
- var startY;
- var endX;
- var endY;
- var differenceX;
- var differenceY;
- var differencePercentageX;
- var differencePercentageY;
- var positiveMaxValue = 100;
- var negativeMaxValue = -100;
- var brightnessValue;
- var contrastValue;
-
- $("#example").mousedown(function(event) {
-
- //Define coordinate of the start click
- var originalBrightnessValue = $("#sliderCaption1").text();
- var originalContrastValue = $("#sliderCaption2").text();
- startX = event.offsetX === undefined ? event.originalEvent.layerX : event.offsetX;
- startY = event.offsetY === undefined ? event.originalEvent.layerY : event.offsetY;
-
- var canvasWidth = $("#example").width();
- var canvasHeight = $("#example").height();
-
- var timeout;
- //Mouse move definition
- $("#example").on('mousemove', _.throttle(function(event2) {
- //Coordinates calculation when the mouse move
- endX = event2.offsetX === undefined ? event2.originalEvent.layerX : event2.offsetX;
- endY = event2.offsetY === undefined ? event2.originalEvent.layerY : event2.offsetY;
-
- //Calculate the difference between the start click coordinate and the mouse move coordinate
- differenceX = Math.round((coordinateDifference(startX, endX)));
- differenceY = -Math.round((coordinateDifference(startY, endY)));
-
- //Translate this into a percentage change based on the dimensions of the image
- differencePercentageX = Math.round( (differenceX / (canvasWidth / 2)) * 100 );
- differencePercentageY = Math.round( (differenceY / (canvasHeight / 2)) * 100 );
-
- brightnessValue = parseInt(originalBrightnessValue) + differencePercentageY;
- contrastValue = parseInt(originalContrastValue) + differencePercentageX;
-
- //Test if the contrastValue is bigger than 100 & smaller than -100
- if (contrastValue > positiveMaxValue) {
- contrastValue = positiveMaxValue;
- } else {
- if (contrastValue < negativeMaxValue) {
- contrastValue = negativeMaxValue;
- }
- }
- //Test if the brightnessValue is bigger than 100 & smaller than -100
- if (brightnessValue > positiveMaxValue) {
- brightnessValue = positiveMaxValue;
- } else {
- if (brightnessValue < negativeMaxValue) {
- brightnessValue = negativeMaxValue;
- }
- }
-
- //Change the value of the Brightness span
- $("#sliderCaption1").text(brightnessValue);
- //Change the value of Brightness slider
- $("#slider1").val(brightnessValue);
-
-
- //Change the value of the contrast slider
- $("#slider2").val(contrastValue);
- //Change the value of the contrast span
- $("#sliderCaption2").text(contrastValue);
-
- //Apply changes on the image
- caman.revert(false);
- caman.brightness(brightnessValue);
- caman.contrast(contrastValue);
- caman.render();
-
- $("#example").mouseup(function() {
- $("#example").unbind('mousemove');
- });
- }, 200));
-
- $("#example").mouseleave(function() {
- $("#example").unbind('mousemove');
- });
- });
-}
-
-/* Function to calculate the difference between two coordinate */
-function coordinateDifference(startCoord, coordAfterMove) {
- var difference = 0;
- difference = coordAfterMove - startCoord;
- return difference;
-}
-
-/* Function to update the image's Canvas according to sliders value */
-function updateCanvas() {
- settings = {};
-
- //Update settings variable
- updateSettings();
-
- //Bind oninput event to applying the Settings
- $("#Filters .FilterSetting input").on("change input", function() {
-
- var settingName, settingValue;
- settingName = $(this).data("filter");
- settingValue = $(this).val();
- settingValue = parseInt(settingValue);
- settings[settingName] = settingValue;
- $(this).find("~ .FilterValue").html(settingValue);
-
- throttledSettings();
- });
-
-}
-
-
-/* Apply slider value to image settings and render */
-function applySettings() {
-
- caman.revert(false);
-
- for (setting in settings) {
- caman[setting](settings[setting]);
- }
-
- caman.render(function(){
- /* Cancel any potential loader timeouts */
- //clearTimeout(showLoaderTimeout);
-
- /* Hide the overlay (if it is visible) */
- $("#editionOverlay").hide();
- });
-
-}
-
-/*Function to put all value of sliders to 0
- and to recover the original images */
-function reset() {
-
- //Reset filter values
- $("#Filters .FilterSetting input").val(0);
- $("#Filters .FilterSetting span").text(0);
-
- //Update settings variable
- updateSettings();
-
- //Apply settings
- applySettings();
-}
-
-function updateSettings() {
- settings = {};
-
- $(".FilterSetting input").each(function() {
- var settingName;
- settingName = $(this).data("filter");
- return settings[settingName] = $(this).val();
- });
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-davis.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main-davis.js
deleted file mode 100755
index 201bc46..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-davis.js
+++ /dev/null
@@ -1,249 +0,0 @@
-//Davis app configuration (routes, etc.)
-
-app = Davis(function() {
-
- this.configure(function() {
- this.raiseErrors = true;
- this.generateRequestOnPageLoad = true;
- this.linkSelector = 'a:not(.notdavis)';
- });
-
- //Default route
- this.get(prefix + '/', function() {
- restoreConfiguration();
- restoreCaptionQuery('');
- clearResults();
- });
-
- //Default route - just clear the results and fields
- this.get(prefix + '/index.html', function() {
- restoreConfiguration();
- restoreCaptionQuery('');
- clearResults();
- });
-
- //Empty search - just clear the results and fields
- this.get(prefix + '/caption/', function(req) {
- restoreConfiguration();
- restoreCaptionQuery('');
- clearResults();
- });
-
- //Search with caption only
- this.get(prefix + '/caption/:caption', function(req) {
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration();
- }
-
- //Restore caption field
- restoreCaptionQuery(req.params['caption']);
-
- //Remove images
- $("#relevant-images").empty();
- $("#irrelevant-images").empty();
- currentQueryImages = undefined;
-
- //Do the search
- performSearch();
- });
-
- //Search with caption and page
- this.get(prefix + '/caption/:caption/page/:page', function(req) {
-
- currentPage = req.params['page'];
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration();
- }
-
- //Restore caption field
- restoreCaptionQuery(req.params['caption']);
-
- //Remove images
- $("#relevant-images").empty();
- $("#irrelevant-images").empty();
- currentQueryImages = undefined;
-
- if (!appending) {
- //Do the search
- performSearch(req.params['page']);
- } else {
- //Get more results
- getMoreResults();
- appending = false;
- }
- });
-
- //Search with just images
- this.get(prefix + '/images/:images', function(req) {
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration();
- }
-
- //Restore images
- restoreQueryImages(req.params['images']);
-
- //Do the search
- performSearch();
- });
-
- //Search with just images and dataset
- this.get(prefix + '/images/:images/dataset/:dataset', function(req) {
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration(req.params['dataset']);
- }
-
- //Restore images
- restoreQueryImages(req.params['images']);
-
- //Do the search
- performSearch();
- });
-
- //Search with just images and dataset AND magnification
- this.get(prefix + '/images/:images/dataset/:dataset/magnification/:magnification', function(req) {
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration(req.params['dataset'], req.params['magnification']);
- }
-
- //Restore images
- restoreQueryImages(req.params['images']);
-
- //Do the search
- performSearch();
- });
-
- //Search with caption and page
- this.get(prefix + '/images/:images/page/:page', function(req) {
-
- currentPage = req.params['page'];
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration();
- }
-
- //Restore caption field
- restoreQueryImages(req.params['images']);
-
- //Remove images
- $("#relevant-images").empty();
- $("#irrelevant-images").empty();
-
- if (!appending) {
- //Do the search
- performSearch(req.params['page']);
- } else {
- //Get more results
- getMoreResults();
- appending = false;
- }
- });
-
- //Search with caption and images
- this.get(prefix + '/caption/:caption/images/:images', function(req) {
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration();
- }
-
- //Restore caption field
- restoreCaptionQuery(req.params['caption']);
-
- //Restore images
- restoreQueryImages(req.params['images']);
-
- //Do the search
- performSearch();
- });
-
- //Search with caption and images AND dataset
- this.get(prefix + '/caption/:caption/images/:images/dataset/:dataset', function(req) {
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration(req.params['dataset']);
- }
-
- //Restore caption field
- restoreCaptionQuery(req.params['caption']);
-
- //Restore images
- restoreQueryImages(req.params['images']);
-
- //Do the search
- performSearch();
- });
-
- //Search with caption and images AND dataset AND magnification
- this.get(prefix + '/caption/:caption/images/:images/dataset/:dataset/magnification/:magnification', function(req) {
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration(req.params['dataset'], req.params['magnification']);
- }
-
- //Restore caption field
- restoreCaptionQuery(req.params['caption']);
-
- //Restore images
- restoreQueryImages(req.params['images']);
-
- //Do the search
- performSearch();
- });
-
- //Search with caption and images AND page
- this.get(prefix + '/caption/:caption/images/:images/page/:page', function(req) {
-
- currentPage = req.params['page'];
-
- //Only required if we're loading the URL directly
- if (!navigating) {
- //Restore configuration
- restoreConfiguration();
- }
-
- //Restore caption field
- restoreCaptionQuery(req.params['caption']);
-
- //Restore images
- restoreQueryImages(req.params['images']);
-
- if (!appending) {
- //Do the search
- performSearch();
- } else {
- //Get more results
- getMoreResults();
- appending = false;
- }
-
- });
-
-});
-
-// the app will trigger an unsupported event if the current browser doesn't support pushState
-app.bind('unsupported', function() {
- console.log("the server better be able to do all this greeting and insulting cos the browser can't");
-});
-
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-events.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main-events.js
deleted file mode 100755
index b30593a..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-events.js
+++ /dev/null
@@ -1,110 +0,0 @@
-// Event handling
-
-/* Windows resize listener */
-$(window).on("throttledresize", function(event) {
- setResultsColumnWidth();
-});
-
-/* Message from iframe */
-$(window).on("message", function(event) {
- //Has an image finished loading ?
- if (event.originalEvent.data === "image-loaded")
- $.fancybox.update() //resize fancybox
-});
-
-/* Scrolling */
-$(window).on("scroll", function() {
- if (autoHideScroll && $(window).scrollTop() + $(window).height() > $(document).height() - 250) {
- //console.log("near bottom");
- toggleUpDown(true);
- autoHideScroll = false;
- }
-});
-
-/* Text change listener */
-var timeout;
-$('.caption-query, .expert-option').on('textchange', function(event) {
- clearTimeout(timeout);
- $(this).parent().find(".typing-text").html('typing...');
- var self = $(this);
- timeout = setTimeout(function() {
- self.parent().find(".typing-text").html("&nbsp;");
- //Perform search
- redirectToSearch();
- }, 1000);
-});
-
-/* Dataset change listener */
-$("#search-config").on('change', '#datasets input', function(event){
- // Restore deselect features
- $("#features input").prop('checked', false).checkboxradio('refresh');
-
- //Save configuration
- saveConfiguration('datasets');
-
- //Restore configuration
- restoreConfiguration();
-
- //Define search options
- defineSearchOptions();
-
- //Perform search
- redirectToSearch();
-});
-
-/* Magnifications change listener */
-$("#search-config").on('change', '#magnifications input', function(event) {
- //Save configuration
- saveConfiguration('magnifications');
-
- //Restore configuration
- restoreConfiguration();
-
- //Define search options
- defineSearchOptions();
-
- //Perform search
- redirectToSearch();
-});
-
-/* Features change listener */
-$("#search-config").on('change', '#features input', function(event) {
- //Save configuration
- saveConfiguration();
-
- //Restore configuration
- restoreConfiguration();
-
- //Define search options
- defineSearchOptions();
-
- //Perform search
- redirectToSearch();
-});
-
-/* Delete image listener */
-$(document).on("click", ".trash", function(event) {
- deleteImage($(event.target).closest("li"));
-});
-
-/* Toggle radlex enabled/disabled based on the use of image captions */
-$("#image-captions").click(function() {
- var enabled = $(this).is(":checked");
- if (!enabled)
- $("#radlex-terms").attr("disabled", "disabled");
- else
- $("#radlex-terms").removeAttr("disabled");
-});
-
-/* Animate bottom menu */
-$("#updown").click(function() {
- toggleUpDown()
-});
-
-/* Load more results */
-$("#load-more").click(function() {
- $(this).find("a").text("Loading...");
- currentPage++;
-
- redirectToSearch(true);
-});
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-config.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-config.js
deleted file mode 100755
index 8cdf7ff..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-config.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// Configuration-related functions to define variables etc.
-
-/* Get arrays of relevant & irrelevant images */
-function getQueryImages() {
-
- //Relevant
- var $relevantImages = [];
- $("#relevant-images li").each(function(i, item) {
- $relevantImages.push($(item).find("img").attr("src"));
- });
-
- //Irrelevant
- var $irrelevantImages = [];
- $("#irrelevant-images li").each(function(i, item) {
- $irrelevantImages.push($(item).find("img").attr("src"));
- });
-
- //Create output object
- var $output = {"relevantImages": $relevantImages, "irrelevantImages": $irrelevantImages};
-
- return $output;
-}
-
-/* Parse the caption query into a coherent Lucene query string */
-function getCaptionQuery() {
- var $relevantTerms = $("#relevant-caption").val().trim();
- var $irrelevantTerms = $("#irrelevant-caption").val().trim();
-
- var $query = "";
-
- //Only if we have something relevant
- if ($relevantTerms !== "") {
- $query = $query.concat("(", $relevantTerms, ")");
- if ($irrelevantTerms !== "") {
- $query = $query.concat("NOT(", $irrelevantTerms, ")");
- }
- }
-
- return $query;
-}
-
-/* Set all search options */
-function defineSearchOptions() {
-
- //Results
- maxResults = defaultMaxResults;
- resultsPerFeature = defaultResultsPerFeature;
- resultsPerPage = defaultResultsPerPage;
-
- //Get indices
- defineIndices();
-
- //Get image caption usage
- defineImageCaptions();
-
- //Get radlex terms usage
- defineRadlexTerms();
-}
-
-/* Set indices according to the selected radio button */
-function defineIndices() {
- $mode = $("input[type='radio'][name='radio-dataset']:checked").val();
- selectedIndices = $("#features input[type='checkbox']:checked");
-
- visualIndices = [];
-
- selectedIndices.each(function(index, visualIndex){
- visualIndices.push($(visualIndex).val());
- });
-
- //visualIndices = datasets[$mode].visualIndices;
- //visualIndices = [selectedIndex];
- captionIndex = datasets[$mode].captionIndex;
-
- console.log('Will search in visual : ' + visualIndices + ", caption : " + captionIndex);
-
- if(captionIndex === null){
- console.log('no caption');
- $("#text-box-relevant").hide();
- }else{
- $("#text-box-relevant").show();
- }
-
- // Resize query box
- $('#relevant-images').css('min-height', 'calc(100% - '+ $('#relevant-images').position().top + 'px)');
-
-}
-
-/* Set usage of image captions according to the check box */
-function defineImageCaptions() {
- useImageCaptions = $("#image-captions").is(":checked");
-}
-
-/* Set usage of radlex terms according to the check box */
-function defineRadlexTerms() {
- useRadlexTerms = $("#radlex-terms").is(":checked");
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-images.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-images.js
deleted file mode 100755
index 6b28fb6..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-images.js
+++ /dev/null
@@ -1,120 +0,0 @@
-//Image-related functions (insert images into container, etc.)
-
-/* Load an existing array of images into a container */
-function insertMasonry(images, destination, loader, callback) {
-
- //If the images are part of a group
- if (typeof (rel) === 'undefined' || !rel)
- rel = "";
-
- var newImages = getImageLIs(images);
-
- $(destination).append($(newImages).css("width", getResultsColumnWidth()));
-
- fancyBoxImages();
-
- //Wait for images to be loaded, then optionnally hide the loader and show the images
- imagesLoaded(newImages, function() {
- $(loader).fadeOut("fast", function() {
-
- setResultsColumnWidth();
- msnry = new Masonry(destination, {"itemSelector": "li"});
-
- $(destination).fadeTo("fast", 1).promise().then(function() {
- //Optional callback function
- if (typeof (callback) === 'function') {
- callback.call();
- }
- });
- });
- });
-}
-
-/* Append an existing array of images to a container */
-function appendMasonry(resultImages, destination) {
-
- var newImages = getImageLIs(resultImages);
-
- // size & hide new items while they are loading
- $columnWidth = getResultsColumnWidth();
- var $newElems = $(newImages).css({opacity: 0, width: $columnWidth});
- $(destination).append($newElems);
-
- // ensure that images load before adding to masonry layout
- imagesLoaded(newImages, function() {
- // show elems now they're ready
- $newElems.animate({opacity: 1});
-
- msnry.appended($newElems);
-
- makeImagesDraggableSortable();
-
- //if (resultImages.length === defaultResultsPerPage)
- $("#load-more").find("a").text("Load more results...");
- });
-}
-
-/* Layout search results */
-function makeMasonry() {
- var $container = document.querySelector('#results');
-
- var msnry = new Masonry($container, {
- itemSelector: 'li'
- });
-}
-
-/* Get image LI elements */
-function getImageLIs(images) {
-
- var newImages = [];
-
- var url;
-
- $.each(images, function(i, item) {
-
- //Transform image URL to the edition page URL
- var editURL = config.editPath + "?id=" + item.url;
-
- //Transform image URL to the viewer page URL
- var viewerURL = config.viewerPath + "?id=" + item.url + "&dataset=" + $("#datasets input[name='radio-dataset']:checked").val().replace(/[0-9]{1,3}[x]/i, '');
-
- if($("#datasets input[name='radio-dataset']:checked").val() == "dmli")
- url = editURL;
- else
- url = viewerURL;
-
- var newLi = $("<li/>").append($("<a/>").attr({href: url, title: item.caption, rel: rel})
- .addClass("fancybox.iframe fancybox").addClass("notdavis")
- .append($("<img/>").attr({src: item.url})
- .addClass(imageclass)));
- newImages.push($(newLi).get(0));
- });
-
- return newImages;
-}
-
-/* Apply fancyBox to images */
-function fancyBoxImages() {
- //Fancybox the links
- $(".fancybox").fancybox({
- fitToView: true,
- autoSize: true,
- arrows: false,
- scrolling: 'auto',
- maxHeight: 900,
- padding: 5,
- /*'width': 700,*/
- closeBtn: true,
- /*type: 'iframe',*/
- helpers: {
- overlay: {
- /*closeClick: false,*/
- locked: false,
- css: {'background': 'rgba(0,0,0,0.85)'}
- },
- title: {
- type: 'outside'
- }
- }
- });
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-search.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-search.js
deleted file mode 100755
index b71d593..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-search.js
+++ /dev/null
@@ -1,346 +0,0 @@
-//Search-related functions (perform search, redirect to search, etc.)
-
-/* Query Global Search Web Service */
-function performSearch(page, append) {
-
- /* Default values */
- if (typeof (page) === 'undefined')
- page = 0;
-
- if (typeof (append) === 'undefined')
- append = false;
-
- //Get search options
- defineSearchOptions();
-
- //Search variables
- var destination = "#results";
-
- //Empty results
- if (!append) {
- $(destination).fadeTo("fast", 0, function () {
- getSearchResults(destination, append, page);
- });
- } else {
- getSearchResults(destination, append, page);
- }
-
-}
-
-function getSearchResults(destination, append, page) {
- hideMessage();
-
- var relevantImages;
- var irrelevantImages;
-
- if (typeof currentQueryImages !== "undefined") {
- relevantImages = currentQueryImages.relevantImages;
- irrelevantImages = currentQueryImages.irrelevantImages;
- } else {
- relevantImages = getQueryImages().relevantImages;
- irrelevantImages = getQueryImages().irrelevantImages;
- }
-
- var caption = getCaptionQuery();
-
- //If not relevant images and no caption, just clear results
- if (relevantImages.length === 0 && caption === "") {
- $(destination).fadeOut("fast").promise();
- return;
- }
-
- //Search variables
- var loader = "#results-loader";
-
- //What should the callback be ?
- var callback = function (data_length) {
- makeImagesDraggableSortable();
- autoHideScroll = true;
-
- //Getting empty results or not enough results - hide load more
- if (typeof (data_length) === 'undefined' || data_length === 0 || data_length < defaultResultsPerPage) {
- toggleLoadMore('hide');
- } else {
- toggleLoadMore('show');
- }
- };
-
- //Append or perform a new search ?
- if (!append) {
- $(destination).empty();
-
- toggleLoadMore('hide');
- $("#load-more").promise().then(function () {
- $(window).scrollTop(0);
- if (msnry)
- msnry.layout();
- });
-
- //Show loader
- $(loader).fadeIn("fast");
- }
-
- //Check caption index
- var useCaptionSearch = captionIndex !== null
-
- // Check visual indices
- var useVisualSearch = visualIndices.length > 0;
-
- //Perform search and insert images
- $.getJSON(config.globalSearchURL, {
- "caption-indices": JSON.stringify([captionIndex]),
- "visual-indices": JSON.stringify(visualIndices),
- "caption-query": caption,
- "relevant-images": JSON.stringify(relevantImages),
- "irrelevant-images": JSON.stringify(irrelevantImages),
- "modality-filter": modalityFilter,
- "use-image-captions": useImageCaptions,
- "use-radlex-terms": useRadlexTerms,
- "caption-similarity": similarity,
- "maximum-results": maxResults,
- "results-per-feature": resultsPerFeature,
- "results-page": page,
- "results-per-page": resultsPerPage,
- "normalize-scores": "true",
- "caption-search": useCaptionSearch + '',
- "visual-search": useVisualSearch + ''
- }, function (data) {
-
- var results = data.results;
-
- if (typeof (results) !== 'undefined') {
- var data_length = results.length;
- var resultImages = getResultsArray(results);
- } else {
- resultImages = [];
- }
-
- var viewerImage = relevantImages.filter(function (image) {
- return image.includes('iipsrv.fcgi')
- })[0];
-
- if (typeof viewerImage !== "undefined") {
- resultImages = resultImages.filter(function (image) {
- var viewerQueryImage = simplifyURL(viewerImage);
- return !image.url.includes(viewerQueryImage);
- });
- }
-
- //Empty results - show message
- if (data_length === 0 || typeof (data_length) === 'undefined')
- showMessage('Sadly, no results were found for this query !');
-
- //Append or perform a new search ?
- if (!append) {
- insertMasonry(resultImages, destination, loader, function () {
- callback(data_length);
- });
- } else {
- appendMasonry(resultImages, destination);
- }
-
- // Make sure we can access the original request URL from any jqXHR objects
- $.ajaxPrefilter(function (options, originalOptions, jqXHR) {
- jqXHR.originalRequestOptions = originalOptions;
- });
-
- var imageColors = {};
- var j = 0;
- var color;
-
- if (currentQueryImages) {
- var originalImages = currentQueryImages.relevantImages.filter(function (value) {
- return !value.includes('/uploads/') && !value.includes('iipsrv.fcgi');
- });
-
- var colors = palette('cb-Dark2', originalImages.length);
-
- $("#relevant-images img").css('border', '4px solid transparent');
-
- // Should we highlight query images and their corresponding results?
- var highlight = false;
-
- if(simplifyURL(resultImages[0].url) !== null)
- highlight = true;
-
- //Check which are from the same image
- currentQueryImages.relevantImages.forEach(function (queryImage) {
-
- // Take only the image name
- var queryImageName = simplifyURL(queryImage);
-
- if(highlight === true) {
- // Define color
- if (queryImageName !== null && !queryImage.includes('/uploads/') && !queryImage.includes('iipsrv.fcgi')) {
- if (typeof imageColors[queryImageName] === "undefined") {
- color = colors[j++];
- imageColors[queryImageName] = color;
- } else {
- color = imageColors[queryImageName];
- }
-
- // Highlight query image
- $("#relevant-images img").filter(function () {
- var imageName = simplifyURL(this.src);
- return imageName.includes(queryImageName)
- }).css('border', '4px solid #' + color);
- }
- }
-
- for (var i = 0; i < resultImages.length; i++) {
- var patchURL = resultImages[i].url;
-
- var patchImageName = simplifyURL(patchURL);
-
- // Highlight results
- if (highlight === true && queryImage !== null && patchImageName.startsWith(queryImageName)) {
- $("#results li a img[src='" + patchURL + "']").css('border', '4px solid #' + color);
- }
-
- // Indicate Gleason grade
- var gleasonRegExp = /_color([0-9])_/g;
- var gleasonMatches = gleasonRegExp.exec(patchURL);
-
- if (gleasonMatches !== null) {
- var gleasonColor = parseInt(gleasonMatches[1]);
- var grade;
- var gradeClass = "gleason-grade-";
- switch (gleasonColor) {
- case 1:
- grade = "B";
- break;
- case 2:
- grade = "3";
- break;
- case 3:
- grade = "3-4";
- break;
- case 4:
- grade = "4";
- break;
- case 5:
- grade = "4-5";
- break;
- case 6:
- grade = "5";
- break;
- }
- gradeClass += grade;
-
- $("#results li a img[src='" + patchURL + "']").parent().parent().append($("<div>").addClass("gleason-grade").addClass(gradeClass).addClass("unselectable").text(grade));
- }
-
- // Indicate Gleason grade
- var gleasonRegExpNew = /_idx_([0-9]+)_/g;
- var gleasonMatchesNew = gleasonRegExpNew.exec(patchURL);
-
- if (gleasonMatchesNew != null) {
- var gleasonScore = parseInt(gleasonMatchesNew[1]);
- var grade;
- var gradeClass = "gleason-grade-";
- switch (gleasonScore) {
- case 0:
- grade = "B";
- break;
- case 80:
- grade = "3";
- break;
- case 120:
- grade = "4";
- break;
- case 160:
- grade = "5";
- break;
- }
- gradeClass += grade;
-
- $("#results li a img[src='" + patchURL + "']").parent().parent().append($("<div>").addClass("gleason-grade").addClass(gradeClass).addClass("unselectable").text(grade));
- }
-
- }
-
- });
- }
-
- //Problem contacting the server
- }).fail(function () {
- resultImages = [];
- data_length = 0;
- insertMasonry(resultImages, destination, loader, function () {
- callback(data_length);
- });
- showMessage('There seems to be a problem contacting the search service. Please try again at a later date !');
- });
-}
-
-function simplifyURL(url) {
-
- // Are we dealing with WSI patches?
- if (url.includes('idx') && url.includes('lvl') && url.includes('_x') && url.includes('_y')) {
-
- var url = url.substr(url.lastIndexOf('/') + 1);
-
- url = url.replace(/_[a-z]+_x[0-9]+_y[0-9]+/g, '');
- if (url.indexOf('&') !== -1)
- url = url.substr(0, url.indexOf('&'));
- if (url.indexOf('.') !== -1)
- url = url.substr(0, url.indexOf('.'));
-
- url = decodeURIComponent(url);
- } else {
- url = null;
- }
-
- return url;
-}
-
-function getMoreResults() {
- performSearch(currentPage, true);
-}
-
-/* Change URL based on the query (caption & images) */
-function redirectToSearch(append) {
-
- var caption = getCaptionQuery().trim();
- var relevantImages = getQueryImages().relevantImages;
-
- var captionPart = (caption !== "") ? '/caption/' + getCaptionQuery() : '';
- var imagePart = (relevantImages.length !== 0) ? '/images/' + encodeURIComponent(JSON.stringify(getQueryImages())) : '';
-
- var pagePart = (append) ? '/page/' + currentPage : '';
-
- if (!append) {
- currentPage = 0;
- } else {
- appending = true;
- }
-
- //Is there anything in the query ? Othewise go back to home page
- if (captionPart === "" && imagePart === "" && pagePart === "")
- Davis.location.assign(new Davis.Request(prefix + '/'));
- //There is something, perform search
- else {
- if (captionIndex !== null) {
- Davis.location.assign(new Davis.Request(prefix + captionPart + imagePart + pagePart));
- } else {
- if (imagePart === "" && pagePart === "")
- Davis.location.assign(new Davis.Request(prefix + '/'));
- else
- Davis.location.assign(new Davis.Request(prefix + imagePart + pagePart));
- }
- }
-
- /*if (caption !== "") {
- if (relevantImages.length !== 0) {
- Davis.location.assign(new Davis.Request(prefix + '/caption/' + getCaptionQuery() + "/images/" + encodeURIComponent(JSON.stringify(getQueryImages()))));
- } else {
- Davis.location.assign(new Davis.Request(prefix + '/caption/' + getCaptionQuery()));
- }
- } else {
- if (relevantImages.length !== 0) {
- Davis.location.assign(new Davis.Request(prefix + "/images/" + encodeURIComponent(JSON.stringify(getQueryImages()))));
- } else {
- Davis.location.assign(new Davis.Request(prefix + '/index.html'));
- }
- }*/
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-state.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-state.js
deleted file mode 100755
index e821dd9..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-state.js
+++ /dev/null
@@ -1,298 +0,0 @@
-// Functions related to saving / restoring the state of the application
-
-//Restore configuration of the search options
-function restoreConfiguration(dataset, magnification) {
-
- //Set navigation mode
- navigating = true;
-
- //Local Storage is supported
- if (typeof (Storage) !== "undefined") {
-
- // Check app version
- if (localStorage.appVersion !== config.appVersion)
- localStorage.clear();
-
- // Generate buttons
- generateDatasetButtons();
-
- // Dataset was given
- if (typeof dataset !== "undefined") {
- $("input[type='radio'][name='radio-dataset'][value='" + dataset + "']").prop('checked', true).checkboxradio('refresh');
- } else {
- //Values have been defined
- if (typeof (localStorage.dataset) !== "undefined") {
- $("#datasets input[type=radio]").prop('checked', false).checkboxradio('refresh');
- $("input[type='radio'][name='radio-dataset'][value='" + localStorage.dataset + "']").prop('checked', true).checkboxradio('refresh');
- } else {
- $("#datasets input[type=radio]").first().prop('checked', true).checkboxradio('refresh');
- }
- }
-
- // Generate Magnification slider
- generateMagnificationButtons();
-
- // Magnification was given
- var magnifications;
- if (typeof (localStorage.magnifications) !== "undefined") {
- magnifications = JSON.parse(localStorage.magnifications);
- }
-
- if (typeof magnification !== "undefined") {
- $("input#radio-magnification-" + magnification).prop('checked', true).checkboxradio('refresh');
- } else {
- if (typeof (localStorage.magnifications) !== "undefined") {
- if (typeof magnifications[localStorage.dataset] !== "undefined" && magnifications[localStorage.dataset] !== null) {
- $("#magnifications input[type='radio']").prop('checked', false).checkboxradio('refresh');
- $("input#radio-magnification-" + magnifications[localStorage.dataset]).prop('checked', true).checkboxradio('refresh');
- } else {
- $("#magnifications input[type='radio']").first().prop('checked', true).checkboxradio('refresh');
- }
-
- } else {
- $("#magnifications input[type='radio']").first().prop('checked', true).checkboxradio('refresh');
- }
- }
-
- // Check which features are checked
- var checkedFeatures = {};
-
- $("#features input[type='checkbox']").each(function (index, feature) {
- checkedFeatures[$(feature).parent().find('label[for=' + $(feature).attr('id') + ']').text().trim()] = $(feature).prop('checked');
- });
-
- // Generate features
- generateFeatureButtons();
-
- // If we have features defined in localStorage
- if (typeof (localStorage.features) !== "undefined") {
-
- var features = JSON.parse(localStorage.features);
-
- // If there are features defined for the currently selected dataset
- if (typeof features[localStorage.dataset] !== "undefined" && features[localStorage.dataset] !== null) {
- $("#features input[type='checkbox']").prop('checked', false).checkboxradio('refresh');
-
- // If we have magnifications stores in localStorage
- if (datasets[localStorage.dataset].magnifications) {
-
- // If we have features defined for the current magnification (just existence of the object)
- if (typeof features[localStorage.dataset][magnifications[localStorage.dataset] + ''] !== 'undefined') {
-
- // If we have actual data saved in the magnifications
- if (features[localStorage.dataset][magnifications[localStorage.dataset] + ''].length > 0) {
- features[localStorage.dataset][magnifications[localStorage.dataset] + ''].forEach(function (feature) {
- $("#features input[name=check-feature-" + feature + "]").prop('checked', true).checkboxradio('refresh');
- });
- } else {
- $("#features input[type='checkbox']").first().prop('checked', true).checkboxradio('refresh');
- }
-
- } else {
- selectDefaultFeatures(checkedFeatures);
- }
-
- } else {
- features[localStorage.dataset].forEach(function (feature) {
- $("#features input[name=check-feature-" + feature + "]").prop('checked', true).checkboxradio('refresh');
- });
- }
- } else {
- selectDefaultFeatures(checkedFeatures);
- }
-
- } else {
- selectDefaultFeatures(checkedFeatures);
- }
-
- saveConfiguration();
-
- } else {
- // Sorry! No web storage support..
- console.log('Web Storage is not supported!');
- }
-}
-
-function selectDefaultFeatures(checkedFeatures) {
-
- var allFalse = true;
- for (var key in checkedFeatures) {
- console.log(key + ' ' + checkedFeatures[key]);
- $('#features').find('label:contains("' + key + '")').next('input').prop('checked', checkedFeatures[key]).checkboxradio('refresh');
- if (checkedFeatures[key] === true) {
- allFalse = false;
- }
- }
-
- if (allFalse) {
- $("#features input[type='checkbox']").first().prop('checked', true).checkboxradio('refresh');
- }
-}
-
-//Save configuration of the search options in the localStorage
-function saveConfiguration(mode) {
-
- //Local Storage is supported
- if (typeof (Storage) !== "undefined") {
-
- // Version
- localStorage.appVersion = config.appVersion;
-
- // Dataset
- localStorage.dataset = $("input[type='radio'][name='radio-dataset']:checked").val();
-
- // Features
- var features = {};
- if (typeof localStorage.features !== "undefined") {
- features = JSON.parse(localStorage.features);
- }
-
- if (mode !== "datasets") {
- // Magnifications
- if (datasets[localStorage.dataset].magnifications) {
- var magnifications = {};
- if (typeof localStorage.magnifications !== "undefined") {
- magnifications = JSON.parse(localStorage.magnifications);
- }
- magnifications[localStorage.dataset] = $("input[type='radio'][name='radio-magnification']:checked").val();
- localStorage.magnifications = JSON.stringify(magnifications);
- }
- }
-
- if (mode !== "datasets" && mode !== "magnifications") {
- var newFeatures = false;
- if (typeof features[localStorage.dataset] === "undefined") {
- newFeatures = true;
- }
-
- if (datasets[localStorage.dataset].magnifications) {
- if (!features[localStorage.dataset])
- features[localStorage.dataset] = {};
- features[localStorage.dataset][magnifications[localStorage.dataset] + ''] = [];
-
- $("#features input[type='checkbox']:checked").each(function (index, visualIndex) {
- features[localStorage.dataset][magnifications[localStorage.dataset] + ''].push($(visualIndex).val());
- });
- } else {
- features[localStorage.dataset] = [];
- $("#features input[type='checkbox']:checked").each(function (index, visualIndex) {
- features[localStorage.dataset].push($(visualIndex).val());
- });
- }
-
- if (newFeatures && features[localStorage.dataset].length === 0)
- features[localStorage.dataset] = null;
-
- localStorage.features = JSON.stringify(features);
- }
- } else {
- // Sorry! No web storage support..
- console.log('Web Storage is not supported!');
- }
-}
-
-/* Parse the Lucene query string into relevant and irrelevant terms */
-function restoreCaptionQuery(caption) {
-
- //Restore caption field according to the given caption
- caption = decodeURIComponent(caption);
- var parts = caption.split(')NOT(');
- if (parts.length === 2) {
- var relevant = parts[0].substr(1);
- var irrelevant = parts[1].substring(0, parts[1].length - 1);
- $("#relevant-caption").val(relevant);
- $("#irrelevant-caption").val(irrelevant);
- } else {
- var start = (caption.substr(0, 1) === "(") ? 1 : 0;
- var end = (caption.substr(caption.length - 1, 1) === ")") ? (caption.length - 1) : (caption.length);
- var relevant = caption.substring(start, end);
- $("#relevant-caption").val(relevant);
- }
-
-}
-
-// Restore images to a container
-function restoreImages(url, info, destination) {
- //Is it an image from the dataset ? If so, add caption and modality info
- var imageTitle = "";
- if (typeof info.caption !== "undefined" && info.caption !== null && info.caption !== '') {
- imageTitle = info.caption + " § Modality : " + info.modality;
- } else {
- imageTitle = info.imageURL;
- }
-
- $("<li/>").append(
- ($('<a/>').attr("href", url).attr("class", "fancybox.image fancybox notdavis")).attr("title", imageTitle)
- .append($("<img/>").addClass("thumbnail").attr({src: info.imageURL}))
- )
- .append("<div class='overlay'></div><div class='trash'></div>")
- .appendTo(destination);
-}
-
-//Restore query images (left and right boxes)
-function restoreQueryImages(images) {
-
- $mode = $("input[type='radio'][name='radio-dataset']:checked").val();
-
- images = JSON.parse(decodeURIComponent(images));
-
- currentQueryImages = images;
-
- var relevantImages = images.relevantImages;
- var irrelevantImages = images.irrelevantImages;
-
- $("#relevant-images").empty();
- $("#irrelevant-images").empty();
-
- var dataset = $mode;
-
- var relevantXhr = $.post(config.imageInfosURL, {
- "dataset": dataset,
- "imageURLs": JSON.stringify(relevantImages)
- }, function (data, success, xhr) {
- });
- var irrelevantXhr = $.post(config.imageInfosURL, {
- "dataset": dataset,
- "imageURLs": JSON.stringify(irrelevantImages)
- }, function (data, success, xhr) {
- });
-
- //Get infos for the query images (both relevant and irrelevant)
- $.when(relevantXhr, irrelevantXhr).then(function (respRelevant, respIrrelevant) {
-
- //TODO - HERE MANAGE IF NOTHING IS FOUND (UPLODED IMAGES)
- //Relevant images
- if (typeof respRelevant[0] !== "undefined") {
- $.each(respRelevant[0], function (url, info) {
- if (info.caption !== "")
- restoreImages(url, info, $("#relevant-images"));
- else {
- info = new Object();
- info.imageURL = url;
- restoreImages(url, info, $("#relevant-images"));
- }
- });
-
- //Irrelevant images
- if (typeof respIrrelevant[0] !== "undefined")
- $.each(respIrrelevant[0], function (url, info) {
- if (info.caption !== "")
- restoreImages(url, info, $("#irrelevant-images"));
- });
- }else{
- restoreJustImages(relevantImages, '#relevant-images');
- restoreJustImages(irrelevantImages, '#irrelevant-images');
- }
- }, function (error) {
- restoreJustImages(relevantImages, '#relevant-images');
- restoreJustImages(irrelevantImages, '#irrelevant-images');
- });
-
- function restoreJustImages(images, destination){
- $.each(images, function (index, url) {
- info = new Object();
- info.imageURL = url;
- restoreImages(url, info, $(destination));
- });
- }
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-ui.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-ui.js
deleted file mode 100755
index 08e0acd..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-ui.js
+++ /dev/null
@@ -1,214 +0,0 @@
-// UI-related functions (show/hide elements, etc.)
-
-/* SHOWING MESSAGES */
-
-/* Show a message in the results sections (empty results, errors, etc..) */
-function showMessage(message) {
- $("#info-message").fadeIn('fast');
- $("#info-message").text(message);
-}
-
-/* Hide the message (when a new query is performed) */
-function hideMessage() {
- $("#info-message").fadeOut('fast');
-}
-
-/* TOGGLING */
-
-/* Toggle bottom menu visibility */
-function toggleUpDown(down) {
-
- bt = $("#bottom").css('margin-bottom') === '0px' ? '-220px' : '0px';
-
- if (typeof (down) === 'undefined' || (down && bt !== '0px')) {
- $("#bottom").animate({'margin-bottom': bt}, 300);
- if (bt === '0px') {
- angle = 0;
- animateTo = 180;
- } else {
- angle = 180;
- animateTo = 360;
- }
- $("#updown img").rotate({
- duration: 800,
- angle: angle,
- animateTo: animateTo
- });
- }
-}
-
-/* Hide or Show the overlay & trash icon */
-function toggleOverlayVisibility(event, ui) {
- $(ui.item).find(".overlay").toggleClass("hidden");
- $(ui.item).find(".trash").toggleClass("hidden");
-}
-
-/* Hide or Show the load more link */
-function toggleLoadMore(mode) {
- if (mode === "hide")
- $("#load-more").fadeOut(10);
- else
- $("#load-more").fadeIn(10);
-}
-
-/* Hide or show the expert mode box */
-function expertMode() {
- updateExpert();
- $("#expertmode-overlay").toggle('fast');
-}
-
-/* APPLYING BEHAVIORS TO CONTAINERS */
-
-/* Draggable images */
-function makeImagesDraggableSortable() {
- /* Left & Right are sortable */
- $(".image-container").sortable({containment: "document", scroll: false, revert: 200,
- start: function(event, ui) {
- toggleOverlayVisibility(event, ui);
- },
- stop: function(event, ui) {
- toggleOverlayVisibility(event, ui);
- }
- }).disableSelection();
-
- /* Bottom are just draggable */
- $("#query-images ul li").draggable({revert: "invalid", opacity: 0.8, helper: "clone"});
-
- /* Results are draggable as well */
- $("#results li").draggable({scroll: false, revert: "invalid", opacity: 0.8, helper: "clone"});
-
- /* Uploaded images are draggable too */
- $("#dropzone .dz-details img").draggable({revert: "invalid", opacity: 0.8, helper: "clone"});
-
- /* Change containment option for left & right */
- $("#relevant-images").sortable("option", "containment", "#left");
- $("#irrelevant-images").sortable("option", "containment", "#right");
-}
-
-/* Droppable query boxes */
-function makeQueryBoxesDroppable() {
-
- $("#relevant-images").droppable({
- accept: "#query-images li, #results li, #dropzone img",
- activeClass: "box-active",
- hoverClass: "box-hover",
- drop: function(event, ui) {
-
- var link, image;
-
- //Modify link
- link = $(ui.helper).find("a");
- //Handle differently if the element is just an image (from uploads, for example)
- if (ui.helper.is('img'))
- image = ui.helper;
- else
- image = $(ui.helper).find("img");
-
- dropImage(link, image, event.target);
- }
- });
-
-}
-
-/* Drop an image in one of the containers */
-function dropImage(link, image, target) {
-
- var content;
-
- //Modifiy link
- link.removeAttr('rel');
-
- //Modify image
- image.removeAttr("data-dz-thumbnail");
- image.removeAttr('class');
- image.removeAttr('style');
- image.addClass('thumbnail');
-
- //Handle differently if the element is just an image (from uploads, for example)
- //TODO - Handle thumbnails from uploads
- if (image.is('img'))
- content = $('<a/>').attr("href", image.attr("src")).attr("class", "fancybox.image fancybox").append(image).outerHTML();
- else {
-
- //Remove image editing for query images on the side (for consistency)
- link.removeClass('fancybox.iframe');
- link.addClass('fancybox.image');
- link.attr('href', image.attr('src'));
-
- content = $(image).html();
- }
-
- //Construct new element to add in the list
- newLiSimple = $("<li>" + content + "<div class='overlay'></div><div class='trash'></div></li>");
-
- //TODO : REMOVE
- //$(ui.draggable).remove();
-
- //Add it to the list
- $ul = $(target);//.find(".image-container");
- $ul.append(newLiSimple);
- $ul.sortable("refresh");
-
- //Perform search
- redirectToSearch();
-}
-
-/* Remove an image from one of the containers */
-function deleteImage(li){
- li.fadeOut("fast", function() {
- $(this).remove();
- //Perform search
- redirectToSearch();
- });
-}
-
-
-/* CONFIGURE SIZES */
-
-/* Set the width of the results column based on the size of the container */
-function setResultsColumnWidth() {
- $("#results li").css("width", getResultsColumnWidth());
-}
-
-/* Calculate the width of the results column based on the size of the container */
-function getResultsColumnWidth() {
- $container = $("#results");
- $containerWidth = parseFloat($container.css("width"));
- $columnWidth = "";
-
- //Set number of columns depending on the width of the results DIV
-
- //<=500px : 2 columns
- if ($containerWidth <= 500)
- $columnWidth = "49.8%";
- //<= 700px : 3 columns
- else if ($containerWidth <= 700)
- $columnWidth = "32.8%";
- //<=900px : 4 columns
- else if ($containerWidth <= 900)
- $columnWidth = "24.8%";
- //>900px : 5 columns
- else if ($containerWidth <= 1200)
- $columnWidth = "19.8%";
- //>1200px : 5 columns
- else
- $columnWidth = "16.5%";
-
- return $columnWidth;
-}
-
-/* MISC */
-
-/* Clear out the results section of the page */
-function clearResults() {
- var destination = "#results";
- $(destination).fadeOut("fast").promise();
- toggleLoadMore('hide');
- hideMessage();
-}
-
-/* Update Expert options */
-function updateExpert() {
- defineIndices(true);
- $("#caption-index").val(captionIndex);
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-utils.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-utils.js
deleted file mode 100755
index 800ca7d..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main-functions-utils.js
+++ /dev/null
@@ -1,45 +0,0 @@
-// Utility functions for working with arrays, etc.
-
-/* Fill results array for display */
-function getResultsArray(results) {
- var resultImages = [];
-
- var data_length = results.length;
-
- for (var i = 0; i < data_length; i++) {
-
- // If caption and modality are unknown, show score instead
- if(results[i]["caption"] === "UNKNOWN" || results[i]["modality"] === "UNKNOWN"){
- resultImages.push({"url": results[i]["imageURL"], "caption": "Score : " + results[i]["score"]});
- }else{
- resultImages.push({"url": results[i]["imageURL"], "caption": results[i]["caption"] + " § Modality : " + results[i]["modality"]});
- }
- }
-
- return resultImages;
-}
-
-/* Convert a list of image URLs to imageIDs (no http... and no extension) */
-function convertURLsToIDs(urls) {
- var ids = []
- $.each(urls, function(index, url) {
- ids.push(url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf(".")));
- });
-
- return ids;
-}
-
-/* Get images that don't belong to a dataset and remove them from the collection */
-function getUploaded(urls, ids){
- var uploaded = [];
- $.each(urls, function(index, url) {
- if(url.indexOf("uploads") !== -1)
- uploaded.push(url);
- });
-
- $.each(uploaded, function(index, url){
- ids.splice($.inArray(url, ids),1);
- });
-
- return uploaded;
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/main/main.js b/desuto-retrieval/Desuto-retrievalinterface/js/main/main.js
deleted file mode 100755
index 02cd998..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/main/main.js
+++ /dev/null
@@ -1,174 +0,0 @@
-//Main JS file, with global variables and $(document).ready instructions
-
-//MASONRY
-var msnry;
-
-//DATASETS
-var datasets = config.datasets;
-
-//SEARCH OPTIONS
-var captionIndex = '';
-var visualIndices = [];
-var modalityFilter = 'NONE';
-var useImageCaptions = false;
-var useRadlexTerms = false;
-var defaultMaxResults = 1000;
-var defaultResultsPerFeature = 1000;
-var defaultResultsPerPage = 100;
-var currentPage = 0;
-var defaultPage = 0;
-var similarity = 'tfidf';
-var numberOfExamples = 6;
-
-//DOM VALUES
-var imageclass = "big";
-var rel = "results";
-
-//DEFAULTS
-var prefix = config.prefix;
-var currentQueryImages;
-
-//STATE VARIABLES
-var autoHideScroll = true;
-var navigating = false;
-var appending = false;
-
-/* Document ready */
-$(function() {
-
- /* Hotkeys */
- $(document).bind('keydown', 'ctrl+shift+x', expertMode);
-
- //Start Davis app
- app.start();
-
- //Initialize containers
- makeQueryBoxesDroppable();
-
- //Dropzone for uploading files
- $('#relevant-images').dropzone({
- url: config.uploadURL,
- acceptedFiles: 'image/*',
- dictDefaultMessage:"Drop here",
- clickable:false,
- thumbnailHeight:null,
- dragenter: function(event){
- $("#left").addClass("box-hover");
- },
- dragleave: function(event){
- $("#left").removeClass("box-hover");
- },
- previewTemplate: document.getElementById('preview-template').innerHTML});
-
- var dz = Dropzone.forElement('#relevant-images');
-
- dz.on("addedfile", function(file) {
- console.log(file);
- $("#left").removeClass("box-hover");
- });
-
- //Successful upload (gets server response with the URL)
- dz.on("success", function(file, response, event) {
- //console.log(JSON.stringify(response));
-
- //Change from data URL to real URL (gotten from server)
- $(file.previewElement).find("img[data-dz-thumbnail]").attr("src", response.url);
-
- makeImagesDraggableSortable();
-
- redirectToSearch();
- });
-
- //Restore configuration
- restoreConfiguration();
-
- //Get search options
- defineSearchOptions();
-});
-
-function generateDatasetButtons(){
-
- $("#datasets").empty();
-
- // Generate Buttons
- var i = 0;
- Object.keys(datasets).forEach(function(key){
- var $label = $("<label>").attr("for", "radio-dataset-" + key).text(datasets[key].title);
- var $radio = $("<input>").attr("type", "radio")
- .attr("name", "radio-dataset")
- .attr("id", "radio-dataset-" + key)
- .attr("value", key);
-
- $("#datasets").append($label);
- $("#datasets").append($radio);
- });
-
- // Buttons
- $("input[name='radio-dataset']").checkboxradio();
-}
-
-function generateMagnificationButtons(){
-
- $("#magnifications").empty();
-
- // Generate Buttons
- var dataset = $("#datasets input[name='radio-dataset']:checked").val();
- var i = 0;
-
- if(datasets[dataset].magnifications){
- $("#select-magnification").show();
- Object.keys(datasets[dataset].magnifications).forEach(function(key){
- var $label = $("<label>").attr("for", "radio-magnification-" + key).text(key + 'X');
- var $radio = $("<input>").attr("type", "radio")
- .attr("name", "radio-magnification")
- .attr("id", "radio-magnification-" + key)
- .attr("value", key);
-
- $("#magnifications").append($label);
- $("#magnifications").append($radio);
- });
- }else{
- $("#select-magnification").hide();
- }
-
- // Buttons
- $("input[name='radio-magnification']").checkboxradio();
-}
-
-function generateFeatureButtons() {
-
- // Generate Buttons
- var dataset = $("#datasets input[name='radio-dataset']:checked").val();
-
- if(dataset){
- $("#features").empty();
-
- if(datasets[dataset].magnifications){
- var magnification = $("#magnifications input[name='radio-magnification']:checked").val();
-
- datasets[dataset].magnifications[magnification].visualIndices.forEach(function(visualIndex, i){
- var $label = $("<label>").attr("for", "check-" + visualIndex.indexID).text(visualIndex.title);
- var $check = $("<input>").attr("type", "checkbox")
- .attr("name", "check-feature-" + visualIndex.indexID)
- .attr("id", "check-" + visualIndex.indexID)
- .attr("value", visualIndex.indexID);
-
- $("#features").append($label);
- $("#features").append($check);
- });
- }else{
- datasets[dataset].visualIndices.forEach(function(visualIndex, i){
- var $label = $("<label>").attr("for", "check-" + visualIndex.indexID).text(visualIndex.title);
- var $check = $("<input>").attr("type", "checkbox")
- .attr("name", "check-feature-" + visualIndex.indexID)
- .attr("id", "check-" + visualIndex.indexID)
- .attr("value", visualIndex.indexID);
-
- $("#features").append($label);
- $("#features").append($check);
- });
- }
-
- $("input[type='checkbox']").checkboxradio();
- }
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/caman-adapters/jquery.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/caman-adapters/jquery.js
deleted file mode 100755
index f3201aa..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/caman-adapters/jquery.js
+++ /dev/null
@@ -1,8981 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.6.2
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Jun 30 14:16:56 2011 -0400
- */
-(function( window, undefined ) {
-
-// Use the correct document accordingly with window argument (sandbox)
-var document = window.document,
- navigator = window.navigator,
- location = window.location;
-var jQuery = (function() {
-
-// Define a local copy of jQuery
-var jQuery = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // A simple way to check for HTML strings or ID strings
- // (both of which we optimize for)
- quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Check if a string has a non-whitespace character in it
- rnotwhite = /\S/,
-
- // Used for trimming whitespace
- trimLeft = /^\s+/,
- trimRight = /\s+$/,
-
- // Check for digits
- rdigit = /\d/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
- // Useragent RegExp
- rwebkit = /(webkit)[ \/]([\w.]+)/,
- ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
- rmsie = /(msie) ([\w.]+)/,
- rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
- // Matches dashed string for camelizing
- rdashAlpha = /-([a-z])/ig,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return letter.toUpperCase();
- },
-
- // Keep a UserAgent string for use with jQuery.browser
- userAgent = navigator.userAgent,
-
- // For matching the engine and version of the browser
- browserMatch,
-
- // The deferred used on DOM ready
- readyList,
-
- // The ready event handler
- DOMContentLoaded,
-
- // Save a reference to some core methods
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty,
- push = Array.prototype.push,
- slice = Array.prototype.slice,
- trim = String.prototype.trim,
- indexOf = Array.prototype.indexOf,
-
- // [[Class]] -> type pairs
- class2type = {};
-
-jQuery.fn = jQuery.prototype = {
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), or $(undefined)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // The body element only exists once, optimize finding it
- if ( selector === "body" && !context && document.body ) {
- this.context = document;
- this[0] = document.body;
- this.selector = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- // Are we dealing with HTML string or an ID?
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = quickExpr.exec( selector );
- }
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = (context ? context.ownerDocument || context : document);
-
- // If a single string is passed in and it's a single tag
- // just do a createElement and skip the rest
- ret = rsingleTag.exec( selector );
-
- if ( ret ) {
- if ( jQuery.isPlainObject( context ) ) {
- selector = [ document.createElement( ret[1] ) ];
- jQuery.fn.attr.call( selector, context, true );
-
- } else {
- selector = [ doc.createElement( ret[1] ) ];
- }
-
- } else {
- ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $("#id")
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return (context || rootjQuery).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if (selector.selector !== undefined) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector: "",
-
- // The current version of jQuery being used
- jquery: "1.6.2",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- toArray: function() {
- return slice.call( this, 0 );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
- // Build a new jQuery matched element set
- var ret = this.constructor();
-
- if ( jQuery.isArray( elems ) ) {
- push.apply( ret, elems );
-
- } else {
- jQuery.merge( ret, elems );
- }
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + (this.selector ? " " : "") + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready: function( fn ) {
- // Attach the listeners
- jQuery.bindReady();
-
- // Add the callback
- readyList.done( fn );
-
- return this;
- },
-
- eq: function( i ) {
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, +i + 1 );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ),
- "slice", slice.call(arguments).join(",") );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
- end: function() {
- return this.prevObject || this.constructor(null);
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: [].sort,
- splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // 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" && !jQuery.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
- if ( (options = arguments[ i ]) != null ) {
- // 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 && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend({
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
- // Either a released hold or an DOMready/load event and not yet ready
- if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger( "ready" ).unbind( "ready" );
- }
- }
- },
-
- bindReady: function() {
- if ( readyList ) {
- return;
- }
-
- readyList = jQuery._Deferred();
-
- // Catch cases where $(document).ready() is called after the
- // browser event has already occurred.
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var toplevel = false;
-
- try {
- toplevel = window.frameElement == null;
- } catch(e) {}
-
- if ( document.documentElement.doScroll && toplevel ) {
- doScrollCheck();
- }
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type(obj) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
-
- // A crude way of determining if an object is a window
- isWindow: function( obj ) {
- return obj && typeof obj === "object" && "setInterval" in obj;
- },
-
- isNaN: function( obj ) {
- return obj == null || !rdigit.test( obj ) || isNaN( obj );
- },
-
- type: function( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ toString.call(obj) ] || "object";
- },
-
- 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 || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.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 );
- },
-
- isEmptyObject: function( obj ) {
- for ( var name in obj ) {
- return false;
- }
- return true;
- },
-
- error: function( msg ) {
- throw msg;
- },
-
- parseJSON: function( data ) {
- if ( typeof data !== "string" || !data ) {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return (new Function( "return " + data ))();
-
- }
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- // (xml & tmp used internally)
- parseXML: function( data , xml , tmp ) {
-
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
-
- tmp = xml.documentElement;
-
- if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
- jQuery.error( "Invalid XML: " + data );
- }
-
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && rnotwhite.test( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- // Converts a dashed string to camelCased string;
- // Used by both the css and data modules
- camelCase: function( string ) {
- return string.replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
- },
-
- // args is for internal usage only
- each: function( object, callback, args ) {
- var name, i = 0,
- length = object.length,
- isObj = length === undefined || jQuery.isFunction( object );
-
- if ( args ) {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.apply( object[ name ], args ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.apply( object[ i++ ], args ) === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return object;
- },
-
- // Use native String.trim function wherever possible
- trim: trim ?
- function( text ) {
- return text == null ?
- "" :
- trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
- },
-
- // results is for internal usage only
- makeArray: function( array, results ) {
- var ret = results || [];
-
- if ( array != null ) {
- // The window, strings (and functions) also have 'length'
- // The extra typeof function check is to prevent crashes
- // in Safari 2 (See: #3039)
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- var type = jQuery.type( array );
-
- if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
- push.call( ret, array );
- } else {
- jQuery.merge( ret, array );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, array ) {
-
- if ( indexOf ) {
- return indexOf.call( array, elem );
- }
-
- for ( var i = 0, length = array.length; i < length; i++ ) {
- if ( array[ i ] === elem ) {
- return i;
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var i = first.length,
- j = 0;
-
- if ( typeof second.length === "number" ) {
- for ( var l = second.length; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, inv ) {
- var ret = [], retVal;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var value, key, ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- if ( typeof context === "string" ) {
- var tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- var args = slice.call( arguments, 2 ),
- proxy = function() {
- return fn.apply( context, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Mutifunctional method to get and set values to a collection
- // The value/s can optionally be executed if it's a function
- access: function( elems, key, value, exec, fn, pass ) {
- var length = elems.length;
-
- // Setting many attributes
- if ( typeof key === "object" ) {
- for ( var k in key ) {
- jQuery.access( elems, k, key[k], exec, fn, value );
- }
- return elems;
- }
-
- // Setting one attribute
- if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = !pass && exec && jQuery.isFunction(value);
-
- for ( var i = 0; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
-
- return elems;
- }
-
- // Getting an attribute
- return length ? fn( elems[0], key ) : undefined;
- },
-
- now: function() {
- return (new Date()).getTime();
- },
-
- // Use of jQuery.browser is frowned upon.
- // More details: http://docs.jquery.com/Utilities/jQuery.browser
- uaMatch: function( ua ) {
- ua = ua.toLowerCase();
-
- var match = rwebkit.exec( ua ) ||
- ropera.exec( ua ) ||
- rmsie.exec( ua ) ||
- ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
- [];
-
- return { browser: match[1] || "", version: match[2] || "0" };
- },
-
- sub: function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- return jQuerySub;
- },
-
- browser: {}
-});
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
- jQuery.browser[ browserMatch.browser ] = true;
- jQuery.browser.version = browserMatch.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
- jQuery.browser.safari = true;
-}
-
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
- trimLeft = /^[\s\xA0]+/;
- trimRight = /[\s\xA0]+$/;
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
- DOMContentLoaded = function() {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- };
-
-} else if ( document.attachEvent ) {
- DOMContentLoaded = function() {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- };
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
- if ( jQuery.isReady ) {
- return;
- }
-
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch(e) {
- setTimeout( doScrollCheck, 1 );
- return;
- }
-
- // and execute any waiting functions
- jQuery.ready();
-}
-
-return jQuery;
-
-})();
-
-
-var // Promise methods
- promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
- // Static reference to slice
- sliceDeferred = [].slice;
-
-jQuery.extend({
- // Create a simple deferred (one callbacks list)
- _Deferred: function() {
- var // callbacks list
- callbacks = [],
- // stored [ context , args ]
- fired,
- // to avoid firing when already doing so
- firing,
- // flag to know if the deferred has been cancelled
- cancelled,
- // the deferred itself
- deferred = {
-
- // done( f1, f2, ...)
- done: function() {
- if ( !cancelled ) {
- var args = arguments,
- i,
- length,
- elem,
- type,
- _fired;
- if ( fired ) {
- _fired = fired;
- fired = 0;
- }
- for ( i = 0, length = args.length; i < length; i++ ) {
- elem = args[ i ];
- type = jQuery.type( elem );
- if ( type === "array" ) {
- deferred.done.apply( deferred, elem );
- } else if ( type === "function" ) {
- callbacks.push( elem );
- }
- }
- if ( _fired ) {
- deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
- }
- }
- return this;
- },
-
- // resolve with given context and args
- resolveWith: function( context, args ) {
- if ( !cancelled && !fired && !firing ) {
- // make sure args are available (#8421)
- args = args || [];
- firing = 1;
- try {
- while( callbacks[ 0 ] ) {
- callbacks.shift().apply( context, args );
- }
- }
- finally {
- fired = [ context, args ];
- firing = 0;
- }
- }
- return this;
- },
-
- // resolve with this as context and given arguments
- resolve: function() {
- deferred.resolveWith( this, arguments );
- return this;
- },
-
- // Has this deferred been resolved?
- isResolved: function() {
- return !!( firing || fired );
- },
-
- // Cancel
- cancel: function() {
- cancelled = 1;
- callbacks = [];
- return this;
- }
- };
-
- return deferred;
- },
-
- // Full fledged deferred (two callbacks list)
- Deferred: function( func ) {
- var deferred = jQuery._Deferred(),
- failDeferred = jQuery._Deferred(),
- promise;
- // Add errorDeferred methods, then and promise
- jQuery.extend( deferred, {
- then: function( doneCallbacks, failCallbacks ) {
- deferred.done( doneCallbacks ).fail( failCallbacks );
- return this;
- },
- always: function() {
- return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
- },
- fail: failDeferred.done,
- rejectWith: failDeferred.resolveWith,
- reject: failDeferred.resolve,
- isRejected: failDeferred.isResolved,
- pipe: function( fnDone, fnFail ) {
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( {
- done: [ fnDone, "resolve" ],
- fail: [ fnFail, "reject" ]
- }, function( handler, data ) {
- var fn = data[ 0 ],
- action = data[ 1 ],
- returned;
- if ( jQuery.isFunction( fn ) ) {
- deferred[ handler ](function() {
- returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise().then( newDefer.resolve, newDefer.reject );
- } else {
- newDefer[ action ]( returned );
- }
- });
- } else {
- deferred[ handler ]( newDefer[ action ] );
- }
- });
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- if ( obj == null ) {
- if ( promise ) {
- return promise;
- }
- promise = obj = {};
- }
- var i = promiseMethods.length;
- while( i-- ) {
- obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
- }
- return obj;
- }
- });
- // Make sure only one callback list will be used
- deferred.done( failDeferred.cancel ).fail( deferred.cancel );
- // Unexpose cancel
- delete deferred.cancel;
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
- return deferred;
- },
-
- // Deferred helper
- when: function( firstParam ) {
- var args = arguments,
- i = 0,
- length = args.length,
- count = length,
- deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
- firstParam :
- jQuery.Deferred();
- function resolveFunc( i ) {
- return function( value ) {
- args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- if ( !( --count ) ) {
- // Strange bug in FF4:
- // Values changed onto the arguments object sometimes end up as undefined values
- // outside the $.when method. Cloning the object into a fresh array solves the issue
- deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
- }
- };
- }
- if ( length > 1 ) {
- for( ; i < length; i++ ) {
- if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
- args[ i ].promise().then( resolveFunc(i), deferred.reject );
- } else {
- --count;
- }
- }
- if ( !count ) {
- deferred.resolveWith( deferred, args );
- }
- } else if ( deferred !== firstParam ) {
- deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
- }
- return deferred.promise();
- }
-});
-
-
-
-jQuery.support = (function() {
-
- var div = document.createElement( "div" ),
- documentElement = document.documentElement,
- all,
- a,
- select,
- opt,
- input,
- marginDiv,
- support,
- fragment,
- body,
- testElementParent,
- testElement,
- testElementStyle,
- tds,
- events,
- eventName,
- i,
- isSupported;
-
- // Preliminary tests
- div.setAttribute("className", "t");
- div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-
- all = div.getElementsByTagName( "*" );
- a = div.getElementsByTagName( "a" )[ 0 ];
-
- // Can't get basic test support
- if ( !all || !all.length || !a ) {
- return {};
- }
-
- // First batch of supports tests
- select = document.createElement( "select" );
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName( "input" )[ 0 ];
-
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName( "tbody" ).length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName( "link" ).length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style: /top/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.55$/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn: ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected: opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute: div.className !== "t",
-
- // Will be defined later
- submitBubbles: true,
- changeBubbles: true,
- focusinBubbles: false,
- deleteExpando: true,
- noCloneEvent: true,
- inlineBlockNeedsLayout: false,
- shrinkWrapBlocks: false,
- reliableMarginRight: true
- };
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
- }
-
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", function() {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- });
- div.cloneNode( true ).fireEvent( "onclick" );
- }
-
- // Check if a radio maintains it's value
- // after being appended to the DOM
- input = document.createElement("input");
- input.value = "t";
- input.setAttribute("type", "radio");
- support.radioValue = input.value === "t";
-
- input.setAttribute("checked", "checked");
- div.appendChild( input );
- fragment = document.createDocumentFragment();
- fragment.appendChild( div.firstChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- div.innerHTML = "";
-
- // Figure out if the W3C box model works as expected
- div.style.width = div.style.paddingLeft = "1px";
-
- body = document.getElementsByTagName( "body" )[ 0 ];
- // We use our own, invisible, body unless the body is already present
- // in which case we use a div (#9239)
- testElement = document.createElement( body ? "div" : "body" );
- testElementStyle = {
- visibility: "hidden",
- width: 0,
- height: 0,
- border: 0,
- margin: 0
- };
- if ( body ) {
- jQuery.extend( testElementStyle, {
- position: "absolute",
- left: -1000,
- top: -1000
- });
- }
- for ( i in testElementStyle ) {
- testElement.style[ i ] = testElementStyle[ i ];
- }
- testElement.appendChild( div );
- testElementParent = body || documentElement;
- testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- support.boxModel = div.offsetWidth === 2;
-
- if ( "zoom" in div.style ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.style.display = "inline";
- div.style.zoom = 1;
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "";
- div.innerHTML = "<div style='width:4px;'></div>";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
- }
-
- div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
- tds = div.getElementsByTagName( "td" );
-
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE < 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
- div.innerHTML = "";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- if ( document.defaultView && document.defaultView.getComputedStyle ) {
- marginDiv = document.createElement( "div" );
- marginDiv.style.width = "0";
- marginDiv.style.marginRight = "0";
- div.appendChild( marginDiv );
- support.reliableMarginRight =
- ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
- }
-
- // Remove the body element we added
- testElement.innerHTML = "";
- testElementParent.removeChild( testElement );
-
- // Technique from Juriy Zaytsev
- // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
- if ( div.attachEvent ) {
- for( i in {
- submit: 1,
- change: 1,
- focusin: 1
- } ) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
- }
-
- // Null connected elements to avoid leaks in IE
- testElement = fragment = select = opt = body = marginDiv = div = input = null;
-
- return support;
-})();
-
-// Keep track of boxModel
-jQuery.boxModel = jQuery.support.boxModel;
-
-
-
-
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
- rmultiDash = /([a-z])([A-Z])/g;
-
-jQuery.extend({
- cache: {},
-
- // Please use with caution
- uuid: 0,
-
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet": true
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ jQuery.expando ] = id = ++jQuery.uuid;
- } else {
- id = jQuery.expando;
- }
- }
-
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
- // metadata on plain JS objects when the object is serialized using
- // JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
- } else {
- cache[ id ] = jQuery.extend(cache[ id ], name);
- }
- }
-
- thisCache = cache[ id ];
-
- // Internal jQuery data is stored in a separate object inside the object's data
- // cache in order to avoid key collisions between internal data and user-defined
- // data
- if ( pvt ) {
- if ( !thisCache[ internalKey ] ) {
- thisCache[ internalKey ] = {};
- }
-
- thisCache = thisCache[ internalKey ];
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
- // not attempt to inspect the internal events object using jQuery.data, as this
- // internal data object is undocumented and subject to change.
- if ( name === "events" && !thisCache[name] ) {
- return thisCache[ internalKey ] && thisCache[ internalKey ].events;
- }
-
- return getByName ?
- // Check for both converted-to-camel and non-converted data property names
- thisCache[ jQuery.camelCase( name ) ] || thisCache[ name ] :
- thisCache;
- },
-
- removeData: function( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var internalKey = jQuery.expando, isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
-
- // See jQuery.data for more information
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
- var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
-
- if ( thisCache ) {
- delete thisCache[ name ];
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !isEmptyDataObject(thisCache) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( pvt ) {
- delete cache[ id ][ internalKey ];
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject(cache[ id ]) ) {
- return;
- }
- }
-
- var internalCache = cache[ id ][ internalKey ];
-
- // Browsers that fail expando deletion also refuse to delete expandos on
- // the window, but it will allow it on all other JS objects; other browsers
- // don't care
- if ( jQuery.support.deleteExpando || cache != window ) {
- delete cache[ id ];
- } else {
- cache[ id ] = null;
- }
-
- // We destroyed the entire user cache at once because it's faster than
- // iterating through each key, but we need to continue to persist internal
- // data if it existed
- if ( internalCache ) {
- cache[ id ] = {};
- // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
- // metadata on plain JS objects when the object is serialized using
- // JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
-
- cache[ id ][ internalKey ] = internalCache;
-
- // Otherwise, we need to eliminate the expando on the node to avoid
- // false lookups in the cache for entries that no longer exist
- } else if ( isNode ) {
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( jQuery.support.deleteExpando ) {
- delete elem[ jQuery.expando ];
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( jQuery.expando );
- } else {
- elem[ jQuery.expando ] = null;
- }
- }
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- if ( elem.nodeName ) {
- var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- if ( match ) {
- return !(match === true || elem.getAttribute("classid") !== match);
- }
- }
-
- return true;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var data = null;
-
- if ( typeof key === "undefined" ) {
- if ( this.length ) {
- data = jQuery.data( this[0] );
-
- if ( this[0].nodeType === 1 ) {
- var attr = this[0].attributes, name;
- for ( var i = 0, l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.substring(5) );
-
- dataAttr( this[0], name, data[ name ] );
- }
- }
- }
- }
-
- return data;
-
- } else if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- var parts = key.split(".");
- parts[1] = parts[1] ? "." + parts[1] : "";
-
- if ( value === undefined ) {
- data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
- // Try to fetch any internally stored data first
- if ( data === undefined && this.length ) {
- data = jQuery.data( this[0], key );
- data = dataAttr( this[0], key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
-
- } else {
- return this.each(function() {
- var $this = jQuery( this ),
- args = [ parts[0], value ];
-
- $this.triggerHandler( "setData" + parts[1] + "!", args );
- jQuery.data( this, key, value );
- $this.triggerHandler( "changeData" + parts[1] + "!", args );
- });
- }
- },
-
- removeData: function( key ) {
- return this.each(function() {
- jQuery.removeData( this, key );
- });
- }
-});
-
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
- var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- !jQuery.isNaN( data ) ? parseFloat( data ) :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
-// property to be considered empty objects; this property always exists in
-// order to make sure JSON.stringify does not expose internal metadata
-function isEmptyDataObject( obj ) {
- for ( var name in obj ) {
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-
-
-
-
-function handleQueueMarkDefer( elem, type, src ) {
- var deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- defer = jQuery.data( elem, deferDataKey, undefined, true );
- if ( defer &&
- ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
- ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
- // Give room for hard-coded callbacks to fire first
- // and eventually mark/queue something else on the element
- setTimeout( function() {
- if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
- !jQuery.data( elem, markDataKey, undefined, true ) ) {
- jQuery.removeData( elem, deferDataKey, true );
- defer.resolve();
- }
- }, 0 );
- }
-}
-
-jQuery.extend({
-
- _mark: function( elem, type ) {
- if ( elem ) {
- type = (type || "fx") + "mark";
- jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
- }
- },
-
- _unmark: function( force, elem, type ) {
- if ( force !== true ) {
- type = elem;
- elem = force;
- force = false;
- }
- if ( elem ) {
- type = type || "fx";
- var key = type + "mark",
- count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
- if ( count ) {
- jQuery.data( elem, key, count, true );
- } else {
- jQuery.removeData( elem, key, true );
- handleQueueMarkDefer( elem, type, "mark" );
- }
- }
- },
-
- queue: function( elem, type, data ) {
- if ( elem ) {
- type = (type || "fx") + "queue";
- var q = jQuery.data( elem, type, undefined, true );
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !q || jQuery.isArray(data) ) {
- q = jQuery.data( elem, type, jQuery.makeArray(data), true );
- } else {
- q.push( data );
- }
- }
- return q || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- fn = queue.shift(),
- defer;
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- }
-
- if ( fn ) {
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift("inprogress");
- }
-
- fn.call(elem, function() {
- jQuery.dequeue(elem, type);
- });
- }
-
- if ( !queue.length ) {
- jQuery.removeData( elem, type + "queue", true );
- handleQueueMarkDefer( elem, type, "queue" );
- }
- }
-});
-
-jQuery.fn.extend({
- queue: function( type, data ) {
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- }
-
- if ( data === undefined ) {
- return jQuery.queue( this[0], type );
- }
- return this.each(function() {
- var queue = jQuery.queue( this, type, data );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- dequeue: function( type ) {
- return this.each(function() {
- jQuery.dequeue( this, type );
- });
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
- type = type || "fx";
-
- return this.queue( type, function() {
- var elem = this;
- setTimeout(function() {
- jQuery.dequeue( elem, type );
- }, time );
- });
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, object ) {
- if ( typeof type !== "string" ) {
- object = type;
- type = undefined;
- }
- type = type || "fx";
- var defer = jQuery.Deferred(),
- elements = this,
- i = elements.length,
- count = 1,
- deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- tmp;
- function resolve() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- }
- while( i-- ) {
- if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
- ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
- jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
- jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
- count++;
- tmp.done( resolve );
- }
- }
- resolve();
- return defer.promise();
- }
-});
-
-
-
-
-var rclass = /[\n\t\r]/g,
- rspace = /\s+/,
- rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea)?$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- rinvalidChar = /\:|^on/,
- formHook, boolHook;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.attr );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.prop );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- var classNames, i, l, elem,
- setClass, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).addClass( value.call(this, j, this.className) );
- });
- }
-
- if ( value && typeof value === "string" ) {
- classNames = value.split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 ) {
- if ( !elem.className && classNames.length === 1 ) {
- elem.className = value;
-
- } else {
- setClass = " " + elem.className + " ";
-
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
- setClass += classNames[ c ] + " ";
- }
- }
- elem.className = jQuery.trim( setClass );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classNames, i, l, elem, className, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call(this, j, this.className) );
- });
- }
-
- if ( (value && typeof value === "string") || value === undefined ) {
- classNames = (value || "").split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 && elem.className ) {
- if ( value ) {
- className = (" " + elem.className + " ").replace( rclass, " " );
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- className = className.replace(" " + classNames[ c ] + " ", " ");
- }
- elem.className = jQuery.trim( className );
-
- } else {
- elem.className = "";
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( i ) {
- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.split( rspace );
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space seperated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ";
- for ( var i = 0, l = this.length; i < l; i++ ) {
- if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var hooks, ret,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace(rreturn, "") :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return undefined;
- }
-
- var isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var self = jQuery(this), val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, self.val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value,
- index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
-
- // Loop through all the selected options
- for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
- var option = options[ i ];
-
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var values = jQuery.makeArray( value );
-
- jQuery(elem).find("option").each(function() {
- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
- });
-
- if ( !values.length ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- attrFn: {
- val: true,
- css: true,
- html: true,
- text: true,
- data: true,
- width: true,
- height: true,
- offset: true
- },
-
- attrFix: {
- // Always normalize to ensure hook usage
- tabindex: "tabIndex"
- },
-
- attr: function( elem, name, value, pass ) {
- var nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
- }
-
- if ( pass && name in jQuery.attrFn ) {
- return jQuery( elem )[ name ]( value );
- }
-
- // Fallback to prop when attributes are not supported
- if ( !("getAttribute" in elem) ) {
- return jQuery.prop( elem, name, value );
- }
-
- var ret, hooks,
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // Normalize the name if needed
- if ( notxml ) {
- name = jQuery.attrFix[ name ] || name;
-
- hooks = jQuery.attrHooks[ name ];
-
- if ( !hooks ) {
- // Use boolHook for boolean attributes
- if ( rboolean.test( name ) ) {
-
- hooks = boolHook;
-
- // Use formHook for forms and if the name contains certain characters
- } else if ( formHook && name !== "className" &&
- (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
-
- hooks = formHook;
- }
- }
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return undefined;
-
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, "" + value );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, name ) {
- var propName;
- if ( elem.nodeType === 1 ) {
- name = jQuery.attrFix[ name ] || name;
-
- if ( jQuery.support.getSetAttribute ) {
- // Use removeAttribute in browsers that support it
- elem.removeAttribute( name );
- } else {
- jQuery.attr( elem, name, "" );
- elem.removeAttributeNode( elem.getAttributeNode( name ) );
- }
-
- // Set corresponding property to false for boolean attributes
- if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
- elem[ propName ] = false;
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- },
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode("tabIndex");
-
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
- }
- },
- // Use the value property for back compat
- // Use the formHook for button elements in IE6/7 (#1954)
- value: {
- get: function( elem, name ) {
- if ( formHook && jQuery.nodeName( elem, "button" ) ) {
- return formHook.get( elem, name );
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value, name ) {
- if ( formHook && jQuery.nodeName( elem, "button" ) ) {
- return formHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
- }
- },
-
- propFix: {
- tabindex: "tabIndex",
- readonly: "readOnly",
- "for": "htmlFor",
- "class": "className",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- cellpadding: "cellPadding",
- rowspan: "rowSpan",
- colspan: "colSpan",
- usemap: "useMap",
- frameborder: "frameBorder",
- contenteditable: "contentEditable"
- },
-
- prop: function( elem, name, value ) {
- var nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
- }
-
- var ret, hooks,
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return (elem[ name ] = value);
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
- }
- },
-
- propHooks: {}
-});
-
-// Hook for boolean attributes
-boolHook = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- return jQuery.prop( elem, name ) ?
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !jQuery.support.getSetAttribute ) {
-
- // propFix is more comprehensive and contains all fixes
- jQuery.attrFix = jQuery.propFix;
-
- // Use this for any attribute on a form in IE6/7
- formHook = jQuery.attrHooks.name = jQuery.attrHooks.title = jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- // Return undefined if nodeValue is empty string
- return ret && ret.nodeValue !== "" ?
- ret.nodeValue :
- undefined;
- },
- set: function( elem, value, name ) {
- // Check form objects in IE (multiple bugs related)
- // Only use nodeValue if the attribute node exists on the form
- var ret = elem.getAttributeNode( name );
- if ( ret ) {
- ret.nodeValue = value;
- return value;
- }
- }
- };
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- });
- });
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get: function( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- });
- });
-}
-
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set: function( elem, value ) {
- return (elem.style.cssText = "" + value);
- }
- };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- }
- });
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
- jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- get: function( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- }
- };
- });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
- }
- }
- });
-});
-
-
-
-
-var rnamespaces = /\.(.*)$/,
- rformElems = /^(?:textarea|input|select)$/i,
- rperiod = /\./g,
- rspaces = / /g,
- rescape = /[^\w\s.|`]/g,
- fcleanup = function( nm ) {
- return nm.replace(rescape, "\\$&");
- };
-
-/*
- * A number of helper functions used for managing events.
- * Many of the ideas behind this code originated from
- * Dean Edwards' addEvent library.
- */
-jQuery.event = {
-
- // Bind an event to an element
- // Original by Dean Edwards
- add: function( elem, types, handler, data ) {
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- if ( handler === false ) {
- handler = returnFalse;
- } else if ( !handler ) {
- // Fixes bug #7229. Fix recommended by jdalton
- return;
- }
-
- var handleObjIn, handleObj;
-
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- }
-
- // Make sure that the function being executed has a unique ID
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure
- var elemData = jQuery._data( elem );
-
- // If no elemData is found then we must be trying to bind to one of the
- // banned noData elements
- if ( !elemData ) {
- return;
- }
-
- var events = elemData.events,
- eventHandle = elemData.handle;
-
- if ( !events ) {
- elemData.events = events = {};
- }
-
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.handle.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- }
-
- // Add elem as a property of the handle function
- // This is to prevent a memory leak with non-native events in IE.
- eventHandle.elem = elem;
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = types.split(" ");
-
- var type, i = 0, namespaces;
-
- while ( (type = types[ i++ ]) ) {
- handleObj = handleObjIn ?
- jQuery.extend({}, handleObjIn) :
- { handler: handler, data: data };
-
- // Namespaced event handlers
- if ( type.indexOf(".") > -1 ) {
- namespaces = type.split(".");
- type = namespaces.shift();
- handleObj.namespace = namespaces.slice(0).sort().join(".");
-
- } else {
- namespaces = [];
- handleObj.namespace = "";
- }
-
- handleObj.type = type;
- if ( !handleObj.guid ) {
- handleObj.guid = handler.guid;
- }
-
- // Get the current list of functions bound to this event
- var handlers = events[ type ],
- special = jQuery.event.special[ type ] || {};
-
- // Init the event handler queue
- if ( !handlers ) {
- handlers = events[ type ] = [];
-
- // Check for a special event handler
- // Only use addEventListener/attachEvent if the special
- // events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add the function to the element's handler list
- handlers.push( handleObj );
-
- // Keep track of which events have been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- global: {},
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, pos ) {
- // don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- if ( handler === false ) {
- handler = returnFalse;
- }
-
- var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
- events = elemData && elemData.events;
-
- if ( !elemData || !events ) {
- return;
- }
-
- // types is actually an event object here
- if ( types && types.type ) {
- handler = types.handler;
- types = types.type;
- }
-
- // Unbind all events for the element
- if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
- types = types || "";
-
- for ( type in events ) {
- jQuery.event.remove( elem, type + types );
- }
-
- return;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).unbind("mouseover mouseout", fn);
- types = types.split(" ");
-
- while ( (type = types[ i++ ]) ) {
- origType = type;
- handleObj = null;
- all = type.indexOf(".") < 0;
- namespaces = [];
-
- if ( !all ) {
- // Namespaced event handlers
- namespaces = type.split(".");
- type = namespaces.shift();
-
- namespace = new RegExp("(^|\\.)" +
- jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
- }
-
- eventType = events[ type ];
-
- if ( !eventType ) {
- continue;
- }
-
- if ( !handler ) {
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( all || namespace.test( handleObj.namespace ) ) {
- jQuery.event.remove( elem, origType, handleObj.handler, j );
- eventType.splice( j--, 1 );
- }
- }
-
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
-
- for ( j = pos || 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( handler.guid === handleObj.guid ) {
- // remove the given handler for the given type
- if ( all || namespace.test( handleObj.namespace ) ) {
- if ( pos == null ) {
- eventType.splice( j--, 1 );
- }
-
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
-
- if ( pos != null ) {
- break;
- }
- }
- }
-
- // remove generic event handler if no more handlers exist
- if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- ret = null;
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- var handle = elemData.handle;
- if ( handle ) {
- handle.elem = null;
- }
-
- delete elemData.events;
- delete elemData.handle;
-
- if ( jQuery.isEmptyObject( elemData ) ) {
- jQuery.removeData( elem, undefined, true );
- }
- }
- },
-
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent: {
- "getData": true,
- "setData": true,
- "changeData": true
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- // Event object or event type
- var type = event.type || event,
- namespaces = [],
- exclusive;
-
- if ( type.indexOf("!") >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice(0, -1);
- exclusive = true;
- }
-
- if ( type.indexOf(".") >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split(".");
- type = namespaces.shift();
- namespaces.sort();
- }
-
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.exclusive = exclusive;
- event.namespace = namespaces.join(".");
- event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
-
- // triggerHandler() and global events don't bubble or run the default action
- if ( onlyHandlers || !elem ) {
- event.preventDefault();
- event.stopPropagation();
- }
-
- // Handle a global trigger
- if ( !elem ) {
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- jQuery.each( jQuery.cache, function() {
- // internalKey variable is just used to make it easier to find
- // and potentially change this stuff later; currently it just
- // points to jQuery.expando
- var internalKey = jQuery.expando,
- internalCache = this[ internalKey ];
- if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
- jQuery.event.trigger( event, data, internalCache.handle.elem );
- }
- });
- return;
- }
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- event.target = elem;
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data != null ? jQuery.makeArray( data ) : [];
- data.unshift( event );
-
- var cur = elem,
- // IE doesn't like method names with a colon (#3533, #8272)
- ontype = type.indexOf(":") < 0 ? "on" + type : "";
-
- // Fire event on the current element, then bubble up the DOM tree
- do {
- var handle = jQuery._data( cur, "handle" );
-
- event.currentTarget = cur;
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Trigger an inline bound script
- if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
- event.result = false;
- event.preventDefault();
- }
-
- // Bubble up to document, then to window
- cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
- } while ( cur && !event.isPropagationStopped() );
-
- // If nobody prevented the default action, do it now
- if ( !event.isDefaultPrevented() ) {
- var old,
- special = jQuery.event.special[ type ] || {};
-
- if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction)() check here because IE6/7 fails that test.
- // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
- try {
- if ( ontype && elem[ type ] ) {
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- jQuery.event.triggered = type;
- elem[ type ]();
- }
- } catch ( ieError ) {}
-
- if ( old ) {
- elem[ ontype ] = old;
- }
-
- jQuery.event.triggered = undefined;
- }
- }
-
- return event.result;
- },
-
- handle: function( event ) {
- event = jQuery.event.fix( event || window.event );
- // Snapshot the handlers list since a called handler may add/remove events.
- var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
- run_all = !event.exclusive && !event.namespace,
- args = Array.prototype.slice.call( arguments, 0 );
-
- // Use the fix-ed Event rather than the (read-only) native event
- args[0] = event;
- event.currentTarget = this;
-
- for ( var j = 0, l = handlers.length; j < l; j++ ) {
- var handleObj = handlers[ j ];
-
- // Triggered event must 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event.
- if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
- // Pass in a reference to the handler function itself
- // So that we can later remove it
- event.handler = handleObj.handler;
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- var ret = handleObj.handler.apply( this, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
-
- if ( event.isImmediatePropagationStopped() ) {
- break;
- }
- }
- }
- return event.result;
- },
-
- props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // store a copy of the original event object
- // and "clone" to set read-only properties
- var originalEvent = event;
- event = jQuery.Event( originalEvent );
-
- for ( var i = this.props.length, prop; i; ) {
- prop = this.props[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary
- if ( !event.target ) {
- // Fixes #1925 where srcElement might not be defined either
- event.target = event.srcElement || document;
- }
-
- // check if target is a textnode (safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && event.fromElement ) {
- event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
- }
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && event.clientX != null ) {
- var eventDocument = event.target.ownerDocument || document,
- doc = eventDocument.documentElement,
- body = eventDocument.body;
-
- event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
- event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
- }
-
- // Add which for key events
- if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
- event.which = event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
- if ( !event.metaKey && event.ctrlKey ) {
- event.metaKey = event.ctrlKey;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && event.button !== undefined ) {
- event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
- }
-
- return event;
- },
-
- // Deprecated, use jQuery.guid instead
- guid: 1E8,
-
- // Deprecated, use jQuery.proxy instead
- proxy: jQuery.proxy,
-
- special: {
- ready: {
- // Make sure the ready event is setup
- setup: jQuery.bindReady,
- teardown: jQuery.noop
- },
-
- live: {
- add: function( handleObj ) {
- jQuery.event.add( this,
- liveConvert( handleObj.origType, handleObj.selector ),
- jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
- },
-
- remove: function( handleObj ) {
- jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
- }
- },
-
- beforeunload: {
- setup: function( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
- }
- },
-
- teardown: function( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
- }
- }
- }
- }
-};
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- if ( elem.detachEvent ) {
- elem.detachEvent( "on" + type, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !this.preventDefault ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // timeStamp is buggy for some events on Firefox(#3843)
- // So we won't rely on the native value
- this.timeStamp = jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
- return false;
-}
-function returnTrue() {
- return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
-};
-
-// Checks if an event happened on an element within another element
-// Used in jQuery.event.special.mouseenter and mouseleave handlers
-var withinElement = function( event ) {
-
- // Check if mouse(over|out) are still within the same parent element
- var related = event.relatedTarget,
- inside = false,
- eventType = event.type;
-
- event.type = event.data;
-
- if ( related !== this ) {
-
- if ( related ) {
- inside = jQuery.contains( this, related );
- }
-
- if ( !inside ) {
-
- jQuery.event.handle.apply( this, arguments );
-
- event.type = eventType;
- }
- }
-},
-
-// In case of event delegation, we only need to rename the event.type,
-// liveHandler will take care of the rest.
-delegate = function( event ) {
- event.type = event.data;
- jQuery.event.handle.apply( this, arguments );
-};
-
-// Create mouseenter and mouseleave events
-jQuery.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- setup: function( data ) {
- jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
- },
- teardown: function( data ) {
- jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
- }
- };
-});
-
-// submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function( data, namespaces ) {
- if ( !jQuery.nodeName( this, "form" ) ) {
- jQuery.event.add(this, "click.specialSubmit", function( e ) {
- var elem = e.target,
- type = elem.type;
-
- if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
- trigger( "submit", this, arguments );
- }
- });
-
- jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
- var elem = e.target,
- type = elem.type;
-
- if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
- trigger( "submit", this, arguments );
- }
- });
-
- } else {
- return false;
- }
- },
-
- teardown: function( namespaces ) {
- jQuery.event.remove( this, ".specialSubmit" );
- }
- };
-
-}
-
-// change delegation, happens here so we have bind.
-if ( !jQuery.support.changeBubbles ) {
-
- var changeFilters,
-
- getVal = function( elem ) {
- var type = elem.type, val = elem.value;
-
- if ( type === "radio" || type === "checkbox" ) {
- val = elem.checked;
-
- } else if ( type === "select-multiple" ) {
- val = elem.selectedIndex > -1 ?
- jQuery.map( elem.options, function( elem ) {
- return elem.selected;
- }).join("-") :
- "";
-
- } else if ( jQuery.nodeName( elem, "select" ) ) {
- val = elem.selectedIndex;
- }
-
- return val;
- },
-
- testChange = function testChange( e ) {
- var elem = e.target, data, val;
-
- if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
- return;
- }
-
- data = jQuery._data( elem, "_change_data" );
- val = getVal(elem);
-
- // the current data will be also retrieved by beforeactivate
- if ( e.type !== "focusout" || elem.type !== "radio" ) {
- jQuery._data( elem, "_change_data", val );
- }
-
- if ( data === undefined || val === data ) {
- return;
- }
-
- if ( data != null || val ) {
- e.type = "change";
- e.liveFired = undefined;
- jQuery.event.trigger( e, arguments[1], elem );
- }
- };
-
- jQuery.event.special.change = {
- filters: {
- focusout: testChange,
-
- beforedeactivate: testChange,
-
- click: function( e ) {
- var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
- testChange.call( this, e );
- }
- },
-
- // Change has to be called before submit
- // Keydown will be called before keypress, which is used in submit-event delegation
- keydown: function( e ) {
- var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
-
- if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
- (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
- type === "select-multiple" ) {
- testChange.call( this, e );
- }
- },
-
- // Beforeactivate happens also before the previous element is blurred
- // with this event you can't trigger a change event, but you can store
- // information
- beforeactivate: function( e ) {
- var elem = e.target;
- jQuery._data( elem, "_change_data", getVal(elem) );
- }
- },
-
- setup: function( data, namespaces ) {
- if ( this.type === "file" ) {
- return false;
- }
-
- for ( var type in changeFilters ) {
- jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
- }
-
- return rformElems.test( this.nodeName );
- },
-
- teardown: function( namespaces ) {
- jQuery.event.remove( this, ".specialChange" );
-
- return rformElems.test( this.nodeName );
- }
- };
-
- changeFilters = jQuery.event.special.change.filters;
-
- // Handle when the input is .focus()'d
- changeFilters.focus = changeFilters.beforeactivate;
-}
-
-function trigger( type, elem, args ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- // Don't pass args or remember liveFired; they apply to the donor event.
- var event = jQuery.extend( {}, args[ 0 ] );
- event.type = type;
- event.originalEvent = {};
- event.liveFired = undefined;
- jQuery.event.handle.call( elem, event );
- if ( event.isDefaultPrevented() ) {
- args[ 0 ].preventDefault();
- }
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0;
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
-
- function handler( donor ) {
- // Donor event is always a native one; fix it and switch its type.
- // Let focusin/out handler cancel the donor focus/blur event.
- var e = jQuery.event.fix( donor );
- e.type = fix;
- e.originalEvent = {};
- jQuery.event.trigger( e, null, e.target );
- if ( e.isDefaultPrevented() ) {
- donor.preventDefault();
- }
- }
- });
-}
-
-jQuery.each(["bind", "one"], function( i, name ) {
- jQuery.fn[ name ] = function( type, data, fn ) {
- var handler;
-
- // Handle object literals
- if ( typeof type === "object" ) {
- for ( var key in type ) {
- this[ name ](key, data, type[key], fn);
- }
- return this;
- }
-
- if ( arguments.length === 2 || data === false ) {
- fn = data;
- data = undefined;
- }
-
- if ( name === "one" ) {
- handler = function( event ) {
- jQuery( this ).unbind( event, handler );
- return fn.apply( this, arguments );
- };
- handler.guid = fn.guid || jQuery.guid++;
- } else {
- handler = fn;
- }
-
- if ( type === "unload" && name !== "one" ) {
- this.one( type, data, fn );
-
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- jQuery.event.add( this[i], type, handler, data );
- }
- }
-
- return this;
- };
-});
-
-jQuery.fn.extend({
- unbind: function( type, fn ) {
- // Handle object literals
- if ( typeof type === "object" && !type.preventDefault ) {
- for ( var key in type ) {
- this.unbind(key, type[key]);
- }
-
- } else {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- jQuery.event.remove( this[i], type, fn );
- }
- }
-
- return this;
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.live( types, data, fn, selector );
- },
-
- undelegate: function( selector, types, fn ) {
- if ( arguments.length === 0 ) {
- return this.unbind( "live" );
-
- } else {
- return this.die( types, null, fn, selector );
- }
- },
-
- trigger: function( type, data ) {
- return this.each(function() {
- jQuery.event.trigger( type, data, this );
- });
- },
-
- triggerHandler: function( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-});
-
-var liveMap = {
- focus: "focusin",
- blur: "focusout",
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-};
-
-jQuery.each(["live", "die"], function( i, name ) {
- jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
- var type, i = 0, match, namespaces, preType,
- selector = origSelector || this.selector,
- context = origSelector ? this : jQuery( this.context );
-
- if ( typeof types === "object" && !types.preventDefault ) {
- for ( var key in types ) {
- context[ name ]( key, data, types[key], selector );
- }
-
- return this;
- }
-
- if ( name === "die" && !types &&
- origSelector && origSelector.charAt(0) === "." ) {
-
- context.unbind( origSelector );
-
- return this;
- }
-
- if ( data === false || jQuery.isFunction( data ) ) {
- fn = data || returnFalse;
- data = undefined;
- }
-
- types = (types || "").split(" ");
-
- while ( (type = types[ i++ ]) != null ) {
- match = rnamespaces.exec( type );
- namespaces = "";
-
- if ( match ) {
- namespaces = match[0];
- type = type.replace( rnamespaces, "" );
- }
-
- if ( type === "hover" ) {
- types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
- continue;
- }
-
- preType = type;
-
- if ( liveMap[ type ] ) {
- types.push( liveMap[ type ] + namespaces );
- type = type + namespaces;
-
- } else {
- type = (liveMap[ type ] || type) + namespaces;
- }
-
- if ( name === "live" ) {
- // bind live handler
- for ( var j = 0, l = context.length; j < l; j++ ) {
- jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
- { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
- }
-
- } else {
- // unbind live handler
- context.unbind( "live." + liveConvert( type, selector ), fn );
- }
- }
-
- return this;
- };
-});
-
-function liveHandler( event ) {
- var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
- elems = [],
- selectors = [],
- events = jQuery._data( this, "events" );
-
- // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
- if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
- return;
- }
-
- if ( event.namespace ) {
- namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
- }
-
- event.liveFired = this;
-
- var live = events.live.slice(0);
-
- for ( j = 0; j < live.length; j++ ) {
- handleObj = live[j];
-
- if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
- selectors.push( handleObj.selector );
-
- } else {
- live.splice( j--, 1 );
- }
- }
-
- match = jQuery( event.target ).closest( selectors, event.currentTarget );
-
- for ( i = 0, l = match.length; i < l; i++ ) {
- close = match[i];
-
- for ( j = 0; j < live.length; j++ ) {
- handleObj = live[j];
-
- if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
- elem = close.elem;
- related = null;
-
- // Those two events require additional checking
- if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
- event.type = handleObj.preType;
- related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
-
- // Make sure not to accidentally match a child element with the same selector
- if ( related && jQuery.contains( elem, related ) ) {
- related = elem;
- }
- }
-
- if ( !related || related !== elem ) {
- elems.push({ elem: elem, handleObj: handleObj, level: close.level });
- }
- }
- }
- }
-
- for ( i = 0, l = elems.length; i < l; i++ ) {
- match = elems[i];
-
- if ( maxLevel && match.level > maxLevel ) {
- break;
- }
-
- event.currentTarget = match.elem;
- event.data = match.handleObj.data;
- event.handleObj = match.handleObj;
-
- ret = match.handleObj.origHandler.apply( match.elem, arguments );
-
- if ( ret === false || event.isPropagationStopped() ) {
- maxLevel = match.level;
-
- if ( ret === false ) {
- stop = false;
- }
- if ( event.isImmediatePropagationStopped() ) {
- break;
- }
- }
- }
-
- return stop;
-}
-
-function liveConvert( type, selector ) {
- return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
-}
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.bind( name, data, fn ) :
- this.trigger( name );
- };
-
- if ( jQuery.attrFn ) {
- jQuery.attrFn[ name ] = true;
- }
-});
-
-
-
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- done = 0,
- toString = Object.prototype.toString,
- hasDuplicate = false,
- baseHasDuplicate = true,
- rBackslash = /\\/g,
- rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-// Thus far that includes Google Chrome.
-[0, 0].sort(function() {
- baseHasDuplicate = false;
- return 0;
-});
-
-var Sizzle = function( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
-
- var origContext = context;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var m, set, checkSet, extra, ret, cur, pop, i,
- prune = true,
- contextXML = Sizzle.isXML( context ),
- parts = [],
- soFar = selector;
-
- // Reset the position of the chunker regexp (start from head)
- do {
- chunker.exec( "" );
- m = chunker.exec( soFar );
-
- if ( m ) {
- soFar = m[3];
-
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = m[3];
- break;
- }
- }
- } while ( m );
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context );
-
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] ) {
- selector += parts.shift();
- }
-
- set = posProcess( selector, set );
- }
- }
-
- } else {
- // Take a shortcut and set the context if the root selector is an ID
- // (but not if it'll be faster if the inner selector is an ID)
- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
- Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
- ret = Sizzle.find( parts.shift(), context, contextXML );
- context = ret.expr ?
- Sizzle.filter( ret.expr, ret.set )[0] :
- ret.set[0];
- }
-
- if ( context ) {
- ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
- set = ret.expr ?
- Sizzle.filter( ret.expr, ret.set ) :
- ret.set;
-
- if ( parts.length > 0 ) {
- checkSet = makeArray( set );
-
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- cur = parts.pop();
- pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
-
- } else {
- checkSet = parts = [];
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- Sizzle.error( cur || selector );
- }
-
- if ( toString.call(checkSet) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
-
- } else if ( context && context.nodeType === 1 ) {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
- results.push( set[i] );
- }
- }
-
- } else {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
-
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, origContext, results, seed );
- Sizzle.uniqueSort( results );
- }
-
- return results;
-};
-
-Sizzle.uniqueSort = function( results ) {
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
- }
-
- return results;
-};
-
-Sizzle.matches = function( expr, set ) {
- return Sizzle( expr, null, null, set );
-};
-
-Sizzle.matchesSelector = function( node, expr ) {
- return Sizzle( expr, null, null, [node] ).length > 0;
-};
-
-Sizzle.find = function( expr, context, isXML ) {
- var set;
-
- if ( !expr ) {
- return [];
- }
-
- for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
- var match,
- type = Expr.order[i];
-
- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- var left = match[1];
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace( rBackslash, "" );
- set = Expr.find[ type ]( match, context, isXML );
-
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( "*" ) :
- [];
- }
-
- return { set: set, expr: expr };
-};
-
-Sizzle.filter = function( expr, set, inplace, not ) {
- var match, anyFound,
- old = expr,
- result = [],
- curLoop = set,
- isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
- while ( expr && set.length ) {
- for ( var type in Expr.filter ) {
- if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- var found, item,
- filter = Expr.filter[ type ],
- left = match[1];
-
- anyFound = false;
-
- match.splice(1,1);
-
- if ( left.substr( left.length - 1 ) === "\\" ) {
- continue;
- }
-
- if ( curLoop === result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
-
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- var pass = not ^ !!found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
-
- } else {
- curLoop[i] = false;
- }
-
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- // Improper expression
- if ( expr === old ) {
- if ( anyFound == null ) {
- Sizzle.error( expr );
-
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
-};
-
-Sizzle.error = function( msg ) {
- throw "Syntax error, unrecognized expression: " + msg;
-};
-
-var Expr = Sizzle.selectors = {
- order: [ "ID", "NAME", "TAG" ],
-
- match: {
- ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
- ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
- TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
- CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
- POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
- PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
- },
-
- leftMatch: {},
-
- attrMap: {
- "class": "className",
- "for": "htmlFor"
- },
-
- attrHandle: {
- href: function( elem ) {
- return elem.getAttribute( "href" );
- },
- type: function( elem ) {
- return elem.getAttribute( "type" );
- }
- },
-
- relative: {
- "+": function(checkSet, part){
- var isPartStr = typeof part === "string",
- isTag = isPartStr && !rNonWord.test( part ),
- isPartStrNotTag = isPartStr && !isTag;
-
- if ( isTag ) {
- part = part.toLowerCase();
- }
-
- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
- if ( (elem = checkSet[i]) ) {
- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
- checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
- elem || false :
- elem === part;
- }
- }
-
- if ( isPartStrNotTag ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
-
- ">": function( checkSet, part ) {
- var elem,
- isPartStr = typeof part === "string",
- i = 0,
- l = checkSet.length;
-
- if ( isPartStr && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
-
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
- }
- }
-
- } else {
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- checkSet[i] = isPartStr ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( isPartStr ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
-
- "": function(checkSet, part, isXML){
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
- },
-
- "~": function( checkSet, part, isXML ) {
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
- }
- },
-
- find: {
- ID: function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- },
-
- NAME: function( match, context ) {
- if ( typeof context.getElementsByName !== "undefined" ) {
- var ret = [],
- results = context.getElementsByName( match[1] );
-
- for ( var i = 0, l = results.length; i < l; i++ ) {
- if ( results[i].getAttribute("name") === match[1] ) {
- ret.push( results[i] );
- }
- }
-
- return ret.length === 0 ? null : ret;
- }
- },
-
- TAG: function( match, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( match[1] );
- }
- }
- },
- preFilter: {
- CLASS: function( match, curLoop, inplace, result, not, isXML ) {
- match = " " + match[1].replace( rBackslash, "" ) + " ";
-
- if ( isXML ) {
- return match;
- }
-
- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
- if ( elem ) {
- if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
- if ( !inplace ) {
- result.push( elem );
- }
-
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
-
- ID: function( match ) {
- return match[1].replace( rBackslash, "" );
- },
-
- TAG: function( match, curLoop ) {
- return match[1].replace( rBackslash, "" ).toLowerCase();
- },
-
- CHILD: function( match ) {
- if ( match[1] === "nth" ) {
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- match[2] = match[2].replace(/^\+|\s*/g, '');
-
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
- match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
- else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // TODO: Move to normal caching system
- match[0] = done++;
-
- return match;
- },
-
- ATTR: function( match, curLoop, inplace, result, not, isXML ) {
- var name = match[1] = match[1].replace( rBackslash, "" );
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- // Handle if an un-quoted value was used
- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
-
- PSEUDO: function( match, curLoop, inplace, result, not ) {
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
- match[3] = Sizzle(match[3], null, null, curLoop);
-
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
-
- return false;
- }
-
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
-
- POS: function( match ) {
- match.unshift( true );
-
- return match;
- }
- },
-
- filters: {
- enabled: function( elem ) {
- return elem.disabled === false && elem.type !== "hidden";
- },
-
- disabled: function( elem ) {
- return elem.disabled === true;
- },
-
- checked: function( elem ) {
- return elem.checked === true;
- },
-
- selected: function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- parent: function( elem ) {
- return !!elem.firstChild;
- },
-
- empty: function( elem ) {
- return !elem.firstChild;
- },
-
- has: function( elem, i, match ) {
- return !!Sizzle( match[3], elem ).length;
- },
-
- header: function( elem ) {
- return (/h\d/i).test( elem.nodeName );
- },
-
- text: function( elem ) {
- var attr = elem.getAttribute( "type" ), type = elem.type;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
- },
-
- radio: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
- },
-
- checkbox: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
- },
-
- file: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
- },
-
- password: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
- },
-
- submit: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "submit" === elem.type;
- },
-
- image: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
- },
-
- reset: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "reset" === elem.type;
- },
-
- button: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && "button" === elem.type || name === "button";
- },
-
- input: function( elem ) {
- return (/input|select|textarea|button/i).test( elem.nodeName );
- },
-
- focus: function( elem ) {
- return elem === elem.ownerDocument.activeElement;
- }
- },
- setFilters: {
- first: function( elem, i ) {
- return i === 0;
- },
-
- last: function( elem, i, match, array ) {
- return i === array.length - 1;
- },
-
- even: function( elem, i ) {
- return i % 2 === 0;
- },
-
- odd: function( elem, i ) {
- return i % 2 === 1;
- },
-
- lt: function( elem, i, match ) {
- return i < match[3] - 0;
- },
-
- gt: function( elem, i, match ) {
- return i > match[3] - 0;
- },
-
- nth: function( elem, i, match ) {
- return match[3] - 0 === i;
- },
-
- eq: function( elem, i, match ) {
- return match[3] - 0 === i;
- }
- },
- filter: {
- PSEUDO: function( elem, match, i, array ) {
- var name = match[1],
- filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
-
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
-
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var j = 0, l = not.length; j < l; j++ ) {
- if ( not[j] === elem ) {
- return false;
- }
- }
-
- return true;
-
- } else {
- Sizzle.error( name );
- }
- },
-
- CHILD: function( elem, match ) {
- var type = match[1],
- node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
-
- case "nth":
- var first = match[2],
- last = match[3];
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- var doneName = match[0],
- parent = elem.parentNode;
-
- if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
- var count = 0;
-
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
- }
- }
-
- parent.sizcache = doneName;
- }
-
- var diff = elem.nodeIndex - last;
-
- if ( first === 0 ) {
- return diff === 0;
-
- } else {
- return ( diff % first === 0 && diff / first >= 0 );
- }
- }
- },
-
- ID: function( elem, match ) {
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
-
- TAG: function( elem, match ) {
- return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
- },
-
- CLASS: function( elem, match ) {
- return (" " + (elem.className || elem.getAttribute("class")) + " ")
- .indexOf( match ) > -1;
- },
-
- ATTR: function( elem, match ) {
- var name = match[1],
- result = Expr.attrHandle[ name ] ?
- Expr.attrHandle[ name ]( elem ) :
- elem[ name ] != null ?
- elem[ name ] :
- elem.getAttribute( name ),
- value = result + "",
- type = match[2],
- check = match[4];
-
- return result == null ?
- type === "!=" :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf(check) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf(check) >= 0 :
- !check ?
- value && result !== false :
- type === "!=" ?
- value !== check :
- type === "^=" ?
- value.indexOf(check) === 0 :
- type === "$=" ?
- value.substr(value.length - check.length) === check :
- type === "|=" ?
- value === check || value.substr(0, check.length + 1) === check + "-" :
- false;
- },
-
- POS: function( elem, match, i, array ) {
- var name = match[2],
- filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
-};
-
-var origPOS = Expr.match.POS,
- fescape = function(all, num){
- return "\\" + (num - 0 + 1);
- };
-
-for ( var type in Expr.match ) {
- Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
- Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
-}
-
-var makeArray = function( array, results ) {
- array = Array.prototype.slice.call( array, 0 );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-try {
- Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
-} catch( e ) {
- makeArray = function( array, results ) {
- var i = 0,
- ret = results || [];
-
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
-
- } else {
- if ( typeof array.length === "number" ) {
- for ( var l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
-
- } else {
- for ( ; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
-}
-
-var sortOrder, siblingCheck;
-
-if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- return a.compareDocumentPosition ? -1 : 1;
- }
-
- return a.compareDocumentPosition(b) & 4 ? -1 : 1;
- };
-
-} else {
- sortOrder = function( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
- siblingCheck = function( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
- };
-}
-
-// Utility function for retreiving the text value of an array of DOM nodes
-Sizzle.getText = function( elems ) {
- var ret = "", elem;
-
- for ( var i = 0; elems[i]; i++ ) {
- elem = elems[i];
-
- // Get the text from text nodes and CDATA nodes
- if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
- ret += elem.nodeValue;
-
- // Traverse everything else, except comment nodes
- } else if ( elem.nodeType !== 8 ) {
- ret += Sizzle.getText( elem.childNodes );
- }
- }
-
- return ret;
-};
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
- // We're going to inject a fake input element with a specified name
- var form = document.createElement("div"),
- id = "script" + (new Date()).getTime(),
- root = document.documentElement;
-
- form.innerHTML = "<a name='" + id + "'/>";
-
- // Inject it into the root element, check its status, and remove it quickly
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( document.getElementById( id ) ) {
- Expr.find.ID = function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
-
- return m ?
- m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
- [m] :
- undefined :
- [];
- }
- };
-
- Expr.filter.ID = function( elem, match ) {
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-
- // release memory in IE
- root = form = null;
-})();
-
-(function(){
- // Check to see if the browser returns only elements
- // when doing getElementsByTagName("*")
-
- // Create a fake element
- var div = document.createElement("div");
- div.appendChild( document.createComment("") );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName("*").length > 0 ) {
- Expr.find.TAG = function( match, context ) {
- var results = context.getElementsByTagName( match[1] );
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = "<a href='#'></a>";
-
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute("href") !== "#" ) {
-
- Expr.attrHandle.href = function( elem ) {
- return elem.getAttribute( "href", 2 );
- };
- }
-
- // release memory in IE
- div = null;
-})();
-
-if ( document.querySelectorAll ) {
- (function(){
- var oldSizzle = Sizzle,
- div = document.createElement("div"),
- id = "__sizzle__";
-
- div.innerHTML = "<p class='TEST'></p>";
-
- // Safari can't handle uppercase or unicode characters when
- // in quirks mode.
- if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
- return;
- }
-
- Sizzle = function( query, context, extra, seed ) {
- context = context || document;
-
- // Only use querySelectorAll on non-XML documents
- // (ID selectors don't work in non-HTML documents)
- if ( !seed && !Sizzle.isXML(context) ) {
- // See if we find a selector to speed up
- var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-
- if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
- // Speed-up: Sizzle("TAG")
- if ( match[1] ) {
- return makeArray( context.getElementsByTagName( query ), extra );
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
- return makeArray( context.getElementsByClassName( match[2] ), extra );
- }
- }
-
- if ( context.nodeType === 9 ) {
- // Speed-up: Sizzle("body")
- // The body element only exists once, optimize finding it
- if ( query === "body" && context.body ) {
- return makeArray( [ context.body ], extra );
-
- // Speed-up: Sizzle("#ID")
- } else if ( match && match[3] ) {
- var elem = context.getElementById( match[3] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id === match[3] ) {
- return makeArray( [ elem ], extra );
- }
-
- } else {
- return makeArray( [], extra );
- }
- }
-
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(qsaError) {}
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- var oldContext = context,
- old = context.getAttribute( "id" ),
- nid = old || id,
- hasParent = context.parentNode,
- relativeHierarchySelector = /^\s*[+~]/.test( query );
-
- if ( !old ) {
- context.setAttribute( "id", nid );
- } else {
- nid = nid.replace( /'/g, "\\$&" );
- }
- if ( relativeHierarchySelector && hasParent ) {
- context = context.parentNode;
- }
-
- try {
- if ( !relativeHierarchySelector || hasParent ) {
- return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
- }
-
- } catch(pseudoError) {
- } finally {
- if ( !old ) {
- oldContext.removeAttribute( "id" );
- }
- }
- }
- }
-
- return oldSizzle(query, context, extra, seed);
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
- }
-
- // release memory in IE
- div = null;
- })();
-}
-
-(function(){
- var html = document.documentElement,
- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
- if ( matches ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9 fails this)
- var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
- pseudoWorks = false;
-
- try {
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( document.documentElement, "[test!='']:sizzle" );
-
- } catch( pseudoError ) {
- pseudoWorks = true;
- }
-
- Sizzle.matchesSelector = function( node, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
-
- if ( !Sizzle.isXML( node ) ) {
- try {
- if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
- var ret = matches.call( node, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || !disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9, so check for that
- node.document && node.document.nodeType !== 11 ) {
- return ret;
- }
- }
- } catch(e) {}
- }
-
- return Sizzle(expr, null, null, [node]).length > 0;
- };
- }
-})();
-
-(function(){
- var div = document.createElement("div");
-
- div.innerHTML = "<div class='test e'></div><div class='test'></div>";
-
- // Opera can't find a second classname (in 9.6)
- // Also, make sure that getElementsByClassName actually exists
- if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
- return;
- }
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName("e").length === 1 ) {
- return;
- }
-
- Expr.order.splice(1, 0, "CLASS");
- Expr.find.CLASS = function( match, context, isXML ) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName(match[1]);
- }
- };
-
- // release memory in IE
- div = null;
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ){
- elem.sizcache = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName.toLowerCase() === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem.sizcache === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem.sizcache = doneName;
- elem.sizset = i;
- }
-
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-if ( document.documentElement.contains ) {
- Sizzle.contains = function( a, b ) {
- return a !== b && (a.contains ? a.contains(b) : true);
- };
-
-} else if ( document.documentElement.compareDocumentPosition ) {
- Sizzle.contains = function( a, b ) {
- return !!(a.compareDocumentPosition(b) & 16);
- };
-
-} else {
- Sizzle.contains = function() {
- return false;
- };
-}
-
-Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-var posProcess = function( selector, context ) {
- var match,
- tmpSet = [],
- later = "",
- root = context.nodeType ? [context] : context;
-
- // Position selectors must be done after the filter
- // And so must :not(positional) so we move all PSEUDOs to the end
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet );
- }
-
- return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})();
-
-
-var runtil = /Until$/,
- rparentsprev = /^(?:parents|prevUntil|prevAll)/,
- // Note: This RegExp should be improved, or likely pulled from Sizzle
- rmultiselector = /,/,
- isSimple = /^.[^:#\[\.,]*$/,
- slice = Array.prototype.slice,
- POS = jQuery.expr.match.POS,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend({
- find: function( selector ) {
- var self = this,
- i, l;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter(function() {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- });
- }
-
- var ret = this.pushStack( "", "find", selector ),
- length, n, r;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice(n--, 1);
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has: function( target ) {
- var targets = jQuery( target );
- return this.filter(function() {
- for ( var i = 0, l = targets.length; i < l; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
-
- not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
- },
-
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector, true), "filter", selector );
- },
-
- is: function( selector ) {
- return !!selector && ( typeof selector === "string" ?
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest: function( selectors, context ) {
- var ret = [], i, l, cur = this[0];
-
- // Array
- if ( jQuery.isArray( selectors ) ) {
- var match, selector,
- matches = {},
- level = 1;
-
- if ( cur && selectors.length ) {
- for ( i = 0, l = selectors.length; i < l; i++ ) {
- selector = selectors[i];
-
- if ( !matches[ selector ] ) {
- matches[ selector ] = POS.test( selector ) ?
- jQuery( selector, context || this.context ) :
- selector;
- }
- }
-
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( selector in matches ) {
- match = matches[ selector ];
-
- if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
- ret.push({ selector: selector, elem: cur, level: level });
- }
- }
-
- cur = cur.parentNode;
- level++;
- }
- }
-
- return ret;
- }
-
- // String
- var pos = POS.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- cur = this[i];
-
- while ( cur ) {
- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
- ret.push( cur );
- break;
-
- } else {
- cur = cur.parentNode;
- if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
- break;
- }
- }
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
- if ( !elem || typeof elem === "string" ) {
- return jQuery.inArray( this[0],
- // If it receives a string, the selector is used
- // If it receives nothing, the siblings are used
- elem ? jQuery( elem ) : this.parent().children() );
- }
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- andSelf: function() {
- return this.add( this.prevObject );
- }
-});
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return jQuery.nth( elem, 2, "nextSibling" );
- },
- prev: function( elem ) {
- return jQuery.nth( elem, 2, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( elem.parentNode.firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.makeArray( elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until ),
- // The variable 'args' was introduced in
- // https://github.com/jquery/jquery/commit/52a0238
- // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
- // http://code.google.com/p/v8/issues/detail?id=1050
- args = slice.call(arguments);
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, args.join(",") );
- };
-});
-
-jQuery.extend({
- filter: function( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
- jQuery.find.matches(expr, elems);
- },
-
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- nth: function( cur, result, dir, elem ) {
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] ) {
- if ( cur.nodeType === 1 && ++num === result ) {
- break;
- }
- }
-
- return cur;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep(elements, function( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- });
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep(elements, function( elem, i ) {
- return (elem === qualifier) === keep;
- });
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep(elements, function( elem ) {
- return elem.nodeType === 1;
- });
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter(qualifier, filtered, !keep);
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep(elements, function( elem, i ) {
- return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
- });
-}
-
-
-
-
-var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
- rtagName = /<([\w:]+)/,
- rtbody = /<tbody/i,
- rhtml = /<|&#?\w+;/,
- rnocache = /<(?:script|object|embed|option|style)/i,
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /\/(java|ecma)script/i,
- rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
- wrapMap = {
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
- legend: [ 1, "<fieldset>", "</fieldset>" ],
- thead: [ 1, "<table>", "</table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
- col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
- area: [ 1, "<map>", "</map>" ],
- _default: [ 0, "", "" ]
- };
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE can't serialize <link> and <script> tags normally
-if ( !jQuery.support.htmlSerialize ) {
- wrapMap._default = [ 1, "div<div>", "</div>" ];
-}
-
-jQuery.fn.extend({
- text: function( text ) {
- if ( jQuery.isFunction(text) ) {
- return this.each(function(i) {
- var self = jQuery( this );
-
- self.text( text.call(this, i, self.text()) );
- });
- }
-
- if ( typeof text !== "object" && text !== undefined ) {
- return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
- }
-
- return jQuery.text( this );
- },
-
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapAll( html.call(this, i) );
- });
- }
-
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
- if ( this[0].parentNode ) {
- wrap.insertBefore( this[0] );
- }
-
- wrap.map(function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- }).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapInner( html.call(this, i) );
- });
- }
-
- return this.each(function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- });
- },
-
- wrap: function( html ) {
- return this.each(function() {
- jQuery( this ).wrapAll( html );
- });
- },
-
- unwrap: function() {
- return this.parent().each(function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- }).end();
- },
-
- append: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 ) {
- this.appendChild( elem );
- }
- });
- },
-
- prepend: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 ) {
- this.insertBefore( elem, this.firstChild );
- }
- });
- },
-
- before: function() {
- if ( this[0] && this[0].parentNode ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this );
- });
- } else if ( arguments.length ) {
- var set = jQuery(arguments[0]);
- set.push.apply( set, this.toArray() );
- return this.pushStack( set, "before", arguments );
- }
- },
-
- after: function() {
- if ( this[0] && this[0].parentNode ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- });
- } else if ( arguments.length ) {
- var set = this.pushStack( this, "after", arguments );
- set.push.apply( set, jQuery(arguments[0]).toArray() );
- return set;
- }
- },
-
- // keepData is for internal use only--do not document
- remove: function( selector, keepData ) {
- for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
- if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
- if ( !keepData && elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- jQuery.cleanData( [ elem ] );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
- }
- }
-
- return this;
- },
-
- empty: function() {
- for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- }
-
- // Remove any remaining nodes
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function () {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- });
- },
-
- html: function( value ) {
- if ( value === undefined ) {
- return this[0] && this[0].nodeType === 1 ?
- this[0].innerHTML.replace(rinlinejQuery, "") :
- null;
-
- // See if we can take a shortcut and just use innerHTML
- } else if ( typeof value === "string" && !rnocache.test( value ) &&
- (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
- !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
-
- value = value.replace(rxhtmlTag, "<$1></$2>");
-
- try {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( this[i].nodeType === 1 ) {
- jQuery.cleanData( this[i].getElementsByTagName("*") );
- this[i].innerHTML = value;
- }
- }
-
- // If using innerHTML throws an exception, use the fallback method
- } catch(e) {
- this.empty().append( value );
- }
-
- } else if ( jQuery.isFunction( value ) ) {
- this.each(function(i){
- var self = jQuery( this );
-
- self.html( value.call(this, i, self.html()) );
- });
-
- } else {
- this.empty().append( value );
- }
-
- return this;
- },
-
- replaceWith: function( value ) {
- if ( this[0] && this[0].parentNode ) {
- // Make sure that the elements are removed from the DOM before they are inserted
- // this can help fix replacing a parent with child elements
- if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this), old = self.html();
- self.replaceWith( value.call( this, i, old ) );
- });
- }
-
- if ( typeof value !== "string" ) {
- value = jQuery( value ).detach();
- }
-
- return this.each(function() {
- var next = this.nextSibling,
- parent = this.parentNode;
-
- jQuery( this ).remove();
-
- if ( next ) {
- jQuery(next).before( value );
- } else {
- jQuery(parent).append( value );
- }
- });
- } else {
- return this.length ?
- this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
- this;
- }
- },
-
- detach: function( selector ) {
- return this.remove( selector, true );
- },
-
- domManip: function( args, table, callback ) {
- var results, first, fragment, parent,
- value = args[0],
- scripts = [];
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
- return this.each(function() {
- jQuery(this).domManip( args, table, callback, true );
- });
- }
-
- if ( jQuery.isFunction(value) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- args[0] = value.call(this, i, table ? self.html() : undefined);
- self.domManip( args, table, callback );
- });
- }
-
- if ( this[0] ) {
- parent = value && value.parentNode;
-
- // If we're in a fragment, just use that instead of building a new one
- if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
- results = { fragment: parent };
-
- } else {
- results = jQuery.buildFragment( args, this, scripts );
- }
-
- fragment = results.fragment;
-
- if ( fragment.childNodes.length === 1 ) {
- first = fragment = fragment.firstChild;
- } else {
- first = fragment.firstChild;
- }
-
- if ( first ) {
- table = table && jQuery.nodeName( first, "tr" );
-
- for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
- callback.call(
- table ?
- root(this[i], first) :
- this[i],
- // Make sure that we do not leak memory by inadvertently discarding
- // the original fragment (which might have attached data) instead of
- // using it; in addition, use the original fragment object for the last
- // item instead of first because it can end up being emptied incorrectly
- // in certain situations (Bug #8070).
- // Fragments from the fragment cache must always be cloned and never used
- // in place.
- results.cacheable || (l > 1 && i < lastIndex) ?
- jQuery.clone( fragment, true, true ) :
- fragment
- );
- }
- }
-
- if ( scripts.length ) {
- jQuery.each( scripts, evalScript );
- }
- }
-
- return this;
- }
-});
-
-function root( elem, cur ) {
- return jQuery.nodeName(elem, "table") ?
- (elem.getElementsByTagName("tbody")[0] ||
- elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
- elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-
- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
- return;
- }
-
- var internalKey = jQuery.expando,
- oldData = jQuery.data( src ),
- curData = jQuery.data( dest, oldData );
-
- // Switch to use the internal data object, if it exists, for the next
- // stage of data copying
- if ( (oldData = oldData[ internalKey ]) ) {
- var events = oldData.events;
- curData = curData[ internalKey ] = jQuery.extend({}, oldData);
-
- if ( events ) {
- delete curData.handle;
- curData.events = {};
-
- for ( var type in events ) {
- for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
- }
- }
- }
- }
-}
-
-function cloneFixAttributes( src, dest ) {
- var nodeName;
-
- // We do not need to do anything for non-Elements
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // clearAttributes removes the attributes, which we don't want,
- // but also removes the attachEvent events, which we *do* want
- if ( dest.clearAttributes ) {
- dest.clearAttributes();
- }
-
- // mergeAttributes, in contrast, only merges back on the
- // original attributes, not the events
- if ( dest.mergeAttributes ) {
- dest.mergeAttributes( src );
- }
-
- nodeName = dest.nodeName.toLowerCase();
-
- // IE6-8 fail to clone children inside object elements that use
- // the proprietary classid attribute value (rather than the type
- // attribute) to identify the type of content to display
- if ( nodeName === "object" ) {
- dest.outerHTML = src.outerHTML;
-
- } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
- // IE6-8 fails to persist the checked state of a cloned checkbox
- // or radio button. Worse, IE6-7 fail to give the cloned element
- // a checked appearance if the defaultChecked value isn't also set
- if ( src.checked ) {
- dest.defaultChecked = dest.checked = src.checked;
- }
-
- // IE6-7 get confused and end up setting the value of a cloned
- // checkbox/radio button to an empty string instead of "on"
- if ( dest.value !== src.value ) {
- dest.value = src.value;
- }
-
- // IE6-8 fails to return the selected option to the default selected
- // state when cloning options
- } else if ( nodeName === "option" ) {
- dest.selected = src.defaultSelected;
-
- // IE6-8 fails to set the defaultValue to the correct value when
- // cloning other types of input fields
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-
- // Event data gets referenced instead of copied if the expando
- // gets copied too
- dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, nodes, scripts ) {
- var fragment, cacheable, cacheresults, doc;
-
- // nodes may contain either an explicit document object,
- // a jQuery collection or context object.
- // If nodes[0] contains a valid object to assign to doc
- if ( nodes && nodes[0] ) {
- doc = nodes[0].ownerDocument || nodes[0];
- }
-
- // Ensure that an attr object doesn't incorrectly stand in as a document object
- // Chrome and Firefox seem to allow this to occur and will throw exception
- // Fixes #8950
- if ( !doc.createDocumentFragment ) {
- doc = document;
- }
-
- // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
- // Cloning options loses the selected state, so don't cache them
- // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
- // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
- if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
- args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
-
- cacheable = true;
-
- cacheresults = jQuery.fragments[ args[0] ];
- if ( cacheresults && cacheresults !== 1 ) {
- fragment = cacheresults;
- }
- }
-
- if ( !fragment ) {
- fragment = doc.createDocumentFragment();
- jQuery.clean( args, doc, fragment, scripts );
- }
-
- if ( cacheable ) {
- jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
- }
-
- return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var ret = [],
- insert = jQuery( selector ),
- parent = this.length === 1 && this[0].parentNode;
-
- if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
- insert[ original ]( this[0] );
- return this;
-
- } else {
- for ( var i = 0, l = insert.length; i < l; i++ ) {
- var elems = (i > 0 ? this.clone(true) : this).get();
- jQuery( insert[i] )[ original ]( elems );
- ret = ret.concat( elems );
- }
-
- return this.pushStack( ret, name, insert.selector );
- }
- };
-});
-
-function getAll( elem ) {
- if ( "getElementsByTagName" in elem ) {
- return elem.getElementsByTagName( "*" );
-
- } else if ( "querySelectorAll" in elem ) {
- return elem.querySelectorAll( "*" );
-
- } else {
- return [];
- }
-}
-
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
- if ( elem.type === "checkbox" || elem.type === "radio" ) {
- elem.defaultChecked = elem.checked;
- }
-}
-// Finds all inputs and passes them to fixDefaultChecked
-function findInputs( elem ) {
- if ( jQuery.nodeName( elem, "input" ) ) {
- fixDefaultChecked( elem );
- } else if ( "getElementsByTagName" in elem ) {
- jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
- }
-}
-
-jQuery.extend({
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var clone = elem.cloneNode(true),
- srcElements,
- destElements,
- i;
-
- if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
- (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
- // IE copies events bound via attachEvent when using cloneNode.
- // Calling detachEvent on the clone will also remove the events
- // from the original. In order to get around this, we use some
- // proprietary methods to clear the events. Thanks to MooTools
- // guys for this hotness.
-
- cloneFixAttributes( elem, clone );
-
- // Using Sizzle here is crazy slow, so we use getElementsByTagName
- // instead
- srcElements = getAll( elem );
- destElements = getAll( clone );
-
- // Weird iteration because IE will replace the length property
- // with an element if you are cloning the body and one of the
- // elements on the page has a name or id of "length"
- for ( i = 0; srcElements[i]; ++i ) {
- cloneFixAttributes( srcElements[i], destElements[i] );
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- cloneCopyEvent( elem, clone );
-
- if ( deepDataAndEvents ) {
- srcElements = getAll( elem );
- destElements = getAll( clone );
-
- for ( i = 0; srcElements[i]; ++i ) {
- cloneCopyEvent( srcElements[i], destElements[i] );
- }
- }
- }
-
- srcElements = destElements = null;
-
- // Return the cloned set
- return clone;
- },
-
- clean: function( elems, context, fragment, scripts ) {
- var checkScriptType;
-
- context = context || document;
-
- // !context.createElement fails in IE with an error but returns typeof 'object'
- if ( typeof context.createElement === "undefined" ) {
- context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
- }
-
- var ret = [], j;
-
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- if ( typeof elem === "number" ) {
- elem += "";
- }
-
- if ( !elem ) {
- continue;
- }
-
- // Convert html string into DOM nodes
- if ( typeof elem === "string" ) {
- if ( !rhtml.test( elem ) ) {
- elem = context.createTextNode( elem );
- } else {
- // Fix "XHTML"-style tags in all browsers
- elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
- // Trim whitespace, otherwise indexOf won't work as expected
- var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
- wrap = wrapMap[ tag ] || wrapMap._default,
- depth = wrap[0],
- div = context.createElement("div");
-
- // Go to html and back, then peel off extra wrappers
- div.innerHTML = wrap[1] + elem + wrap[2];
-
- // Move to the right depth
- while ( depth-- ) {
- div = div.lastChild;
- }
-
- // Remove IE's autoinserted <tbody> from table fragments
- if ( !jQuery.support.tbody ) {
-
- // String was a <table>, *may* have spurious <tbody>
- var hasBody = rtbody.test(elem),
- tbody = tag === "table" && !hasBody ?
- div.firstChild && div.firstChild.childNodes :
-
- // String was a bare <thead> or <tfoot>
- wrap[1] === "<table>" && !hasBody ?
- div.childNodes :
- [];
-
- for ( j = tbody.length - 1; j >= 0 ; --j ) {
- if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
- tbody[ j ].parentNode.removeChild( tbody[ j ] );
- }
- }
- }
-
- // IE completely kills leading whitespace when innerHTML is used
- if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
- div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
- }
-
- elem = div.childNodes;
- }
- }
-
- // Resets defaultChecked for any radios and checkboxes
- // about to be appended to the DOM in IE 6/7 (#8060)
- var len;
- if ( !jQuery.support.appendChecked ) {
- if ( elem[0] && typeof (len = elem.length) === "number" ) {
- for ( j = 0; j < len; j++ ) {
- findInputs( elem[j] );
- }
- } else {
- findInputs( elem );
- }
- }
-
- if ( elem.nodeType ) {
- ret.push( elem );
- } else {
- ret = jQuery.merge( ret, elem );
- }
- }
-
- if ( fragment ) {
- checkScriptType = function( elem ) {
- return !elem.type || rscriptType.test( elem.type );
- };
- for ( i = 0; ret[i]; i++ ) {
- if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
- scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
-
- } else {
- if ( ret[i].nodeType === 1 ) {
- var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
-
- ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
- }
- fragment.appendChild( ret[i] );
- }
- }
- }
-
- return ret;
- },
-
- cleanData: function( elems ) {
- var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
- deleteExpando = jQuery.support.deleteExpando;
-
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
- continue;
- }
-
- id = elem[ jQuery.expando ];
-
- if ( id ) {
- data = cache[ id ] && cache[ id ][ internalKey ];
-
- if ( data && data.events ) {
- for ( var type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
-
- // Null the DOM reference to avoid IE6/7/8 leak (#7054)
- if ( data.handle ) {
- data.handle.elem = null;
- }
- }
-
- if ( deleteExpando ) {
- delete elem[ jQuery.expando ];
-
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( jQuery.expando );
- }
-
- delete cache[ id ];
- }
- }
- }
-});
-
-function evalScript( i, elem ) {
- if ( elem.src ) {
- jQuery.ajax({
- url: elem.src,
- async: false,
- dataType: "script"
- });
- } else {
- jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
-}
-
-
-
-var ralpha = /alpha\([^)]*\)/i,
- ropacity = /opacity=([^)]*)/,
- // fixed for IE9, see #8346
- rupper = /([A-Z]|^ms)/g,
- rnumpx = /^-?\d+(?:px)?$/i,
- rnum = /^-?\d/,
- rrelNum = /^[+\-]=/,
- rrelNumFilter = /[^+\-\.\de]+/g,
-
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssWidth = [ "Left", "Right" ],
- cssHeight = [ "Top", "Bottom" ],
- curCSS,
-
- getComputedStyle,
- currentStyle;
-
-jQuery.fn.css = function( name, value ) {
- // Setting 'undefined' is a no-op
- if ( arguments.length === 2 && value === undefined ) {
- return this;
- }
-
- return jQuery.access( this, name, value, true, function( elem, name, value ) {
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- });
-};
-
-jQuery.extend({
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity", "opacity" );
- return ret === "" ? "1" : ret;
-
- } else {
- return elem.style.opacity;
- }
- }
- }
- },
-
- // Exclude the following css properties to add px
- cssNumber: {
- "fillOpacity": true,
- "fontWeight": true,
- "lineHeight": true,
- "opacity": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {
- // normalize float css property
- "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
- },
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, origName = jQuery.camelCase( name ),
- style = elem.style, hooks = jQuery.cssHooks[ origName ];
-
- name = jQuery.cssProps[ origName ] || origName;
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // Make sure that NaN and null values aren't set. See: #7116
- if ( type === "number" && isNaN( value ) || value == null ) {
- return;
- }
-
- // convert relative number strings (+= or -=) to relative numbers. #7345
- if ( type === "string" && rrelNum.test( value ) ) {
- value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) );
- // Fixes bug #9237
- type = "number";
- }
-
- // If a number was passed in, add 'px' to the (except for certain CSS properties)
- if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
- value += "px";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
- // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
- // Fixes bug #5509
- try {
- style[ name ] = value;
- } catch(e) {}
- }
-
- } else {
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, extra ) {
- var ret, hooks;
-
- // Make sure that we're working with the right name
- name = jQuery.camelCase( name );
- hooks = jQuery.cssHooks[ name ];
- name = jQuery.cssProps[ name ] || name;
-
- // cssFloat needs a special treatment
- if ( name === "cssFloat" ) {
- name = "float";
- }
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
- return ret;
-
- // Otherwise, if a way to get the computed value exists, use that
- } else if ( curCSS ) {
- return curCSS( elem, name );
- }
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations
- swap: function( elem, options, callback ) {
- var old = {};
-
- // Remember the old values, and insert the new ones
- for ( var name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- callback.call( elem );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
- }
-});
-
-// DEPRECATED, Use jQuery.css() instead
-jQuery.curCSS = jQuery.css;
-
-jQuery.each(["height", "width"], function( i, name ) {
- jQuery.cssHooks[ name ] = {
- get: function( elem, computed, extra ) {
- var val;
-
- if ( computed ) {
- if ( elem.offsetWidth !== 0 ) {
- return getWH( elem, name, extra );
- } else {
- jQuery.swap( elem, cssShow, function() {
- val = getWH( elem, name, extra );
- });
- }
-
- return val;
- }
- },
-
- set: function( elem, value ) {
- if ( rnumpx.test( value ) ) {
- // ignore negative width and height values #1599
- value = parseFloat( value );
-
- if ( value >= 0 ) {
- return value + "px";
- }
-
- } else {
- return value;
- }
- }
- };
-});
-
-if ( !jQuery.support.opacity ) {
- jQuery.cssHooks.opacity = {
- get: function( elem, computed ) {
- // IE uses filters for opacity
- return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
- ( parseFloat( RegExp.$1 ) / 100 ) + "" :
- computed ? "1" : "";
- },
-
- set: function( elem, value ) {
- var style = elem.style,
- currentStyle = elem.currentStyle;
-
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- style.zoom = 1;
-
- // Set the alpha filter to set the opacity
- var opacity = jQuery.isNaN( value ) ?
- "" :
- "alpha(opacity=" + value * 100 + ")",
- filter = currentStyle && currentStyle.filter || style.filter || "";
-
- style.filter = ralpha.test( filter ) ?
- filter.replace( ralpha, opacity ) :
- filter + " " + opacity;
- }
- };
-}
-
-jQuery(function() {
- // This hook cannot be added until DOM ready because the support test
- // for it is not run until after DOM ready
- if ( !jQuery.support.reliableMarginRight ) {
- jQuery.cssHooks.marginRight = {
- get: function( elem, computed ) {
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // Work around by temporarily setting element display to inline-block
- var ret;
- jQuery.swap( elem, { "display": "inline-block" }, function() {
- if ( computed ) {
- ret = curCSS( elem, "margin-right", "marginRight" );
- } else {
- ret = elem.style.marginRight;
- }
- });
- return ret;
- }
- };
- }
-});
-
-if ( document.defaultView && document.defaultView.getComputedStyle ) {
- getComputedStyle = function( elem, name ) {
- var ret, defaultView, computedStyle;
-
- name = name.replace( rupper, "-$1" ).toLowerCase();
-
- if ( !(defaultView = elem.ownerDocument.defaultView) ) {
- return undefined;
- }
-
- if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
- ret = computedStyle.getPropertyValue( name );
- if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
- ret = jQuery.style( elem, name );
- }
- }
-
- return ret;
- };
-}
-
-if ( document.documentElement.currentStyle ) {
- currentStyle = function( elem, name ) {
- var left,
- ret = elem.currentStyle && elem.currentStyle[ name ],
- rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
- style = elem.style;
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
- // Remember the original values
- left = style.left;
-
- // Put in the new values to get a computed value out
- if ( rsLeft ) {
- elem.runtimeStyle.left = elem.currentStyle.left;
- }
- style.left = name === "fontSize" ? "1em" : (ret || 0);
- ret = style.pixelLeft + "px";
-
- // Revert the changed values
- style.left = left;
- if ( rsLeft ) {
- elem.runtimeStyle.left = rsLeft;
- }
- }
-
- return ret === "" ? "auto" : ret;
- };
-}
-
-curCSS = getComputedStyle || currentStyle;
-
-function getWH( elem, name, extra ) {
-
- // Start with offset property
- var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- which = name === "width" ? cssWidth : cssHeight;
-
- if ( val > 0 ) {
- if ( extra !== "border" ) {
- jQuery.each( which, function() {
- if ( !extra ) {
- val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
- }
- if ( extra === "margin" ) {
- val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
- } else {
- val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
- }
- });
- }
-
- return val + "px";
- }
-
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name, name );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ] || 0;
- }
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
-
- // Add padding, border, margin
- if ( extra ) {
- jQuery.each( which, function() {
- val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
- if ( extra !== "padding" ) {
- val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
- }
- if ( extra === "margin" ) {
- val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
- }
- });
- }
-
- return val + "px";
-}
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.hidden = function( elem ) {
- var width = elem.offsetWidth,
- height = elem.offsetHeight;
-
- return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
- };
-
- jQuery.expr.filters.visible = function( elem ) {
- return !jQuery.expr.filters.hidden( elem );
- };
-}
-
-
-
-
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rhash = /#.*$/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
- rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
- rquery = /\?/,
- rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
- rselectTextarea = /^(?:select|textarea)/i,
- rspacesAjax = /\s+/,
- rts = /([?&])_=[^&]*/,
- rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
-
- // Keep a copy of the old load method
- _load = jQuery.fn.load,
-
- /* Prefilters
- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
- * 2) These are called:
- * - BEFORE asking for a transport
- * - AFTER param serialization (s.data is a string if s.processData is true)
- * 3) key is the dataType
- * 4) the catchall symbol "*" can be used
- * 5) execution will start with transport dataType and THEN continue down to "*" if needed
- */
- prefilters = {},
-
- /* Transports bindings
- * 1) key is the dataType
- * 2) the catchall symbol "*" can be used
- * 3) selection will start with transport dataType and THEN go to "*" if needed
- */
- transports = {},
-
- // Document location
- ajaxLocation,
-
- // Document location segments
- ajaxLocParts;
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
- ajaxLocation = location.href;
-} catch( e ) {
- // Use the href attribute of an A element
- // since IE will modify it given document.location
- ajaxLocation = document.createElement( "a" );
- ajaxLocation.href = "";
- ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
- // dataTypeExpression is optional and defaults to "*"
- return function( dataTypeExpression, func ) {
-
- if ( typeof dataTypeExpression !== "string" ) {
- func = dataTypeExpression;
- dataTypeExpression = "*";
- }
-
- if ( jQuery.isFunction( func ) ) {
- var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
- i = 0,
- length = dataTypes.length,
- dataType,
- list,
- placeBefore;
-
- // For each dataType in the dataTypeExpression
- for(; i < length; i++ ) {
- dataType = dataTypes[ i ];
- // We control if we're asked to add before
- // any existing element
- placeBefore = /^\+/.test( dataType );
- if ( placeBefore ) {
- dataType = dataType.substr( 1 ) || "*";
- }
- list = structure[ dataType ] = structure[ dataType ] || [];
- // then we add to the structure accordingly
- list[ placeBefore ? "unshift" : "push" ]( func );
- }
- }
- };
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
- dataType /* internal */, inspected /* internal */ ) {
-
- dataType = dataType || options.dataTypes[ 0 ];
- inspected = inspected || {};
-
- inspected[ dataType ] = true;
-
- var list = structure[ dataType ],
- i = 0,
- length = list ? list.length : 0,
- executeOnly = ( structure === prefilters ),
- selection;
-
- for(; i < length && ( executeOnly || !selection ); i++ ) {
- selection = list[ i ]( options, originalOptions, jqXHR );
- // If we got redirected to another dataType
- // we try there if executing only and not done already
- if ( typeof selection === "string" ) {
- if ( !executeOnly || inspected[ selection ] ) {
- selection = undefined;
- } else {
- options.dataTypes.unshift( selection );
- selection = inspectPrefiltersOrTransports(
- structure, options, originalOptions, jqXHR, selection, inspected );
- }
- }
- }
- // If we're only executing or nothing was selected
- // we try the catchall dataType if not done already
- if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
- selection = inspectPrefiltersOrTransports(
- structure, options, originalOptions, jqXHR, "*", inspected );
- }
- // unnecessary when only executing (prefilters)
- // but it'll be ignored by the caller in that case
- return selection;
-}
-
-jQuery.fn.extend({
- load: function( url, params, callback ) {
- if ( typeof url !== "string" && _load ) {
- return _load.apply( this, arguments );
-
- // Don't do a request if no elements are being requested
- } else if ( !this.length ) {
- return this;
- }
-
- var off = url.indexOf( " " );
- if ( off >= 0 ) {
- var selector = url.slice( off, url.length );
- url = url.slice( 0, off );
- }
-
- // Default to a GET request
- var type = "GET";
-
- // If the second parameter was provided
- if ( params ) {
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
- // We assume that it's the callback
- callback = params;
- params = undefined;
-
- // Otherwise, build a param string
- } else if ( typeof params === "object" ) {
- params = jQuery.param( params, jQuery.ajaxSettings.traditional );
- type = "POST";
- }
- }
-
- var self = this;
-
- // Request the remote document
- jQuery.ajax({
- url: url,
- type: type,
- dataType: "html",
- data: params,
- // Complete callback (responseText is used internally)
- complete: function( jqXHR, status, responseText ) {
- // Store the response as specified by the jqXHR object
- responseText = jqXHR.responseText;
- // If successful, inject the HTML into all the matched elements
- if ( jqXHR.isResolved() ) {
- // #4825: Get the actual response in case
- // a dataFilter is present in ajaxSettings
- jqXHR.done(function( r ) {
- responseText = r;
- });
- // See if a selector was specified
- self.html( selector ?
- // Create a dummy div to hold the results
- jQuery("<div>")
- // inject the contents of the document in, removing the scripts
- // to avoid any 'Permission Denied' errors in IE
- .append(responseText.replace(rscript, ""))
-
- // Locate the specified elements
- .find(selector) :
-
- // If not, just inject the full result
- responseText );
- }
-
- if ( callback ) {
- self.each( callback, [ responseText, status, jqXHR ] );
- }
- }
- });
-
- return this;
- },
-
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
-
- serializeArray: function() {
- return this.map(function(){
- return this.elements ? jQuery.makeArray( this.elements ) : this;
- })
- .filter(function(){
- return this.name && !this.disabled &&
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
- rinput.test( this.type ) );
- })
- .map(function( i, elem ){
- var val = jQuery( this ).val();
-
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val, i ){
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }).get();
- }
-});
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
- jQuery.fn[ o ] = function( f ){
- return this.bind( o, f );
- };
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
- // shift arguments if data argument was omitted
- if ( jQuery.isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- return jQuery.ajax({
- type: method,
- url: url,
- data: data,
- success: callback,
- dataType: type
- });
- };
-});
-
-jQuery.extend({
-
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- },
-
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function ( target, settings ) {
- if ( !settings ) {
- // Only one parameter, we extend ajaxSettings
- settings = target;
- target = jQuery.extend( true, jQuery.ajaxSettings, settings );
- } else {
- // target was provided, we extend into it
- jQuery.extend( true, target, jQuery.ajaxSettings, settings );
- }
- // Flatten fields we don't want deep extended
- for( var field in { context: 1, url: 1 } ) {
- if ( field in settings ) {
- target[ field ] = settings[ field ];
- } else if( field in jQuery.ajaxSettings ) {
- target[ field ] = jQuery.ajaxSettings[ field ];
- }
- }
- return target;
- },
-
- ajaxSettings: {
- url: ajaxLocation,
- isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
- global: true,
- type: "GET",
- contentType: "application/x-www-form-urlencoded",
- processData: true,
- async: true,
- /*
- timeout: 0,
- data: null,
- dataType: null,
- username: null,
- password: null,
- cache: null,
- traditional: false,
- headers: {},
- */
-
- accepts: {
- xml: "application/xml, text/xml",
- html: "text/html",
- text: "text/plain",
- json: "application/json, text/javascript",
- "*": "*/*"
- },
-
- contents: {
- xml: /xml/,
- html: /html/,
- json: /json/
- },
-
- responseFields: {
- xml: "responseXML",
- text: "responseText"
- },
-
- // List of data converters
- // 1) key format is "source_type destination_type" (a single space in-between)
- // 2) the catchall symbol "*" can be used for source_type
- converters: {
-
- // Convert anything to text
- "* text": window.String,
-
- // Text to html (true = no transformation)
- "text html": true,
-
- // Evaluate text as a json expression
- "text json": jQuery.parseJSON,
-
- // Parse text as xml
- "text xml": jQuery.parseXML
- }
- },
-
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
- ajaxTransport: addToPrefiltersOrTransports( transports ),
-
- // Main method
- ajax: function( url, options ) {
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- options = url;
- url = undefined;
- }
-
- // Force options to be an object
- options = options || {};
-
- var // Create the final options object
- s = jQuery.ajaxSetup( {}, options ),
- // Callbacks context
- callbackContext = s.context || s,
- // Context for global events
- // It's the callbackContext if one was provided in the options
- // and if it's a DOM node or a jQuery collection
- globalEventContext = callbackContext !== s &&
- ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
- jQuery( callbackContext ) : jQuery.event,
- // Deferreds
- deferred = jQuery.Deferred(),
- completeDeferred = jQuery._Deferred(),
- // Status-dependent callbacks
- statusCode = s.statusCode || {},
- // ifModified key
- ifModifiedKey,
- // Headers (they are sent all at once)
- requestHeaders = {},
- requestHeadersNames = {},
- // Response headers
- responseHeadersString,
- responseHeaders,
- // transport
- transport,
- // timeout handle
- timeoutTimer,
- // Cross-domain detection vars
- parts,
- // The jqXHR state
- state = 0,
- // To know if global events are to be dispatched
- fireGlobals,
- // Loop variable
- i,
- // Fake xhr
- jqXHR = {
-
- readyState: 0,
-
- // Caches the header
- setRequestHeader: function( name, value ) {
- if ( !state ) {
- var lname = name.toLowerCase();
- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return state === 2 ? responseHeadersString : null;
- },
-
- // Builds headers hashtable if needed
- getResponseHeader: function( key ) {
- var match;
- if ( state === 2 ) {
- if ( !responseHeaders ) {
- responseHeaders = {};
- while( ( match = rheaders.exec( responseHeadersString ) ) ) {
- responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
- }
- }
- match = responseHeaders[ key.toLowerCase() ];
- }
- return match === undefined ? null : match;
- },
-
- // Overrides response content-type header
- overrideMimeType: function( type ) {
- if ( !state ) {
- s.mimeType = type;
- }
- return this;
- },
-
- // Cancel the request
- abort: function( statusText ) {
- statusText = statusText || "abort";
- if ( transport ) {
- transport.abort( statusText );
- }
- done( 0, statusText );
- return this;
- }
- };
-
- // Callback for when everything is done
- // It is defined here because jslint complains if it is declared
- // at the end of the function (which would be more logical and readable)
- function done( status, statusText, responses, headers ) {
-
- // Called once
- if ( state === 2 ) {
- return;
- }
-
- // State is "done" now
- state = 2;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status ? 4 : 0;
-
- var isSuccess,
- success,
- error,
- response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
- lastModified,
- etag;
-
- // If successful, handle type chaining
- if ( status >= 200 && status < 300 || status === 304 ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
-
- if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
- jQuery.lastModified[ ifModifiedKey ] = lastModified;
- }
- if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
- jQuery.etag[ ifModifiedKey ] = etag;
- }
- }
-
- // If not modified
- if ( status === 304 ) {
-
- statusText = "notmodified";
- isSuccess = true;
-
- // If we have data
- } else {
-
- try {
- success = ajaxConvert( s, response );
- statusText = "success";
- isSuccess = true;
- } catch(e) {
- // We have a parsererror
- statusText = "parsererror";
- error = e;
- }
- }
- } else {
- // We extract error from statusText
- // then normalize statusText and status for non-aborts
- error = statusText;
- if( !statusText || status ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = statusText;
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger( "ajaxStop" );
- }
- }
- }
-
- // Attach deferreds
- deferred.promise( jqXHR );
- jqXHR.success = jqXHR.done;
- jqXHR.error = jqXHR.fail;
- jqXHR.complete = completeDeferred.done;
-
- // Status-dependent callbacks
- jqXHR.statusCode = function( map ) {
- if ( map ) {
- var tmp;
- if ( state < 2 ) {
- for( tmp in map ) {
- statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
- }
- } else {
- tmp = map[ jqXHR.status ];
- jqXHR.then( tmp, tmp );
- }
- }
- return this;
- };
-
- // Remove hash character (#7531: and string promotion)
- // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
- // We also use the url parameter if available
- s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
- // Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
-
- // Determine if a cross-domain request is in order
- if ( s.crossDomain == null ) {
- parts = rurl.exec( s.url.toLowerCase() );
- s.crossDomain = !!( parts &&
- ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
- ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
- ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
- );
- }
-
- // Convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" ) {
- s.data = jQuery.param( s.data, s.traditional );
- }
-
- // Apply prefilters
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
- // If request was aborted inside a prefiler, stop there
- if ( state === 2 ) {
- return false;
- }
-
- // We can fire global events as of now if asked to
- fireGlobals = s.global;
-
- // Uppercase the type
- s.type = s.type.toUpperCase();
-
- // Determine if request has content
- s.hasContent = !rnoContent.test( s.type );
-
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger( "ajaxStart" );
- }
-
- // More options handling for requests with no content
- if ( !s.hasContent ) {
-
- // If data is available, append data to url
- if ( s.data ) {
- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
- }
-
- // Get ifModifiedKey before adding the anti-cache parameter
- ifModifiedKey = s.url;
-
- // Add anti-cache in url if needed
- if ( s.cache === false ) {
-
- var ts = jQuery.now(),
- // try replacing _= if it is there
- ret = s.url.replace( rts, "$1_=" + ts );
-
- // if nothing was replaced, add timestamp to the end
- s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
- }
- }
-
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- ifModifiedKey = ifModifiedKey || s.url;
- if ( jQuery.lastModified[ ifModifiedKey ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
- }
- if ( jQuery.etag[ ifModifiedKey ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
- }
- }
-
- // Set the Accepts header for the server, depending on the dataType
- jqXHR.setRequestHeader(
- "Accept",
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
- s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
- s.accepts[ "*" ]
- );
-
- // Check for headers option
- for ( i in s.headers ) {
- jqXHR.setRequestHeader( i, s.headers[ i ] );
- }
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
- // Abort if not done already
- jqXHR.abort();
- return false;
-
- }
-
- // Install callbacks on deferreds
- for ( i in { success: 1, error: 1, complete: 1 } ) {
- jqXHR[ i ]( s[ i ] );
- }
-
- // Get transport
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
- // If no transport, we auto-abort
- if ( !transport ) {
- done( -1, "No Transport" );
- } else {
- jqXHR.readyState = 1;
- // Send global event
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
- }
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = setTimeout( function(){
- jqXHR.abort( "timeout" );
- }, s.timeout );
- }
-
- try {
- state = 1;
- transport.send( requestHeaders, done );
- } catch (e) {
- // Propagate exception as error if not done
- if ( status < 2 ) {
- done( -1, e );
- // Simply rethrow otherwise
- } else {
- jQuery.error( e );
- }
- }
- }
-
- return jqXHR;
- },
-
- // Serialize an array of form elements or a set of
- // key/values into a query string
- param: function( a, traditional ) {
- var s = [],
- add = function( key, value ) {
- // If value is a function, invoke it and return its value
- value = jQuery.isFunction( value ) ? value() : value;
- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
- };
-
- // Set traditional to true for jQuery <= 1.3.2 behavior.
- if ( traditional === undefined ) {
- traditional = jQuery.ajaxSettings.traditional;
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- });
-
- } else {
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( var prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" ).replace( r20, "+" );
- }
-});
-
-function buildParams( prefix, obj, traditional, add ) {
- if ( jQuery.isArray( obj ) ) {
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
- // If array item is non-scalar (array or object), encode its
- // numeric index to resolve deserialization ambiguity issues.
- // Note that rack (as of 1.0.0) can't currently deserialize
- // nested arrays properly, and attempting to do so may cause
- // a server error. Possible fixes are to modify rack's
- // deserialization algorithm or to provide an option or flag
- // to force array serialization to be shallow.
- buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
- }
- });
-
- } else if ( !traditional && obj != null && typeof obj === "object" ) {
- // Serialize object item.
- for ( var name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-
-// This is still on the jQuery object... for now
-// Want to move this to jQuery.ajax some day
-jQuery.extend({
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {}
-
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
- var contents = s.contents,
- dataTypes = s.dataTypes,
- responseFields = s.responseFields,
- ct,
- type,
- finalDataType,
- firstDataType;
-
- // Fill responseXXX fields
- for( type in responseFields ) {
- if ( type in responses ) {
- jqXHR[ responseFields[type] ] = responses[ type ];
- }
- }
-
- // Remove auto dataType and get content-type in the process
- while( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
- }
- }
-
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
- }
- }
- }
-
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
- finalDataType = type;
- break;
- }
- if ( !firstDataType ) {
- firstDataType = type;
- }
- }
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
- }
-
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
- }
- return responses[ finalDataType ];
- }
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
- // Apply the dataFilter if provided
- if ( s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
-
- var dataTypes = s.dataTypes,
- converters = {},
- i,
- key,
- length = dataTypes.length,
- tmp,
- // Current and previous dataTypes
- current = dataTypes[ 0 ],
- prev,
- // Conversion expression
- conversion,
- // Conversion function
- conv,
- // Conversion functions (transitive conversion)
- conv1,
- conv2;
-
- // For each dataType in the chain
- for( i = 1; i < length; i++ ) {
-
- // Create converters map
- // with lowercased keys
- if ( i === 1 ) {
- for( key in s.converters ) {
- if( typeof key === "string" ) {
- converters[ key.toLowerCase() ] = s.converters[ key ];
- }
- }
- }
-
- // Get the dataTypes
- prev = current;
- current = dataTypes[ i ];
-
- // If current is auto dataType, update it to prev
- if( current === "*" ) {
- current = prev;
- // If no auto and dataTypes are actually different
- } else if ( prev !== "*" && prev !== current ) {
-
- // Get the converter
- conversion = prev + " " + current;
- conv = converters[ conversion ] || converters[ "* " + current ];
-
- // If there is no direct converter, search transitively
- if ( !conv ) {
- conv2 = undefined;
- for( conv1 in converters ) {
- tmp = conv1.split( " " );
- if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
- conv2 = converters[ tmp[1] + " " + current ];
- if ( conv2 ) {
- conv1 = converters[ conv1 ];
- if ( conv1 === true ) {
- conv = conv2;
- } else if ( conv2 === true ) {
- conv = conv1;
- }
- break;
- }
- }
- }
- }
- // If we found no converter, dispatch an error
- if ( !( conv || conv2 ) ) {
- jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
- }
- // If found converter is not an equivalence
- if ( conv !== true ) {
- // Convert with 1 or 2 converters accordingly
- response = conv ? conv( response ) : conv2( conv1(response) );
- }
- }
- }
- return response;
-}
-
-
-
-
-var jsc = jQuery.now(),
- jsre = /(\=)\?(&|$)|\?\?/i;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
- jsonp: "callback",
- jsonpCallback: function() {
- return jQuery.expando + "_" + ( jsc++ );
- }
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
- ( typeof s.data === "string" );
-
- if ( s.dataTypes[ 0 ] === "jsonp" ||
- s.jsonp !== false && ( jsre.test( s.url ) ||
- inspectData && jsre.test( s.data ) ) ) {
-
- var responseContainer,
- jsonpCallback = s.jsonpCallback =
- jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
- previous = window[ jsonpCallback ],
- url = s.url,
- data = s.data,
- replace = "$1" + jsonpCallback + "$2";
-
- if ( s.jsonp !== false ) {
- url = url.replace( jsre, replace );
- if ( s.url === url ) {
- if ( inspectData ) {
- data = data.replace( jsre, replace );
- }
- if ( s.data === data ) {
- // Add callback manually
- url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
- }
- }
- }
-
- s.url = url;
- s.data = data;
-
- // Install callback
- window[ jsonpCallback ] = function( response ) {
- responseContainer = [ response ];
- };
-
- // Clean-up function
- jqXHR.always(function() {
- // Set callback back to previous value
- window[ jsonpCallback ] = previous;
- // Call if it was a function and we have a response
- if ( responseContainer && jQuery.isFunction( previous ) ) {
- window[ jsonpCallback ]( responseContainer[ 0 ] );
- }
- });
-
- // Use data converter to retrieve json after script execution
- s.converters["script json"] = function() {
- if ( !responseContainer ) {
- jQuery.error( jsonpCallback + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Delegate to script
- return "script";
- }
-});
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup({
- accepts: {
- script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /javascript|ecmascript/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- s.global = false;
- }
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
- // This transport only deals with cross domain requests
- if ( s.crossDomain ) {
-
- var script,
- head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
-
- return {
-
- send: function( _, callback ) {
-
- script = document.createElement( "script" );
-
- script.async = "async";
-
- if ( s.scriptCharset ) {
- script.charset = s.scriptCharset;
- }
-
- script.src = s.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;
-
- // Callback if not abort
- if ( !isAbort ) {
- callback( 200, "success" );
- }
- }
- };
- // 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 );
- },
-
- abort: function() {
- if ( script ) {
- script.onload( 0, 1 );
- }
- }
- };
- }
-});
-
-
-
-
-var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
- xhrOnUnloadAbort = window.ActiveXObject ? function() {
- // Abort all pending requests
- for ( var key in xhrCallbacks ) {
- xhrCallbacks[ key ]( 0, 1 );
- }
- } : false,
- xhrId = 0,
- xhrCallbacks;
-
-// Functions to create xhrs
-function createStandardXHR() {
- try {
- return new window.XMLHttpRequest();
- } catch( e ) {}
-}
-
-function createActiveXHR() {
- try {
- return new window.ActiveXObject( "Microsoft.XMLHTTP" );
- } catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
- /* Microsoft failed to properly
- * implement the XMLHttpRequest in IE7 (can't request local files),
- * so we use the ActiveXObject when it is available
- * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
- * we need a fallback.
- */
- function() {
- return !this.isLocal && createStandardXHR() || createActiveXHR();
- } :
- // For all other browsers, use the standard XMLHttpRequest object
- createStandardXHR;
-
-// Determine support properties
-(function( xhr ) {
- jQuery.extend( jQuery.support, {
- ajax: !!xhr,
- cors: !!xhr && ( "withCredentials" in xhr )
- });
-})( jQuery.ajaxSettings.xhr() );
-
-// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
-
- jQuery.ajaxTransport(function( s ) {
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( !s.crossDomain || jQuery.support.cors ) {
-
- var callback;
-
- return {
- send: function( headers, complete ) {
-
- // Get a new xhr
- var xhr = s.xhr(),
- handle,
- i;
-
- // Open the socket
- // Passing null username, generates a login popup on Opera (#2865)
- if ( s.username ) {
- xhr.open( s.type, s.url, s.async, s.username, s.password );
- } else {
- xhr.open( s.type, s.url, s.async );
- }
-
- // Apply custom fields if provided
- if ( s.xhrFields ) {
- for ( i in s.xhrFields ) {
- xhr[ i ] = s.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( s.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( s.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !s.crossDomain && !headers["X-Requested-With"] ) {
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
- }
-
- // Need an extra try/catch for cross domain requests in Firefox 3
- try {
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
- } catch( _ ) {}
-
- // Do send the request
- // This may raise an exception which is actually
- // handled in jQuery.ajax (so no try/catch here)
- xhr.send( ( s.hasContent && s.data ) || null );
-
- // Listener
- callback = function( _, isAbort ) {
-
- var status,
- statusText,
- responseHeaders,
- responses,
- xml;
-
- // Firefox throws exceptions when accessing properties
- // of an xhr when a network error occured
- // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
- try {
-
- // Was never called and is aborted or complete
- if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
- // Only called once
- callback = undefined;
-
- // Do not keep as active anymore
- if ( handle ) {
- xhr.onreadystatechange = jQuery.noop;
- if ( xhrOnUnloadAbort ) {
- delete xhrCallbacks[ handle ];
- }
- }
-
- // If it's an abort
- if ( isAbort ) {
- // Abort it manually if needed
- if ( xhr.readyState !== 4 ) {
- xhr.abort();
- }
- } else {
- status = xhr.status;
- responseHeaders = xhr.getAllResponseHeaders();
- responses = {};
- xml = xhr.responseXML;
-
- // Construct response list
- if ( xml && xml.documentElement /* #4958 */ ) {
- responses.xml = xml;
- }
- responses.text = xhr.responseText;
-
- // Firefox throws an exception when accessing
- // statusText for faulty cross-domain requests
- try {
- statusText = xhr.statusText;
- } catch( e ) {
- // We normalize with Webkit giving an empty statusText
- statusText = "";
- }
-
- // Filter status for non standard behaviors
-
- // If the request is local and we have data: assume a success
- // (success with no data won't get notified, that's the best we
- // can do given current implementations)
- if ( !status && s.isLocal && !s.crossDomain ) {
- status = responses.text ? 200 : 404;
- // IE - #1450: sometimes returns 1223 when it should be 204
- } else if ( status === 1223 ) {
- status = 204;
- }
- }
- }
- } catch( firefoxAccessException ) {
- if ( !isAbort ) {
- complete( -1, firefoxAccessException );
- }
- }
-
- // Call complete if needed
- if ( responses ) {
- complete( status, statusText, responses, responseHeaders );
- }
- };
-
- // if we're in sync mode or it's in cache
- // and has been retrieved directly (IE6 & IE7)
- // we need to manually fire the callback
- if ( !s.async || xhr.readyState === 4 ) {
- callback();
- } else {
- handle = ++xhrId;
- if ( xhrOnUnloadAbort ) {
- // Create the active xhrs callbacks list if needed
- // and attach the unload handler
- if ( !xhrCallbacks ) {
- xhrCallbacks = {};
- jQuery( window ).unload( xhrOnUnloadAbort );
- }
- // Add to list of active xhrs callbacks
- xhrCallbacks[ handle ] = callback;
- }
- xhr.onreadystatechange = callback;
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback(0,1);
- }
- }
- };
- }
- });
-}
-
-
-
-
-var elemdisplay = {},
- iframe, iframeDoc,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
- timerId,
- fxAttrs = [
- // height animations
- [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
- // width animations
- [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
- // opacity animations
- [ "opacity" ]
- ],
- fxNow,
- requestAnimationFrame = window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.oRequestAnimationFrame;
-
-jQuery.fn.extend({
- show: function( speed, easing, callback ) {
- var elem, display;
-
- if ( speed || speed === 0 ) {
- return this.animate( genFx("show", 3), speed, easing, callback);
-
- } else {
- for ( var i = 0, j = this.length; i < j; i++ ) {
- elem = this[i];
-
- if ( elem.style ) {
- display = elem.style.display;
-
- // Reset the inline display of this element to learn if it is
- // being hidden by cascaded rules or not
- if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
- display = elem.style.display = "";
- }
-
- // Set elements which have been overridden with display: none
- // in a stylesheet to whatever the default browser style is
- // for such an element
- if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
- jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
- }
- }
- }
-
- // Set the display of most of the elements in a second loop
- // to avoid the constant reflow
- for ( i = 0; i < j; i++ ) {
- elem = this[i];
-
- if ( elem.style ) {
- display = elem.style.display;
-
- if ( display === "" || display === "none" ) {
- elem.style.display = jQuery._data(elem, "olddisplay") || "";
- }
- }
- }
-
- return this;
- }
- },
-
- hide: function( speed, easing, callback ) {
- if ( speed || speed === 0 ) {
- return this.animate( genFx("hide", 3), speed, easing, callback);
-
- } else {
- for ( var i = 0, j = this.length; i < j; i++ ) {
- if ( this[i].style ) {
- var display = jQuery.css( this[i], "display" );
-
- if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
- jQuery._data( this[i], "olddisplay", display );
- }
- }
- }
-
- // Set the display of the elements in a second loop
- // to avoid the constant reflow
- for ( i = 0; i < j; i++ ) {
- if ( this[i].style ) {
- this[i].style.display = "none";
- }
- }
-
- return this;
- }
- },
-
- // Save the old toggle function
- _toggle: jQuery.fn.toggle,
-
- toggle: function( fn, fn2, callback ) {
- var bool = typeof fn === "boolean";
-
- if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
- this._toggle.apply( this, arguments );
-
- } else if ( fn == null || bool ) {
- this.each(function() {
- var state = bool ? fn : jQuery(this).is(":hidden");
- jQuery(this)[ state ? "show" : "hide" ]();
- });
-
- } else {
- this.animate(genFx("toggle", 3), fn, fn2, callback);
- }
-
- return this;
- },
-
- fadeTo: function( speed, to, easing, callback ) {
- return this.filter(":hidden").css("opacity", 0).show().end()
- .animate({opacity: to}, speed, easing, callback);
- },
-
- animate: function( prop, speed, easing, callback ) {
- var optall = jQuery.speed(speed, easing, callback);
-
- if ( jQuery.isEmptyObject( prop ) ) {
- return this.each( optall.complete, [ false ] );
- }
-
- // Do not change referenced properties as per-property easing will be lost
- prop = jQuery.extend( {}, prop );
-
- return this[ optall.queue === false ? "each" : "queue" ](function() {
- // XXX 'this' does not always have a nodeName when running the
- // test suite
-
- if ( optall.queue === false ) {
- jQuery._mark( this );
- }
-
- var opt = jQuery.extend( {}, optall ),
- isElement = this.nodeType === 1,
- hidden = isElement && jQuery(this).is(":hidden"),
- name, val, p,
- display, e,
- parts, start, end, unit;
-
- // will store per property easing and be used to determine when an animation is complete
- opt.animatedProperties = {};
-
- for ( p in prop ) {
-
- // property name normalization
- name = jQuery.camelCase( p );
- if ( p !== name ) {
- prop[ name ] = prop[ p ];
- delete prop[ p ];
- }
-
- val = prop[ name ];
-
- // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
- if ( jQuery.isArray( val ) ) {
- opt.animatedProperties[ name ] = val[ 1 ];
- val = prop[ name ] = val[ 0 ];
- } else {
- opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
- }
-
- if ( val === "hide" && hidden || val === "show" && !hidden ) {
- return opt.complete.call( this );
- }
-
- if ( isElement && ( name === "height" || name === "width" ) ) {
- // Make sure that nothing sneaks out
- // Record all 3 overflow attributes because IE does not
- // change the overflow attribute when overflowX and
- // overflowY are set to the same value
- opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
-
- // Set display property to inline-block for height/width
- // animations on inline elements that are having width/height
- // animated
- if ( jQuery.css( this, "display" ) === "inline" &&
- jQuery.css( this, "float" ) === "none" ) {
- if ( !jQuery.support.inlineBlockNeedsLayout ) {
- this.style.display = "inline-block";
-
- } else {
- display = defaultDisplay( this.nodeName );
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( display === "inline" ) {
- this.style.display = "inline-block";
-
- } else {
- this.style.display = "inline";
- this.style.zoom = 1;
- }
- }
- }
- }
- }
-
- if ( opt.overflow != null ) {
- this.style.overflow = "hidden";
- }
-
- for ( p in prop ) {
- e = new jQuery.fx( this, opt, p );
- val = prop[ p ];
-
- if ( rfxtypes.test(val) ) {
- e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
-
- } else {
- parts = rfxnum.exec( val );
- start = e.cur();
-
- if ( parts ) {
- end = parseFloat( parts[2] );
- unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
-
- // We need to compute starting value
- if ( unit !== "px" ) {
- jQuery.style( this, p, (end || 1) + unit);
- start = ((end || 1) / e.cur()) * start;
- jQuery.style( this, p, start + unit);
- }
-
- // If a +=/-= token was provided, we're doing a relative animation
- if ( parts[1] ) {
- end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
- }
-
- e.custom( start, end, unit );
-
- } else {
- e.custom( start, val, "" );
- }
- }
- }
-
- // For JS strict compliance
- return true;
- });
- },
-
- stop: function( clearQueue, gotoEnd ) {
- if ( clearQueue ) {
- this.queue([]);
- }
-
- this.each(function() {
- var timers = jQuery.timers,
- i = timers.length;
- // clear marker counters if we know they won't be
- if ( !gotoEnd ) {
- jQuery._unmark( true, this );
- }
- while ( i-- ) {
- if ( timers[i].elem === this ) {
- if (gotoEnd) {
- // force the next step to be the last
- timers[i](true);
- }
-
- timers.splice(i, 1);
- }
- }
- });
-
- // start the next in the queue if the last step wasn't forced
- if ( !gotoEnd ) {
- this.dequeue();
- }
-
- return this;
- }
-
-});
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- setTimeout( clearFxNow, 0 );
- return ( fxNow = jQuery.now() );
-}
-
-function clearFxNow() {
- fxNow = undefined;
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, num ) {
- var obj = {};
-
- jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
- obj[ this ] = type;
- });
-
- return obj;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
- slideDown: genFx("show", 1),
- slideUp: genFx("hide", 1),
- slideToggle: genFx("toggle", 1),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
- };
-});
-
-jQuery.extend({
- speed: function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
- };
-
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
-
- // Queueing
- opt.old = opt.complete;
- opt.complete = function( noUnmark ) {
- if ( jQuery.isFunction( opt.old ) ) {
- opt.old.call( this );
- }
-
- if ( opt.queue !== false ) {
- jQuery.dequeue( this );
- } else if ( noUnmark !== false ) {
- jQuery._unmark( this );
- }
- };
-
- return opt;
- },
-
- easing: {
- linear: function( p, n, firstNum, diff ) {
- return firstNum + diff * p;
- },
- swing: function( p, n, firstNum, diff ) {
- return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
- }
- },
-
- timers: [],
-
- fx: function( elem, options, prop ) {
- this.options = options;
- this.elem = elem;
- this.prop = prop;
-
- options.orig = options.orig || {};
- }
-
-});
-
-jQuery.fx.prototype = {
- // Simple function for setting a style value
- update: function() {
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
- },
-
- // Get the current size
- cur: function() {
- if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
- return this.elem[ this.prop ];
- }
-
- var parsed,
- r = jQuery.css( this.elem, this.prop );
- // Empty strings, null, undefined and "auto" are converted to 0,
- // complex values such as "rotate(1rad)" are returned as is,
- // simple values such as "10px" are parsed to Float.
- return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
- },
-
- // Start an animation from one number to another
- custom: function( from, to, unit ) {
- var self = this,
- fx = jQuery.fx,
- raf;
-
- this.startTime = fxNow || createFxNow();
- this.start = from;
- this.end = to;
- this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
- this.now = this.start;
- this.pos = this.state = 0;
-
- function t( gotoEnd ) {
- return self.step(gotoEnd);
- }
-
- t.elem = this.elem;
-
- if ( t() && jQuery.timers.push(t) && !timerId ) {
- // Use requestAnimationFrame instead of setInterval if available
- if ( requestAnimationFrame ) {
- timerId = true;
- raf = function() {
- // When timerId gets set to null at any point, this stops
- if ( timerId ) {
- requestAnimationFrame( raf );
- fx.tick();
- }
- };
- requestAnimationFrame( raf );
- } else {
- timerId = setInterval( fx.tick, fx.interval );
- }
- }
- },
-
- // Simple 'show' function
- show: function() {
- // Remember where we started, so that we can go back to it later
- this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
- this.options.show = true;
-
- // Begin the animation
- // Make sure that we start at a small width/height to avoid any
- // flash of content
- this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
-
- // Start by showing the element
- jQuery( this.elem ).show();
- },
-
- // Simple 'hide' function
- hide: function() {
- // Remember where we started, so that we can go back to it later
- this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
- this.options.hide = true;
-
- // Begin the animation
- this.custom(this.cur(), 0);
- },
-
- // Each step of an animation
- step: function( gotoEnd ) {
- var t = fxNow || createFxNow(),
- done = true,
- elem = this.elem,
- options = this.options,
- i, n;
-
- if ( gotoEnd || t >= options.duration + this.startTime ) {
- this.now = this.end;
- this.pos = this.state = 1;
- this.update();
-
- options.animatedProperties[ this.prop ] = true;
-
- for ( i in options.animatedProperties ) {
- if ( options.animatedProperties[i] !== true ) {
- done = false;
- }
- }
-
- if ( done ) {
- // Reset the overflow
- if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
-
- jQuery.each( [ "", "X", "Y" ], function (index, value) {
- elem.style[ "overflow" + value ] = options.overflow[index];
- });
- }
-
- // Hide the element if the "hide" operation was done
- if ( options.hide ) {
- jQuery(elem).hide();
- }
-
- // Reset the properties, if the item has been hidden or shown
- if ( options.hide || options.show ) {
- for ( var p in options.animatedProperties ) {
- jQuery.style( elem, p, options.orig[p] );
- }
- }
-
- // Execute the complete function
- options.complete.call( elem );
- }
-
- return false;
-
- } else {
- // classical easing cannot be used with an Infinity duration
- if ( options.duration == Infinity ) {
- this.now = t;
- } else {
- n = t - this.startTime;
- this.state = n / options.duration;
-
- // Perform the easing function, defaults to swing
- this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
- this.now = this.start + ((this.end - this.start) * this.pos);
- }
- // Perform the next step of the animation
- this.update();
- }
-
- return true;
- }
-};
-
-jQuery.extend( jQuery.fx, {
- tick: function() {
- for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
- if ( !timers[i]() ) {
- timers.splice(i--, 1);
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- },
-
- interval: 13,
-
- stop: function() {
- clearInterval( timerId );
- timerId = null;
- },
-
- speeds: {
- slow: 600,
- fast: 200,
- // Default speed
- _default: 400
- },
-
- step: {
- opacity: function( fx ) {
- jQuery.style( fx.elem, "opacity", fx.now );
- },
-
- _default: function( fx ) {
- if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
- fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
- } else {
- fx.elem[ fx.prop ] = fx.now;
- }
- }
- }
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep(jQuery.timers, function( fn ) {
- return elem === fn.elem;
- }).length;
- };
-}
-
-// Try to restore the default display value of an element
-function defaultDisplay( nodeName ) {
-
- if ( !elemdisplay[ nodeName ] ) {
-
- var body = document.body,
- elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
- display = elem.css( "display" );
-
- elem.remove();
-
- // If the simple way fails,
- // get element's real default display by attaching it to a temp iframe
- if ( display === "none" || display === "" ) {
- // No iframe to use yet, so create it
- if ( !iframe ) {
- iframe = document.createElement( "iframe" );
- iframe.frameBorder = iframe.width = iframe.height = 0;
- }
-
- body.appendChild( iframe );
-
- // Create a cacheable copy of the iframe document on first call.
- // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
- // document to it; WebKit & Firefox won't allow reusing the iframe document.
- if ( !iframeDoc || !iframe.createElement ) {
- iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
- iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
- iframeDoc.close();
- }
-
- elem = iframeDoc.createElement( nodeName );
-
- iframeDoc.body.appendChild( elem );
-
- display = jQuery.css( elem, "display" );
-
- body.removeChild( iframe );
- }
-
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
- }
-
- return elemdisplay[ nodeName ];
-}
-
-
-
-
-var rtable = /^t(?:able|d|h)$/i,
- rroot = /^(?:body|html)$/i;
-
-if ( "getBoundingClientRect" in document.documentElement ) {
- jQuery.fn.offset = function( options ) {
- var elem = this[0], box;
-
- if ( options ) {
- return this.each(function( i ) {
- jQuery.offset.setOffset( this, options, i );
- });
- }
-
- if ( !elem || !elem.ownerDocument ) {
- return null;
- }
-
- if ( elem === elem.ownerDocument.body ) {
- return jQuery.offset.bodyOffset( elem );
- }
-
- try {
- box = elem.getBoundingClientRect();
- } catch(e) {}
-
- var doc = elem.ownerDocument,
- docElem = doc.documentElement;
-
- // Make sure we're not dealing with a disconnected DOM node
- if ( !box || !jQuery.contains( docElem, elem ) ) {
- return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
- }
-
- var body = doc.body,
- win = getWindow(doc),
- clientTop = docElem.clientTop || body.clientTop || 0,
- clientLeft = docElem.clientLeft || body.clientLeft || 0,
- scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
- scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
- top = box.top + scrollTop - clientTop,
- left = box.left + scrollLeft - clientLeft;
-
- return { top: top, left: left };
- };
-
-} else {
- jQuery.fn.offset = function( options ) {
- var elem = this[0];
-
- if ( options ) {
- return this.each(function( i ) {
- jQuery.offset.setOffset( this, options, i );
- });
- }
-
- if ( !elem || !elem.ownerDocument ) {
- return null;
- }
-
- if ( elem === elem.ownerDocument.body ) {
- return jQuery.offset.bodyOffset( elem );
- }
-
- jQuery.offset.initialize();
-
- var computedStyle,
- offsetParent = elem.offsetParent,
- prevOffsetParent = elem,
- doc = elem.ownerDocument,
- docElem = doc.documentElement,
- body = doc.body,
- defaultView = doc.defaultView,
- prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
- top = elem.offsetTop,
- left = elem.offsetLeft;
-
- while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
- if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
- break;
- }
-
- computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
- top -= elem.scrollTop;
- left -= elem.scrollLeft;
-
- if ( elem === offsetParent ) {
- top += elem.offsetTop;
- left += elem.offsetLeft;
-
- if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
- top += parseFloat( computedStyle.borderTopWidth ) || 0;
- left += parseFloat( computedStyle.borderLeftWidth ) || 0;
- }
-
- prevOffsetParent = offsetParent;
- offsetParent = elem.offsetParent;
- }
-
- if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
- top += parseFloat( computedStyle.borderTopWidth ) || 0;
- left += parseFloat( computedStyle.borderLeftWidth ) || 0;
- }
-
- prevComputedStyle = computedStyle;
- }
-
- if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
- top += body.offsetTop;
- left += body.offsetLeft;
- }
-
- if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
- top += Math.max( docElem.scrollTop, body.scrollTop );
- left += Math.max( docElem.scrollLeft, body.scrollLeft );
- }
-
- return { top: top, left: left };
- };
-}
-
-jQuery.offset = {
- initialize: function() {
- var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
- html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
-
- jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
-
- container.innerHTML = html;
- body.insertBefore( container, body.firstChild );
- innerDiv = container.firstChild;
- checkDiv = innerDiv.firstChild;
- td = innerDiv.nextSibling.firstChild.firstChild;
-
- this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
- this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
-
- checkDiv.style.position = "fixed";
- checkDiv.style.top = "20px";
-
- // safari subtracts parent border width here which is 5px
- this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
- checkDiv.style.position = checkDiv.style.top = "";
-
- innerDiv.style.overflow = "hidden";
- innerDiv.style.position = "relative";
-
- this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
-
- this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
-
- body.removeChild( container );
- jQuery.offset.initialize = jQuery.noop;
- },
-
- bodyOffset: function( body ) {
- var top = body.offsetTop,
- left = body.offsetLeft;
-
- jQuery.offset.initialize();
-
- if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
- top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
- left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
- }
-
- return { top: top, left: left };
- },
-
- setOffset: function( elem, options, i ) {
- var position = jQuery.css( elem, "position" );
-
- // set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- var curElem = jQuery( elem ),
- curOffset = curElem.offset(),
- curCSSTop = jQuery.css( elem, "top" ),
- curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
- props = {}, curPosition = {}, curTop, curLeft;
-
- // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( jQuery.isFunction( options ) ) {
- options = options.call( elem, i, curOffset );
- }
-
- if (options.top != null) {
- props.top = (options.top - curOffset.top) + curTop;
- }
- if (options.left != null) {
- props.left = (options.left - curOffset.left) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
- } else {
- curElem.css( props );
- }
- }
-};
-
-
-jQuery.fn.extend({
- position: function() {
- if ( !this[0] ) {
- return null;
- }
-
- var elem = this[0],
-
- // Get *real* offsetParent
- offsetParent = this.offsetParent(),
-
- // Get correct offsets
- offset = this.offset(),
- parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
-
- // Subtract element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
- offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
- offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
- // Add offsetParent borders
- parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
- parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
- // Subtract the two offsets
- return {
- top: offset.top - parentOffset.top,
- left: offset.left - parentOffset.left
- };
- },
-
- offsetParent: function() {
- return this.map(function() {
- var offsetParent = this.offsetParent || document.body;
- while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
- offsetParent = offsetParent.offsetParent;
- }
- return offsetParent;
- });
- }
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( ["Left", "Top"], function( i, name ) {
- var method = "scroll" + name;
-
- jQuery.fn[ method ] = function( val ) {
- var elem, win;
-
- if ( val === undefined ) {
- elem = this[ 0 ];
-
- if ( !elem ) {
- return null;
- }
-
- win = getWindow( elem );
-
- // Return the scroll offset
- return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
- jQuery.support.boxModel && win.document.documentElement[ method ] ||
- win.document.body[ method ] :
- elem[ method ];
- }
-
- // Set the scroll offset
- return this.each(function() {
- win = getWindow( this );
-
- if ( win ) {
- win.scrollTo(
- !i ? val : jQuery( win ).scrollLeft(),
- i ? val : jQuery( win ).scrollTop()
- );
-
- } else {
- this[ method ] = val;
- }
- });
- };
-});
-
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ?
- elem :
- elem.nodeType === 9 ?
- elem.defaultView || elem.parentWindow :
- false;
-}
-
-
-
-
-// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function( i, name ) {
-
- var type = name.toLowerCase();
-
- // innerHeight and innerWidth
- jQuery.fn[ "inner" + name ] = function() {
- var elem = this[0];
- return elem && elem.style ?
- parseFloat( jQuery.css( elem, type, "padding" ) ) :
- null;
- };
-
- // outerHeight and outerWidth
- jQuery.fn[ "outer" + name ] = function( margin ) {
- var elem = this[0];
- return elem && elem.style ?
- parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
- null;
- };
-
- jQuery.fn[ type ] = function( size ) {
- // Get window width or height
- var elem = this[0];
- if ( !elem ) {
- return size == null ? null : this;
- }
-
- if ( jQuery.isFunction( size ) ) {
- return this.each(function( i ) {
- var self = jQuery( this );
- self[ type ]( size.call( this, i, self[ type ]() ) );
- });
- }
-
- if ( jQuery.isWindow( elem ) ) {
- // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
- // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
- var docElemProp = elem.document.documentElement[ "client" + name ];
- return elem.document.compatMode === "CSS1Compat" && docElemProp ||
- elem.document.body[ "client" + name ] || docElemProp;
-
- // Get document width or height
- } else if ( elem.nodeType === 9 ) {
- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
- return Math.max(
- elem.documentElement["client" + name],
- elem.body["scroll" + name], elem.documentElement["scroll" + name],
- elem.body["offset" + name], elem.documentElement["offset" + name]
- );
-
- // Get or set width or height on the element
- } else if ( size === undefined ) {
- var orig = jQuery.css( elem, type ),
- ret = parseFloat( orig );
-
- return jQuery.isNaN( ret ) ? orig : ret;
-
- // Set the width or height on the element (default to pixels if value is unitless)
- } else {
- return this.css( type, typeof size === "string" ? size : size + "px" );
- }
- };
-
-});
-
-
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-})(window);
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/caman.full.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/caman.full.js
deleted file mode 100755
index d983cd4..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/caman.full.js
+++ /dev/null
@@ -1,3665 +0,0 @@
-// Generated by CoffeeScript 1.6.2
-(function() {
- var $, Analyze, Blender, Calculate, Caman, CamanParser, Canvas, Convert, Event, Fiber, Filter, IO, Image, Layer, Log, Module, Pixel, Plugin, Renderer, Root, Store, Util, fs, moduleKeywords, slice, vignetteFilters,
- __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
- __slice = [].slice,
- __hasProp = {}.hasOwnProperty,
- __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
-
- moduleKeywords = ['extended', 'included'];
-
- Module = (function() {
- function Module() {}
-
- Module["extends"] = function(obj) {
- var key, value, _ref;
-
- for (key in obj) {
- value = obj[key];
- if (__indexOf.call(moduleKeywords, key) < 0) {
- this[key] = value;
- }
- }
- if ((_ref = obj.extended) != null) {
- _ref.apply(this);
- }
- return this;
- };
-
- Module.includes = function(obj) {
- var key, value, _ref;
-
- for (key in obj) {
- value = obj[key];
- if (__indexOf.call(moduleKeywords, key) < 0) {
- this.prototype[key] = value;
- }
- }
- if ((_ref = obj.included) != null) {
- _ref.apply(this);
- }
- return this;
- };
-
- Module.delegate = function() {
- var args, source, target, _i, _len, _results;
-
- args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
- target = args.pop();
- _results = [];
- for (_i = 0, _len = args.length; _i < _len; _i++) {
- source = args[_i];
- _results.push(this.prototype[source] = target.prototype[source]);
- }
- return _results;
- };
-
- Module.aliasFunction = function(to, from) {
- var _this = this;
-
- return this.prototype[to] = function() {
- var args;
-
- args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
- return _this.prototype[from].apply(_this, args);
- };
- };
-
- Module.aliasProperty = function(to, from) {
- return Object.defineProperty(this.prototype, to, {
- get: function() {
- return this[from];
- },
- set: function(val) {
- return this[from] = val;
- }
- });
- };
-
- Module.included = function(func) {
- return func.call(this, this.prototype);
- };
-
- return Module;
-
- })();
-
- slice = Array.prototype.slice;
-
- $ = function(sel, root) {
- if (root == null) {
- root = document;
- }
- if (typeof sel === "object" || (typeof exports !== "undefined" && exports !== null)) {
- return sel;
- }
- return root.querySelector(sel);
- };
-
- Util = (function() {
- function Util() {}
-
- Util.uniqid = (function() {
- var id;
-
- id = 0;
- return {
- get: function() {
- return id++;
- }
- };
- })();
-
- Util.extend = function() {
- var copy, dest, obj, prop, src, _i, _len;
-
- obj = arguments[0], src = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- dest = obj;
- for (_i = 0, _len = src.length; _i < _len; _i++) {
- copy = src[_i];
- for (prop in copy) {
- if (!__hasProp.call(copy, prop)) continue;
- dest[prop] = copy[prop];
- }
- }
- return dest;
- };
-
- Util.clampRGB = function(val) {
- if (val < 0) {
- return 0;
- }
- if (val > 255) {
- return 255;
- }
- return val;
- };
-
- Util.copyAttributes = function(from, to, opts) {
- var attr, _i, _len, _ref, _ref1, _results;
-
- if (opts == null) {
- opts = {};
- }
- _ref = from.attributes;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- attr = _ref[_i];
- if ((opts.except != null) && (_ref1 = attr.nodeName, __indexOf.call(opts.except, _ref1) >= 0)) {
- continue;
- }
- _results.push(to.setAttribute(attr.nodeName, attr.nodeValue));
- }
- return _results;
- };
-
- Util.dataArray = function(length) {
- if (length == null) {
- length = 0;
- }
- if (Caman.NodeJS || (window.Uint8Array != null)) {
- return new Uint8Array(length);
- }
- return new Array(length);
- };
-
- return Util;
-
- })();
-
- if (typeof exports !== "undefined" && exports !== null) {
- Root = exports;
- Canvas = require('canvas');
- Image = Canvas.Image;
- Fiber = require('fibers');
- fs = require('fs');
- } else {
- Root = window;
- }
-
- Caman = (function(_super) {
- __extends(Caman, _super);
-
- Caman.version = {
- release: "4.1.2",
- date: "7/27/2013"
- };
-
- Caman.DEBUG = false;
-
- Caman.allowRevert = true;
-
- Caman.crossOrigin = "anonymous";
-
- Caman.remoteProxy = "";
-
- Caman.proxyParam = "camanProxyUrl";
-
- Caman.NodeJS = typeof exports !== "undefined" && exports !== null;
-
- Caman.autoload = !Caman.NodeJS;
-
- Caman.toString = function() {
- return "Version " + Caman.version.release + ", Released " + Caman.version.date;
- };
-
- Caman.getAttrId = function(canvas) {
- if (Caman.NodeJS) {
- return true;
- }
- if (typeof canvas === "string") {
- canvas = $(canvas);
- }
- if (!((canvas != null) && (canvas.getAttribute != null))) {
- return null;
- }
- return canvas.getAttribute('data-caman-id');
- };
-
- function Caman() {
- this.nodeFileReady = __bind(this.nodeFileReady, this);
- var args, callback, id,
- _this = this;
-
- if (arguments.length === 0) {
- throw "Invalid arguments";
- }
- if (this instanceof Caman) {
- this.finishInit = this.finishInit.bind(this);
- this.imageLoaded = this.imageLoaded.bind(this);
- args = arguments[0];
- if (!Caman.NodeJS) {
- id = parseInt(Caman.getAttrId(args[0]), 10);
- callback = typeof args[1] === "function" ? args[1] : typeof args[2] === "function" ? args[2] : function() {};
- if (!isNaN(id) && Store.has(id)) {
- return Store.execute(id, callback);
- }
- }
- this.id = Util.uniqid.get();
- this.initializedPixelData = this.originalPixelData = null;
- this.cropCoordinates = {
- x: 0,
- y: 0
- };
- this.cropped = false;
- this.resized = false;
- this.pixelStack = [];
- this.layerStack = [];
- this.canvasQueue = [];
- this.currentLayer = null;
- this.scaled = false;
- this.analyze = new Analyze(this);
- this.renderer = new Renderer(this);
- this.domIsLoaded(function() {
- _this.parseArguments(args);
- return _this.setup();
- });
- return this;
- } else {
- return new Caman(arguments);
- }
- }
-
- Caman.prototype.domIsLoaded = function(cb) {
- var listener,
- _this = this;
-
- if (Caman.NodeJS) {
- return setTimeout(function() {
- return cb.call(_this);
- }, 0);
- } else {
- if (document.readyState === "complete") {
- Log.debug("DOM initialized");
- return setTimeout(function() {
- return cb.call(_this);
- }, 0);
- } else {
- listener = function() {
- if (document.readyState === "complete") {
- Log.debug("DOM initialized");
- return cb.call(_this);
- }
- };
- return document.addEventListener("readystatechange", listener, false);
- }
- }
- };
-
- Caman.prototype.parseArguments = function(args) {
- var key, val, _ref, _results;
-
- if (args.length === 0) {
- throw "Invalid arguments given";
- }
- this.initObj = null;
- this.initType = null;
- this.imageUrl = null;
- this.callback = function() {};
- this.setInitObject(args[0]);
- if (args.length === 1) {
- return;
- }
- switch (typeof args[1]) {
- case "string":
- this.imageUrl = args[1];
- break;
- case "function":
- this.callback = args[1];
- }
- if (args.length === 2) {
- return;
- }
- this.callback = args[2];
- if (args.length === 4) {
- _ref = args[4];
- _results = [];
- for (key in _ref) {
- if (!__hasProp.call(_ref, key)) continue;
- val = _ref[key];
- _results.push(this.options[key] = val);
- }
- return _results;
- }
- };
-
- Caman.prototype.setInitObject = function(obj) {
- if (Caman.NodeJS) {
- this.initObj = obj;
- this.initType = 'node';
- return;
- }
- if (typeof obj === "object") {
- this.initObj = obj;
- } else {
- this.initObj = $(obj);
- }
- if (this.initObj == null) {
- throw "Could not find image or canvas for initialization.";
- }
- return this.initType = this.initObj.nodeName.toLowerCase();
- };
-
- Caman.prototype.setup = function() {
- switch (this.initType) {
- case "node":
- return this.initNode();
- case "img":
- return this.initImage();
- case "canvas":
- return this.initCanvas();
- }
- };
-
- Caman.prototype.initNode = function() {
- Log.debug("Initializing for NodeJS");
- if (typeof this.initObj === "string") {
- return fs.readFile(this.initObj, this.nodeFileReady);
- } else {
- return this.nodeFileReady(null, this.initObj);
- }
- };
-
- Caman.prototype.nodeFileReady = function(err, data) {
- if (err) {
- throw err;
- }
- this.image = new Image();
- this.image.src = data;
- Log.debug("Image loaded. Width = " + (this.imageWidth()) + ", Height = " + (this.imageHeight()));
- this.canvas = new Canvas(this.imageWidth(), this.imageHeight());
- return this.finishInit();
- };
-
- Caman.prototype.initImage = function() {
- this.image = this.initObj;
- this.canvas = document.createElement('canvas');
- this.context = this.canvas.getContext('2d');
- Util.copyAttributes(this.image, this.canvas, {
- except: ['src']
- });
- this.image.parentNode.replaceChild(this.canvas, this.image);
- this.imageAdjustments();
- return this.waitForImageLoaded();
- };
-
- Caman.prototype.initCanvas = function() {
- this.canvas = this.initObj;
- this.context = this.canvas.getContext('2d');
- if (this.imageUrl != null) {
- this.image = document.createElement('img');
- this.image.src = this.imageUrl;
- this.imageAdjustments();
- return this.waitForImageLoaded();
- } else {
- return this.finishInit();
- }
- };
-
- Caman.prototype.imageAdjustments = function() {
- if (this.needsHiDPISwap()) {
- Log.debug(this.image.src, "->", this.hiDPIReplacement());
- this.swapped = true;
- this.image.src = this.hiDPIReplacement();
- }
- if (IO.isRemote(this.image)) {
- this.image.src = IO.proxyUrl(this.image.src);
- return Log.debug("Remote image detected, using URL = " + this.image.src);
- }
- };
-
- Caman.prototype.waitForImageLoaded = function() {
- if (this.isImageLoaded()) {
- return this.imageLoaded();
- } else {
- return this.image.onload = this.imageLoaded;
- }
- };
-
- Caman.prototype.isImageLoaded = function() {
- if (!this.image.complete) {
- return false;
- }
- if ((this.image.naturalWidth != null) && this.image.naturalWidth === 0) {
- return false;
- }
- return true;
- };
-
- Caman.prototype.imageWidth = function() {
- return this.image.width || this.image.naturalWidth;
- };
-
- Caman.prototype.imageHeight = function() {
- return this.image.height || this.image.naturalHeight;
- };
-
- Caman.prototype.imageLoaded = function() {
- Log.debug("Image loaded. Width = " + (this.imageWidth()) + ", Height = " + (this.imageHeight()));
- if (this.swapped) {
- this.canvas.width = this.imageWidth() / this.hiDPIRatio();
- this.canvas.height = this.imageHeight() / this.hiDPIRatio();
- } else {
- this.canvas.width = this.imageWidth();
- this.canvas.height = this.imageHeight();
- }
- return this.finishInit();
- };
-
- Caman.prototype.finishInit = function() {
- var i, pixel, _i, _len, _ref;
-
- if (this.context == null) {
- this.context = this.canvas.getContext('2d');
- }
- this.originalWidth = this.preScaledWidth = this.width = this.canvas.width;
- this.originalHeight = this.preScaledHeight = this.height = this.canvas.height;
- this.hiDPIAdjustments();
- if (!this.hasId()) {
- this.assignId();
- }
- if (this.image != null) {
- this.context.drawImage(this.image, 0, 0, this.imageWidth(), this.imageHeight(), 0, 0, this.preScaledWidth, this.preScaledHeight);
- }
- this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height);
- this.pixelData = this.imageData.data;
- if (Caman.allowRevert) {
- this.initializedPixelData = Util.dataArray(this.pixelData.length);
- this.originalPixelData = Util.dataArray(this.pixelData.length);
- _ref = this.pixelData;
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
- pixel = _ref[i];
- this.initializedPixelData[i] = pixel;
- this.originalPixelData[i] = pixel;
- }
- }
- this.dimensions = {
- width: this.canvas.width,
- height: this.canvas.height
- };
- if (!Caman.NodeJS) {
- Store.put(this.id, this);
- }
- this.callback.call(this, this);
- return this.callback = function() {};
- };
-
- Caman.prototype.reloadCanvasData = function() {
- this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height);
- return this.pixelData = this.imageData.data;
- };
-
- Caman.prototype.resetOriginalPixelData = function() {
- var i, pixel, _i, _len, _ref, _results;
-
- if (!Caman.allowRevert) {
- throw "Revert disabled";
- }
- this.originalPixelData = Util.dataArray(this.pixelData.length);
- _ref = this.pixelData;
- _results = [];
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
- pixel = _ref[i];
- _results.push(this.originalPixelData[i] = pixel);
- }
- return _results;
- };
-
- Caman.prototype.hasId = function() {
- return Caman.getAttrId(this.canvas) != null;
- };
-
- Caman.prototype.assignId = function() {
- if (Caman.NodeJS || this.canvas.getAttribute('data-caman-id')) {
- return;
- }
- return this.canvas.setAttribute('data-caman-id', this.id);
- };
-
- Caman.prototype.hiDPIDisabled = function() {
- return this.canvas.getAttribute('data-caman-hidpi-disabled') !== null;
- };
-
- Caman.prototype.hiDPIAdjustments = function() {
- var ratio;
-
- if (Caman.NodeJS || !this.needsHiDPISwap()) {
- return;
- }
- ratio = this.hiDPIRatio();
- if (ratio !== 1) {
- Log.debug("HiDPI ratio = " + ratio);
- this.scaled = true;
- this.preScaledWidth = this.canvas.width;
- this.preScaledHeight = this.canvas.height;
- this.canvas.width = this.preScaledWidth * ratio;
- this.canvas.height = this.preScaledHeight * ratio;
- this.canvas.style.width = "" + this.preScaledWidth + "px";
- this.canvas.style.height = "" + this.preScaledHeight + "px";
- this.context.scale(ratio, ratio);
- this.width = this.originalWidth = this.canvas.width;
- return this.height = this.originalHeight = this.canvas.height;
- }
- };
-
- Caman.prototype.hiDPIRatio = function() {
- var backingStoreRatio, devicePixelRatio;
-
- devicePixelRatio = window.devicePixelRatio || 1;
- backingStoreRatio = this.context.webkitBackingStorePixelRatio || this.context.mozBackingStorePixelRatio || this.context.msBackingStorePixelRatio || this.context.oBackingStorePixelRatio || this.context.backingStorePixelRatio || 1;
- return devicePixelRatio / backingStoreRatio;
- };
-
- Caman.prototype.hiDPICapable = function() {
- return (window.devicePixelRatio != null) && window.devicePixelRatio !== 1;
- };
-
- Caman.prototype.needsHiDPISwap = function() {
- if (this.hiDPIDisabled() || !this.hiDPICapable()) {
- return false;
- }
- return this.hiDPIReplacement() !== null;
- };
-
- Caman.prototype.hiDPIReplacement = function() {
- if (this.image == null) {
- return null;
- }
- return this.image.getAttribute('data-caman-hidpi');
- };
-
- Caman.prototype.replaceCanvas = function(newCanvas) {
- var oldCanvas;
-
- oldCanvas = this.canvas;
- this.canvas = newCanvas;
- this.context = this.canvas.getContext('2d');
- if (!Caman.NodeJS) {
- oldCanvas.parentNode.replaceChild(this.canvas, oldCanvas);
- }
- this.width = this.canvas.width;
- this.height = this.canvas.height;
- this.reloadCanvasData();
- return this.dimensions = {
- width: this.canvas.width,
- height: this.canvas.height
- };
- };
-
- Caman.prototype.render = function(callback) {
- var _this = this;
-
- if (callback == null) {
- callback = function() {};
- }
- Event.trigger(this, "renderStart");
- return this.renderer.execute(function() {
- _this.context.putImageData(_this.imageData, 0, 0);
- return callback.call(_this);
- });
- };
-
- Caman.prototype.revert = function(updateContext) {
- var i, pixel, _i, _len, _ref;
-
- if (updateContext == null) {
- updateContext = true;
- }
- if (!Caman.allowRevert) {
- throw "Revert disabled";
- }
- _ref = this.originalVisiblePixels();
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
- pixel = _ref[i];
- this.pixelData[i] = pixel;
- }
- if (updateContext) {
- return this.context.putImageData(this.imageData, 0, 0);
- }
- };
-
- Caman.prototype.reset = function() {
- var canvas, ctx, i, imageData, pixel, pixelData, _i, _len, _ref;
-
- canvas = document.createElement('canvas');
- Util.copyAttributes(this.canvas, canvas);
- canvas.width = this.originalWidth;
- canvas.height = this.originalHeight;
- ctx = canvas.getContext('2d');
- imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
- pixelData = imageData.data;
- _ref = this.initializedPixelData;
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
- pixel = _ref[i];
- pixelData[i] = pixel;
- }
- ctx.putImageData(imageData, 0, 0);
- this.cropCoordinates = {
- x: 0,
- y: 0
- };
- this.resized = false;
- return this.replaceCanvas(canvas);
- };
-
- Caman.prototype.originalVisiblePixels = function() {
- var canvas, coord, ctx, endX, endY, i, imageData, pixel, pixelData, pixels, scaledCanvas, startX, startY, width, _i, _j, _len, _ref, _ref1, _ref2, _ref3;
-
- if (!Caman.allowRevert) {
- throw "Revert disabled";
- }
- pixels = [];
- startX = this.cropCoordinates.x;
- endX = startX + this.width;
- startY = this.cropCoordinates.y;
- endY = startY + this.height;
- if (this.resized) {
- canvas = document.createElement('canvas');
- canvas.width = this.originalWidth;
- canvas.height = this.originalHeight;
- ctx = canvas.getContext('2d');
- imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
- pixelData = imageData.data;
- _ref = this.originalPixelData;
- for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
- pixel = _ref[i];
- pixelData[i] = pixel;
- }
- ctx.putImageData(imageData, 0, 0);
- scaledCanvas = document.createElement('canvas');
- scaledCanvas.width = this.width;
- scaledCanvas.height = this.height;
- ctx = scaledCanvas.getContext('2d');
- ctx.drawImage(canvas, 0, 0, this.originalWidth, this.originalHeight, 0, 0, this.width, this.height);
- pixelData = ctx.getImageData(0, 0, this.width, this.height).data;
- width = this.width;
- } else {
- pixelData = this.originalPixelData;
- width = this.originalWidth;
- }
- for (i = _j = 0, _ref1 = pixelData.length; _j < _ref1; i = _j += 4) {
- coord = Pixel.locationToCoordinates(i, width);
- if (((startX <= (_ref2 = coord.x) && _ref2 < endX)) && ((startY <= (_ref3 = coord.y) && _ref3 < endY))) {
- pixels.push(pixelData[i], pixelData[i + 1], pixelData[i + 2], pixelData[i + 3]);
- }
- }
- return pixels;
- };
-
- Caman.prototype.process = function(name, processFn) {
- this.renderer.add({
- type: Filter.Type.Single,
- name: name,
- processFn: processFn
- });
- return this;
- };
-
- Caman.prototype.processKernel = function(name, adjust, divisor, bias) {
- var i, _i, _ref;
-
- if (divisor == null) {
- divisor = null;
- }
- if (bias == null) {
- bias = 0;
- }
- if (divisor == null) {
- divisor = 0;
- for (i = _i = 0, _ref = adjust.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
- divisor += adjust[i];
- }
- }
- this.renderer.add({
- type: Filter.Type.Kernel,
- name: name,
- adjust: adjust,
- divisor: divisor,
- bias: bias
- });
- return this;
- };
-
- Caman.prototype.processPlugin = function(plugin, args) {
- this.renderer.add({
- type: Filter.Type.Plugin,
- plugin: plugin,
- args: args
- });
- return this;
- };
-
- Caman.prototype.newLayer = function(callback) {
- var layer;
-
- layer = new Layer(this);
- this.canvasQueue.push(layer);
- this.renderer.add({
- type: Filter.Type.LayerDequeue
- });
- callback.call(layer);
- this.renderer.add({
- type: Filter.Type.LayerFinished
- });
- return this;
- };
-
- Caman.prototype.executeLayer = function(layer) {
- return this.pushContext(layer);
- };
-
- Caman.prototype.pushContext = function(layer) {
- this.layerStack.push(this.currentLayer);
- this.pixelStack.push(this.pixelData);
- this.currentLayer = layer;
- return this.pixelData = layer.pixelData;
- };
-
- Caman.prototype.popContext = function() {
- this.pixelData = this.pixelStack.pop();
- return this.currentLayer = this.layerStack.pop();
- };
-
- Caman.prototype.applyCurrentLayer = function() {
- return this.currentLayer.applyToParent();
- };
-
- return Caman;
-
- })(Module);
-
- Root.Caman = Caman;
-
- Caman.Analyze = (function() {
- function Analyze(c) {
- this.c = c;
- }
-
- Analyze.prototype.calculateLevels = function() {
- var i, levels, numPixels, _i, _j, _k, _ref;
-
- levels = {
- r: {},
- g: {},
- b: {}
- };
- for (i = _i = 0; _i <= 255; i = ++_i) {
- levels.r[i] = 0;
- levels.g[i] = 0;
- levels.b[i] = 0;
- }
- for (i = _j = 0, _ref = this.c.pixelData.length; _j < _ref; i = _j += 4) {
- levels.r[this.c.pixelData[i]]++;
- levels.g[this.c.pixelData[i + 1]]++;
- levels.b[this.c.pixelData[i + 2]]++;
- }
- numPixels = this.c.pixelData.length / 4;
- for (i = _k = 0; _k <= 255; i = ++_k) {
- levels.r[i] /= numPixels;
- levels.g[i] /= numPixels;
- levels.b[i] /= numPixels;
- }
- return levels;
- };
-
- return Analyze;
-
- })();
-
- Analyze = Caman.Analyze;
-
- Caman.DOMUpdated = function() {
- var img, imgs, parser, _i, _len, _results;
-
- imgs = document.querySelectorAll("img[data-caman]");
- if (!(imgs.length > 0)) {
- return;
- }
- _results = [];
- for (_i = 0, _len = imgs.length; _i < _len; _i++) {
- img = imgs[_i];
- _results.push(parser = new CamanParser(img, function() {
- this.parse();
- return this.execute();
- }));
- }
- return _results;
- };
-
- if (Caman.autoload) {
- (function() {
- if (document.readyState === "complete") {
- return Caman.DOMUpdated();
- } else {
- return document.addEventListener("DOMContentLoaded", Caman.DOMUpdated, false);
- }
- })();
- }
-
- CamanParser = (function() {
- var INST_REGEX;
-
- INST_REGEX = "(\\w+)\\((.*?)\\)";
-
- function CamanParser(ele, ready) {
- this.dataStr = ele.getAttribute('data-caman');
- this.caman = Caman(ele, ready.bind(this));
- }
-
- CamanParser.prototype.parse = function() {
- var args, e, filter, func, inst, instFunc, m, r, unparsedInstructions, _i, _len, _ref, _results;
-
- this.ele = this.caman.canvas;
- r = new RegExp(INST_REGEX, 'g');
- unparsedInstructions = this.dataStr.match(r);
- if (!(unparsedInstructions.length > 0)) {
- return;
- }
- r = new RegExp(INST_REGEX);
- _results = [];
- for (_i = 0, _len = unparsedInstructions.length; _i < _len; _i++) {
- inst = unparsedInstructions[_i];
- _ref = inst.match(r), m = _ref[0], filter = _ref[1], args = _ref[2];
- instFunc = new Function("return function() { this." + filter + "(" + args + "); };");
- try {
- func = instFunc();
- _results.push(func.call(this.caman));
- } catch (_error) {
- e = _error;
- _results.push(Log.debug(e));
- }
- }
- return _results;
- };
-
- CamanParser.prototype.execute = function() {
- var ele;
-
- ele = this.ele;
- return this.caman.render(function() {
- return ele.parentNode.replaceChild(this.toImage(), ele);
- });
- };
-
- return CamanParser;
-
- })();
-
- Caman.Blender = (function() {
- function Blender() {}
-
- Blender.blenders = {};
-
- Blender.register = function(name, func) {
- return this.blenders[name] = func;
- };
-
- Blender.execute = function(name, rgbaLayer, rgbaParent) {
- return this.blenders[name](rgbaLayer, rgbaParent);
- };
-
- return Blender;
-
- })();
-
- Blender = Caman.Blender;
-
- Caman.Calculate = (function() {
- function Calculate() {}
-
- Calculate.distance = function(x1, y1, x2, y2) {
- return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
- };
-
- Calculate.randomRange = function(min, max, getFloat) {
- var rand;
-
- if (getFloat == null) {
- getFloat = false;
- }
- rand = min + (Math.random() * (max - min));
- if (getFloat) {
- return rand.toFixed(getFloat);
- } else {
- return Math.round(rand);
- }
- };
-
- Calculate.luminance = function(rgba) {
- return (0.299 * rgba.r) + (0.587 * rgba.g) + (0.114 * rgba.b);
- };
-
- Calculate.bezier = function(start, ctrl1, ctrl2, end, lowBound, highBound) {
- var Ax, Ay, Bx, By, Cx, Cy, bezier, curveX, curveY, i, j, leftCoord, rightCoord, t, x0, x1, x2, x3, y0, y1, y2, y3, _i, _j, _k, _ref, _ref1;
-
- x0 = start[0];
- y0 = start[1];
- x1 = ctrl1[0];
- y1 = ctrl1[1];
- x2 = ctrl2[0];
- y2 = ctrl2[1];
- x3 = end[0];
- y3 = end[1];
- bezier = {};
- Cx = parseInt(3 * (x1 - x0), 10);
- Bx = 3 * (x2 - x1) - Cx;
- Ax = x3 - x0 - Cx - Bx;
- Cy = 3 * (y1 - y0);
- By = 3 * (y2 - y1) - Cy;
- Ay = y3 - y0 - Cy - By;
- for (i = _i = 0; _i < 1000; i = ++_i) {
- t = i / 1000;
- curveX = Math.round((Ax * Math.pow(t, 3)) + (Bx * Math.pow(t, 2)) + (Cx * t) + x0);
- curveY = Math.round((Ay * Math.pow(t, 3)) + (By * Math.pow(t, 2)) + (Cy * t) + y0);
- if (lowBound && curveY < lowBound) {
- curveY = lowBound;
- } else if (highBound && curveY > highBound) {
- curveY = highBound;
- }
- bezier[curveX] = curveY;
- }
- if (bezier.length < end[0] + 1) {
- for (i = _j = 0, _ref = end[0]; 0 <= _ref ? _j <= _ref : _j >= _ref; i = 0 <= _ref ? ++_j : --_j) {
- if (bezier[i] == null) {
- leftCoord = [i - 1, bezier[i - 1]];
- for (j = _k = i, _ref1 = end[0]; i <= _ref1 ? _k <= _ref1 : _k >= _ref1; j = i <= _ref1 ? ++_k : --_k) {
- if (bezier[j] != null) {
- rightCoord = [j, bezier[j]];
- break;
- }
- }
- bezier[i] = leftCoord[1] + ((rightCoord[1] - leftCoord[1]) / (rightCoord[0] - leftCoord[0])) * (i - leftCoord[0]);
- }
- }
- }
- if (bezier[end[0]] == null) {
- bezier[end[0]] = bezier[end[0] - 1];
- }
- return bezier;
- };
-
- return Calculate;
-
- })();
-
- Calculate = Caman.Calculate;
-
- Caman.Convert = (function() {
- function Convert() {}
-
- Convert.hexToRGB = function(hex) {
- var b, g, r;
-
- if (hex.charAt(0) === "#") {
- hex = hex.substr(1);
- }
- r = parseInt(hex.substr(0, 2), 16);
- g = parseInt(hex.substr(2, 2), 16);
- b = parseInt(hex.substr(4, 2), 16);
- return {
- r: r,
- g: g,
- b: b
- };
- };
-
- Convert.rgbToHSL = function(r, g, b) {
- var d, h, l, max, min, s;
-
- if (typeof r === "object") {
- g = r.g;
- b = r.b;
- r = r.r;
- }
- r /= 255;
- g /= 255;
- b /= 255;
- max = Math.max(r, g, b);
- min = Math.min(r, g, b);
- l = (max + min) / 2;
- if (max === min) {
- h = s = 0;
- } else {
- d = max - min;
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
- h = (function() {
- switch (max) {
- case r:
- return (g - b) / d + (g < b ? 6 : 0);
- case g:
- return (b - r) / d + 2;
- case b:
- return (r - g) / d + 4;
- }
- })();
- h /= 6;
- }
- return {
- h: h,
- s: s,
- l: l
- };
- };
-
- Convert.hslToRGB = function(h, s, l) {
- var b, g, p, q, r;
-
- if (typeof h === "object") {
- s = h.s;
- l = h.l;
- h = h.h;
- }
- if (s === 0) {
- r = g = b = l;
- } else {
- q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- p = 2 * l - q;
- r = this.hueToRGB(p, q, h + 1 / 3);
- g = this.hueToRGB(p, q, h);
- b = this.hueToRGB(p, q, h - 1 / 3);
- }
- return {
- r: r * 255,
- g: g * 255,
- b: b * 255
- };
- };
-
- Convert.hueToRGB = function(p, q, t) {
- if (t < 0) {
- t += 1;
- }
- if (t > 1) {
- t -= 1;
- }
- if (t < 1 / 6) {
- return p + (q - p) * 6 * t;
- }
- if (t < 1 / 2) {
- return q;
- }
- if (t < 2 / 3) {
- return p + (q - p) * (2 / 3 - t) * 6;
- }
- return p;
- };
-
- Convert.rgbToHSV = function(r, g, b) {
- var d, h, max, min, s, v;
-
- r /= 255;
- g /= 255;
- b /= 255;
- max = Math.max(r, g, b);
- min = Math.min(r, g, b);
- v = max;
- d = max - min;
- s = max === 0 ? 0 : d / max;
- if (max === min) {
- h = 0;
- } else {
- h = (function() {
- switch (max) {
- case r:
- return (g - b) / d + (g < b ? 6 : 0);
- case g:
- return (b - r) / d + 2;
- case b:
- return (r - g) / d + 4;
- }
- })();
- h /= 6;
- }
- return {
- h: h,
- s: s,
- v: v
- };
- };
-
- Convert.hsvToRGB = function(h, s, v) {
- var b, f, g, i, p, q, r, t;
-
- i = Math.floor(h * 6);
- f = h * 6 - i;
- p = v * (1 - s);
- q = v * (1 - f * s);
- t = v * (1 - (1 - f) * s);
- switch (i % 6) {
- case 0:
- r = v;
- g = t;
- b = p;
- break;
- case 1:
- r = q;
- g = v;
- b = p;
- break;
- case 2:
- r = p;
- g = v;
- b = t;
- break;
- case 3:
- r = p;
- g = q;
- b = v;
- break;
- case 4:
- r = t;
- g = p;
- b = v;
- break;
- case 5:
- r = v;
- g = p;
- b = q;
- }
- return {
- r: Math.floor(r * 255),
- g: Math.floor(g * 255),
- b: Math.floor(b * 255)
- };
- };
-
- Convert.rgbToXYZ = function(r, g, b) {
- var x, y, z;
-
- r /= 255;
- g /= 255;
- b /= 255;
- if (r > 0.04045) {
- r = Math.pow((r + 0.055) / 1.055, 2.4);
- } else {
- r /= 12.92;
- }
- if (g > 0.04045) {
- g = Math.pow((g + 0.055) / 1.055, 2.4);
- } else {
- g /= 12.92;
- }
- if (b > 0.04045) {
- b = Math.pow((b + 0.055) / 1.055, 2.4);
- } else {
- b /= 12.92;
- }
- x = r * 0.4124 + g * 0.3576 + b * 0.1805;
- y = r * 0.2126 + g * 0.7152 + b * 0.0722;
- z = r * 0.0193 + g * 0.1192 + b * 0.9505;
- return {
- x: x * 100,
- y: y * 100,
- z: z * 100
- };
- };
-
- Convert.xyzToRGB = function(x, y, z) {
- var b, g, r;
-
- x /= 100;
- y /= 100;
- z /= 100;
- r = (3.2406 * x) + (-1.5372 * y) + (-0.4986 * z);
- g = (-0.9689 * x) + (1.8758 * y) + (0.0415 * z);
- b = (0.0557 * x) + (-0.2040 * y) + (1.0570 * z);
- if (r > 0.0031308) {
- r = (1.055 * Math.pow(r, 0.4166666667)) - 0.055;
- } else {
- r *= 12.92;
- }
- if (g > 0.0031308) {
- g = (1.055 * Math.pow(g, 0.4166666667)) - 0.055;
- } else {
- g *= 12.92;
- }
- if (b > 0.0031308) {
- b = (1.055 * Math.pow(b, 0.4166666667)) - 0.055;
- } else {
- b *= 12.92;
- }
- return {
- r: r * 255,
- g: g * 255,
- b: b * 255
- };
- };
-
- Convert.xyzToLab = function(x, y, z) {
- var a, b, l, whiteX, whiteY, whiteZ;
-
- if (typeof x === "object") {
- y = x.y;
- z = x.z;
- x = x.x;
- }
- whiteX = 95.047;
- whiteY = 100.0;
- whiteZ = 108.883;
- x /= whiteX;
- y /= whiteY;
- z /= whiteZ;
- if (x > 0.008856451679) {
- x = Math.pow(x, 0.3333333333);
- } else {
- x = (7.787037037 * x) + 0.1379310345;
- }
- if (y > 0.008856451679) {
- y = Math.pow(y, 0.3333333333);
- } else {
- y = (7.787037037 * y) + 0.1379310345;
- }
- if (z > 0.008856451679) {
- z = Math.pow(z, 0.3333333333);
- } else {
- z = (7.787037037 * z) + 0.1379310345;
- }
- l = 116 * y - 16;
- a = 500 * (x - y);
- b = 200 * (y - z);
- return {
- l: l,
- a: a,
- b: b
- };
- };
-
- Convert.labToXYZ = function(l, a, b) {
- var x, y, z;
-
- if (typeof l === "object") {
- a = l.a;
- b = l.b;
- l = l.l;
- }
- y = (l + 16) / 116;
- x = y + (a / 500);
- z = y - (b / 200);
- if (x > 0.2068965517) {
- x = x * x * x;
- } else {
- x = 0.1284185493 * (x - 0.1379310345);
- }
- if (y > 0.2068965517) {
- y = y * y * y;
- } else {
- y = 0.1284185493 * (y - 0.1379310345);
- }
- if (z > 0.2068965517) {
- z = z * z * z;
- } else {
- z = 0.1284185493 * (z - 0.1379310345);
- }
- return {
- x: x * 95.047,
- y: y * 100.0,
- z: z * 108.883
- };
- };
-
- Convert.rgbToLab = function(r, g, b) {
- var xyz;
-
- if (typeof r === "object") {
- g = r.g;
- b = r.b;
- r = r.r;
- }
- xyz = this.rgbToXYZ(r, g, b);
- return this.xyzToLab(xyz);
- };
-
- Convert.labToRGB = function(l, a, b) {};
-
- return Convert;
-
- })();
-
- Convert = Caman.Convert;
-
- Caman.Event = (function() {
- function Event() {}
-
- Event.events = {};
-
- Event.types = ["processStart", "processComplete", "renderStart", "renderFinished", "blockStarted", "blockFinished"];
-
- Event.trigger = function(target, type, data) {
- var event, _i, _len, _ref, _results;
-
- if (data == null) {
- data = null;
- }
- if (this.events[type] && this.events[type].length) {
- _ref = this.events[type];
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- event = _ref[_i];
- if (event.target === null || target.id === event.target.id) {
- _results.push(event.fn.call(target, data));
- } else {
- _results.push(void 0);
- }
- }
- return _results;
- }
- };
-
- Event.listen = function(target, type, fn) {
- var _fn, _type;
-
- if (typeof target === "string") {
- _type = target;
- _fn = type;
- target = null;
- type = _type;
- fn = _fn;
- }
- if (__indexOf.call(this.types, type) < 0) {
- return false;
- }
- if (!this.events[type]) {
- this.events[type] = [];
- }
- this.events[type].push({
- target: target,
- fn: fn
- });
- return true;
- };
-
- return Event;
-
- })();
-
- Event = Caman.Event;
-
- Caman.Filter = (function() {
- function Filter() {}
-
- Filter.Type = {
- Single: 1,
- Kernel: 2,
- LayerDequeue: 3,
- LayerFinished: 4,
- LoadOverlay: 5,
- Plugin: 6
- };
-
- Filter.register = function(name, filterFunc) {
- return Caman.prototype[name] = filterFunc;
- };
-
- return Filter;
-
- })();
-
- Filter = Caman.Filter;
-
- Caman.IO = (function() {
- function IO() {}
-
- IO.domainRegex = /(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/;
-
- IO.isRemote = function(img) {
- if (img == null) {
- return false;
- }
- if (this.corsEnabled(img)) {
- return false;
- }
- return this.isURLRemote(img.src);
- };
-
- IO.corsEnabled = function(img) {
- var _ref;
-
- return (img.crossOrigin != null) && ((_ref = img.crossOrigin.toLowerCase()) === 'anonymous' || _ref === 'use-credentials');
- };
-
- IO.isURLRemote = function(url) {
- var matches;
-
- matches = url.match(this.domainRegex);
- if (matches) {
- return matches[1] !== document.domain;
- } else {
- return false;
- }
- };
-
- IO.remoteCheck = function(src) {
- if (this.isURLRemote(src)) {
- if (!Caman.remoteProxy.length) {
- Log.info("Attempting to load a remote image without a configured proxy. URL: " + src);
- } else {
- if (Caman.isURLRemote(Caman.remoteProxy)) {
- Log.info("Cannot use a remote proxy for loading images.");
- return;
- }
- return this.proxyUrl(src);
- }
- }
- };
-
- IO.proxyUrl = function(src) {
- return "" + Caman.remoteProxy + "?" + Caman.proxyParam + "=" + (encodeURIComponent(src));
- };
-
- IO.useProxy = function(lang) {
- var langToExt;
-
- langToExt = {
- ruby: 'rb',
- python: 'py',
- perl: 'pl',
- javascript: 'js'
- };
- lang = lang.toLowerCase();
- if (langToExt[lang] != null) {
- lang = langToExt[lang];
- }
- return "proxies/caman_proxy." + lang;
- };
-
- return IO;
-
- })();
-
- Caman.prototype.save = function() {
- if (typeof exports !== "undefined" && exports !== null) {
- return this.nodeSave.apply(this, arguments);
- } else {
- return this.browserSave.apply(this, arguments);
- }
- };
-
- Caman.prototype.browserSave = function(type) {
- var image;
-
- if (type == null) {
- type = "png";
- }
- type = type.toLowerCase();
- image = this.toBase64(type).replace("image/" + type, "image/octet-stream");
- return document.location.href = image;
- };
-
- Caman.prototype.nodeSave = function(file, overwrite) {
- var e, stats;
-
- if (overwrite == null) {
- overwrite = true;
- }
- try {
- stats = fs.statSync(file);
- if (stats.isFile() && !overwrite) {
- return false;
- }
- } catch (_error) {
- e = _error;
- Log.debug("Creating output file " + file);
- }
- return fs.writeFile(file, this.canvas.toBuffer(), function() {
- return Log.debug("Finished writing to " + file);
- });
- };
-
- Caman.prototype.toImage = function(type) {
- var img;
-
- img = document.createElement('img');
- img.src = this.toBase64(type);
- img.width = this.dimensions.width;
- img.height = this.dimensions.height;
- if (window.devicePixelRatio) {
- img.width /= window.devicePixelRatio;
- img.height /= window.devicePixelRatio;
- }
- return img;
- };
-
- Caman.prototype.toBase64 = function(type) {
- if (type == null) {
- type = "png";
- }
- type = type.toLowerCase();
- return this.canvas.toDataURL("image/" + type);
- };
-
- IO = Caman.IO;
-
- Caman.Layer = (function() {
- function Layer(c) {
- this.c = c;
- this.filter = this.c;
- this.options = {
- blendingMode: 'normal',
- opacity: 1.0
- };
- this.layerID = Util.uniqid.get();
- this.canvas = typeof exports !== "undefined" && exports !== null ? new Canvas() : document.createElement('canvas');
- this.canvas.width = this.c.dimensions.width;
- this.canvas.height = this.c.dimensions.height;
- this.context = this.canvas.getContext('2d');
- this.context.createImageData(this.canvas.width, this.canvas.height);
- this.imageData = this.context.getImageData(0, 0, this.canvas.width, this.canvas.height);
- this.pixelData = this.imageData.data;
- }
-
- Layer.prototype.newLayer = function(cb) {
- return this.c.newLayer.call(this.c, cb);
- };
-
- Layer.prototype.setBlendingMode = function(mode) {
- this.options.blendingMode = mode;
- return this;
- };
-
- Layer.prototype.opacity = function(opacity) {
- this.options.opacity = opacity / 100;
- return this;
- };
-
- Layer.prototype.copyParent = function() {
- var i, parentData, _i, _ref;
-
- parentData = this.c.pixelData;
- for (i = _i = 0, _ref = this.c.pixelData.length; _i < _ref; i = _i += 4) {
- this.pixelData[i] = parentData[i];
- this.pixelData[i + 1] = parentData[i + 1];
- this.pixelData[i + 2] = parentData[i + 2];
- this.pixelData[i + 3] = parentData[i + 3];
- }
- return this;
- };
-
- Layer.prototype.fillColor = function() {
- return this.c.fillColor.apply(this.c, arguments);
- };
-
- Layer.prototype.overlayImage = function(image) {
- if (typeof image === "object") {
- image = image.src;
- } else if (typeof image === "string" && image[0] === "#") {
- image = $(image).src;
- }
- if (!image) {
- return this;
- }
- this.c.renderer.renderQueue.push({
- type: Filter.Type.LoadOverlay,
- src: image,
- layer: this
- });
- return this;
- };
-
- Layer.prototype.applyToParent = function() {
- var i, layerData, parentData, result, rgbaLayer, rgbaParent, _i, _ref, _results;
-
- parentData = this.c.pixelStack[this.c.pixelStack.length - 1];
- layerData = this.c.pixelData;
- _results = [];
- for (i = _i = 0, _ref = layerData.length; _i < _ref; i = _i += 4) {
- rgbaParent = {
- r: parentData[i],
- g: parentData[i + 1],
- b: parentData[i + 2],
- a: parentData[i + 3]
- };
- rgbaLayer = {
- r: layerData[i],
- g: layerData[i + 1],
- b: layerData[i + 2],
- a: layerData[i + 3]
- };
- result = Blender.execute(this.options.blendingMode, rgbaLayer, rgbaParent);
- result.r = Util.clampRGB(result.r);
- result.g = Util.clampRGB(result.g);
- result.b = Util.clampRGB(result.b);
- if (result.a == null) {
- result.a = rgbaLayer.a;
- }
- parentData[i] = rgbaParent.r - ((rgbaParent.r - result.r) * (this.options.opacity * (result.a / 255)));
- parentData[i + 1] = rgbaParent.g - ((rgbaParent.g - result.g) * (this.options.opacity * (result.a / 255)));
- _results.push(parentData[i + 2] = rgbaParent.b - ((rgbaParent.b - result.b) * (this.options.opacity * (result.a / 255))));
- }
- return _results;
- };
-
- return Layer;
-
- })();
-
- Layer = Caman.Layer;
-
- Caman.Logger = (function() {
- function Logger() {
- var name, _i, _len, _ref;
-
- _ref = ['log', 'info', 'warn', 'error'];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- name = _ref[_i];
- this[name] = (function(name) {
- return function() {
- var args, e;
-
- args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
- if (!Caman.DEBUG) {
- return;
- }
- try {
- return console[name].apply(console, args);
- } catch (_error) {
- e = _error;
- return console[name](args);
- }
- };
- })(name);
- }
- this.debug = this.log;
- }
-
- return Logger;
-
- })();
-
- Log = new Caman.Logger();
-
- Caman.Pixel = (function() {
- Pixel.coordinatesToLocation = function(x, y, width) {
- return (y * width + x) * 4;
- };
-
- Pixel.locationToCoordinates = function(loc, width) {
- var x, y;
-
- y = Math.floor(loc / (width * 4));
- x = (loc % (width * 4)) / 4;
- return {
- x: x,
- y: y
- };
- };
-
- function Pixel(r, g, b, a, c) {
- this.r = r != null ? r : 0;
- this.g = g != null ? g : 0;
- this.b = b != null ? b : 0;
- this.a = a != null ? a : 255;
- this.c = c != null ? c : null;
- this.loc = 0;
- }
-
- Pixel.prototype.setContext = function(c) {
- return this.c = c;
- };
-
- Pixel.prototype.locationXY = function() {
- var x, y;
-
- if (this.c == null) {
- throw "Requires a CamanJS context";
- }
- y = this.c.dimensions.height - Math.floor(this.loc / (this.c.dimensions.width * 4));
- x = (this.loc % (this.c.dimensions.width * 4)) / 4;
- return {
- x: x,
- y: y
- };
- };
-
- Pixel.prototype.pixelAtLocation = function(loc) {
- if (this.c == null) {
- throw "Requires a CamanJS context";
- }
- return new Pixel(this.c.pixelData[loc], this.c.pixelData[loc + 1], this.c.pixelData[loc + 2], this.c.pixelData[loc + 3], this.c);
- };
-
- Pixel.prototype.getPixelRelative = function(horiz, vert) {
- var newLoc;
-
- if (this.c == null) {
- throw "Requires a CamanJS context";
- }
- newLoc = this.loc + (this.c.dimensions.width * 4 * (vert * -1)) + (4 * horiz);
- if (newLoc > this.c.pixelData.length || newLoc < 0) {
- return new Pixel(0, 0, 0, 255, this.c);
- }
- return this.pixelAtLocation(newLoc);
- };
-
- Pixel.prototype.putPixelRelative = function(horiz, vert, rgba) {
- var nowLoc;
-
- if (this.c == null) {
- throw "Requires a CamanJS context";
- }
- nowLoc = this.loc + (this.c.dimensions.width * 4 * (vert * -1)) + (4 * horiz);
- if (newLoc > this.c.pixelData.length || newLoc < 0) {
- return;
- }
- this.c.pixelData[newLoc] = rgba.r;
- this.c.pixelData[newLoc + 1] = rgba.g;
- this.c.pixelData[newLoc + 2] = rgba.b;
- this.c.pixelData[newLoc + 3] = rgba.a;
- return true;
- };
-
- Pixel.prototype.getPixel = function(x, y) {
- var loc;
-
- if (this.c == null) {
- throw "Requires a CamanJS context";
- }
- loc = this.coordinatesToLocation(x, y, this.width);
- return this.pixelAtLocation(loc);
- };
-
- Pixel.prototype.putPixel = function(x, y, rgba) {
- var loc;
-
- if (this.c == null) {
- throw "Requires a CamanJS context";
- }
- loc = this.coordinatesToLocation(x, y, this.width);
- this.c.pixelData[loc] = rgba.r;
- this.c.pixelData[loc + 1] = rgba.g;
- this.c.pixelData[loc + 2] = rgba.b;
- return this.c.pixelData[loc + 3] = rgba.a;
- };
-
- Pixel.prototype.toString = function() {
- return this.toKey();
- };
-
- Pixel.prototype.toHex = function(includeAlpha) {
- var hex;
-
- if (includeAlpha == null) {
- includeAlpha = false;
- }
- hex = '#' + this.r.toString(16) + this.g.toString(16) + this.b.toString(16);
- if (includeAlpha) {
- return hex + this.a.toString(16);
- } else {
- return hex;
- }
- };
-
- return Pixel;
-
- })();
-
- Pixel = Caman.Pixel;
-
- Caman.Plugin = (function() {
- function Plugin() {}
-
- Plugin.plugins = {};
-
- Plugin.register = function(name, plugin) {
- return this.plugins[name] = plugin;
- };
-
- Plugin.execute = function(context, name, args) {
- return this.plugins[name].apply(context, args);
- };
-
- return Plugin;
-
- })();
-
- Plugin = Caman.Plugin;
-
- Caman.Renderer = (function() {
- Renderer.Blocks = Caman.NodeJS ? require('os').cpus().length : 4;
-
- function Renderer(c) {
- this.c = c;
- this.processNext = __bind(this.processNext, this);
- this.renderQueue = [];
- this.modPixelData = null;
- }
-
- Renderer.prototype.add = function(job) {
- if (job == null) {
- return;
- }
- return this.renderQueue.push(job);
- };
-
- Renderer.prototype.processNext = function() {
- var layer;
-
- if (this.renderQueue.length === 0) {
- Event.trigger(this, "renderFinished");
- if (this.finishedFn != null) {
- this.finishedFn.call(this.c);
- }
- return this;
- }
- this.currentJob = this.renderQueue.shift();
- switch (this.currentJob.type) {
- case Filter.Type.LayerDequeue:
- layer = this.c.canvasQueue.shift();
- this.c.executeLayer(layer);
- return this.processNext();
- case Filter.Type.LayerFinished:
- this.c.applyCurrentLayer();
- this.c.popContext();
- return this.processNext();
- case Filter.Type.LoadOverlay:
- return this.loadOverlay(this.currentJob.layer, this.currentJob.src);
- case Filter.Type.Plugin:
- return this.executePlugin();
- default:
- return this.executeFilter();
- }
- };
-
- Renderer.prototype.execute = function(callback) {
- this.finishedFn = callback;
- this.modPixelData = Util.dataArray(this.c.pixelData.length);
- return this.processNext();
- };
-
- Renderer.prototype.eachBlock = function(fn) {
- var blockN, blockPixelLength, bnum, end, f, i, lastBlockN, n, start, _i, _ref, _results,
- _this = this;
-
- this.blocksDone = 0;
- n = this.c.pixelData.length;
- blockPixelLength = Math.floor((n / 4) / Renderer.Blocks);
- blockN = blockPixelLength * 4;
- lastBlockN = blockN + ((n / 4) % Renderer.Blocks) * 4;
- _results = [];
- for (i = _i = 0, _ref = Renderer.Blocks; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
- start = i * blockN;
- end = start + (i === Renderer.Blocks - 1 ? lastBlockN : blockN);
- if (Caman.NodeJS) {
- f = Fiber(function() {
- return fn.call(_this, i, start, end);
- });
- bnum = f.run();
- _results.push(this.blockFinished(bnum));
- } else {
- _results.push(setTimeout((function(i, start, end) {
- return function() {
- return fn.call(_this, i, start, end);
- };
- })(i, start, end), 0));
- }
- }
- return _results;
- };
-
- Renderer.prototype.executeFilter = function() {
- Event.trigger(this.c, "processStart", this.currentJob);
- if (this.currentJob.type === Filter.Type.Single) {
- return this.eachBlock(this.renderBlock);
- } else {
- return this.eachBlock(this.renderKernel);
- }
- };
-
- Renderer.prototype.executePlugin = function() {
- Log.debug("Executing plugin " + this.currentJob.plugin);
- Plugin.execute(this.c, this.currentJob.plugin, this.currentJob.args);
- Log.debug("Plugin " + this.currentJob.plugin + " finished!");
- return this.processNext();
- };
-
- Renderer.prototype.renderBlock = function(bnum, start, end) {
- var i, pixel, _i;
-
- Log.debug("Block #" + bnum + " - Filter: " + this.currentJob.name + ", Start: " + start + ", End: " + end);
- Event.trigger(this.c, "blockStarted", {
- blockNum: bnum,
- totalBlocks: Renderer.Blocks,
- startPixel: start,
- endPixel: end
- });
- pixel = new Pixel();
- pixel.setContext(this.c);
- for (i = _i = start; _i < end; i = _i += 4) {
- pixel.loc = i;
- pixel.r = this.c.pixelData[i];
- pixel.g = this.c.pixelData[i + 1];
- pixel.b = this.c.pixelData[i + 2];
- pixel.a = this.c.pixelData[i + 3];
- this.currentJob.processFn(pixel);
- this.c.pixelData[i] = Util.clampRGB(pixel.r);
- this.c.pixelData[i + 1] = Util.clampRGB(pixel.g);
- this.c.pixelData[i + 2] = Util.clampRGB(pixel.b);
- this.c.pixelData[i + 3] = Util.clampRGB(pixel.a);
- }
- if (Caman.NodeJS) {
- return Fiber["yield"](bnum);
- } else {
- return this.blockFinished(bnum);
- }
- };
-
- Renderer.prototype.renderKernel = function(bnum, start, end) {
- var adjust, adjustSize, bias, builder, builderIndex, divisor, i, j, k, kernel, n, name, p, pixel, res, _i, _j, _k;
-
- name = this.currentJob.name;
- bias = this.currentJob.bias;
- divisor = this.currentJob.divisor;
- n = this.c.pixelData.length;
- adjust = this.currentJob.adjust;
- adjustSize = Math.sqrt(adjust.length);
- kernel = [];
- Log.debug("Rendering kernel - Filter: " + this.currentJob.name);
- start = Math.max(start, this.c.dimensions.width * 4 * ((adjustSize - 1) / 2));
- end = Math.min(end, n - (this.c.dimensions.width * 4 * ((adjustSize - 1) / 2)));
- builder = (adjustSize - 1) / 2;
- pixel = new Pixel();
- pixel.setContext(this.c);
- for (i = _i = start; _i < end; i = _i += 4) {
- pixel.loc = i;
- builderIndex = 0;
- for (j = _j = -builder; -builder <= builder ? _j <= builder : _j >= builder; j = -builder <= builder ? ++_j : --_j) {
- for (k = _k = builder; builder <= -builder ? _k <= -builder : _k >= -builder; k = builder <= -builder ? ++_k : --_k) {
- p = pixel.getPixelRelative(j, k);
- kernel[builderIndex * 3] = p.r;
- kernel[builderIndex * 3 + 1] = p.g;
- kernel[builderIndex * 3 + 2] = p.b;
- builderIndex++;
- }
- }
- res = this.processKernel(adjust, kernel, divisor, bias);
- this.modPixelData[i] = Util.clampRGB(res.r);
- this.modPixelData[i + 1] = Util.clampRGB(res.g);
- this.modPixelData[i + 2] = Util.clampRGB(res.b);
- this.modPixelData[i + 3] = this.c.pixelData[i + 3];
- }
- if (Caman.NodeJS) {
- return Fiber["yield"](bnum);
- } else {
- return this.blockFinished(bnum);
- }
- };
-
- Renderer.prototype.blockFinished = function(bnum) {
- var i, _i, _ref;
-
- if (bnum >= 0) {
- Log.debug("Block #" + bnum + " finished! Filter: " + this.currentJob.name);
- }
- this.blocksDone++;
- Event.trigger(this.c, "blockFinished", {
- blockNum: bnum,
- blocksFinished: this.blocksDone,
- totalBlocks: Renderer.Blocks
- });
- if (this.blocksDone === Renderer.Blocks) {
- if (this.currentJob.type === Filter.Type.Kernel) {
- for (i = _i = 0, _ref = this.c.pixelData.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
- this.c.pixelData[i] = this.modPixelData[i];
- }
- }
- if (bnum >= 0) {
- Log.debug("Filter " + this.currentJob.name + " finished!");
- }
- Event.trigger(this.c, "processComplete", this.currentJob);
- return this.processNext();
- }
- };
-
- Renderer.prototype.processKernel = function(adjust, kernel, divisor, bias) {
- var i, val, _i, _ref;
-
- val = {
- r: 0,
- g: 0,
- b: 0
- };
- for (i = _i = 0, _ref = adjust.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
- val.r += adjust[i] * kernel[i * 3];
- val.g += adjust[i] * kernel[i * 3 + 1];
- val.b += adjust[i] * kernel[i * 3 + 2];
- }
- val.r = (val.r / divisor) + bias;
- val.g = (val.g / divisor) + bias;
- val.b = (val.b / divisor) + bias;
- return val;
- };
-
- Renderer.prototype.loadOverlay = function(layer, src) {
- var img, proxyUrl,
- _this = this;
-
- img = document.createElement('img');
- img.onload = function() {
- layer.context.drawImage(img, 0, 0, _this.c.dimensions.width, _this.c.dimensions.height);
- layer.imageData = layer.context.getImageData(0, 0, _this.c.dimensions.width, _this.c.dimensions.height);
- layer.pixelData = layer.imageData.data;
- _this.c.pixelData = layer.pixelData;
- return _this.processNext();
- };
- proxyUrl = IO.remoteCheck(src);
- return img.src = proxyUrl != null ? proxyUrl : src;
- };
-
- return Renderer;
-
- })();
-
- Renderer = Caman.Renderer;
-
- Caman.Store = (function() {
- function Store() {}
-
- Store.items = {};
-
- Store.has = function(search) {
- return this.items[search] != null;
- };
-
- Store.get = function(search) {
- return this.items[search];
- };
-
- Store.put = function(name, obj) {
- return this.items[name] = obj;
- };
-
- Store.execute = function(search, callback) {
- var _this = this;
-
- setTimeout(function() {
- return callback.call(_this.get(search), _this.get(search));
- }, 0);
- return this.get(search);
- };
-
- Store.flush = function(name) {
- if (name == null) {
- name = false;
- }
- if (name) {
- return delete this.items[name];
- } else {
- return this.items = {};
- }
- };
-
- return Store;
-
- })();
-
- Store = Caman.Store;
-
- Blender.register("normal", function(rgbaLayer, rgbaParent) {
- return {
- r: rgbaLayer.r,
- g: rgbaLayer.g,
- b: rgbaLayer.b
- };
- });
-
- Blender.register("multiply", function(rgbaLayer, rgbaParent) {
- return {
- r: (rgbaLayer.r * rgbaParent.r) / 255,
- g: (rgbaLayer.g * rgbaParent.g) / 255,
- b: (rgbaLayer.b * rgbaParent.b) / 255
- };
- });
-
- Blender.register("screen", function(rgbaLayer, rgbaParent) {
- return {
- r: 255 - (((255 - rgbaLayer.r) * (255 - rgbaParent.r)) / 255),
- g: 255 - (((255 - rgbaLayer.g) * (255 - rgbaParent.g)) / 255),
- b: 255 - (((255 - rgbaLayer.b) * (255 - rgbaParent.b)) / 255)
- };
- });
-
- Blender.register("overlay", function(rgbaLayer, rgbaParent) {
- var result;
-
- result = {};
- result.r = rgbaParent.r > 128 ? 255 - 2 * (255 - rgbaLayer.r) * (255 - rgbaParent.r) / 255 : (rgbaParent.r * rgbaLayer.r * 2) / 255;
- result.g = rgbaParent.g > 128 ? 255 - 2 * (255 - rgbaLayer.g) * (255 - rgbaParent.g) / 255 : (rgbaParent.g * rgbaLayer.g * 2) / 255;
- result.b = rgbaParent.b > 128 ? 255 - 2 * (255 - rgbaLayer.b) * (255 - rgbaParent.b) / 255 : (rgbaParent.b * rgbaLayer.b * 2) / 255;
- return result;
- });
-
- Blender.register("difference", function(rgbaLayer, rgbaParent) {
- return {
- r: rgbaLayer.r - rgbaParent.r,
- g: rgbaLayer.g - rgbaParent.g,
- b: rgbaLayer.b - rgbaParent.b
- };
- });
-
- Blender.register("addition", function(rgbaLayer, rgbaParent) {
- return {
- r: rgbaParent.r + rgbaLayer.r,
- g: rgbaParent.g + rgbaLayer.g,
- b: rgbaParent.b + rgbaLayer.b
- };
- });
-
- Blender.register("exclusion", function(rgbaLayer, rgbaParent) {
- return {
- r: 128 - 2 * (rgbaParent.r - 128) * (rgbaLayer.r - 128) / 255,
- g: 128 - 2 * (rgbaParent.g - 128) * (rgbaLayer.g - 128) / 255,
- b: 128 - 2 * (rgbaParent.b - 128) * (rgbaLayer.b - 128) / 255
- };
- });
-
- Blender.register("softLight", function(rgbaLayer, rgbaParent) {
- var result;
-
- result = {};
- result.r = rgbaParent.r > 128 ? 255 - ((255 - rgbaParent.r) * (255 - (rgbaLayer.r - 128))) / 255 : (rgbaParent.r * (rgbaLayer.r + 128)) / 255;
- result.g = rgbaParent.g > 128 ? 255 - ((255 - rgbaParent.g) * (255 - (rgbaLayer.g - 128))) / 255 : (rgbaParent.g * (rgbaLayer.g + 128)) / 255;
- result.b = rgbaParent.b > 128 ? 255 - ((255 - rgbaParent.b) * (255 - (rgbaLayer.b - 128))) / 255 : (rgbaParent.b * (rgbaLayer.b + 128)) / 255;
- return result;
- });
-
- Blender.register("lighten", function(rgbaLayer, rgbaParent) {
- return {
- r: rgbaParent.r > rgbaLayer.r ? rgbaParent.r : rgbaLayer.r,
- g: rgbaParent.g > rgbaLayer.g ? rgbaParent.g : rgbaLayer.g,
- b: rgbaParent.b > rgbaLayer.b ? rgbaParent.b : rgbaLayer.b
- };
- });
-
- Blender.register("darken", function(rgbaLayer, rgbaParent) {
- return {
- r: rgbaParent.r > rgbaLayer.r ? rgbaLayer.r : rgbaParent.r,
- g: rgbaParent.g > rgbaLayer.g ? rgbaLayer.g : rgbaParent.g,
- b: rgbaParent.b > rgbaLayer.b ? rgbaLayer.b : rgbaParent.b
- };
- });
-
- Filter.register("fillColor", function() {
- var color;
-
- if (arguments.length === 1) {
- color = Convert.hexToRGB(arguments[0]);
- } else {
- color = {
- r: arguments[0],
- g: arguments[1],
- b: arguments[2]
- };
- }
- return this.process("fillColor", function(rgba) {
- rgba.r = color.r;
- rgba.g = color.g;
- rgba.b = color.b;
- rgba.a = 255;
- return rgba;
- });
- });
-
- Filter.register("brightness", function(adjust) {
- adjust = Math.floor(255 * (adjust / 100));
- return this.process("brightness", function(rgba) {
- rgba.r += adjust;
- rgba.g += adjust;
- rgba.b += adjust;
- return rgba;
- });
- });
-
- Filter.register("saturation", function(adjust) {
- adjust *= -0.01;
- return this.process("saturation", function(rgba) {
- var max;
-
- max = Math.max(rgba.r, rgba.g, rgba.b);
- if (rgba.r !== max) {
- rgba.r += (max - rgba.r) * adjust;
- }
- if (rgba.g !== max) {
- rgba.g += (max - rgba.g) * adjust;
- }
- if (rgba.b !== max) {
- rgba.b += (max - rgba.b) * adjust;
- }
- return rgba;
- });
- });
-
- Filter.register("vibrance", function(adjust) {
- adjust *= -1;
- return this.process("vibrance", function(rgba) {
- var amt, avg, max;
-
- max = Math.max(rgba.r, rgba.g, rgba.b);
- avg = (rgba.r + rgba.g + rgba.b) / 3;
- amt = ((Math.abs(max - avg) * 2 / 255) * adjust) / 100;
- if (rgba.r !== max) {
- rgba.r += (max - rgba.r) * amt;
- }
- if (rgba.g !== max) {
- rgba.g += (max - rgba.g) * amt;
- }
- if (rgba.b !== max) {
- rgba.b += (max - rgba.b) * amt;
- }
- return rgba;
- });
- });
-
- Filter.register("greyscale", function(adjust) {
- return this.process("greyscale", function(rgba) {
- var avg;
-
- avg = Calculate.luminance(rgba);
- rgba.r = avg;
- rgba.g = avg;
- rgba.b = avg;
- return rgba;
- });
- });
-
- Filter.register("contrast", function(adjust) {
- adjust = Math.pow((adjust + 100) / 100, 2);
- return this.process("contrast", function(rgba) {
- rgba.r /= 255;
- rgba.r -= 0.5;
- rgba.r *= adjust;
- rgba.r += 0.5;
- rgba.r *= 255;
- rgba.g /= 255;
- rgba.g -= 0.5;
- rgba.g *= adjust;
- rgba.g += 0.5;
- rgba.g *= 255;
- rgba.b /= 255;
- rgba.b -= 0.5;
- rgba.b *= adjust;
- rgba.b += 0.5;
- rgba.b *= 255;
- return rgba;
- });
- });
-
- Filter.register("hue", function(adjust) {
- return this.process("hue", function(rgba) {
- var b, g, h, hsv, r, _ref;
-
- hsv = Convert.rgbToHSV(rgba.r, rgba.g, rgba.b);
- h = hsv.h * 100;
- h += Math.abs(adjust);
- h = h % 100;
- h /= 100;
- hsv.h = h;
- _ref = Convert.hsvToRGB(hsv.h, hsv.s, hsv.v), r = _ref.r, g = _ref.g, b = _ref.b;
- rgba.r = r;
- rgba.g = g;
- rgba.b = b;
- return rgba;
- });
- });
-
- Filter.register("colorize", function() {
- var level, rgb;
-
- if (arguments.length === 2) {
- rgb = Convert.hexToRGB(arguments[0]);
- level = arguments[1];
- } else if (arguments.length === 4) {
- rgb = {
- r: arguments[0],
- g: arguments[1],
- b: arguments[2]
- };
- level = arguments[3];
- }
- return this.process("colorize", function(rgba) {
- rgba.r -= (rgba.r - rgb.r) * (level / 100);
- rgba.g -= (rgba.g - rgb.g) * (level / 100);
- rgba.b -= (rgba.b - rgb.b) * (level / 100);
- return rgba;
- });
- });
-
- Filter.register("invert", function() {
- return this.process("invert", function(rgba) {
- rgba.r = 255 - rgba.r;
- rgba.g = 255 - rgba.g;
- rgba.b = 255 - rgba.b;
- return rgba;
- });
- });
-
- Filter.register("sepia", function(adjust) {
- if (adjust == null) {
- adjust = 100;
- }
- adjust /= 100;
- return this.process("sepia", function(rgba) {
- rgba.r = Math.min(255, (rgba.r * (1 - (0.607 * adjust))) + (rgba.g * (0.769 * adjust)) + (rgba.b * (0.189 * adjust)));
- rgba.g = Math.min(255, (rgba.r * (0.349 * adjust)) + (rgba.g * (1 - (0.314 * adjust))) + (rgba.b * (0.168 * adjust)));
- rgba.b = Math.min(255, (rgba.r * (0.272 * adjust)) + (rgba.g * (0.534 * adjust)) + (rgba.b * (1 - (0.869 * adjust))));
- return rgba;
- });
- });
-
- Filter.register("gamma", function(adjust) {
- return this.process("gamma", function(rgba) {
- rgba.r = Math.pow(rgba.r / 255, adjust) * 255;
- rgba.g = Math.pow(rgba.g / 255, adjust) * 255;
- rgba.b = Math.pow(rgba.b / 255, adjust) * 255;
- return rgba;
- });
- });
-
- Filter.register("noise", function(adjust) {
- adjust = Math.abs(adjust) * 2.55;
- return this.process("noise", function(rgba) {
- var rand;
-
- rand = Calculate.randomRange(adjust * -1, adjust);
- rgba.r += rand;
- rgba.g += rand;
- rgba.b += rand;
- return rgba;
- });
- });
-
- Filter.register("clip", function(adjust) {
- adjust = Math.abs(adjust) * 2.55;
- return this.process("clip", function(rgba) {
- if (rgba.r > 255 - adjust) {
- rgba.r = 255;
- } else if (rgba.r < adjust) {
- rgba.r = 0;
- }
- if (rgba.g > 255 - adjust) {
- rgba.g = 255;
- } else if (rgba.g < adjust) {
- rgba.g = 0;
- }
- if (rgba.b > 255 - adjust) {
- rgba.b = 255;
- } else if (rgba.b < adjust) {
- rgba.b = 0;
- }
- return rgba;
- });
- });
-
- Filter.register("channels", function(options) {
- var chan, value;
-
- if (typeof options !== "object") {
- return this;
- }
- for (chan in options) {
- if (!__hasProp.call(options, chan)) continue;
- value = options[chan];
- if (value === 0) {
- delete options[chan];
- continue;
- }
- options[chan] /= 100;
- }
- if (options.length === 0) {
- return this;
- }
- return this.process("channels", function(rgba) {
- if (options.red != null) {
- if (options.red > 0) {
- rgba.r += (255 - rgba.r) * options.red;
- } else {
- rgba.r -= rgba.r * Math.abs(options.red);
- }
- }
- if (options.green != null) {
- if (options.green > 0) {
- rgba.g += (255 - rgba.g) * options.green;
- } else {
- rgba.g -= rgba.g * Math.abs(options.green);
- }
- }
- if (options.blue != null) {
- if (options.blue > 0) {
- rgba.b += (255 - rgba.b) * options.blue;
- } else {
- rgba.b -= rgba.b * Math.abs(options.blue);
- }
- }
- return rgba;
- });
- });
-
- Filter.register("curves", function() {
- var bezier, chans, cps, ctrl1, ctrl2, end, i, start, _i, _j, _ref, _ref1;
-
- chans = arguments[0], cps = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- if (typeof chans === "string") {
- chans = chans.split("");
- }
- if (chans[0] === "v") {
- chans = ['r', 'g', 'b'];
- }
- if (cps.length < 3 || cps.length > 4) {
- throw "Invalid number of arguments to curves filter";
- }
- start = cps[0];
- ctrl1 = cps[1];
- ctrl2 = cps.length === 4 ? cps[2] : cps[1];
- end = cps[cps.length - 1];
- bezier = Calculate.bezier(start, ctrl1, ctrl2, end, 0, 255);
- if (start[0] > 0) {
- for (i = _i = 0, _ref = start[0]; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
- bezier[i] = start[1];
- }
- }
- if (end[0] < 255) {
- for (i = _j = _ref1 = end[0]; _ref1 <= 255 ? _j <= 255 : _j >= 255; i = _ref1 <= 255 ? ++_j : --_j) {
- bezier[i] = end[1];
- }
- }
- return this.process("curves", function(rgba) {
- var _k, _ref2;
-
- for (i = _k = 0, _ref2 = chans.length; 0 <= _ref2 ? _k < _ref2 : _k > _ref2; i = 0 <= _ref2 ? ++_k : --_k) {
- rgba[chans[i]] = bezier[rgba[chans[i]]];
- }
- return rgba;
- });
- });
-
- Filter.register("exposure", function(adjust) {
- var ctrl1, ctrl2, p;
-
- p = Math.abs(adjust) / 100;
- ctrl1 = [0, 255 * p];
- ctrl2 = [255 - (255 * p), 255];
- if (adjust < 0) {
- ctrl1 = ctrl1.reverse();
- ctrl2 = ctrl2.reverse();
- }
- return this.curves('rgb', [0, 0], ctrl1, ctrl2, [255, 255]);
- });
-
- Caman.Plugin.register("crop", function(width, height, x, y) {
- var canvas, ctx;
-
- if (x == null) {
- x = 0;
- }
- if (y == null) {
- y = 0;
- }
- if (typeof exports !== "undefined" && exports !== null) {
- canvas = new Canvas(width, height);
- } else {
- canvas = document.createElement('canvas');
- Util.copyAttributes(this.canvas, canvas);
- canvas.width = width;
- canvas.height = height;
- }
- ctx = canvas.getContext('2d');
- ctx.drawImage(this.canvas, x, y, width, height, 0, 0, width, height);
- this.cropCoordinates = {
- x: x,
- y: y
- };
- this.cropped = true;
- return this.replaceCanvas(canvas);
- });
-
- Caman.Plugin.register("resize", function(newDims) {
- var canvas, ctx;
-
- if (newDims == null) {
- newDims = null;
- }
- if (newDims === null || ((newDims.width == null) && (newDims.height == null))) {
- Log.error("Invalid or missing dimensions given for resize");
- return;
- }
- if (newDims.width == null) {
- newDims.width = this.canvas.width * newDims.height / this.canvas.height;
- } else if (newDims.height == null) {
- newDims.height = this.canvas.height * newDims.width / this.canvas.width;
- }
- if (typeof exports !== "undefined" && exports !== null) {
- canvas = new Canvas(newDims.width, newDims.height);
- } else {
- canvas = document.createElement('canvas');
- Util.copyAttributes(this.canvas, canvas);
- canvas.width = newDims.width;
- canvas.height = newDims.height;
- }
- ctx = canvas.getContext('2d');
- ctx.drawImage(this.canvas, 0, 0, this.canvas.width, this.canvas.height, 0, 0, newDims.width, newDims.height);
- this.resized = true;
- return this.replaceCanvas(canvas);
- });
-
- Caman.Filter.register("crop", function() {
- return this.processPlugin("crop", Array.prototype.slice.call(arguments, 0));
- });
-
- Caman.Filter.register("resize", function() {
- return this.processPlugin("resize", Array.prototype.slice.call(arguments, 0));
- });
-
- Caman.Filter.register("boxBlur", function() {
- return this.processKernel("Box Blur", [1, 1, 1, 1, 1, 1, 1, 1, 1]);
- });
-
- Caman.Filter.register("heavyRadialBlur", function() {
- return this.processKernel("Heavy Radial Blur", [0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0]);
- });
-
- Caman.Filter.register("gaussianBlur", function() {
- return this.processKernel("Gaussian Blur", [1, 4, 6, 4, 1, 4, 16, 24, 16, 4, 6, 24, 36, 24, 6, 4, 16, 24, 16, 4, 1, 4, 6, 4, 1]);
- });
-
- Caman.Filter.register("motionBlur", function(degrees) {
- var kernel;
-
- if (degrees === 0 || degrees === 180) {
- kernel = [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0];
- } else if ((degrees > 0 && degrees < 90) || (degrees > 180 && degrees < 270)) {
- kernel = [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0];
- } else if (degrees === 90 || degrees === 270) {
- kernel = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
- } else {
- kernel = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];
- }
- return this.processKernel("Motion Blur", kernel);
- });
-
- Caman.Filter.register("sharpen", function(amt) {
- if (amt == null) {
- amt = 100;
- }
- amt /= 100;
- return this.processKernel("Sharpen", [0, -amt, 0, -amt, 4 * amt + 1, -amt, 0, -amt, 0]);
- });
-
- vignetteFilters = {
- brightness: function(rgba, amt, opts) {
- rgba.r = rgba.r - (rgba.r * amt * opts.strength);
- rgba.g = rgba.g - (rgba.g * amt * opts.strength);
- rgba.b = rgba.b - (rgba.b * amt * opts.strength);
- return rgba;
- },
- gamma: function(rgba, amt, opts) {
- rgba.r = Math.pow(rgba.r / 255, Math.max(10 * amt * opts.strength, 1)) * 255;
- rgba.g = Math.pow(rgba.g / 255, Math.max(10 * amt * opts.strength, 1)) * 255;
- rgba.b = Math.pow(rgba.b / 255, Math.max(10 * amt * opts.strength, 1)) * 255;
- return rgba;
- },
- colorize: function(rgba, amt, opts) {
- rgba.r -= (rgba.r - opts.color.r) * amt;
- rgba.g -= (rgba.g - opts.color.g) * amt;
- rgba.b -= (rgba.b - opts.color.b) * amt;
- return rgba;
- }
- };
-
- Filter.register("vignette", function(size, strength) {
- var bezier, center, end, start;
-
- if (strength == null) {
- strength = 60;
- }
- if (typeof size === "string" && size.substr(-1) === "%") {
- if (this.dimensions.height > this.dimensions.width) {
- size = this.dimensions.width * (parseInt(size.substr(0, size.length - 1), 10) / 100);
- } else {
- size = this.dimensions.height * (parseInt(size.substr(0, size.length - 1), 10) / 100);
- }
- }
- strength /= 100;
- center = [this.dimensions.width / 2, this.dimensions.height / 2];
- start = Math.sqrt(Math.pow(center[0], 2) + Math.pow(center[1], 2));
- end = start - size;
- bezier = Calculate.bezier([0, 1], [30, 30], [70, 60], [100, 80]);
- return this.process("vignette", function(rgba) {
- var dist, div, loc;
-
- loc = rgba.locationXY();
- dist = Calculate.distance(loc.x, loc.y, center[0], center[1]);
- if (dist > end) {
- div = Math.max(1, (bezier[Math.round(((dist - end) / size) * 100)] / 10) * strength);
- rgba.r = Math.pow(rgba.r / 255, div) * 255;
- rgba.g = Math.pow(rgba.g / 255, div) * 255;
- rgba.b = Math.pow(rgba.b / 255, div) * 255;
- }
- return rgba;
- });
- });
-
- Filter.register("rectangularVignette", function(opts) {
- var defaults, dim, percent, size, _i, _len, _ref;
-
- defaults = {
- strength: 50,
- cornerRadius: 0,
- method: 'brightness',
- color: {
- r: 0,
- g: 0,
- b: 0
- }
- };
- opts = Util.extend(defaults, opts);
- if (!opts.size) {
- return this;
- } else if (typeof opts.size === "string") {
- percent = parseInt(opts.size, 10) / 100;
- opts.size = {
- width: this.dimensions.width * percent,
- height: this.dimensions.height * percent
- };
- } else if (typeof opts.size === "object") {
- _ref = ["width", "height"];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- dim = _ref[_i];
- if (typeof opts.size[dim] === "string") {
- opts.size[dim] = this.dimensions[dim] * (parseInt(opts.size[dim], 10) / 100);
- }
- }
- } else if (opts.size === "number") {
- size = opts.size;
- opts.size = {
- width: size,
- height: size
- };
- }
- if (typeof opts.cornerRadius === "string") {
- opts.cornerRadius = (opts.size.width / 2) * (parseInt(opts.cornerRadius, 10) / 100);
- }
- opts.strength /= 100;
- opts.size.width = Math.floor(opts.size.width);
- opts.size.height = Math.floor(opts.size.height);
- opts.image = {
- width: this.dimensions.width,
- height: this.dimensions.height
- };
- if (opts.method === "colorize" && typeof opts.color === "string") {
- opts.color = Convert.hexToRGB(opts.color);
- }
- opts.coords = {
- left: (this.dimensions.width - opts.size.width) / 2,
- right: this.dimensions.width - opts.coords.left,
- bottom: (this.dimensions.height - opts.size.height) / 2,
- top: this.dimensions.height - opts.coords.bottom
- };
- opts.corners = [
- {
- x: opts.coords.left + opts.cornerRadius,
- y: opts.coords.top - opts.cornerRadius
- }, {
- x: opts.coords.right - opts.cornerRadius,
- y: opts.coords.top - opts.cornerRadius
- }, {
- x: opts.coords.right - opts.cornerRadius,
- y: opts.coords.bottom + opts.cornerRadius
- }, {
- x: opts.coords.left + opts.cornerRadius,
- y: opts.coords.bottom + opts.cornerRadius
- }
- ];
- opts.maxDist = Calculate.distance(0, 0, opts.corners[3].x, opts.corners[3].y) - opts.cornerRadius;
- return this.process("rectangularVignette", function(rgba) {
- var amt, loc, radialDist;
-
- loc = rgba.locationXY();
- if ((loc.x > opts.corners[0].x && loc.x < opts.corners[1].x) && (loc.y > opts.coords.bottom && loc.y < opts.coords.top)) {
- return rgba;
- }
- if ((loc.x > opts.coords.left && loc.x < opts.coords.right) && (loc.y > opts.corners[3].y && loc.y < opts.corners[2].y)) {
- return rgba;
- }
- if (loc.x > opts.corners[0].x && loc.x < opts.corners[1].x && loc.y > opts.coords.top) {
- amt = (loc.y - opts.coords.top) / opts.maxDist;
- } else if (loc.y > opts.corners[2].y && loc.y < opts.corners[1].y && loc.x > opts.coords.right) {
- amt = (loc.x - opts.coords.right) / opts.maxDist;
- } else if (loc.x > opts.corners[0].x && loc.x < opts.corners[1].x && loc.y < opts.coords.bottom) {
- amt = (opts.coords.bottom - loc.y) / opts.maxDist;
- } else if (loc.y > opts.corners[2].y && loc.y < opts.corners[1].y && loc.x < opts.coords.left) {
- amt = (opts.coords.left - loc.x) / opts.maxDist;
- } else if (loc.x <= opts.corners[0].x && loc.y >= opts.corners[0].y) {
- radialDist = Caman.distance(loc.x, loc.y, opts.corners[0].x, opts.corners[0].y);
- amt = (radialDist - opts.cornerRadius) / opts.maxDist;
- } else if (loc.x >= opts.corners[1].x && loc.y >= opts.corners[1].y) {
- radialDist = Caman.distance(loc.x, loc.y, opts.corners[1].x, opts.corners[1].y);
- amt = (radialDist - opts.cornerRadius) / opts.maxDist;
- } else if (loc.x >= opts.corners[2].x && loc.y <= opts.corners[2].y) {
- radialDist = Caman.distance(loc.x, loc.y, opts.corners[2].x, opts.corners[2].y);
- amt = (radialDist - opts.cornerRadius) / opts.maxDist;
- } else if (loc.x <= opts.corners[3].x && loc.y <= opts.corners[3].y) {
- radialDist = Caman.distance(loc.x, loc.y, opts.corners[3].x, opts.corners[3].y);
- amt = (radialDist - opts.cornerRadius) / opts.maxDist;
- }
- if (amt < 0) {
- return rgba;
- }
- return vignetteFilters[opts.method](rgba, amt, opts);
- });
- });
-
- /*
- CompoundBlur - Blurring with varying radii for Canvas
-
- Version: 0.1
- Author: Mario Klingemann
- Contact: mario@quasimondo.com
- Website: http://www.quasimondo.com/StackBlurForCanvas
- Twitter: @quasimondo
- Modified By: Ryan LeFevre (@meltingice)
-
- In case you find this class useful - especially in commercial projects -
- I am not totally unhappy for a small donation to my PayPal account
- mario@quasimondo.de
-
- Copyright (c) 2011 Mario Klingemann
-
- 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() {
- var BlurStack, getLinearGradientMap, getRadialGradientMap, mul_table, shg_table;
-
- mul_table = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259];
- shg_table = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24];
- getLinearGradientMap = function(width, height, centerX, centerY, angle, length, mirrored) {
- var cnv, context, gradient, x1, x2, y1, y2;
-
- cnv = typeof exports !== "undefined" && exports !== null ? new Canvas() : document.createElement('canvas');
- cnv.width = width;
- cnv.height = height;
- x1 = centerX + Math.cos(angle) * length * 0.5;
- y1 = centerY + Math.sin(angle) * length * 0.5;
- x2 = centerX - Math.cos(angle) * length * 0.5;
- y2 = centerY - Math.sin(angle) * length * 0.5;
- context = cnv.getContext("2d");
- gradient = context.createLinearGradient(x1, y1, x2, y2);
- if (!mirrored) {
- gradient.addColorStop(0, "white");
- gradient.addColorStop(1, "black");
- } else {
- gradient.addColorStop(0, "white");
- gradient.addColorStop(0.5, "black");
- gradient.addColorStop(1, "white");
- }
- context.fillStyle = gradient;
- context.fillRect(0, 0, width, height);
- return context.getImageData(0, 0, width, height);
- };
- getRadialGradientMap = function(width, height, centerX, centerY, radius1, radius2) {
- var cnv, context, gradient;
-
- cnv = typeof exports !== "undefined" && exports !== null ? new Canvas() : document.createElement('canvas');
- cnv.width = width;
- cnv.height = height;
- context = cnv.getContext("2d");
- gradient = context.createRadialGradient(centerX, centerY, radius1, centerX, centerY, radius2);
- gradient.addColorStop(1, "white");
- gradient.addColorStop(0, "black");
- context.fillStyle = gradient;
- context.fillRect(0, 0, width, height);
- return context.getImageData(0, 0, width, height);
- };
- BlurStack = function() {
- this.r = 0;
- this.g = 0;
- this.b = 0;
- this.a = 0;
- return this.next = null;
- };
- Caman.Plugin.register("compoundBlur", function(radiusData, radius, increaseFactor, blurLevels) {
- var b_in_sum, b_out_sum, b_sum, blend, currentIndex, div, g_in_sum, g_out_sum, g_sum, height, heightMinus1, i, iblend, idx, imagePixels, index, iradius, lookupValue, mul_sum, p, pb, pg, pixels, pr, r_in_sum, r_out_sum, r_sum, radiusPixels, radiusPlus1, rbs, shg_sum, stack, stackEnd, stackIn, stackOut, stackStart, steps, sumFactor, w4, wh, wh4, width, widthMinus1, x, y, yi, yp, yw, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
-
- width = this.dimensions.width;
- height = this.dimensions.height;
- imagePixels = this.pixelData;
- radiusPixels = radiusData.data;
- wh = width * height;
- wh4 = wh << 2;
- pixels = [];
- for (i = _i = 0; 0 <= wh4 ? _i < wh4 : _i > wh4; i = 0 <= wh4 ? ++_i : --_i) {
- pixels[i] = imagePixels[i];
- }
- currentIndex = 0;
- steps = blurLevels;
- blurLevels -= 1;
- while (steps-- >= 0) {
- iradius = (radius + 0.5) | 0;
- if (iradius === 0) {
- continue;
- }
- if (iradius > 256) {
- iradius = 256;
- }
- div = iradius + iradius + 1;
- w4 = width << 2;
- widthMinus1 = width - 1;
- heightMinus1 = height - 1;
- radiusPlus1 = iradius + 1;
- sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
- stackStart = new BlurStack();
- stackEnd = void 0;
- stack = stackStart;
- for (i = _j = 1; 1 <= div ? _j < div : _j > div; i = 1 <= div ? ++_j : --_j) {
- stack = stack.next = new BlurStack();
- if (i === radiusPlus1) {
- stackEnd = stack;
- }
- }
- stack.next = stackStart;
- stackIn = null;
- stackOut = null;
- yw = yi = 0;
- mul_sum = mul_table[iradius];
- shg_sum = shg_table[iradius];
- for (y = _k = 0; 0 <= height ? _k < height : _k > height; y = 0 <= height ? ++_k : --_k) {
- r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0;
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
- g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
- b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
- r_sum += sumFactor * pr;
- g_sum += sumFactor * pg;
- b_sum += sumFactor * pb;
- stack = stackStart;
- for (i = _l = 0; 0 <= radiusPlus1 ? _l < radiusPlus1 : _l > radiusPlus1; i = 0 <= radiusPlus1 ? ++_l : --_l) {
- stack.r = pr;
- stack.g = pg;
- stack.b = pb;
- stack = stack.next;
- }
- for (i = _m = 1; 1 <= radiusPlus1 ? _m < radiusPlus1 : _m > radiusPlus1; i = 1 <= radiusPlus1 ? ++_m : --_m) {
- p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
- r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);
- g_sum += (stack.g = (pg = pixels[p + 1])) * rbs;
- b_sum += (stack.b = (pb = pixels[p + 2])) * rbs;
- r_in_sum += pr;
- g_in_sum += pg;
- b_in_sum += pb;
- stack = stack.next;
- }
- stackIn = stackStart;
- stackOut = stackEnd;
- for (x = _n = 0; 0 <= width ? _n < width : _n > width; x = 0 <= width ? ++_n : --_n) {
- pixels[yi] = (r_sum * mul_sum) >> shg_sum;
- pixels[yi + 1] = (g_sum * mul_sum) >> shg_sum;
- pixels[yi + 2] = (b_sum * mul_sum) >> shg_sum;
- r_sum -= r_out_sum;
- g_sum -= g_out_sum;
- b_sum -= b_out_sum;
- r_out_sum -= stackIn.r;
- g_out_sum -= stackIn.g;
- b_out_sum -= stackIn.b;
- p = (yw + ((p = x + radiusPlus1) < widthMinus1 ? p : widthMinus1)) << 2;
- r_in_sum += (stackIn.r = pixels[p]);
- g_in_sum += (stackIn.g = pixels[p + 1]);
- b_in_sum += (stackIn.b = pixels[p + 2]);
- r_sum += r_in_sum;
- g_sum += g_in_sum;
- b_sum += b_in_sum;
- stackIn = stackIn.next;
- r_out_sum += (pr = stackOut.r);
- g_out_sum += (pg = stackOut.g);
- b_out_sum += (pb = stackOut.b);
- r_in_sum -= pr;
- g_in_sum -= pg;
- b_in_sum -= pb;
- stackOut = stackOut.next;
- yi += 4;
- }
- yw += width;
- }
- for (x = _o = 0; 0 <= width ? _o < width : _o > width; x = 0 <= width ? ++_o : --_o) {
- g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0;
- yi = x << 2;
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
- g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
- b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
- r_sum += sumFactor * pr;
- g_sum += sumFactor * pg;
- b_sum += sumFactor * pb;
- stack = stackStart;
- for (i = _p = 0; 0 <= radiusPlus1 ? _p < radiusPlus1 : _p > radiusPlus1; i = 0 <= radiusPlus1 ? ++_p : --_p) {
- stack.r = pr;
- stack.g = pg;
- stack.b = pb;
- stack = stack.next;
- }
- yp = width;
- for (i = _q = 1; 1 <= radiusPlus1 ? _q < radiusPlus1 : _q > radiusPlus1; i = 1 <= radiusPlus1 ? ++_q : --_q) {
- yi = (yp + x) << 2;
- r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);
- g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs;
- b_sum += (stack.b = (pb = pixels[yi + 2])) * rbs;
- r_in_sum += pr;
- g_in_sum += pg;
- b_in_sum += pb;
- stack = stack.next;
- if (i < heightMinus1) {
- yp += width;
- }
- }
- yi = x;
- stackIn = stackStart;
- stackOut = stackEnd;
- for (y = _r = 0; 0 <= height ? _r < height : _r > height; y = 0 <= height ? ++_r : --_r) {
- p = yi << 2;
- pixels[p] = (r_sum * mul_sum) >> shg_sum;
- pixels[p + 1] = (g_sum * mul_sum) >> shg_sum;
- pixels[p + 2] = (b_sum * mul_sum) >> shg_sum;
- r_sum -= r_out_sum;
- g_sum -= g_out_sum;
- b_sum -= b_out_sum;
- r_out_sum -= stackIn.r;
- g_out_sum -= stackIn.g;
- b_out_sum -= stackIn.b;
- p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;
- r_sum += (r_in_sum += (stackIn.r = pixels[p]));
- g_sum += (g_in_sum += (stackIn.g = pixels[p + 1]));
- b_sum += (b_in_sum += (stackIn.b = pixels[p + 2]));
- stackIn = stackIn.next;
- r_out_sum += (pr = stackOut.r);
- g_out_sum += (pg = stackOut.g);
- b_out_sum += (pb = stackOut.b);
- r_in_sum -= pr;
- g_in_sum -= pg;
- b_in_sum -= pb;
- stackOut = stackOut.next;
- yi += width;
- }
- }
- radius *= increaseFactor;
- i = wh;
- while (--i > -1) {
- idx = i << 2;
- lookupValue = (radiusPixels[idx + 2] & 0xff) / 255.0 * blurLevels;
- index = lookupValue | 0;
- if (index === currentIndex) {
- blend = 256.0 * (lookupValue - (lookupValue | 0));
- iblend = 256 - blend;
- imagePixels[idx] = (imagePixels[idx] * iblend + pixels[idx] * blend) >> 8;
- imagePixels[idx + 1] = (imagePixels[idx + 1] * iblend + pixels[idx + 1] * blend) >> 8;
- imagePixels[idx + 2] = (imagePixels[idx + 2] * iblend + pixels[idx + 2] * blend) >> 8;
- } else if (index === currentIndex + 1) {
- imagePixels[idx] = pixels[idx];
- imagePixels[idx + 1] = pixels[idx + 1];
- imagePixels[idx + 2] = pixels[idx + 2];
- }
- }
- currentIndex++;
- }
- return this;
- });
- Caman.Filter.register("tiltShift", function(opts) {
- var defaults, gradient;
-
- defaults = {
- center: {
- x: this.dimensions.width / 2,
- y: this.dimensions.height / 2
- },
- angle: 45,
- focusWidth: 200,
- startRadius: 3,
- radiusFactor: 1.5,
- steps: 3
- };
- opts = Util.extend(defaults, opts);
- opts.angle *= Math.PI / 180;
- gradient = getLinearGradientMap(this.dimensions.width, this.dimensions.height, opts.center.x, opts.center.y, opts.angle, opts.focusWidth, true);
- return this.processPlugin("compoundBlur", [gradient, opts.startRadius, opts.radiusFactor, opts.steps]);
- });
- return Caman.Filter.register("radialBlur", function(opts) {
- var defaults, gradient, radius1, radius2;
-
- defaults = {
- size: 50,
- center: {
- x: this.dimensions.width / 2,
- y: this.dimensions.height / 2
- },
- startRadius: 3,
- radiusFactor: 1.5,
- steps: 3,
- radius: null
- };
- opts = Util.extend(defaults, opts);
- if (!opts.radius) {
- opts.radius = this.dimensions.width < this.dimensions.height ? this.dimensions.height : this.dimensions.width;
- }
- radius1 = (opts.radius / 2) - opts.size;
- radius2 = opts.radius / 2;
- gradient = getRadialGradientMap(this.dimensions.width, this.dimensions.height, opts.center.x, opts.center.y, radius1, radius2);
- return this.processPlugin("compoundBlur", [gradient, opts.startRadius, opts.radiusFactor, opts.steps]);
- });
- })();
-
- Caman.Filter.register("edgeEnhance", function() {
- return this.processKernel("Edge Enhance", [0, 0, 0, -1, 1, 0, 0, 0, 0]);
- });
-
- Caman.Filter.register("edgeDetect", function() {
- return this.processKernel("Edge Detect", [-1, -1, -1, -1, 8, -1, -1, -1, -1]);
- });
-
- Caman.Filter.register("emboss", function() {
- return this.processKernel("Emboss", [-2, -1, 0, -1, 1, 1, 0, 1, 2]);
- });
-
- Caman.Filter.register("posterize", function(adjust) {
- var numOfAreas, numOfValues;
-
- numOfAreas = 256 / adjust;
- numOfValues = 255 / (adjust - 1);
- return this.process("posterize", function(rgba) {
- rgba.r = Math.floor(Math.floor(rgba.r / numOfAreas) * numOfValues);
- rgba.g = Math.floor(Math.floor(rgba.g / numOfAreas) * numOfValues);
- rgba.b = Math.floor(Math.floor(rgba.b / numOfAreas) * numOfValues);
- return rgba;
- });
- });
-
- Caman.Filter.register("vintage", function(vignette) {
- if (vignette == null) {
- vignette = true;
- }
- this.greyscale();
- this.contrast(5);
- this.noise(3);
- this.sepia(100);
- this.channels({
- red: 8,
- blue: 2,
- green: 4
- });
- this.gamma(0.87);
- if (vignette) {
- return this.vignette("40%", 30);
- }
- });
-
- Caman.Filter.register("lomo", function(vignette) {
- if (vignette == null) {
- vignette = true;
- }
- this.brightness(15);
- this.exposure(15);
- this.curves('rgb', [0, 0], [200, 0], [155, 255], [255, 255]);
- this.saturation(-20);
- this.gamma(1.8);
- if (vignette) {
- this.vignette("50%", 60);
- }
- return this.brightness(5);
- });
-
- Caman.Filter.register("clarity", function(grey) {
- if (grey == null) {
- grey = false;
- }
- this.vibrance(20);
- this.curves('rgb', [5, 0], [130, 150], [190, 220], [250, 255]);
- this.sharpen(15);
- this.vignette("45%", 20);
- if (grey) {
- this.greyscale();
- this.contrast(4);
- }
- return this;
- });
-
- Caman.Filter.register("sinCity", function() {
- this.contrast(100);
- this.brightness(15);
- this.exposure(10);
- this.posterize(80);
- this.clip(30);
- return this.greyscale();
- });
-
- Caman.Filter.register("sunrise", function() {
- this.exposure(3.5);
- this.saturation(-5);
- this.vibrance(50);
- this.sepia(60);
- this.colorize("#e87b22", 10);
- this.channels({
- red: 8,
- blue: 8
- });
- this.contrast(5);
- this.gamma(1.2);
- return this.vignette("55%", 25);
- });
-
- Caman.Filter.register("crossProcess", function() {
- this.exposure(5);
- this.colorize("#e87b22", 4);
- this.sepia(20);
- this.channels({
- blue: 8,
- red: 3
- });
- this.curves('b', [0, 0], [100, 150], [180, 180], [255, 255]);
- this.contrast(15);
- this.vibrance(75);
- return this.gamma(1.6);
- });
-
- Caman.Filter.register("orangePeel", function() {
- this.curves('rgb', [0, 0], [100, 50], [140, 200], [255, 255]);
- this.vibrance(-30);
- this.saturation(-30);
- this.colorize('#ff9000', 30);
- this.contrast(-5);
- return this.gamma(1.4);
- });
-
- Caman.Filter.register("love", function() {
- this.brightness(5);
- this.exposure(8);
- this.contrast(4);
- this.colorize('#c42007', 30);
- this.vibrance(50);
- return this.gamma(1.3);
- });
-
- Caman.Filter.register("grungy", function() {
- this.gamma(1.5);
- this.clip(25);
- this.saturation(-60);
- this.contrast(5);
- this.noise(5);
- return this.vignette("50%", 30);
- });
-
- Caman.Filter.register("jarques", function() {
- this.saturation(-35);
- this.curves('b', [20, 0], [90, 120], [186, 144], [255, 230]);
- this.curves('r', [0, 0], [144, 90], [138, 120], [255, 255]);
- this.curves('g', [10, 0], [115, 105], [148, 100], [255, 248]);
- this.curves('rgb', [0, 0], [120, 100], [128, 140], [255, 255]);
- return this.sharpen(20);
- });
-
- Caman.Filter.register("pinhole", function() {
- this.greyscale();
- this.sepia(10);
- this.exposure(10);
- this.contrast(15);
- return this.vignette("60%", 35);
- });
-
- Caman.Filter.register("oldBoot", function() {
- this.saturation(-20);
- this.vibrance(-50);
- this.gamma(1.1);
- this.sepia(30);
- this.channels({
- red: -10,
- blue: 5
- });
- this.curves('rgb', [0, 0], [80, 50], [128, 230], [255, 255]);
- return this.vignette("60%", 30);
- });
-
- Caman.Filter.register("glowingSun", function(vignette) {
- if (vignette == null) {
- vignette = true;
- }
- this.brightness(10);
- this.newLayer(function() {
- this.setBlendingMode("multiply");
- this.opacity(80);
- this.copyParent();
- this.filter.gamma(0.8);
- this.filter.contrast(50);
- return this.filter.exposure(10);
- });
- this.newLayer(function() {
- this.setBlendingMode("softLight");
- this.opacity(80);
- return this.fillColor("#f49600");
- });
- this.exposure(20);
- this.gamma(0.8);
- if (vignette) {
- return this.vignette("45%", 20);
- }
- });
-
- Caman.Filter.register("hazyDays", function() {
- this.gamma(1.2);
- this.newLayer(function() {
- this.setBlendingMode("overlay");
- this.opacity(60);
- this.copyParent();
- this.filter.channels({
- red: 5
- });
- return this.filter.stackBlur(15);
- });
- this.newLayer(function() {
- this.setBlendingMode("addition");
- this.opacity(40);
- return this.fillColor("#6899ba");
- });
- this.newLayer(function() {
- this.setBlendingMode("multiply");
- this.opacity(35);
- this.copyParent();
- this.filter.brightness(40);
- this.filter.vibrance(40);
- this.filter.exposure(30);
- this.filter.contrast(15);
- this.filter.curves('r', [0, 40], [128, 128], [128, 128], [255, 215]);
- this.filter.curves('g', [0, 40], [128, 128], [128, 128], [255, 215]);
- this.filter.curves('b', [0, 40], [128, 128], [128, 128], [255, 215]);
- return this.filter.stackBlur(5);
- });
- this.curves('r', [20, 0], [128, 158], [128, 128], [235, 255]);
- this.curves('g', [20, 0], [128, 128], [128, 128], [235, 255]);
- this.curves('b', [20, 0], [128, 108], [128, 128], [235, 255]);
- return this.vignette("45%", 20);
- });
-
- Caman.Filter.register("herMajesty", function() {
- this.brightness(40);
- this.colorize("#ea1c5d", 10);
- this.curves('b', [0, 10], [128, 180], [190, 190], [255, 255]);
- this.newLayer(function() {
- this.setBlendingMode('overlay');
- this.opacity(50);
- this.copyParent();
- this.filter.gamma(0.7);
- return this.newLayer(function() {
- this.setBlendingMode('normal');
- this.opacity(60);
- return this.fillColor('#ea1c5d');
- });
- });
- this.newLayer(function() {
- this.setBlendingMode('multiply');
- this.opacity(60);
- this.copyParent();
- this.filter.saturation(50);
- this.filter.hue(90);
- return this.filter.contrast(10);
- });
- this.gamma(1.4);
- this.vibrance(-30);
- this.newLayer(function() {
- this.opacity(10);
- return this.fillColor('#e5f0ff');
- });
- return this;
- });
-
- Caman.Filter.register("nostalgia", function() {
- this.saturation(20);
- this.gamma(1.4);
- this.greyscale();
- this.contrast(5);
- this.sepia(100);
- this.channels({
- red: 8,
- blue: 2,
- green: 4
- });
- this.gamma(0.8);
- this.contrast(5);
- this.exposure(10);
- this.newLayer(function() {
- this.setBlendingMode('overlay');
- this.copyParent();
- this.opacity(55);
- return this.filter.stackBlur(10);
- });
- return this.vignette("50%", 30);
- });
-
- Caman.Filter.register("hemingway", function() {
- this.greyscale();
- this.contrast(10);
- this.gamma(0.9);
- this.newLayer(function() {
- this.setBlendingMode("multiply");
- this.opacity(40);
- this.copyParent();
- this.filter.exposure(15);
- this.filter.contrast(15);
- return this.filter.channels({
- green: 10,
- red: 5
- });
- });
- this.sepia(30);
- this.curves('rgb', [0, 10], [120, 90], [180, 200], [235, 255]);
- this.channels({
- red: 5,
- green: -2
- });
- return this.exposure(15);
- });
-
- Caman.Filter.register("concentrate", function() {
- this.sharpen(40);
- this.saturation(-50);
- this.channels({
- red: 3
- });
- this.newLayer(function() {
- this.setBlendingMode("multiply");
- this.opacity(80);
- this.copyParent();
- this.filter.sharpen(5);
- this.filter.contrast(50);
- this.filter.exposure(10);
- return this.filter.channels({
- blue: 5
- });
- });
- return this.brightness(10);
- });
-
- Caman.Plugin.register("rotate", function(degrees) {
- var angle, canvas, ctx, height, to_radians, width, x, y;
-
- angle = degrees % 360;
- if (angle === 0) {
- return this.dimensions = {
- width: this.canvas.width,
- height: this.canvas.height
- };
- }
- to_radians = Math.PI / 180;
- if (typeof exports !== "undefined" && exports !== null) {
- canvas = new Canvas();
- } else {
- canvas = document.createElement('canvas');
- Util.copyAttributes(this.canvas, canvas);
- }
- if (angle === 90 || angle === -270 || angle === 270 || angle === -90) {
- width = this.canvas.height;
- height = this.canvas.width;
- x = width / 2;
- y = height / 2;
- } else if (angle === 180) {
- width = this.canvas.width;
- height = this.canvas.height;
- x = width / 2;
- y = height / 2;
- } else {
- width = Math.sqrt(Math.pow(this.originalWidth, 2) + Math.pow(this.originalHeight, 2));
- height = width;
- x = this.canvas.height / 2;
- y = this.canvas.width / 2;
- }
- canvas.width = width;
- canvas.height = height;
- ctx = canvas.getContext('2d');
- ctx.save();
- ctx.translate(x, y);
- ctx.rotate(angle * to_radians);
- ctx.drawImage(this.canvas, -this.canvas.width / 2, -this.canvas.height / 2, this.canvas.width, this.canvas.height);
- ctx.restore();
- return this.replaceCanvas(canvas);
- });
-
- Caman.Filter.register("rotate", function() {
- return this.processPlugin("rotate", Array.prototype.slice.call(arguments, 0));
- });
-
- /*
- StackBlur - a fast almost Gaussian Blur For Canvas v0.31 modified for CamanJS
-
- Version: 0.31
- Author: Mario Klingemann
- Contact: mario@quasimondo.com
- Website: http://www.quasimondo.com/StackBlurForCanvas
- Twitter: @quasimondo
- Modified By: Ryan LeFevre (@meltingice)
-
- In case you find this class useful - especially in commercial projects -
- I am not totally unhappy for a small donation to my PayPal account
- mario@quasimondo.de
-
- Or support me on flattr:
- https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript
-
- Copyright (c) 2010 Mario Klingemann
-
- 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() {
- var BlurStack, mul_table, shg_table;
-
- mul_table = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259];
- shg_table = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24];
- BlurStack = function() {
- this.r = 0;
- this.g = 0;
- this.b = 0;
- this.a = 0;
- return this.next = null;
- };
- Caman.Plugin.register("stackBlur", function(radius) {
- var b_in_sum, b_out_sum, b_sum, div, g_in_sum, g_out_sum, g_sum, height, heightMinus1, i, mul_sum, p, pb, pg, pixels, pr, r_in_sum, r_out_sum, r_sum, radiusPlus1, rbs, shg_sum, stack, stackEnd, stackIn, stackOut, stackStart, sumFactor, w4, width, widthMinus1, x, y, yi, yp, yw, _i, _j, _k, _l, _m, _n, _o, _p, _q;
-
- if (isNaN(radius) || radius < 1) {
- return;
- }
- radius |= 0;
- pixels = this.pixelData;
- width = this.dimensions.width;
- height = this.dimensions.height;
- div = radius + radius + 1;
- w4 = width << 2;
- widthMinus1 = width - 1;
- heightMinus1 = height - 1;
- radiusPlus1 = radius + 1;
- sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;
- stackStart = new BlurStack();
- stack = stackStart;
- for (i = _i = 1; 1 <= div ? _i < div : _i > div; i = 1 <= div ? ++_i : --_i) {
- stack = stack.next = new BlurStack();
- if (i === radiusPlus1) {
- stackEnd = stack;
- }
- }
- stack.next = stackStart;
- stackIn = null;
- stackOut = null;
- yw = yi = 0;
- mul_sum = mul_table[radius];
- shg_sum = shg_table[radius];
- for (y = _j = 0; 0 <= height ? _j < height : _j > height; y = 0 <= height ? ++_j : --_j) {
- r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0;
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
- g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
- b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
- r_sum += sumFactor * pr;
- g_sum += sumFactor * pg;
- b_sum += sumFactor * pb;
- stack = stackStart;
- for (i = _k = 0; 0 <= radiusPlus1 ? _k < radiusPlus1 : _k > radiusPlus1; i = 0 <= radiusPlus1 ? ++_k : --_k) {
- stack.r = pr;
- stack.g = pg;
- stack.b = pb;
- stack = stack.next;
- }
- for (i = _l = 1; 1 <= radiusPlus1 ? _l < radiusPlus1 : _l > radiusPlus1; i = 1 <= radiusPlus1 ? ++_l : --_l) {
- p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2);
- r_sum += (stack.r = (pr = pixels[p])) * (rbs = radiusPlus1 - i);
- g_sum += (stack.g = (pg = pixels[p + 1])) * rbs;
- b_sum += (stack.b = (pb = pixels[p + 2])) * rbs;
- r_in_sum += pr;
- g_in_sum += pg;
- b_in_sum += pb;
- stack = stack.next;
- }
- stackIn = stackStart;
- stackOut = stackEnd;
- for (x = _m = 0; 0 <= width ? _m < width : _m > width; x = 0 <= width ? ++_m : --_m) {
- pixels[yi] = (r_sum * mul_sum) >> shg_sum;
- pixels[yi + 1] = (g_sum * mul_sum) >> shg_sum;
- pixels[yi + 2] = (b_sum * mul_sum) >> shg_sum;
- r_sum -= r_out_sum;
- g_sum -= g_out_sum;
- b_sum -= b_out_sum;
- r_out_sum -= stackIn.r;
- g_out_sum -= stackIn.g;
- b_out_sum -= stackIn.b;
- p = (yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1)) << 2;
- r_in_sum += (stackIn.r = pixels[p]);
- g_in_sum += (stackIn.g = pixels[p + 1]);
- b_in_sum += (stackIn.b = pixels[p + 2]);
- r_sum += r_in_sum;
- g_sum += g_in_sum;
- b_sum += b_in_sum;
- stackIn = stackIn.next;
- r_out_sum += (pr = stackOut.r);
- g_out_sum += (pg = stackOut.g);
- b_out_sum += (pb = stackOut.b);
- r_in_sum -= pr;
- g_in_sum -= pg;
- b_in_sum -= pb;
- stackOut = stackOut.next;
- yi += 4;
- }
- yw += width;
- }
- for (x = _n = 0; 0 <= width ? _n < width : _n > width; x = 0 <= width ? ++_n : --_n) {
- g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0;
- yi = x << 2;
- r_out_sum = radiusPlus1 * (pr = pixels[yi]);
- g_out_sum = radiusPlus1 * (pg = pixels[yi + 1]);
- b_out_sum = radiusPlus1 * (pb = pixels[yi + 2]);
- r_sum += sumFactor * pr;
- g_sum += sumFactor * pg;
- b_sum += sumFactor * pb;
- stack = stackStart;
- for (i = _o = 0; 0 <= radiusPlus1 ? _o < radiusPlus1 : _o > radiusPlus1; i = 0 <= radiusPlus1 ? ++_o : --_o) {
- stack.r = pr;
- stack.g = pg;
- stack.b = pb;
- stack = stack.next;
- }
- yp = width;
- for (i = _p = 1; 1 <= radius ? _p <= radius : _p >= radius; i = 1 <= radius ? ++_p : --_p) {
- yi = (yp + x) << 2;
- r_sum += (stack.r = (pr = pixels[yi])) * (rbs = radiusPlus1 - i);
- g_sum += (stack.g = (pg = pixels[yi + 1])) * rbs;
- b_sum += (stack.b = (pb = pixels[yi + 2])) * rbs;
- r_in_sum += pr;
- g_in_sum += pg;
- b_in_sum += pb;
- stack = stack.next;
- if (i < heightMinus1) {
- yp += width;
- }
- }
- yi = x;
- stackIn = stackStart;
- stackOut = stackEnd;
- for (y = _q = 0; 0 <= height ? _q < height : _q > height; y = 0 <= height ? ++_q : --_q) {
- p = yi << 2;
- pixels[p] = (r_sum * mul_sum) >> shg_sum;
- pixels[p + 1] = (g_sum * mul_sum) >> shg_sum;
- pixels[p + 2] = (b_sum * mul_sum) >> shg_sum;
- r_sum -= r_out_sum;
- g_sum -= g_out_sum;
- b_sum -= b_out_sum;
- r_out_sum -= stackIn.r;
- g_out_sum -= stackIn.g;
- b_out_sum -= stackIn.b;
- p = (x + (((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width)) << 2;
- r_sum += (r_in_sum += (stackIn.r = pixels[p]));
- g_sum += (g_in_sum += (stackIn.g = pixels[p + 1]));
- b_sum += (b_in_sum += (stackIn.b = pixels[p + 2]));
- stackIn = stackIn.next;
- r_out_sum += (pr = stackOut.r);
- g_out_sum += (pg = stackOut.g);
- b_out_sum += (pb = stackOut.b);
- r_in_sum -= pr;
- g_in_sum -= pg;
- b_in_sum -= pb;
- stackOut = stackOut.next;
- yi += width;
- }
- }
- return this;
- });
- return Caman.Filter.register("stackBlur", function(radius) {
- return this.processPlugin("stackBlur", [radius]);
- });
- })();
-
- Caman.Filter.register("threshold", function(adjust) {
- return this.process("threshold", function(rgba) {
- var luminance;
-
- luminance = (0.2126 * rgba.r) + (0.7152 * rgba.g) + (0.0722 * rgba.b);
- if (luminance < adjust) {
- rgba.r = 0;
- rgba.g = 0;
- rgba.b = 0;
- } else {
- rgba.r = 255;
- rgba.g = 255;
- rgba.b = 255;
- }
- return rgba;
- });
- });
-
-}).call(this);
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/davis.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/davis.js
deleted file mode 100755
index 20ff082..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/davis.js
+++ /dev/null
@@ -1,1836 +0,0 @@
-/*!
- * Davis - http://davisjs.com - JavaScript Routing - 0.9.9
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-;
-/**
- * Convinience method for instantiating a new Davis app and configuring it to use the passed
- * routes and subscriptions.
- *
- * @param {Function} config A function that will be run with a newly created Davis.App as its context,
- * should be used to set up app routes, subscriptions and settings etc.
- * @namespace
- * @returns {Davis.App}
- */
-Davis = function (config) {
- var app = new Davis.App
- config && config.call(app)
- Davis.$(function () { app.start() })
- return app
-};
-
-/**
- * Stores the DOM library that Davis will use. Can be overriden to use libraries other than jQuery.
- */
-if (window.jQuery) {
- Davis.$ = jQuery
-} else {
- Davis.$ = null
-};
-
-/**
- * Checks whether Davis is supported in the current browser
- *
- * @returns {Boolean}
- */
-Davis.supported = function () {
- return (typeof window.history.pushState == 'function')
-}
-
-/*!
- * A function that does nothing, used as a default param for any callbacks.
- *
- * @private
- * @returns {Function}
- */
-Davis.noop = function () {}
-
-/**
- * Method to extend the Davis library with an extension.
- *
- * An extension is just a function that will modify the Davis framework in some way,
- * for example changing how the routing works or adjusting where Davis thinks it is supported.
- *
- * Example:
- * Davis.extend(Davis.hashBasedRouting)
- *
- * @param {Function} extension the function that will extend Davis
- *
- */
-Davis.extend = function (extension) {
- extension(Davis)
-}
-
-/*!
- * the version
- */
-Davis.version = "0.9.9";/*!
- * Davis - utils
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-/*!
- * A module that provides wrappers around modern JavaScript so that native implementations are used
- * whereever possible and JavaScript implementations are used in those browsers that do not natively
- * support them.
- */
-Davis.utils = (function () {
-
- /*!
- * A wrapper around native Array.prototype.every.
- *
- * Falls back to a pure JavaScript implementation in browsers that do not support Array.prototype.every.
- * For more details see the full docs on MDC https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every
- *
- * @private
- * @param {array} the array to loop through
- * @param {fn} the function to that performs the every check
- * @param {thisp} an optional param that will be set as fn's this value
- * @returns {Array}
- */
- if (Array.prototype.every) {
- var every = function (array, fn) {
- return array.every(fn, arguments[2])
- }
- } else {
- var every = function (array, fn) {
- if (array === void 0 || array === null) throw new TypeError();
- var t = Object(array);
- var len = t.length >>> 0;
- if (typeof fn !== "function") throw new TypeError();
-
- var thisp = arguments[2];
- for (var i = 0; i < len; i++) {
- if (i in t && !fn.call(thisp, t[i], i, t)) return false;
- }
-
- return true;
- }
- };
-
- /*!
- * A wrapper around native Array.prototype.forEach.
- *
- * Falls back to a pure JavaScript implementation in browsers that do not support Array.prototype.forEach.
- * For more details see the full docs on MDC https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach
- *
- * @private
- * @param {array} the array to loop through
- * @param {fn} the function to apply to every element of the array
- * @param {thisp} an optional param that will be set as fn's this value
- * @returns {Array}
- */
- if (Array.prototype.forEach) {
- var forEach = function (array, fn) {
- return array.forEach(fn, arguments[2])
- }
- } else {
- var forEach = function (array, fn) {
- if (array === void 0 || array === null) throw new TypeError();
- var t = Object(array);
- var len = t.length >>> 0;
- if (typeof fn !== "function") throw new TypeError();
-
-
- var thisp = arguments[2];
- for (var i = 0; i < len; i++) {
- if (i in t) fn.call(thisp, t[i], i, t);
- }
- };
- };
-
- /*!
- * A wrapper around native Array.prototype.filter.
- * Falls back to a pure JavaScript implementation in browsers that do not support Array.prototype.filter.
- * For more details see the full docs on MDC https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter
- *
- * @private
- * @param {array} the array to filter
- * @param {fn} the function to do the filtering
- * @param {thisp} an optional param that will be set as fn's this value
- * @returns {Array}
- */
- if (Array.prototype.filter) {
- var filter = function (array, fn) {
- return array.filter(fn, arguments[2])
- }
- } else {
- var filter = function(array, fn) {
- if (array === void 0 || array === null) throw new TypeError();
- var t = Object(array);
- var len = t.length >>> 0;
- if (typeof fn !== "function") throw new TypeError();
-
-
- var res = [];
- var thisp = arguments[2];
- for (var i = 0; i < len; i++) {
- if (i in t) {
- var val = t[i]; // in case fn mutates this
- if (fn.call(thisp, val, i, t)) res.push(val);
- }
- }
-
- return res;
- };
- };
-
- /*!
- * A wrapper around native Array.prototype.map.
- * Falls back to a pure JavaScript implementation in browsers that do not support Array.prototype.map.
- * For more details see the full docs on MDC https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map
- *
- * @private
- * @param {array} the array to map
- * @param {fn} the function to do the mapping
- * @param {thisp} an optional param that will be set as fn's this value
- * @returns {Array}
- */
-
- if (Array.prototype.map) {
- var map = function (array, fn) {
- return array.map(fn, arguments[2])
- }
- } else {
- var map = function(array, fn) {
- if (array === void 0 || array === null)
- throw new TypeError();
-
- var t = Object(array);
- var len = t.length >>> 0;
- if (typeof fn !== "function")
- throw new TypeError();
-
- var res = new Array(len);
- var thisp = arguments[2];
- for (var i = 0; i < len; i++) {
- if (i in t)
- res[i] = fn.call(thisp, t[i], i, t);
- }
-
- return res;
- };
- };
-
- /*!
- * A convinience function for converting arguments to a proper array
- *
- * @private
- * @param {args} a functions arguments
- * @param {start} an integer at which to start converting the arguments to an array
- * @returns {Array}
- */
- var toArray = function (args, start) {
- return Array.prototype.slice.call(args, start || 0)
- }
-
- /*!
- * Exposing the public interface to the Utils module
- * @private
- */
- return {
- every: every,
- forEach: forEach,
- filter: filter,
- toArray: toArray,
- map: map
- }
-})()
-
-/*!
- * Davis - listener
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-/**
- * A module to bind to link clicks and form submits and turn what would normally be http requests
- * into instances of Davis.Request. These request objects are then pushed onto the history stack
- * using the Davis.history module.
- *
- * This module uses Davis.$, which by defualt is jQuery for its event binding and event object normalization.
- * To use Davis with any, or no, JavaScript framework be sure to provide support for all the methods called
- * on Davis.$.
- *
- * @module
- */
-Davis.listener = function () {
-
- /*!
- * Methods to check whether an element has an href or action that is local to this page
- * @private
- */
- var originChecks = {
- A: function (elem) {
- return elem.host !== window.location.host || elem.protocol !== window.location.protocol
- },
-
- FORM: function (elem) {
- var a = document.createElement('a')
- a.href = elem.action
- return this.A(a)
- }
- }
-
- /*!
- * Checks whether the target of a click or submit event has an href or action that is local to the
- * current page. Only links or targets with local hrefs or actions will be handled by davis, all
- * others will be ignored.
- * @private
- */
- var differentOrigin = function (elem) {
- if (!originChecks[elem.nodeName.toUpperCase()]) return true // the elem is neither a link or a form
- return originChecks[elem.nodeName.toUpperCase()](elem)
- }
-
- var hasModifier = function (event) {
- return (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
- }
-
- /*!
- * A handler that creates a new Davis.Request and pushes it onto the history stack using Davis.history.
- *
- * @param {Function} targetExtractor a function that will be called with the event target jQuery object and should return an object with path, title and method.
- * @private
- */
- var handler = function (targetExtractor) {
- return function (event) {
- if (hasModifier(event)) return true
- if (differentOrigin(this)) return true
-
- var request = new Davis.Request (targetExtractor.call(Davis.$(this)));
- Davis.location.assign(request)
- event.stopPropagation()
- event.preventDefault()
- return false;
- };
- };
-
- /*!
- * A handler specialized for click events. Gets the request details from a link elem
- * @private
- */
- var clickHandler = handler(function () {
- var self = this
-
- return {
- method: 'get',
- fullPath: this.prop('href'),
- title: this.attr('title'),
- delegateToServer: function () {
- window.location = self.prop('href')
- }
- };
- });
-
- /*!
- * A handler specialized for submit events. Gets the request details from a form elem
- * @private
- */
- var submitHandler = handler(function () {
- var self = this
- return {
- method: this.attr('method'),
- fullPath: (this.serialize() ? [this.prop('action'), this.serialize()].join("?") : this.prop('action')),
- title: this.attr('title'),
- delegateToServer: function () {
- self.submit()
- }
- };
- });
-
- /**
- * Binds to both link clicks and form submits using jQuery's deleagate.
- *
- * Will catch all current and future links and forms. Uses the apps settings for the selector to use for links and forms
- *
- * @see Davis.App.settings
- * @memberOf listener
- */
- this.listen = function () {
- Davis.$(document).delegate(this.settings.formSelector, 'submit', submitHandler)
- Davis.$(document).delegate(this.settings.linkSelector, 'click', clickHandler)
- }
-
- /**
- * Unbinds all click and submit handlers that were attatched with listen.
- *
- * Will efectivley stop the current app from processing any requests and all links and forms will have their default
- * behaviour restored.
- *
- * @see Davis.App.settings
- * @memberOf listener
- */
- this.unlisten = function () {
- Davis.$(document).undelegate(this.settings.linkSelector, 'click', clickHandler)
- Davis.$(document).undelegate(this.settings.formSelector, 'submit', submitHandler)
- }
-}
-/*!
- * Davis - event
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
- /**
- * A plugin that adds basic event capabilities to a Davis app, it is included by default.
- *
- * @module
- */
-Davis.event = function () {
-
- /*!
- * callback storage
- */
- var callbacks = {}
-
- /**
- * Binds a callback to a named event.
- *
- * The following events are triggered internally by Davis and can be bound to
- *
- * * start : Triggered when the application is started
- * * lookupRoute : Triggered before looking up a route. The request being looked up is passed as an argument
- * * runRoute : Triggered before running a route. The request and route being run are passed as arguments
- * * routeNotFound : Triggered if no route for the current request can be found. The current request is passed as an arugment
- * * requestHalted : Triggered when a before filter halts the current request. The current request is passed as an argument
- * * unsupported : Triggered when starting a Davis app in a browser that doesn't support html5 pushState
- *
- * Example
- *
- * app.bind('runRoute', function () {
- * console.log('about to run a route')
- * })
- *
- * @param {String} event event name
- * @param {Function} fn callback
- * @memberOf event
- */
- this.bind = function (event, fn) {
- (callbacks[event] = callbacks[event] || []).push(fn);
- return this;
- };
-
- /**
- * Triggers an event with the given arguments.
- *
- * @param {String} event event name
- * @param {Mixed} ...
- * @memberOf event
- */
- this.trigger = function (event) {
- var args = Davis.utils.toArray(arguments, 1),
- handlers = callbacks[event];
-
- if (!handlers) return this
-
- for (var i = 0, len = handlers.length; i < len; ++i) {
- handlers[i].apply(this, args)
- }
-
- return this;
- };
-}
-/*!
- * Davis - logger
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-/**
- * A plugin for enhancing the standard logging available through the console object.
- * Automatically included in all Davis apps.
- *
- * Generates log messages of varying severity in the format
- *
- * `[Sun Jan 23 2011 16:15:21 GMT+0000 (GMT)] <message>`
- *
- * @module
- */
-Davis.logger = function () {
-
- /*!
- * Generating the timestamp portion of the log message
- * @private
- */
- function timestamp(){
- return "[" + Date() + "]";
- }
-
- /*!
- * Pushing the timestamp onto the front of the arguments to log
- * @private
- */
- function prepArgs(args) {
- var a = Davis.utils.toArray(args)
- a.unshift(timestamp())
- return a.join(' ');
- }
-
- var logType = function (logLevel) {
- return function () {
- //if (window.console) console[logLevel](prepArgs(arguments));
- }
- }
-
-
- /**
- * Prints an error message to the console if the console is available.
- *
- * @params {String} All arguments are combined and logged to the console.
- * @memberOf logger
- */
- var error = logType('error')
-
- /**
- * Prints an info message to the console if the console is available.
- *
- * @params {String} All arguments are combined and logged to the console.
- * @memberOf logger
- */
- var info = logType('info')
-
- /**
- * Prints a warning message to the console if the console is available.
- *
- * @params {String} All arguments are combined and logged to the console.
- * @memberOf logger
- */
- var warn = logType('warn')
-
- /*!
- * Exposes the public methods of the module
- * @private
- */
- this.logger = {
- error: error,
- info: info,
- warn: warn
- }
-}/*!
- * Davis - Route
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-Davis.Route = (function () {
-
- var pathNameRegex = /:([\w\d]+)/g;
- var pathNameReplacement = "([^\/]+)";
-
- var splatNameRegex = /\*([\w\d]+)/g;
- var splatNameReplacement = "(.*)";
-
- var nameRegex = /[:|\*]([\w\d]+)/g
-
-/**
- * Davis.Routes are the main part of a Davis application. They consist of an HTTP method, a path
- * and a callback function. When a link or a form that Davis has bound to are clicked or submitted
- * a request is pushed on the history stack and a route that matches the path and method of the
- * generated request is run.
- *
- * The path for the route can consist of placeholders for attributes, these will then be available
- * on the request. Simple variables should be prefixed with a colan, and for splat style params use
- * an asterisk.
- *
- * Inside the callback function 'this' is bound to the request.
- *
- * Example:
- *
- * var route = new Davis.Route ('get', '/foo/:id', function (req) {
- * var id = req.params['id']
- * // do something interesting!
- * })
- *
- * var route = new Davis.Route ('get', '/foo/*splat', function (req) {
- * var id = req.params['splat']
- * // splat will contain everything after the /foo/ in the path.
- * })
- *
- * You can include any number of route level 'middleware' when defining routes. These middlewares are
- * run in order and need to explicitly call the next handler in the stack. Using route middleware allows
- * you to share common logic between routes and is also a good place to load any data or do any async calls
- * keeping your main handler simple and focused.
- *
- * Example:
- *
- * var loadUser = function (req, next) {
- * $.get('/users/current', function (user) {
- * req.user = user
- * next(req)
- * })
- * }
- *
- * var route = new Davis.Route ('get', '/foo/:id', loadUser, function (req) {
- * renderUser(req.user)
- * })
- *
- * @constructor
- * @param {String} method This should be one of either 'get', 'post', 'put', 'delete', 'before', 'after' or 'state'
- * @param {String} path This string can contain place holders for variables, e.g. '/user/:id' or '/user/*splat'
- * @param {Function} callback One or more callbacks that will be called in order when a request matching both the path and method is triggered.
- */
- var Route = function (method, path, handlers) {
- var convertPathToRegExp = function () {
- if (!(path instanceof RegExp)) {
- var str = path
- .replace(pathNameRegex, pathNameReplacement)
- .replace(splatNameRegex, splatNameReplacement);
-
- // Most browsers will reset this to zero after a replace call. IE will
- // set it to the index of the last matched character.
- path.lastIndex = 0;
-
- return new RegExp("^" + str + "$", "gi");
- } else {
- return path;
- };
- };
-
- var convertMethodToRegExp = function () {
- if (!(method instanceof RegExp)) {
- return new RegExp("^" + method + "$", "i");
- } else {
- return method
- };
- }
-
- var capturePathParamNames = function () {
- var names = [], a;
- while ((a = nameRegex.exec(path))) names.push(a[1]);
- return names;
- };
-
- this.paramNames = capturePathParamNames();
- this.path = convertPathToRegExp();
- this.method = convertMethodToRegExp();
-
- if (typeof handlers === 'function') {
- this.handlers = [handlers]
- } else {
- this.handlers = handlers;
- }
- }
-
- /**
- * Tests whether or not a route matches a particular request.
- *
- * Example:
- *
- * route.match('get', '/foo/12')
- *
- * @param {String} method the method to match against
- * @param {String} path the path to match against
- * @returns {Boolean}
- */
- Route.prototype.match = function (method, path) {
- this.reset();
- return (this.method.test(method)) && (this.path.test(path))
- }
-
- /**
- * Resets the RegExps for method and path
- */
- Route.prototype.reset = function () {
- this.method.lastIndex = 0;
- this.path.lastIndex = 0;
- }
-
- /**
- * Runs the callback associated with a particular route against the passed request.
- *
- * Any named params in the request path are extracted, as per the routes path, and
- * added onto the requests params object.
- *
- * Example:
- *
- * route.run(request)
- *
- * @params {Davis.Request} request
- * @returns {Object} whatever the routes callback returns
- */
- Route.prototype.run = function (request) {
- this.reset();
- var matches = this.path.exec(request.path);
- if (matches) {
- matches.shift();
- for (var i=0; i < matches.length; i++) {
- request.params[this.paramNames[i]] = matches[i];
- };
- };
-
- var handlers = Davis.utils.map(this.handlers, function (handler, i) {
- return function (req) {
- return handler.call(req, req, handlers[i+1])
- }
- })
-
- return handlers[0](request)
- }
-
- /**
- * Converts the route to a string representation of itself by combining the method and path
- * attributes.
- *
- * @returns {String} string representation of the route
- */
- Route.prototype.toString = function () {
- return [this.method, this.path].join(' ');
- }
-
- /*!
- * exposing the constructor
- * @private
- */
- return Route;
-})()
-/*!
- * Davis - router
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-/**
- * A decorator that adds convinience methods to a Davis.App for easily creating instances
- * of Davis.Route and looking up routes for a particular request.
- *
- * Provides get, post put and delete method shortcuts for creating instances of Davis.Routes
- * with the corresponding method. This allows simple REST styled routing for a client side
- * JavaScript application.
- *
- * ### Example
- *
- * app.get('/foo/:id', function (req) {
- * // get the foo with id = req.params['id']
- * })
- *
- * app.post('/foo', function (req) {
- * // create a new instance of foo with req.params
- * })
- *
- * app.put('/foo/:id', function (req) {
- * // update the instance of foo with id = req.params['id']
- * })
- *
- * app.del('/foo/:id', function (req) {
- * // delete the instance of foo with id = req.params['id']
- * })
- *
- * As well as providing convinience methods for creating instances of Davis.Routes the router
- * also provides methods for creating special instances of routes called filters. Before filters
- * run before any matching route is run, and after filters run after any matched route has run.
- * A before filter can return false to halt the running of any matched routes or other before filters.
- *
- * A filter can take an optional path to match on, or without a path will match every request.
- *
- * ### Example
- *
- * app.before('/foo/:id', function (req) {
- * // will only run before request matching '/foo/:id'
- * })
- *
- * app.before(function (req) {
- * // will run before all routes
- * })
- *
- * app.after('/foo/:id', function (req) {
- * // will only run after routes matching '/foo/:id'
- * })
- *
- * app.after(function (req) {
- * // will run after all routes
- * })
- *
- * Another special kind of route, called state routes, are also generated using the router. State routes
- * are for requests that will not change the current page location. Instead the page location will remain
- * the same but the current state of the page has changed. This allows for states which the server will not
- * be expected to know about and support.
- *
- * ### Example
- *
- * app.state('/foo/:id', function (req) {
- * // will run when the app transitions into the '/foo/:id' state.
- * })
- *
- * Using the `trans` method an app can transition to these kind of states without changing the url location.
- *
- * For convinience routes can be defined within a common base scope, this is useful for keeping your route
- * definitions simpler and DRYer. A scope can either cover the whole app, or just a subset of the routes.
- *
- * ### Example
- *
- * app.scope('/foo', function () {
- * this.get('/:id', function () {
- * // will run for routes that match '/foo/:id'
- * })
- * })
- *
- * @module
- */
-Davis.router = function () {
-
- /**
- * Low level method for adding routes to your application.
- *
- * If called with just a method will return a partially applied function that can create routes with
- * that method. This is used internally to provide shortcuts for get, post, put, delete and state
- * routes.
- *
- * You normally want to use the higher level methods such as get and post, but this can be useful for extending
- * Davis to work with other kinds of requests.
- *
- * Example:
- *
- * app.route('get', '/foo', function (req) {
- * // will run when a get request is made to '/foo'
- * })
- *
- * app.patch = app.route('patch') // will return a function that can be used to handle requests with method of patch.
- * app.patch('/bar', function (req) {
- * // will run when a patch request is made to '/bar'
- * })
- *
- * @param {String} method The method for this route.
- * @param {String} path The path for this route.
- * @param {Function} handler The handler for this route, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @memberOf router
- */
- this.route = function (method, path) {
- var createRoute = function (path) {
- var handlers = Davis.utils.toArray(arguments, 1),
- scope = scopePaths.join(''),
- fullPath, route
-
- (typeof path == 'string') ? fullPath = scope + path : fullPath = path
-
- route = new Davis.Route (method, fullPath, handlers)
-
- routeCollection.push(route)
- return route
- }
-
- return (arguments.length == 1) ? createRoute : createRoute.apply(this, Davis.utils.toArray(arguments, 1))
- }
-
- /**
- * A convinience wrapper around `app.route` for creating get routes.
- *
- * @param {String} path The path for this route.
- * @param {Function} handler The handler for this route, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @see Davis.router.route
- * @memberOf router
- */
- this.get = this.route('get')
-
- /**
- * A convinience wrapper around `app.route` for creating post routes.
- *
- * @param {String} path The path for this route.
- * @param {Function} handler The handler for this route, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @see Davis.router.route
- * @memberOf router
- */
- this.post = this.route('post')
-
- /**
- * A convinience wrapper around `app.route` for creating put routes.
- *
- * @param {String} path The path for this route.
- * @param {Function} handler The handler for this route, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @see Davis.router.route
- * @memberOf router
- */
- this.put = this.route('put')
-
- /**
- * A convinience wrapper around `app.route` for creating delete routes.
- *
- * delete is a reserved word in javascript so use the `del` method when creating a Davis.Route with a method of delete.
- *
- * @param {String} path The path for this route.
- * @param {Function} handler The handler for this route, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @see Davis.router.route
- * @memberOf router
- */
- this.del = this.route('delete')
-
- /**
- * Adds a state route into the apps route collection.
- *
- * These special kind of routes are not triggered by clicking links or submitting forms, instead they
- * are triggered manually by calling `trans`.
- *
- * Routes added using the state method act in the same way as other routes except that they generate
- * a route that is listening for requests that will not change the page location.
- *
- * Example:
- *
- * app.state('/foo/:id', function (req) {
- * // will run when the app transitions into the '/foo/:id' state.
- * })
- *
- * @param {String} path The path for this route, this will never be seen in the url bar.
- * @param {Function} handler The handler for this route, will be called with the request that triggered the route
- * @memberOf router
- *
- */
- this.state = this.route('state');
-
- /**
- * Modifies the scope of the router.
- *
- * If you have many routes that share a common path prefix you can use scope to reduce repeating
- * that path prefix.
- *
- * You can use `scope` in two ways, firstly you can set the scope for the whole app by calling scope
- * before defining routes. You can also provide a function to the scope method, and the scope will
- * only apply to those routes defined within this function. It is also possible to nest scopes within
- * other scopes.
- *
- * Example
- *
- * // using scope with a function
- * app.scope('/foo', function () {
- * this.get('/bar', function (req) {
- * // this route will have a path of '/foo/bar'
- * })
- * })
- *
- * // setting a global scope for the rest of the application
- * app.scope('/bar')
- *
- * // using scope with a function
- * app.scope('/foo', function () {
- * this.scope('/bar', function () {
- * this.get('/baz', function (req) {
- * // this route will have a path of '/foo/bar/baz'
- * })
- * })
- * })
- *
- * @memberOf router
- * @param {String} path The prefix to use as the scope
- * @param {Function} fn A function that will be executed with the router as its context and the path
- * as a prefix
- *
- */
- this.scope = function (path, fn) {
- scopePaths.push(path)
- if (arguments.length == 1) return
-
- fn.call(this, this)
- scopePaths.pop()
- }
-
- /**
- * Transitions the app into the state identified by the passed path parameter.
- *
- * This allows the app to enter states without changing the page path through a link click or form submit.
- * If there are handlers registered for this state, added by the `state` method, they will be triggered.
- *
- * This method generates a request with a method of 'state', in all other ways this request is identical
- * to those that are generated when clicking links etc.
- *
- * States transitioned to using this method will not be able to be revisited directly with a page load as
- * there is no url that represents the state.
- *
- * An optional second parameter can be passed which will be available to any handlers in the requests
- * params object.
- *
- * Example
- *
- * app.trans('/foo/1')
- *
- * app.trans('/foo/1', {
- * "bar": "baz"
- * })
- *
- *
- * @param {String} path The path that represents this state. This will not be seen in the url bar.
- * @param {Object} data Any additional data that should be sent with the request as params.
- * @memberOf router
- */
- this.trans = function (path, data) {
- if (data) {
- var fullPath = [path, decodeURIComponent(Davis.$.param(data))].join('?')
- } else {
- var fullPath = path
- };
-
- var req = new Davis.Request({
- method: 'state',
- fullPath: fullPath,
- title: ''
- })
-
- Davis.location.assign(req)
- }
-
- /*!
- * Generating convinience methods for creating filters using Davis.Routes and methods to
- * lookup filters.
- */
- this.filter = function (filterName) {
- return function () {
- var method = /.+/;
-
- if (arguments.length == 1) {
- var path = /.+/;
- var handler = arguments[0];
- } else if (arguments.length == 2) {
- var path = scopePaths.join('') + arguments[0];
- var handler = arguments[1];
- };
-
- var route = new Davis.Route (method, path, handler)
- filterCollection[filterName].push(route);
- return route
- }
- }
-
- this.lookupFilter = function (filterType) {
- return function (method, path) {
- return Davis.utils.filter(filterCollection[filterType], function (route) {
- return route.match(method, path)
- });
- }
- }
-
- /**
- * A convinience wrapper around `app.filter` for creating before filters.
- *
- * @param {String} path The optionl path for this filter.
- * @param {Function} handler The handler for this filter, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @memberOf router
- */
- this.before = this.filter('before')
-
- /**
- * A convinience wrapper around `app.filter` for creating after filters.
- *
- * @param {String} path The optionl path for this filter.
- * @param {Function} handler The handler for this filter, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @memberOf router
- */
- this.after = this.filter('after')
-
- /**
- * A convinience wrapper around `app.lookupFilter` for looking up before filters.
- *
- * @param {String} path The optionl path for this filter.
- * @param {Function} handler The handler for this filter, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @memberOf router
- */
- this.lookupBeforeFilter = this.lookupFilter('before')
-
- /**
- * A convinience wrapper around `app.lookupFilter` for looking up after filters.
- *
- * @param {String} path The optionl path for this filter.
- * @param {Function} handler The handler for this filter, will be called with the request that triggered the route.
- * @returns {Davis.Route} the route that has just been created and added to the route list.
- * @memberOf router
- */
- this.lookupAfterFilter = this.lookupFilter('after')
-
- /*!
- * collections of routes and filters
- * @private
- */
- var routeCollection = [];
- var filterCollection = {
- before: [],
- after: []
- };
- var scopePaths = []
-
- /**
- * Looks for the first route that matches the method and path from a request.
- * Will only find and return the first matched route.
- *
- * @param {String} method the method to use when looking up a route
- * @param {String} path the path to use when looking up a route
- * @returns {Davis.Route} route
- * @memberOf router
- */
- this.lookupRoute = function (method, path) {
- return Davis.utils.filter(routeCollection, function (route) {
- return route.match(method, path)
- })[0];
- };
-}
-/*!
- * Davis - history
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-/**
- * A module to normalize and enhance the window.pushState method and window.onpopstate event.
- *
- * Adds the ability to bind to whenever a new state is pushed onto the history stack and normalizes
- * both of these events into an onChange event.
- *
- * @module
- */
-Davis.history = (function () {
-
- /*!
- * storage for the push state handlers
- * @private
- */
- var pushStateHandlers = [];
-
- /*!
- * keep track of whether or not webkit like browsers have fired their initial
- * page load popstate
- * @private
- */
- var popped = false
-
- /*!
- * Add a handler to the push state event. This event is not a native event but is fired
- * every time a call to pushState is called.
- *
- * @param {Function} handler
- * @private
- */
- function onPushState(handler) {
- pushStateHandlers.push(handler);
- };
-
- /*!
- * Simple wrapper for the native onpopstate event.
- *
- * @param {Function} handler
- * @private
- */
- function onPopState(handler) {
- window.addEventListener('popstate', handler, true);
- };
-
- /*!
- * returns a handler that wraps the native event given onpopstate.
- * When the page first loads or going back to a time in the history that was not added
- * by pushState the event.state object will be null. This generates a request for the current
- * location in those cases
- *
- * @param {Function} handler
- * @private
- */
- function wrapped(handler) {
- return function (event) {
- if (event.state && event.state._davis) {
- handler(new Davis.Request(event.state._davis))
- } else {
- if (popped) handler(Davis.Request.forPageLoad())
- };
- popped = true
- }
- }
-
- /*!
- * provide a wrapper for any data that is going to be pushed into the history stack. All
- * data is wrapped in a "_davis" namespace.
- * @private
- */
- function wrapStateData(data) {
- return {"_davis": data}
- }
-
- /**
- * Bind to the history on change event.
- *
- * This is not a native event but is fired any time a new state is pushed onto the history stack,
- * the current history is replaced or a state is popped off the history stack.
- * The handler function will be called with a request param which is an instance of Davis.Request.
- *
- * @param {Function} handler a function that will be called on push and pop state.
- * @see Davis.Request
- * @memberOf history
- */
- function onChange(handler) {
- onPushState(handler);
- onPopState(wrapped(handler));
- };
-
- /*!
- * returns a function for manipulating the history state and optionally calling any associated
- * pushStateHandlers
- *
- * @param {String} methodName the name of the method to manipulate the history state with.
- * @private
- */
- function changeStateWith (methodName) {
- return function (request, opts) {
- popped = true
- history[methodName](wrapStateData(request.toJSON()), request.title, request.location());
- if (opts && opts.silent) return
- Davis.utils.forEach(pushStateHandlers, function (handler) {
- handler(request);
- });
- }
- }
-
- /**
- * Pushes a request onto the history stack.
- *
- * This is used internally by Davis to push a new request
- * resulting from either a form submit or a link click onto the history stack, it will also trigger
- * the onpushstate event.
- *
- * An instance of Davis.Request is expected to be passed, however any object that has a title
- * and a path property will also be accepted.
- *
- * @param {Davis.Request} request the location to be assinged as the current location.
- * @memberOf history
- */
- var assign = changeStateWith('pushState')
-
- /**
- * Replace the current state on the history stack.
- *
- * This is used internally by Davis when performing a redirect. This will trigger an onpushstate event.
- *
- * An instance of Davis.Request is expected to be passed, however any object that has a title
- * and a path property will also be accepted.
- *
- * @param {Davis.Request} request the location to replace the current location with.
- * @memberOf history
- */
- var replace = changeStateWith('replaceState')
-
- /**
- * Returns the current location for the application.
- *
- * Davis.location delegates to this method for getting the apps current location.
- *
- * @memberOf history
- */
- function current() {
- return window.location.pathname + (window.location.search ? window.location.search : '')
- }
-
- /*!
- * Exposing the public methods of this module
- * @private
- */
- return {
- onChange: onChange,
- current: current,
- assign: assign,
- replace: replace
- }
-})()
-/*!
- * Davis - location
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-/**
- * A module that acts as a delegator to any locationDelegate implementation. This abstracts the details of
- * what is being used for the apps routing away from the rest of the library. This allows any kind of routing
- * To be used with Davis as long as it can respond appropriatly to the given delegate methods.
- *
- * A routing module must respond to the following methods
- *
- * * __current__ : Should return the current location for the app
- * * __assign__ : Should set the current location of the app based on the location of the passed request.
- * * __replace__ : Should at least change the current location to the location of the passed request, for full compatibility it should not add any extra items in the history stack.
- * * __onChange__ : Should add calbacks that will be fired whenever the location is changed.
- *
- * @module
- *
- */
-Davis.location = (function () {
-
- /*!
- * By default the Davis uses the Davis.history module for its routing, this gives HTML5 based pushState routing
- * which is preferrable over location.hash based routing.
- */
- var locationDelegate = Davis.history
-
- /**
- * Sets the current location delegate.
- *
- * The passed delegate will be used for all Davis apps. The delegate
- * must respond to the following four methods `current`, `assign`, `replace` & `onChange`.
- *
- * @param {Object} the location delegate to use.
- * @memberOf location
- */
- function setLocationDelegate(delegate) {
- locationDelegate = delegate
- }
-
- /**
- * Delegates to the locationDelegate.current method.
- *
- * This should return the current location of the app.
- *
- * @memberOf location
- */
- function current() {
- return locationDelegate.current()
- }
-
- /*!
- * Creates a function which sends the location delegate the passed message name.
- * It handles converting a string path to an actual request
- *
- * @returns {Function} a function that calls the location delegate with the supplied method name
- * @memberOf location
- * @private
- */
- function sendLocationDelegate (methodName) {
- return function (req, opts) {
- if (typeof req == 'string') req = new Davis.Request (req)
- locationDelegate[methodName](req, opts)
- }
- }
-
- /**
- * Delegates to the locationDelegate.assign method.
- *
- * This should set the current location for the app to that of the passed request object.
- *
- * Can take either a Davis.Request or a string representing the path of the request to assign.
- *
- *
- *
- * @param {Request} req the request to replace the current location with, either a string or a Davis.Request.
- * @param {Object} opts the optional options object that will be passed to the location delegate
- * @see Davis.Request
- * @memberOf location
- */
- var assign = sendLocationDelegate('assign')
-
- /**
- * Delegates to the locationDelegate.replace method.
- *
- * This should replace the current location with that of the passed request.
- * Ideally it should not create a new entry in the browsers history.
- *
- * Can take either a Davis.Request or a string representing the path of the request to assign.
- *
- * @param {Request} req the request to replace the current location with, either a string or a Davis.Request.
- * @param {Object} opts the optional options object that will be passed to the location delegate
- * @see Davis.Request
- * @memberOf location
- */
- var replace = sendLocationDelegate('replace')
-
- /**
- * Delegates to the locationDelegate.onChange method.
- *
- * This should add a callback that will be called any time the location changes.
- * The handler function will be called with a request param which is an instance of Davis.Request.
- *
- * @param {Function} handler callback function to be called on location chnage.
- * @see Davis.Request
- * @memberOf location
- *
- */
- function onChange(handler) {
- locationDelegate.onChange(handler)
- }
-
- /*!
- * Exposing the public methods of this module
- * @private
- */
- return {
- setLocationDelegate: setLocationDelegate,
- current: current,
- assign: assign,
- replace: replace,
- onChange: onChange
- }
-})()
-/*!
- * Davis - Request
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-Davis.Request = (function () {
-
-/**
- * Davis.Requests are created from click and submit events. Davis.Requests are passed to Davis.Routes
- * and are stored in the history stack. They are instantiated by the Davis.listener module.
- *
- * A request will have a params object which will contain all query params and form params, any named
- * params in a routes path will also be added to the requests params object. Also included is support
- * for rails style nested form params.
- *
- * By default the request method will be taken from the method attribute for forms or will be defaulted
- * to 'get' for links, however there is support for using a hidden field called _method in your forms
- * to set the correct reqeust method.
- *
- * Simple get requests can be created by just passing a path when initializing a request, to set the method
- * or title you have to pass in an object.
- *
- * Each request will have a timestamp property to make it easier to determine if the application is moving
- * forward or backward through the history stack.
- *
- * Example
- *
- * var request = new Davis.Request ("/foo/12")
- *
- * var request = new Davis.Request ("/foo/12", {title: 'foo', method: 'POST'})
- *
- * var request = new Davis.Request({
- * title: "foo",
- * fullPath: "/foo/12",
- * method: "get"
- * })
- *
- * @constructor
- * @param {String} fullPath
- * @param {Object} opts An optional object with a title or method proprty
- *
- */
- var Request = function (fullPath, opts) {
- if (typeof fullPath == 'object') {
- opts = fullPath
- fullPath = opts.fullPath
- delete opts.fullPath
- }
-
- var raw = Davis.$.extend({}, {
- title: "",
- fullPath: fullPath,
- method: "get",
- timestamp: +new Date ()
- }, opts)
-
- raw.fullPath = raw.fullPath.replace(/\+/g, '%20')
-
- var self = this;
- this.raw = raw;
- this.params = {};
- this.title = raw.title;
- this.queryString = raw.fullPath.split("?")[1];
- this.timestamp = raw.timestamp;
- this._staleCallback = function () {};
-
- if (this.queryString) {
- Davis.utils.forEach(this.queryString.split("&"), function (keyval) {
- var paramName = decodeURIComponent(keyval.split("=")[0]),
- paramValue = keyval.split("=")[1],
- nestedParamRegex = /^(\w+)\[(\w+)?\](\[\])?/,
- nested;
- if (nested = nestedParamRegex.exec(paramName)) {
- var paramParent = nested[1];
- var paramName = nested[2];
- var isArray = !!nested[3];
- var parentParams = self.params[paramParent] || {};
-
- if (isArray) {
- parentParams[paramName] = parentParams[paramName] || [];
- parentParams[paramName].push(decodeURIComponent(paramValue));
- self.params[paramParent] = parentParams;
- } else if (!paramName && !isArray) {
- parentParams = self.params[paramParent] || []
- parentParams.push(decodeURIComponent(paramValue))
- self.params[paramParent] = parentParams
- } else {
- parentParams[paramName] = decodeURIComponent(paramValue);
- self.params[paramParent] = parentParams;
- }
- } else {
- self.params[paramName] = decodeURIComponent(paramValue);
- };
-
- });
- };
-
- raw.fullPath = raw.fullPath.replace(/^https?:\/\/.+?\//, '/');
-
- this.method = (this.params._method || raw.method).toLowerCase();
-
- this.path = raw.fullPath
- .replace(/\?(.|[\r\n])+$/, "") // Remove the query string
- .replace(/^https?:\/\/[^\/]+/, ""); // Remove the protocol and host parts
-
- this.fullPath = raw.fullPath;
-
- this.delegateToServer = raw.delegateToServer || Davis.noop;
- this.isForPageLoad = raw.forPageLoad || false;
-
- if (Request.prev) Request.prev.makeStale(this);
- Request.prev = this;
-
- };
-
- /**
- * Redirects the current request to a new location.
- *
- * Calling redirect on an instance of Davis.Request will create a new request using the path and
- * title of the current request. Redirected requests always have a method of 'get'.
- *
- * The request created will replace the current request in the history stack. Redirect is most
- * often useful inside a handler for a form submit. After succesfully handling the form the app
- * can redirect to another path. This means that the current form will not be re-submitted if
- * navigating through the history with the back or forward buttons because the request that the
- * submit generated has been replaced in the history stack.
- *
- * Example
- *
- * this.post('/foo', function (req) {
- * processFormRequest(req.params) // do something with the form request
- * req.redirect('/bar');
- * })
- *
- * @param {String} path The path to redirect the current request to
- * @param {Object} opts The optional options object that will be passed through to the location
- * @memberOf Request
- */
- Request.prototype.redirect = function (path, opts) {
- Davis.location.replace(new Request ({
- method: 'get',
- fullPath: path,
- title: this.title
- }), opts);
- };
-
- /**
- * Adds a callback to be called when the request is stale.
- * A request becomes stale when it is no longer the current request, this normally occurs when a
- * new request is triggered. A request can be marked as stale manually if required. The callback
- * passed to whenStale will be called with the new request that is making the current request stale.
- *
- * Use the whenStale callback to 'teardown' the objects required for the current route, this gives
- * a chance for views to hide themselves and unbind any event handlers etc.
- *
- * Example
- *
- * this.get('/foo', function (req) {
- * var fooView = new FooView ()
- * fooView.render() // display the foo view
- * req.whenStale(function (nextReq) {
- * fooView.remove() // stop displaying foo view and unbind any events
- * })
- * })
- *
- * @param {Function} callback A single callback that will be called when the request becomes stale.
- * @memberOf Request
- *
- */
- Request.prototype.whenStale = function (callback) {
- this._staleCallback = callback;
- }
-
- /**
- * Mark the request as stale.
- *
- * This will cause the whenStale callback to be called.
- *
- * @param {Davis.Request} req The next request that has been recieved.
- * @memberOf Request
- */
- Request.prototype.makeStale = function (req) {
- this._staleCallback.call(req, req);
- }
-
- /**
- * Returns the location or path that should be pushed onto the history stack.
- *
- * For get requests this will be the same as the path, for post, put, delete and state requests this will
- * be blank as no location should be pushed onto the history stack.
- *
- * @returns {String} string The location that the url bar should display and should be pushed onto the history stack for this request.
- * @memberOf Request
- */
- Request.prototype.location = function () {
- return (this.method === 'get') ? decodeURI(this.fullPath) : ''
- }
-
- /**
- * Converts the request to a string representation of itself by combining the method and fullPath
- * attributes.
- *
- * @returns {String} string representation of the request
- * @memberOf Request
- */
- Request.prototype.toString = function () {
- return [this.method.toUpperCase(), this.path].join(" ")
- };
-
- /**
- * Converts the request to a plain object which can be converted to a JSON string.
- *
- * Used when pushing a request onto the history stack.
- *
- * @returns {Object} a plain object representation of the request.
- * @memberOf Request
- */
- Request.prototype.toJSON = function () {
- return {
- title: this.raw.title,
- fullPath: this.raw.fullPath,
- method: this.raw.method,
- timestamp: this.raw.timestamp
- }
- }
-
- /**
- * Creates a new request for the page on page load.
- *
- * This is required because usually requests are generated from clicking links or submitting forms
- * however this doesn't happen on a page load but should still be considered a request that the
- * JavaScript app should handle.
- *
- * @returns {Davis.Request} A request representing the current page loading.
- * @memberOf Request
- */
- Request.forPageLoad = function () {
- return new this ({
- method: 'get',
- // fullPath: window.location.pathname,
- fullPath: Davis.location.current(),
- title: document.title,
- forPageLoad: true
- });
- }
-
- /*!
- * Stores the last request
- * @private
- */
- Request.prev = null
-
- return Request
-
-})()
-/*!
- * Davis - App
- * Copyright (C) 2011 Oliver Nightingale
- * MIT Licensed
- */
-
-Davis.App = (function () {
-
- /**
- * Constructor for Davis.App
- *
- * @constructor
- * @returns {Davis.App}
- */
- function App() {
- this.running = false;
- this.boundToInternalEvents = false;
-
- this.use(Davis.listener)
- this.use(Davis.event)
- this.use(Davis.router)
- this.use(Davis.logger)
- };
-
- /**
- * A convinience function for changing the apps default settings.
- *
- * Should be used before starting the app to ensure any new settings
- * are picked up and used.
- *
- * Example:
- *
- * app.configure(function (config) {
- * config.linkSelector = 'a.davis'
- * config.formSelector = 'form.davis'
- * })
- *
- * @param {Function} config This function will be executed with the context bound to the apps setting object, this will also be passed as the first argument to the function.
- */
- App.prototype.configure = function(config) {
- config.call(this.settings, this.settings);
- };
-
- /**
- * Method to include a plugin in this app.
- *
- * A plugin is just a function that will be evaluated in the context of the app.
- *
- * Example:
- * app.use(Davis.title)
- *
- * @param {Function} plugin The plugin to use
- *
- */
- App.prototype.use = function(plugin) {
- plugin.apply(this, Davis.utils.toArray(arguments, 1))
- };
-
- /**
- * Method to add helper properties to all requests in the application.
- *
- * Helpers will be added to the Davis.Request.prototype. Care should be taken not to override any existing Davis.Request
- * methods.
- *
- * @param {Object} helpers An object containing helpers to mixin to the request
- */
- App.prototype.helpers = function(helpers) {
- for (property in helpers) {
- if (helpers.hasOwnProperty(property)) Davis.Request.prototype[property] = helpers[property]
- }
- };
-
- /**
- * Settings for the app. These may be overriden directly or by using the configure
- * convinience method.
- *
- * `linkSelector` is the jquery selector for all the links on the page that you want
- * Davis to respond to. These links will not trigger a normal http request.
- *
- * `formSelector` is similar to link selector but for all the forms that davis will bind to
- *
- * `throwErrors` decides whether or not any errors will be caugth by Davis. If this is set to true
- * errors will be thrown so that the request will not be handled by JavaScript, the server will have
- * to provide a response. When set to false errors in a route will be caught and the server will not
- * receive the request.
- *
- * `handleRouteNotFound` determines whether or not Davis should handle requests when there is no matching
- * route. If set to false Davis will allow the request to be passed to your server to handle if no matching
- * route can be found.
- *
- * `generateRequestOnPageLoad` determines whether a request should be generated for the initial page load.
- * by default this is set to false. A Davis.Request will not be generated with the path of the current
- * page. Setting this to true will cause a request to be passed to your app for the inital page load.
- *
- * @see #configure
- */
-
- App.prototype.settings = {
- linkSelector: 'a',
- formSelector: 'form',
- throwErrors: true,
- handleRouteNotFound: false,
- generateRequestOnPageLoad: false
- };
-
- /**
- * Starts the app's routing.
- *
- * Apps created using the convinience Davis() function are automatically started.
- *
- * Starting the app binds all links and forms, so clicks and submits
- * create Davis requests that will be pushed onto the browsers history stack. Browser history change
- * events will be picked up and the request that caused the change will be matched against the apps
- * routes and filters.
- */
- App.prototype.start = function(){
- var self = this;
-
- if (this.running) return
-
- if (!Davis.supported()) {
- this.trigger('unsupported')
- return
- };
-
- var runFilterWith = function (request) {
- return function (filter) {
- var result = filter.run(request, request);
- return (typeof result === "undefined" || result);
- }
- }
-
- var beforeFiltersPass = function (request) {
- return Davis.utils.every(
- self.lookupBeforeFilter(request.method, request.path),
- runFilterWith(request)
- )
- }
-
- var handleRequest = function (request) {
- if (beforeFiltersPass(request)) {
- self.trigger('lookupRoute', request)
- var route = self.lookupRoute(request.method, request.path);
- if (route) {
- self.trigger('runRoute', request, route);
-
- try {
- route.run(request)
- self.trigger('routeComplete', request, route)
- } catch (error) {
- self.trigger('routeError', request, route, error)
- }
-
- Davis.utils.every(
- self.lookupAfterFilter(request.method, request.path),
- runFilterWith(request)
- );
-
- } else {
- self.trigger('routeNotFound', request);
- }
- } else {
- self.trigger('requestHalted', request)
- }
- }
-
- var bindToInternalEvents = function () {
- self
- .bind('runRoute', function (request) {
- self.logger.info("runRoute: " + request.toString());
- })
- .bind('routeNotFound', function (request) {
- if (!self.settings.handleRouteNotFound && !request.isForPageLoad) {
- self.stop()
- request.delegateToServer()
- };
- self.logger.warn("routeNotFound: " + request.toString());
- })
- .bind('start', function () {
- self.logger.info("application started")
- })
- .bind('stop', function () {
- self.logger.info("application stopped")
- })
- .bind('routeError', function (request, route, error) {
- if (self.settings.throwErrors) throw(error)
- self.logger.error(error.message, error.stack)
- });
-
- Davis.location.onChange(function (req) {
- handleRequest(req)
- });
-
- self.boundToInternalEvents = true
- }
-
- if (!this.boundToInternalEvents) bindToInternalEvents()
-
- this.listen();
- this.trigger('start')
- this.running = true;
-
- if (this.settings.generateRequestOnPageLoad) handleRequest(Davis.Request.forPageLoad())
-
- };
-
- /**
- * Stops the app's routing.
- *
- * Stops the app listening to clicks and submits on all forms and links found using the current
- * apps settings.
- */
- App.prototype.stop = function() {
- this.unlisten();
- this.trigger('stop')
- this.running = false
- };
-
- return App;
-})()
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/dropzone.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/dropzone.js
deleted file mode 100755
index 895b055..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/dropzone.js
+++ /dev/null
@@ -1,1767 +0,0 @@
-
-/*
- *
- * More info at [www.dropzonejs.com](http://www.dropzonejs.com)
- *
- * Copyright (c) 2012, Matias Meno
- *
- * 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() {
- var Dropzone, Emitter, camelize, contentLoaded, detectVerticalSquash, drawImageIOSFix, noop, without,
- __slice = [].slice,
- __hasProp = {}.hasOwnProperty,
- __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
-
- noop = function() {};
-
- Emitter = (function() {
- function Emitter() {}
-
- Emitter.prototype.addEventListener = Emitter.prototype.on;
-
- Emitter.prototype.on = function(event, fn) {
- this._callbacks = this._callbacks || {};
- if (!this._callbacks[event]) {
- this._callbacks[event] = [];
- }
- this._callbacks[event].push(fn);
- return this;
- };
-
- Emitter.prototype.emit = function() {
- var args, callback, callbacks, event, _i, _len;
- event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- this._callbacks = this._callbacks || {};
- callbacks = this._callbacks[event];
- if (callbacks) {
- for (_i = 0, _len = callbacks.length; _i < _len; _i++) {
- callback = callbacks[_i];
- callback.apply(this, args);
- }
- }
- return this;
- };
-
- Emitter.prototype.removeListener = Emitter.prototype.off;
-
- Emitter.prototype.removeAllListeners = Emitter.prototype.off;
-
- Emitter.prototype.removeEventListener = Emitter.prototype.off;
-
- Emitter.prototype.off = function(event, fn) {
- var callback, callbacks, i, _i, _len;
- if (!this._callbacks || arguments.length === 0) {
- this._callbacks = {};
- return this;
- }
- callbacks = this._callbacks[event];
- if (!callbacks) {
- return this;
- }
- if (arguments.length === 1) {
- delete this._callbacks[event];
- return this;
- }
- for (i = _i = 0, _len = callbacks.length; _i < _len; i = ++_i) {
- callback = callbacks[i];
- if (callback === fn) {
- callbacks.splice(i, 1);
- break;
- }
- }
- return this;
- };
-
- return Emitter;
-
- })();
-
- Dropzone = (function(_super) {
- var extend, resolveOption;
-
- __extends(Dropzone, _super);
-
- Dropzone.prototype.Emitter = Emitter;
-
-
- /*
- This is a list of all available events you can register on a dropzone object.
-
- You can register an event handler like this:
-
- dropzone.on("dragEnter", function() { });
- */
-
- Dropzone.prototype.events = ["drop", "dragstart", "dragend", "dragenter", "dragover", "dragleave", "addedfile", "addedfiles", "removedfile", "thumbnail", "error", "errormultiple", "processing", "processingmultiple", "uploadprogress", "totaluploadprogress", "sending", "sendingmultiple", "success", "successmultiple", "canceled", "canceledmultiple", "complete", "completemultiple", "reset", "maxfilesexceeded", "maxfilesreached", "queuecomplete"];
-
- Dropzone.prototype.defaultOptions = {
- url: null,
- method: "post",
- withCredentials: false,
- parallelUploads: 2,
- uploadMultiple: false,
- maxFilesize: 256,
- paramName: "file",
- createImageThumbnails: true,
- maxThumbnailFilesize: 10,
- thumbnailWidth: 120,
- thumbnailHeight: 120,
- filesizeBase: 1000,
- maxFiles: null,
- params: {},
- clickable: true,
- ignoreHiddenFiles: true,
- acceptedFiles: null,
- acceptedMimeTypes: null,
- autoProcessQueue: true,
- autoQueue: true,
- addRemoveLinks: false,
- previewsContainer: null,
- hiddenInputContainer: "body",
- capture: null,
- renameFilename: null,
- dictDefaultMessage: "Drop files here to upload",
- dictFallbackMessage: "Your browser does not support drag'n'drop file uploads.",
- dictFallbackText: "Please use the fallback form below to upload your files like in the olden days.",
- dictFileTooBig: "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.",
- dictInvalidFileType: "You can't upload files of this type.",
- dictResponseError: "Server responded with {{statusCode}} code.",
- dictCancelUpload: "Cancel upload",
- dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?",
- dictRemoveFile: "Remove file",
- dictRemoveFileConfirmation: null,
- dictMaxFilesExceeded: "You can not upload any more files.",
- accept: function(file, done) {
- return done();
- },
- init: function() {
- return noop;
- },
- forceFallback: false,
- fallback: function() {
- var child, messageElement, span, _i, _len, _ref;
- this.element.className = "" + this.element.className + " dz-browser-not-supported";
- _ref = this.element.getElementsByTagName("div");
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- child = _ref[_i];
- if (/(^| )dz-message($| )/.test(child.className)) {
- messageElement = child;
- child.className = "dz-message";
- continue;
- }
- }
- if (!messageElement) {
- messageElement = Dropzone.createElement("<div class=\"dz-message\"><span></span></div>");
- this.element.appendChild(messageElement);
- }
- span = messageElement.getElementsByTagName("span")[0];
- if (span) {
- if (span.textContent != null) {
- span.textContent = this.options.dictFallbackMessage;
- } else if (span.innerText != null) {
- span.innerText = this.options.dictFallbackMessage;
- }
- }
- return this.element.appendChild(this.getFallbackForm());
- },
- resize: function(file) {
- var info, srcRatio, trgRatio;
- info = {
- srcX: 0,
- srcY: 0,
- srcWidth: file.width,
- srcHeight: file.height
- };
- srcRatio = file.width / file.height;
- info.optWidth = this.options.thumbnailWidth;
- info.optHeight = this.options.thumbnailHeight;
- if ((info.optWidth == null) && (info.optHeight == null)) {
- info.optWidth = info.srcWidth;
- info.optHeight = info.srcHeight;
- } else if (info.optWidth == null) {
- info.optWidth = srcRatio * info.optHeight;
- } else if (info.optHeight == null) {
- info.optHeight = (1 / srcRatio) * info.optWidth;
- }
- trgRatio = info.optWidth / info.optHeight;
- if (file.height < info.optHeight || file.width < info.optWidth) {
- info.trgHeight = info.srcHeight;
- info.trgWidth = info.srcWidth;
- } else {
- if (srcRatio > trgRatio) {
- info.srcHeight = file.height;
- info.srcWidth = info.srcHeight * trgRatio;
- } else {
- info.srcWidth = file.width;
- info.srcHeight = info.srcWidth / trgRatio;
- }
- }
- info.srcX = (file.width - info.srcWidth) / 2;
- info.srcY = (file.height - info.srcHeight) / 2;
- return info;
- },
-
- /*
- Those functions register themselves to the events on init and handle all
- the user interface specific stuff. Overwriting them won't break the upload
- but can break the way it's displayed.
- You can overwrite them if you don't like the default behavior. If you just
- want to add an additional event handler, register it on the dropzone object
- and don't overwrite those options.
- */
- drop: function(e) {
- return this.element.classList.remove("dz-drag-hover");
- },
- dragstart: noop,
- dragend: function(e) {
- return this.element.classList.remove("dz-drag-hover");
- },
- dragenter: function(e) {
- return this.element.classList.add("dz-drag-hover");
- },
- dragover: function(e) {
- return this.element.classList.add("dz-drag-hover");
- },
- dragleave: function(e) {
- return this.element.classList.remove("dz-drag-hover");
- },
- paste: noop,
- reset: function() {
- return this.element.classList.remove("dz-started");
- },
- addedfile: function(file) {
- var node, removeFileEvent, removeLink, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;
- if (this.element === this.previewsContainer) {
- this.element.classList.add("dz-started");
- }
- if (this.previewsContainer) {
- file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());
- file.previewTemplate = file.previewElement;
- this.previewsContainer.appendChild(file.previewElement);
- _ref = file.previewElement.querySelectorAll("[data-dz-name]");
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- node = _ref[_i];
- node.textContent = this._renameFilename(file.name);
- }
- _ref1 = file.previewElement.querySelectorAll("[data-dz-size]");
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
- node = _ref1[_j];
- node.innerHTML = this.filesize(file.size);
- }
- if (this.options.addRemoveLinks) {
- file._removeLink = Dropzone.createElement("<a class=\"dz-remove\" href=\"javascript:undefined;\" data-dz-remove>" + this.options.dictRemoveFile + "</a>");
- file.previewElement.appendChild(file._removeLink);
- }
- removeFileEvent = (function(_this) {
- return function(e) {
- e.preventDefault();
- e.stopPropagation();
- if (file.status === Dropzone.UPLOADING) {
- return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function() {
- return _this.removeFile(file);
- });
- } else {
- if (_this.options.dictRemoveFileConfirmation) {
- return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function() {
- return _this.removeFile(file);
- });
- } else {
- return _this.removeFile(file);
- }
- }
- };
- })(this);
- _ref2 = file.previewElement.querySelectorAll("[data-dz-remove]");
- _results = [];
- for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
- removeLink = _ref2[_k];
- _results.push(removeLink.addEventListener("click", removeFileEvent));
- }
- return _results;
- }
- },
- removedfile: function(file) {
- var _ref;
- if (file.previewElement) {
- if ((_ref = file.previewElement) != null) {
- _ref.parentNode.removeChild(file.previewElement);
- }
- }
- return this._updateMaxFilesReachedClass();
- },
- thumbnail: function(file, dataUrl) {
- var thumbnailElement, _i, _len, _ref;
- if (file.previewElement) {
- file.previewElement.classList.remove("dz-file-preview");
- _ref = file.previewElement.querySelectorAll("[data-dz-thumbnail]");
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- thumbnailElement = _ref[_i];
- thumbnailElement.alt = file.name;
- thumbnailElement.src = dataUrl;
- }
- return setTimeout(((function(_this) {
- return function() {
- return file.previewElement.classList.add("dz-image-preview");
- };
- })(this)), 1);
- }
- },
- error: function(file, message) {
- var node, _i, _len, _ref, _results;
- if (file.previewElement) {
- file.previewElement.classList.add("dz-error");
- if (typeof message !== "String" && message.error) {
- message = message.error;
- }
- _ref = file.previewElement.querySelectorAll("[data-dz-errormessage]");
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- node = _ref[_i];
- _results.push(node.textContent = message);
- }
- return _results;
- }
- },
- errormultiple: noop,
- processing: function(file) {
- if (file.previewElement) {
- file.previewElement.classList.add("dz-processing");
- if (file._removeLink) {
- return file._removeLink.textContent = this.options.dictCancelUpload;
- }
- }
- },
- processingmultiple: noop,
- uploadprogress: function(file, progress, bytesSent) {
- var node, _i, _len, _ref, _results;
- if (file.previewElement) {
- _ref = file.previewElement.querySelectorAll("[data-dz-uploadprogress]");
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- node = _ref[_i];
- if (node.nodeName === 'PROGRESS') {
- _results.push(node.value = progress);
- } else {
- _results.push(node.style.width = "" + progress + "%");
- }
- }
- return _results;
- }
- },
- totaluploadprogress: noop,
- sending: noop,
- sendingmultiple: noop,
- success: function(file) {
- if (file.previewElement) {
- return file.previewElement.classList.add("dz-success");
- }
- },
- successmultiple: noop,
- canceled: function(file) {
- return this.emit("error", file, "Upload canceled.");
- },
- canceledmultiple: noop,
- complete: function(file) {
- if (file._removeLink) {
- file._removeLink.textContent = this.options.dictRemoveFile;
- }
- if (file.previewElement) {
- return file.previewElement.classList.add("dz-complete");
- }
- },
- completemultiple: noop,
- maxfilesexceeded: noop,
- maxfilesreached: noop,
- queuecomplete: noop,
- addedfiles: noop,
- previewTemplate: "<div class=\"dz-preview dz-file-preview\">\n <div class=\"dz-image\"><img data-dz-thumbnail /></div>\n <div class=\"dz-details\">\n <div class=\"dz-size\"><span data-dz-size></span></div>\n <div class=\"dz-filename\"><span data-dz-name></span></div>\n </div>\n <div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress></span></div>\n <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n <div class=\"dz-success-mark\">\n <svg width=\"54px\" height=\"54px\" viewBox=\"0 0 54 54\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n <title>Check</title>\n <defs></defs>\n <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n <path d=\"M23.5,31.8431458 L17.5852419,25.9283877 C16.0248253,24.3679711 13.4910294,24.366835 11.9289322,25.9289322 C10.3700136,27.4878508 10.3665912,30.0234455 11.9283877,31.5852419 L20.4147581,40.0716123 C20.5133999,40.1702541 20.6159315,40.2626649 20.7218615,40.3488435 C22.2835669,41.8725651 24.794234,41.8626202 26.3461564,40.3106978 L43.3106978,23.3461564 C44.8771021,21.7797521 44.8758057,19.2483887 43.3137085,17.6862915 C41.7547899,16.1273729 39.2176035,16.1255422 37.6538436,17.6893022 L23.5,31.8431458 Z M27,53 C41.3594035,53 53,41.3594035 53,27 C53,12.6405965 41.3594035,1 27,1 C12.6405965,1 1,12.6405965 1,27 C1,41.3594035 12.6405965,53 27,53 Z\" id=\"Oval-2\" stroke-opacity=\"0.198794158\" stroke=\"#747474\" fill-opacity=\"0.816519475\" fill=\"#FFFFFF\" sketch:type=\"MSShapeGroup\"></path>\n </g>\n </svg>\n </div>\n <div class=\"dz-error-mark\">\n <svg width=\"54px\" height=\"54px\" viewBox=\"0 0 54 54\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\">\n <title>Error</title>\n <defs></defs>\n <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\">\n <g id=\"Check-+-Oval-2\" sketch:type=\"MSLayerGroup\" stroke=\"#747474\" stroke-opacity=\"0.198794158\" fill=\"#FFFFFF\" fill-opacity=\"0.816519475\">\n <path d=\"M32.6568542,29 L38.3106978,23.3461564 C39.8771021,21.7797521 39.8758057,19.2483887 38.3137085,17.6862915 C36.7547899,16.1273729 34.2176035,16.1255422 32.6538436,17.6893022 L27,23.3431458 L21.3461564,17.6893022 C19.7823965,16.1255422 17.2452101,16.1273729 15.6862915,17.6862915 C14.1241943,19.2483887 14.1228979,21.7797521 15.6893022,23.3461564 L21.3431458,29 L15.6893022,34.6538436 C14.1228979,36.2202479 14.1241943,38.7516113 15.6862915,40.3137085 C17.2452101,41.8726271 19.7823965,41.8744578 21.3461564,40.3106978 L27,34.6568542 L32.6538436,40.3106978 C34.2176035,41.8744578 36.7547899,41.8726271 38.3137085,40.3137085 C39.8758057,38.7516113 39.8771021,36.2202479 38.3106978,34.6538436 L32.6568542,29 Z M27,53 C41.3594035,53 53,41.3594035 53,27 C53,12.6405965 41.3594035,1 27,1 C12.6405965,1 1,12.6405965 1,27 C1,41.3594035 12.6405965,53 27,53 Z\" id=\"Oval-2\" sketch:type=\"MSShapeGroup\"></path>\n </g>\n </g>\n </svg>\n </div>\n</div>"
- };
-
- extend = function() {
- var key, object, objects, target, val, _i, _len;
- target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- for (_i = 0, _len = objects.length; _i < _len; _i++) {
- object = objects[_i];
- for (key in object) {
- val = object[key];
- target[key] = val;
- }
- }
- return target;
- };
-
- function Dropzone(element, options) {
- var elementOptions, fallback, _ref;
- this.element = element;
- this.version = Dropzone.version;
- this.defaultOptions.previewTemplate = this.defaultOptions.previewTemplate.replace(/\n*/g, "");
- this.clickableElements = [];
- this.listeners = [];
- this.files = [];
- if (typeof this.element === "string") {
- this.element = document.querySelector(this.element);
- }
- if (!(this.element && (this.element.nodeType != null))) {
- throw new Error("Invalid dropzone element.");
- }
- if (this.element.dropzone) {
- throw new Error("Dropzone already attached.");
- }
- Dropzone.instances.push(this);
- this.element.dropzone = this;
- elementOptions = (_ref = Dropzone.optionsForElement(this.element)) != null ? _ref : {};
- this.options = extend({}, this.defaultOptions, elementOptions, options != null ? options : {});
- if (this.options.forceFallback || !Dropzone.isBrowserSupported()) {
- return this.options.fallback.call(this);
- }
- if (this.options.url == null) {
- this.options.url = this.element.getAttribute("action");
- }
- if (!this.options.url) {
- throw new Error("No URL provided.");
- }
- if (this.options.acceptedFiles && this.options.acceptedMimeTypes) {
- throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");
- }
- if (this.options.acceptedMimeTypes) {
- this.options.acceptedFiles = this.options.acceptedMimeTypes;
- delete this.options.acceptedMimeTypes;
- }
- this.options.method = this.options.method.toUpperCase();
- if ((fallback = this.getExistingFallback()) && fallback.parentNode) {
- fallback.parentNode.removeChild(fallback);
- }
- if (this.options.previewsContainer !== false) {
- if (this.options.previewsContainer) {
- this.previewsContainer = Dropzone.getElement(this.options.previewsContainer, "previewsContainer");
- } else {
- this.previewsContainer = this.element;
- }
- }
- if (this.options.clickable) {
- if (this.options.clickable === true) {
- this.clickableElements = [this.element];
- } else {
- this.clickableElements = Dropzone.getElements(this.options.clickable, "clickable");
- }
- }
- this.init();
- }
-
- Dropzone.prototype.getAcceptedFiles = function() {
- var file, _i, _len, _ref, _results;
- _ref = this.files;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- file = _ref[_i];
- if (file.accepted) {
- _results.push(file);
- }
- }
- return _results;
- };
-
- Dropzone.prototype.getRejectedFiles = function() {
- var file, _i, _len, _ref, _results;
- _ref = this.files;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- file = _ref[_i];
- if (!file.accepted) {
- _results.push(file);
- }
- }
- return _results;
- };
-
- Dropzone.prototype.getFilesWithStatus = function(status) {
- var file, _i, _len, _ref, _results;
- _ref = this.files;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- file = _ref[_i];
- if (file.status === status) {
- _results.push(file);
- }
- }
- return _results;
- };
-
- Dropzone.prototype.getQueuedFiles = function() {
- return this.getFilesWithStatus(Dropzone.QUEUED);
- };
-
- Dropzone.prototype.getUploadingFiles = function() {
- return this.getFilesWithStatus(Dropzone.UPLOADING);
- };
-
- Dropzone.prototype.getAddedFiles = function() {
- return this.getFilesWithStatus(Dropzone.ADDED);
- };
-
- Dropzone.prototype.getActiveFiles = function() {
- var file, _i, _len, _ref, _results;
- _ref = this.files;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- file = _ref[_i];
- if (file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED) {
- _results.push(file);
- }
- }
- return _results;
- };
-
- Dropzone.prototype.init = function() {
- var eventName, noPropagation, setupHiddenFileInput, _i, _len, _ref, _ref1;
- if (this.element.tagName === "form") {
- this.element.setAttribute("enctype", "multipart/form-data");
- }
- if (this.element.classList.contains("dropzone") && !this.element.querySelector(".dz-message")) {
- this.element.appendChild(Dropzone.createElement("<div class=\"dz-default dz-message\"><span>" + this.options.dictDefaultMessage + "</span></div>"));
- }
- if (this.clickableElements.length) {
- setupHiddenFileInput = (function(_this) {
- return function() {
- if (_this.hiddenFileInput) {
- _this.hiddenFileInput.parentNode.removeChild(_this.hiddenFileInput);
- }
- _this.hiddenFileInput = document.createElement("input");
- _this.hiddenFileInput.setAttribute("type", "file");
- if ((_this.options.maxFiles == null) || _this.options.maxFiles > 1) {
- _this.hiddenFileInput.setAttribute("multiple", "multiple");
- }
- _this.hiddenFileInput.className = "dz-hidden-input";
- if (_this.options.acceptedFiles != null) {
- _this.hiddenFileInput.setAttribute("accept", _this.options.acceptedFiles);
- }
- if (_this.options.capture != null) {
- _this.hiddenFileInput.setAttribute("capture", _this.options.capture);
- }
- _this.hiddenFileInput.style.visibility = "hidden";
- _this.hiddenFileInput.style.position = "absolute";
- _this.hiddenFileInput.style.top = "0";
- _this.hiddenFileInput.style.left = "0";
- _this.hiddenFileInput.style.height = "0";
- _this.hiddenFileInput.style.width = "0";
- document.querySelector(_this.options.hiddenInputContainer).appendChild(_this.hiddenFileInput);
- return _this.hiddenFileInput.addEventListener("change", function() {
- var file, files, _i, _len;
- files = _this.hiddenFileInput.files;
- if (files.length) {
- for (_i = 0, _len = files.length; _i < _len; _i++) {
- file = files[_i];
- _this.addFile(file);
- }
- }
- _this.emit("addedfiles", files);
- return setupHiddenFileInput();
- });
- };
- })(this);
- setupHiddenFileInput();
- }
- this.URL = (_ref = window.URL) != null ? _ref : window.webkitURL;
- _ref1 = this.events;
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
- eventName = _ref1[_i];
- this.on(eventName, this.options[eventName]);
- }
- this.on("uploadprogress", (function(_this) {
- return function() {
- return _this.updateTotalUploadProgress();
- };
- })(this));
- this.on("removedfile", (function(_this) {
- return function() {
- return _this.updateTotalUploadProgress();
- };
- })(this));
- this.on("canceled", (function(_this) {
- return function(file) {
- return _this.emit("complete", file);
- };
- })(this));
- this.on("complete", (function(_this) {
- return function(file) {
- if (_this.getAddedFiles().length === 0 && _this.getUploadingFiles().length === 0 && _this.getQueuedFiles().length === 0) {
- return setTimeout((function() {
- return _this.emit("queuecomplete");
- }), 0);
- }
- };
- })(this));
- noPropagation = function(e) {
- e.stopPropagation();
- if (e.preventDefault) {
- return e.preventDefault();
- } else {
- return e.returnValue = false;
- }
- };
- this.listeners = [
- {
- element: this.element,
- events: {
- "dragstart": (function(_this) {
- return function(e) {
- return _this.emit("dragstart", e);
- };
- })(this),
- "dragenter": (function(_this) {
- return function(e) {
- noPropagation(e);
- return _this.emit("dragenter", e);
- };
- })(this),
- "dragover": (function(_this) {
- return function(e) {
- var efct;
- try {
- efct = e.dataTransfer.effectAllowed;
- } catch (_error) {}
- e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy';
- noPropagation(e);
- return _this.emit("dragover", e);
- };
- })(this),
- "dragleave": (function(_this) {
- return function(e) {
- return _this.emit("dragleave", e);
- };
- })(this),
- "drop": (function(_this) {
- return function(e) {
- noPropagation(e);
- return _this.drop(e);
- };
- })(this),
- "dragend": (function(_this) {
- return function(e) {
- return _this.emit("dragend", e);
- };
- })(this)
- }
- }
- ];
- this.clickableElements.forEach((function(_this) {
- return function(clickableElement) {
- return _this.listeners.push({
- element: clickableElement,
- events: {
- "click": function(evt) {
- if ((clickableElement !== _this.element) || (evt.target === _this.element || Dropzone.elementInside(evt.target, _this.element.querySelector(".dz-message")))) {
- _this.hiddenFileInput.click();
- }
- return true;
- }
- }
- });
- };
- })(this));
- this.enable();
- return this.options.init.call(this);
- };
-
- Dropzone.prototype.destroy = function() {
- var _ref;
- this.disable();
- this.removeAllFiles(true);
- if ((_ref = this.hiddenFileInput) != null ? _ref.parentNode : void 0) {
- this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);
- this.hiddenFileInput = null;
- }
- delete this.element.dropzone;
- return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);
- };
-
- Dropzone.prototype.updateTotalUploadProgress = function() {
- var activeFiles, file, totalBytes, totalBytesSent, totalUploadProgress, _i, _len, _ref;
- totalBytesSent = 0;
- totalBytes = 0;
- activeFiles = this.getActiveFiles();
- if (activeFiles.length) {
- _ref = this.getActiveFiles();
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- file = _ref[_i];
- totalBytesSent += file.upload.bytesSent;
- totalBytes += file.upload.total;
- }
- totalUploadProgress = 100 * totalBytesSent / totalBytes;
- } else {
- totalUploadProgress = 100;
- }
- return this.emit("totaluploadprogress", totalUploadProgress, totalBytes, totalBytesSent);
- };
-
- Dropzone.prototype._getParamName = function(n) {
- if (typeof this.options.paramName === "function") {
- return this.options.paramName(n);
- } else {
- return "" + this.options.paramName + (this.options.uploadMultiple ? "[" + n + "]" : "");
- }
- };
-
- Dropzone.prototype._renameFilename = function(name) {
- if (typeof this.options.renameFilename !== "function") {
- return name;
- }
- return this.options.renameFilename(name);
- };
-
- Dropzone.prototype.getFallbackForm = function() {
- var existingFallback, fields, fieldsString, form;
- if (existingFallback = this.getExistingFallback()) {
- return existingFallback;
- }
- fieldsString = "<div class=\"dz-fallback\">";
- if (this.options.dictFallbackText) {
- fieldsString += "<p>" + this.options.dictFallbackText + "</p>";
- }
- fieldsString += "<input type=\"file\" name=\"" + (this._getParamName(0)) + "\" " + (this.options.uploadMultiple ? 'multiple="multiple"' : void 0) + " /><input type=\"submit\" value=\"Upload!\"></div>";
- fields = Dropzone.createElement(fieldsString);
- if (this.element.tagName !== "FORM") {
- form = Dropzone.createElement("<form action=\"" + this.options.url + "\" enctype=\"multipart/form-data\" method=\"" + this.options.method + "\"></form>");
- form.appendChild(fields);
- } else {
- this.element.setAttribute("enctype", "multipart/form-data");
- this.element.setAttribute("method", this.options.method);
- }
- return form != null ? form : fields;
- };
-
- Dropzone.prototype.getExistingFallback = function() {
- var fallback, getFallback, tagName, _i, _len, _ref;
- getFallback = function(elements) {
- var el, _i, _len;
- for (_i = 0, _len = elements.length; _i < _len; _i++) {
- el = elements[_i];
- if (/(^| )fallback($| )/.test(el.className)) {
- return el;
- }
- }
- };
- _ref = ["div", "form"];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- tagName = _ref[_i];
- if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {
- return fallback;
- }
- }
- };
-
- Dropzone.prototype.setupEventListeners = function() {
- var elementListeners, event, listener, _i, _len, _ref, _results;
- _ref = this.listeners;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- elementListeners = _ref[_i];
- _results.push((function() {
- var _ref1, _results1;
- _ref1 = elementListeners.events;
- _results1 = [];
- for (event in _ref1) {
- listener = _ref1[event];
- _results1.push(elementListeners.element.addEventListener(event, listener, false));
- }
- return _results1;
- })());
- }
- return _results;
- };
-
- Dropzone.prototype.removeEventListeners = function() {
- var elementListeners, event, listener, _i, _len, _ref, _results;
- _ref = this.listeners;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- elementListeners = _ref[_i];
- _results.push((function() {
- var _ref1, _results1;
- _ref1 = elementListeners.events;
- _results1 = [];
- for (event in _ref1) {
- listener = _ref1[event];
- _results1.push(elementListeners.element.removeEventListener(event, listener, false));
- }
- return _results1;
- })());
- }
- return _results;
- };
-
- Dropzone.prototype.disable = function() {
- var file, _i, _len, _ref, _results;
- this.clickableElements.forEach(function(element) {
- return element.classList.remove("dz-clickable");
- });
- this.removeEventListeners();
- _ref = this.files;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- file = _ref[_i];
- _results.push(this.cancelUpload(file));
- }
- return _results;
- };
-
- Dropzone.prototype.enable = function() {
- this.clickableElements.forEach(function(element) {
- return element.classList.add("dz-clickable");
- });
- return this.setupEventListeners();
- };
-
- Dropzone.prototype.filesize = function(size) {
- var cutoff, i, selectedSize, selectedUnit, unit, units, _i, _len;
- selectedSize = 0;
- selectedUnit = "b";
- if (size > 0) {
- units = ['TB', 'GB', 'MB', 'KB', 'b'];
- for (i = _i = 0, _len = units.length; _i < _len; i = ++_i) {
- unit = units[i];
- cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;
- if (size >= cutoff) {
- selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);
- selectedUnit = unit;
- break;
- }
- }
- selectedSize = Math.round(10 * selectedSize) / 10;
- }
- return "<strong>" + selectedSize + "</strong> " + selectedUnit;
- };
-
- Dropzone.prototype._updateMaxFilesReachedClass = function() {
- if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) {
- if (this.getAcceptedFiles().length === this.options.maxFiles) {
- this.emit('maxfilesreached', this.files);
- }
- return this.element.classList.add("dz-max-files-reached");
- } else {
- return this.element.classList.remove("dz-max-files-reached");
- }
- };
-
- Dropzone.prototype.drop = function(e) {
- var files, items;
- if (!e.dataTransfer) {
- return;
- }
- this.emit("drop", e);
- files = e.dataTransfer.files;
- this.emit("addedfiles", files);
- if (files.length) {
- items = e.dataTransfer.items;
- if (items && items.length && (items[0].webkitGetAsEntry != null)) {
- this._addFilesFromItems(items);
- } else {
- this.handleFiles(files);
- }
- }
- };
-
- Dropzone.prototype.paste = function(e) {
- var items, _ref;
- if ((e != null ? (_ref = e.clipboardData) != null ? _ref.items : void 0 : void 0) == null) {
- return;
- }
- this.emit("paste", e);
- items = e.clipboardData.items;
- if (items.length) {
- return this._addFilesFromItems(items);
- }
- };
-
- Dropzone.prototype.handleFiles = function(files) {
- var file, _i, _len, _results;
- _results = [];
- for (_i = 0, _len = files.length; _i < _len; _i++) {
- file = files[_i];
- _results.push(this.addFile(file));
- }
- return _results;
- };
-
- Dropzone.prototype._addFilesFromItems = function(items) {
- var entry, item, _i, _len, _results;
- _results = [];
- for (_i = 0, _len = items.length; _i < _len; _i++) {
- item = items[_i];
- if ((item.webkitGetAsEntry != null) && (entry = item.webkitGetAsEntry())) {
- if (entry.isFile) {
- _results.push(this.addFile(item.getAsFile()));
- } else if (entry.isDirectory) {
- _results.push(this._addFilesFromDirectory(entry, entry.name));
- } else {
- _results.push(void 0);
- }
- } else if (item.getAsFile != null) {
- if ((item.kind == null) || item.kind === "file") {
- _results.push(this.addFile(item.getAsFile()));
- } else {
- _results.push(void 0);
- }
- } else {
- _results.push(void 0);
- }
- }
- return _results;
- };
-
- Dropzone.prototype._addFilesFromDirectory = function(directory, path) {
- var dirReader, errorHandler, readEntries;
- dirReader = directory.createReader();
- errorHandler = function(error) {
- return typeof console !== "undefined" && console !== null ? typeof console.log === "function" ? console.log(error) : void 0 : void 0;
- };
- readEntries = (function(_this) {
- return function() {
- return dirReader.readEntries(function(entries) {
- var entry, _i, _len;
- if (entries.length > 0) {
- for (_i = 0, _len = entries.length; _i < _len; _i++) {
- entry = entries[_i];
- if (entry.isFile) {
- entry.file(function(file) {
- if (_this.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') {
- return;
- }
- file.fullPath = "" + path + "/" + file.name;
- return _this.addFile(file);
- });
- } else if (entry.isDirectory) {
- _this._addFilesFromDirectory(entry, "" + path + "/" + entry.name);
- }
- }
- readEntries();
- }
- return null;
- }, errorHandler);
- };
- })(this);
- return readEntries();
- };
-
- Dropzone.prototype.accept = function(file, done) {
- if (file.size > this.options.maxFilesize * 1024 * 1024) {
- return done(this.options.dictFileTooBig.replace("{{filesize}}", Math.round(file.size / 1024 / 10.24) / 100).replace("{{maxFilesize}}", this.options.maxFilesize));
- } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {
- return done(this.options.dictInvalidFileType);
- } else if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) {
- done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}", this.options.maxFiles));
- return this.emit("maxfilesexceeded", file);
- } else {
- return this.options.accept.call(this, file, done);
- }
- };
-
- Dropzone.prototype.addFile = function(file) {
- file.upload = {
- progress: 0,
- total: file.size,
- bytesSent: 0
- };
- this.files.push(file);
- file.status = Dropzone.ADDED;
- this.emit("addedfile", file);
- this._enqueueThumbnail(file);
- return this.accept(file, (function(_this) {
- return function(error) {
- if (error) {
- file.accepted = false;
- _this._errorProcessing([file], error);
- } else {
- file.accepted = true;
- if (_this.options.autoQueue) {
- _this.enqueueFile(file);
- }
- }
- return _this._updateMaxFilesReachedClass();
- };
- })(this));
- };
-
- Dropzone.prototype.enqueueFiles = function(files) {
- var file, _i, _len;
- for (_i = 0, _len = files.length; _i < _len; _i++) {
- file = files[_i];
- this.enqueueFile(file);
- }
- return null;
- };
-
- Dropzone.prototype.enqueueFile = function(file) {
- if (file.status === Dropzone.ADDED && file.accepted === true) {
- file.status = Dropzone.QUEUED;
- if (this.options.autoProcessQueue) {
- return setTimeout(((function(_this) {
- return function() {
- return _this.processQueue();
- };
- })(this)), 0);
- }
- } else {
- throw new Error("This file can't be queued because it has already been processed or was rejected.");
- }
- };
-
- Dropzone.prototype._thumbnailQueue = [];
-
- Dropzone.prototype._processingThumbnail = false;
-
- Dropzone.prototype._enqueueThumbnail = function(file) {
- if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {
- this._thumbnailQueue.push(file);
- return setTimeout(((function(_this) {
- return function() {
- return _this._processThumbnailQueue();
- };
- })(this)), 0);
- }
- };
-
- Dropzone.prototype._processThumbnailQueue = function() {
- if (this._processingThumbnail || this._thumbnailQueue.length === 0) {
- return;
- }
- this._processingThumbnail = true;
- return this.createThumbnail(this._thumbnailQueue.shift(), (function(_this) {
- return function() {
- _this._processingThumbnail = false;
- return _this._processThumbnailQueue();
- };
- })(this));
- };
-
- Dropzone.prototype.removeFile = function(file) {
- if (file.status === Dropzone.UPLOADING) {
- this.cancelUpload(file);
- }
- this.files = without(this.files, file);
- this.emit("removedfile", file);
- if (this.files.length === 0) {
- return this.emit("reset");
- }
- };
-
- Dropzone.prototype.removeAllFiles = function(cancelIfNecessary) {
- var file, _i, _len, _ref;
- if (cancelIfNecessary == null) {
- cancelIfNecessary = false;
- }
- _ref = this.files.slice();
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- file = _ref[_i];
- if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {
- this.removeFile(file);
- }
- }
- return null;
- };
-
- Dropzone.prototype.createThumbnail = function(file, callback) {
- var fileReader;
- fileReader = new FileReader;
- fileReader.onload = (function(_this) {
- return function() {
- if (file.type === "image/svg+xml") {
- _this.emit("thumbnail", file, fileReader.result);
- if (callback != null) {
- callback();
- }
- return;
- }
- return _this.createThumbnailFromUrl(file, fileReader.result, callback);
- };
- })(this);
- return fileReader.readAsDataURL(file);
- };
-
- Dropzone.prototype.createThumbnailFromUrl = function(file, imageUrl, callback, crossOrigin) {
- var img;
- img = document.createElement("img");
- if (crossOrigin) {
- img.crossOrigin = crossOrigin;
- }
- img.onload = (function(_this) {
- return function() {
- var canvas, ctx, resizeInfo, thumbnail, _ref, _ref1, _ref2, _ref3;
- file.width = img.width;
- file.height = img.height;
- resizeInfo = _this.options.resize.call(_this, file);
- if (resizeInfo.trgWidth == null) {
- resizeInfo.trgWidth = resizeInfo.optWidth;
- }
- if (resizeInfo.trgHeight == null) {
- resizeInfo.trgHeight = resizeInfo.optHeight;
- }
- canvas = document.createElement("canvas");
- ctx = canvas.getContext("2d");
- canvas.width = resizeInfo.trgWidth;
- canvas.height = resizeInfo.trgHeight;
- drawImageIOSFix(ctx, img, (_ref = resizeInfo.srcX) != null ? _ref : 0, (_ref1 = resizeInfo.srcY) != null ? _ref1 : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, (_ref2 = resizeInfo.trgX) != null ? _ref2 : 0, (_ref3 = resizeInfo.trgY) != null ? _ref3 : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);
- thumbnail = canvas.toDataURL("image/png");
- _this.emit("thumbnail", file, thumbnail);
- if (callback != null) {
- return callback();
- }
- };
- })(this);
- if (callback != null) {
- img.onerror = callback;
- }
- return img.src = imageUrl;
- };
-
- Dropzone.prototype.processQueue = function() {
- var i, parallelUploads, processingLength, queuedFiles;
- parallelUploads = this.options.parallelUploads;
- processingLength = this.getUploadingFiles().length;
- i = processingLength;
- if (processingLength >= parallelUploads) {
- return;
- }
- queuedFiles = this.getQueuedFiles();
- if (!(queuedFiles.length > 0)) {
- return;
- }
- if (this.options.uploadMultiple) {
- return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));
- } else {
- while (i < parallelUploads) {
- if (!queuedFiles.length) {
- return;
- }
- this.processFile(queuedFiles.shift());
- i++;
- }
- }
- };
-
- Dropzone.prototype.processFile = function(file) {
- return this.processFiles([file]);
- };
-
- Dropzone.prototype.processFiles = function(files) {
- var file, _i, _len;
- for (_i = 0, _len = files.length; _i < _len; _i++) {
- file = files[_i];
- file.processing = true;
- file.status = Dropzone.UPLOADING;
- this.emit("processing", file);
- }
- if (this.options.uploadMultiple) {
- this.emit("processingmultiple", files);
- }
- return this.uploadFiles(files);
- };
-
- Dropzone.prototype._getFilesWithXhr = function(xhr) {
- var file, files;
- return files = (function() {
- var _i, _len, _ref, _results;
- _ref = this.files;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- file = _ref[_i];
- if (file.xhr === xhr) {
- _results.push(file);
- }
- }
- return _results;
- }).call(this);
- };
-
- Dropzone.prototype.cancelUpload = function(file) {
- var groupedFile, groupedFiles, _i, _j, _len, _len1, _ref;
- if (file.status === Dropzone.UPLOADING) {
- groupedFiles = this._getFilesWithXhr(file.xhr);
- for (_i = 0, _len = groupedFiles.length; _i < _len; _i++) {
- groupedFile = groupedFiles[_i];
- groupedFile.status = Dropzone.CANCELED;
- }
- file.xhr.abort();
- for (_j = 0, _len1 = groupedFiles.length; _j < _len1; _j++) {
- groupedFile = groupedFiles[_j];
- this.emit("canceled", groupedFile);
- }
- if (this.options.uploadMultiple) {
- this.emit("canceledmultiple", groupedFiles);
- }
- } else if ((_ref = file.status) === Dropzone.ADDED || _ref === Dropzone.QUEUED) {
- file.status = Dropzone.CANCELED;
- this.emit("canceled", file);
- if (this.options.uploadMultiple) {
- this.emit("canceledmultiple", [file]);
- }
- }
- if (this.options.autoProcessQueue) {
- return this.processQueue();
- }
- };
-
- resolveOption = function() {
- var args, option;
- option = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
- if (typeof option === 'function') {
- return option.apply(this, args);
- }
- return option;
- };
-
- Dropzone.prototype.uploadFile = function(file) {
- return this.uploadFiles([file]);
- };
-
- Dropzone.prototype.uploadFiles = function(files) {
- var file, formData, handleError, headerName, headerValue, headers, i, input, inputName, inputType, key, method, option, progressObj, response, updateProgress, url, value, xhr, _i, _j, _k, _l, _len, _len1, _len2, _len3, _m, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
- xhr = new XMLHttpRequest();
- for (_i = 0, _len = files.length; _i < _len; _i++) {
- file = files[_i];
- file.xhr = xhr;
- }
- method = resolveOption(this.options.method, files);
- url = resolveOption(this.options.url, files);
- xhr.open(method, url, true);
- xhr.withCredentials = !!this.options.withCredentials;
- response = null;
- handleError = (function(_this) {
- return function() {
- var _j, _len1, _results;
- _results = [];
- for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
- file = files[_j];
- _results.push(_this._errorProcessing(files, response || _this.options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr));
- }
- return _results;
- };
- })(this);
- updateProgress = (function(_this) {
- return function(e) {
- var allFilesFinished, progress, _j, _k, _l, _len1, _len2, _len3, _results;
- if (e != null) {
- progress = 100 * e.loaded / e.total;
- for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
- file = files[_j];
- file.upload = {
- progress: progress,
- total: e.total,
- bytesSent: e.loaded
- };
- }
- } else {
- allFilesFinished = true;
- progress = 100;
- for (_k = 0, _len2 = files.length; _k < _len2; _k++) {
- file = files[_k];
- if (!(file.upload.progress === 100 && file.upload.bytesSent === file.upload.total)) {
- allFilesFinished = false;
- }
- file.upload.progress = progress;
- file.upload.bytesSent = file.upload.total;
- }
- if (allFilesFinished) {
- return;
- }
- }
- _results = [];
- for (_l = 0, _len3 = files.length; _l < _len3; _l++) {
- file = files[_l];
- _results.push(_this.emit("uploadprogress", file, progress, file.upload.bytesSent));
- }
- return _results;
- };
- })(this);
- xhr.onload = (function(_this) {
- return function(e) {
- var _ref;
- if (files[0].status === Dropzone.CANCELED) {
- return;
- }
- if (xhr.readyState !== 4) {
- return;
- }
- response = xhr.responseText;
- if (xhr.getResponseHeader("content-type") && ~xhr.getResponseHeader("content-type").indexOf("application/json")) {
- try {
- response = JSON.parse(response);
- } catch (_error) {
- e = _error;
- response = "Invalid JSON response from server.";
- }
- }
- updateProgress();
- if (!((200 <= (_ref = xhr.status) && _ref < 300))) {
- return handleError();
- } else {
- return _this._finished(files, response, e);
- }
- };
- })(this);
- xhr.onerror = (function(_this) {
- return function() {
- if (files[0].status === Dropzone.CANCELED) {
- return;
- }
- return handleError();
- };
- })(this);
- progressObj = (_ref = xhr.upload) != null ? _ref : xhr;
- progressObj.onprogress = updateProgress;
- headers = {
- "Accept": "application/json",
- "Cache-Control": "no-cache",
- "X-Requested-With": "XMLHttpRequest"
- };
- if (this.options.headers) {
- extend(headers, this.options.headers);
- }
- for (headerName in headers) {
- headerValue = headers[headerName];
- if (headerValue) {
- xhr.setRequestHeader(headerName, headerValue);
- }
- }
- formData = new FormData();
- if (this.options.params) {
- _ref1 = this.options.params;
- for (key in _ref1) {
- value = _ref1[key];
- formData.append(key, value);
- }
- }
- for (_j = 0, _len1 = files.length; _j < _len1; _j++) {
- file = files[_j];
- this.emit("sending", file, xhr, formData);
- }
- if (this.options.uploadMultiple) {
- this.emit("sendingmultiple", files, xhr, formData);
- }
- if (this.element.tagName === "FORM") {
- _ref2 = this.element.querySelectorAll("input, textarea, select, button");
- for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
- input = _ref2[_k];
- inputName = input.getAttribute("name");
- inputType = input.getAttribute("type");
- if (input.tagName === "SELECT" && input.hasAttribute("multiple")) {
- _ref3 = input.options;
- for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
- option = _ref3[_l];
- if (option.selected) {
- formData.append(inputName, option.value);
- }
- }
- } else if (!inputType || ((_ref4 = inputType.toLowerCase()) !== "checkbox" && _ref4 !== "radio") || input.checked) {
- formData.append(inputName, input.value);
- }
- }
- }
- for (i = _m = 0, _ref5 = files.length - 1; 0 <= _ref5 ? _m <= _ref5 : _m >= _ref5; i = 0 <= _ref5 ? ++_m : --_m) {
- formData.append(this._getParamName(i), files[i], this._renameFilename(files[i].name));
- }
- return this.submitRequest(xhr, formData, files);
- };
-
- Dropzone.prototype.submitRequest = function(xhr, formData, files) {
- return xhr.send(formData);
- };
-
- Dropzone.prototype._finished = function(files, responseText, e) {
- var file, _i, _len;
- for (_i = 0, _len = files.length; _i < _len; _i++) {
- file = files[_i];
- file.status = Dropzone.SUCCESS;
- this.emit("success", file, responseText, e);
- this.emit("complete", file);
- }
- if (this.options.uploadMultiple) {
- this.emit("successmultiple", files, responseText, e);
- this.emit("completemultiple", files);
- }
- if (this.options.autoProcessQueue) {
- return this.processQueue();
- }
- };
-
- Dropzone.prototype._errorProcessing = function(files, message, xhr) {
- var file, _i, _len;
- for (_i = 0, _len = files.length; _i < _len; _i++) {
- file = files[_i];
- file.status = Dropzone.ERROR;
- this.emit("error", file, message, xhr);
- this.emit("complete", file);
- }
- if (this.options.uploadMultiple) {
- this.emit("errormultiple", files, message, xhr);
- this.emit("completemultiple", files);
- }
- if (this.options.autoProcessQueue) {
- return this.processQueue();
- }
- };
-
- return Dropzone;
-
- })(Emitter);
-
- Dropzone.version = "4.3.0";
-
- Dropzone.options = {};
-
- Dropzone.optionsForElement = function(element) {
- if (element.getAttribute("id")) {
- return Dropzone.options[camelize(element.getAttribute("id"))];
- } else {
- return void 0;
- }
- };
-
- Dropzone.instances = [];
-
- Dropzone.forElement = function(element) {
- if (typeof element === "string") {
- element = document.querySelector(element);
- }
- if ((element != null ? element.dropzone : void 0) == null) {
- throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");
- }
- return element.dropzone;
- };
-
- Dropzone.autoDiscover = true;
-
- Dropzone.discover = function() {
- var checkElements, dropzone, dropzones, _i, _len, _results;
- if (document.querySelectorAll) {
- dropzones = document.querySelectorAll(".dropzone");
- } else {
- dropzones = [];
- checkElements = function(elements) {
- var el, _i, _len, _results;
- _results = [];
- for (_i = 0, _len = elements.length; _i < _len; _i++) {
- el = elements[_i];
- if (/(^| )dropzone($| )/.test(el.className)) {
- _results.push(dropzones.push(el));
- } else {
- _results.push(void 0);
- }
- }
- return _results;
- };
- checkElements(document.getElementsByTagName("div"));
- checkElements(document.getElementsByTagName("form"));
- }
- _results = [];
- for (_i = 0, _len = dropzones.length; _i < _len; _i++) {
- dropzone = dropzones[_i];
- if (Dropzone.optionsForElement(dropzone) !== false) {
- _results.push(new Dropzone(dropzone));
- } else {
- _results.push(void 0);
- }
- }
- return _results;
- };
-
- Dropzone.blacklistedBrowsers = [/opera.*Macintosh.*version\/12/i];
-
- Dropzone.isBrowserSupported = function() {
- var capableBrowser, regex, _i, _len, _ref;
- capableBrowser = true;
- if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {
- if (!("classList" in document.createElement("a"))) {
- capableBrowser = false;
- } else {
- _ref = Dropzone.blacklistedBrowsers;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- regex = _ref[_i];
- if (regex.test(navigator.userAgent)) {
- capableBrowser = false;
- continue;
- }
- }
- }
- } else {
- capableBrowser = false;
- }
- return capableBrowser;
- };
-
- without = function(list, rejectedItem) {
- var item, _i, _len, _results;
- _results = [];
- for (_i = 0, _len = list.length; _i < _len; _i++) {
- item = list[_i];
- if (item !== rejectedItem) {
- _results.push(item);
- }
- }
- return _results;
- };
-
- camelize = function(str) {
- return str.replace(/[\-_](\w)/g, function(match) {
- return match.charAt(1).toUpperCase();
- });
- };
-
- Dropzone.createElement = function(string) {
- var div;
- div = document.createElement("div");
- div.innerHTML = string;
- return div.childNodes[0];
- };
-
- Dropzone.elementInside = function(element, container) {
- if (element === container) {
- return true;
- }
- while (element = element.parentNode) {
- if (element === container) {
- return true;
- }
- }
- return false;
- };
-
- Dropzone.getElement = function(el, name) {
- var element;
- if (typeof el === "string") {
- element = document.querySelector(el);
- } else if (el.nodeType != null) {
- element = el;
- }
- if (element == null) {
- throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector or a plain HTML element.");
- }
- return element;
- };
-
- Dropzone.getElements = function(els, name) {
- var e, el, elements, _i, _j, _len, _len1, _ref;
- if (els instanceof Array) {
- elements = [];
- try {
- for (_i = 0, _len = els.length; _i < _len; _i++) {
- el = els[_i];
- elements.push(this.getElement(el, name));
- }
- } catch (_error) {
- e = _error;
- elements = null;
- }
- } else if (typeof els === "string") {
- elements = [];
- _ref = document.querySelectorAll(els);
- for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
- el = _ref[_j];
- elements.push(el);
- }
- } else if (els.nodeType != null) {
- elements = [els];
- }
- if (!((elements != null) && elements.length)) {
- throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector, a plain HTML element or a list of those.");
- }
- return elements;
- };
-
- Dropzone.confirm = function(question, accepted, rejected) {
- if (window.confirm(question)) {
- return accepted();
- } else if (rejected != null) {
- return rejected();
- }
- };
-
- Dropzone.isValidFile = function(file, acceptedFiles) {
- var baseMimeType, mimeType, validType, _i, _len;
- if (!acceptedFiles) {
- return true;
- }
- acceptedFiles = acceptedFiles.split(",");
- mimeType = file.type;
- baseMimeType = mimeType.replace(/\/.*$/, "");
- for (_i = 0, _len = acceptedFiles.length; _i < _len; _i++) {
- validType = acceptedFiles[_i];
- validType = validType.trim();
- if (validType.charAt(0) === ".") {
- if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {
- return true;
- }
- } else if (/\/\*$/.test(validType)) {
- if (baseMimeType === validType.replace(/\/.*$/, "")) {
- return true;
- }
- } else {
- if (mimeType === validType) {
- return true;
- }
- }
- }
- return false;
- };
-
- if (typeof jQuery !== "undefined" && jQuery !== null) {
- jQuery.fn.dropzone = function(options) {
- return this.each(function() {
- return new Dropzone(this, options);
- });
- };
- }
-
- if (typeof module !== "undefined" && module !== null) {
- module.exports = Dropzone;
- } else {
- window.Dropzone = Dropzone;
- }
-
- Dropzone.ADDED = "added";
-
- Dropzone.QUEUED = "queued";
-
- Dropzone.ACCEPTED = Dropzone.QUEUED;
-
- Dropzone.UPLOADING = "uploading";
-
- Dropzone.PROCESSING = Dropzone.UPLOADING;
-
- Dropzone.CANCELED = "canceled";
-
- Dropzone.ERROR = "error";
-
- Dropzone.SUCCESS = "success";
-
-
- /*
-
- Bugfix for iOS 6 and 7
- Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
- based on the work of https://github.com/stomita/ios-imagefile-megapixel
- */
-
- detectVerticalSquash = function(img) {
- var alpha, canvas, ctx, data, ey, ih, iw, py, ratio, sy;
- iw = img.naturalWidth;
- ih = img.naturalHeight;
- canvas = document.createElement("canvas");
- canvas.width = 1;
- canvas.height = ih;
- ctx = canvas.getContext("2d");
- ctx.drawImage(img, 0, 0);
- data = ctx.getImageData(0, 0, 1, ih).data;
- sy = 0;
- ey = ih;
- py = ih;
- while (py > sy) {
- alpha = data[(py - 1) * 4 + 3];
- if (alpha === 0) {
- ey = py;
- } else {
- sy = py;
- }
- py = (ey + sy) >> 1;
- }
- ratio = py / ih;
- if (ratio === 0) {
- return 1;
- } else {
- return ratio;
- }
- };
-
- drawImageIOSFix = function(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
- var vertSquashRatio;
- vertSquashRatio = detectVerticalSquash(img);
- return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);
- };
-
-
- /*
- * contentloaded.js
- *
- * Author: Diego Perini (diego.perini at gmail.com)
- * Summary: cross-browser wrapper for DOMContentLoaded
- * Updated: 20101020
- * License: MIT
- * Version: 1.2
- *
- * URL:
- * http://javascript.nwbox.com/ContentLoaded/
- * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE
- */
-
- contentLoaded = function(win, fn) {
- var add, doc, done, init, poll, pre, rem, root, top;
- done = false;
- top = true;
- doc = win.document;
- root = doc.documentElement;
- add = (doc.addEventListener ? "addEventListener" : "attachEvent");
- rem = (doc.addEventListener ? "removeEventListener" : "detachEvent");
- pre = (doc.addEventListener ? "" : "on");
- init = function(e) {
- if (e.type === "readystatechange" && doc.readyState !== "complete") {
- return;
- }
- (e.type === "load" ? win : doc)[rem](pre + e.type, init, false);
- if (!done && (done = true)) {
- return fn.call(win, e.type || e);
- }
- };
- poll = function() {
- var e;
- try {
- root.doScroll("left");
- } catch (_error) {
- e = _error;
- setTimeout(poll, 50);
- return;
- }
- return init("poll");
- };
- if (doc.readyState !== "complete") {
- if (doc.createEventObject && root.doScroll) {
- try {
- top = !win.frameElement;
- } catch (_error) {}
- if (top) {
- poll();
- }
- }
- doc[add](pre + "DOMContentLoaded", init, false);
- doc[add](pre + "readystatechange", init, false);
- return win[add](pre + "load", init, false);
- }
- };
-
- Dropzone._autoDiscoverFunction = function() {
- if (Dropzone.autoDiscover) {
- return Dropzone.discover();
- }
- };
-
- contentLoaded(window, Dropzone._autoDiscoverFunction);
-
-}).call(this);
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/blank.gif b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/blank.gif
deleted file mode 100755
index 35d42e8..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/blank.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_loading.gif b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_loading.gif
deleted file mode 100755
index a03a40c..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_loading.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_loading@2x.gif b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_loading@2x.gif
deleted file mode 100755
index 9205aeb..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_loading@2x.gif and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_overlay.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_overlay.png
deleted file mode 100755
index a439139..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_overlay.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_sprite.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_sprite.png
deleted file mode 100755
index fd8d5ca..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_sprite.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_sprite@2x.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_sprite@2x.png
deleted file mode 100755
index d0e4779..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/fancybox_sprite@2x.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/fancybox_buttons.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/fancybox_buttons.png
deleted file mode 100755
index 0787207..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/fancybox_buttons.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-buttons.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-buttons.css
deleted file mode 100755
index a26273a..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-buttons.css
+++ /dev/null
@@ -1,97 +0,0 @@
-#fancybox-buttons {
- position: fixed;
- left: 0;
- width: 100%;
- z-index: 8050;
-}
-
-#fancybox-buttons.top {
- top: 10px;
-}
-
-#fancybox-buttons.bottom {
- bottom: 10px;
-}
-
-#fancybox-buttons ul {
- display: block;
- width: 166px;
- height: 30px;
- margin: 0 auto;
- padding: 0;
- list-style: none;
- border: 1px solid #111;
- border-radius: 3px;
- -webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
- -moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
- box-shadow: inset 0 0 0 1px rgba(255,255,255,.05);
- background: rgb(50,50,50);
- background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%);
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51)));
- background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
- background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
- background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
- background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%);
- filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 );
-}
-
-#fancybox-buttons ul li {
- float: left;
- margin: 0;
- padding: 0;
-}
-
-#fancybox-buttons a {
- display: block;
- width: 30px;
- height: 30px;
- text-indent: -9999px;
- background-color: transparent;
- background-image: url('fancybox_buttons.png');
- background-repeat: no-repeat;
- outline: none;
- opacity: 0.8;
-}
-
-#fancybox-buttons a:hover {
- opacity: 1;
-}
-
-#fancybox-buttons a.btnPrev {
- background-position: 5px 0;
-}
-
-#fancybox-buttons a.btnNext {
- background-position: -33px 0;
- border-right: 1px solid #3e3e3e;
-}
-
-#fancybox-buttons a.btnPlay {
- background-position: 0 -30px;
-}
-
-#fancybox-buttons a.btnPlayOn {
- background-position: -30px -30px;
-}
-
-#fancybox-buttons a.btnToggle {
- background-position: 3px -60px;
- border-left: 1px solid #111;
- border-right: 1px solid #3e3e3e;
- width: 35px
-}
-
-#fancybox-buttons a.btnToggleOn {
- background-position: -27px -60px;
-}
-
-#fancybox-buttons a.btnClose {
- border-left: 1px solid #111;
- width: 35px;
- background-position: -56px 0px;
-}
-
-#fancybox-buttons a.btnDisabled {
- opacity : 0.4;
- cursor: default;
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-buttons.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-buttons.js
deleted file mode 100755
index fd8b955..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-buttons.js
+++ /dev/null
@@ -1,122 +0,0 @@
- /*!
- * Buttons helper for fancyBox
- * version: 1.0.5 (Mon, 15 Oct 2012)
- * @requires fancyBox v2.0 or later
- *
- * Usage:
- * $(".fancybox").fancybox({
- * helpers : {
- * buttons: {
- * position : 'top'
- * }
- * }
- * });
- *
- */
-(function ($) {
- //Shortcut for fancyBox object
- var F = $.fancybox;
-
- //Add helper object
- F.helpers.buttons = {
- defaults : {
- skipSingle : false, // disables if gallery contains single image
- position : 'top', // 'top' or 'bottom'
- tpl : '<div id="fancybox-buttons"><ul><li><a class="btnPrev" title="Previous" href="javascript:;"></a></li><li><a class="btnPlay" title="Start slideshow" href="javascript:;"></a></li><li><a class="btnNext" title="Next" href="javascript:;"></a></li><li><a class="btnToggle" title="Toggle size" href="javascript:;"></a></li><li><a class="btnClose" title="Close" href="javascript:;"></a></li></ul></div>'
- },
-
- list : null,
- buttons: null,
-
- beforeLoad: function (opts, obj) {
- //Remove self if gallery do not have at least two items
-
- if (opts.skipSingle && obj.group.length < 2) {
- obj.helpers.buttons = false;
- obj.closeBtn = true;
-
- return;
- }
-
- //Increase top margin to give space for buttons
- obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30;
- },
-
- onPlayStart: function () {
- if (this.buttons) {
- this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn');
- }
- },
-
- onPlayEnd: function () {
- if (this.buttons) {
- this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn');
- }
- },
-
- afterShow: function (opts, obj) {
- var buttons = this.buttons;
-
- if (!buttons) {
- this.list = $(opts.tpl).addClass(opts.position).appendTo('body');
-
- buttons = {
- prev : this.list.find('.btnPrev').click( F.prev ),
- next : this.list.find('.btnNext').click( F.next ),
- play : this.list.find('.btnPlay').click( F.play ),
- toggle : this.list.find('.btnToggle').click( F.toggle ),
- close : this.list.find('.btnClose').click( F.close )
- }
- }
-
- //Prev
- if (obj.index > 0 || obj.loop) {
- buttons.prev.removeClass('btnDisabled');
- } else {
- buttons.prev.addClass('btnDisabled');
- }
-
- //Next / Play
- if (obj.loop || obj.index < obj.group.length - 1) {
- buttons.next.removeClass('btnDisabled');
- buttons.play.removeClass('btnDisabled');
-
- } else {
- buttons.next.addClass('btnDisabled');
- buttons.play.addClass('btnDisabled');
- }
-
- this.buttons = buttons;
-
- this.onUpdate(opts, obj);
- },
-
- onUpdate: function (opts, obj) {
- var toggle;
-
- if (!this.buttons) {
- return;
- }
-
- toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn');
-
- //Size toggle button
- if (obj.canShrink) {
- toggle.addClass('btnToggleOn');
-
- } else if (!obj.canExpand) {
- toggle.addClass('btnDisabled');
- }
- },
-
- beforeClose: function () {
- if (this.list) {
- this.list.remove();
- }
-
- this.list = null;
- this.buttons = null;
- }
- };
-
-}(jQuery));
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-media.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-media.js
deleted file mode 100755
index 3584c8a..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-media.js
+++ /dev/null
@@ -1,199 +0,0 @@
-/*!
- * Media helper for fancyBox
- * version: 1.0.6 (Fri, 14 Jun 2013)
- * @requires fancyBox v2.0 or later
- *
- * Usage:
- * $(".fancybox").fancybox({
- * helpers : {
- * media: true
- * }
- * });
- *
- * Set custom URL parameters:
- * $(".fancybox").fancybox({
- * helpers : {
- * media: {
- * youtube : {
- * params : {
- * autoplay : 0
- * }
- * }
- * }
- * }
- * });
- *
- * Or:
- * $(".fancybox").fancybox({,
- * helpers : {
- * media: true
- * },
- * youtube : {
- * autoplay: 0
- * }
- * });
- *
- * Supports:
- *
- * Youtube
- * http://www.youtube.com/watch?v=opj24KnzrWo
- * http://www.youtube.com/embed/opj24KnzrWo
- * http://youtu.be/opj24KnzrWo
- * http://www.youtube-nocookie.com/embed/opj24KnzrWo
- * Vimeo
- * http://vimeo.com/40648169
- * http://vimeo.com/channels/staffpicks/38843628
- * http://vimeo.com/groups/surrealism/videos/36516384
- * http://player.vimeo.com/video/45074303
- * Metacafe
- * http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/
- * http://www.metacafe.com/watch/7635964/
- * Dailymotion
- * http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people
- * Twitvid
- * http://twitvid.com/QY7MD
- * Twitpic
- * http://twitpic.com/7p93st
- * Instagram
- * http://instagr.am/p/IejkuUGxQn/
- * http://instagram.com/p/IejkuUGxQn/
- * Google maps
- * http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17
- * http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16
- * http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56
- */
-(function ($) {
- "use strict";
-
- //Shortcut for fancyBox object
- var F = $.fancybox,
- format = function( url, rez, params ) {
- params = params || '';
-
- if ( $.type( params ) === "object" ) {
- params = $.param(params, true);
- }
-
- $.each(rez, function(key, value) {
- url = url.replace( '$' + key, value || '' );
- });
-
- if (params.length) {
- url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params;
- }
-
- return url;
- };
-
- //Add helper object
- F.helpers.media = {
- defaults : {
- youtube : {
- matcher : /(youtube\.com|youtu\.be|youtube-nocookie\.com)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i,
- params : {
- autoplay : 1,
- autohide : 1,
- fs : 1,
- rel : 0,
- hd : 1,
- wmode : 'opaque',
- enablejsapi : 1
- },
- type : 'iframe',
- url : '//www.youtube.com/embed/$3'
- },
- vimeo : {
- matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/,
- params : {
- autoplay : 1,
- hd : 1,
- show_title : 1,
- show_byline : 1,
- show_portrait : 0,
- fullscreen : 1
- },
- type : 'iframe',
- url : '//player.vimeo.com/video/$1'
- },
- metacafe : {
- matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/,
- params : {
- autoPlay : 'yes'
- },
- type : 'swf',
- url : function( rez, params, obj ) {
- obj.swf.flashVars = 'playerVars=' + $.param( params, true );
-
- return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf';
- }
- },
- dailymotion : {
- matcher : /dailymotion.com\/video\/(.*)\/?(.*)/,
- params : {
- additionalInfos : 0,
- autoStart : 1
- },
- type : 'swf',
- url : '//www.dailymotion.com/swf/video/$1'
- },
- twitvid : {
- matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i,
- params : {
- autoplay : 0
- },
- type : 'iframe',
- url : '//www.twitvid.com/embed.php?guid=$1'
- },
- twitpic : {
- matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i,
- type : 'image',
- url : '//twitpic.com/show/full/$1/'
- },
- instagram : {
- matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,
- type : 'image',
- url : '//$1/p/$2/media/?size=l'
- },
- google_maps : {
- matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i,
- type : 'iframe',
- url : function( rez ) {
- return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed');
- }
- }
- },
-
- beforeLoad : function(opts, obj) {
- var url = obj.href || '',
- type = false,
- what,
- item,
- rez,
- params;
-
- for (what in opts) {
- if (opts.hasOwnProperty(what)) {
- item = opts[ what ];
- rez = url.match( item.matcher );
-
- if (rez) {
- type = item.type;
- params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null));
-
- url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params );
-
- break;
- }
- }
- }
-
- if (type) {
- obj.href = url;
- obj.type = type;
-
- obj.autoHeight = false;
- }
- }
- };
-
-}(jQuery));
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-thumbs.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-thumbs.css
deleted file mode 100755
index 63d2943..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-thumbs.css
+++ /dev/null
@@ -1,55 +0,0 @@
-#fancybox-thumbs {
- position: fixed;
- left: 0;
- width: 100%;
- overflow: hidden;
- z-index: 8050;
-}
-
-#fancybox-thumbs.bottom {
- bottom: 2px;
-}
-
-#fancybox-thumbs.top {
- top: 2px;
-}
-
-#fancybox-thumbs ul {
- position: relative;
- list-style: none;
- margin: 0;
- padding: 0;
-}
-
-#fancybox-thumbs ul li {
- float: left;
- padding: 1px;
- opacity: 0.5;
-}
-
-#fancybox-thumbs ul li.active {
- opacity: 0.75;
- padding: 0;
- border: 1px solid #fff;
-}
-
-#fancybox-thumbs ul li:hover {
- opacity: 1;
-}
-
-#fancybox-thumbs ul li a {
- display: block;
- position: relative;
- overflow: hidden;
- border: 1px solid #222;
- background: #111;
- outline: none;
-}
-
-#fancybox-thumbs ul li img {
- display: block;
- position: relative;
- border: 0;
- padding: 0;
- max-width: none;
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-thumbs.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-thumbs.js
deleted file mode 100755
index 5db3d4a..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/helpers/jquery.fancybox-thumbs.js
+++ /dev/null
@@ -1,162 +0,0 @@
- /*!
- * Thumbnail helper for fancyBox
- * version: 1.0.7 (Mon, 01 Oct 2012)
- * @requires fancyBox v2.0 or later
- *
- * Usage:
- * $(".fancybox").fancybox({
- * helpers : {
- * thumbs: {
- * width : 50,
- * height : 50
- * }
- * }
- * });
- *
- */
-(function ($) {
- //Shortcut for fancyBox object
- var F = $.fancybox;
-
- //Add helper object
- F.helpers.thumbs = {
- defaults : {
- width : 50, // thumbnail width
- height : 50, // thumbnail height
- position : 'bottom', // 'top' or 'bottom'
- source : function ( item ) { // function to obtain the URL of the thumbnail image
- var href;
-
- if (item.element) {
- href = $(item.element).find('img').attr('src');
- }
-
- if (!href && item.type === 'image' && item.href) {
- href = item.href;
- }
-
- return href;
- }
- },
-
- wrap : null,
- list : null,
- width : 0,
-
- init: function (opts, obj) {
- var that = this,
- list,
- thumbWidth = opts.width,
- thumbHeight = opts.height,
- thumbSource = opts.source;
-
- //Build list structure
- list = '';
-
- for (var n = 0; n < obj.group.length; n++) {
- list += '<li><a style="width:' + thumbWidth + 'px;height:' + thumbHeight + 'px;" href="javascript:jQuery.fancybox.jumpto(' + n + ');"></a></li>';
- }
-
- this.wrap = $('<div id="fancybox-thumbs"></div>').addClass(opts.position).appendTo('body');
- this.list = $('<ul>' + list + '</ul>').appendTo(this.wrap);
-
- //Load each thumbnail
- $.each(obj.group, function (i) {
- var href = thumbSource( obj.group[ i ] );
-
- if (!href) {
- return;
- }
-
- $("<img />").load(function () {
- var width = this.width,
- height = this.height,
- widthRatio, heightRatio, parent;
-
- if (!that.list || !width || !height) {
- return;
- }
-
- //Calculate thumbnail width/height and center it
- widthRatio = width / thumbWidth;
- heightRatio = height / thumbHeight;
-
- parent = that.list.children().eq(i).find('a');
-
- if (widthRatio >= 1 && heightRatio >= 1) {
- if (widthRatio > heightRatio) {
- width = Math.floor(width / heightRatio);
- height = thumbHeight;
-
- } else {
- width = thumbWidth;
- height = Math.floor(height / widthRatio);
- }
- }
-
- $(this).css({
- width : width,
- height : height,
- top : Math.floor(thumbHeight / 2 - height / 2),
- left : Math.floor(thumbWidth / 2 - width / 2)
- });
-
- parent.width(thumbWidth).height(thumbHeight);
-
- $(this).hide().appendTo(parent).fadeIn(300);
-
- }).attr('src', href);
- });
-
- //Set initial width
- this.width = this.list.children().eq(0).outerWidth(true);
-
- this.list.width(this.width * (obj.group.length + 1)).css('left', Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5)));
- },
-
- beforeLoad: function (opts, obj) {
- //Remove self if gallery do not have at least two items
- if (obj.group.length < 2) {
- obj.helpers.thumbs = false;
-
- return;
- }
-
- //Increase bottom margin to give space for thumbs
- obj.margin[ opts.position === 'top' ? 0 : 2 ] += ((opts.height) + 15);
- },
-
- afterShow: function (opts, obj) {
- //Check if exists and create or update list
- if (this.list) {
- this.onUpdate(opts, obj);
-
- } else {
- this.init(opts, obj);
- }
-
- //Set active element
- this.list.children().removeClass('active').eq(obj.index).addClass('active');
- },
-
- //Center list
- onUpdate: function (opts, obj) {
- if (this.list) {
- this.list.stop(true).animate({
- 'left': Math.floor($(window).width() * 0.5 - (obj.index * this.width + this.width * 0.5))
- }, 150);
- }
- },
-
- beforeClose: function () {
- if (this.wrap) {
- this.wrap.remove();
- }
-
- this.wrap = null;
- this.list = null;
- this.width = 0;
- }
- }
-
-}(jQuery));
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.css
deleted file mode 100755
index 367890a..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.css
+++ /dev/null
@@ -1,274 +0,0 @@
-/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
-.fancybox-wrap,
-.fancybox-skin,
-.fancybox-outer,
-.fancybox-inner,
-.fancybox-image,
-.fancybox-wrap iframe,
-.fancybox-wrap object,
-.fancybox-nav,
-.fancybox-nav span,
-.fancybox-tmp
-{
- padding: 0;
- margin: 0;
- border: 0;
- outline: none;
- vertical-align: top;
-}
-
-.fancybox-wrap {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 8020;
-}
-
-.fancybox-skin {
- position: relative;
- background: #f9f9f9;
- color: #444;
- text-shadow: none;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.fancybox-opened {
- z-index: 8030;
-}
-
-.fancybox-opened .fancybox-skin {
- -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
- -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
-}
-
-.fancybox-outer, .fancybox-inner {
- position: relative;
-}
-
-.fancybox-inner {
- overflow: hidden;
-}
-
-.fancybox-type-iframe .fancybox-inner {
- -webkit-overflow-scrolling: touch;
-}
-
-.fancybox-error {
- color: #444;
- font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
- margin: 0;
- padding: 15px;
- white-space: nowrap;
-}
-
-.fancybox-image, .fancybox-iframe {
- display: block;
- width: 100%;
- height: 100%;
-}
-
-.fancybox-image {
- max-width: 100%;
- max-height: 100%;
-}
-
-#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
- background-image: url('fancybox_sprite.png');
-}
-
-#fancybox-loading {
- position: fixed;
- top: 50%;
- left: 50%;
- margin-top: -22px;
- margin-left: -22px;
- background-position: 0 -108px;
- opacity: 0.8;
- cursor: pointer;
- z-index: 8060;
-}
-
-#fancybox-loading div {
- width: 44px;
- height: 44px;
- background: url('fancybox_loading.gif') center center no-repeat;
-}
-
-.fancybox-close {
- position: absolute;
- top: -18px;
- right: -18px;
- width: 36px;
- height: 36px;
- cursor: pointer;
- z-index: 8040;
-}
-
-.fancybox-nav {
- position: absolute;
- top: 0;
- width: 40%;
- height: 100%;
- cursor: pointer;
- text-decoration: none;
- background: transparent url('blank.gif'); /* helps IE */
- -webkit-tap-highlight-color: rgba(0,0,0,0);
- z-index: 8040;
-}
-
-.fancybox-prev {
- left: 0;
-}
-
-.fancybox-next {
- right: 0;
-}
-
-.fancybox-nav span {
- position: absolute;
- top: 50%;
- width: 36px;
- height: 34px;
- margin-top: -18px;
- cursor: pointer;
- z-index: 8040;
- visibility: hidden;
-}
-
-.fancybox-prev span {
- left: 10px;
- background-position: 0 -36px;
-}
-
-.fancybox-next span {
- right: 10px;
- background-position: 0 -72px;
-}
-
-.fancybox-nav:hover span {
- visibility: visible;
-}
-
-.fancybox-tmp {
- position: absolute;
- top: -99999px;
- left: -99999px;
- visibility: hidden;
- max-width: 99999px;
- max-height: 99999px;
- overflow: visible !important;
-}
-
-/* Overlay helper */
-
-.fancybox-lock {
- overflow: hidden !important;
- width: auto;
-}
-
-.fancybox-lock body {
- overflow: hidden !important;
-}
-
-.fancybox-lock-test {
- overflow-y: hidden !important;
-}
-
-.fancybox-overlay {
- position: absolute;
- top: 0;
- left: 0;
- overflow: hidden;
- display: none;
- z-index: 8010;
- background: url('fancybox_overlay.png');
-}
-
-.fancybox-overlay-fixed {
- position: fixed;
- bottom: 0;
- right: 0;
-}
-
-.fancybox-lock .fancybox-overlay {
- overflow: auto;
- overflow-y: scroll;
-}
-
-/* Title helper */
-
-.fancybox-title {
- visibility: hidden;
- font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif;
- position: relative;
- text-shadow: none;
- z-index: 8050;
-}
-
-.fancybox-opened .fancybox-title {
- visibility: visible;
-}
-
-.fancybox-title-float-wrap {
- position: absolute;
- bottom: 0;
- right: 50%;
- margin-bottom: -35px;
- z-index: 8050;
- text-align: center;
-}
-
-.fancybox-title-float-wrap .child {
- display: inline-block;
- margin-right: -100%;
- padding: 2px 20px;
- background: transparent; /* Fallback for web browsers that doesn't support RGBa */
- background: rgba(0, 0, 0, 0.8);
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
- text-shadow: 0 1px 2px #222;
- color: #FFF;
- font-weight: bold;
- line-height: 24px;
- white-space: nowrap;
-}
-
-.fancybox-title-outside-wrap {
- position: relative;
- margin-top: 10px;
- color: #fff;
-}
-
-.fancybox-title-inside-wrap {
- padding-top: 10px;
-}
-
-.fancybox-title-over-wrap {
- position: absolute;
- bottom: 0;
- left: 0;
- color: #fff;
- padding: 10px;
- background: #000;
- background: rgba(0, 0, 0, .8);
-}
-
-/*Retina graphics!*/
-@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
- only screen and (min--moz-device-pixel-ratio: 1.5),
- only screen and (min-device-pixel-ratio: 1.5){
-
- #fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span {
- background-image: url('fancybox_sprite@2x.png');
- background-size: 44px 152px; /*The size of the normal image, half the size of the hi-res image*/
- }
-
- #fancybox-loading div {
- background-image: url('fancybox_loading@2x.gif');
- background-size: 24px 24px; /*The size of the normal image, half the size of the hi-res image*/
- }
-}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.js
deleted file mode 100755
index e8e1987..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.js
+++ /dev/null
@@ -1,2020 +0,0 @@
-/*!
- * fancyBox - jQuery Plugin
- * version: 2.1.5 (Fri, 14 Jun 2013)
- * @requires jQuery v1.6 or later
- *
- * Examples at http://fancyapps.com/fancybox/
- * License: www.fancyapps.com/fancybox/#license
- *
- * Copyright 2012 Janis Skarnelis - janis@fancyapps.com
- *
- */
-
-(function (window, document, $, undefined) {
- "use strict";
-
- var H = $("html"),
- W = $(window),
- D = $(document),
- F = $.fancybox = function () {
- F.open.apply( this, arguments );
- },
- IE = navigator.userAgent.match(/msie/i),
- didUpdate = null,
- isTouch = document.createTouch !== undefined,
-
- isQuery = function(obj) {
- return obj && obj.hasOwnProperty && obj instanceof $;
- },
- isString = function(str) {
- return str && $.type(str) === "string";
- },
- isPercentage = function(str) {
- return isString(str) && str.indexOf('%') > 0;
- },
- isScrollable = function(el) {
- return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight)));
- },
- getScalar = function(orig, dim) {
- var value = parseInt(orig, 10) || 0;
-
- if (dim && isPercentage(orig)) {
- value = F.getViewport()[ dim ] / 100 * value;
- }
-
- return Math.ceil(value);
- },
- getValue = function(value, dim) {
- return getScalar(value, dim) + 'px';
- };
-
- $.extend(F, {
- // The current version of fancyBox
- version: '2.1.5',
-
- defaults: {
- padding : 15,
- margin : 20,
-
- width : 800,
- height : 600,
- minWidth : 100,
- minHeight : 100,
- maxWidth : 9999,
- maxHeight : 9999,
- pixelRatio: 1, // Set to 2 for retina display support
-
- autoSize : true,
- autoHeight : false,
- autoWidth : false,
-
- autoResize : true,
- autoCenter : !isTouch,
- fitToView : true,
- aspectRatio : false,
- topRatio : 0.5,
- leftRatio : 0.5,
-
- scrolling : 'auto', // 'auto', 'yes' or 'no'
- wrapCSS : '',
-
- arrows : true,
- closeBtn : true,
- closeClick : false,
- nextClick : false,
- mouseWheel : true,
- autoPlay : false,
- playSpeed : 3000,
- preload : 3,
- modal : false,
- loop : true,
-
- ajax : {
- dataType : 'html',
- headers : { 'X-fancyBox': true }
- },
- iframe : {
- scrolling : 'auto',
- preload : true
- },
- swf : {
- wmode: 'transparent',
- allowfullscreen : 'true',
- allowscriptaccess : 'always'
- },
-
- keys : {
- next : {
- 13 : 'left', // enter
- 34 : 'up', // page down
- 39 : 'left', // right arrow
- 40 : 'up' // down arrow
- },
- prev : {
- 8 : 'right', // backspace
- 33 : 'down', // page up
- 37 : 'right', // left arrow
- 38 : 'down' // up arrow
- },
- close : [27], // escape key
- play : [32], // space - start/stop slideshow
- toggle : [70] // letter "f" - toggle fullscreen
- },
-
- direction : {
- next : 'left',
- prev : 'right'
- },
-
- scrollOutside : true,
-
- // Override some properties
- index : 0,
- type : null,
- href : null,
- content : null,
- title : null,
-
- // HTML templates
- tpl: {
- wrap : '<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',
- image : '<img class="fancybox-image" src="{href}" alt="" />',
- iframe : '<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen' + (IE ? ' allowtransparency="true"' : '') + '></iframe>',
- error : '<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',
- closeBtn : '<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',
- next : '<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',
- prev : '<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'
- },
-
- // Properties for each animation type
- // Opening fancyBox
- openEffect : 'fade', // 'elastic', 'fade' or 'none'
- openSpeed : 250,
- openEasing : 'swing',
- openOpacity : true,
- openMethod : 'zoomIn',
-
- // Closing fancyBox
- closeEffect : 'fade', // 'elastic', 'fade' or 'none'
- closeSpeed : 250,
- closeEasing : 'swing',
- closeOpacity : true,
- closeMethod : 'zoomOut',
-
- // Changing next gallery item
- nextEffect : 'elastic', // 'elastic', 'fade' or 'none'
- nextSpeed : 250,
- nextEasing : 'swing',
- nextMethod : 'changeIn',
-
- // Changing previous gallery item
- prevEffect : 'elastic', // 'elastic', 'fade' or 'none'
- prevSpeed : 250,
- prevEasing : 'swing',
- prevMethod : 'changeOut',
-
- // Enable default helpers
- helpers : {
- overlay : true,
- title : true
- },
-
- // Callbacks
- onCancel : $.noop, // If canceling
- beforeLoad : $.noop, // Before loading
- afterLoad : $.noop, // After loading
- beforeShow : $.noop, // Before changing in current item
- afterShow : $.noop, // After opening
- beforeChange : $.noop, // Before changing gallery item
- beforeClose : $.noop, // Before closing
- afterClose : $.noop // After closing
- },
-
- //Current state
- group : {}, // Selected group
- opts : {}, // Group options
- previous : null, // Previous element
- coming : null, // Element being loaded
- current : null, // Currently loaded element
- isActive : false, // Is activated
- isOpen : false, // Is currently open
- isOpened : false, // Have been fully opened at least once
-
- wrap : null,
- skin : null,
- outer : null,
- inner : null,
-
- player : {
- timer : null,
- isActive : false
- },
-
- // Loaders
- ajaxLoad : null,
- imgPreload : null,
-
- // Some collections
- transitions : {},
- helpers : {},
-
- /*
- * Static methods
- */
-
- open: function (group, opts) {
- if (!group) {
- return;
- }
-
- if (!$.isPlainObject(opts)) {
- opts = {};
- }
-
- // Close if already active
- if (false === F.close(true)) {
- return;
- }
-
- // Normalize group
- if (!$.isArray(group)) {
- group = isQuery(group) ? $(group).get() : [group];
- }
-
- // Recheck if the type of each element is `object` and set content type (image, ajax, etc)
- $.each(group, function(i, element) {
- var obj = {},
- href,
- title,
- content,
- type,
- rez,
- hrefParts,
- selector;
-
- if ($.type(element) === "object") {
- // Check if is DOM element
- if (element.nodeType) {
- element = $(element);
- }
-
- if (isQuery(element)) {
- obj = {
- href : element.data('fancybox-href') || element.attr('href'),
- title : element.data('fancybox-title') || element.attr('title'),
- isDom : true,
- element : element
- };
-
- if ($.metadata) {
- $.extend(true, obj, element.metadata());
- }
-
- } else {
- obj = element;
- }
- }
-
- href = opts.href || obj.href || (isString(element) ? element : null);
- title = opts.title !== undefined ? opts.title : obj.title || '';
-
- content = opts.content || obj.content;
- type = content ? 'html' : (opts.type || obj.type);
-
- if (!type && obj.isDom) {
- type = element.data('fancybox-type');
-
- if (!type) {
- rez = element.prop('class').match(/fancybox\.(\w+)/);
- type = rez ? rez[1] : null;
- }
- }
-
- if (isString(href)) {
- // Try to guess the content type
- if (!type) {
- if (F.isImage(href)) {
- type = 'image';
-
- } else if (F.isSWF(href)) {
- type = 'swf';
-
- } else if (href.charAt(0) === '#') {
- type = 'inline';
-
- } else if (isString(element)) {
- type = 'html';
- content = element;
- }
- }
-
- // Split url into two pieces with source url and content selector, e.g,
- // "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id"
- if (type === 'ajax') {
- hrefParts = href.split(/\s+/, 2);
- href = hrefParts.shift();
- selector = hrefParts.shift();
- }
- }
-
- if (!content) {
- if (type === 'inline') {
- if (href) {
- content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7
-
- } else if (obj.isDom) {
- content = element;
- }
-
- } else if (type === 'html') {
- content = href;
-
- } else if (!type && !href && obj.isDom) {
- type = 'inline';
- content = element;
- }
- }
-
- $.extend(obj, {
- href : href,
- type : type,
- content : content,
- title : title,
- selector : selector
- });
-
- group[ i ] = obj;
- });
-
- // Extend the defaults
- F.opts = $.extend(true, {}, F.defaults, opts);
-
- // All options are merged recursive except keys
- if (opts.keys !== undefined) {
- F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false;
- }
-
- F.group = group;
-
- return F._start(F.opts.index);
- },
-
- // Cancel image loading or abort ajax request
- cancel: function () {
- var coming = F.coming;
-
- if (!coming || false === F.trigger('onCancel')) {
- return;
- }
-
- F.hideLoading();
-
- if (F.ajaxLoad) {
- F.ajaxLoad.abort();
- }
-
- F.ajaxLoad = null;
-
- if (F.imgPreload) {
- F.imgPreload.onload = F.imgPreload.onerror = null;
- }
-
- if (coming.wrap) {
- coming.wrap.stop(true, true).trigger('onReset').remove();
- }
-
- F.coming = null;
-
- // If the first item has been canceled, then clear everything
- if (!F.current) {
- F._afterZoomOut( coming );
- }
- },
-
- // Start closing animation if is open; remove immediately if opening/closing
- close: function (event) {
- F.cancel();
-
- if (false === F.trigger('beforeClose')) {
- return;
- }
-
- F.unbindEvents();
-
- if (!F.isActive) {
- return;
- }
-
- if (!F.isOpen || event === true) {
- $('.fancybox-wrap').stop(true).trigger('onReset').remove();
-
- F._afterZoomOut();
-
- } else {
- F.isOpen = F.isOpened = false;
- F.isClosing = true;
-
- $('.fancybox-item, .fancybox-nav').remove();
-
- F.wrap.stop(true, true).removeClass('fancybox-opened');
-
- F.transitions[ F.current.closeMethod ]();
- }
- },
-
- // Manage slideshow:
- // $.fancybox.play(); - toggle slideshow
- // $.fancybox.play( true ); - start
- // $.fancybox.play( false ); - stop
- play: function ( action ) {
- var clear = function () {
- clearTimeout(F.player.timer);
- },
- set = function () {
- clear();
-
- if (F.current && F.player.isActive) {
- F.player.timer = setTimeout(F.next, F.current.playSpeed);
- }
- },
- stop = function () {
- clear();
-
- D.unbind('.player');
-
- F.player.isActive = false;
-
- F.trigger('onPlayEnd');
- },
- start = function () {
- if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) {
- F.player.isActive = true;
-
- D.bind({
- 'onCancel.player beforeClose.player' : stop,
- 'onUpdate.player' : set,
- 'beforeLoad.player' : clear
- });
-
- set();
-
- F.trigger('onPlayStart');
- }
- };
-
- if (action === true || (!F.player.isActive && action !== false)) {
- start();
- } else {
- stop();
- }
- },
-
- // Navigate to next gallery item
- next: function ( direction ) {
- var current = F.current;
-
- if (current) {
- if (!isString(direction)) {
- direction = current.direction.next;
- }
-
- F.jumpto(current.index + 1, direction, 'next');
- }
- },
-
- // Navigate to previous gallery item
- prev: function ( direction ) {
- var current = F.current;
-
- if (current) {
- if (!isString(direction)) {
- direction = current.direction.prev;
- }
-
- F.jumpto(current.index - 1, direction, 'prev');
- }
- },
-
- // Navigate to gallery item by index
- jumpto: function ( index, direction, router ) {
- var current = F.current;
-
- if (!current) {
- return;
- }
-
- index = getScalar(index);
-
- F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ];
- F.router = router || 'jumpto';
-
- if (current.loop) {
- if (index < 0) {
- index = current.group.length + (index % current.group.length);
- }
-
- index = index % current.group.length;
- }
-
- if (current.group[ index ] !== undefined) {
- F.cancel();
-
- F._start(index);
- }
- },
-
- // Center inside viewport and toggle position type to fixed or absolute if needed
- reposition: function (e, onlyAbsolute) {
- var current = F.current,
- wrap = current ? current.wrap : null,
- pos;
-
- if (wrap) {
- pos = F._getPosition(onlyAbsolute);
-
- if (e && e.type === 'scroll') {
- delete pos.position;
-
- wrap.stop(true, true).animate(pos, 200);
-
- } else {
- wrap.css(pos);
-
- current.pos = $.extend({}, current.dim, pos);
- }
- }
- },
-
- update: function (e) {
- var type = (e && e.type),
- anyway = !type || type === 'orientationchange';
-
- if (anyway) {
- clearTimeout(didUpdate);
-
- didUpdate = null;
- }
-
- if (!F.isOpen || didUpdate) {
- return;
- }
-
- didUpdate = setTimeout(function() {
- var current = F.current;
-
- if (!current || F.isClosing) {
- return;
- }
-
- F.wrap.removeClass('fancybox-tmp');
-
- if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) {
- F._setDimension();
- }
-
- if (!(type === 'scroll' && current.canShrink)) {
- F.reposition(e);
- }
-
- F.trigger('onUpdate');
-
- didUpdate = null;
-
- }, (anyway && !isTouch ? 0 : 300));
- },
-
- // Shrink content to fit inside viewport or restore if resized
- toggle: function ( action ) {
- if (F.isOpen) {
- F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView;
-
- // Help browser to restore document dimensions
- if (isTouch) {
- F.wrap.removeAttr('style').addClass('fancybox-tmp');
-
- F.trigger('onUpdate');
- }
-
- F.update();
- }
- },
-
- hideLoading: function () {
- D.unbind('.loading');
-
- $('#fancybox-loading').remove();
- },
-
- showLoading: function () {
- var el, viewport;
-
- F.hideLoading();
-
- el = $('<div id="fancybox-loading"><div></div></div>').click(F.cancel).appendTo('body');
-
- // If user will press the escape-button, the request will be canceled
- D.bind('keydown.loading', function(e) {
- if ((e.which || e.keyCode) === 27) {
- e.preventDefault();
-
- F.cancel();
- }
- });
-
- if (!F.defaults.fixed) {
- viewport = F.getViewport();
-
- el.css({
- position : 'absolute',
- top : (viewport.h * 0.5) + viewport.y,
- left : (viewport.w * 0.5) + viewport.x
- });
- }
- },
-
- getViewport: function () {
- var locked = (F.current && F.current.locked) || false,
- rez = {
- x: W.scrollLeft(),
- y: W.scrollTop()
- };
-
- if (locked) {
- rez.w = locked[0].clientWidth;
- rez.h = locked[0].clientHeight;
-
- } else {
- // See http://bugs.jquery.com/ticket/6724
- rez.w = isTouch && window.innerWidth ? window.innerWidth : W.width();
- rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height();
- }
-
- return rez;
- },
-
- // Unbind the keyboard / clicking actions
- unbindEvents: function () {
- if (F.wrap && isQuery(F.wrap)) {
- F.wrap.unbind('.fb');
- }
-
- D.unbind('.fb');
- W.unbind('.fb');
- },
-
- bindEvents: function () {
- var current = F.current,
- keys;
-
- if (!current) {
- return;
- }
-
- // Changing document height on iOS devices triggers a 'resize' event,
- // that can change document height... repeating infinitely
- W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update);
-
- keys = current.keys;
-
- if (keys) {
- D.bind('keydown.fb', function (e) {
- var code = e.which || e.keyCode,
- target = e.target || e.srcElement;
-
- // Skip esc key if loading, because showLoading will cancel preloading
- if (code === 27 && F.coming) {
- return false;
- }
-
- // Ignore key combinations and key events within form elements
- if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) {
- $.each(keys, function(i, val) {
- if (current.group.length > 1 && val[ code ] !== undefined) {
- F[ i ]( val[ code ] );
-
- e.preventDefault();
- return false;
- }
-
- if ($.inArray(code, val) > -1) {
- F[ i ] ();
-
- e.preventDefault();
- return false;
- }
- });
- }
- });
- }
-
- if ($.fn.mousewheel && current.mouseWheel) {
- F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) {
- var target = e.target || null,
- parent = $(target),
- canScroll = false;
-
- while (parent.length) {
- if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) {
- break;
- }
-
- canScroll = isScrollable( parent[0] );
- parent = $(parent).parent();
- }
-
- if (delta !== 0 && !canScroll) {
- if (F.group.length > 1 && !current.canShrink) {
- if (deltaY > 0 || deltaX > 0) {
- F.prev( deltaY > 0 ? 'down' : 'left' );
-
- } else if (deltaY < 0 || deltaX < 0) {
- F.next( deltaY < 0 ? 'up' : 'right' );
- }
-
- e.preventDefault();
- }
- }
- });
- }
- },
-
- trigger: function (event, o) {
- var ret, obj = o || F.coming || F.current;
-
- if (!obj) {
- return;
- }
-
- if ($.isFunction( obj[event] )) {
- ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1));
- }
-
- if (ret === false) {
- return false;
- }
-
- if (obj.helpers) {
- $.each(obj.helpers, function (helper, opts) {
- if (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) {
- F.helpers[helper][event]($.extend(true, {}, F.helpers[helper].defaults, opts), obj);
- }
- });
- }
-
- D.trigger(event);
- },
-
- isImage: function (str) {
- return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i);
- },
-
- isSWF: function (str) {
- return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i);
- },
-
- _start: function (index) {
- var coming = {},
- obj,
- href,
- type,
- margin,
- padding;
-
- index = getScalar( index );
- obj = F.group[ index ] || null;
-
- if (!obj) {
- return false;
- }
-
- coming = $.extend(true, {}, F.opts, obj);
-
- // Convert margin and padding properties to array - top, right, bottom, left
- margin = coming.margin;
- padding = coming.padding;
-
- if ($.type(margin) === 'number') {
- coming.margin = [margin, margin, margin, margin];
- }
-
- if ($.type(padding) === 'number') {
- coming.padding = [padding, padding, padding, padding];
- }
-
- // 'modal' propery is just a shortcut
- if (coming.modal) {
- $.extend(true, coming, {
- closeBtn : false,
- closeClick : false,
- nextClick : false,
- arrows : false,
- mouseWheel : false,
- keys : null,
- helpers: {
- overlay : {
- closeClick : false
- }
- }
- });
- }
-
- // 'autoSize' property is a shortcut, too
- if (coming.autoSize) {
- coming.autoWidth = coming.autoHeight = true;
- }
-
- if (coming.width === 'auto') {
- coming.autoWidth = true;
- }
-
- if (coming.height === 'auto') {
- coming.autoHeight = true;
- }
-
- /*
- * Add reference to the group, so it`s possible to access from callbacks, example:
- * afterLoad : function() {
- * this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');
- * }
- */
-
- coming.group = F.group;
- coming.index = index;
-
- // Give a chance for callback or helpers to update coming item (type, title, etc)
- F.coming = coming;
-
- if (false === F.trigger('beforeLoad')) {
- F.coming = null;
-
- return;
- }
-
- type = coming.type;
- href = coming.href;
-
- if (!type) {
- F.coming = null;
-
- //If we can not determine content type then drop silently or display next/prev item if looping through gallery
- if (F.current && F.router && F.router !== 'jumpto') {
- F.current.index = index;
-
- return F[ F.router ]( F.direction );
- }
-
- return false;
- }
-
- F.isActive = true;
-
- if (type === 'image' || type === 'swf') {
- coming.autoHeight = coming.autoWidth = false;
- coming.scrolling = 'visible';
- }
-
- if (type === 'image') {
- coming.aspectRatio = true;
- }
-
- if (type === 'iframe' && isTouch) {
- coming.scrolling = 'scroll';
- }
-
- // Build the neccessary markup
- coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' );
-
- $.extend(coming, {
- skin : $('.fancybox-skin', coming.wrap),
- outer : $('.fancybox-outer', coming.wrap),
- inner : $('.fancybox-inner', coming.wrap)
- });
-
- $.each(["Top", "Right", "Bottom", "Left"], function(i, v) {
- coming.skin.css('padding' + v, getValue(coming.padding[ i ]));
- });
-
- F.trigger('onReady');
-
- // Check before try to load; 'inline' and 'html' types need content, others - href
- if (type === 'inline' || type === 'html') {
- if (!coming.content || !coming.content.length) {
- return F._error( 'content' );
- }
-
- } else if (!href) {
- return F._error( 'href' );
- }
-
- if (type === 'image') {
- F._loadImage();
-
- } else if (type === 'ajax') {
- F._loadAjax();
-
- } else if (type === 'iframe') {
- F._loadIframe();
-
- } else {
- F._afterLoad();
- }
- },
-
- _error: function ( type ) {
- $.extend(F.coming, {
- type : 'html',
- autoWidth : true,
- autoHeight : true,
- minWidth : 0,
- minHeight : 0,
- scrolling : 'no',
- hasError : type,
- content : F.coming.tpl.error
- });
-
- F._afterLoad();
- },
-
- _loadImage: function () {
- // Reset preload image so it is later possible to check "complete" property
- var img = F.imgPreload = new Image();
-
- img.onload = function () {
- this.onload = this.onerror = null;
-
- F.coming.width = this.width / F.opts.pixelRatio;
- F.coming.height = this.height / F.opts.pixelRatio;
-
- F._afterLoad();
- };
-
- img.onerror = function () {
- this.onload = this.onerror = null;
-
- F._error( 'image' );
- };
-
- img.src = F.coming.href;
-
- if (img.complete !== true) {
- F.showLoading();
- }
- },
-
- _loadAjax: function () {
- var coming = F.coming;
-
- F.showLoading();
-
- F.ajaxLoad = $.ajax($.extend({}, coming.ajax, {
- url: coming.href,
- error: function (jqXHR, textStatus) {
- if (F.coming && textStatus !== 'abort') {
- F._error( 'ajax', jqXHR );
-
- } else {
- F.hideLoading();
- }
- },
- success: function (data, textStatus) {
- if (textStatus === 'success') {
- coming.content = data;
-
- F._afterLoad();
- }
- }
- }));
- },
-
- _loadIframe: function() {
- var coming = F.coming,
- iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime()))
- .attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling)
- .attr('src', coming.href);
-
- // This helps IE
- $(coming.wrap).bind('onReset', function () {
- try {
- $(this).find('iframe').hide().attr('src', '//about:blank').end().empty();
- } catch (e) {}
- });
-
- if (coming.iframe.preload) {
- F.showLoading();
-
- iframe.one('load', function() {
- $(this).data('ready', 1);
-
- // iOS will lose scrolling if we resize
- if (!isTouch) {
- $(this).bind('load.fb', F.update);
- }
-
- // Without this trick:
- // - iframe won't scroll on iOS devices
- // - IE7 sometimes displays empty iframe
- $(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show();
-
- F._afterLoad();
- });
- }
-
- coming.content = iframe.appendTo( coming.inner );
-
- if (!coming.iframe.preload) {
- F._afterLoad();
- }
- },
-
- _preloadImages: function() {
- var group = F.group,
- current = F.current,
- len = group.length,
- cnt = current.preload ? Math.min(current.preload, len - 1) : 0,
- item,
- i;
-
- for (i = 1; i <= cnt; i += 1) {
- item = group[ (current.index + i ) % len ];
-
- if (item.type === 'image' && item.href) {
- new Image().src = item.href;
- }
- }
- },
-
- _afterLoad: function () {
- var coming = F.coming,
- previous = F.current,
- placeholder = 'fancybox-placeholder',
- current,
- content,
- type,
- scrolling,
- href,
- embed;
-
- F.hideLoading();
-
- if (!coming || F.isActive === false) {
- return;
- }
-
- if (false === F.trigger('afterLoad', coming, previous)) {
- coming.wrap.stop(true).trigger('onReset').remove();
-
- F.coming = null;
-
- return;
- }
-
- if (previous) {
- F.trigger('beforeChange', previous);
-
- previous.wrap.stop(true).removeClass('fancybox-opened')
- .find('.fancybox-item, .fancybox-nav')
- .remove();
- }
-
- F.unbindEvents();
-
- current = coming;
- content = coming.content;
- type = coming.type;
- scrolling = coming.scrolling;
-
- $.extend(F, {
- wrap : current.wrap,
- skin : current.skin,
- outer : current.outer,
- inner : current.inner,
- current : current,
- previous : previous
- });
-
- href = current.href;
-
- switch (type) {
- case 'inline':
- case 'ajax':
- case 'html':
- if (current.selector) {
- content = $('<div>').html(content).find(current.selector);
-
- } else if (isQuery(content)) {
- if (!content.data(placeholder)) {
- content.data(placeholder, $('<div class="' + placeholder + '"></div>').insertAfter( content ).hide() );
- }
-
- content = content.show().detach();
-
- current.wrap.bind('onReset', function () {
- if ($(this).find(content).length) {
- content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false);
- }
- });
- }
- break;
-
- case 'image':
- content = current.tpl.image.replace('{href}', href);
- break;
-
- case 'swf':
- content = '<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="' + href + '"></param>';
- embed = '';
-
- $.each(current.swf, function(name, val) {
- content += '<param name="' + name + '" value="' + val + '"></param>';
- embed += ' ' + name + '="' + val + '"';
- });
-
- content += '<embed src="' + href + '" type="application/x-shockwave-flash" width="100%" height="100%"' + embed + '></embed></object>';
- break;
- }
-
- if (!(isQuery(content) && content.parent().is(current.inner))) {
- current.inner.append( content );
- }
-
- // Give a chance for helpers or callbacks to update elements
- F.trigger('beforeShow');
-
- // Set scrolling before calculating dimensions
- current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling));
-
- // Set initial dimensions and start position
- F._setDimension();
-
- F.reposition();
-
- F.isOpen = false;
- F.coming = null;
-
- F.bindEvents();
-
- if (!F.isOpened) {
- $('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove();
-
- } else if (previous.prevMethod) {
- F.transitions[ previous.prevMethod ]();
- }
-
- F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ]();
-
- F._preloadImages();
- },
-
- _setDimension: function () {
- var viewport = F.getViewport(),
- steps = 0,
- canShrink = false,
- canExpand = false,
- wrap = F.wrap,
- skin = F.skin,
- inner = F.inner,
- current = F.current,
- width = current.width,
- height = current.height,
- minWidth = current.minWidth,
- minHeight = current.minHeight,
- maxWidth = current.maxWidth,
- maxHeight = current.maxHeight,
- scrolling = current.scrolling,
- scrollOut = current.scrollOutside ? current.scrollbarWidth : 0,
- margin = current.margin,
- wMargin = getScalar(margin[1] + margin[3]),
- hMargin = getScalar(margin[0] + margin[2]),
- wPadding,
- hPadding,
- wSpace,
- hSpace,
- origWidth,
- origHeight,
- origMaxWidth,
- origMaxHeight,
- ratio,
- width_,
- height_,
- maxWidth_,
- maxHeight_,
- iframe,
- body;
-
- // Reset dimensions so we could re-check actual size
- wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp');
-
- wPadding = getScalar(skin.outerWidth(true) - skin.width());
- hPadding = getScalar(skin.outerHeight(true) - skin.height());
-
- // Any space between content and viewport (margin, padding, border, title)
- wSpace = wMargin + wPadding;
- hSpace = hMargin + hPadding;
-
- origWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width;
- origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height;
-
- if (current.type === 'iframe') {
- iframe = current.content;
-
- if (current.autoHeight && iframe.data('ready') === 1) {
- try {
- if (iframe[0].contentWindow.document.location) {
- inner.width( origWidth ).height(9999);
-
- body = iframe.contents().find('body');
-
- if (scrollOut) {
- body.css('overflow-x', 'hidden');
- }
-
- origHeight = body.outerHeight(true);
- }
-
- } catch (e) {}
- }
-
- } else if (current.autoWidth || current.autoHeight) {
- inner.addClass( 'fancybox-tmp' );
-
- // Set width or height in case we need to calculate only one dimension
- if (!current.autoWidth) {
- inner.width( origWidth );
- }
-
- if (!current.autoHeight) {
- inner.height( origHeight );
- }
-
- if (current.autoWidth) {
- origWidth = inner.width();
- }
-
- if (current.autoHeight) {
- origHeight = inner.height();
- }
-
- inner.removeClass( 'fancybox-tmp' );
- }
-
- width = getScalar( origWidth );
- height = getScalar( origHeight );
-
- ratio = origWidth / origHeight;
-
- // Calculations for the content
- minWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth);
- maxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth);
-
- minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight);
- maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight);
-
- // These will be used to determine if wrap can fit in the viewport
- origMaxWidth = maxWidth;
- origMaxHeight = maxHeight;
-
- if (current.fitToView) {
- maxWidth = Math.min(viewport.w - wSpace, maxWidth);
- maxHeight = Math.min(viewport.h - hSpace, maxHeight);
- }
-
- maxWidth_ = viewport.w - wMargin;
- maxHeight_ = viewport.h - hMargin;
-
- if (current.aspectRatio) {
- if (width > maxWidth) {
- width = maxWidth;
- height = getScalar(width / ratio);
- }
-
- if (height > maxHeight) {
- height = maxHeight;
- width = getScalar(height * ratio);
- }
-
- if (width < minWidth) {
- width = minWidth;
- height = getScalar(width / ratio);
- }
-
- if (height < minHeight) {
- height = minHeight;
- width = getScalar(height * ratio);
- }
-
- } else {
- width = Math.max(minWidth, Math.min(width, maxWidth));
-
- if (current.autoHeight && current.type !== 'iframe') {
- inner.width( width );
-
- height = inner.height();
- }
-
- height = Math.max(minHeight, Math.min(height, maxHeight));
- }
-
- // Try to fit inside viewport (including the title)
- if (current.fitToView) {
- inner.width( width ).height( height );
-
- wrap.width( width + wPadding );
-
- // Real wrap dimensions
- width_ = wrap.width();
- height_ = wrap.height();
-
- if (current.aspectRatio) {
- while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) {
- if (steps++ > 19) {
- break;
- }
-
- height = Math.max(minHeight, Math.min(maxHeight, height - 10));
- width = getScalar(height * ratio);
-
- if (width < minWidth) {
- width = minWidth;
- height = getScalar(width / ratio);
- }
-
- if (width > maxWidth) {
- width = maxWidth;
- height = getScalar(width / ratio);
- }
-
- inner.width( width ).height( height );
-
- wrap.width( width + wPadding );
-
- width_ = wrap.width();
- height_ = wrap.height();
- }
-
- } else {
- width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_)));
- height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_)));
- }
- }
-
- if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) {
- width += scrollOut;
- }
-
- inner.width( width ).height( height );
-
- wrap.width( width + wPadding );
-
- width_ = wrap.width();
- height_ = wrap.height();
-
- canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight;
- canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight));
-
- $.extend(current, {
- dim : {
- width : getValue( width_ ),
- height : getValue( height_ )
- },
- origWidth : origWidth,
- origHeight : origHeight,
- canShrink : canShrink,
- canExpand : canExpand,
- wPadding : wPadding,
- hPadding : hPadding,
- wrapSpace : height_ - skin.outerHeight(true),
- skinSpace : skin.height() - height
- });
-
- if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) {
- inner.height('auto');
- }
- },
-
- _getPosition: function (onlyAbsolute) {
- var current = F.current,
- viewport = F.getViewport(),
- margin = current.margin,
- width = F.wrap.width() + margin[1] + margin[3],
- height = F.wrap.height() + margin[0] + margin[2],
- rez = {
- position: 'absolute',
- top : margin[0],
- left : margin[3]
- };
-
- if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) {
- rez.position = 'fixed';
-
- } else if (!current.locked) {
- rez.top += viewport.y;
- rez.left += viewport.x;
- }
-
- rez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio)));
- rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * current.leftRatio)));
-
- return rez;
- },
-
- _afterZoomIn: function () {
- var current = F.current;
-
- if (!current) {
- return;
- }
-
- F.isOpen = F.isOpened = true;
-
- F.wrap.css('overflow', 'visible').addClass('fancybox-opened');
-
- F.update();
-
- // Assign a click event
- if ( current.closeClick || (current.nextClick && F.group.length > 1) ) {
- F.inner.css('cursor', 'pointer').bind('click.fb', function(e) {
- if (!$(e.target).is('a') && !$(e.target).parent().is('a')) {
- e.preventDefault();
-
- F[ current.closeClick ? 'close' : 'next' ]();
- }
- });
- }
-
- // Create a close button
- if (current.closeBtn) {
- $(current.tpl.closeBtn).appendTo(F.skin).bind('click.fb', function(e) {
- e.preventDefault();
-
- F.close();
- });
- }
-
- // Create navigation arrows
- if (current.arrows && F.group.length > 1) {
- if (current.loop || current.index > 0) {
- $(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev);
- }
-
- if (current.loop || current.index < F.group.length - 1) {
- $(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next);
- }
- }
-
- F.trigger('afterShow');
-
- // Stop the slideshow if this is the last item
- if (!current.loop && current.index === current.group.length - 1) {
- F.play( false );
-
- } else if (F.opts.autoPlay && !F.player.isActive) {
- F.opts.autoPlay = false;
-
- F.play();
- }
- },
-
- _afterZoomOut: function ( obj ) {
- obj = obj || F.current;
-
- $('.fancybox-wrap').trigger('onReset').remove();
-
- $.extend(F, {
- group : {},
- opts : {},
- router : false,
- current : null,
- isActive : false,
- isOpened : false,
- isOpen : false,
- isClosing : false,
- wrap : null,
- skin : null,
- outer : null,
- inner : null
- });
-
- F.trigger('afterClose', obj);
- }
- });
-
- /*
- * Default transitions
- */
-
- F.transitions = {
- getOrigPosition: function () {
- var current = F.current,
- element = current.element,
- orig = current.orig,
- pos = {},
- width = 50,
- height = 50,
- hPadding = current.hPadding,
- wPadding = current.wPadding,
- viewport = F.getViewport();
-
- if (!orig && current.isDom && element.is(':visible')) {
- orig = element.find('img:first');
-
- if (!orig.length) {
- orig = element;
- }
- }
-
- if (isQuery(orig)) {
- pos = orig.offset();
-
- if (orig.is('img')) {
- width = orig.outerWidth();
- height = orig.outerHeight();
- }
-
- } else {
- pos.top = viewport.y + (viewport.h - height) * current.topRatio;
- pos.left = viewport.x + (viewport.w - width) * current.leftRatio;
- }
-
- if (F.wrap.css('position') === 'fixed' || current.locked) {
- pos.top -= viewport.y;
- pos.left -= viewport.x;
- }
-
- pos = {
- top : getValue(pos.top - hPadding * current.topRatio),
- left : getValue(pos.left - wPadding * current.leftRatio),
- width : getValue(width + wPadding),
- height : getValue(height + hPadding)
- };
-
- return pos;
- },
-
- step: function (now, fx) {
- var ratio,
- padding,
- value,
- prop = fx.prop,
- current = F.current,
- wrapSpace = current.wrapSpace,
- skinSpace = current.skinSpace;
-
- if (prop === 'width' || prop === 'height') {
- ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start);
-
- if (F.isClosing) {
- ratio = 1 - ratio;
- }
-
- padding = prop === 'width' ? current.wPadding : current.hPadding;
- value = now - padding;
-
- F.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) );
- F.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) );
- }
- },
-
- zoomIn: function () {
- var current = F.current,
- startPos = current.pos,
- effect = current.openEffect,
- elastic = effect === 'elastic',
- endPos = $.extend({opacity : 1}, startPos);
-
- // Remove "position" property that breaks older IE
- delete endPos.position;
-
- if (elastic) {
- startPos = this.getOrigPosition();
-
- if (current.openOpacity) {
- startPos.opacity = 0.1;
- }
-
- } else if (effect === 'fade') {
- startPos.opacity = 0.1;
- }
-
- F.wrap.css(startPos).animate(endPos, {
- duration : effect === 'none' ? 0 : current.openSpeed,
- easing : current.openEasing,
- step : elastic ? this.step : null,
- complete : F._afterZoomIn
- });
- },
-
- zoomOut: function () {
- var current = F.current,
- effect = current.closeEffect,
- elastic = effect === 'elastic',
- endPos = {opacity : 0.1};
-
- if (elastic) {
- endPos = this.getOrigPosition();
-
- if (current.closeOpacity) {
- endPos.opacity = 0.1;
- }
- }
-
- F.wrap.animate(endPos, {
- duration : effect === 'none' ? 0 : current.closeSpeed,
- easing : current.closeEasing,
- step : elastic ? this.step : null,
- complete : F._afterZoomOut
- });
- },
-
- changeIn: function () {
- var current = F.current,
- effect = current.nextEffect,
- startPos = current.pos,
- endPos = { opacity : 1 },
- direction = F.direction,
- distance = 200,
- field;
-
- startPos.opacity = 0.1;
-
- if (effect === 'elastic') {
- field = direction === 'down' || direction === 'up' ? 'top' : 'left';
-
- if (direction === 'down' || direction === 'right') {
- startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance);
- endPos[ field ] = '+=' + distance + 'px';
-
- } else {
- startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance);
- endPos[ field ] = '-=' + distance + 'px';
- }
- }
-
- // Workaround for http://bugs.jquery.com/ticket/12273
- if (effect === 'none') {
- F._afterZoomIn();
-
- } else {
- F.wrap.css(startPos).animate(endPos, {
- duration : current.nextSpeed,
- easing : current.nextEasing,
- complete : F._afterZoomIn
- });
- }
- },
-
- changeOut: function () {
- var previous = F.previous,
- effect = previous.prevEffect,
- endPos = { opacity : 0.1 },
- direction = F.direction,
- distance = 200;
-
- if (effect === 'elastic') {
- endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px';
- }
-
- previous.wrap.animate(endPos, {
- duration : effect === 'none' ? 0 : previous.prevSpeed,
- easing : previous.prevEasing,
- complete : function () {
- $(this).trigger('onReset').remove();
- }
- });
- }
- };
-
- /*
- * Overlay helper
- */
-
- F.helpers.overlay = {
- defaults : {
- closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay
- speedOut : 200, // duration of fadeOut animation
- showEarly : true, // indicates if should be opened immediately or wait until the content is ready
- css : {}, // custom CSS properties
- locked : !isTouch, // if true, the content will be locked into overlay
- fixed : true // if false, the overlay CSS position property will not be set to "fixed"
- },
-
- overlay : null, // current handle
- fixed : false, // indicates if the overlay has position "fixed"
- el : $('html'), // element that contains "the lock"
-
- // Public methods
- create : function(opts) {
- opts = $.extend({}, this.defaults, opts);
-
- if (this.overlay) {
- this.close();
- }
-
- this.overlay = $('<div class="fancybox-overlay"></div>').appendTo( F.coming ? F.coming.parent : opts.parent );
- this.fixed = false;
-
- if (opts.fixed && F.defaults.fixed) {
- this.overlay.addClass('fancybox-overlay-fixed');
-
- this.fixed = true;
- }
- },
-
- open : function(opts) {
- var that = this;
-
- opts = $.extend({}, this.defaults, opts);
-
- if (this.overlay) {
- this.overlay.unbind('.overlay').width('auto').height('auto');
-
- } else {
- this.create(opts);
- }
-
- if (!this.fixed) {
- W.bind('resize.overlay', $.proxy( this.update, this) );
-
- this.update();
- }
-
- if (opts.closeClick) {
- this.overlay.bind('click.overlay', function(e) {
- if ($(e.target).hasClass('fancybox-overlay')) {
- if (F.isActive) {
- F.close();
- } else {
- that.close();
- }
-
- return false;
- }
- });
- }
-
- this.overlay.css( opts.css ).show();
- },
-
- close : function() {
- var scrollV, scrollH;
-
- W.unbind('resize.overlay');
-
- if (this.el.hasClass('fancybox-lock')) {
- $('.fancybox-margin').removeClass('fancybox-margin');
-
- scrollV = W.scrollTop();
- scrollH = W.scrollLeft();
-
- this.el.removeClass('fancybox-lock');
-
- W.scrollTop( scrollV ).scrollLeft( scrollH );
- }
-
- $('.fancybox-overlay').remove().hide();
-
- $.extend(this, {
- overlay : null,
- fixed : false
- });
- },
-
- // Private, callbacks
-
- update : function () {
- var width = '100%', offsetWidth;
-
- // Reset width/height so it will not mess
- this.overlay.width(width).height('100%');
-
- // jQuery does not return reliable result for IE
- if (IE) {
- offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth);
-
- if (D.width() > offsetWidth) {
- width = D.width();
- }
-
- } else if (D.width() > W.width()) {
- width = D.width();
- }
-
- this.overlay.width(width).height(D.height());
- },
-
- // This is where we can manipulate DOM, because later it would cause iframes to reload
- onReady : function (opts, obj) {
- var overlay = this.overlay;
-
- $('.fancybox-overlay').stop(true, true);
-
- if (!overlay) {
- this.create(opts);
- }
-
- if (opts.locked && this.fixed && obj.fixed) {
- if (!overlay) {
- this.margin = D.height() > W.height() ? $('html').css('margin-right').replace("px", "") : false;
- }
-
- obj.locked = this.overlay.append( obj.wrap );
- obj.fixed = false;
- }
-
- if (opts.showEarly === true) {
- this.beforeShow.apply(this, arguments);
- }
- },
-
- beforeShow : function(opts, obj) {
- var scrollV, scrollH;
-
- if (obj.locked) {
- if (this.margin !== false) {
- $('*').filter(function(){
- return ($(this).css('position') === 'fixed' && !$(this).hasClass("fancybox-overlay") && !$(this).hasClass("fancybox-wrap") );
- }).addClass('fancybox-margin');
-
- this.el.addClass('fancybox-margin');
- }
-
- scrollV = W.scrollTop();
- scrollH = W.scrollLeft();
-
- this.el.addClass('fancybox-lock');
-
- W.scrollTop( scrollV ).scrollLeft( scrollH );
- }
-
- this.open(opts);
- },
-
- onUpdate : function() {
- if (!this.fixed) {
- this.update();
- }
- },
-
- afterClose: function (opts) {
- // Remove overlay if exists and fancyBox is not opening
- // (e.g., it is not being open using afterClose callback)
- //if (this.overlay && !F.isActive) {
- if (this.overlay && !F.coming) {
- this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this ));
- }
- }
- };
-
- /*
- * Title helper
- */
-
- F.helpers.title = {
- defaults : {
- type : 'float', // 'float', 'inside', 'outside' or 'over',
- position : 'bottom' // 'top' or 'bottom'
- },
-
- beforeShow: function (opts) {
- var current = F.current,
- text = current.title,
- type = opts.type,
- title,
- target;
-
- if ($.isFunction(text)) {
- text = text.call(current.element, current);
- }
-
- if (!isString(text) || $.trim(text) === '') {
- return;
- }
-
- title = $('<div class="fancybox-title fancybox-title-' + type + '-wrap">' + text + '</div>');
-
- switch (type) {
- case 'inside':
- target = F.skin;
- break;
-
- case 'outside':
- target = F.wrap;
- break;
-
- case 'over':
- target = F.inner;
- break;
-
- default: // 'float'
- target = F.skin;
-
- title.appendTo('body');
-
- if (IE) {
- title.width( title.width() );
- }
-
- title.wrapInner('<span class="child"></span>');
-
- //Increase bottom margin so this title will also fit into viewport
- F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) );
- break;
- }
-
- title[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target);
- }
- };
-
- // jQuery plugin initialization
- $.fn.fancybox = function (options) {
- var index,
- that = $(this),
- selector = this.selector || '',
- run = function(e) {
- var what = $(this).blur(), idx = index, relType, relVal;
-
- if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) {
- relType = options.groupAttr || 'data-fancybox-group';
- relVal = what.attr(relType);
-
- if (!relVal) {
- relType = 'rel';
- relVal = what.get(0)[ relType ];
- }
-
- if (relVal && relVal !== '' && relVal !== 'nofollow') {
- what = selector.length ? $(selector) : that;
- what = what.filter('[' + relType + '="' + relVal + '"]');
- idx = what.index(this);
- }
-
- options.index = idx;
-
- // Stop an event from bubbling if everything is fine
- if (F.open(what, options) !== false) {
- e.preventDefault();
- }
- }
- };
-
- options = options || {};
- index = options.index || 0;
-
- if (!selector || options.live === false) {
- that.unbind('click.fb-start').bind('click.fb-start', run);
-
- } else {
- D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run);
- }
-
- this.filter('[data-fancybox-start=1]').trigger('click');
-
- return this;
- };
-
- // Tests that need a body at doc ready
- D.ready(function() {
- var w1, w2;
-
- if ( $.scrollbarWidth === undefined ) {
- // http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth
- $.scrollbarWidth = function() {
- var parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body'),
- child = parent.children(),
- width = child.innerWidth() - child.height( 99 ).innerWidth();
-
- parent.remove();
-
- return width;
- };
- }
-
- if ( $.support.fixedPosition === undefined ) {
- $.support.fixedPosition = (function() {
- var elem = $('<div style="position:fixed;top:20px;"></div>').appendTo('body'),
- fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 );
-
- elem.remove();
-
- return fixed;
- }());
- }
-
- $.extend(F.defaults, {
- scrollbarWidth : $.scrollbarWidth(),
- fixed : $.support.fixedPosition,
- parent : $('body')
- });
-
- //Get real width of page scroll-bar
- w1 = $(window).width();
-
- H.addClass('fancybox-lock-test');
-
- w2 = $(window).width();
-
- H.removeClass('fancybox-lock-test');
-
- $("<style type='text/css'>.fancybox-margin{margin-right:" + (w2 - w1) + "px;}</style>").appendTo("head");
- });
-
-}(window, document, jQuery));
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.pack.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.pack.js
deleted file mode 100755
index 73f7578..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/fancybox/jquery.fancybox.pack.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*! fancyBox v2.1.5 fancyapps.com | fancyapps.com/fancybox/#license */
-(function(r,G,f,v){var J=f("html"),n=f(r),p=f(G),b=f.fancybox=function(){b.open.apply(this,arguments)},I=navigator.userAgent.match(/msie/i),B=null,s=G.createTouch!==v,t=function(a){return a&&a.hasOwnProperty&&a instanceof f},q=function(a){return a&&"string"===f.type(a)},E=function(a){return q(a)&&0<a.indexOf("%")},l=function(a,d){var e=parseInt(a,10)||0;d&&E(a)&&(e*=b.getViewport()[d]/100);return Math.ceil(e)},w=function(a,b){return l(a,b)+"px"};f.extend(b,{version:"2.1.5",defaults:{padding:15,margin:20,
-width:800,height:600,minWidth:100,minHeight:100,maxWidth:9999,maxHeight:9999,pixelRatio:1,autoSize:!0,autoHeight:!1,autoWidth:!1,autoResize:!0,autoCenter:!s,fitToView:!0,aspectRatio:!1,topRatio:0.5,leftRatio:0.5,scrolling:"auto",wrapCSS:"",arrows:!0,closeBtn:!0,closeClick:!1,nextClick:!1,mouseWheel:!0,autoPlay:!1,playSpeed:3E3,preload:3,modal:!1,loop:!0,ajax:{dataType:"html",headers:{"X-fancyBox":!0}},iframe:{scrolling:"auto",preload:!0},swf:{wmode:"transparent",allowfullscreen:"true",allowscriptaccess:"always"},
-keys:{next:{13:"left",34:"up",39:"left",40:"up"},prev:{8:"right",33:"down",37:"right",38:"down"},close:[27],play:[32],toggle:[70]},direction:{next:"left",prev:"right"},scrollOutside:!0,index:0,type:null,href:null,content:null,title:null,tpl:{wrap:'<div class="fancybox-wrap" tabIndex="-1"><div class="fancybox-skin"><div class="fancybox-outer"><div class="fancybox-inner"></div></div></div></div>',image:'<img class="fancybox-image" src="{href}" alt="" />',iframe:'<iframe id="fancybox-frame{rnd}" name="fancybox-frame{rnd}" class="fancybox-iframe" frameborder="0" vspace="0" hspace="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen'+
-(I?' allowtransparency="true"':"")+"></iframe>",error:'<p class="fancybox-error">The requested content cannot be loaded.<br/>Please try again later.</p>',closeBtn:'<a title="Close" class="fancybox-item fancybox-close" href="javascript:;"></a>',next:'<a title="Next" class="fancybox-nav fancybox-next" href="javascript:;"><span></span></a>',prev:'<a title="Previous" class="fancybox-nav fancybox-prev" href="javascript:;"><span></span></a>'},openEffect:"fade",openSpeed:250,openEasing:"swing",openOpacity:!0,
-openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null,isActive:!1,
-isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=t(a)?f(a).get():[a]),f.each(a,function(e,c){var k={},g,h,j,m,l;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),t(c)?(k={href:c.data("fancybox-href")||c.attr("href"),title:c.data("fancybox-title")||c.attr("title"),isDom:!0,element:c},f.metadata&&f.extend(!0,k,
-c.metadata())):k=c);g=d.href||k.href||(q(c)?c:null);h=d.title!==v?d.title:k.title||"";m=(j=d.content||k.content)?"html":d.type||k.type;!m&&k.isDom&&(m=c.data("fancybox-type"),m||(m=(m=c.prop("class").match(/fancybox\.(\w+)/))?m[1]:null));q(g)&&(m||(b.isImage(g)?m="image":b.isSWF(g)?m="swf":"#"===g.charAt(0)?m="inline":q(c)&&(m="html",j=c)),"ajax"===m&&(l=g.split(/\s+/,2),g=l.shift(),l=l.shift()));j||("inline"===m?g?j=f(q(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):k.isDom&&(j=c):"html"===m?j=g:!m&&(!g&&
-k.isDom)&&(m="inline",j=c));f.extend(k,{href:g,type:m,content:j,title:h,selector:l});a[e]=k}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==v&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1!==b.trigger("onCancel")&&(b.hideLoading(),b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),b.coming=null,b.current||
-b._afterZoomOut(a))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(!b.isOpen||!0===a?(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut()):(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&(b.player.timer=
-setTimeout(b.next,b.current.playSpeed))},c=function(){d();p.unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};if(!0===a||!b.player.isActive&&!1!==a){if(b.current&&(b.current.loop||b.current.index<b.group.length-1))b.player.isActive=!0,p.bind({"onCancel.player beforeClose.player":c,"onUpdate.player":e,"beforeLoad.player":d}),e(),b.trigger("onPlayStart")}else c()},next:function(a){var d=b.current;d&&(q(a)||(a=d.direction.next),b.jumpto(d.index+1,a,"next"))},prev:function(a){var d=b.current;
-d&&(q(a)||(a=d.direction.prev),b.jumpto(d.index-1,a,"prev"))},jumpto:function(a,d,e){var c=b.current;c&&(a=l(a),b.direction=d||c.direction[a>=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==v&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,k;c&&(k=b._getPosition(d),a&&"scroll"===a.type?(delete k.position,c.stop(!0,!0).animate(k,200)):(c.css(k),e.pos=f.extend({},e.dim,k)))},update:function(a){var d=
-a&&a.type,e=!d||"orientationchange"===d;e&&(clearTimeout(B),B=null);b.isOpen&&!B&&(B=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),B=null)},e&&!s?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,s&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"),b.trigger("onUpdate")),
-b.update())},hideLoading:function(){p.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('<div id="fancybox-loading"><div></div></div>').click(b.cancel).appendTo("body");p.bind("keydown.loading",function(a){if(27===(a.which||a.keyCode))a.preventDefault(),b.cancel()});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}))},getViewport:function(){var a=b.current&&b.current.locked||!1,d={x:n.scrollLeft(),
-y:n.scrollTop()};a?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=s&&r.innerWidth?r.innerWidth:n.width(),d.h=s&&r.innerHeight?r.innerHeight:n.height());return d},unbindEvents:function(){b.wrap&&t(b.wrap)&&b.wrap.unbind(".fb");p.unbind(".fb");n.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(n.bind("orientationchange.fb"+(s?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&p.bind("keydown.fb",function(e){var c=e.which||e.keyCode,k=e.target||e.srcElement;
-if(27===c&&b.coming)return!1;!e.ctrlKey&&(!e.altKey&&!e.shiftKey&&!e.metaKey&&(!k||!k.type&&!f(k).is("[contenteditable]")))&&f.each(d,function(d,k){if(1<a.group.length&&k[c]!==v)return b[d](k[c]),e.preventDefault(),!1;if(-1<f.inArray(c,k))return b[d](),e.preventDefault(),!1})}),f.fn.mousewheel&&a.mouseWheel&&b.wrap.bind("mousewheel.fb",function(d,c,k,g){for(var h=f(d.target||null),j=!1;h.length&&!j&&!h.is(".fancybox-skin")&&!h.is(".fancybox-wrap");)j=h[0]&&!(h[0].style.overflow&&"hidden"===h[0].style.overflow)&&
-(h[0].clientWidth&&h[0].scrollWidth>h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();if(0!==c&&!j&&1<b.group.length&&!a.canShrink){if(0<g||0<k)b.prev(0<g?"down":"left");else if(0>g||0>k)b.next(0>g?"up":"right");d.preventDefault()}}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d,e){if(e&&b.helpers[d]&&f.isFunction(b.helpers[d][a]))b.helpers[d][a](f.extend(!0,
-{},b.helpers[d].defaults,e),c)});p.trigger(a)}},isImage:function(a){return q(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)},isSWF:function(a){return q(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c;a=l(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&&(d.padding=[c,c,c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,
-mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive=!0;if("image"===c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=
-!0);"iframe"===c&&s&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(s?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,w(d.padding[a]))});b.trigger("onReady");if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");
-"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width=this.width/b.opts.pixelRatio;b.coming.height=this.height/b.opts.pixelRatio;b._afterLoad()};a.onerror=function(){this.onload=
-this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,d=f(a.tpl.iframe.replace(/\{rnd\}/g,(new Date).getTime())).attr("scrolling",s?"auto":a.iframe.scrolling).attr("src",a.href);
-f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);s||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||b._afterLoad()},_preloadImages:function(){var a=b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,
-e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,k,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());b.unbindEvents();e=a.content;c=a.type;k=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,
-outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("<div>").html(e).find(a.selector):t(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('<div class="fancybox-placeholder"></div>').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder",!1)}));break;case "image":e=a.tpl.image.replace("{href}",
-g);break;case "swf":e='<object id="fancybox-swf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%"><param name="movie" value="'+g+'"></param>',h="",f.each(a.swf,function(a,b){e+='<param name="'+a+'" value="'+b+'"></param>';h+=" "+a+'="'+b+'"'}),e+='<embed src="'+g+'" type="application/x-shockwave-flash" width="100%" height="100%"'+h+"></embed></object>"}(!t(e)||!e.parent().is(a.inner))&&a.inner.append(e);b.trigger("beforeShow");a.inner.css("overflow","yes"===k?"scroll":
-"no"===k?"hidden":k);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(b.isOpened){if(d.prevMethod)b.transitions[d.prevMethod]()}else f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,k=b.skin,g=b.inner,h=b.current,c=h.width,j=h.height,m=h.minWidth,u=h.minHeight,n=h.maxWidth,p=h.maxHeight,s=h.scrolling,q=h.scrollOutside?
-h.scrollbarWidth:0,x=h.margin,y=l(x[1]+x[3]),r=l(x[0]+x[2]),v,z,t,C,A,F,B,D,H;e.add(k).add(g).width("auto").height("auto").removeClass("fancybox-tmp");x=l(k.outerWidth(!0)-k.width());v=l(k.outerHeight(!0)-k.height());z=y+x;t=r+v;C=E(c)?(a.w-z)*l(c)/100:c;A=E(j)?(a.h-t)*l(j)/100:j;if("iframe"===h.type){if(H=h.content,h.autoHeight&&1===H.data("ready"))try{H[0].contentWindow.document.location&&(g.width(C).height(9999),F=H.contents().find("body"),q&&F.css("overflow-x","hidden"),A=F.outerHeight(!0))}catch(G){}}else if(h.autoWidth||
-h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(C),h.autoHeight||g.height(A),h.autoWidth&&(C=g.width()),h.autoHeight&&(A=g.height()),g.removeClass("fancybox-tmp");c=l(C);j=l(A);D=C/A;m=l(E(m)?l(m,"w")-z:m);n=l(E(n)?l(n,"w")-z:n);u=l(E(u)?l(u,"h")-t:u);p=l(E(p)?l(p,"h")-t:p);F=n;B=p;h.fitToView&&(n=Math.min(a.w-z,n),p=Math.min(a.h-t,p));z=a.w-y;r=a.h-r;h.aspectRatio?(c>n&&(c=n,j=l(c/D)),j>p&&(j=p,c=l(j*D)),c<m&&(c=m,j=l(c/D)),j<u&&(j=u,c=l(j*D))):(c=Math.max(m,Math.min(c,n)),h.autoHeight&&
-"iframe"!==h.type&&(g.width(c),j=g.height()),j=Math.max(u,Math.min(j,p)));if(h.fitToView)if(g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height(),h.aspectRatio)for(;(a>z||y>r)&&(c>m&&j>u)&&!(19<d++);)j=Math.max(u,Math.min(p,j-10)),c=l(j*D),c<m&&(c=m,j=l(c/D)),c>n&&(c=n,j=l(c/D)),g.width(c).height(j),e.width(c+x),a=e.width(),y=e.height();else c=Math.max(m,Math.min(c,c-(a-z))),j=Math.max(u,Math.min(j,j-(y-r)));q&&("auto"===s&&j<A&&c+x+q<z)&&(c+=q);g.width(c).height(j);e.width(c+x);a=e.width();
-y=e.height();e=(a>z||y>r)&&c>m&&j>u;c=h.aspectRatio?c<F&&j<B&&c<C&&j<A:(c<F||j<B)&&(c<C||j<A);f.extend(h,{dim:{width:w(a),height:w(y)},origWidth:C,origHeight:A,canShrink:e,canExpand:c,wPadding:x,hPadding:v,wrapSpace:y-k.outerHeight(!0),skinSpace:k.height()-j});!H&&(h.autoHeight&&j>u&&j<p&&!c)&&g.height("auto")},_getPosition:function(a){var d=b.current,e=b.getViewport(),c=d.margin,f=b.wrap.width()+c[1]+c[3],g=b.wrap.height()+c[0]+c[2],c={position:"absolute",top:c[0],left:c[3]};d.autoCenter&&d.fixed&&
-!a&&g<=e.h&&f<=e.w?c.position="fixed":d.locked||(c.top+=e.y,c.left+=e.x);c.top=w(Math.max(c.top,c.top+(e.h-g)*d.topRatio));c.left=w(Math.max(c.left,c.left+(e.w-f)*d.leftRatio));return c},_afterZoomIn:function(){var a=b.current;a&&(b.isOpen=b.isOpened=!0,b.wrap.css("overflow","visible").addClass("fancybox-opened"),b.update(),(a.closeClick||a.nextClick&&1<b.group.length)&&b.inner.css("cursor","pointer").bind("click.fb",function(d){!f(d.target).is("a")&&!f(d.target).parent().is("a")&&(d.preventDefault(),
-b[a.closeClick?"close":"next"]())}),a.closeBtn&&f(a.tpl.closeBtn).appendTo(b.skin).bind("click.fb",function(a){a.preventDefault();b.close()}),a.arrows&&1<b.group.length&&((a.loop||0<a.index)&&f(a.tpl.prev).appendTo(b.outer).bind("click.fb",b.prev),(a.loop||a.index<b.group.length-1)&&f(a.tpl.next).appendTo(b.outer).bind("click.fb",b.next)),b.trigger("afterShow"),!a.loop&&a.index===a.group.length-1?b.play(!1):b.opts.autoPlay&&!b.player.isActive&&(b.opts.autoPlay=!1,b.play()))},_afterZoomOut:function(a){a=
-a||b.current;f(".fancybox-wrap").trigger("onReset").remove();f.extend(b,{group:{},opts:{},router:!1,current:null,isActive:!1,isOpened:!1,isOpen:!1,isClosing:!1,wrap:null,skin:null,outer:null,inner:null});b.trigger("afterClose",a)}});b.transitions={getOrigPosition:function(){var a=b.current,d=a.element,e=a.orig,c={},f=50,g=50,h=a.hPadding,j=a.wPadding,m=b.getViewport();!e&&(a.isDom&&d.is(":visible"))&&(e=d.find("img:first"),e.length||(e=d));t(e)?(c=e.offset(),e.is("img")&&(f=e.outerWidth(),g=e.outerHeight())):
-(c.top=m.y+(m.h-g)*a.topRatio,c.left=m.x+(m.w-f)*a.leftRatio);if("fixed"===b.wrap.css("position")||a.locked)c.top-=m.y,c.left-=m.x;return c={top:w(c.top-h*a.topRatio),left:w(c.left-j*a.leftRatio),width:w(f+j),height:w(g+h)}},step:function(a,d){var e,c,f=d.prop;c=b.current;var g=c.wrapSpace,h=c.skinSpace;if("width"===f||"height"===f)e=d.end===d.start?1:(a-d.start)/(d.end-d.start),b.isClosing&&(e=1-e),c="width"===f?c.wPadding:c.hPadding,c=a-c,b.skin[f](l("width"===f?c:c-g*e)),b.inner[f](l("width"===
-f?c:c-g*e-h*e))},zoomIn:function(){var a=b.current,d=a.pos,e=a.openEffect,c="elastic"===e,k=f.extend({opacity:1},d);delete k.position;c?(d=this.getOrigPosition(),a.openOpacity&&(d.opacity=0.1)):"fade"===e&&(d.opacity=0.1);b.wrap.css(d).animate(k,{duration:"none"===e?0:a.openSpeed,easing:a.openEasing,step:c?this.step:null,complete:b._afterZoomIn})},zoomOut:function(){var a=b.current,d=a.closeEffect,e="elastic"===d,c={opacity:0.1};e&&(c=this.getOrigPosition(),a.closeOpacity&&(c.opacity=0.1));b.wrap.animate(c,
-{duration:"none"===d?0:a.closeSpeed,easing:a.closeEasing,step:e?this.step:null,complete:b._afterZoomOut})},changeIn:function(){var a=b.current,d=a.nextEffect,e=a.pos,c={opacity:1},f=b.direction,g;e.opacity=0.1;"elastic"===d&&(g="down"===f||"up"===f?"top":"left","down"===f||"right"===f?(e[g]=w(l(e[g])-200),c[g]="+=200px"):(e[g]=w(l(e[g])+200),c[g]="-=200px"));"none"===d?b._afterZoomIn():b.wrap.css(e).animate(c,{duration:a.nextSpeed,easing:a.nextEasing,complete:b._afterZoomIn})},changeOut:function(){var a=
-b.previous,d=a.prevEffect,e={opacity:0.1},c=b.direction;"elastic"===d&&(e["down"===c||"up"===c?"top":"left"]=("up"===c||"left"===c?"-":"+")+"=200px");a.wrap.animate(e,{duration:"none"===d?0:a.prevSpeed,easing:a.prevEasing,complete:function(){f(this).trigger("onReset").remove()}})}};b.helpers.overlay={defaults:{closeClick:!0,speedOut:200,showEarly:!0,css:{},locked:!s,fixed:!0},overlay:null,fixed:!1,el:f("html"),create:function(a){a=f.extend({},this.defaults,a);this.overlay&&this.close();this.overlay=
-f('<div class="fancybox-overlay"></div>').appendTo(b.coming?b.coming.parent:a.parent);this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this;a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(n.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",function(a){if(f(a.target).hasClass("fancybox-overlay"))return b.isActive?
-b.close():d.close(),!1});this.overlay.css(a.css).show()},close:function(){var a,b;n.unbind("resize.overlay");this.el.hasClass("fancybox-lock")&&(f(".fancybox-margin").removeClass("fancybox-margin"),a=n.scrollTop(),b=n.scrollLeft(),this.el.removeClass("fancybox-lock"),n.scrollTop(a).scrollLeft(b));f(".fancybox-overlay").remove().hide();f.extend(this,{overlay:null,fixed:!1})},update:function(){var a="100%",b;this.overlay.width(a).height("100%");I?(b=Math.max(G.documentElement.offsetWidth,G.body.offsetWidth),
-p.width()>b&&(a=p.width())):p.width()>n.width()&&(a=p.width());this.overlay.width(a).height(p.height())},onReady:function(a,b){var e=this.overlay;f(".fancybox-overlay").stop(!0,!0);e||this.create(a);a.locked&&(this.fixed&&b.fixed)&&(e||(this.margin=p.height()>n.height()?f("html").css("margin-right").replace("px",""):!1),b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){var e,c;b.locked&&(!1!==this.margin&&(f("*").filter(function(){return"fixed"===
-f(this).css("position")&&!f(this).hasClass("fancybox-overlay")&&!f(this).hasClass("fancybox-wrap")}).addClass("fancybox-margin"),this.el.addClass("fancybox-margin")),e=n.scrollTop(),c=n.scrollLeft(),this.el.addClass("fancybox-lock"),n.scrollTop(e).scrollLeft(c));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.coming&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",position:"bottom"},beforeShow:function(a){var d=
-b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(q(e)&&""!==f.trim(e)){d=f('<div class="fancybox-title fancybox-title-'+c+'-wrap">'+e+"</div>");switch(c){case "inside":c=b.skin;break;case "outside":c=b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),I&&d.width(d.width()),d.wrapInner('<span class="child"></span>'),b.current.margin[2]+=Math.abs(l(d.css("margin-bottom")))}d["top"===a.position?"prependTo":"appendTo"](c)}}};f.fn.fancybox=function(a){var d,
-e=f(this),c=this.selector||"",k=function(g){var h=f(this).blur(),j=d,k,l;!g.ctrlKey&&(!g.altKey&&!g.shiftKey&&!g.metaKey)&&!h.is(".fancybox-wrap")&&(k=a.groupAttr||"data-fancybox-group",l=h.attr(k),l||(k="rel",l=h.get(0)[k]),l&&(""!==l&&"nofollow"!==l)&&(h=c.length?f(c):e,h=h.filter("["+k+'="'+l+'"]'),j=h.index(this)),a.index=j,!1!==b.open(h,a)&&g.preventDefault())};a=a||{};d=a.index||0;!c||!1===a.live?e.unbind("click.fb-start").bind("click.fb-start",k):p.undelegate(c,"click.fb-start").delegate(c+
-":not('.fancybox-item, .fancybox-nav')","click.fb-start",k);this.filter("[data-fancybox-start=1]").trigger("click");return this};p.ready(function(){var a,d;f.scrollbarWidth===v&&(f.scrollbarWidth=function(){var a=f('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo("body"),b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});if(f.support.fixedPosition===v){a=f.support;d=f('<div style="position:fixed;top:20px;"></div>').appendTo("body");var e=20===
-d[0].offsetTop||15===d[0].offsetTop;d.remove();a.fixedPosition=e}f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")});a=f(r).width();J.addClass("fancybox-lock-test");d=f(r).width();J.removeClass("fancybox-lock-test");f("<style type='text/css'>.fancybox-margin{margin-right:"+(d-a)+"px;}</style>").appendTo("head")})})(window,document,jQuery);
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/getImageData.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/getImageData.js
deleted file mode 100755
index 62f79a1..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/getImageData.js
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *
- * jQuery $.getImageData Plugin 0.3
- * http://www.maxnov.com/getimagedata
- *
- * Written by Max Novakovic (http://www.maxnov.com/)
- * Date: Thu Jan 13 2011
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * Includes jQuery JSONP Core Plugin 2.4.0 (2012-08-21)
- * https://github.com/jaubourg/jquery-jsonp
- * Copyright 2012, Julian Aubourg
- * Released under the MIT License.
- *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- * Copyright 2011, Max Novakovic
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://www.maxnov.com/getimagedata/#license
- *
- */
-(function (d) {
- function U() {
- }
-
- function V(a) {
- r = [a]
- }
-
- function e(a, d, e) {
- return a && a.apply(d.context || d, e)
- }
-
- function g(a) {
- function g(b) {
- l++ || (m(), n && (t[c] = {s: [b]}), A && (b = A.apply(a, [b])), e(u, a, [b, B, a]), e(C, a, [a, B]))
- }
-
- function s(b) {
- l++ || (m(), n && b != D && (t[c] = b), e(v, a, [a, b]), e(C, a, [a, b]))
- }
-
- a = d.extend({}, E, a);
- var u = a.success, v = a.error, C = a.complete, A = a.dataFilter, p = a.callbackParameter, F = a.callback,
- W = a.cache, n = a.pageCache, G = a.charset, c = a.url, f = a.data, H = a.timeout, q, l = 0, m = U, b, h, w;
- I && I(function (a) {
- a.done(u).fail(v);
- u = a.resolve;
- v = a.reject
- }).promise(a);
- a.abort = function () {
- !l++ && m()
- };
- if (!1 === e(a.beforeSend, a, [a]) || l) return a;
- c = c || x;
- f = f ? "string" == typeof f ? f : d.param(f, a.traditional) : x;
- c += f ? (/\?/.test(c) ? "&" : "?") + f : x;
- p && (c += (/\?/.test(c) ? "&" : "?") + encodeURIComponent(p) + "=?");
- W || n || (c += (/\?/.test(c) ? "&" : "?") + "_" + (new Date).getTime() + "=");
- c = c.replace(/=\?(&|$)/, "=" + F + "$1");
- n && (q = t[c]) ? q.s ? g(q.s[0]) : s(q) : (J[F] = V, b = d(K)[0], b.id = L + X++, G && (b[Y] = G), M && 11.6 > M.version() ? (h = d(K)[0]).text = "document.getElementById('" + b.id + "')." + y + "()" : b[N] = N, Z && (b.htmlFor = b.id, b.event = z), b[O] = b[y] = b[P] = function (a) {
- if (!b[Q] || !/i/.test(b[Q])) {
- try {
- b[z] && b[z]()
- } catch (c) {
- }
- a = r;
- r = 0;
- a ? g(a[0]) : s(R)
- }
- }, b.src = c, m = function (a) {
- w && clearTimeout(w);
- b[P] = b[O] = b[y] = null;
- k[S](b);
- h && k[S](h)
- }, k[T](b, p = k.firstChild), h && k[T](h, p), w = 0 < H && setTimeout(function () {
- s(D)
- }, H));
- return a
- }
-
- var N = "async", Y = "charset", x = "", R = "error", T = "insertBefore", L = "_jqjsp", z = "onclick", y = "on" + R,
- O = "onload", P = "onreadystatechange", Q = "readyState", S = "removeChild", K = "<script>", B = "success",
- D = "timeout", J = window, I = d.Deferred, k = d("head")[0] || document.documentElement, t = {}, X = 0, r,
- E = {callback: L, url: location.href}, M = J.opera,
- Z = !!d("<div>").html("<!--[if IE]><i><![endif]-->").find("i").length;
- g.setup = function (a) {
- d.extend(E, a)
- };
- d.jsonp = g
-})(jQuery);
-(function ($) {
- $.getImageData = function (args) {
- var regex_url_test = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
- if (args.url) {
- var is_secure = location.protocol === "https:";
- var server_url = "";
- if (args.server && regex_url_test.test(args.server) && !(is_secure && args.server.indexOf("http:") == 0)) {
- server_url = args.server
- } else server_url = "//img-to-json.appspot.com/";
- server_url += "?callback=?";
- $.jsonp({
- url: server_url,
- data: {url: escape(args.url)},
- dataType: "jsonp",
- timeout: args.timeout || 1e4,
- success: function (data, status) {
- var return_image = new Image;
- $(return_image).load(function () {
- this.width = data.width;
- this.height = data.height;
- if (typeof args.success == typeof Function) {
- args.success(this)
- }
- }).attr("src", data.data)
- },
- error: function (xhr, text_status) {
- if (typeof args.error == typeof Function) {
- args.error(xhr, text_status)
- }
- }
- })
- } else {
- if (typeof args.error == typeof Function) {
- args.error(null, "no_url")
- }
- }
- }
-})(jQuery);
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/imagesloaded.pkgd.min.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/imagesloaded.pkgd.min.js
deleted file mode 100755
index 321a9f8..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/imagesloaded.pkgd.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * imagesLoaded PACKAGED v3.1.4
- * JavaScript is all like "You images are done yet or what?"
- * MIT License
- */
-
-(function(){function e(){}function t(e,t){for(var n=e.length;n--;)if(e[n].listener===t)return n;return-1}function n(e){return function(){return this[e].apply(this,arguments)}}var i=e.prototype,r=this,o=r.EventEmitter;i.getListeners=function(e){var t,n,i=this._getEvents();if("object"==typeof e){t={};for(n in i)i.hasOwnProperty(n)&&e.test(n)&&(t[n]=i[n])}else t=i[e]||(i[e]=[]);return t},i.flattenListeners=function(e){var t,n=[];for(t=0;e.length>t;t+=1)n.push(e[t].listener);return n},i.getListenersAsObject=function(e){var t,n=this.getListeners(e);return n instanceof Array&&(t={},t[e]=n),t||n},i.addListener=function(e,n){var i,r=this.getListenersAsObject(e),o="object"==typeof n;for(i in r)r.hasOwnProperty(i)&&-1===t(r[i],n)&&r[i].push(o?n:{listener:n,once:!1});return this},i.on=n("addListener"),i.addOnceListener=function(e,t){return this.addListener(e,{listener:t,once:!0})},i.once=n("addOnceListener"),i.defineEvent=function(e){return this.getListeners(e),this},i.defineEvents=function(e){for(var t=0;e.length>t;t+=1)this.defineEvent(e[t]);return this},i.removeListener=function(e,n){var i,r,o=this.getListenersAsObject(e);for(r in o)o.hasOwnProperty(r)&&(i=t(o[r],n),-1!==i&&o[r].splice(i,1));return this},i.off=n("removeListener"),i.addListeners=function(e,t){return this.manipulateListeners(!1,e,t)},i.removeListeners=function(e,t){return this.manipulateListeners(!0,e,t)},i.manipulateListeners=function(e,t,n){var i,r,o=e?this.removeListener:this.addListener,s=e?this.removeListeners:this.addListeners;if("object"!=typeof t||t instanceof RegExp)for(i=n.length;i--;)o.call(this,t,n[i]);else for(i in t)t.hasOwnProperty(i)&&(r=t[i])&&("function"==typeof r?o.call(this,i,r):s.call(this,i,r));return this},i.removeEvent=function(e){var t,n=typeof e,i=this._getEvents();if("string"===n)delete i[e];else if("object"===n)for(t in i)i.hasOwnProperty(t)&&e.test(t)&&delete i[t];else delete this._events;return this},i.removeAllListeners=n("removeEvent"),i.emitEvent=function(e,t){var n,i,r,o,s=this.getListenersAsObject(e);for(r in s)if(s.hasOwnProperty(r))for(i=s[r].length;i--;)n=s[r][i],n.once===!0&&this.removeListener(e,n.listener),o=n.listener.apply(this,t||[]),o===this._getOnceReturnValue()&&this.removeListener(e,n.listener);return this},i.trigger=n("emitEvent"),i.emit=function(e){var t=Array.prototype.slice.call(arguments,1);return this.emitEvent(e,t)},i.setOnceReturnValue=function(e){return this._onceReturnValue=e,this},i._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},i._getEvents=function(){return this._events||(this._events={})},e.noConflict=function(){return r.EventEmitter=o,e},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return e}):"object"==typeof module&&module.exports?module.exports=e:this.EventEmitter=e}).call(this),function(e){function t(t){var n=e.event;return n.target=n.target||n.srcElement||t,n}var n=document.documentElement,i=function(){};n.addEventListener?i=function(e,t,n){e.addEventListener(t,n,!1)}:n.attachEvent&&(i=function(e,n,i){e[n+i]=i.handleEvent?function(){var n=t(e);i.handleEvent.call(i,n)}:function(){var n=t(e);i.call(e,n)},e.attachEvent("on"+n,e[n+i])});var r=function(){};n.removeEventListener?r=function(e,t,n){e.removeEventListener(t,n,!1)}:n.detachEvent&&(r=function(e,t,n){e.detachEvent("on"+t,e[t+n]);try{delete e[t+n]}catch(i){e[t+n]=void 0}});var o={bind:i,unbind:r};"function"==typeof define&&define.amd?define("eventie/eventie",o):e.eventie=o}(this),function(e,t){"function"==typeof define&&define.amd?define(["eventEmitter/EventEmitter","eventie/eventie"],function(n,i){return t(e,n,i)}):"object"==typeof exports?module.exports=t(e,require("eventEmitter"),require("eventie")):e.imagesLoaded=t(e,e.EventEmitter,e.eventie)}(this,function(e,t,n){function i(e,t){for(var n in t)e[n]=t[n];return e}function r(e){return"[object Array]"===d.call(e)}function o(e){var t=[];if(r(e))t=e;else if("number"==typeof e.length)for(var n=0,i=e.length;i>n;n++)t.push(e[n]);else t.push(e);return t}function s(e,t,n){if(!(this instanceof s))return new s(e,t);"string"==typeof e&&(e=document.querySelectorAll(e)),this.elements=o(e),this.options=i({},this.options),"function"==typeof t?n=t:i(this.options,t),n&&this.on("always",n),this.getImages(),a&&(this.jqDeferred=new a.Deferred);var r=this;setTimeout(function(){r.check()})}function c(e){this.img=e}function f(e){this.src=e,v[e]=this}var a=e.jQuery,u=e.console,h=u!==void 0,d=Object.prototype.toString;s.prototype=new t,s.prototype.options={},s.prototype.getImages=function(){this.images=[];for(var e=0,t=this.elements.length;t>e;e++){var n=this.elements[e];"IMG"===n.nodeName&&this.addImage(n);for(var i=n.querySelectorAll("img"),r=0,o=i.length;o>r;r++){var s=i[r];this.addImage(s)}}},s.prototype.addImage=function(e){var t=new c(e);this.images.push(t)},s.prototype.check=function(){function e(e,r){return t.options.debug&&h&&u.log("confirm",e,r),t.progress(e),n++,n===i&&t.complete(),!0}var t=this,n=0,i=this.images.length;if(this.hasAnyBroken=!1,!i)return this.complete(),void 0;for(var r=0;i>r;r++){var o=this.images[r];o.on("confirm",e),o.check()}},s.prototype.progress=function(e){this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded;var t=this;setTimeout(function(){t.emit("progress",t,e),t.jqDeferred&&t.jqDeferred.notify&&t.jqDeferred.notify(t,e)})},s.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";this.isComplete=!0;var t=this;setTimeout(function(){if(t.emit(e,t),t.emit("always",t),t.jqDeferred){var n=t.hasAnyBroken?"reject":"resolve";t.jqDeferred[n](t)}})},a&&(a.fn.imagesLoaded=function(e,t){var n=new s(this,e,t);return n.jqDeferred.promise(a(this))}),c.prototype=new t,c.prototype.check=function(){var e=v[this.img.src]||new f(this.img.src);if(e.isConfirmed)return this.confirm(e.isLoaded,"cached was confirmed"),void 0;if(this.img.complete&&void 0!==this.img.naturalWidth)return this.confirm(0!==this.img.naturalWidth,"naturalWidth"),void 0;var t=this;e.on("confirm",function(e,n){return t.confirm(e.isLoaded,n),!0}),e.check()},c.prototype.confirm=function(e,t){this.isLoaded=e,this.emit("confirm",this,t)};var v={};return f.prototype=new t,f.prototype.check=function(){if(!this.isChecked){var e=new Image;n.bind(e,"load",this),n.bind(e,"error",this),e.src=this.src,this.isChecked=!0}},f.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},f.prototype.onload=function(e){this.confirm(!0,"onload"),this.unbindProxyEvents(e)},f.prototype.onerror=function(e){this.confirm(!1,"onerror"),this.unbindProxyEvents(e)},f.prototype.confirm=function(e,t){this.isConfirmed=!0,this.isLoaded=e,this.emit("confirm",this,t)},f.prototype.unbindProxyEvents=function(e){n.unbind(e.target,"load",this),n.unbind(e.target,"error",this)},s});
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-1.10.2.min.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-1.10.2.min.js
deleted file mode 100755
index da41706..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-1.10.2.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery-1.10.2.min.map
-*/
-(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
-}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
-u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jQueryRotateCompressed.2.2.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jQueryRotateCompressed.2.2.js
deleted file mode 100755
index 9784404..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jQueryRotateCompressed.2.2.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// VERSION: 2.2 LAST UPDATE: 13.03.2012
-/*
- * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
- *
- * Made by Wilq32, wilq32@gmail.com, Wroclaw, Poland, 01.2009
- * Website: http://code.google.com/p/jqueryrotate/
- */
-(function(j){for(var d,k=document.getElementsByTagName("head")[0].style,h=["transformProperty","WebkitTransform","OTransform","msTransform","MozTransform"],g=0;g<h.length;g++)void 0!==k[h[g]]&&(d=h[g]);var i="v"=="\v";jQuery.fn.extend({rotate:function(a){if(!(0===this.length||"undefined"==typeof a)){"number"==typeof a&&(a={angle:a});for(var b=[],c=0,f=this.length;c<f;c++){var e=this.get(c);if(!e.Wilq32||!e.Wilq32.PhotoEffect){var d=j.extend(!0,{},a),e=(new Wilq32.PhotoEffect(e,d))._rootObj;
-b.push(j(e))}else e.Wilq32.PhotoEffect._handleRotation(a)}return b}},getRotateAngle:function(){for(var a=[],b=0,c=this.length;b<c;b++){var f=this.get(b);f.Wilq32&&f.Wilq32.PhotoEffect&&(a[b]=f.Wilq32.PhotoEffect._angle)}return a},stopRotate:function(){for(var a=0,b=this.length;a<b;a++){var c=this.get(a);c.Wilq32&&c.Wilq32.PhotoEffect&&clearTimeout(c.Wilq32.PhotoEffect._timer)}}});Wilq32=window.Wilq32||{};Wilq32.PhotoEffect=function(){return d?function(a,b){a.Wilq32={PhotoEffect:this};this._img=this._rootObj=
-this._eventObj=a;this._handleRotation(b)}:function(a,b){this._img=a;this._rootObj=document.createElement("span");this._rootObj.style.display="inline-block";this._rootObj.Wilq32={PhotoEffect:this};a.parentNode.insertBefore(this._rootObj,a);if(a.complete)this._Loader(b);else{var c=this;jQuery(this._img).bind("load",function(){c._Loader(b)})}}}();Wilq32.PhotoEffect.prototype={_setupParameters:function(a){this._parameters=this._parameters||{};"number"!==typeof this._angle&&(this._angle=0);"number"===
-typeof a.angle&&(this._angle=a.angle);this._parameters.animateTo="number"===typeof a.animateTo?a.animateTo:this._angle;this._parameters.step=a.step||this._parameters.step||null;this._parameters.easing=a.easing||this._parameters.easing||function(a,c,f,e,d){return-e*((c=c/d-1)*c*c*c-1)+f};this._parameters.duration=a.duration||this._parameters.duration||1E3;this._parameters.callback=a.callback||this._parameters.callback||function(){};a.bind&&a.bind!=this._parameters.bind&&this._BindEvents(a.bind)},_handleRotation:function(a){this._setupParameters(a);
-this._angle==this._parameters.animateTo?this._rotate(this._angle):this._animateStart()},_BindEvents:function(a){if(a&&this._eventObj){if(this._parameters.bind){var b=this._parameters.bind,c;for(c in b)b.hasOwnProperty(c)&&jQuery(this._eventObj).unbind(c,b[c])}this._parameters.bind=a;for(c in a)a.hasOwnProperty(c)&&jQuery(this._eventObj).bind(c,a[c])}},_Loader:function(){return i?function(a){var b=this._img.width,c=this._img.height;this._img.parentNode.removeChild(this._img);this._vimage=this.createVMLNode("image");
-this._vimage.src=this._img.src;this._vimage.style.height=c+"px";this._vimage.style.width=b+"px";this._vimage.style.position="absolute";this._vimage.style.top="0px";this._vimage.style.left="0px";this._container=this.createVMLNode("group");this._container.style.width=b;this._container.style.height=c;this._container.style.position="absolute";this._container.setAttribute("coordsize",b-1+","+(c-1));this._container.appendChild(this._vimage);this._rootObj.appendChild(this._container);this._rootObj.style.position=
-"relative";this._rootObj.style.width=b+"px";this._rootObj.style.height=c+"px";this._rootObj.setAttribute("id",this._img.getAttribute("id"));this._rootObj.className=this._img.className;this._eventObj=this._rootObj;this._handleRotation(a)}:function(a){this._rootObj.setAttribute("id",this._img.getAttribute("id"));this._rootObj.className=this._img.className;this._width=this._img.width;this._height=this._img.height;this._widthHalf=this._width/2;this._heightHalf=this._height/2;var b=Math.sqrt(this._height*
-this._height+this._width*this._width);this._widthAdd=b-this._width;this._heightAdd=b-this._height;this._widthAddHalf=this._widthAdd/2;this._heightAddHalf=this._heightAdd/2;this._img.parentNode.removeChild(this._img);this._aspectW=(parseInt(this._img.style.width,10)||this._width)/this._img.width;this._aspectH=(parseInt(this._img.style.height,10)||this._height)/this._img.height;this._canvas=document.createElement("canvas");this._canvas.setAttribute("width",this._width);this._canvas.style.position="relative";
-this._canvas.style.left=-this._widthAddHalf+"px";this._canvas.style.top=-this._heightAddHalf+"px";this._canvas.Wilq32=this._rootObj.Wilq32;this._rootObj.appendChild(this._canvas);this._rootObj.style.width=this._width+"px";this._rootObj.style.height=this._height+"px";this._eventObj=this._canvas;this._cnv=this._canvas.getContext("2d");this._handleRotation(a)}}(),_animateStart:function(){this._timer&&clearTimeout(this._timer);this._animateStartTime=+new Date;this._animateStartAngle=this._angle;this._animate()},
-_animate:function(){var a=+new Date,b=a-this._animateStartTime>this._parameters.duration;if(b&&!this._parameters.animatedGif)clearTimeout(this._timer);else{(this._canvas||this._vimage||this._img)&&this._rotate(~~(10*this._parameters.easing(0,a-this._animateStartTime,this._animateStartAngle,this._parameters.animateTo-this._animateStartAngle,this._parameters.duration))/10);this._parameters.step&&this._parameters.step(this._angle);var c=this;this._timer=setTimeout(function(){c._animate.call(c)},10)}this._parameters.callback&&
-b&&(this._angle=this._parameters.animateTo,this._rotate(this._angle),this._parameters.callback.call(this._rootObj))},_rotate:function(){var a=Math.PI/180;return i?function(a){this._angle=a;this._container.style.rotation=a%360+"deg"}:d?function(a){this._angle=a;this._img.style[d]="rotate("+a%360+"deg)"}:function(b){this._angle=b;b=b%360*a;this._canvas.width=this._width+this._widthAdd;this._canvas.height=this._height+this._heightAdd;this._cnv.translate(this._widthAddHalf,this._heightAddHalf);this._cnv.translate(this._widthHalf,
-this._heightHalf);this._cnv.rotate(b);this._cnv.translate(-this._widthHalf,-this._heightHalf);this._cnv.scale(this._aspectW,this._aspectH);this._cnv.drawImage(this._img,0,0)}}()};i&&(Wilq32.PhotoEffect.prototype.createVMLNode=function(){document.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{return!document.namespaces.rvml&&document.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),function(a){return document.createElement("<rvml:"+a+' class="rvml">')}}catch(a){return function(a){return document.createElement("<"+
-a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}}())})(jQuery);
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/AUTHORS.txt b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/AUTHORS.txt
deleted file mode 100755
index a75056b..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/AUTHORS.txt
+++ /dev/null
@@ -1,333 +0,0 @@
-Authors ordered by first contribution
-A list of current team members is available at http://jqueryui.com/about
-
-Paul Bakaus <paul.bakaus@gmail.com>
-Richard Worth <rdworth@gmail.com>
-Yehuda Katz <wycats@gmail.com>
-Sean Catchpole <sean@sunsean.com>
-John Resig <jeresig@gmail.com>
-Tane Piper <piper.tane@gmail.com>
-Dmitri Gaskin <dmitrig01@gmail.com>
-Klaus Hartl <klaus.hartl@gmail.com>
-Stefan Petre <stefan.petre@gmail.com>
-Gilles van den Hoven <gilles@webunity.nl>
-Micheil Bryan Smith <micheil@brandedcode.com>
-Jörn Zaefferer <joern.zaefferer@gmail.com>
-Marc Grabanski <m@marcgrabanski.com>
-Keith Wood <kbwood@iinet.com.au>
-Brandon Aaron <brandon.aaron@gmail.com>
-Scott González <scott.gonzalez@gmail.com>
-Eduardo Lundgren <eduardolundgren@gmail.com>
-Aaron Eisenberger <aaronchi@gmail.com>
-Joan Piedra <theneojp@gmail.com>
-Bruno Basto <b.basto@gmail.com>
-Remy Sharp <remy@leftlogic.com>
-Bohdan Ganicky <bohdan.ganicky@gmail.com>
-David Bolter <david.bolter@gmail.com>
-Chi Cheng <cloudream@gmail.com>
-Ca-Phun Ung <pazu2k@gmail.com>
-Ariel Flesler <aflesler@gmail.com>
-Maggie Wachs <maggie@filamentgroup.com>
-Scott Jehl <scottjehl@gmail.com>
-Todd Parker <todd@filamentgroup.com>
-Andrew Powell <andrew@shellscape.org>
-Brant Burnett <btburnett3@gmail.com>
-Douglas Neiner <doug@dougneiner.com>
-Paul Irish <paul.irish@gmail.com>
-Ralph Whitbeck <ralph.whitbeck@gmail.com>
-Thibault Duplessis <thibault.duplessis@gmail.com>
-Dominique Vincent <dominique.vincent@toitl.com>
-Jack Hsu <jack.hsu@gmail.com>
-Adam Sontag <ajpiano@ajpiano.com>
-Carl Fürstenberg <carl@excito.com>
-Kevin Dalman <development@allpro.net>
-Alberto Fernández Capel <afcapel@gmail.com>
-Jacek Jędrzejewski (http://jacek.jedrzejewski.name)
-Ting Kuei <ting@kuei.com>
-Samuel Cormier-Iijima <sam@chide.it>
-Jon Palmer <jonspalmer@gmail.com>
-Ben Hollis <bhollis@amazon.com>
-Justin MacCarthy <Justin@Rubystars.biz>
-Eyal Kobrigo <kobrigo@hotmail.com>
-Tiago Freire <tiago.freire@gmail.com>
-Diego Tres <diegotres@gmail.com>
-Holger Rüprich <holger@rueprich.de>
-Ziling Zhao <zilingzhao@gmail.com>
-Mike Alsup <malsup@gmail.com>
-Robson Braga Araujo <robsonbraga@gmail.com>
-Pierre-Henri Ausseil <ph.ausseil@gmail.com>
-Christopher McCulloh <cmcculloh@gmail.com>
-Andrew Newcomb <ext.github@preceptsoftware.co.uk>
-Lim Chee Aun <cheeaun@gmail.com>
-Jorge Barreiro <yortx.barry@gmail.com>
-Daniel Steigerwald <daniel@steigerwald.cz>
-John Firebaugh <john_firebaugh@bigfix.com>
-John Enters <github@darkdark.net>
-Andrey Kapitcyn <ru.m157y@gmail.com>
-Dmitry Petrov <dpetroff@gmail.com>
-Eric Hynds <eric@hynds.net>
-Chairat Sunthornwiphat <pipo@sixhead.com>
-Josh Varner <josh.varner@gmail.com>
-Stéphane Raimbault <stephane.raimbault@gmail.com>
-Jay Merrifield <fracmak@gmail.com>
-J. Ryan Stinnett <jryans@gmail.com>
-Peter Heiberg <peter@heiberg.se>
-Alex Dovenmuehle <adovenmuehle@gmail.com>
-Jamie Gegerson <git@jamiegegerson.com>
-Raymond Schwartz <skeetergraphics@gmail.com>
-Phillip Barnes <philbar@gmail.com>
-Kyle Wilkinson <kai@wikyd.org>
-Khaled AlHourani <me@khaledalhourani.com>
-Marian Rudzynski <mr@impaled.org>
-Jean-Francois Remy <jeff@melix.org>
-Doug Blood <dougblood@gmail.com>
-Filippo Cavallarin <filippo.cavallarin@codseq.it>
-Heiko Henning <heiko@thehennings.ch>
-Aliaksandr Rahalevich <saksmlz@gmail.com>
-Mario Visic <mario@mariovisic.com>
-Xavi Ramirez <xavi.rmz@gmail.com>
-Max Schnur <max.schnur@gmail.com>
-Saji Nediyanchath <saji89@gmail.com>
-Corey Frang <gnarf37@gmail.com>
-Aaron Peterson <aaronp123@yahoo.com>
-Ivan Peters <ivan@ivanpeters.com>
-Mohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr>
-Marcos Sousa <falecomigo@marcossousa.com>
-Michael DellaNoce <mdellanoce@mailtrust.com>
-George Marshall <echosx@gmail.com>
-Tobias Brunner <tobias@strongswan.org>
-Martin Solli <msolli@gmail.com>
-David Petersen <public@petersendidit.com>
-Dan Heberden <danheberden@gmail.com>
-William Kevin Manire <williamkmanire@gmail.com>
-Gilmore Davidson <gilmoreorless@gmail.com>
-Michael Wu <michaelmwu@gmail.com>
-Adam Parod <mystic414@gmail.com>
-Guillaume Gautreau <guillaume+github@ghusse.com>
-Marcel Toele <EleotleCram@gmail.com>
-Dan Streetman <ddstreet@ieee.org>
-Matt Hoskins <matt@nipltd.com>
-Giovanni Giacobbi <giovanni@giacobbi.net>
-Kyle Florence <kyle.florence@gmail.com>
-Pavol Hluchý <lopo@losys.sk>
-Hans Hillen <hans.hillen@gmail.com>
-Mark Johnson <virgofx@live.com>
-Trey Hunner <treyhunner@gmail.com>
-Shane Whittet <whittet@gmail.com>
-Edward A Faulkner <ef@alum.mit.edu>
-Adam Baratz <adam@adambaratz.com>
-Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
-Eike Send <eike.send@gmail.com>
-Kris Borchers <kris.borchers@gmail.com>
-Eddie Monge <eddie@eddiemonge.com>
-Israel Tsadok <itsadok@gmail.com>
-Carson McDonald <carson@ioncannon.net>
-Jason Davies <jason@jasondavies.com>
-Garrison Locke <gplocke@gmail.com>
-David Murdoch <david@davidmurdoch.com>
-Benjamin Scott Boyle <benjamins.boyle@gmail.com>
-Jesse Baird <jebaird@gmail.com>
-Jonathan Vingiano <jvingiano@gmail.com>
-Dylan Just <dev@ephox.com>
-Hiroshi Tomita <tomykaira@gmail.com>
-Glenn Goodrich <glenn.goodrich@gmail.com>
-Tarafder Ashek-E-Elahi <mail.ashek@gmail.com>
-Ryan Neufeld <ryan@neufeldmail.com>
-Marc Neuwirth <marc.neuwirth@gmail.com>
-Philip Graham <philip.robert.graham@gmail.com>
-Benjamin Sterling <benjamin.sterling@kenzomedia.com>
-Wesley Walser <waw325@gmail.com>
-Kouhei Sutou <kou@clear-code.com>
-Karl Kirch <karlkrch@gmail.com>
-Chris Kelly <ckdake@ckdake.com>
-Jason Oster <jay@kodewerx.org>
-Felix Nagel <info@felixnagel.com>
-Alexander Polomoshnov <alex.polomoshnov@gmail.com>
-David Leal <dgleal@gmail.com>
-Igor Milla <igor.fsp.milla@gmail.com>
-Dave Methvin <dave.methvin@gmail.com>
-Florian Gutmann <f.gutmann@chronimo.com>
-Marwan Al Jubeh <marwan.aljubeh@gmail.com>
-Milan Broum <midlis@googlemail.com>
-Sebastian Sauer <info@dynpages.de>
-Gaëtan Muller <m.gaetan89@gmail.com>
-Michel Weimerskirch <michel@weimerskirch.net>
-William Griffiths <william@ycymro.com>
-Stojce Slavkovski <stojce@gmail.com>
-David Soms <david.soms@gmail.com>
-David De Sloovere <david.desloovere@outlook.com>
-Michael P. Jung <michael.jung@terreon.de>
-Shannon Pekary <spekary@gmail.com>
-Dan Wellman <danwellman@hotmail.com>
-Matthew Edward Hutton <meh@corefiling.co.uk>
-James Khoury <james@jameskhoury.com>
-Rob Loach <robloach@gmail.com>
-Alberto Monteiro <betimbrasil@gmail.com>
-Alex Rhea <alex.rhea@gmail.com>
-Krzysztof Rosiński <rozwell69@gmail.com>
-Ryan Olton <oltonr@gmail.com>
-Genie <386@mail.com>
-Rick Waldron <waldron.rick@gmail.com>
-Ian Simpson <spoonlikesham@gmail.com>
-Lev Kitsis <spam4lev@gmail.com>
-TJ VanToll <tj.vantoll@gmail.com>
-Justin Domnitz <jdomnitz@gmail.com>
-Douglas Cerna <douglascerna@yahoo.com>
-Bert ter Heide <bertjh@hotmail.com>
-Jasvir Nagra <jasvir@gmail.com>
-Yuriy Khabarov <13real008@gmail.com>
-Harri Kilpiö <harri.kilpio@gmail.com>
-Lado Lomidze <lado.lomidze@gmail.com>
-Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
-Simon Sattes <simon.sattes@gmail.com>
-Jo Liss <joliss42@gmail.com>
-Guntupalli Karunakar <karunakarg@yahoo.com>
-Shahyar Ghobadpour <shahyar@gmail.com>
-Lukasz Lipinski <uzza17@gmail.com>
-Timo Tijhof <krinklemail@gmail.com>
-Jason Moon <jmoon@socialcast.com>
-Martin Frost <martinf55@hotmail.com>
-Eneko Illarramendi <eneko@illarra.com>
-EungJun Yi <semtlenori@gmail.com>
-Courtland Allen <courtlandallen@gmail.com>
-Viktar Varvanovich <non4eg@gmail.com>
-Danny Trunk <dtrunk90@gmail.com>
-Pavel Stetina <pavel.stetina@nangu.tv>
-Michael Stay <metaweta@gmail.com>
-Steven Roussey <sroussey@gmail.com>
-Michael Hollis <hollis21@gmail.com>
-Lee Rowlands <lee.rowlands@previousnext.com.au>
-Timmy Willison <timmywillisn@gmail.com>
-Karl Swedberg <kswedberg@gmail.com>
-Baoju Yuan <the_guy_1987@hotmail.com>
-Maciej Mroziński <maciej.k.mrozinski@gmail.com>
-Luis Dalmolin <luis.nh@gmail.com>
-Mark Aaron Shirley <maspwr@gmail.com>
-Martin Hoch <martin@fidion.de>
-Jiayi Yang <tr870829@gmail.com>
-Philipp Benjamin Köppchen <xgxtpbk@gws.ms>
-Sindre Sorhus <sindresorhus@gmail.com>
-Bernhard Sirlinger <bernhard.sirlinger@tele2.de>
-Jared A. Scheel <jared@jaredscheel.com>
-Rafael Xavier de Souza <rxaviers@gmail.com>
-John Chen <zhang.z.chen@intel.com>
-Robert Beuligmann <robertbeuligmann@gmail.com>
-Dale Kocian <dale.kocian@gmail.com>
-Mike Sherov <mike.sherov@gmail.com>
-Andrew Couch <andy@couchand.com>
-Marc-Andre Lafortune <github@marc-andre.ca>
-Nate Eagle <nate.eagle@teamaol.com>
-David Souther <davidsouther@gmail.com>
-Mathias Stenbom <mathias@stenbom.com>
-Sergey Kartashov <ebishkek@yandex.ru>
-Avinash R <nashpapa@gmail.com>
-Ethan Romba <ethanromba@gmail.com>
-Cory Gackenheimer <cory.gack@gmail.com>
-Juan Pablo Kaniefsky <jpkaniefsky@gmail.com>
-Roman Salnikov <bardt.dz@gmail.com>
-Anika Henke <anika@selfthinker.org>
-Samuel Bovée <samycookie2000@yahoo.fr>
-Fabrício Matté <ult_combo@hotmail.com>
-Viktor Kojouharov <vkojouharov@gmail.com>
-Pawel Maruszczyk (http://hrabstwo.net)
-Pavel Selitskas <p.selitskas@gmail.com>
-Bjørn Johansen <post@bjornjohansen.no>
-Matthieu Penant <thieum22@hotmail.com>
-Dominic Barnes <dominic@dbarnes.info>
-David Sullivan <david.sullivan@gmail.com>
-Thomas Jaggi <thomas@responsive.ch>
-Vahid Sohrabloo <vahid4134@gmail.com>
-Travis Carden <travis.carden@gmail.com>
-Bruno M. Custódio <bruno@brunomcustodio.com>
-Nathanael Silverman <nathanael.silverman@gmail.com>
-Christian Wenz <christian@wenz.org>
-Steve Urmston <steve@urm.st>
-Zaven Muradyan <megalivoithos@gmail.com>
-Woody Gilk <shadowhand@deviantart.com>
-Zbigniew Motyka <zbigniew.motyka@gmail.com>
-Suhail Alkowaileet <xsoh.k7@gmail.com>
-Toshi MARUYAMA <marutosijp2@yahoo.co.jp>
-David Hansen <hansede@gmail.com>
-Brian Grinstead <briangrinstead@gmail.com>
-Christian Klammer <christian314159@gmail.com>
-Steven Luscher <jquerycla@steveluscher.com>
-Gan Eng Chin <engchin.gan@gmail.com>
-Gabriel Schulhof <gabriel.schulhof@intel.com>
-Alexander Schmitz <arschmitz@gmail.com>
-Vilhjálmur Skúlason <vis@dmm.is>
-Siebrand Mazeland <siebrand@kitano.nl>
-Mohsen Ekhtiari <mohsenekhtiari@yahoo.com>
-Pere Orga <gotrunks@gmail.com>
-Jasper de Groot <mail@ugomobi.com>
-Stephane Deschamps <stephane.deschamps@gmail.com>
-Jyoti Deka <dekajp@gmail.com>
-Andrei Picus <office.nightcrawler@gmail.com>
-Ondrej Novy <novy@ondrej.org>
-Jacob McCutcheon <jacob.mccutcheon@gmail.com>
-Monika Piotrowicz <monika.piotrowicz@gmail.com>
-Imants Horsts <imants.horsts@inbox.lv>
-Eric Dahl <eric.c.dahl@gmail.com>
-Dave Stein <dave@behance.com>
-Dylan Barrell <dylan@barrell.com>
-Daniel DeGroff <djdegroff@gmail.com>
-Michael Wiencek <mwtuea@gmail.com>
-Thomas Meyer <meyertee@gmail.com>
-Ruslan Yakhyaev <ruslan@ruslan.io>
-Brian J. Dowling <bjd-dev@simplicity.net>
-Ben Higgins <ben@extrahop.com>
-Yermo Lamers <yml@yml.com>
-Patrick Stapleton <github@gdi2290.com>
-Trisha Crowley <trisha.crowley@gmail.com>
-Usman Akeju <akeju00+github@gmail.com>
-Rodrigo Menezes <rod333@gmail.com>
-Jacques Perrault <jacques_perrault@us.ibm.com>
-Frederik Elvhage <frederik.elvhage@googlemail.com>
-Will Holley <willholley@gmail.com>
-Uri Gilad <antishok@gmail.com>
-Richard Gibson <richard.gibson@gmail.com>
-Simen Bekkhus <sbekkhus91@gmail.com>
-Chen Eshchar <eshcharc@gmail.com>
-Bruno Pérel <brunoperel@gmail.com>
-Mohammed Alshehri <m@dralshehri.com>
-Lisa Seacat DeLuca <ldeluca@us.ibm.com>
-Anne-Gaelle Colom <coloma@westminster.ac.uk>
-Adam Foster <slimfoster@gmail.com>
-Luke Page <luke.a.page@gmail.com>
-Daniel Owens <daniel@matchstickmixup.com>
-Michael Orchard <morchard@scottlogic.co.uk>
-Marcus Warren <marcus@envoke.com>
-Nils Heuermann <nils@world-of-scripts.de>
-Marco Ziech <marco@ziech.net>
-Patricia Juarez <patrixd@gmail.com>
-Ben Mosher <me@benmosher.com>
-Ablay Keldibek <atomio.ak@gmail.com>
-Thomas Applencourt <thomas.applencourt@irsamc.ups-tlse.fr>
-Jiabao Wu <jiabao.foss@gmail.com>
-Eric Lee Carraway <github@ericcarraway.com>
-Victor Homyakov <vkhomyackov@gmail.com>
-Myeongjin Lee <aranet100@gmail.com>
-Liran Sharir <lsharir@gmail.com>
-Weston Ruter <weston@xwp.co>
-Mani Mishra <manimishra902@gmail.com>
-Hannah Methvin <hannahmethvin@gmail.com>
-Leonardo Balter <leonardo.balter@gmail.com>
-Benjamin Albert <benjamin_a5@yahoo.com>
-Michał Gołębiowski <m.goleb@gmail.com>
-Alyosha Pushak <alyosha.pushak@gmail.com>
-Fahad Ahmad <fahadahmad41@hotmail.com>
-Matt Brundage <github@mattbrundage.com>
-Francesc Baeta <francesc.baeta@gmail.com>
-Piotr Baran <piotros@wp.pl>
-Mukul Hase <mukulhase@gmail.com>
-Konstantin Dinev <kdinev@mail.bw.edu>
-Rand Scullard <rand@randscullard.com>
-Dan Strohl <dan@wjcg.net>
-Maksim Ryzhikov <rv.maksim@gmail.com>
-Amine HADDAD <haddad@allegorie.tv>
-Amanpreet Singh <apsdehal@gmail.com>
-Alexey Balchunas <bleshik@gmail.com>
-Peter Kehl <peter.kehl@gmail.com>
-Peter Dave Hello <hsu@peterdavehello.org>
-Johannes Schäfer <johnschaefer@gmx.de>
-Ville Skyttä <ville.skytta@iki.fi>
-Ryan Oriecuia <ryan.oriecuia@visioncritical.com>
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/LICENSE.txt b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/LICENSE.txt
deleted file mode 100755
index 4819e54..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/LICENSE.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery-ui
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
-
-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.
-
-====
-
-Copyright and related rights for sample code are waived via CC0. Sample
-code is defined as all source code contained within the demos directory.
-
-CC0: http://creativecommons.org/publicdomain/zero/1.0/
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/external/jquery/jquery.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/external/jquery/jquery.js
deleted file mode 100755
index 6f6fb68..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/external/jquery/jquery.js
+++ /dev/null
@@ -1,11008 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.12.4
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-05-20T17:17Z
- */
-
-(function( global, factory ) {
-
- if ( typeof module === "object" && typeof module.exports === "object" ) {
- // For CommonJS and CommonJS-like environments where a proper `window`
- // is present, execute the factory and get jQuery.
- // For environments that do not have a `window` with a `document`
- // (such as Node.js), expose a factory as module.exports.
- // This accentuates the need for the creation of a real `window`.
- // e.g. var jQuery = require("jquery")(window);
- // See ticket #14549 for more info.
- module.exports = global.document ?
- factory( global, true ) :
- function( w ) {
- if ( !w.document ) {
- throw new Error( "jQuery requires a window with a document" );
- }
- return factory( w );
- };
- } else {
- factory( global );
- }
-
-// Pass this if window is not defined yet
-}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Support: Firefox 18+
-// Can't be in strict mode, several jquery-libs including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-//"use strict";
-var deletedIds = [];
-
-var document = window.document;
-
-var slice = deletedIds.slice;
-
-var concat = deletedIds.concat;
-
-var push = deletedIds.push;
-
-var indexOf = deletedIds.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var support = {};
-
-
-
-var
- version = "1.12.4",
-
- // Define a local copy of jQuery
- jQuery = function( selector, context ) {
-
- // The jQuery object is actually just the init constructor 'enhanced'
- // Need init if jQuery is called (just allow error to be thrown if not included)
- return new jQuery.fn.init( selector, context );
- },
-
- // Support: Android<4.1, IE<9
- // Make sure we trim BOM and NBSP
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
- // Matches dashed string for camelizing
- rmsPrefix = /^-ms-/,
- rdashAlpha = /-([\da-z])/gi,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return letter.toUpperCase();
- };
-
-jQuery.fn = jQuery.prototype = {
-
- // The current version of jQuery being used
- jquery: version,
-
- constructor: jQuery,
-
- // Start with an empty selector
- selector: "",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- toArray: function() {
- return slice.call( this );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num != null ?
-
- // Return just the one element from the set
- ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
-
- // Return all the elements in a clean array
- slice.call( this );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems ) {
-
- // Build a new jQuery matched element set
- var ret = jQuery.merge( this.constructor(), elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
- ret.context = this.context;
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- each: function( callback ) {
- return jQuery.each( this, callback );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map( this, function( elem, i ) {
- return callback.call( elem, i, elem );
- } ) );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ) );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- eq: function( i ) {
- var len = this.length,
- j = +i + ( i < 0 ? len : 0 );
- return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
- },
-
- end: function() {
- return this.prevObject || this.constructor();
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: deletedIds.sort,
- splice: deletedIds.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
- var src, copyIsArray, copy, name, options, clone,
- target = arguments[ 0 ] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
-
- // skip the boolean and the target
- target = arguments[ i ] || {};
- i++;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( i === length ) {
- target = this;
- i--;
- }
-
- for ( ; i < length; i++ ) {
-
- // Only deal with non-null/undefined values
- if ( ( options = arguments[ i ] ) != null ) {
-
- // 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 && ( jQuery.isPlainObject( copy ) ||
- ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
-
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray( src ) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject( src ) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend( {
-
- // Unique for each copy of jQuery on the page
- expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
- // Assume jQuery is ready without the ready module
- isReady: true,
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- noop: function() {},
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type( obj ) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type( obj ) === "array";
- },
-
- isWindow: function( obj ) {
- /* jshint eqeqeq: false */
- return obj != null && obj == obj.window;
- },
-
- isNumeric: function( obj ) {
-
- // parseFloat NaNs numeric-cast false positives (null|true|false|"")
- // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
- // subtraction forces infinities to NaN
- // adding 1 corrects loss of precision from parseFloat (#15100)
- var realStringObj = obj && obj.toString();
- return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
- },
-
- isEmptyObject: function( obj ) {
- var name;
- for ( name in obj ) {
- return false;
- }
- return true;
- },
-
- isPlainObject: function( obj ) {
- var key;
-
- // 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 || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- try {
-
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call( obj, "constructor" ) &&
- !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
- return false;
- }
- } catch ( e ) {
-
- // IE8,9 Will throw exceptions on certain host objects #9897
- return false;
- }
-
- // Support: IE<9
- // Handle iteration over inherited properties before own properties.
- if ( !support.ownFirst ) {
- for ( key in obj ) {
- return hasOwn.call( obj, key );
- }
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
- for ( key in obj ) {}
-
- return key === undefined || hasOwn.call( obj, key );
- },
-
- type: function( obj ) {
- if ( obj == null ) {
- return obj + "";
- }
- return typeof obj === "object" || typeof obj === "function" ?
- class2type[ toString.call( obj ) ] || "object" :
- typeof obj;
- },
-
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && jQuery.trim( data ) ) {
-
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation
- } )( data );
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase: function( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
- },
-
- each: function( obj, callback ) {
- var length, i = 0;
-
- if ( isArrayLike( obj ) ) {
- length = obj.length;
- for ( ; i < length; i++ ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- } else {
- for ( i in obj ) {
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
- break;
- }
- }
- }
-
- return obj;
- },
-
- // Support: Android<4.1, IE<9
- trim: function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
- },
-
- // results is for internal usage only
- makeArray: function( arr, results ) {
- var ret = results || [];
-
- if ( arr != null ) {
- if ( isArrayLike( Object( arr ) ) ) {
- jQuery.merge( ret,
- typeof arr === "string" ?
- [ arr ] : arr
- );
- } else {
- push.call( ret, arr );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, arr, i ) {
- var len;
-
- if ( arr ) {
- if ( indexOf ) {
- return indexOf.call( arr, elem, i );
- }
-
- len = arr.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
-
- // Skip accessing in sparse arrays
- if ( i in arr && arr[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var len = +second.length,
- j = 0,
- i = first.length;
-
- while ( j < len ) {
- first[ i++ ] = second[ j++ ];
- }
-
- // Support: IE<9
- // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
- if ( len !== len ) {
- while ( second[ j ] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, invert ) {
- var callbackInverse,
- matches = [],
- i = 0,
- length = elems.length,
- callbackExpect = !invert;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( ; i < length; i++ ) {
- callbackInverse = !callback( elems[ i ], i );
- if ( callbackInverse !== callbackExpect ) {
- matches.push( elems[ i ] );
- }
- }
-
- return matches;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var length, value,
- i = 0,
- ret = [];
-
- // Go through the array, translating each of the items to their new values
- if ( isArrayLike( elems ) ) {
- length = elems.length;
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( i in elems ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret.push( value );
- }
- }
- }
-
- // Flatten any nested arrays
- return concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- var args, proxy, tmp;
-
- if ( typeof context === "string" ) {
- tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- args = slice.call( arguments, 2 );
- proxy = function() {
- return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
- return proxy;
- },
-
- now: function() {
- return +( new Date() );
- },
-
- // jQuery.support is not used in Core but other projects attach their
- // properties to it so it needs to exist.
- support: support
-} );
-
-// JSHint would error on this code due to the Symbol not being defined in ES5.
-// Defining this global in .jshintrc would create a danger of using the global
-// unguarded in another place, it seems safer to just disable JSHint for these
-// three lines.
-/* jshint ignore: start */
-if ( typeof Symbol === "function" ) {
- jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
-}
-/* jshint ignore: end */
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
- // Support: iOS 8.2 (not reproducible in simulator)
- // `in` check used to prevent JIT error (gh-2145)
- // hasOwn isn't used here due to false negatives
- // regarding Nodelist length in IE
- var length = !!obj && "length" in obj && obj.length,
- type = jQuery.type( obj );
-
- if ( type === "function" || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- return type === "array" || length === 0 ||
- typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.2.1
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2015-10-17
- */
-(function( window ) {
-
-var i,
- support,
- Expr,
- getText,
- isXML,
- tokenize,
- compile,
- select,
- outermostContext,
- sortInput,
- hasDuplicate,
-
- // Local document vars
- setDocument,
- document,
- docElem,
- documentIsHTML,
- rbuggyQSA,
- rbuggyMatches,
- matches,
- contains,
-
- // Instance-specific data
- expando = "sizzle" + 1 * new Date(),
- preferredDoc = window.document,
- dirruns = 0,
- done = 0,
- classCache = createCache(),
- tokenCache = createCache(),
- compilerCache = createCache(),
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- }
- return 0;
- },
-
- // General-purpose constants
- MAX_NEGATIVE = 1 << 31,
-
- // Instance methods
- hasOwn = ({}).hasOwnProperty,
- arr = [],
- pop = arr.pop,
- push_native = arr.push,
- push = arr.push,
- slice = arr.slice,
- // Use a stripped-down indexOf as it's faster than native
- // http://jsperf.com/thor-indexof-vs-for/5
- indexOf = function( list, elem ) {
- var i = 0,
- len = list.length;
- for ( ; i < len; i++ ) {
- if ( list[i] === elem ) {
- return i;
- }
- }
- return -1;
- },
-
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
- // Regular expressions
-
- // http://www.w3.org/TR/css3-selectors/#whitespace
- whitespace = "[\\x20\\t\\r\\n\\f]",
-
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
- identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
- attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
- // Operator (capture 2)
- "*([*^$|!~]?=)" + whitespace +
- // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
- "*\\]",
-
- pseudos = ":(" + identifier + ")(?:\\((" +
- // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
- // 1. quoted (capture 3; capture 4 or capture 5)
- "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
- // 2. simple (capture 6)
- "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
- // 3. anything else (capture 2)
- ".*" +
- ")\\)|)",
-
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
- rwhitespace = new RegExp( whitespace + "+", "g" ),
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
- rpseudo = new RegExp( pseudos ),
- ridentifier = new RegExp( "^" + identifier + "$" ),
-
- matchExpr = {
- "ID": new RegExp( "^#(" + identifier + ")" ),
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
- "ATTR": new RegExp( "^" + attributes ),
- "PSEUDO": new RegExp( "^" + pseudos ),
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
- // For use in libraries implementing .is()
- // We use this for POS matching in `select`
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
- },
-
- rinputs = /^(?:input|select|textarea|button)$/i,
- rheader = /^h\d$/i,
-
- rnative = /^[^{]+\{\s*\[native \w/,
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
- rsibling = /[+~]/,
- rescape = /'|\\/g,
-
- // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
- funescape = function( _, escaped, escapedWhitespace ) {
- var high = "0x" + escaped - 0x10000;
- // NaN means non-codepoint
- // Support: Firefox<24
- // Workaround erroneous numeric interpretation of +"0x"
- return high !== high || escapedWhitespace ?
- escaped :
- high < 0 ?
- // BMP codepoint
- String.fromCharCode( high + 0x10000 ) :
- // Supplemental Plane codepoint (surrogate pair)
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
- },
-
- // Used for iframes
- // See setDocument()
- // Removing the function wrapper causes a "Permission Denied"
- // error in IE
- unloadHandler = function() {
- setDocument();
- };
-
-// Optimize for push.apply( _, NodeList )
-try {
- push.apply(
- (arr = slice.call( preferredDoc.childNodes )),
- preferredDoc.childNodes
- );
- // Support: Android<4.0
- // Detect silently failing push.apply
- arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
- push = { apply: arr.length ?
-
- // Leverage slice if possible
- function( target, els ) {
- push_native.apply( target, slice.call(els) );
- } :
-
- // Support: IE<9
- // Otherwise append directly
- function( target, els ) {
- var j = target.length,
- i = 0;
- // Can't trust NodeList.length
- while ( (target[j++] = els[i++]) ) {}
- target.length = j - 1;
- }
- };
-}
-
-function Sizzle( selector, context, results, seed ) {
- var m, i, elem, nid, nidselect, match, groups, newSelector,
- newContext = context && context.ownerDocument,
-
- // nodeType defaults to 9, since context defaults to document
- nodeType = context ? context.nodeType : 9;
-
- results = results || [];
-
- // Return early from calls with invalid selector or context
- if ( typeof selector !== "string" || !selector ||
- nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
- return results;
- }
-
- // Try to shortcut find operations (as opposed to filters) in HTML documents
- if ( !seed ) {
-
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
- setDocument( context );
- }
- context = context || document;
-
- if ( documentIsHTML ) {
-
- // If the selector is sufficiently simple, try using a "get*By*" DOM method
- // (excepting DocumentFragment context, where the methods don't exist)
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
- // ID selector
- if ( (m = match[1]) ) {
-
- // Document context
- if ( nodeType === 9 ) {
- if ( (elem = context.getElementById( m )) ) {
-
- // Support: IE, Opera, Webkit
- // TODO: identify versions
- // getElementById can match elements by name instead of ID
- if ( elem.id === m ) {
- results.push( elem );
- return results;
- }
- } else {
- return results;
- }
-
- // Element context
- } else {
-
- // Support: IE, Opera, Webkit
- // TODO: identify versions
- // getElementById can match elements by name instead of ID
- if ( newContext && (elem = newContext.getElementById( m )) &&
- contains( context, elem ) &&
- elem.id === m ) {
-
- results.push( elem );
- return results;
- }
- }
-
- // Type selector
- } else if ( match[2] ) {
- push.apply( results, context.getElementsByTagName( selector ) );
- return results;
-
- // Class selector
- } else if ( (m = match[3]) && support.getElementsByClassName &&
- context.getElementsByClassName ) {
-
- push.apply( results, context.getElementsByClassName( m ) );
- return results;
- }
- }
-
- // Take advantage of querySelectorAll
- if ( support.qsa &&
- !compilerCache[ selector + " " ] &&
- (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
- if ( nodeType !== 1 ) {
- newContext = context;
- newSelector = selector;
-
- // qSA looks outside Element context, which is not what we want
- // Thanks to Andrew Dupont for this workaround technique
- // Support: IE <=8
- // Exclude object elements
- } else if ( context.nodeName.toLowerCase() !== "object" ) {
-
- // Capture the context ID, setting it first if necessary
- if ( (nid = context.getAttribute( "id" )) ) {
- nid = nid.replace( rescape, "\\$&" );
- } else {
- context.setAttribute( "id", (nid = expando) );
- }
-
- // Prefix every selector in the list
- groups = tokenize( selector );
- i = groups.length;
- nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
- while ( i-- ) {
- groups[i] = nidselect + " " + toSelector( groups[i] );
- }
- newSelector = groups.join( "," );
-
- // Expand context for sibling selectors
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
- context;
- }
-
- if ( newSelector ) {
- try {
- push.apply( results,
- newContext.querySelectorAll( newSelector )
- );
- return results;
- } catch ( qsaError ) {
- } finally {
- if ( nid === expando ) {
- context.removeAttribute( "id" );
- }
- }
- }
- }
- }
- }
-
- // All others
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- * deleting the oldest entry
- */
-function createCache() {
- var keys = [];
-
- function cache( key, value ) {
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
- if ( keys.push( key + " " ) > Expr.cacheLength ) {
- // Only keep the most recent entries
- delete cache[ keys.shift() ];
- }
- return (cache[ key + " " ] = value);
- }
- return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
- fn[ expando ] = true;
- return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created div and expects a boolean result
- */
-function assert( fn ) {
- var div = document.createElement("div");
-
- try {
- return !!fn( div );
- } catch (e) {
- return false;
- } finally {
- // Remove from its parent by default
- if ( div.parentNode ) {
- div.parentNode.removeChild( div );
- }
- // release memory in IE
- div = null;
- }
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
- var arr = attrs.split("|"),
- i = arr.length;
-
- while ( i-- ) {
- Expr.attrHandle[ arr[i] ] = handler;
- }
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
- var cur = b && a,
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
- ( ~b.sourceIndex || MAX_NEGATIVE ) -
- ( ~a.sourceIndex || MAX_NEGATIVE );
-
- // Use IE sourceIndex if available on both nodes
- if ( diff ) {
- return diff;
- }
-
- // Check if b follows a
- if ( cur ) {
- while ( (cur = cur.nextSibling) ) {
- if ( cur === b ) {
- return -1;
- }
- }
- }
-
- return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && elem.type === type;
- };
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
- return markFunction(function( argument ) {
- argument = +argument;
- return markFunction(function( seed, matches ) {
- var j,
- matchIndexes = fn( [], seed.length, argument ),
- i = matchIndexes.length;
-
- // Match elements found at the specified indexes
- while ( i-- ) {
- if ( seed[ (j = matchIndexes[i]) ] ) {
- seed[j] = !(matches[j] = seed[j]);
- }
- }
- });
- });
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
- return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
- var hasCompare, parent,
- doc = node ? node.ownerDocument || node : preferredDoc;
-
- // Return early if doc is invalid or already selected
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
- return document;
- }
-
- // Update global variables
- document = doc;
- docElem = document.documentElement;
- documentIsHTML = !isXML( document );
-
- // Support: IE 9-11, Edge
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
- if ( (parent = document.defaultView) && parent.top !== parent ) {
- // Support: IE 11
- if ( parent.addEventListener ) {
- parent.addEventListener( "unload", unloadHandler, false );
-
- // Support: IE 9 - 10 only
- } else if ( parent.attachEvent ) {
- parent.attachEvent( "onunload", unloadHandler );
- }
- }
-
- /* Attributes
- ---------------------------------------------------------------------- */
-
- // Support: IE<8
- // Verify that getAttribute really returns attributes and not properties
- // (excepting IE8 booleans)
- support.attributes = assert(function( div ) {
- div.className = "i";
- return !div.getAttribute("className");
- });
-
- /* getElement(s)By*
- ---------------------------------------------------------------------- */
-
- // Check if getElementsByTagName("*") returns only elements
- support.getElementsByTagName = assert(function( div ) {
- div.appendChild( document.createComment("") );
- return !div.getElementsByTagName("*").length;
- });
-
- // Support: IE<9
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
- // Support: IE<10
- // Check if getElementById returns elements by name
- // The broken getElementById methods don't pick up programatically-set names,
- // so use a roundabout getElementsByName test
- support.getById = assert(function( div ) {
- docElem.appendChild( div ).id = expando;
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
- });
-
- // ID find and filter
- if ( support.getById ) {
- Expr.find["ID"] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var m = context.getElementById( id );
- return m ? [ m ] : [];
- }
- };
- Expr.filter["ID"] = function( id ) {
- var attrId = id.replace( runescape, funescape );
- return function( elem ) {
- return elem.getAttribute("id") === attrId;
- };
- };
- } else {
- // Support: IE6/7
- // getElementById is not reliable as a find shortcut
- delete Expr.find["ID"];
-
- Expr.filter["ID"] = function( id ) {
- var attrId = id.replace( runescape, funescape );
- return function( elem ) {
- var node = typeof elem.getAttributeNode !== "undefined" &&
- elem.getAttributeNode("id");
- return node && node.value === attrId;
- };
- };
- }
-
- // Tag
- Expr.find["TAG"] = support.getElementsByTagName ?
- function( tag, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( tag );
-
- // DocumentFragment nodes don't have gEBTN
- } else if ( support.qsa ) {
- return context.querySelectorAll( tag );
- }
- } :
-
- function( tag, context ) {
- var elem,
- tmp = [],
- i = 0,
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
- results = context.getElementsByTagName( tag );
-
- // Filter out possible comments
- if ( tag === "*" ) {
- while ( (elem = results[i++]) ) {
- if ( elem.nodeType === 1 ) {
- tmp.push( elem );
- }
- }
-
- return tmp;
- }
- return results;
- };
-
- // Class
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
- if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
- return context.getElementsByClassName( className );
- }
- };
-
- /* QSA/matchesSelector
- ---------------------------------------------------------------------- */
-
- // QSA and matchesSelector support
-
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
- rbuggyMatches = [];
-
- // qSa(:focus) reports false when true (Chrome 21)
- // We allow this because of a bug in IE8/9 that throws an error
- // whenever `document.activeElement` is accessed on an iframe
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
- // See http://bugs.jquery.com/ticket/13378
- rbuggyQSA = [];
-
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
- // Build QSA regex
- // Regex strategy adopted from Diego Perini
- assert(function( div ) {
- // Select is set to empty string on purpose
- // This is to test IE's treatment of not explicitly
- // setting a boolean content attribute,
- // since its presence should be enough
- // http://bugs.jquery.com/ticket/12359
- docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
- "<option selected=''></option></select>";
-
- // Support: IE8, Opera 11-12.16
- // Nothing should be selected when empty strings follow ^= or $= or *=
- // The test attribute must be unknown in Opera but "safe" for WinRT
- // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
- if ( div.querySelectorAll("[msallowcapture^='']").length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
- }
-
- // Support: IE8
- // Boolean attributes and "value" are not treated correctly
- if ( !div.querySelectorAll("[selected]").length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
- }
-
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
- if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
- rbuggyQSA.push("~=");
- }
-
- // Webkit/Opera - :checked should return selected option elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- // IE8 throws error here and will not see later tests
- if ( !div.querySelectorAll(":checked").length ) {
- rbuggyQSA.push(":checked");
- }
-
- // Support: Safari 8+, iOS 8+
- // https://bugs.webkit.org/show_bug.cgi?id=136851
- // In-page `selector#id sibing-combinator selector` fails
- if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
- rbuggyQSA.push(".#.+[+~]");
- }
- });
-
- assert(function( div ) {
- // Support: Windows 8 Native Apps
- // The type and name attributes are restricted during .innerHTML assignment
- var input = document.createElement("input");
- input.setAttribute( "type", "hidden" );
- div.appendChild( input ).setAttribute( "name", "D" );
-
- // Support: IE8
- // Enforce case-sensitivity of name attribute
- if ( div.querySelectorAll("[name=d]").length ) {
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
- }
-
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
- // IE8 throws error here and will not see later tests
- if ( !div.querySelectorAll(":enabled").length ) {
- rbuggyQSA.push( ":enabled", ":disabled" );
- }
-
- // Opera 10-11 does not throw on post-comma invalid pseudos
- div.querySelectorAll("*,:x");
- rbuggyQSA.push(",.*:");
- });
- }
-
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
- docElem.webkitMatchesSelector ||
- docElem.mozMatchesSelector ||
- docElem.oMatchesSelector ||
- docElem.msMatchesSelector) )) ) {
-
- assert(function( div ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9)
- support.disconnectedMatch = matches.call( div, "div" );
-
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( div, "[s!='']:x" );
- rbuggyMatches.push( "!=", pseudos );
- });
- }
-
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
- /* Contains
- ---------------------------------------------------------------------- */
- hasCompare = rnative.test( docElem.compareDocumentPosition );
-
- // Element contains another
- // Purposefully self-exclusive
- // As in, an element does not contain itself
- contains = hasCompare || rnative.test( docElem.contains ) ?
- function( a, b ) {
- var adown = a.nodeType === 9 ? a.documentElement : a,
- bup = b && b.parentNode;
- return a === bup || !!( bup && bup.nodeType === 1 && (
- adown.contains ?
- adown.contains( bup ) :
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
- ));
- } :
- function( a, b ) {
- if ( b ) {
- while ( (b = b.parentNode) ) {
- if ( b === a ) {
- return true;
- }
- }
- }
- return false;
- };
-
- /* Sorting
- ---------------------------------------------------------------------- */
-
- // Document order sorting
- sortOrder = hasCompare ?
- function( a, b ) {
-
- // Flag for duplicate removal
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- // Sort on method existence if only one input has compareDocumentPosition
- var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
- if ( compare ) {
- return compare;
- }
-
- // Calculate position if both inputs belong to the same document
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
- a.compareDocumentPosition( b ) :
-
- // Otherwise we know they are disconnected
- 1;
-
- // Disconnected nodes
- if ( compare & 1 ||
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
- // Choose the first element that is related to our preferred document
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
- return -1;
- }
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
- return 1;
- }
-
- // Maintain original order
- return sortInput ?
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
- 0;
- }
-
- return compare & 4 ? -1 : 1;
- } :
- function( a, b ) {
- // Exit early if the nodes are identical
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- var cur,
- i = 0,
- aup = a.parentNode,
- bup = b.parentNode,
- ap = [ a ],
- bp = [ b ];
-
- // Parentless nodes are either documents or disconnected
- if ( !aup || !bup ) {
- return a === document ? -1 :
- b === document ? 1 :
- aup ? -1 :
- bup ? 1 :
- sortInput ?
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
- 0;
-
- // If the nodes are siblings, we can do a quick check
- } else if ( aup === bup ) {
- return siblingCheck( a, b );
- }
-
- // Otherwise we need full lists of their ancestors for comparison
- cur = a;
- while ( (cur = cur.parentNode) ) {
- ap.unshift( cur );
- }
- cur = b;
- while ( (cur = cur.parentNode) ) {
- bp.unshift( cur );
- }
-
- // Walk down the tree looking for a discrepancy
- while ( ap[i] === bp[i] ) {
- i++;
- }
-
- return i ?
- // Do a sibling check if the nodes have a common ancestor
- siblingCheck( ap[i], bp[i] ) :
-
- // Otherwise nodes in our document sort first
- ap[i] === preferredDoc ? -1 :
- bp[i] === preferredDoc ? 1 :
- 0;
- };
-
- return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
- return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
- // Set document vars if needed
- if ( ( elem.ownerDocument || elem ) !== document ) {
- setDocument( elem );
- }
-
- // Make sure that attribute selectors are quoted
- expr = expr.replace( rattributeQuotes, "='$1']" );
-
- if ( support.matchesSelector && documentIsHTML &&
- !compilerCache[ expr + " " ] &&
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
-
- try {
- var ret = matches.call( elem, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || support.disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
- return ret;
- }
- } catch (e) {}
- }
-
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
- // Set document vars if needed
- if ( ( context.ownerDocument || context ) !== document ) {
- setDocument( context );
- }
- return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
- // Set document vars if needed
- if ( ( elem.ownerDocument || elem ) !== document ) {
- setDocument( elem );
- }
-
- var fn = Expr.attrHandle[ name.toLowerCase() ],
- // Don't get fooled by Object.prototype properties (jQuery #13807)
- val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
- fn( elem, name, !documentIsHTML ) :
- undefined;
-
- return val !== undefined ?
- val :
- support.attributes || !documentIsHTML ?
- elem.getAttribute( name ) :
- (val = elem.getAttributeNode(name)) && val.specified ?
- val.value :
- null;
-};
-
-Sizzle.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
- var elem,
- duplicates = [],
- j = 0,
- i = 0;
-
- // Unless we *know* we can detect duplicates, assume their presence
- hasDuplicate = !support.detectDuplicates;
- sortInput = !support.sortStable && results.slice( 0 );
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- while ( (elem = results[i++]) ) {
- if ( elem === results[ i ] ) {
- j = duplicates.push( i );
- }
- }
- while ( j-- ) {
- results.splice( duplicates[ j ], 1 );
- }
- }
-
- // Clear input after sorting to release objects
- // See https://github.com/jquery/sizzle/pull/225
- sortInput = null;
-
- return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
- var node,
- ret = "",
- i = 0,
- nodeType = elem.nodeType;
-
- if ( !nodeType ) {
- // If no nodeType, this is expected to be an array
- while ( (node = elem[i++]) ) {
- // Do not traverse comment nodes
- ret += getText( node );
- }
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
- // Use textContent for elements
- // innerText usage removed for consistency of new lines (jQuery #11153)
- if ( typeof elem.textContent === "string" ) {
- return elem.textContent;
- } else {
- // Traverse its children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- // Do not include comment or processing instruction nodes
-
- return ret;
-};
-
-Expr = Sizzle.selectors = {
-
- // Can be adjusted by the user
- cacheLength: 50,
-
- createPseudo: markFunction,
-
- match: matchExpr,
-
- attrHandle: {},
-
- find: {},
-
- relative: {
- ">": { dir: "parentNode", first: true },
- " ": { dir: "parentNode" },
- "+": { dir: "previousSibling", first: true },
- "~": { dir: "previousSibling" }
- },
-
- preFilter: {
- "ATTR": function( match ) {
- match[1] = match[1].replace( runescape, funescape );
-
- // Move the given value to match[3] whether quoted or unquoted
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
-
- if ( match[2] === "~=" ) {
- match[3] = " " + match[3] + " ";
- }
-
- return match.slice( 0, 4 );
- },
-
- "CHILD": function( match ) {
- /* matches from matchExpr["CHILD"]
- 1 type (only|nth|...)
- 2 what (child|of-type)
- 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
- 4 xn-component of xn+y argument ([+-]?\d*n|)
- 5 sign of xn-component
- 6 x of xn-component
- 7 sign of y-component
- 8 y of y-component
- */
- match[1] = match[1].toLowerCase();
-
- if ( match[1].slice( 0, 3 ) === "nth" ) {
- // nth-* requires argument
- if ( !match[3] ) {
- Sizzle.error( match[0] );
- }
-
- // numeric x and y parameters for Expr.filter.CHILD
- // remember that false/true cast respectively to 0/1
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
- // other types prohibit arguments
- } else if ( match[3] ) {
- Sizzle.error( match[0] );
- }
-
- return match;
- },
-
- "PSEUDO": function( match ) {
- var excess,
- unquoted = !match[6] && match[2];
-
- if ( matchExpr["CHILD"].test( match[0] ) ) {
- return null;
- }
-
- // Accept quoted arguments as-is
- if ( match[3] ) {
- match[2] = match[4] || match[5] || "";
-
- // Strip excess characters from unquoted arguments
- } else if ( unquoted && rpseudo.test( unquoted ) &&
- // Get excess from tokenize (recursively)
- (excess = tokenize( unquoted, true )) &&
- // advance to the next closing parenthesis
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
- // excess is a negative index
- match[0] = match[0].slice( 0, excess );
- match[2] = unquoted.slice( 0, excess );
- }
-
- // Return only captures needed by the pseudo filter method (type and argument)
- return match.slice( 0, 3 );
- }
- },
-
- filter: {
-
- "TAG": function( nodeNameSelector ) {
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
- return nodeNameSelector === "*" ?
- function() { return true; } :
- function( elem ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
- };
- },
-
- "CLASS": function( className ) {
- var pattern = classCache[ className + " " ];
-
- return pattern ||
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
- classCache( className, function( elem ) {
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
- });
- },
-
- "ATTR": function( name, operator, check ) {
- return function( elem ) {
- var result = Sizzle.attr( elem, name );
-
- if ( result == null ) {
- return operator === "!=";
- }
- if ( !operator ) {
- return true;
- }
-
- result += "";
-
- return operator === "=" ? result === check :
- operator === "!=" ? result !== check :
- operator === "^=" ? check && result.indexOf( check ) === 0 :
- operator === "*=" ? check && result.indexOf( check ) > -1 :
- operator === "$=" ? check && result.slice( -check.length ) === check :
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
- false;
- };
- },
-
- "CHILD": function( type, what, argument, first, last ) {
- var simple = type.slice( 0, 3 ) !== "nth",
- forward = type.slice( -4 ) !== "last",
- ofType = what === "of-type";
-
- return first === 1 && last === 0 ?
-
- // Shortcut for :nth-*(n)
- function( elem ) {
- return !!elem.parentNode;
- } :
-
- function( elem, context, xml ) {
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
- dir = simple !== forward ? "nextSibling" : "previousSibling",
- parent = elem.parentNode,
- name = ofType && elem.nodeName.toLowerCase(),
- useCache = !xml && !ofType,
- diff = false;
-
- if ( parent ) {
-
- // :(first|last|only)-(child|of-type)
- if ( simple ) {
- while ( dir ) {
- node = elem;
- while ( (node = node[ dir ]) ) {
- if ( ofType ?
- node.nodeName.toLowerCase() === name :
- node.nodeType === 1 ) {
-
- return false;
- }
- }
- // Reverse direction for :only-* (if we haven't yet done so)
- start = dir = type === "only" && !start && "nextSibling";
- }
- return true;
- }
-
- start = [ forward ? parent.firstChild : parent.lastChild ];
-
- // non-xml :nth-child(...) stores cache data on `parent`
- if ( forward && useCache ) {
-
- // Seek `elem` from a previously-cached index
-
- // ...in a gzip-friendly way
- node = parent;
- outerCache = node[ expando ] || (node[ expando ] = {});
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
-
- cache = uniqueCache[ type ] || [];
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
- diff = nodeIndex && cache[ 2 ];
- node = nodeIndex && parent.childNodes[ nodeIndex ];
-
- while ( (node = ++nodeIndex && node && node[ dir ] ||
-
- // Fallback to seeking `elem` from the start
- (diff = nodeIndex = 0) || start.pop()) ) {
-
- // When found, cache indexes on `parent` and break
- if ( node.nodeType === 1 && ++diff && node === elem ) {
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
- break;
- }
- }
-
- } else {
- // Use previously-cached element index if available
- if ( useCache ) {
- // ...in a gzip-friendly way
- node = elem;
- outerCache = node[ expando ] || (node[ expando ] = {});
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
-
- cache = uniqueCache[ type ] || [];
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
- diff = nodeIndex;
- }
-
- // xml :nth-child(...)
- // or :nth-last-child(...) or :nth(-last)?-of-type(...)
- if ( diff === false ) {
- // Use the same loop as above to seek `elem` from the start
- while ( (node = ++nodeIndex && node && node[ dir ] ||
- (diff = nodeIndex = 0) || start.pop()) ) {
-
- if ( ( ofType ?
- node.nodeName.toLowerCase() === name :
- node.nodeType === 1 ) &&
- ++diff ) {
-
- // Cache the index of each encountered element
- if ( useCache ) {
- outerCache = node[ expando ] || (node[ expando ] = {});
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ node.uniqueID ] ||
- (outerCache[ node.uniqueID ] = {});
-
- uniqueCache[ type ] = [ dirruns, diff ];
- }
-
- if ( node === elem ) {
- break;
- }
- }
- }
- }
- }
-
- // Incorporate the offset, then check against cycle size
- diff -= last;
- return diff === first || ( diff % first === 0 && diff / first >= 0 );
- }
- };
- },
-
- "PSEUDO": function( pseudo, argument ) {
- // pseudo-class names are case-insensitive
- // http://www.w3.org/TR/selectors/#pseudo-classes
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
- // Remember that setFilters inherits from pseudos
- var args,
- fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
- Sizzle.error( "unsupported pseudo: " + pseudo );
-
- // The user may use createPseudo to indicate that
- // arguments are needed to create the filter function
- // just as Sizzle does
- if ( fn[ expando ] ) {
- return fn( argument );
- }
-
- // But maintain support for old signatures
- if ( fn.length > 1 ) {
- args = [ pseudo, pseudo, "", argument ];
- return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction(function( seed, matches ) {
- var idx,
- matched = fn( seed, argument ),
- i = matched.length;
- while ( i-- ) {
- idx = indexOf( seed, matched[i] );
- seed[ idx ] = !( matches[ idx ] = matched[i] );
- }
- }) :
- function( elem ) {
- return fn( elem, 0, args );
- };
- }
-
- return fn;
- }
- },
-
- pseudos: {
- // Potentially complex pseudos
- "not": markFunction(function( selector ) {
- // Trim the selector passed to compile
- // to avoid treating leading and trailing
- // spaces as combinators
- var input = [],
- results = [],
- matcher = compile( selector.replace( rtrim, "$1" ) );
-
- return matcher[ expando ] ?
- markFunction(function( seed, matches, context, xml ) {
- var elem,
- unmatched = matcher( seed, null, xml, [] ),
- i = seed.length;
-
- // Match elements unmatched by `matcher`
- while ( i-- ) {
- if ( (elem = unmatched[i]) ) {
- seed[i] = !(matches[i] = elem);
- }
- }
- }) :
- function( elem, context, xml ) {
- input[0] = elem;
- matcher( input, null, xml, results );
- // Don't keep the element (issue #299)
- input[0] = null;
- return !results.pop();
- };
- }),
-
- "has": markFunction(function( selector ) {
- return function( elem ) {
- return Sizzle( selector, elem ).length > 0;
- };
- }),
-
- "contains": markFunction(function( text ) {
- text = text.replace( runescape, funescape );
- return function( elem ) {
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
- };
- }),
-
- // "Whether an element is represented by a :lang() selector
- // is based solely on the element's language value
- // being equal to the identifier C,
- // or beginning with the identifier C immediately followed by "-".
- // The matching of C against the element's language value is performed case-insensitively.
- // The identifier C does not have to be a valid language name."
- // http://www.w3.org/TR/selectors/#lang-pseudo
- "lang": markFunction( function( lang ) {
- // lang value must be a valid identifier
- if ( !ridentifier.test(lang || "") ) {
- Sizzle.error( "unsupported lang: " + lang );
- }
- lang = lang.replace( runescape, funescape ).toLowerCase();
- return function( elem ) {
- var elemLang;
- do {
- if ( (elemLang = documentIsHTML ?
- elem.lang :
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
- elemLang = elemLang.toLowerCase();
- return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
- }
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
- return false;
- };
- }),
-
- // Miscellaneous
- "target": function( elem ) {
- var hash = window.location && window.location.hash;
- return hash && hash.slice( 1 ) === elem.id;
- },
-
- "root": function( elem ) {
- return elem === docElem;
- },
-
- "focus": function( elem ) {
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
- },
-
- // Boolean properties
- "enabled": function( elem ) {
- return elem.disabled === false;
- },
-
- "disabled": function( elem ) {
- return elem.disabled === true;
- },
-
- "checked": function( elem ) {
- // In CSS3, :checked should return both checked and selected elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- var nodeName = elem.nodeName.toLowerCase();
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
- },
-
- "selected": function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- // Contents
- "empty": function( elem ) {
- // http://www.w3.org/TR/selectors/#empty-pseudo
- // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
- // but not by others (comment: 8; processing instruction: 7; etc.)
- // nodeType < 6 works because attributes (2) do not appear as children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- if ( elem.nodeType < 6 ) {
- return false;
- }
- }
- return true;
- },
-
- "parent": function( elem ) {
- return !Expr.pseudos["empty"]( elem );
- },
-
- // Element/input types
- "header": function( elem ) {
- return rheader.test( elem.nodeName );
- },
-
- "input": function( elem ) {
- return rinputs.test( elem.nodeName );
- },
-
- "button": function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === "button" || name === "button";
- },
-
- "text": function( elem ) {
- var attr;
- return elem.nodeName.toLowerCase() === "input" &&
- elem.type === "text" &&
-
- // Support: IE<8
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
- },
-
- // Position-in-collection
- "first": createPositionalPseudo(function() {
- return [ 0 ];
- }),
-
- "last": createPositionalPseudo(function( matchIndexes, length ) {
- return [ length - 1 ];
- }),
-
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
- return [ argument < 0 ? argument + length : argument ];
- }),
-
- "even": createPositionalPseudo(function( matchIndexes, length ) {
- var i = 0;
- for ( ; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
- var i = 1;
- for ( ; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
- var i = argument < 0 ? argument + length : argument;
- for ( ; --i >= 0; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
- var i = argument < 0 ? argument + length : argument;
- for ( ; ++i < length; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- })
- }
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
- Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
- Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
- var matched, match, tokens, type,
- soFar, groups, preFilters,
- cached = tokenCache[ selector + " " ];
-
- if ( cached ) {
- return parseOnly ? 0 : cached.slice( 0 );
- }
-
- soFar = selector;
- groups = [];
- preFilters = Expr.preFilter;
-
- while ( soFar ) {
-
- // Comma and first run
- if ( !matched || (match = rcomma.exec( soFar )) ) {
- if ( match ) {
- // Don't consume trailing commas as valid
- soFar = soFar.slice( match[0].length ) || soFar;
- }
- groups.push( (tokens = []) );
- }
-
- matched = false;
-
- // Combinators
- if ( (match = rcombinators.exec( soFar )) ) {
- matched = match.shift();
- tokens.push({
- value: matched,
- // Cast descendant combinators to space
- type: match[0].replace( rtrim, " " )
- });
- soFar = soFar.slice( matched.length );
- }
-
- // Filters
- for ( type in Expr.filter ) {
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
- (match = preFilters[ type ]( match ))) ) {
- matched = match.shift();
- tokens.push({
- value: matched,
- type: type,
- matches: match
- });
- soFar = soFar.slice( matched.length );
- }
- }
-
- if ( !matched ) {
- break;
- }
- }
-
- // Return the length of the invalid excess
- // if we're just parsing
- // Otherwise, throw an error or return tokens
- return parseOnly ?
- soFar.length :
- soFar ?
- Sizzle.error( selector ) :
- // Cache the tokens
- tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
- var i = 0,
- len = tokens.length,
- selector = "";
- for ( ; i < len; i++ ) {
- selector += tokens[i].value;
- }
- return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
- var dir = combinator.dir,
- checkNonElements = base && dir === "parentNode",
- doneName = done++;
-
- return combinator.first ?
- // Check against closest ancestor/preceding element
- function( elem, context, xml ) {
- while ( (elem = elem[ dir ]) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- return matcher( elem, context, xml );
- }
- }
- } :
-
- // Check against all ancestor/preceding elements
- function( elem, context, xml ) {
- var oldCache, uniqueCache, outerCache,
- newCache = [ dirruns, doneName ];
-
- // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
- if ( xml ) {
- while ( (elem = elem[ dir ]) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- if ( matcher( elem, context, xml ) ) {
- return true;
- }
- }
- }
- } else {
- while ( (elem = elem[ dir ]) ) {
- if ( elem.nodeType === 1 || checkNonElements ) {
- outerCache = elem[ expando ] || (elem[ expando ] = {});
-
- // Support: IE <9 only
- // Defend against cloned attroperties (jQuery gh-1709)
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
- if ( (oldCache = uniqueCache[ dir ]) &&
- oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
- // Assign to newCache so results back-propagate to previous elements
- return (newCache[ 2 ] = oldCache[ 2 ]);
- } else {
- // Reuse newcache so results back-propagate to previous elements
- uniqueCache[ dir ] = newCache;
-
- // A match means we're done; a fail means we have to keep checking
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
- return true;
- }
- }
- }
- }
- }
- };
-}
-
-function elementMatcher( matchers ) {
- return matchers.length > 1 ?
- function( elem, context, xml ) {
- var i = matchers.length;
- while ( i-- ) {
- if ( !matchers[i]( elem, context, xml ) ) {
- return false;
- }
- }
- return true;
- } :
- matchers[0];
-}
-
-function multipleContexts( selector, contexts, results ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results );
- }
- return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
- var elem,
- newUnmatched = [],
- i = 0,
- len = unmatched.length,
- mapped = map != null;
-
- for ( ; i < len; i++ ) {
- if ( (elem = unmatched[i]) ) {
- if ( !filter || filter( elem, context, xml ) ) {
- newUnmatched.push( elem );
- if ( mapped ) {
- map.push( i );
- }
- }
- }
- }
-
- return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
- if ( postFilter && !postFilter[ expando ] ) {
- postFilter = setMatcher( postFilter );
- }
- if ( postFinder && !postFinder[ expando ] ) {
- postFinder = setMatcher( postFinder, postSelector );
- }
- return markFunction(function( seed, results, context, xml ) {
- var temp, i, elem,
- preMap = [],
- postMap = [],
- preexisting = results.length,
-
- // Get initial elements from seed or context
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
- // Prefilter to get matcher input, preserving a map for seed-results synchronization
- matcherIn = preFilter && ( seed || !selector ) ?
- condense( elems, preMap, preFilter, context, xml ) :
- elems,
-
- matcherOut = matcher ?
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
- // ...intermediate processing is necessary
- [] :
-
- // ...otherwise use results directly
- results :
- matcherIn;
-
- // Find primary matches
- if ( matcher ) {
- matcher( matcherIn, matcherOut, context, xml );
- }
-
- // Apply postFilter
- if ( postFilter ) {
- temp = condense( matcherOut, postMap );
- postFilter( temp, [], context, xml );
-
- // Un-match failing elements by moving them back to matcherIn
- i = temp.length;
- while ( i-- ) {
- if ( (elem = temp[i]) ) {
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
- }
- }
- }
-
- if ( seed ) {
- if ( postFinder || preFilter ) {
- if ( postFinder ) {
- // Get the final matcherOut by condensing this intermediate into postFinder contexts
- temp = [];
- i = matcherOut.length;
- while ( i-- ) {
- if ( (elem = matcherOut[i]) ) {
- // Restore matcherIn since elem is not yet a final match
- temp.push( (matcherIn[i] = elem) );
- }
- }
- postFinder( null, (matcherOut = []), temp, xml );
- }
-
- // Move matched elements from seed to results to keep them synchronized
- i = matcherOut.length;
- while ( i-- ) {
- if ( (elem = matcherOut[i]) &&
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
-
- seed[temp] = !(results[temp] = elem);
- }
- }
- }
-
- // Add elements to results, through postFinder if defined
- } else {
- matcherOut = condense(
- matcherOut === results ?
- matcherOut.splice( preexisting, matcherOut.length ) :
- matcherOut
- );
- if ( postFinder ) {
- postFinder( null, results, matcherOut, xml );
- } else {
- push.apply( results, matcherOut );
- }
- }
- });
-}
-
-function matcherFromTokens( tokens ) {
- var checkContext, matcher, j,
- len = tokens.length,
- leadingRelative = Expr.relative[ tokens[0].type ],
- implicitRelative = leadingRelative || Expr.relative[" "],
- i = leadingRelative ? 1 : 0,
-
- // The foundational matcher ensures that elements are reachable from top-level context(s)
- matchContext = addCombinator( function( elem ) {
- return elem === checkContext;
- }, implicitRelative, true ),
- matchAnyContext = addCombinator( function( elem ) {
- return indexOf( checkContext, elem ) > -1;
- }, implicitRelative, true ),
- matchers = [ function( elem, context, xml ) {
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- (checkContext = context).nodeType ?
- matchContext( elem, context, xml ) :
- matchAnyContext( elem, context, xml ) );
- // Avoid hanging onto element (issue #299)
- checkContext = null;
- return ret;
- } ];
-
- for ( ; i < len; i++ ) {
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
- } else {
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
- // Return special upon seeing a positional matcher
- if ( matcher[ expando ] ) {
- // Find the next relative operator (if any) for proper handling
- j = ++i;
- for ( ; j < len; j++ ) {
- if ( Expr.relative[ tokens[j].type ] ) {
- break;
- }
- }
- return setMatcher(
- i > 1 && elementMatcher( matchers ),
- i > 1 && toSelector(
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
- ).replace( rtrim, "$1" ),
- matcher,
- i < j && matcherFromTokens( tokens.slice( i, j ) ),
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
- j < len && toSelector( tokens )
- );
- }
- matchers.push( matcher );
- }
- }
-
- return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
- var bySet = setMatchers.length > 0,
- byElement = elementMatchers.length > 0,
- superMatcher = function( seed, context, xml, results, outermost ) {
- var elem, j, matcher,
- matchedCount = 0,
- i = "0",
- unmatched = seed && [],
- setMatched = [],
- contextBackup = outermostContext,
- // We must always have either seed elements or outermost context
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
- // Use integer dirruns iff this is the outermost matcher
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
- len = elems.length;
-
- if ( outermost ) {
- outermostContext = context === document || context || outermost;
- }
-
- // Add elements passing elementMatchers directly to results
- // Support: IE<9, Safari
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
- if ( byElement && elem ) {
- j = 0;
- if ( !context && elem.ownerDocument !== document ) {
- setDocument( elem );
- xml = !documentIsHTML;
- }
- while ( (matcher = elementMatchers[j++]) ) {
- if ( matcher( elem, context || document, xml) ) {
- results.push( elem );
- break;
- }
- }
- if ( outermost ) {
- dirruns = dirrunsUnique;
- }
- }
-
- // Track unmatched elements for set filters
- if ( bySet ) {
- // They will have gone through all possible matchers
- if ( (elem = !matcher && elem) ) {
- matchedCount--;
- }
-
- // Lengthen the array for every element, matched or not
- if ( seed ) {
- unmatched.push( elem );
- }
- }
- }
-
- // `i` is now the count of elements visited above, and adding it to `matchedCount`
- // makes the latter nonnegative.
- matchedCount += i;
-
- // Apply set filters to unmatched elements
- // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
- // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
- // no element matchers and no seed.
- // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
- // case, which will result in a "00" `matchedCount` that differs from `i` but is also
- // numerically zero.
- if ( bySet && i !== matchedCount ) {
- j = 0;
- while ( (matcher = setMatchers[j++]) ) {
- matcher( unmatched, setMatched, context, xml );
- }
-
- if ( seed ) {
- // Reintegrate element matches to eliminate the need for sorting
- if ( matchedCount > 0 ) {
- while ( i-- ) {
- if ( !(unmatched[i] || setMatched[i]) ) {
- setMatched[i] = pop.call( results );
- }
- }
- }
-
- // Discard index placeholder values to get only actual matches
- setMatched = condense( setMatched );
- }
-
- // Add matches to results
- push.apply( results, setMatched );
-
- // Seedless set matches succeeding multiple successful matchers stipulate sorting
- if ( outermost && !seed && setMatched.length > 0 &&
- ( matchedCount + setMatchers.length ) > 1 ) {
-
- Sizzle.uniqueSort( results );
- }
- }
-
- // Override manipulation of globals by nested matchers
- if ( outermost ) {
- dirruns = dirrunsUnique;
- outermostContext = contextBackup;
- }
-
- return unmatched;
- };
-
- return bySet ?
- markFunction( superMatcher ) :
- superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
- var i,
- setMatchers = [],
- elementMatchers = [],
- cached = compilerCache[ selector + " " ];
-
- if ( !cached ) {
- // Generate a function of recursive functions that can be used to check each element
- if ( !match ) {
- match = tokenize( selector );
- }
- i = match.length;
- while ( i-- ) {
- cached = matcherFromTokens( match[i] );
- if ( cached[ expando ] ) {
- setMatchers.push( cached );
- } else {
- elementMatchers.push( cached );
- }
- }
-
- // Cache the compiled function
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
- // Save selector and tokenization
- cached.selector = selector;
- }
- return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- * selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- * selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
- var i, tokens, token, type, find,
- compiled = typeof selector === "function" && selector,
- match = !seed && tokenize( (selector = compiled.selector || selector) );
-
- results = results || [];
-
- // Try to minimize operations if there is only one selector in the list and no seed
- // (the latter of which guarantees us context)
- if ( match.length === 1 ) {
-
- // Reduce context if the leading compound selector is an ID
- tokens = match[0] = match[0].slice( 0 );
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
- support.getById && context.nodeType === 9 && documentIsHTML &&
- Expr.relative[ tokens[1].type ] ) {
-
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
- if ( !context ) {
- return results;
-
- // Precompiled matchers will still verify ancestry, so step up a level
- } else if ( compiled ) {
- context = context.parentNode;
- }
-
- selector = selector.slice( tokens.shift().value.length );
- }
-
- // Fetch a seed set for right-to-left matching
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
- while ( i-- ) {
- token = tokens[i];
-
- // Abort if we hit a combinator
- if ( Expr.relative[ (type = token.type) ] ) {
- break;
- }
- if ( (find = Expr.find[ type ]) ) {
- // Search, expanding context for leading sibling combinators
- if ( (seed = find(
- token.matches[0].replace( runescape, funescape ),
- rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
- )) ) {
-
- // If seed is empty or no tokens remain, we can return early
- tokens.splice( i, 1 );
- selector = seed.length && toSelector( tokens );
- if ( !selector ) {
- push.apply( results, seed );
- return results;
- }
-
- break;
- }
- }
- }
- }
-
- // Compile and execute a filtering function if one is not provided
- // Provide `match` to avoid retokenization if we modified the selector above
- ( compiled || compile( selector, match ) )(
- seed,
- context,
- !documentIsHTML,
- results,
- !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
- );
- return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( div1 ) {
- // Should return 1, but returns 4 (following)
- return div1.compareDocumentPosition( document.createElement("div") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( div ) {
- div.innerHTML = "<a href='#'></a>";
- return div.firstChild.getAttribute("href") === "#" ;
-}) ) {
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
- if ( !isXML ) {
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
- }
- });
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( div ) {
- div.innerHTML = "<input/>";
- div.firstChild.setAttribute( "value", "" );
- return div.firstChild.getAttribute( "value" ) === "";
-}) ) {
- addHandle( "value", function( elem, name, isXML ) {
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
- return elem.defaultValue;
- }
- });
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( div ) {
- return div.getAttribute("disabled") == null;
-}) ) {
- addHandle( booleans, function( elem, name, isXML ) {
- var val;
- if ( !isXML ) {
- return elem[ name ] === true ? name.toLowerCase() :
- (val = elem.getAttributeNode( name )) && val.specified ?
- val.value :
- null;
- }
- });
-}
-
-return Sizzle;
-
-})( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-
-var dir = function( elem, dir, until ) {
- var matched = [],
- truncate = until !== undefined;
-
- while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
- if ( elem.nodeType === 1 ) {
- if ( truncate && jQuery( elem ).is( until ) ) {
- break;
- }
- matched.push( elem );
- }
- }
- return matched;
-};
-
-
-var siblings = function( n, elem ) {
- var matched = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- matched.push( n );
- }
- }
-
- return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
-
-
-
-var risSimple = /^.[^:#\[\.,]*$/;
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep( elements, function( elem, i ) {
- /* jshint -W018 */
- return !!qualifier.call( elem, i, elem ) !== not;
- } );
-
- }
-
- if ( qualifier.nodeType ) {
- return jQuery.grep( elements, function( elem ) {
- return ( elem === qualifier ) !== not;
- } );
-
- }
-
- if ( typeof qualifier === "string" ) {
- if ( risSimple.test( qualifier ) ) {
- return jQuery.filter( qualifier, elements, not );
- }
-
- qualifier = jQuery.filter( qualifier, elements );
- }
-
- return jQuery.grep( elements, function( elem ) {
- return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;
- } );
-}
-
-jQuery.filter = function( expr, elems, not ) {
- var elem = elems[ 0 ];
-
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 && elem.nodeType === 1 ?
- jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
- jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
- return elem.nodeType === 1;
- } ) );
-};
-
-jQuery.fn.extend( {
- find: function( selector ) {
- var i,
- ret = [],
- self = this,
- len = self.length;
-
- if ( typeof selector !== "string" ) {
- return this.pushStack( jQuery( selector ).filter( function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- } ) );
- }
-
- for ( i = 0; i < len; i++ ) {
- jQuery.find( selector, self[ i ], ret );
- }
-
- // Needed because $( selector, context ) becomes $( context ).find( selector )
- ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
- ret.selector = this.selector ? this.selector + " " + selector : selector;
- return ret;
- },
- filter: function( selector ) {
- return this.pushStack( winnow( this, selector || [], false ) );
- },
- not: function( selector ) {
- return this.pushStack( winnow( this, selector || [], true ) );
- },
- is: function( selector ) {
- return !!winnow(
- this,
-
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- typeof selector === "string" && rneedsContext.test( selector ) ?
- jQuery( selector ) :
- selector || [],
- false
- ).length;
- }
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
- // A simple way to check for HTML strings
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- // Strict HTML recognition (#11290: must start with <)
- rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
- init = jQuery.fn.init = function( selector, context, root ) {
- var match, elem;
-
- // HANDLE: $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // init accepts an alternate rootjQuery
- // so migrate can support jQuery.sub (gh-2101)
- root = root || rootjQuery;
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector.charAt( 0 ) === "<" &&
- selector.charAt( selector.length - 1 ) === ">" &&
- selector.length >= 3 ) {
-
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = rquickExpr.exec( selector );
- }
-
- // Match html or make sure no context is specified for #id
- if ( match && ( match[ 1 ] || !context ) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[ 1 ] ) {
- context = context instanceof jQuery ? context[ 0 ] : context;
-
- // scripts is true for back-compat
- // Intentionally let the error be thrown if parseHTML is not present
- jQuery.merge( this, jQuery.parseHTML(
- match[ 1 ],
- context && context.nodeType ? context.ownerDocument || context : document,
- true
- ) );
-
- // HANDLE: $(html, props)
- if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
- for ( match in context ) {
-
- // Properties of context are called as methods if possible
- if ( jQuery.isFunction( this[ match ] ) ) {
- this[ match ]( context[ match ] );
-
- // ...and otherwise set as attributes
- } else {
- this.attr( match, context[ match ] );
- }
- }
- }
-
- return this;
-
- // HANDLE: $(#id)
- } else {
- elem = document.getElementById( match[ 2 ] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
-
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[ 2 ] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[ 0 ] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || root ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(DOMElement)
- } else if ( selector.nodeType ) {
- this.context = this[ 0 ] = selector;
- this.length = 1;
- return this;
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return typeof root.ready !== "undefined" ?
- root.ready( selector ) :
-
- // Execute immediately if ready is not present
- selector( jQuery );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- };
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend( {
- has: function( target ) {
- var i,
- targets = jQuery( target, this ),
- len = targets.length;
-
- return this.filter( function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( this, targets[ i ] ) ) {
- return true;
- }
- }
- } );
- },
-
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- matched = [],
- pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( ; i < l; i++ ) {
- for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
- // Always skip document fragments
- if ( cur.nodeType < 11 && ( pos ?
- pos.index( cur ) > -1 :
-
- // Don't pass non-elements to Sizzle
- cur.nodeType === 1 &&
- jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
- matched.push( cur );
- break;
- }
- }
- }
-
- return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[ 0 ], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
-
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[ 0 ] : elem, this );
- },
-
- add: function( selector, context ) {
- return this.pushStack(
- jQuery.uniqueSort(
- jQuery.merge( this.get(), jQuery( selector, context ) )
- )
- );
- },
-
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
- );
- }
-} );
-
-function sibling( cur, dir ) {
- do {
- cur = cur[ dir ];
- } while ( cur && cur.nodeType !== 1 );
-
- return cur;
-}
-
-jQuery.each( {
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return siblings( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return siblings( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.merge( [], elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until );
-
- if ( name.slice( -5 ) !== "Until" ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- if ( this.length > 1 ) {
-
- // Remove duplicates
- if ( !guaranteedUnique[ name ] ) {
- ret = jQuery.uniqueSort( ret );
- }
-
- // Reverse order for parents* and prev-derivatives
- if ( rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
- }
-
- return this.pushStack( ret );
- };
-} );
-var rnotwhite = ( /\S+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
- var object = {};
- jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
- object[ flag ] = true;
- } );
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * options: an optional list of space-separated options that will change how
- * the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
- // Convert options from String-formatted to Object-formatted if needed
- // (we check in cache first)
- options = typeof options === "string" ?
- createOptions( options ) :
- jQuery.extend( {}, options );
-
- var // Flag to know if list is currently firing
- firing,
-
- // Last fire value for non-forgettable lists
- memory,
-
- // Flag to know if list was already fired
- fired,
-
- // Flag to prevent firing
- locked,
-
- // Actual callback list
- list = [],
-
- // Queue of execution data for repeatable lists
- queue = [],
-
- // Index of currently firing callback (modified by add/remove as needed)
- firingIndex = -1,
-
- // Fire callbacks
- fire = function() {
-
- // Enforce single-firing
- locked = options.once;
-
- // Execute callbacks for all pending executions,
- // respecting firingIndex overrides and runtime changes
- fired = firing = true;
- for ( ; queue.length; firingIndex = -1 ) {
- memory = queue.shift();
- while ( ++firingIndex < list.length ) {
-
- // Run callback and check for early termination
- if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
- options.stopOnFalse ) {
-
- // Jump to end and forget the data so .add doesn't re-fire
- firingIndex = list.length;
- memory = false;
- }
- }
- }
-
- // Forget the data if we're done with it
- if ( !options.memory ) {
- memory = false;
- }
-
- firing = false;
-
- // Clean up if we're done firing for good
- if ( locked ) {
-
- // Keep an empty list if we have data for future add calls
- if ( memory ) {
- list = [];
-
- // Otherwise, this object is spent
- } else {
- list = "";
- }
- }
- },
-
- // Actual Callbacks object
- self = {
-
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
-
- // If we have memory from a past run, we should fire after adding
- if ( memory && !firing ) {
- firingIndex = list.length - 1;
- queue.push( memory );
- }
-
- ( function add( args ) {
- jQuery.each( args, function( _, arg ) {
- if ( jQuery.isFunction( arg ) ) {
- if ( !options.unique || !self.has( arg ) ) {
- list.push( arg );
- }
- } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
-
- // Inspect recursively
- add( arg );
- }
- } );
- } )( arguments );
-
- if ( memory && !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Remove a callback from the list
- remove: function() {
- jQuery.each( arguments, function( _, arg ) {
- var index;
- while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
- list.splice( index, 1 );
-
- // Handle firing indexes
- if ( index <= firingIndex ) {
- firingIndex--;
- }
- }
- } );
- return this;
- },
-
- // Check if a given callback is in the list.
- // If no argument is given, return whether or not list has callbacks attached.
- has: function( fn ) {
- return fn ?
- jQuery.inArray( fn, list ) > -1 :
- list.length > 0;
- },
-
- // Remove all callbacks from the list
- empty: function() {
- if ( list ) {
- list = [];
- }
- return this;
- },
-
- // Disable .fire and .add
- // Abort any current/pending executions
- // Clear all callbacks and values
- disable: function() {
- locked = queue = [];
- list = memory = "";
- return this;
- },
- disabled: function() {
- return !list;
- },
-
- // Disable .fire
- // Also disable .add unless we have memory (since it would have no effect)
- // Abort any pending executions
- lock: function() {
- locked = true;
- if ( !memory ) {
- self.disable();
- }
- return this;
- },
- locked: function() {
- return !!locked;
- },
-
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- if ( !locked ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
- queue.push( args );
- if ( !firing ) {
- fire();
- }
- }
- return this;
- },
-
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
-
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!fired;
- }
- };
-
- return self;
-};
-
-
-jQuery.extend( {
-
- Deferred: function( func ) {
- var tuples = [
-
- // action, add listener, listener list, final state
- [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
- [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
- [ "notify", "progress", jQuery.Callbacks( "memory" ) ]
- ],
- state = "pending",
- promise = {
- state: function() {
- return state;
- },
- always: function() {
- deferred.done( arguments ).fail( arguments );
- return this;
- },
- then: function( /* fnDone, fnFail, fnProgress */ ) {
- var fns = arguments;
- return jQuery.Deferred( function( newDefer ) {
- jQuery.each( tuples, function( i, tuple ) {
- var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-
- // deferred[ done | fail | progress ] for forwarding actions to newDefer
- deferred[ tuple[ 1 ] ]( function() {
- var returned = fn && fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise()
- .progress( newDefer.notify )
- .done( newDefer.resolve )
- .fail( newDefer.reject );
- } else {
- newDefer[ tuple[ 0 ] + "With" ](
- this === promise ? newDefer.promise() : this,
- fn ? [ returned ] : arguments
- );
- }
- } );
- } );
- fns = null;
- } ).promise();
- },
-
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- return obj != null ? jQuery.extend( obj, promise ) : promise;
- }
- },
- deferred = {};
-
- // Keep pipe for back-compat
- promise.pipe = promise.then;
-
- // Add list-specific methods
- jQuery.each( tuples, function( i, tuple ) {
- var list = tuple[ 2 ],
- stateString = tuple[ 3 ];
-
- // promise[ done | fail | progress ] = list.add
- promise[ tuple[ 1 ] ] = list.add;
-
- // Handle state
- if ( stateString ) {
- list.add( function() {
-
- // state = [ resolved | rejected ]
- state = stateString;
-
- // [ reject_list | resolve_list ].disable; progress_list.lock
- }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
- }
-
- // deferred[ resolve | reject | notify ]
- deferred[ tuple[ 0 ] ] = function() {
- deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
- return this;
- };
- deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
- } );
-
- // Make the deferred a promise
- promise.promise( deferred );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( subordinate /* , ..., subordinateN */ ) {
- var i = 0,
- resolveValues = slice.call( arguments ),
- length = resolveValues.length,
-
- // the count of uncompleted subordinates
- remaining = length !== 1 ||
- ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
- // the master Deferred.
- // If resolveValues consist of only a single Deferred, just use that.
- deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
- // Update function for both resolve and progress values
- updateFunc = function( i, contexts, values ) {
- return function( value ) {
- contexts[ i ] = this;
- values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
- if ( values === progressValues ) {
- deferred.notifyWith( contexts, values );
-
- } else if ( !( --remaining ) ) {
- deferred.resolveWith( contexts, values );
- }
- };
- },
-
- progressValues, progressContexts, resolveContexts;
-
- // add listeners to Deferred subordinates; treat others as resolved
- if ( length > 1 ) {
- progressValues = new Array( length );
- progressContexts = new Array( length );
- resolveContexts = new Array( length );
- for ( ; i < length; i++ ) {
- if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
- resolveValues[ i ].promise()
- .progress( updateFunc( i, progressContexts, progressValues ) )
- .done( updateFunc( i, resolveContexts, resolveValues ) )
- .fail( deferred.reject );
- } else {
- --remaining;
- }
- }
- }
-
- // if we're not waiting on anything, resolve the master
- if ( !remaining ) {
- deferred.resolveWith( resolveContexts, resolveValues );
- }
-
- return deferred.promise();
- }
-} );
-
-
-// The deferred used on DOM ready
-var readyList;
-
-jQuery.fn.ready = function( fn ) {
-
- // Add the callback
- jQuery.ready.promise().done( fn );
-
- return this;
-};
-
-jQuery.extend( {
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
-
- // Abort if there are pending holds or we're already ready
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
- return;
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.triggerHandler ) {
- jQuery( document ).triggerHandler( "ready" );
- jQuery( document ).off( "ready" );
- }
- }
-} );
-
-/**
- * Clean-up method for dom ready events
- */
-function detach() {
- if ( document.addEventListener ) {
- document.removeEventListener( "DOMContentLoaded", completed );
- window.removeEventListener( "load", completed );
-
- } else {
- document.detachEvent( "onreadystatechange", completed );
- window.detachEvent( "onload", completed );
- }
-}
-
-/**
- * The ready event handler and self cleanup method
- */
-function completed() {
-
- // readyState === "complete" is good enough for us to call the dom ready in oldIE
- if ( document.addEventListener ||
- window.event.type === "load" ||
- document.readyState === "complete" ) {
-
- detach();
- jQuery.ready();
- }
-}
-
-jQuery.ready.promise = function( obj ) {
- if ( !readyList ) {
-
- readyList = jQuery.Deferred();
-
- // Catch cases where $(document).ready() is called
- // after the browser event has already occurred.
- // Support: IE6-10
- // Older IE sometimes signals "interactive" too soon
- if ( document.readyState === "complete" ||
- ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- window.setTimeout( jQuery.ready );
-
- // Standards-based browsers support DOMContentLoaded
- } else if ( document.addEventListener ) {
-
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", completed );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", completed );
-
- // If IE event model is used
- } else {
-
- // Ensure firing before onload, maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", completed );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", completed );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var top = false;
-
- try {
- top = window.frameElement == null && document.documentElement;
- } catch ( e ) {}
-
- if ( top && top.doScroll ) {
- ( function doScrollCheck() {
- if ( !jQuery.isReady ) {
-
- try {
-
- // Use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- top.doScroll( "left" );
- } catch ( e ) {
- return window.setTimeout( doScrollCheck, 50 );
- }
-
- // detach all dom ready events
- detach();
-
- // and execute any waiting functions
- jQuery.ready();
- }
- } )();
- }
- }
- }
- return readyList.promise( obj );
-};
-
-// Kick off the DOM ready check even if the user does not
-jQuery.ready.promise();
-
-
-
-
-// Support: IE<9
-// Iteration over object's inherited properties before its own
-var i;
-for ( i in jQuery( support ) ) {
- break;
-}
-support.ownFirst = i === "0";
-
-// Note: most support tests are defined in their respective modules.
-// false until the test is run
-support.inlineBlockNeedsLayout = false;
-
-// Execute ASAP in case we need to set body.style.zoom
-jQuery( function() {
-
- // Minified: var a,b,c,d
- var val, div, body, container;
-
- body = document.getElementsByTagName( "body" )[ 0 ];
- if ( !body || !body.style ) {
-
- // Return for frameset docs that don't have a body
- return;
- }
-
- // Setup
- div = document.createElement( "div" );
- container = document.createElement( "div" );
- container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
- body.appendChild( container ).appendChild( div );
-
- if ( typeof div.style.zoom !== "undefined" ) {
-
- // Support: IE<8
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
-
- support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
- if ( val ) {
-
- // Prevent IE 6 from affecting layout for positioned elements #11048
- // Prevent IE from shrinking the body in IE 7 mode #12869
- // Support: IE<8
- body.style.zoom = 1;
- }
- }
-
- body.removeChild( container );
-} );
-
-
-( function() {
- var div = document.createElement( "div" );
-
- // Support: IE<9
- support.deleteExpando = true;
- try {
- delete div.test;
- } catch ( e ) {
- support.deleteExpando = false;
- }
-
- // Null elements to avoid leaks in IE.
- div = null;
-} )();
-var acceptData = function( elem ) {
- var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
- nodeType = +elem.nodeType || 1;
-
- // Do not set data on non-element DOM nodes because it will not be cleared (#8335).
- return nodeType !== 1 && nodeType !== 9 ?
- false :
-
- // Nodes accept data unless otherwise specified; rejection can be conditional
- !noData || noData !== true && elem.getAttribute( "classid" ) === noData;
-};
-
-
-
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
- rmultiDash = /([A-Z])/g;
-
-function dataAttr( elem, key, data ) {
-
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
-
- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
-
- // Only convert to a number if it doesn't change the string
- +data + "" === data ? +data :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch ( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
- var name;
- for ( name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) {
- continue;
- }
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !acceptData( elem ) ) {
- return;
- }
-
- var ret, thisCache,
- internalKey = jQuery.expando,
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&
- data === undefined && typeof name === "string" ) {
- return;
- }
-
- if ( !id ) {
-
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
- } else {
- id = internalKey;
- }
- }
-
- if ( !cache[ id ] ) {
-
- // Avoid exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
- }
-
- thisCache = cache[ id ];
-
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
- }
-
- thisCache = thisCache.data;
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( typeof name === "string" ) {
-
- // First Try to find as-is property data
- ret = thisCache[ name ];
-
- // Test for null|undefined property data
- if ( ret == null ) {
-
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
- }
-
- return ret;
-}
-
-function internalRemoveData( elem, name, pvt ) {
- if ( !acceptData( elem ) ) {
- return;
- }
-
- var thisCache, i,
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
-
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
- if ( thisCache ) {
-
- // Support array or space separated string names for data keys
- if ( !jQuery.isArray( name ) ) {
-
- // try the string as a key before any manipulation
- if ( name in thisCache ) {
- name = [ name ];
- } else {
-
- // split the camel cased version by spaces unless a key with the spaces exists
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split( " " );
- }
- }
- } else {
-
- // If "name" is an array of keys...
- // When data is initially created, via ("key", "val") signature,
- // keys will be converted to camelCase.
- // Since there is no way to tell _how_ a key was added, remove
- // both plain key and camelCase key. #12786
- // This will only penalize the array argument path.
- name = name.concat( jQuery.map( name, jQuery.camelCase ) );
- }
-
- i = name.length;
- while ( i-- ) {
- delete thisCache[ name[ i ] ];
- }
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject( cache[ id ] ) ) {
- return;
- }
- }
-
- // Destroy the cache
- if ( isNode ) {
- jQuery.cleanData( [ elem ], true );
-
- // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
- /* jshint eqeqeq: false */
- } else if ( support.deleteExpando || cache != cache.window ) {
- /* jshint eqeqeq: true */
- delete cache[ id ];
-
- // When all else fails, undefined
- } else {
- cache[ id ] = undefined;
- }
-}
-
-jQuery.extend( {
- cache: {},
-
- // The following elements (space-suffixed to avoid Object.prototype collisions)
- // throw uncatchable exceptions if you attempt to set expando properties
- noData: {
- "applet ": true,
- "embed ": true,
-
- // ...but Flash objects (which have this classid) *can* handle expandos
- "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data ) {
- return internalData( elem, name, data );
- },
-
- removeData: function( elem, name ) {
- return internalRemoveData( elem, name );
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return internalData( elem, name, data, true );
- },
-
- _removeData: function( elem, name ) {
- return internalRemoveData( elem, name, true );
- }
-} );
-
-jQuery.fn.extend( {
- data: function( key, value ) {
- var i, name, data,
- elem = this[ 0 ],
- attrs = elem && elem.attributes;
-
- // Special expections of .data basically thwart jQuery.access,
- // so implement the relevant behavior ourselves
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = jQuery.data( elem );
-
- if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- i = attrs.length;
- while ( i-- ) {
-
- // Support: IE11+
- // The attrs elements can be null (#14894)
- if ( attrs[ i ] ) {
- name = attrs[ i ].name;
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.slice( 5 ) );
- dataAttr( elem, name, data[ name ] );
- }
- }
- }
- jQuery._data( elem, "parsedAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each( function() {
- jQuery.data( this, key );
- } );
- }
-
- return arguments.length > 1 ?
-
- // Sets one value
- this.each( function() {
- jQuery.data( this, key, value );
- } ) :
-
- // Gets one value
- // Try to fetch any internally stored data first
- elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
- },
-
- removeData: function( key ) {
- return this.each( function() {
- jQuery.removeData( this, key );
- } );
- }
-} );
-
-
-jQuery.extend( {
- queue: function( elem, type, data ) {
- var queue;
-
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- queue = jQuery._data( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !queue || jQuery.isArray( data ) ) {
- queue = jQuery._data( elem, type, jQuery.makeArray( data ) );
- } else {
- queue.push( data );
- }
- }
- return queue || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- startLength = queue.length,
- fn = queue.shift(),
- hooks = jQuery._queueHooks( elem, type ),
- next = function() {
- jQuery.dequeue( elem, type );
- };
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- startLength--;
- }
-
- if ( fn ) {
-
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- // clear up the last queue stop function
- delete hooks.stop;
- fn.call( elem, next, hooks );
- }
-
- if ( !startLength && hooks ) {
- hooks.empty.fire();
- }
- },
-
- // not intended for public consumption - generates a queueHooks object,
- // or returns the current one
- _queueHooks: function( elem, type ) {
- var key = type + "queueHooks";
- return jQuery._data( elem, key ) || jQuery._data( elem, key, {
- empty: jQuery.Callbacks( "once memory" ).add( function() {
- jQuery._removeData( elem, type + "queue" );
- jQuery._removeData( elem, key );
- } )
- } );
- }
-} );
-
-jQuery.fn.extend( {
- queue: function( type, data ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[ 0 ], type );
- }
-
- return data === undefined ?
- this :
- this.each( function() {
- var queue = jQuery.queue( this, type, data );
-
- // ensure a hooks for this queue
- jQuery._queueHooks( this, type );
-
- if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- } );
- },
- dequeue: function( type ) {
- return this.each( function() {
- jQuery.dequeue( this, type );
- } );
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
-
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, obj ) {
- var tmp,
- count = 1,
- defer = jQuery.Deferred(),
- elements = this,
- i = this.length,
- resolve = function() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- };
-
- if ( typeof type !== "string" ) {
- obj = type;
- type = undefined;
- }
- type = type || "fx";
-
- while ( i-- ) {
- tmp = jQuery._data( elements[ i ], type + "queueHooks" );
- if ( tmp && tmp.empty ) {
- count++;
- tmp.empty.add( resolve );
- }
- }
- resolve();
- return defer.promise( obj );
- }
-} );
-
-
-( function() {
- var shrinkWrapBlocksVal;
-
- support.shrinkWrapBlocks = function() {
- if ( shrinkWrapBlocksVal != null ) {
- return shrinkWrapBlocksVal;
- }
-
- // Will be changed later if needed.
- shrinkWrapBlocksVal = false;
-
- // Minified: var b,c,d
- var div, body, container;
-
- body = document.getElementsByTagName( "body" )[ 0 ];
- if ( !body || !body.style ) {
-
- // Test fired too early or in an unsupported environment, exit.
- return;
- }
-
- // Setup
- div = document.createElement( "div" );
- container = document.createElement( "div" );
- container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
- body.appendChild( container ).appendChild( div );
-
- // Support: IE6
- // Check if elements with layout shrink-wrap their children
- if ( typeof div.style.zoom !== "undefined" ) {
-
- // Reset CSS: box-sizing; display; margin; border
- div.style.cssText =
-
- // Support: Firefox<29, Android 2.3
- // Vendor-prefix box-sizing
- "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
- "box-sizing:content-box;display:block;margin:0;border:0;" +
- "padding:1px;width:1px;zoom:1";
- div.appendChild( document.createElement( "div" ) ).style.width = "5px";
- shrinkWrapBlocksVal = div.offsetWidth !== 3;
- }
-
- body.removeChild( container );
-
- return shrinkWrapBlocksVal;
- };
-
-} )();
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var isHidden = function( elem, el ) {
-
- // isHidden might be called from jQuery#filter function;
- // in that case, element will be second argument
- elem = el || elem;
- return jQuery.css( elem, "display" ) === "none" ||
- !jQuery.contains( elem.ownerDocument, elem );
- };
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
- var adjusted,
- scale = 1,
- maxIterations = 20,
- currentValue = tween ?
- function() { return tween.cur(); } :
- function() { return jQuery.css( elem, prop, "" ); },
- initial = currentValue(),
- unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
- // Starting value computation is required for potential unit mismatches
- initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
- rcssNum.exec( jQuery.css( elem, prop ) );
-
- if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
- // Trust units reported by jQuery.css
- unit = unit || initialInUnit[ 3 ];
-
- // Make sure we update the tween properties later on
- valueParts = valueParts || [];
-
- // Iteratively approximate from a nonzero starting point
- initialInUnit = +initial || 1;
-
- do {
-
- // If previous iteration zeroed out, double until we get *something*.
- // Use string for doubling so we don't accidentally see scale as unchanged below
- scale = scale || ".5";
-
- // Adjust and apply
- initialInUnit = initialInUnit / scale;
- jQuery.style( elem, prop, initialInUnit + unit );
-
- // Update scale, tolerating zero or NaN from tween.cur()
- // Break the loop if scale is unchanged or perfect, or if we've just had enough.
- } while (
- scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
- );
- }
-
- if ( valueParts ) {
- initialInUnit = +initialInUnit || +initial || 0;
-
- // Apply relative offset (+=/-=) if specified
- adjusted = valueParts[ 1 ] ?
- initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
- +valueParts[ 2 ];
- if ( tween ) {
- tween.unit = unit;
- tween.start = initialInUnit;
- tween.end = adjusted;
- }
- }
- return adjusted;
-}
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
- var i = 0,
- length = elems.length,
- bulk = key == null;
-
- // Sets many values
- if ( jQuery.type( key ) === "object" ) {
- chainable = true;
- for ( i in key ) {
- access( elems, fn, i, key[ i ], true, emptyGet, raw );
- }
-
- // Sets one value
- } else if ( value !== undefined ) {
- chainable = true;
-
- if ( !jQuery.isFunction( value ) ) {
- raw = true;
- }
-
- if ( bulk ) {
-
- // Bulk operations run against the entire set
- if ( raw ) {
- fn.call( elems, value );
- fn = null;
-
- // ...except when executing function values
- } else {
- bulk = fn;
- fn = function( elem, key, value ) {
- return bulk.call( jQuery( elem ), value );
- };
- }
- }
-
- if ( fn ) {
- for ( ; i < length; i++ ) {
- fn(
- elems[ i ],
- key,
- raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
- );
- }
- }
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- length ? fn( elems[ 0 ], key ) : emptyGet;
-};
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([\w:-]+)/ );
-
-var rscriptType = ( /^$|\/(?:java|ecma)script/i );
-
-var rleadingWhitespace = ( /^\s+/ );
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
- "details|dialog|figcaption|figure|footer|header|hgroup|main|" +
- "mark|meter|nav|output|picture|progress|section|summary|template|time|video";
-
-
-
-function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
-
-
-( function() {
- var div = document.createElement( "div" ),
- fragment = document.createDocumentFragment(),
- input = document.createElement( "input" );
-
- // Setup
- div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
- // IE strips leading whitespace when .innerHTML is used
- support.leadingWhitespace = div.firstChild.nodeType === 3;
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- support.tbody = !div.getElementsByTagName( "tbody" ).length;
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
-
- // Makes sure cloning an html5 element does not cause problems
- // Where outerHTML is undefined, this still works
- support.html5Clone =
- document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- input.type = "checkbox";
- input.checked = true;
- fragment.appendChild( input );
- support.appendChecked = input.checked;
-
- // Make sure textarea (and checkbox) defaultValue is properly cloned
- // Support: IE6-IE11+
- div.innerHTML = "<textarea>x</textarea>";
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-
- // #11217 - WebKit loses check when the name is after the checked attribute
- fragment.appendChild( div );
-
- // Support: Windows Web Apps (WWA)
- // `name` and `type` must use .setAttribute for WWA (#14901)
- input = document.createElement( "input" );
- input.setAttribute( "type", "radio" );
- input.setAttribute( "checked", "checked" );
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
-
- // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
- // old WebKit doesn't clone checked state correctly in fragments
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Support: IE<9
- // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
- support.noCloneEvent = !!div.addEventListener;
-
- // Support: IE<9
- // Since attributes and properties are the same in IE,
- // cleanData must set properties to undefined rather than use removeAttribute
- div[ jQuery.expando ] = 1;
- support.attributes = !div.getAttribute( jQuery.expando );
-} )();
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
- legend: [ 1, "<fieldset>", "</fieldset>" ],
- area: [ 1, "<map>", "</map>" ],
-
- // Support: IE8
- param: [ 1, "<object>", "</object>" ],
- thead: [ 1, "<table>", "</table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
- // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
- // unless wrapped in a div with non-breaking characters in front of it.
- _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
-};
-
-// Support: IE8-IE9
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-
-function getAll( context, tag ) {
- var elems, elem,
- i = 0,
- found = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( tag || "*" ) :
- typeof context.querySelectorAll !== "undefined" ?
- context.querySelectorAll( tag || "*" ) :
- undefined;
-
- if ( !found ) {
- for ( found = [], elems = context.childNodes || context;
- ( elem = elems[ i ] ) != null;
- i++
- ) {
- if ( !tag || jQuery.nodeName( elem, tag ) ) {
- found.push( elem );
- } else {
- jQuery.merge( found, getAll( elem, tag ) );
- }
- }
- }
-
- return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
- jQuery.merge( [ context ], found ) :
- found;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
- var elem,
- i = 0;
- for ( ; ( elem = elems[ i ] ) != null; i++ ) {
- jQuery._data(
- elem,
- "globalEval",
- !refElements || jQuery._data( refElements[ i ], "globalEval" )
- );
- }
-}
-
-
-var rhtml = /<|&#?\w+;/,
- rtbody = /<tbody/i;
-
-function fixDefaultChecked( elem ) {
- if ( rcheckableType.test( elem.type ) ) {
- elem.defaultChecked = elem.checked;
- }
-}
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
- var j, elem, contains,
- tmp, tag, tbody, wrap,
- l = elems.length,
-
- // Ensure a safe fragment
- safe = createSafeFragment( context ),
-
- nodes = [],
- i = 0;
-
- for ( ; i < l; i++ ) {
- elem = elems[ i ];
-
- if ( elem || elem === 0 ) {
-
- // Add nodes directly
- if ( jQuery.type( elem ) === "object" ) {
- jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
- // Convert non-html into a text node
- } else if ( !rhtml.test( elem ) ) {
- nodes.push( context.createTextNode( elem ) );
-
- // Convert html into DOM nodes
- } else {
- tmp = tmp || safe.appendChild( context.createElement( "div" ) );
-
- // Deserialize a standard representation
- tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
- wrap = wrapMap[ tag ] || wrapMap._default;
-
- tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
- // Descend through wrappers to the right content
- j = wrap[ 0 ];
- while ( j-- ) {
- tmp = tmp.lastChild;
- }
-
- // Manually add leading whitespace removed by IE
- if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
- nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );
- }
-
- // Remove IE's autoinserted <tbody> from table fragments
- if ( !support.tbody ) {
-
- // String was a <table>, *may* have spurious <tbody>
- elem = tag === "table" && !rtbody.test( elem ) ?
- tmp.firstChild :
-
- // String was a bare <thead> or <tfoot>
- wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ?
- tmp :
- 0;
-
- j = elem && elem.childNodes.length;
- while ( j-- ) {
- if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
- !tbody.childNodes.length ) {
-
- elem.removeChild( tbody );
- }
- }
- }
-
- jQuery.merge( nodes, tmp.childNodes );
-
- // Fix #12392 for WebKit and IE > 9
- tmp.textContent = "";
-
- // Fix #12392 for oldIE
- while ( tmp.firstChild ) {
- tmp.removeChild( tmp.firstChild );
- }
-
- // Remember the top-level container for proper cleanup
- tmp = safe.lastChild;
- }
- }
- }
-
- // Fix #11356: Clear elements from fragment
- if ( tmp ) {
- safe.removeChild( tmp );
- }
-
- // Reset defaultChecked for any radios and checkboxes
- // about to be appended to the DOM in IE 6/7 (#8060)
- if ( !support.appendChecked ) {
- jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
- }
-
- i = 0;
- while ( ( elem = nodes[ i++ ] ) ) {
-
- // Skip elements already in the context collection (trac-4087)
- if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
- if ( ignored ) {
- ignored.push( elem );
- }
-
- continue;
- }
-
- contains = jQuery.contains( elem.ownerDocument, elem );
-
- // Append to fragment
- tmp = getAll( safe.appendChild( elem ), "script" );
-
- // Preserve script evaluation history
- if ( contains ) {
- setGlobalEval( tmp );
- }
-
- // Capture executables
- if ( scripts ) {
- j = 0;
- while ( ( elem = tmp[ j++ ] ) ) {
- if ( rscriptType.test( elem.type || "" ) ) {
- scripts.push( elem );
- }
- }
- }
- }
-
- tmp = null;
-
- return safe;
-}
-
-
-( function() {
- var i, eventName,
- div = document.createElement( "div" );
-
- // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
- for ( i in { submit: true, change: true, focusin: true } ) {
- eventName = "on" + i;
-
- if ( !( support[ i ] = eventName in window ) ) {
-
- // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
- div.setAttribute( eventName, "t" );
- support[ i ] = div.attributes[ eventName ].expando === false;
- }
- }
-
- // Null elements to avoid leaks in IE.
- div = null;
-} )();
-
-
-var rformElems = /^(?:input|select|textarea)$/i,
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
- return true;
-}
-
-function returnFalse() {
- return false;
-}
-
-// Support: IE9
-// See #13393 for more info
-function safeActiveElement() {
- try {
- return document.activeElement;
- } catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
-
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) {
-
- // ( types-Object, data )
- data = data || selector;
- selector = undefined;
- }
- for ( type in types ) {
- on( elem, type, selector, data, types[ type ], one );
- }
- return elem;
- }
-
- if ( data == null && fn == null ) {
-
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
-
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
-
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return elem;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
-
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
-
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return elem.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- } );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- global: {},
-
- add: function( elem, types, handler, data, selector ) {
- var tmp, events, t, handleObjIn,
- special, eventHandle, handleObj,
- handlers, type, namespaces, origType,
- elemData = jQuery._data( elem );
-
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
- if ( !elemData ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- selector = handleObjIn.selector;
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- if ( !( events = elemData.events ) ) {
- events = elemData.events = {};
- }
- if ( !( eventHandle = elemData.handle ) ) {
- eventHandle = elemData.handle = function( e ) {
-
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" &&
- ( !e || jQuery.event.triggered !== e.type ) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
- undefined;
- };
-
- // Add elem as a property of the handle fn to prevent a memory leak
- // with IE non-native events
- eventHandle.elem = elem;
- }
-
- // Handle multiple events separated by a space
- types = ( types || "" ).match( rnotwhite ) || [ "" ];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
- // There *must* be a type, no attaching namespace-only handlers
- if ( !type ) {
- continue;
- }
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend( {
- type: type,
- origType: origType,
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
- namespace: namespaces.join( "." )
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- if ( !( handlers = events[ type ] ) ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener/attachEvent if the special events handler returns false
- if ( !special.setup ||
- special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
- var j, handleObj, tmp,
- origCount, t, events,
- special, handlers, type,
- namespaces, origType,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
- if ( !elemData || !( events = elemData.events ) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( rnotwhite ) || [ "" ];
- t = types.length;
- while ( t-- ) {
- tmp = rtypenamespace.exec( types[ t ] ) || [];
- type = origType = tmp[ 1 ];
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector ? special.delegateType : special.bindType ) || type;
- handlers = events[ type ] || [];
- tmp = tmp[ 2 ] &&
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
- // Remove matching events
- origCount = j = handlers.length;
- while ( j-- ) {
- handleObj = handlers[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !tmp || tmp.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector ||
- selector === "**" && handleObj.selector ) ) {
- handlers.splice( j, 1 );
-
- if ( handleObj.selector ) {
- handlers.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( origCount && !handlers.length ) {
- if ( !special.teardown ||
- special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- delete elemData.handle;
-
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery._removeData( elem, "events" );
- }
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- var handle, ontype, cur,
- bubbleType, special, tmp, i,
- eventPath = [ elem || document ],
- type = hasOwn.call( event, "type" ) ? event.type : event,
- namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
- cur = tmp = elem = elem || document;
-
- // Don't do events on text and comment nodes
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
- return;
- }
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf( "." ) > -1 ) {
-
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split( "." );
- type = namespaces.shift();
- namespaces.sort();
- }
- ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
- // Caller can pass in a jQuery.Event object, Object, or just an event type string
- event = event[ jQuery.expando ] ?
- event :
- new jQuery.Event( type, typeof event === "object" && event );
-
- // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
- event.isTrigger = onlyHandlers ? 2 : 3;
- event.namespace = namespaces.join( "." );
- event.rnamespace = event.namespace ?
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
- null;
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data == null ?
- [ event ] :
- jQuery.makeArray( data, [ event ] );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- if ( !rfocusMorph.test( bubbleType + type ) ) {
- cur = cur.parentNode;
- }
- for ( ; cur; cur = cur.parentNode ) {
- eventPath.push( cur );
- tmp = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( tmp === ( elem.ownerDocument || document ) ) {
- eventPath.push( tmp.defaultView || tmp.parentWindow || window );
- }
- }
-
- // Fire handlers on the event path
- i = 0;
- while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-
- event.type = i > 1 ?
- bubbleType :
- special.bindType || type;
-
- // jQuery handler
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
- jQuery._data( cur, "handle" );
-
- if ( handle ) {
- handle.apply( cur, data );
- }
-
- // Native handler
- handle = ontype && cur[ ontype ];
- if ( handle && handle.apply && acceptData( cur ) ) {
- event.result = handle.apply( cur, data );
- if ( event.result === false ) {
- event.preventDefault();
- }
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if (
- ( !special._default ||
- special._default.apply( eventPath.pop(), data ) === false
- ) && acceptData( elem )
- ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- tmp = elem[ ontype ];
-
- if ( tmp ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- try {
- elem[ type ]();
- } catch ( e ) {
-
- // IE<9 dies on focus/blur to hidden element (#1486,#12518)
- // only reproducible on winXP IE8 native, not IE9 in IE8 mode
- }
- jQuery.event.triggered = undefined;
-
- if ( tmp ) {
- elem[ ontype ] = tmp;
- }
- }
- }
- }
-
- return event.result;
- },
-
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event );
-
- var i, j, ret, matched, handleObj,
- handlerQueue = [],
- args = slice.call( arguments ),
- handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
- special = jQuery.event.special[ event.type ] || {};
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[ 0 ] = event;
- event.delegateTarget = this;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers
- handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
- // Run delegates first; they may want to stop propagation beneath us
- i = 0;
- while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
- event.currentTarget = matched.elem;
-
- j = 0;
- while ( ( handleObj = matched.handlers[ j++ ] ) &&
- !event.isImmediatePropagationStopped() ) {
-
- // Triggered event must either 1) have no namespace, or 2) have namespace(s)
- // a subset or equal to those in the bound event (both can have no namespace).
- if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
- event.handleObj = handleObj;
- event.data = handleObj.data;
-
- ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
- handleObj.handler ).apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- if ( ( event.result = ret ) === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- return event.result;
- },
-
- handlers: function( event, handlers ) {
- var i, matches, sel, handleObj,
- handlerQueue = [],
- delegateCount = handlers.delegateCount,
- cur = event.target;
-
- // Support (at least): Chrome, IE9
- // Find delegate handlers
- // Black-hole SVG <use> instance trees (#13180)
- //
- // Support: Firefox<=42+
- // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
- if ( delegateCount && cur.nodeType &&
- ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
-
- /* jshint eqeqeq: false */
- for ( ; cur != this; cur = cur.parentNode || this ) {
- /* jshint eqeqeq: true */
-
- // Don't check non-elements (#13208)
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
- matches = [];
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
-
- // Don't conflict with Object.prototype properties (#13203)
- sel = handleObj.selector + " ";
-
- if ( matches[ sel ] === undefined ) {
- matches[ sel ] = handleObj.needsContext ?
- jQuery( sel, this ).index( cur ) > -1 :
- jQuery.find( sel, this, null, [ cur ] ).length;
- }
- if ( matches[ sel ] ) {
- matches.push( handleObj );
- }
- }
- if ( matches.length ) {
- handlerQueue.push( { elem: cur, handlers: matches } );
- }
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( delegateCount < handlers.length ) {
- handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
- }
-
- return handlerQueue;
- },
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop, copy,
- type = event.type,
- originalEvent = event,
- fixHook = this.fixHooks[ type ];
-
- if ( !fixHook ) {
- this.fixHooks[ type ] = fixHook =
- rmouseEvent.test( type ) ? this.mouseHooks :
- rkeyEvent.test( type ) ? this.keyHooks :
- {};
- }
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = new jQuery.Event( originalEvent );
-
- i = copy.length;
- while ( i-- ) {
- prop = copy[ i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Support: IE<9
- // Fix target property (#1925)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Support: Safari 6-8+
- // Target should not be a text node (#504, #13143)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // Support: IE<9
- // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
- event.metaKey = !!event.metaKey;
-
- return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
- "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
-
- fixHooks: {},
-
- keyHooks: {
- props: "char charCode key keyCode".split( " " ),
- filter: function( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks: {
- props: ( "button buttons clientX clientY fromElement offsetX offsetY " +
- "pageX pageY screenX screenY toElement" ).split( " " ),
- filter: function( event, original ) {
- var body, eventDoc, doc,
- button = original.button,
- fromElement = original.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX +
- ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
- ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY +
- ( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
- ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ?
- original.toElement :
- fromElement;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
-
- special: {
- load: {
-
- // Prevent triggered image.load events from bubbling to window.load
- noBubble: true
- },
- focus: {
-
- // Fire native event if possible so blur/focus sequence is correct
- trigger: function() {
- if ( this !== safeActiveElement() && this.focus ) {
- try {
- this.focus();
- return false;
- } catch ( e ) {
-
- // Support: IE<9
- // If we error on focus to hidden element (#1486, #12518),
- // let .trigger() run the handlers
- }
- }
- },
- delegateType: "focusin"
- },
- blur: {
- trigger: function() {
- if ( this === safeActiveElement() && this.blur ) {
- this.blur();
- return false;
- }
- },
- delegateType: "focusout"
- },
- click: {
-
- // For checkbox, fire native event so checked state will be right
- trigger: function() {
- if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
- this.click();
- return false;
- }
- },
-
- // For cross-browser consistency, don't fire native .click() on links
- _default: function( event ) {
- return jQuery.nodeName( event.target, "a" );
- }
- },
-
- beforeunload: {
- postDispatch: function( event ) {
-
- // Support: Firefox 20+
- // Firefox doesn't alert if the returnValue field is not set.
- if ( event.result !== undefined && event.originalEvent ) {
- event.originalEvent.returnValue = event.result;
- }
- }
- }
- },
-
- // Piggyback on a donor event to simulate a different one
- simulate: function( type, elem, event ) {
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- {
- type: type,
- isSimulated: true
-
- // Previously, `originalEvent: {}` was set here, so stopPropagation call
- // would not be triggered on donor event, since in our own
- // jQuery.event.stopPropagation function we had a check for existence of
- // originalEvent.stopPropagation method, so, consequently it would be a noop.
- //
- // Guard for simulated events was moved to jQuery.event.stopPropagation function
- // since `originalEvent` should point to the original event for the
- // constancy with other events and for more focused logic
- }
- );
-
- jQuery.event.trigger( e, null, elem );
-
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
-};
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
-
- // This "if" is needed for plain objects
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle );
- }
- } :
- function( elem, type, handle ) {
- var name = "on" + type;
-
- if ( elem.detachEvent ) {
-
- // #8545, #7054, preventing memory leaks for custom events in IE6-8
- // detachEvent needed property on element, by name of that event,
- // to properly expose it to GC
- if ( typeof elem[ name ] === "undefined" ) {
- elem[ name ] = null;
- }
-
- elem.detachEvent( name, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
-
- // Allow instantiation without the 'new' keyword
- if ( !( this instanceof jQuery.Event ) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = src.defaultPrevented ||
- src.defaultPrevented === undefined &&
-
- // Support: IE < 9, Android < 4.0
- src.returnValue === false ?
- returnTrue :
- returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- constructor: jQuery.Event,
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse,
-
- preventDefault: function() {
- var e = this.originalEvent;
-
- this.isDefaultPrevented = returnTrue;
- if ( !e ) {
- return;
- }
-
- // If preventDefault exists, run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // Support: IE
- // Otherwise set the returnValue property of the original event to false
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- var e = this.originalEvent;
-
- this.isPropagationStopped = returnTrue;
-
- if ( !e || this.isSimulated ) {
- return;
- }
-
- // If stopPropagation exists, run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
-
- // Support: IE
- // Set the cancelBubble property of the original event to true
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- var e = this.originalEvent;
-
- this.isImmediatePropagationStopped = returnTrue;
-
- if ( e && e.stopImmediatePropagation ) {
- e.stopImmediatePropagation();
- }
-
- this.stopPropagation();
- }
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://code.google.com/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
- mouseenter: "mouseover",
- mouseleave: "mouseout",
- pointerenter: "pointerover",
- pointerleave: "pointerout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var ret,
- target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj;
-
- // For mouseenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
-} );
-
-// IE submit delegation
-if ( !support.submit ) {
-
- jQuery.event.special.submit = {
- setup: function() {
-
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ?
-
- // Support: IE <=8
- // We use jQuery.prop instead of elem.form
- // to allow fixing the IE8 delegated submit issue (gh-2332)
- // by 3rd party polyfills/workarounds.
- jQuery.prop( elem, "form" ) :
- undefined;
-
- if ( form && !jQuery._data( form, "submit" ) ) {
- jQuery.event.add( form, "submit._submit", function( event ) {
- event._submitBubble = true;
- } );
- jQuery._data( form, "submit", true );
- }
- } );
-
- // return undefined since we don't need an event listener
- },
-
- postDispatch: function( event ) {
-
- // If form was submitted by the user, bubble the event up the tree
- if ( event._submitBubble ) {
- delete event._submitBubble;
- if ( this.parentNode && !event.isTrigger ) {
- jQuery.event.simulate( "submit", this.parentNode, event );
- }
- }
- },
-
- teardown: function() {
-
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
- }
- };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !support.change ) {
-
- jQuery.event.special.change = {
-
- setup: function() {
-
- if ( rformElems.test( this.nodeName ) ) {
-
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._justChanged = true;
- }
- } );
- jQuery.event.add( this, "click._change", function( event ) {
- if ( this._justChanged && !event.isTrigger ) {
- this._justChanged = false;
- }
-
- // Allow triggered, simulated change events (#11500)
- jQuery.event.simulate( "change", this, event );
- } );
- }
- return false;
- }
-
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function( e ) {
- var elem = e.target;
-
- if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) {
- jQuery.event.add( elem, "change._change", function( event ) {
- if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
- jQuery.event.simulate( "change", this.parentNode, event );
- }
- } );
- jQuery._data( elem, "change", true );
- }
- } );
- },
-
- handle: function( event ) {
- var elem = event.target;
-
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger ||
- ( elem.type !== "radio" && elem.type !== "checkbox" ) ) {
-
- return event.handleObj.handler.apply( this, arguments );
- }
- },
-
- teardown: function() {
- jQuery.event.remove( this, "._change" );
-
- return !rformElems.test( this.nodeName );
- }
- };
-}
-
-// Support: Firefox
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome, Safari
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler on the document while someone wants focusin/focusout
- var handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- var doc = this.ownerDocument || this,
- attaches = jQuery._data( doc, fix );
-
- if ( !attaches ) {
- doc.addEventListener( orig, handler, true );
- }
- jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
- },
- teardown: function() {
- var doc = this.ownerDocument || this,
- attaches = jQuery._data( doc, fix ) - 1;
-
- if ( !attaches ) {
- doc.removeEventListener( orig, handler, true );
- jQuery._removeData( doc, fix );
- } else {
- jQuery._data( doc, fix, attaches );
- }
- }
- };
- } );
-}
-
-jQuery.fn.extend( {
-
- on: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn );
- },
- one: function( types, selector, data, fn ) {
- return on( this, types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- var handleObj, type;
- if ( types && types.preventDefault && types.handleObj ) {
-
- // ( event ) dispatched jQuery.Event
- handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ?
- handleObj.origType + "." + handleObj.namespace :
- handleObj.origType,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
-
- // ( types-object [, selector] )
- for ( type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
-
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each( function() {
- jQuery.event.remove( this, types, fn, selector );
- } );
- },
-
- trigger: function( type, data ) {
- return this.each( function() {
- jQuery.event.trigger( type, data, this );
- } );
- },
- triggerHandler: function( type, data ) {
- var elem = this[ 0 ];
- if ( elem ) {
- return jQuery.event.trigger( type, data, elem, true );
- }
- }
-} );
-
-
-var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
- rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
-
- // Support: IE 10-11, Edge 10240+
- // In IE/Edge using regex groups here causes severe slowdowns.
- // See https://connect.microsoft.com/IE/feedback/details/1736512/
- rnoInnerhtml = /<script|<style|<link/i,
-
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptTypeMasked = /^true\/(.*)/,
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
- safeFragment = createSafeFragment( document ),
- fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );
-
-// Support: IE<8
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
- return jQuery.nodeName( elem, "table" ) &&
- jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
-
- elem.getElementsByTagName( "tbody" )[ 0 ] ||
- elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
- elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
- elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type;
- return elem;
-}
-function restoreScript( elem ) {
- var match = rscriptTypeMasked.exec( elem.type );
- if ( match ) {
- elem.type = match[ 1 ];
- } else {
- elem.removeAttribute( "type" );
- }
- return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
- return;
- }
-
- var type, i, l,
- oldData = jQuery._data( src ),
- curData = jQuery._data( dest, oldData ),
- events = oldData.events;
-
- if ( events ) {
- delete curData.handle;
- curData.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
-
- // make the cloned public data object a copy from the original
- if ( curData.data ) {
- curData.data = jQuery.extend( {}, curData.data );
- }
-}
-
-function fixCloneNodeIssues( src, dest ) {
- var nodeName, e, data;
-
- // We do not need to do anything for non-Elements
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- nodeName = dest.nodeName.toLowerCase();
-
- // IE6-8 copies events bound via attachEvent when using cloneNode.
- if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
- data = jQuery._data( dest );
-
- for ( e in data.events ) {
- jQuery.removeEvent( dest, e, data.handle );
- }
-
- // Event data gets referenced instead of copied if the expando gets copied too
- dest.removeAttribute( jQuery.expando );
- }
-
- // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
- if ( nodeName === "script" && dest.text !== src.text ) {
- disableScript( dest ).text = src.text;
- restoreScript( dest );
-
- // IE6-10 improperly clones children of object elements using classid.
- // IE10 throws NoModificationAllowedError if parent is null, #12132.
- } else if ( nodeName === "object" ) {
- if ( dest.parentNode ) {
- dest.outerHTML = src.outerHTML;
- }
-
- // This path appears unavoidable for IE9. When cloning an object
- // element in IE9, the outerHTML strategy above is not sufficient.
- // If the src has innerHTML and the destination does not,
- // copy the src.innerHTML into the dest.innerHTML. #10324
- if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {
- dest.innerHTML = src.innerHTML;
- }
-
- } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-
- // IE6-8 fails to persist the checked state of a cloned checkbox
- // or radio button. Worse, IE6-7 fail to give the cloned element
- // a checked appearance if the defaultChecked value isn't also set
-
- dest.defaultChecked = dest.checked = src.checked;
-
- // IE6-7 get confused and end up setting the value of a cloned
- // checkbox/radio button to an empty string instead of "on"
- if ( dest.value !== src.value ) {
- dest.value = src.value;
- }
-
- // IE6-8 fails to return the selected option to the default selected
- // state when cloning options
- } else if ( nodeName === "option" ) {
- dest.defaultSelected = dest.selected = src.defaultSelected;
-
- // IE6-8 fails to set the defaultValue to the correct value when
- // cloning other types of input fields
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-}
-
-function domManip( collection, args, callback, ignored ) {
-
- // Flatten any nested arrays
- args = concat.apply( [], args );
-
- var first, node, hasScripts,
- scripts, doc, fragment,
- i = 0,
- l = collection.length,
- iNoClone = l - 1,
- value = args[ 0 ],
- isFunction = jQuery.isFunction( value );
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( isFunction ||
- ( l > 1 && typeof value === "string" &&
- !support.checkClone && rchecked.test( value ) ) ) {
- return collection.each( function( index ) {
- var self = collection.eq( index );
- if ( isFunction ) {
- args[ 0 ] = value.call( this, index, self.html() );
- }
- domManip( self, args, callback, ignored );
- } );
- }
-
- if ( l ) {
- fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
- first = fragment.firstChild;
-
- if ( fragment.childNodes.length === 1 ) {
- fragment = first;
- }
-
- // Require either new content or an interest in ignored elements to invoke the callback
- if ( first || ignored ) {
- scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
- hasScripts = scripts.length;
-
- // Use the original fragment for the last item
- // instead of the first because it can end up
- // being emptied incorrectly in certain situations (#8070).
- for ( ; i < l; i++ ) {
- node = fragment;
-
- if ( i !== iNoClone ) {
- node = jQuery.clone( node, true, true );
-
- // Keep references to cloned scripts for later restoration
- if ( hasScripts ) {
-
- // Support: Android<4.1, PhantomJS<2
- // push.apply(_, arraylike) throws on ancient WebKit
- jQuery.merge( scripts, getAll( node, "script" ) );
- }
- }
-
- callback.call( collection[ i ], node, i );
- }
-
- if ( hasScripts ) {
- doc = scripts[ scripts.length - 1 ].ownerDocument;
-
- // Reenable scripts
- jQuery.map( scripts, restoreScript );
-
- // Evaluate executable scripts on first document insertion
- for ( i = 0; i < hasScripts; i++ ) {
- node = scripts[ i ];
- if ( rscriptType.test( node.type || "" ) &&
- !jQuery._data( node, "globalEval" ) &&
- jQuery.contains( doc, node ) ) {
-
- if ( node.src ) {
-
- // Optional AJAX dependency, but won't run scripts if not present
- if ( jQuery._evalUrl ) {
- jQuery._evalUrl( node.src );
- }
- } else {
- jQuery.globalEval(
- ( node.text || node.textContent || node.innerHTML || "" )
- .replace( rcleanScript, "" )
- );
- }
- }
- }
- }
-
- // Fix #11809: Avoid leaking memory
- fragment = first = null;
- }
- }
-
- return collection;
-}
-
-function remove( elem, selector, keepData ) {
- var node,
- elems = selector ? jQuery.filter( selector, elem ) : elem,
- i = 0;
-
- for ( ; ( node = elems[ i ] ) != null; i++ ) {
-
- if ( !keepData && node.nodeType === 1 ) {
- jQuery.cleanData( getAll( node ) );
- }
-
- if ( node.parentNode ) {
- if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
- setGlobalEval( getAll( node, "script" ) );
- }
- node.parentNode.removeChild( node );
- }
- }
-
- return elem;
-}
-
-jQuery.extend( {
- htmlPrefilter: function( html ) {
- return html.replace( rxhtmlTag, "<$1></$2>" );
- },
-
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var destElements, node, clone, i, srcElements,
- inPage = jQuery.contains( elem.ownerDocument, elem );
-
- if ( support.html5Clone || jQuery.isXMLDoc( elem ) ||
- !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-
- clone = elem.cloneNode( true );
-
- // IE<=8 does not properly clone detached, unknown element nodes
- } else {
- fragmentDiv.innerHTML = elem.outerHTML;
- fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
- }
-
- if ( ( !support.noCloneEvent || !support.noCloneChecked ) &&
- ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
-
- // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
- destElements = getAll( clone );
- srcElements = getAll( elem );
-
- // Fix all IE cloning issues
- for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {
-
- // Ensure that the destination node is not null; Fixes #9587
- if ( destElements[ i ] ) {
- fixCloneNodeIssues( node, destElements[ i ] );
- }
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- if ( deepDataAndEvents ) {
- srcElements = srcElements || getAll( elem );
- destElements = destElements || getAll( clone );
-
- for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {
- cloneCopyEvent( node, destElements[ i ] );
- }
- } else {
- cloneCopyEvent( elem, clone );
- }
- }
-
- // Preserve script evaluation history
- destElements = getAll( clone, "script" );
- if ( destElements.length > 0 ) {
- setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
- }
-
- destElements = srcElements = node = null;
-
- // Return the cloned set
- return clone;
- },
-
- cleanData: function( elems, /* internal */ forceAcceptData ) {
- var elem, type, id, data,
- i = 0,
- internalKey = jQuery.expando,
- cache = jQuery.cache,
- attributes = support.attributes,
- special = jQuery.event.special;
-
- for ( ; ( elem = elems[ i ] ) != null; i++ ) {
- if ( forceAcceptData || acceptData( elem ) ) {
-
- id = elem[ internalKey ];
- data = id && cache[ id ];
-
- if ( data ) {
- if ( data.events ) {
- for ( type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
- }
-
- // Remove cache only if it was not already removed by jQuery.event.remove
- if ( cache[ id ] ) {
-
- delete cache[ id ];
-
- // Support: IE<9
- // IE does not allow us to delete expando properties from nodes
- // IE creates expando attributes along with the property
- // IE does not have a removeAttribute function on Document nodes
- if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
- elem.removeAttribute( internalKey );
-
- // Webkit & Blink performance suffers when deleting properties
- // from DOM nodes, so set to undefined instead
- // https://code.google.com/p/chromium/issues/detail?id=378607
- } else {
- elem[ internalKey ] = undefined;
- }
-
- deletedIds.push( id );
- }
- }
- }
- }
- }
-} );
-
-jQuery.fn.extend( {
-
- // Keep domManip exposed until 3.0 (gh-2225)
- domManip: domManip,
-
- detach: function( selector ) {
- return remove( this, selector, true );
- },
-
- remove: function( selector ) {
- return remove( this, selector );
- },
-
- text: function( value ) {
- return access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().append(
- ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )
- );
- }, null, value, arguments.length );
- },
-
- append: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.appendChild( elem );
- }
- } );
- },
-
- prepend: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
- var target = manipulationTarget( this, elem );
- target.insertBefore( elem, target.firstChild );
- }
- } );
- },
-
- before: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this );
- }
- } );
- },
-
- after: function() {
- return domManip( this, arguments, function( elem ) {
- if ( this.parentNode ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- }
- } );
- },
-
- empty: function() {
- var elem,
- i = 0;
-
- for ( ; ( elem = this[ i ] ) != null; i++ ) {
-
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem, false ) );
- }
-
- // Remove any remaining nodes
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
-
- // If this is a select, ensure that it displays empty (#12336)
- // Support: IE<9
- if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
- elem.options.length = 0;
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function() {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- } );
- },
-
- html: function( value ) {
- return access( this, function( value ) {
- var elem = this[ 0 ] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined ) {
- return elem.nodeType === 1 ?
- elem.innerHTML.replace( rinlinejQuery, "" ) :
- undefined;
- }
-
- // See if we can take a shortcut and just use innerHTML
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- ( support.htmlSerialize || !rnoshimcache.test( value ) ) &&
- ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
- !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
- value = jQuery.htmlPrefilter( value );
-
- try {
- for ( ; i < l; i++ ) {
-
- // Remove element nodes and prevent memory leaks
- elem = this[ i ] || {};
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( getAll( elem, false ) );
- elem.innerHTML = value;
- }
- }
-
- elem = 0;
-
- // If using innerHTML throws an exception, use the fallback method
- } catch ( e ) {}
- }
-
- if ( elem ) {
- this.empty().append( value );
- }
- }, null, value, arguments.length );
- },
-
- replaceWith: function() {
- var ignored = [];
-
- // Make the changes, replacing each non-ignored context element with the new content
- return domManip( this, arguments, function( elem ) {
- var parent = this.parentNode;
-
- if ( jQuery.inArray( this, ignored ) < 0 ) {
- jQuery.cleanData( getAll( this ) );
- if ( parent ) {
- parent.replaceChild( elem, this );
- }
- }
-
- // Force callback invocation
- }, ignored );
- }
-} );
-
-jQuery.each( {
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var elems,
- i = 0,
- ret = [],
- insert = jQuery( selector ),
- last = insert.length - 1;
-
- for ( ; i <= last; i++ ) {
- elems = i === last ? this : this.clone( true );
- jQuery( insert[ i ] )[ original ]( elems );
-
- // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
- push.apply( ret, elems.get() );
- }
-
- return this.pushStack( ret );
- };
-} );
-
-
-var iframe,
- elemdisplay = {
-
- // Support: Firefox
- // We have to pre-define these values for FF (#10227)
- HTML: "block",
- BODY: "block"
- };
-
-/**
- * Retrieve the actual display of a element
- * @param {String} name nodeName of the element
- * @param {Object} doc Document object
- */
-
-// Called only from within defaultDisplay
-function actualDisplay( name, doc ) {
- var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-
- display = jQuery.css( elem[ 0 ], "display" );
-
- // We don't have any data stored on the element,
- // so use "detach" method as fast way to get rid of the element
- elem.detach();
-
- return display;
-}
-
-/**
- * Try to determine the default display value of an element
- * @param {String} nodeName
- */
-function defaultDisplay( nodeName ) {
- var doc = document,
- display = elemdisplay[ nodeName ];
-
- if ( !display ) {
- display = actualDisplay( nodeName, doc );
-
- // If the simple way fails, read from inside an iframe
- if ( display === "none" || !display ) {
-
- // Use the already-created iframe if possible
- iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
- .appendTo( doc.documentElement );
-
- // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
- doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
-
- // Support: IE
- doc.write();
- doc.close();
-
- display = actualDisplay( nodeName, doc );
- iframe.detach();
- }
-
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
- }
-
- return display;
-}
-var rmargin = ( /^margin/ );
-
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var swap = function( elem, options, callback, args ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.apply( elem, args || [] );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
-};
-
-
-var documentElement = document.documentElement;
-
-
-
-( function() {
- var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
- reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
- container = document.createElement( "div" ),
- div = document.createElement( "div" );
-
- // Finish early in limited (non-browser) environments
- if ( !div.style ) {
- return;
- }
-
- div.style.cssText = "float:left;opacity:.5";
-
- // Support: IE<9
- // Make sure that element opacity exists (as opposed to filter)
- support.opacity = div.style.opacity === "0.5";
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- support.cssFloat = !!div.style.cssFloat;
-
- div.style.backgroundClip = "content-box";
- div.cloneNode( true ).style.backgroundClip = "";
- support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
- container = document.createElement( "div" );
- container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
- "padding:0;margin-top:1px;position:absolute";
- div.innerHTML = "";
- container.appendChild( div );
-
- // Support: Firefox<29, Android 2.3
- // Vendor-prefix box-sizing
- support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
- div.style.WebkitBoxSizing === "";
-
- jQuery.extend( support, {
- reliableHiddenOffsets: function() {
- if ( pixelPositionVal == null ) {
- computeStyleTests();
- }
- return reliableHiddenOffsetsVal;
- },
-
- boxSizingReliable: function() {
-
- // We're checking for pixelPositionVal here instead of boxSizingReliableVal
- // since that compresses better and they're computed together anyway.
- if ( pixelPositionVal == null ) {
- computeStyleTests();
- }
- return boxSizingReliableVal;
- },
-
- pixelMarginRight: function() {
-
- // Support: Android 4.0-4.3
- if ( pixelPositionVal == null ) {
- computeStyleTests();
- }
- return pixelMarginRightVal;
- },
-
- pixelPosition: function() {
- if ( pixelPositionVal == null ) {
- computeStyleTests();
- }
- return pixelPositionVal;
- },
-
- reliableMarginRight: function() {
-
- // Support: Android 2.3
- if ( pixelPositionVal == null ) {
- computeStyleTests();
- }
- return reliableMarginRightVal;
- },
-
- reliableMarginLeft: function() {
-
- // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
- if ( pixelPositionVal == null ) {
- computeStyleTests();
- }
- return reliableMarginLeftVal;
- }
- } );
-
- function computeStyleTests() {
- var contents, divStyle,
- documentElement = document.documentElement;
-
- // Setup
- documentElement.appendChild( container );
-
- div.style.cssText =
-
- // Support: Android 2.3
- // Vendor-prefix box-sizing
- "-webkit-box-sizing:border-box;box-sizing:border-box;" +
- "position:relative;display:block;" +
- "margin:auto;border:1px;padding:1px;" +
- "top:1%;width:50%";
-
- // Support: IE<9
- // Assume reasonable values in the absence of getComputedStyle
- pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
- pixelMarginRightVal = reliableMarginRightVal = true;
-
- // Check for getComputedStyle so that this code is not run in IE<9.
- if ( window.getComputedStyle ) {
- divStyle = window.getComputedStyle( div );
- pixelPositionVal = ( divStyle || {} ).top !== "1%";
- reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
- boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";
-
- // Support: Android 4.0 - 4.3 only
- // Some styles come back with percentage values, even though they shouldn't
- div.style.marginRight = "50%";
- pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";
-
- // Support: Android 2.3 only
- // Div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container (#3333)
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- contents = div.appendChild( document.createElement( "div" ) );
-
- // Reset CSS: box-sizing; display; margin; border; padding
- contents.style.cssText = div.style.cssText =
-
- // Support: Android 2.3
- // Vendor-prefix box-sizing
- "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
- "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
- contents.style.marginRight = contents.style.width = "0";
- div.style.width = "1px";
-
- reliableMarginRightVal =
- !parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );
-
- div.removeChild( contents );
- }
-
- // Support: IE6-8
- // First check that getClientRects works as expected
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- div.style.display = "none";
- reliableHiddenOffsetsVal = div.getClientRects().length === 0;
- if ( reliableHiddenOffsetsVal ) {
- div.style.display = "";
- div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
- div.childNodes[ 0 ].style.borderCollapse = "separate";
- contents = div.getElementsByTagName( "td" );
- contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
- reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
- if ( reliableHiddenOffsetsVal ) {
- contents[ 0 ].style.display = "";
- contents[ 1 ].style.display = "none";
- reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
- }
- }
-
- // Teardown
- documentElement.removeChild( container );
- }
-
-} )();
-
-
-var getStyles, curCSS,
- rposition = /^(top|right|bottom|left)$/;
-
-if ( window.getComputedStyle ) {
- getStyles = function( elem ) {
-
- // Support: IE<=11+, Firefox<=30+ (#15098, #14150)
- // IE throws on elements created in popups
- // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
- var view = elem.ownerDocument.defaultView;
-
- if ( !view || !view.opener ) {
- view = window;
- }
-
- return view.getComputedStyle( elem );
- };
-
- curCSS = function( elem, name, computed ) {
- var width, minWidth, maxWidth, ret,
- style = elem.style;
-
- computed = computed || getStyles( elem );
-
- // getPropertyValue is only needed for .css('filter') in IE9, see #12537
- ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
-
- // Support: Opera 12.1x only
- // Fall back to style even without computed
- // computed is undefined for elems on document fragments
- if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
- ret = jQuery.style( elem, name );
- }
-
- if ( computed ) {
-
- // A tribute to the "awesome hack by Dean Edwards"
- // Chrome < 17 and Safari 5.0 uses "computed value"
- // instead of "used value" for margin-right
- // Safari 5.1.7 (at least) returns percentage for a larger set of values,
- // but width seems to be reliably pixels
- // this is against the CSSOM draft spec:
- // http://dev.w3.org/csswg/cssom/#resolved-values
- if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
- // Remember the original values
- width = style.width;
- minWidth = style.minWidth;
- maxWidth = style.maxWidth;
-
- // Put in the new values to get a computed value out
- style.minWidth = style.maxWidth = style.width = ret;
- ret = computed.width;
-
- // Revert the changed values
- style.width = width;
- style.minWidth = minWidth;
- style.maxWidth = maxWidth;
- }
- }
-
- // Support: IE
- // IE returns zIndex value as an integer.
- return ret === undefined ?
- ret :
- ret + "";
- };
-} else if ( documentElement.currentStyle ) {
- getStyles = function( elem ) {
- return elem.currentStyle;
- };
-
- curCSS = function( elem, name, computed ) {
- var left, rs, rsLeft, ret,
- style = elem.style;
-
- computed = computed || getStyles( elem );
- ret = computed ? computed[ name ] : undefined;
-
- // Avoid setting ret to empty string here
- // so we don't default to auto
- if ( ret == null && style && style[ name ] ) {
- ret = style[ name ];
- }
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- // but not position css attributes, as those are
- // proportional to the parent element instead
- // and we can't measure the parent instead because it
- // might trigger a "stacking dolls" problem
- if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
- // Remember the original values
- left = style.left;
- rs = elem.runtimeStyle;
- rsLeft = rs && rs.left;
-
- // Put in the new values to get a computed value out
- if ( rsLeft ) {
- rs.left = elem.currentStyle.left;
- }
- style.left = name === "fontSize" ? "1em" : ret;
- ret = style.pixelLeft + "px";
-
- // Revert the changed values
- style.left = left;
- if ( rsLeft ) {
- rs.left = rsLeft;
- }
- }
-
- // Support: IE
- // IE returns zIndex value as an integer.
- return ret === undefined ?
- ret :
- ret + "" || "auto";
- };
-}
-
-
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
- // Define the hook, we'll check on the first run if it's really needed.
- return {
- get: function() {
- if ( conditionFn() ) {
-
- // Hook not needed (or it's not possible to use it due
- // to missing dependency), remove it.
- delete this.get;
- return;
- }
-
- // Hook needed; redefine it so that the support test is not executed again.
- return ( this.get = hookFn ).apply( this, arguments );
- }
- };
-}
-
-
-var
-
- ralpha = /alpha\([^)]*\)/i,
- ropacity = /opacity\s*=\s*([^)]*)/i,
-
- // swappable if display is none or starts with table except
- // "table", "table-cell", or "table-caption"
- // see here for display values:
- // https://developer.mozilla.org/en-US/docs/CSS/display
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
- rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
-
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssNormalTransform = {
- letterSpacing: "0",
- fontWeight: "400"
- },
-
- cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
- emptyStyle = document.createElement( "div" ).style;
-
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( name ) {
-
- // shortcut for names that are not vendor prefixed
- if ( name in emptyStyle ) {
- return name;
- }
-
- // check for vendor prefixed names
- var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),
- i = cssPrefixes.length;
-
- while ( i-- ) {
- name = cssPrefixes[ i ] + capName;
- if ( name in emptyStyle ) {
- return name;
- }
- }
-}
-
-function showHide( elements, show ) {
- var display, elem, hidden,
- values = [],
- index = 0,
- length = elements.length;
-
- for ( ; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
-
- values[ index ] = jQuery._data( elem, "olddisplay" );
- display = elem.style.display;
- if ( show ) {
-
- // Reset the inline display of this element to learn if it is
- // being hidden by cascaded rules or not
- if ( !values[ index ] && display === "none" ) {
- elem.style.display = "";
- }
-
- // Set elements which have been overridden with display: none
- // in a stylesheet to whatever the default browser style is
- // for such an element
- if ( elem.style.display === "" && isHidden( elem ) ) {
- values[ index ] =
- jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) );
- }
- } else {
- hidden = isHidden( elem );
-
- if ( display && display !== "none" || !hidden ) {
- jQuery._data(
- elem,
- "olddisplay",
- hidden ? display : jQuery.css( elem, "display" )
- );
- }
- }
- }
-
- // Set the display of most of the elements in a second loop
- // to avoid the constant reflow
- for ( index = 0; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
- if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
- elem.style.display = show ? values[ index ] || "" : "none";
- }
- }
-
- return elements;
-}
-
-function setPositiveNumber( elem, value, subtract ) {
- var matches = rnumsplit.exec( value );
- return matches ?
-
- // Guard against undefined "subtract", e.g., when used as in cssHooks
- Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
- value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
- var i = extra === ( isBorderBox ? "border" : "content" ) ?
-
- // If we already have the right measurement, avoid augmentation
- 4 :
-
- // Otherwise initialize for horizontal or vertical properties
- name === "width" ? 1 : 0,
-
- val = 0;
-
- for ( ; i < 4; i += 2 ) {
-
- // both box models exclude margin, so add it if we want it
- if ( extra === "margin" ) {
- val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
- }
-
- if ( isBorderBox ) {
-
- // border-box includes padding, so remove it if we want content
- if ( extra === "content" ) {
- val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
- }
-
- // at this point, extra isn't border nor margin, so remove border
- if ( extra !== "margin" ) {
- val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
- } else {
-
- // at this point, extra isn't content, so add padding
- val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
- // at this point, extra isn't content nor padding, so add border
- if ( extra !== "padding" ) {
- val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
- }
- }
- }
-
- return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
- // Start with offset property, which is equivalent to the border-box value
- var valueIsBorderBox = true,
- val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- styles = getStyles( elem ),
- isBorderBox = support.boxSizing &&
- jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
- // some non-html elements return undefined for offsetWidth, so check for null/undefined
- // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
- // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
- if ( val <= 0 || val == null ) {
-
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name, styles );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ];
- }
-
- // Computed unit is not pixels. Stop here and return.
- if ( rnumnonpx.test( val ) ) {
- return val;
- }
-
- // we need the check for style in case a browser which returns unreliable values
- // for getComputedStyle silently falls back to the reliable elem.style
- valueIsBorderBox = isBorderBox &&
- ( support.boxSizingReliable() || val === elem.style[ name ] );
-
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
- }
-
- // use the active box-sizing model to add/subtract irrelevant styles
- return ( val +
- augmentWidthOrHeight(
- elem,
- name,
- extra || ( isBorderBox ? "border" : "content" ),
- valueIsBorderBox,
- styles
- )
- ) + "px";
-}
-
-jQuery.extend( {
-
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
-
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity" );
- return ret === "" ? "1" : ret;
- }
- }
- }
- },
-
- // Don't automatically add "px" to these possibly-unitless properties
- cssNumber: {
- "animationIterationCount": true,
- "columnCount": true,
- "fillOpacity": true,
- "flexGrow": true,
- "flexShrink": true,
- "fontWeight": true,
- "lineHeight": true,
- "opacity": true,
- "order": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {
-
- // normalize float css property
- "float": support.cssFloat ? "cssFloat" : "styleFloat"
- },
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
-
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, hooks,
- origName = jQuery.camelCase( name ),
- style = elem.style;
-
- name = jQuery.cssProps[ origName ] ||
- ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
- // gets hook for the prefixed version
- // followed by the unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // Convert "+=" or "-=" to relative numbers (#7345)
- if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
- value = adjustCSS( elem, name, ret );
-
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that null and NaN values aren't set. See: #7116
- if ( value == null || value !== value ) {
- return;
- }
-
- // If a number was passed in, add the unit (except for certain CSS properties)
- if ( type === "number" ) {
- value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
- }
-
- // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
- // but it would mean to define eight
- // (for every problematic property) identical functions
- if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
- style[ name ] = "inherit";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !( "set" in hooks ) ||
- ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
- // Support: IE
- // Swallow errors from 'invalid' CSS values (#5509)
- try {
- style[ name ] = value;
- } catch ( e ) {}
- }
-
- } else {
-
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks &&
- ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, extra, styles ) {
- var num, val, hooks,
- origName = jQuery.camelCase( name );
-
- // Make sure that we're working with the right name
- name = jQuery.cssProps[ origName ] ||
- ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
- // gets hook for the prefixed version
- // followed by the unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks ) {
- val = hooks.get( elem, true, extra );
- }
-
- // Otherwise, if a way to get the computed value exists, use that
- if ( val === undefined ) {
- val = curCSS( elem, name, styles );
- }
-
- //convert "normal" to computed value
- if ( val === "normal" && name in cssNormalTransform ) {
- val = cssNormalTransform[ name ];
- }
-
- // Return, converting to number if forced or a qualifier was provided and val looks numeric
- if ( extra === "" || extra ) {
- num = parseFloat( val );
- return extra === true || isFinite( num ) ? num || 0 : val;
- }
- return val;
- }
-} );
-
-jQuery.each( [ "height", "width" ], function( i, name ) {
- jQuery.cssHooks[ name ] = {
- get: function( elem, computed, extra ) {
- if ( computed ) {
-
- // certain elements can have dimension info if we invisibly show them
- // however, it must have a current display style that would benefit from this
- return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
- elem.offsetWidth === 0 ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, name, extra );
- } ) :
- getWidthOrHeight( elem, name, extra );
- }
- },
-
- set: function( elem, value, extra ) {
- var styles = extra && getStyles( elem );
- return setPositiveNumber( elem, value, extra ?
- augmentWidthOrHeight(
- elem,
- name,
- extra,
- support.boxSizing &&
- jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
- styles
- ) : 0
- );
- }
- };
-} );
-
-if ( !support.opacity ) {
- jQuery.cssHooks.opacity = {
- get: function( elem, computed ) {
-
- // IE uses filters for opacity
- return ropacity.test( ( computed && elem.currentStyle ?
- elem.currentStyle.filter :
- elem.style.filter ) || "" ) ?
- ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
- computed ? "1" : "";
- },
-
- set: function( elem, value ) {
- var style = elem.style,
- currentStyle = elem.currentStyle,
- opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
- filter = currentStyle && currentStyle.filter || style.filter || "";
-
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- style.zoom = 1;
-
- // if setting opacity to 1, and no other filters exist -
- // attempt to remove filter attribute #6652
- // if value === "", then remove inline opacity #12685
- if ( ( value >= 1 || value === "" ) &&
- jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
- style.removeAttribute ) {
-
- // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
- // if "filter:" is present at all, clearType is disabled, we want to avoid this
- // style.removeAttribute is IE Only, but so apparently is this code path...
- style.removeAttribute( "filter" );
-
- // if there is no filter style applied in a css rule
- // or unset inline opacity, we are done
- if ( value === "" || currentStyle && !currentStyle.filter ) {
- return;
- }
- }
-
- // otherwise, set new filter values
- style.filter = ralpha.test( filter ) ?
- filter.replace( ralpha, opacity ) :
- filter + " " + opacity;
- }
- };
-}
-
-jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
- function( elem, computed ) {
- if ( computed ) {
- return swap( elem, { "display": "inline-block" },
- curCSS, [ elem, "marginRight" ] );
- }
- }
-);
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
- function( elem, computed ) {
- if ( computed ) {
- return (
- parseFloat( curCSS( elem, "marginLeft" ) ) ||
-
- // Support: IE<=11+
- // Running getBoundingClientRect on a disconnected node in IE throws an error
- // Support: IE8 only
- // getClientRects() errors on disconnected elems
- ( jQuery.contains( elem.ownerDocument, elem ) ?
- elem.getBoundingClientRect().left -
- swap( elem, { marginLeft: 0 }, function() {
- return elem.getBoundingClientRect().left;
- } ) :
- 0
- )
- ) + "px";
- }
- }
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
- margin: "",
- padding: "",
- border: "Width"
-}, function( prefix, suffix ) {
- jQuery.cssHooks[ prefix + suffix ] = {
- expand: function( value ) {
- var i = 0,
- expanded = {},
-
- // assumes a single number if not a string
- parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
- for ( ; i < 4; i++ ) {
- expanded[ prefix + cssExpand[ i ] + suffix ] =
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
- }
-
- return expanded;
- }
- };
-
- if ( !rmargin.test( prefix ) ) {
- jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
- }
-} );
-
-jQuery.fn.extend( {
- css: function( name, value ) {
- return access( this, function( elem, name, value ) {
- var styles, len,
- map = {},
- i = 0;
-
- if ( jQuery.isArray( name ) ) {
- styles = getStyles( elem );
- len = name.length;
-
- for ( ; i < len; i++ ) {
- map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
- }
-
- return map;
- }
-
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- }, name, value, arguments.length > 1 );
- },
- show: function() {
- return showHide( this, true );
- },
- hide: function() {
- return showHide( this );
- },
- toggle: function( state ) {
- if ( typeof state === "boolean" ) {
- return state ? this.show() : this.hide();
- }
-
- return this.each( function() {
- if ( isHidden( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- } );
- }
-} );
-
-
-function Tween( elem, options, prop, end, easing ) {
- return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
- constructor: Tween,
- init: function( elem, options, prop, end, easing, unit ) {
- this.elem = elem;
- this.prop = prop;
- this.easing = easing || jQuery.easing._default;
- this.options = options;
- this.start = this.now = this.cur();
- this.end = end;
- this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
- },
- cur: function() {
- var hooks = Tween.propHooks[ this.prop ];
-
- return hooks && hooks.get ?
- hooks.get( this ) :
- Tween.propHooks._default.get( this );
- },
- run: function( percent ) {
- var eased,
- hooks = Tween.propHooks[ this.prop ];
-
- if ( this.options.duration ) {
- this.pos = eased = jQuery.easing[ this.easing ](
- percent, this.options.duration * percent, 0, 1, this.options.duration
- );
- } else {
- this.pos = eased = percent;
- }
- this.now = ( this.end - this.start ) * eased + this.start;
-
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- if ( hooks && hooks.set ) {
- hooks.set( this );
- } else {
- Tween.propHooks._default.set( this );
- }
- return this;
- }
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
- _default: {
- get: function( tween ) {
- var result;
-
- // Use a property on the element directly when it is not a DOM element,
- // or when there is no matching style property that exists.
- if ( tween.elem.nodeType !== 1 ||
- tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
- return tween.elem[ tween.prop ];
- }
-
- // passing an empty string as a 3rd parameter to .css will automatically
- // attempt a parseFloat and fallback to a string if the parse fails
- // so, simple values such as "10px" are parsed to Float.
- // complex values such as "rotate(1rad)" are returned as is.
- result = jQuery.css( tween.elem, tween.prop, "" );
-
- // Empty strings, null, undefined and "auto" are converted to 0.
- return !result || result === "auto" ? 0 : result;
- },
- set: function( tween ) {
-
- // use step hook for back compat - use cssHook if its there - use .style if its
- // available and use plain properties where available
- if ( jQuery.fx.step[ tween.prop ] ) {
- jQuery.fx.step[ tween.prop ]( tween );
- } else if ( tween.elem.nodeType === 1 &&
- ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
- jQuery.cssHooks[ tween.prop ] ) ) {
- jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
- } else {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
- }
-};
-
-// Support: IE <=9
-// Panic based approach to setting things on disconnected nodes
-
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
- set: function( tween ) {
- if ( tween.elem.nodeType && tween.elem.parentNode ) {
- tween.elem[ tween.prop ] = tween.now;
- }
- }
-};
-
-jQuery.easing = {
- linear: function( p ) {
- return p;
- },
- swing: function( p ) {
- return 0.5 - Math.cos( p * Math.PI ) / 2;
- },
- _default: "swing"
-};
-
-jQuery.fx = Tween.prototype.init;
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-
-
-
-var
- fxNow, timerId,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rrun = /queueHooks$/;
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- window.setTimeout( function() {
- fxNow = undefined;
- } );
- return ( fxNow = jQuery.now() );
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
- var which,
- attrs = { height: type },
- i = 0;
-
- // if we include width, step value is 1 to do all cssExpand values,
- // if we don't include width, step value is 2 to skip over Left and Right
- includeWidth = includeWidth ? 1 : 0;
- for ( ; i < 4 ; i += 2 - includeWidth ) {
- which = cssExpand[ i ];
- attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
- }
-
- if ( includeWidth ) {
- attrs.opacity = attrs.width = type;
- }
-
- return attrs;
-}
-
-function createTween( value, prop, animation ) {
- var tween,
- collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
- index = 0,
- length = collection.length;
- for ( ; index < length; index++ ) {
- if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
-
- // we're done with this property
- return tween;
- }
- }
-}
-
-function defaultPrefilter( elem, props, opts ) {
- /* jshint validthis: true */
- var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
- anim = this,
- orig = {},
- style = elem.style,
- hidden = elem.nodeType && isHidden( elem ),
- dataShow = jQuery._data( elem, "fxshow" );
-
- // handle queue: false promises
- if ( !opts.queue ) {
- hooks = jQuery._queueHooks( elem, "fx" );
- if ( hooks.unqueued == null ) {
- hooks.unqueued = 0;
- oldfire = hooks.empty.fire;
- hooks.empty.fire = function() {
- if ( !hooks.unqueued ) {
- oldfire();
- }
- };
- }
- hooks.unqueued++;
-
- anim.always( function() {
-
- // doing this makes sure that the complete handler will be called
- // before this completes
- anim.always( function() {
- hooks.unqueued--;
- if ( !jQuery.queue( elem, "fx" ).length ) {
- hooks.empty.fire();
- }
- } );
- } );
- }
-
- // height/width overflow pass
- if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-
- // Make sure that nothing sneaks out
- // Record all 3 overflow attributes because IE does not
- // change the overflow attribute when overflowX and
- // overflowY are set to the same value
- opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
- // Set display property to inline-block for height/width
- // animations on inline elements that are having width/height animated
- display = jQuery.css( elem, "display" );
-
- // Test default display if display is currently "none"
- checkDisplay = display === "none" ?
- jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
-
- if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
- style.display = "inline-block";
- } else {
- style.zoom = 1;
- }
- }
- }
-
- if ( opts.overflow ) {
- style.overflow = "hidden";
- if ( !support.shrinkWrapBlocks() ) {
- anim.always( function() {
- style.overflow = opts.overflow[ 0 ];
- style.overflowX = opts.overflow[ 1 ];
- style.overflowY = opts.overflow[ 2 ];
- } );
- }
- }
-
- // show/hide pass
- for ( prop in props ) {
- value = props[ prop ];
- if ( rfxtypes.exec( value ) ) {
- delete props[ prop ];
- toggle = toggle || value === "toggle";
- if ( value === ( hidden ? "hide" : "show" ) ) {
-
- // If there is dataShow left over from a stopped hide or show
- // and we are going to proceed with show, we should pretend to be hidden
- if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
- hidden = true;
- } else {
- continue;
- }
- }
- orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-
- // Any non-fx value stops us from restoring the original display value
- } else {
- display = undefined;
- }
- }
-
- if ( !jQuery.isEmptyObject( orig ) ) {
- if ( dataShow ) {
- if ( "hidden" in dataShow ) {
- hidden = dataShow.hidden;
- }
- } else {
- dataShow = jQuery._data( elem, "fxshow", {} );
- }
-
- // store state if its toggle - enables .stop().toggle() to "reverse"
- if ( toggle ) {
- dataShow.hidden = !hidden;
- }
- if ( hidden ) {
- jQuery( elem ).show();
- } else {
- anim.done( function() {
- jQuery( elem ).hide();
- } );
- }
- anim.done( function() {
- var prop;
- jQuery._removeData( elem, "fxshow" );
- for ( prop in orig ) {
- jQuery.style( elem, prop, orig[ prop ] );
- }
- } );
- for ( prop in orig ) {
- tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-
- if ( !( prop in dataShow ) ) {
- dataShow[ prop ] = tween.start;
- if ( hidden ) {
- tween.end = tween.start;
- tween.start = prop === "width" || prop === "height" ? 1 : 0;
- }
- }
- }
-
- // If this is a noop like .hide().hide(), restore an overwritten display value
- } else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
- style.display = display;
- }
-}
-
-function propFilter( props, specialEasing ) {
- var index, name, easing, value, hooks;
-
- // camelCase, specialEasing and expand cssHook pass
- for ( index in props ) {
- name = jQuery.camelCase( index );
- easing = specialEasing[ name ];
- value = props[ index ];
- if ( jQuery.isArray( value ) ) {
- easing = value[ 1 ];
- value = props[ index ] = value[ 0 ];
- }
-
- if ( index !== name ) {
- props[ name ] = value;
- delete props[ index ];
- }
-
- hooks = jQuery.cssHooks[ name ];
- if ( hooks && "expand" in hooks ) {
- value = hooks.expand( value );
- delete props[ name ];
-
- // not quite $.extend, this wont overwrite keys already present.
- // also - reusing 'index' from above because we have the correct "name"
- for ( index in value ) {
- if ( !( index in props ) ) {
- props[ index ] = value[ index ];
- specialEasing[ index ] = easing;
- }
- }
- } else {
- specialEasing[ name ] = easing;
- }
- }
-}
-
-function Animation( elem, properties, options ) {
- var result,
- stopped,
- index = 0,
- length = Animation.prefilters.length,
- deferred = jQuery.Deferred().always( function() {
-
- // don't match elem in the :animated selector
- delete tick.elem;
- } ),
- tick = function() {
- if ( stopped ) {
- return false;
- }
- var currentTime = fxNow || createFxNow(),
- remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-
- // Support: Android 2.3
- // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
- temp = remaining / animation.duration || 0,
- percent = 1 - temp,
- index = 0,
- length = animation.tweens.length;
-
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( percent );
- }
-
- deferred.notifyWith( elem, [ animation, percent, remaining ] );
-
- if ( percent < 1 && length ) {
- return remaining;
- } else {
- deferred.resolveWith( elem, [ animation ] );
- return false;
- }
- },
- animation = deferred.promise( {
- elem: elem,
- props: jQuery.extend( {}, properties ),
- opts: jQuery.extend( true, {
- specialEasing: {},
- easing: jQuery.easing._default
- }, options ),
- originalProperties: properties,
- originalOptions: options,
- startTime: fxNow || createFxNow(),
- duration: options.duration,
- tweens: [],
- createTween: function( prop, end ) {
- var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
- animation.tweens.push( tween );
- return tween;
- },
- stop: function( gotoEnd ) {
- var index = 0,
-
- // if we are going to the end, we want to run all the tweens
- // otherwise we skip this part
- length = gotoEnd ? animation.tweens.length : 0;
- if ( stopped ) {
- return this;
- }
- stopped = true;
- for ( ; index < length ; index++ ) {
- animation.tweens[ index ].run( 1 );
- }
-
- // resolve when we played the last frame
- // otherwise, reject
- if ( gotoEnd ) {
- deferred.notifyWith( elem, [ animation, 1, 0 ] );
- deferred.resolveWith( elem, [ animation, gotoEnd ] );
- } else {
- deferred.rejectWith( elem, [ animation, gotoEnd ] );
- }
- return this;
- }
- } ),
- props = animation.props;
-
- propFilter( props, animation.opts.specialEasing );
-
- for ( ; index < length ; index++ ) {
- result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
- if ( result ) {
- if ( jQuery.isFunction( result.stop ) ) {
- jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
- jQuery.proxy( result.stop, result );
- }
- return result;
- }
- }
-
- jQuery.map( props, createTween, animation );
-
- if ( jQuery.isFunction( animation.opts.start ) ) {
- animation.opts.start.call( elem, animation );
- }
-
- jQuery.fx.timer(
- jQuery.extend( tick, {
- elem: elem,
- anim: animation,
- queue: animation.opts.queue
- } )
- );
-
- // attach callbacks from options
- return animation.progress( animation.opts.progress )
- .done( animation.opts.done, animation.opts.complete )
- .fail( animation.opts.fail )
- .always( animation.opts.always );
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
- tweeners: {
- "*": [ function( prop, value ) {
- var tween = this.createTween( prop, value );
- adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
- return tween;
- } ]
- },
-
- tweener: function( props, callback ) {
- if ( jQuery.isFunction( props ) ) {
- callback = props;
- props = [ "*" ];
- } else {
- props = props.match( rnotwhite );
- }
-
- var prop,
- index = 0,
- length = props.length;
-
- for ( ; index < length ; index++ ) {
- prop = props[ index ];
- Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
- Animation.tweeners[ prop ].unshift( callback );
- }
- },
-
- prefilters: [ defaultPrefilter ],
-
- prefilter: function( callback, prepend ) {
- if ( prepend ) {
- Animation.prefilters.unshift( callback );
- } else {
- Animation.prefilters.push( callback );
- }
- }
-} );
-
-jQuery.speed = function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
- };
-
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ?
- jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
- // normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
-
- // Queueing
- opt.old = opt.complete;
-
- opt.complete = function() {
- if ( jQuery.isFunction( opt.old ) ) {
- opt.old.call( this );
- }
-
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
- }
- };
-
- return opt;
-};
-
-jQuery.fn.extend( {
- fadeTo: function( speed, to, easing, callback ) {
-
- // show any hidden elements after setting opacity to 0
- return this.filter( isHidden ).css( "opacity", 0 ).show()
-
- // animate to the value specified
- .end().animate( { opacity: to }, speed, easing, callback );
- },
- animate: function( prop, speed, easing, callback ) {
- var empty = jQuery.isEmptyObject( prop ),
- optall = jQuery.speed( speed, easing, callback ),
- doAnimation = function() {
-
- // Operate on a copy of prop so per-property easing won't be lost
- var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
- // Empty animations, or finishing resolves immediately
- if ( empty || jQuery._data( this, "finish" ) ) {
- anim.stop( true );
- }
- };
- doAnimation.finish = doAnimation;
-
- return empty || optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
- },
- stop: function( type, clearQueue, gotoEnd ) {
- var stopQueue = function( hooks ) {
- var stop = hooks.stop;
- delete hooks.stop;
- stop( gotoEnd );
- };
-
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
- }
- if ( clearQueue && type !== false ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each( function() {
- var dequeue = true,
- index = type != null && type + "queueHooks",
- timers = jQuery.timers,
- data = jQuery._data( this );
-
- if ( index ) {
- if ( data[ index ] && data[ index ].stop ) {
- stopQueue( data[ index ] );
- }
- } else {
- for ( index in data ) {
- if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
- stopQueue( data[ index ] );
- }
- }
- }
-
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this &&
- ( type == null || timers[ index ].queue === type ) ) {
-
- timers[ index ].anim.stop( gotoEnd );
- dequeue = false;
- timers.splice( index, 1 );
- }
- }
-
- // start the next in the queue if the last step wasn't forced
- // timers currently will call their complete callbacks, which will dequeue
- // but only if they were gotoEnd
- if ( dequeue || !gotoEnd ) {
- jQuery.dequeue( this, type );
- }
- } );
- },
- finish: function( type ) {
- if ( type !== false ) {
- type = type || "fx";
- }
- return this.each( function() {
- var index,
- data = jQuery._data( this ),
- queue = data[ type + "queue" ],
- hooks = data[ type + "queueHooks" ],
- timers = jQuery.timers,
- length = queue ? queue.length : 0;
-
- // enable finishing flag on private data
- data.finish = true;
-
- // empty the queue first
- jQuery.queue( this, type, [] );
-
- if ( hooks && hooks.stop ) {
- hooks.stop.call( this, true );
- }
-
- // look for any active animations, and finish them
- for ( index = timers.length; index--; ) {
- if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
- timers[ index ].anim.stop( true );
- timers.splice( index, 1 );
- }
- }
-
- // look for any animations in the old queue and finish them
- for ( index = 0; index < length; index++ ) {
- if ( queue[ index ] && queue[ index ].finish ) {
- queue[ index ].finish.call( this );
- }
- }
-
- // turn off finishing flag
- delete data.finish;
- } );
- }
-} );
-
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
- var cssFn = jQuery.fn[ name ];
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return speed == null || typeof speed === "boolean" ?
- cssFn.apply( this, arguments ) :
- this.animate( genFx( name, true ), speed, easing, callback );
- };
-} );
-
-// Generate shortcuts for custom animations
-jQuery.each( {
- slideDown: genFx( "show" ),
- slideUp: genFx( "hide" ),
- slideToggle: genFx( "toggle" ),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
- };
-} );
-
-jQuery.timers = [];
-jQuery.fx.tick = function() {
- var timer,
- timers = jQuery.timers,
- i = 0;
-
- fxNow = jQuery.now();
-
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
-
- // Checks the timer has not already been removed
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
- jQuery.timers.push( timer );
- if ( timer() ) {
- jQuery.fx.start();
- } else {
- jQuery.timers.pop();
- }
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.start = function() {
- if ( !timerId ) {
- timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
- }
-};
-
-jQuery.fx.stop = function() {
- window.clearInterval( timerId );
- timerId = null;
-};
-
-jQuery.fx.speeds = {
- slow: 600,
- fast: 200,
-
- // Default speed
- _default: 400
-};
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = window.setTimeout( next, time );
- hooks.stop = function() {
- window.clearTimeout( timeout );
- };
- } );
-};
-
-
-( function() {
- var a,
- input = document.createElement( "input" ),
- div = document.createElement( "div" ),
- select = document.createElement( "select" ),
- opt = select.appendChild( document.createElement( "option" ) );
-
- // Setup
- div = document.createElement( "div" );
- div.setAttribute( "className", "t" );
- div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
- a = div.getElementsByTagName( "a" )[ 0 ];
-
- // Support: Windows Web Apps (WWA)
- // `type` must use .setAttribute for WWA (#14901)
- input.setAttribute( "type", "checkbox" );
- div.appendChild( input );
-
- a = div.getElementsByTagName( "a" )[ 0 ];
-
- // First batch of tests.
- a.style.cssText = "top:1px";
-
- // Test setAttribute on camelCase class.
- // If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- support.getSetAttribute = div.className !== "t";
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- support.style = /top/.test( a.getAttribute( "style" ) );
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- support.hrefNormalized = a.getAttribute( "href" ) === "/a";
-
- // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
- support.checkOn = !!input.value;
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- support.optSelected = opt.selected;
-
- // Tests for enctype support on a form (#6743)
- support.enctype = !!document.createElement( "form" ).enctype;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Support: IE8 only
- // Check if we can trust getAttribute("value")
- input = document.createElement( "input" );
- input.setAttribute( "value", "" );
- support.input = input.getAttribute( "value" ) === "";
-
- // Check if an input maintains its value after becoming a radio
- input.value = "t";
- input.setAttribute( "type", "radio" );
- support.radioValue = input.value === "t";
-} )();
-
-
-var rreturn = /\r/g,
- rspaces = /[\x20\t\r\n\f]+/g;
-
-jQuery.fn.extend( {
- val: function( value ) {
- var hooks, ret, isFunction,
- elem = this[ 0 ];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] ||
- jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if (
- hooks &&
- "get" in hooks &&
- ( ret = hooks.get( elem, "value" ) ) !== undefined
- ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
-
- // handle most common string cases
- ret.replace( rreturn, "" ) :
-
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each( function( i ) {
- var val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, jQuery( this ).val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map( val, function( value ) {
- return value == null ? "" : value + "";
- } );
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- } );
- }
-} );
-
-jQuery.extend( {
- valHooks: {
- option: {
- get: function( elem ) {
- var val = jQuery.find.attr( elem, "value" );
- return val != null ?
- val :
-
- // Support: IE10-11+
- // option.text throws exceptions (#14686, #14858)
- // Strip and collapse whitespace
- // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
- jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
- }
- },
- select: {
- get: function( elem ) {
- var value, option,
- options = elem.options,
- index = elem.selectedIndex,
- one = elem.type === "select-one" || index < 0,
- values = one ? null : [],
- max = one ? index + 1 : options.length,
- i = index < 0 ?
- max :
- one ? index : 0;
-
- // Loop through all the selected options
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // oldIE doesn't update selected after form reset (#2551)
- if ( ( option.selected || i === index ) &&
-
- // Don't return options that are disabled or in a disabled optgroup
- ( support.optDisabled ?
- !option.disabled :
- option.getAttribute( "disabled" ) === null ) &&
- ( !option.parentNode.disabled ||
- !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var optionSet, option,
- options = elem.options,
- values = jQuery.makeArray( value ),
- i = options.length;
-
- while ( i-- ) {
- option = options[ i ];
-
- if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {
-
- // Support: IE6
- // When new option element is added to select box we need to
- // force reflow of newly added node in order to workaround delay
- // of initialization properties
- try {
- option.selected = optionSet = true;
-
- } catch ( _ ) {
-
- // Will be executed only in IE6
- option.scrollHeight;
- }
-
- } else {
- option.selected = false;
- }
- }
-
- // Force browsers to behave consistently when non-matching value is set
- if ( !optionSet ) {
- elem.selectedIndex = -1;
- }
-
- return options;
- }
- }
- }
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
- }
- }
- };
- if ( !support.checkOn ) {
- jQuery.valHooks[ this ].get = function( elem ) {
- return elem.getAttribute( "value" ) === null ? "on" : elem.value;
- };
- }
-} );
-
-
-
-
-var nodeHook, boolHook,
- attrHandle = jQuery.expr.attrHandle,
- ruseDefault = /^(?:checked|selected)$/i,
- getSetAttribute = support.getSetAttribute,
- getSetInput = support.input;
-
-jQuery.fn.extend( {
- attr: function( name, value ) {
- return access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each( function() {
- jQuery.removeAttr( this, name );
- } );
- }
-} );
-
-jQuery.extend( {
- attr: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set attributes on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] ||
- ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
- }
-
- if ( value !== undefined ) {
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
- }
-
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- elem.setAttribute( name, value + "" );
- return value;
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- ret = jQuery.find.attr( elem, name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret == null ? undefined : ret;
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- if ( !support.radioValue && value === "radio" &&
- jQuery.nodeName( elem, "input" ) ) {
-
- // Setting the type on a radio button after the value resets the value in IE8-9
- // Reset value to default in case type is set after value during creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- }
- },
-
- removeAttr: function( elem, value ) {
- var name, propName,
- i = 0,
- attrNames = value && value.match( rnotwhite );
-
- if ( attrNames && elem.nodeType === 1 ) {
- while ( ( name = attrNames[ i++ ] ) ) {
- propName = jQuery.propFix[ name ] || name;
-
- // Boolean attributes get special treatment (#10870)
- if ( jQuery.expr.match.bool.test( name ) ) {
-
- // Set corresponding property to false
- if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
- elem[ propName ] = false;
-
- // Support: IE<9
- // Also clear defaultChecked/defaultSelected (if appropriate)
- } else {
- elem[ jQuery.camelCase( "default-" + name ) ] =
- elem[ propName ] = false;
- }
-
- // See #9699 for explanation of this approach (setting first, then removal)
- } else {
- jQuery.attr( elem, name, "" );
- }
-
- elem.removeAttribute( getSetAttribute ? name : propName );
- }
- }
- }
-} );
-
-// Hooks for boolean attributes
-boolHook = {
- set: function( elem, value, name ) {
- if ( value === false ) {
-
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-
- // IE<8 needs the *property* name
- elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
-
- } else {
-
- // Support: IE<9
- // Use defaultChecked and defaultSelected for oldIE
- elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
- }
- return name;
- }
-};
-
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
- var getter = attrHandle[ name ] || jQuery.find.attr;
-
- if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
- attrHandle[ name ] = function( elem, name, isXML ) {
- var ret, handle;
- if ( !isXML ) {
-
- // Avoid an infinite loop by temporarily removing this function from the getter
- handle = attrHandle[ name ];
- attrHandle[ name ] = ret;
- ret = getter( elem, name, isXML ) != null ?
- name.toLowerCase() :
- null;
- attrHandle[ name ] = handle;
- }
- return ret;
- };
- } else {
- attrHandle[ name ] = function( elem, name, isXML ) {
- if ( !isXML ) {
- return elem[ jQuery.camelCase( "default-" + name ) ] ?
- name.toLowerCase() :
- null;
- }
- };
- }
-} );
-
-// fix oldIE attroperties
-if ( !getSetInput || !getSetAttribute ) {
- jQuery.attrHooks.value = {
- set: function( elem, value, name ) {
- if ( jQuery.nodeName( elem, "input" ) ) {
-
- // Does not return so that setAttribute is also used
- elem.defaultValue = value;
- } else {
-
- // Use nodeHook if defined (#1954); otherwise setAttribute is fine
- return nodeHook && nodeHook.set( elem, value, name );
- }
- }
- };
-}
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = {
- set: function( elem, value, name ) {
-
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- elem.setAttributeNode(
- ( ret = elem.ownerDocument.createAttribute( name ) )
- );
- }
-
- ret.value = value += "";
-
- // Break association with cloned elements by also using setAttribute (#9646)
- if ( name === "value" || value === elem.getAttribute( name ) ) {
- return value;
- }
- }
- };
-
- // Some attributes are constructed with empty-string values when not defined
- attrHandle.id = attrHandle.name = attrHandle.coords =
- function( elem, name, isXML ) {
- var ret;
- if ( !isXML ) {
- return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ?
- ret.value :
- null;
- }
- };
-
- // Fixing value retrieval on a button requires this module
- jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret = elem.getAttributeNode( name );
- if ( ret && ret.specified ) {
- return ret.value;
- }
- },
- set: nodeHook.set
- };
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- set: function( elem, value, name ) {
- nodeHook.set( elem, value === "" ? false : value, name );
- }
- };
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each( [ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- };
- } );
-}
-
-if ( !support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
-
- // Return undefined in the case of empty string
- // Note: IE uppercases css property names, but if we were to .toLowerCase()
- // .cssText, that would destroy case sensitivity in URL's, like in "background"
- return elem.style.cssText || undefined;
- },
- set: function( elem, value ) {
- return ( elem.style.cssText = value + "" );
- }
- };
-}
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button|object)$/i,
- rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
- prop: function( name, value ) {
- return access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each( function() {
-
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch ( e ) {}
- } );
- }
-} );
-
-jQuery.extend( {
- prop: function( elem, name, value ) {
- var ret, hooks,
- nType = elem.nodeType;
-
- // Don't get/set properties on text, comment and attribute nodes
- if ( nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks &&
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
- return ret;
- }
-
- return ( elem[ name ] = value );
- }
-
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
- return ret;
- }
-
- return elem[ name ];
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
-
- // elem.tabIndex doesn't always return the
- // correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- // Use proper attribute retrieval(#12072)
- var tabindex = jQuery.find.attr( elem, "tabindex" );
-
- return tabindex ?
- parseInt( tabindex, 10 ) :
- rfocusable.test( elem.nodeName ) ||
- rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- -1;
- }
- }
- },
-
- propFix: {
- "for": "htmlFor",
- "class": "className"
- }
-} );
-
-// Some attributes require a special call on IE
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !support.hrefNormalized ) {
-
- // href/src property should get the full normalized URL (#10299/#12915)
- jQuery.each( [ "href", "src" ], function( i, name ) {
- jQuery.propHooks[ name ] = {
- get: function( elem ) {
- return elem.getAttribute( name, 4 );
- }
- };
- } );
-}
-
-// Support: Safari, IE9+
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-if ( !support.optSelected ) {
- jQuery.propHooks.selected = {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- },
- set: function( elem ) {
- var parent = elem.parentNode;
- if ( parent ) {
- parent.selectedIndex;
-
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- }
- };
-}
-
-jQuery.each( [
- "tabIndex",
- "readOnly",
- "maxLength",
- "cellSpacing",
- "cellPadding",
- "rowSpan",
- "colSpan",
- "useMap",
- "frameBorder",
- "contentEditable"
-], function() {
- jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-// IE6/7 call enctype encoding
-if ( !support.enctype ) {
- jQuery.propFix.enctype = "encoding";
-}
-
-
-
-
-var rclass = /[\t\r\n\f]/g;
-
-function getClass( elem ) {
- return jQuery.attr( elem, "class" ) || "";
-}
-
-jQuery.fn.extend( {
- addClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- if ( typeof value === "string" && value ) {
- classes = value.match( rnotwhite ) || [];
-
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
- cur = elem.nodeType === 1 &&
- ( " " + curValue + " " ).replace( rclass, " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
- cur += clazz + " ";
- }
- }
-
- // only assign if different to avoid unneeded rendering.
- finalValue = jQuery.trim( cur );
- if ( curValue !== finalValue ) {
- jQuery.attr( elem, "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classes, elem, cur, curValue, clazz, j, finalValue,
- i = 0;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( j ) {
- jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
- } );
- }
-
- if ( !arguments.length ) {
- return this.attr( "class", "" );
- }
-
- if ( typeof value === "string" && value ) {
- classes = value.match( rnotwhite ) || [];
-
- while ( ( elem = this[ i++ ] ) ) {
- curValue = getClass( elem );
-
- // This expression is here for better compressibility (see addClass)
- cur = elem.nodeType === 1 &&
- ( " " + curValue + " " ).replace( rclass, " " );
-
- if ( cur ) {
- j = 0;
- while ( ( clazz = classes[ j++ ] ) ) {
-
- // Remove *all* instances
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
- cur = cur.replace( " " + clazz + " ", " " );
- }
- }
-
- // Only assign if different to avoid unneeded rendering.
- finalValue = jQuery.trim( cur );
- if ( curValue !== finalValue ) {
- jQuery.attr( elem, "class", finalValue );
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value;
-
- if ( typeof stateVal === "boolean" && type === "string" ) {
- return stateVal ? this.addClass( value ) : this.removeClass( value );
- }
-
- if ( jQuery.isFunction( value ) ) {
- return this.each( function( i ) {
- jQuery( this ).toggleClass(
- value.call( this, i, getClass( this ), stateVal ),
- stateVal
- );
- } );
- }
-
- return this.each( function() {
- var className, i, self, classNames;
-
- if ( type === "string" ) {
-
- // Toggle individual class names
- i = 0;
- self = jQuery( this );
- classNames = value.match( rnotwhite ) || [];
-
- while ( ( className = classNames[ i++ ] ) ) {
-
- // Check each className given, space separated list
- if ( self.hasClass( className ) ) {
- self.removeClass( className );
- } else {
- self.addClass( className );
- }
- }
-
- // Toggle whole class name
- } else if ( value === undefined || type === "boolean" ) {
- className = getClass( this );
- if ( className ) {
-
- // store className if set
- jQuery._data( this, "__className__", className );
- }
-
- // If the element has a class name or if we're passed "false",
- // then remove the whole classname (if there was one, the above saved it).
- // Otherwise bring back whatever was previously saved (if anything),
- // falling back to the empty string if nothing was stored.
- jQuery.attr( this, "class",
- className || value === false ?
- "" :
- jQuery._data( this, "__className__" ) || ""
- );
- }
- } );
- },
-
- hasClass: function( selector ) {
- var className, elem,
- i = 0;
-
- className = " " + selector + " ";
- while ( ( elem = this[ i++ ] ) ) {
- if ( elem.nodeType === 1 &&
- ( " " + getClass( elem ) + " " ).replace( rclass, " " )
- .indexOf( className ) > -1
- ) {
- return true;
- }
- }
-
- return false;
- }
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu" ).split( " " ),
- function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-} );
-
-jQuery.fn.extend( {
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-} );
-
-
-var location = window.location;
-
-var nonce = jQuery.now();
-
-var rquery = ( /\?/ );
-
-
-
-var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
-
-jQuery.parseJSON = function( data ) {
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
-
- // Support: Android 2.3
- // Workaround failure to string-cast null input
- return window.JSON.parse( data + "" );
- }
-
- var requireNonComma,
- depth = null,
- str = jQuery.trim( data + "" );
-
- // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
- // after removing valid tokens
- return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
-
- // Force termination if we see a misplaced comma
- if ( requireNonComma && comma ) {
- depth = 0;
- }
-
- // Perform no more replacements after returning to outermost depth
- if ( depth === 0 ) {
- return token;
- }
-
- // Commas must not follow "[", "{", or ","
- requireNonComma = open || comma;
-
- // Determine new depth
- // array/object open ("[" or "{"): depth += true - false (increment)
- // array/object close ("]" or "}"): depth += false - true (decrement)
- // other cases ("," or primitive): depth += true - true (numeric cast)
- depth += !close - !open;
-
- // Remove this token
- return "";
- } ) ) ?
- ( Function( "return " + str ) )() :
- jQuery.error( "Invalid JSON: " + data );
-};
-
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
- var xml, tmp;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new window.DOMParser();
- xml = tmp.parseFromString( data, "text/xml" );
- } else { // IE
- xml = new window.ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
- } catch ( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
-};
-
-
-var
- rhash = /#.*$/,
- rts = /([?&])_=[^&]*/,
-
- // IE leaves an \r character at EOL
- rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
-
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
- rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
-
- /* Prefilters
- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
- * 2) These are called:
- * - BEFORE asking for a transport
- * - AFTER param serialization (s.data is a string if s.processData is true)
- * 3) key is the dataType
- * 4) the catchall symbol "*" can be used
- * 5) execution will start with transport dataType and THEN continue down to "*" if needed
- */
- prefilters = {},
-
- /* Transports bindings
- * 1) key is the dataType
- * 2) the catchall symbol "*" can be used
- * 3) selection will start with transport dataType and THEN go to "*" if needed
- */
- transports = {},
-
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
- allTypes = "*/".concat( "*" ),
-
- // Document location
- ajaxLocation = location.href,
-
- // Segment location into parts
- ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
- // dataTypeExpression is optional and defaults to "*"
- return function( dataTypeExpression, func ) {
-
- if ( typeof dataTypeExpression !== "string" ) {
- func = dataTypeExpression;
- dataTypeExpression = "*";
- }
-
- var dataType,
- i = 0,
- dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
-
- if ( jQuery.isFunction( func ) ) {
-
- // For each dataType in the dataTypeExpression
- while ( ( dataType = dataTypes[ i++ ] ) ) {
-
- // Prepend if requested
- if ( dataType.charAt( 0 ) === "+" ) {
- dataType = dataType.slice( 1 ) || "*";
- ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
-
- // Otherwise append
- } else {
- ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
- }
- }
- }
- };
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
- var inspected = {},
- seekingTransport = ( structure === transports );
-
- function inspect( dataType ) {
- var selected;
- inspected[ dataType ] = true;
- jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
- var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
- if ( typeof dataTypeOrTransport === "string" &&
- !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-
- options.dataTypes.unshift( dataTypeOrTransport );
- inspect( dataTypeOrTransport );
- return false;
- } else if ( seekingTransport ) {
- return !( selected = dataTypeOrTransport );
- }
- } );
- return selected;
- }
-
- return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
- var deep, key,
- flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
- for ( key in src ) {
- if ( src[ key ] !== undefined ) {
- ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
- }
- }
- if ( deep ) {
- jQuery.extend( true, target, deep );
- }
-
- return target;
-}
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
- var firstDataType, ct, finalDataType, type,
- contents = s.contents,
- dataTypes = s.dataTypes;
-
- // Remove auto dataType and get content-type in the process
- while ( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
- }
- }
-
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
- }
- }
- }
-
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
-
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
- finalDataType = type;
- break;
- }
- if ( !firstDataType ) {
- firstDataType = type;
- }
- }
-
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
- }
-
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
- }
- return responses[ finalDataType ];
- }
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
- var conv2, current, conv, tmp, prev,
- converters = {},
-
- // Work with a copy of dataTypes in case we need to modify it for conversion
- dataTypes = s.dataTypes.slice();
-
- // Create converters map with lowercased keys
- if ( dataTypes[ 1 ] ) {
- for ( conv in s.converters ) {
- converters[ conv.toLowerCase() ] = s.converters[ conv ];
- }
- }
-
- current = dataTypes.shift();
-
- // Convert to each sequential dataType
- while ( current ) {
-
- if ( s.responseFields[ current ] ) {
- jqXHR[ s.responseFields[ current ] ] = response;
- }
-
- // Apply the dataFilter if provided
- if ( !prev && isSuccess && s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
-
- prev = current;
- current = dataTypes.shift();
-
- if ( current ) {
-
- // There's only work to do if current dataType is non-auto
- if ( current === "*" ) {
-
- current = prev;
-
- // Convert response if prev dataType is non-auto and differs from current
- } else if ( prev !== "*" && prev !== current ) {
-
- // Seek a direct converter
- conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
- // If none found, seek a pair
- if ( !conv ) {
- for ( conv2 in converters ) {
-
- // If conv2 outputs current
- tmp = conv2.split( " " );
- if ( tmp[ 1 ] === current ) {
-
- // If prev can be converted to accepted input
- conv = converters[ prev + " " + tmp[ 0 ] ] ||
- converters[ "* " + tmp[ 0 ] ];
- if ( conv ) {
-
- // Condense equivalence converters
- if ( conv === true ) {
- conv = converters[ conv2 ];
-
- // Otherwise, insert the intermediate dataType
- } else if ( converters[ conv2 ] !== true ) {
- current = tmp[ 0 ];
- dataTypes.unshift( tmp[ 1 ] );
- }
- break;
- }
- }
- }
- }
-
- // Apply converter (if not an equivalence)
- if ( conv !== true ) {
-
- // Unless errors are allowed to bubble, catch and return them
- if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation
- response = conv( response );
- } else {
- try {
- response = conv( response );
- } catch ( e ) {
- return {
- state: "parsererror",
- error: conv ? e : "No conversion from " + prev + " to " + current
- };
- }
- }
- }
- }
- }
- }
-
- return { state: "success", data: response };
-}
-
-jQuery.extend( {
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {},
-
- ajaxSettings: {
- url: ajaxLocation,
- type: "GET",
- isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
- global: true,
- processData: true,
- async: true,
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
- /*
- timeout: 0,
- data: null,
- dataType: null,
- username: null,
- password: null,
- cache: null,
- throws: false,
- traditional: false,
- headers: {},
- */
-
- accepts: {
- "*": allTypes,
- text: "text/plain",
- html: "text/html",
- xml: "application/xml, text/xml",
- json: "application/json, text/javascript"
- },
-
- contents: {
- xml: /\bxml\b/,
- html: /\bhtml/,
- json: /\bjson\b/
- },
-
- responseFields: {
- xml: "responseXML",
- text: "responseText",
- json: "responseJSON"
- },
-
- // Data converters
- // Keys separate source (or catchall "*") and destination types with a single space
- converters: {
-
- // Convert anything to text
- "* text": String,
-
- // Text to html (true = no transformation)
- "text html": true,
-
- // Evaluate text as a json expression
- "text json": jQuery.parseJSON,
-
- // Parse text as xml
- "text xml": jQuery.parseXML
- },
-
- // For options that shouldn't be deep extended:
- // you can add your own custom options here if
- // and when you create one that shouldn't be
- // deep extended (see ajaxExtend)
- flatOptions: {
- url: true,
- context: true
- }
- },
-
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function( target, settings ) {
- return settings ?
-
- // Building a settings object
- ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
- // Extending ajaxSettings
- ajaxExtend( jQuery.ajaxSettings, target );
- },
-
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
- ajaxTransport: addToPrefiltersOrTransports( transports ),
-
- // Main method
- ajax: function( url, options ) {
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- options = url;
- url = undefined;
- }
-
- // Force options to be an object
- options = options || {};
-
- var
-
- // Cross-domain detection vars
- parts,
-
- // Loop variable
- i,
-
- // URL without anti-cache param
- cacheURL,
-
- // Response headers as string
- responseHeadersString,
-
- // timeout handle
- timeoutTimer,
-
- // To know if global events are to be dispatched
- fireGlobals,
-
- transport,
-
- // Response headers
- responseHeaders,
-
- // Create the final options object
- s = jQuery.ajaxSetup( {}, options ),
-
- // Callbacks context
- callbackContext = s.context || s,
-
- // Context for global events is callbackContext if it is a DOM node or jQuery collection
- globalEventContext = s.context &&
- ( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
-
- // Deferreds
- deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks( "once memory" ),
-
- // Status-dependent callbacks
- statusCode = s.statusCode || {},
-
- // Headers (they are sent all at once)
- requestHeaders = {},
- requestHeadersNames = {},
-
- // The jqXHR state
- state = 0,
-
- // Default abort message
- strAbort = "canceled",
-
- // Fake xhr
- jqXHR = {
- readyState: 0,
-
- // Builds headers hashtable if needed
- getResponseHeader: function( key ) {
- var match;
- if ( state === 2 ) {
- if ( !responseHeaders ) {
- responseHeaders = {};
- while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
- responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
- }
- }
- match = responseHeaders[ key.toLowerCase() ];
- }
- return match == null ? null : match;
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return state === 2 ? responseHeadersString : null;
- },
-
- // Caches the header
- setRequestHeader: function( name, value ) {
- var lname = name.toLowerCase();
- if ( !state ) {
- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Overrides response content-type header
- overrideMimeType: function( type ) {
- if ( !state ) {
- s.mimeType = type;
- }
- return this;
- },
-
- // Status-dependent callbacks
- statusCode: function( map ) {
- var code;
- if ( map ) {
- if ( state < 2 ) {
- for ( code in map ) {
-
- // Lazy-add the new callback in a way that preserves old ones
- statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
- }
- } else {
-
- // Execute the appropriate callbacks
- jqXHR.always( map[ jqXHR.status ] );
- }
- }
- return this;
- },
-
- // Cancel the request
- abort: function( statusText ) {
- var finalText = statusText || strAbort;
- if ( transport ) {
- transport.abort( finalText );
- }
- done( 0, finalText );
- return this;
- }
- };
-
- // Attach deferreds
- deferred.promise( jqXHR ).complete = completeDeferred.add;
- jqXHR.success = jqXHR.done;
- jqXHR.error = jqXHR.fail;
-
- // Remove hash character (#7531: and string promotion)
- // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
- // Handle falsy url in the settings object (#10093: consistency with old signature)
- // We also use the url parameter if available
- s.url = ( ( url || s.url || ajaxLocation ) + "" )
- .replace( rhash, "" )
- .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
- // Alias method option to type as per ticket #12004
- s.type = options.method || options.type || s.method || s.type;
-
- // Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
-
- // A cross-domain request is in order when we have a protocol:host:port mismatch
- if ( s.crossDomain == null ) {
- parts = rurl.exec( s.url.toLowerCase() );
- s.crossDomain = !!( parts &&
- ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
- ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
- ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
- );
- }
-
- // Convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" ) {
- s.data = jQuery.param( s.data, s.traditional );
- }
-
- // Apply prefilters
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
- // If request was aborted inside a prefilter, stop there
- if ( state === 2 ) {
- return jqXHR;
- }
-
- // We can fire global events as of now if asked to
- // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
- fireGlobals = jQuery.event && s.global;
-
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger( "ajaxStart" );
- }
-
- // Uppercase the type
- s.type = s.type.toUpperCase();
-
- // Determine if request has content
- s.hasContent = !rnoContent.test( s.type );
-
- // Save the URL in case we're toying with the If-Modified-Since
- // and/or If-None-Match header later on
- cacheURL = s.url;
-
- // More options handling for requests with no content
- if ( !s.hasContent ) {
-
- // If data is available, append data to url
- if ( s.data ) {
- cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
-
- // #9682: remove data so that it's not used in an eventual retry
- delete s.data;
- }
-
- // Add anti-cache in url if needed
- if ( s.cache === false ) {
- s.url = rts.test( cacheURL ) ?
-
- // If there is already a '_' parameter, set its value
- cacheURL.replace( rts, "$1_=" + nonce++ ) :
-
- // Otherwise add one to the end
- cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
- }
- }
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- if ( jQuery.lastModified[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
- }
- if ( jQuery.etag[ cacheURL ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
- }
- }
-
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
- // Set the Accepts header for the server, depending on the dataType
- jqXHR.setRequestHeader(
- "Accept",
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
- s.accepts[ s.dataTypes[ 0 ] ] +
- ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
- s.accepts[ "*" ]
- );
-
- // Check for headers option
- for ( i in s.headers ) {
- jqXHR.setRequestHeader( i, s.headers[ i ] );
- }
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend &&
- ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-
- // Abort if not done already and return
- return jqXHR.abort();
- }
-
- // aborting is no longer a cancellation
- strAbort = "abort";
-
- // Install callbacks on deferreds
- for ( i in { success: 1, error: 1, complete: 1 } ) {
- jqXHR[ i ]( s[ i ] );
- }
-
- // Get transport
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
- // If no transport, we auto-abort
- if ( !transport ) {
- done( -1, "No Transport" );
- } else {
- jqXHR.readyState = 1;
-
- // Send global event
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
- }
-
- // If request was aborted inside ajaxSend, stop there
- if ( state === 2 ) {
- return jqXHR;
- }
-
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = window.setTimeout( function() {
- jqXHR.abort( "timeout" );
- }, s.timeout );
- }
-
- try {
- state = 1;
- transport.send( requestHeaders, done );
- } catch ( e ) {
-
- // Propagate exception as error if not done
- if ( state < 2 ) {
- done( -1, e );
-
- // Simply rethrow otherwise
- } else {
- throw e;
- }
- }
- }
-
- // Callback for when everything is done
- function done( status, nativeStatusText, responses, headers ) {
- var isSuccess, success, error, response, modified,
- statusText = nativeStatusText;
-
- // Called once
- if ( state === 2 ) {
- return;
- }
-
- // State is "done" now
- state = 2;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- window.clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status > 0 ? 4 : 0;
-
- // Determine if successful
- isSuccess = status >= 200 && status < 300 || status === 304;
-
- // Get response data
- if ( responses ) {
- response = ajaxHandleResponses( s, jqXHR, responses );
- }
-
- // Convert no matter what (that way responseXXX fields are always set)
- response = ajaxConvert( s, response, jqXHR, isSuccess );
-
- // If successful, handle type chaining
- if ( isSuccess ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- modified = jqXHR.getResponseHeader( "Last-Modified" );
- if ( modified ) {
- jQuery.lastModified[ cacheURL ] = modified;
- }
- modified = jqXHR.getResponseHeader( "etag" );
- if ( modified ) {
- jQuery.etag[ cacheURL ] = modified;
- }
- }
-
- // if no content
- if ( status === 204 || s.type === "HEAD" ) {
- statusText = "nocontent";
-
- // if not modified
- } else if ( status === 304 ) {
- statusText = "notmodified";
-
- // If we have data, let's convert it
- } else {
- statusText = response.state;
- success = response.data;
- error = response.error;
- isSuccess = !error;
- }
- } else {
-
- // We extract error from statusText
- // then normalize statusText and status for non-aborts
- error = statusText;
- if ( status || !statusText ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger( "ajaxStop" );
- }
- }
- }
-
- return jqXHR;
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- },
-
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- }
-} );
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
-
- // shift arguments if data argument was omitted
- if ( jQuery.isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- // The url can be an options object (which then must have .url)
- return jQuery.ajax( jQuery.extend( {
- url: url,
- type: method,
- dataType: type,
- data: data,
- success: callback
- }, jQuery.isPlainObject( url ) && url ) );
- };
-} );
-
-
-jQuery._evalUrl = function( url ) {
- return jQuery.ajax( {
- url: url,
-
- // Make this explicit, since user can override this through ajaxSetup (#11264)
- type: "GET",
- dataType: "script",
- cache: true,
- async: false,
- global: false,
- "throws": true
- } );
-};
-
-
-jQuery.fn.extend( {
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each( function( i ) {
- jQuery( this ).wrapAll( html.call( this, i ) );
- } );
- }
-
- if ( this[ 0 ] ) {
-
- // The elements to wrap the target around
- var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
- if ( this[ 0 ].parentNode ) {
- wrap.insertBefore( this[ 0 ] );
- }
-
- wrap.map( function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- } ).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each( function( i ) {
- jQuery( this ).wrapInner( html.call( this, i ) );
- } );
- }
-
- return this.each( function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- } );
- },
-
- wrap: function( html ) {
- var isFunction = jQuery.isFunction( html );
-
- return this.each( function( i ) {
- jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
- } );
- },
-
- unwrap: function() {
- return this.parent().each( function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- } ).end();
- }
-} );
-
-
-function getDisplay( elem ) {
- return elem.style && elem.style.display || jQuery.css( elem, "display" );
-}
-
-function filterHidden( elem ) {
-
- // Disconnected elements are considered hidden
- if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {
- return true;
- }
- while ( elem && elem.nodeType === 1 ) {
- if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) {
- return true;
- }
- elem = elem.parentNode;
- }
- return false;
-}
-
-jQuery.expr.filters.hidden = function( elem ) {
-
- // Support: Opera <= 12.12
- // Opera reports offsetWidths and offsetHeights less than zero on some elements
- return support.reliableHiddenOffsets() ?
- ( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&
- !elem.getClientRects().length ) :
- filterHidden( elem );
-};
-
-jQuery.expr.filters.visible = function( elem ) {
- return !jQuery.expr.filters.hidden( elem );
-};
-
-
-
-
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
- rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
- var name;
-
- if ( jQuery.isArray( obj ) ) {
-
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
-
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
-
- // Item is non-scalar (array or object), encode its numeric index.
- buildParams(
- prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
- v,
- traditional,
- add
- );
- }
- } );
-
- } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-
- // Serialize object item.
- for ( name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
-
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
- var prefix,
- s = [],
- add = function( key, value ) {
-
- // If value is a function, invoke it and return its value
- value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
- };
-
- // Set traditional to true for jQuery <= 1.3.2 behavior.
- if ( traditional === undefined ) {
- traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- } );
-
- } else {
-
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" ).replace( r20, "+" );
-};
-
-jQuery.fn.extend( {
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
- serializeArray: function() {
- return this.map( function() {
-
- // Can add propHook for "elements" to filter or add form elements
- var elements = jQuery.prop( this, "elements" );
- return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
- var type = this.type;
-
- // Use .is(":disabled") so that fieldset[disabled] works
- return this.name && !jQuery( this ).is( ":disabled" ) &&
- rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
- ( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( i, elem ) {
- var val = jQuery( this ).val();
-
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val ) {
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } ) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } ).get();
- }
-} );
-
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
-
- // Support: IE6-IE8
- function() {
-
- // XHR cannot access local files, always use ActiveX for that case
- if ( this.isLocal ) {
- return createActiveXHR();
- }
-
- // Support: IE 9-11
- // IE seems to error on cross-domain PATCH requests when ActiveX XHR
- // is used. In IE 9+ always use the native XHR.
- // Note: this condition won't catch Edge as it doesn't define
- // document.documentMode but it also doesn't support ActiveX so it won't
- // reach this code.
- if ( document.documentMode > 8 ) {
- return createStandardXHR();
- }
-
- // Support: IE<9
- // oldIE XHR does not support non-RFC2616 methods (#13240)
- // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
- // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
- // Although this check for six methods instead of eight
- // since IE also does not support "trace" and "connect"
- return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
- createStandardXHR() || createActiveXHR();
- } :
-
- // For all other browsers, use the standard XMLHttpRequest object
- createStandardXHR;
-
-var xhrId = 0,
- xhrCallbacks = {},
- xhrSupported = jQuery.ajaxSettings.xhr();
-
-// Support: IE<10
-// Open requests must be manually aborted on unload (#5280)
-// See https://support.microsoft.com/kb/2856746 for more info
-if ( window.attachEvent ) {
- window.attachEvent( "onunload", function() {
- for ( var key in xhrCallbacks ) {
- xhrCallbacks[ key ]( undefined, true );
- }
- } );
-}
-
-// Determine support properties
-support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = support.ajax = !!xhrSupported;
-
-// Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
-
- jQuery.ajaxTransport( function( options ) {
-
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( !options.crossDomain || support.cors ) {
-
- var callback;
-
- return {
- send: function( headers, complete ) {
- var i,
- xhr = options.xhr(),
- id = ++xhrId;
-
- // Open the socket
- xhr.open(
- options.type,
- options.url,
- options.async,
- options.username,
- options.password
- );
-
- // Apply custom fields if provided
- if ( options.xhrFields ) {
- for ( i in options.xhrFields ) {
- xhr[ i ] = options.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( options.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( options.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
- }
-
- // Set headers
- for ( i in headers ) {
-
- // Support: IE<9
- // IE's ActiveXObject throws a 'Type Mismatch' exception when setting
- // request header to a null-value.
- //
- // To keep consistent with other XHR implementations, cast the value
- // to string and ignore `undefined`.
- if ( headers[ i ] !== undefined ) {
- xhr.setRequestHeader( i, headers[ i ] + "" );
- }
- }
-
- // Do send the request
- // This may raise an exception which is actually
- // handled in jQuery.ajax (so no try/catch here)
- xhr.send( ( options.hasContent && options.data ) || null );
-
- // Listener
- callback = function( _, isAbort ) {
- var status, statusText, responses;
-
- // Was never called and is aborted or complete
- if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
- // Clean up
- delete xhrCallbacks[ id ];
- callback = undefined;
- xhr.onreadystatechange = jQuery.noop;
-
- // Abort manually if needed
- if ( isAbort ) {
- if ( xhr.readyState !== 4 ) {
- xhr.abort();
- }
- } else {
- responses = {};
- status = xhr.status;
-
- // Support: IE<10
- // Accessing binary-data responseText throws an exception
- // (#11426)
- if ( typeof xhr.responseText === "string" ) {
- responses.text = xhr.responseText;
- }
-
- // Firefox throws an exception when accessing
- // statusText for faulty cross-domain requests
- try {
- statusText = xhr.statusText;
- } catch ( e ) {
-
- // We normalize with Webkit giving an empty statusText
- statusText = "";
- }
-
- // Filter status for non standard behaviors
-
- // If the request is local and we have data: assume a success
- // (success with no data won't get notified, that's the best we
- // can do given current implementations)
- if ( !status && options.isLocal && !options.crossDomain ) {
- status = responses.text ? 200 : 404;
-
- // IE - #1450: sometimes returns 1223 when it should be 204
- } else if ( status === 1223 ) {
- status = 204;
- }
- }
- }
-
- // Call complete if needed
- if ( responses ) {
- complete( status, statusText, responses, xhr.getAllResponseHeaders() );
- }
- };
-
- // Do send the request
- // `xhr.send` may raise an exception, but it will be
- // handled in jQuery.ajax (so no try/catch here)
- if ( !options.async ) {
-
- // If we're in sync mode we fire the callback
- callback();
- } else if ( xhr.readyState === 4 ) {
-
- // (IE6 & IE7) if it's in cache and has been
- // retrieved directly we need to fire the callback
- window.setTimeout( callback );
- } else {
-
- // Register the callback, but delay it in case `xhr.send` throws
- // Add to the list of active xhr callbacks
- xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback( undefined, true );
- }
- }
- };
- }
- } );
-}
-
-// Functions to create xhrs
-function createStandardXHR() {
- try {
- return new window.XMLHttpRequest();
- } catch ( e ) {}
-}
-
-function createActiveXHR() {
- try {
- return new window.ActiveXObject( "Microsoft.XMLHTTP" );
- } catch ( e ) {}
-}
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup( {
- accepts: {
- script: "text/javascript, application/javascript, " +
- "application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /\b(?:java|ecma)script\b/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-} );
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- s.global = false;
- }
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function( s ) {
-
- // This transport only deals with cross domain requests
- if ( s.crossDomain ) {
-
- var script,
- head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;
-
- return {
-
- send: function( _, callback ) {
-
- script = document.createElement( "script" );
-
- script.async = true;
-
- if ( s.scriptCharset ) {
- script.charset = s.scriptCharset;
- }
-
- script.src = s.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 ( script.parentNode ) {
- script.parentNode.removeChild( script );
- }
-
- // Dereference the script
- script = null;
-
- // Callback if not abort
- if ( !isAbort ) {
- callback( 200, "success" );
- }
- }
- };
-
- // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
- // Use native DOM manipulation to avoid our domManip AJAX trickery
- head.insertBefore( script, head.firstChild );
- },
-
- abort: function() {
- if ( script ) {
- script.onload( undefined, true );
- }
- }
- };
- }
-} );
-
-
-
-
-var oldCallbacks = [],
- rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup( {
- jsonp: "callback",
- jsonpCallback: function() {
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
- this[ callback ] = true;
- return callback;
- }
-} );
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var callbackName, overwritten, responseContainer,
- jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
- "url" :
- typeof s.data === "string" &&
- ( s.contentType || "" )
- .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
- rjsonp.test( s.data ) && "data"
- );
-
- // Handle iff the expected data type is "jsonp" or we have a parameter to set
- if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
- // Get callback name, remembering preexisting value associated with it
- callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
- s.jsonpCallback() :
- s.jsonpCallback;
-
- // Insert callback into url or form data
- if ( jsonProp ) {
- s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
- } else if ( s.jsonp !== false ) {
- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
- }
-
- // Use data converter to retrieve json after script execution
- s.converters[ "script json" ] = function() {
- if ( !responseContainer ) {
- jQuery.error( callbackName + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Install callback
- overwritten = window[ callbackName ];
- window[ callbackName ] = function() {
- responseContainer = arguments;
- };
-
- // Clean-up function (fires after converters)
- jqXHR.always( function() {
-
- // If previous value didn't exist - remove it
- if ( overwritten === undefined ) {
- jQuery( window ).removeProp( callbackName );
-
- // Otherwise restore preexisting value
- } else {
- window[ callbackName ] = overwritten;
- }
-
- // Save back as free
- if ( s[ callbackName ] ) {
-
- // make sure that re-using the options doesn't screw things around
- s.jsonpCallback = originalSettings.jsonpCallback;
-
- // save the callback name for future use
- oldCallbacks.push( callbackName );
- }
-
- // Call if it was a function and we have a response
- if ( responseContainer && jQuery.isFunction( overwritten ) ) {
- overwritten( responseContainer[ 0 ] );
- }
-
- responseContainer = overwritten = undefined;
- } );
-
- // Delegate to script
- return "script";
- }
-} );
-
-
-
-
-// data: string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- if ( typeof context === "boolean" ) {
- keepScripts = context;
- context = false;
- }
- context = context || document;
-
- var parsed = rsingleTag.exec( data ),
- scripts = !keepScripts && [];
-
- // Single tag
- if ( parsed ) {
- return [ context.createElement( parsed[ 1 ] ) ];
- }
-
- parsed = buildFragment( [ data ], context, scripts );
-
- if ( scripts && scripts.length ) {
- jQuery( scripts ).remove();
- }
-
- return jQuery.merge( [], parsed.childNodes );
-};
-
-
-// Keep a copy of the old load method
-var _load = jQuery.fn.load;
-
-/**
- * Load a url into a page
- */
-jQuery.fn.load = function( url, params, callback ) {
- if ( typeof url !== "string" && _load ) {
- return _load.apply( this, arguments );
- }
-
- var selector, type, response,
- self = this,
- off = url.indexOf( " " );
-
- if ( off > -1 ) {
- selector = jQuery.trim( url.slice( off, url.length ) );
- url = url.slice( 0, off );
- }
-
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
-
- // We assume that it's the callback
- callback = params;
- params = undefined;
-
- // Otherwise, build a param string
- } else if ( params && typeof params === "object" ) {
- type = "POST";
- }
-
- // If we have elements to modify, make the request
- if ( self.length > 0 ) {
- jQuery.ajax( {
- url: url,
-
- // If "type" variable is undefined, then "GET" method will be used.
- // Make value of this field explicit since
- // user can override it through ajaxSetup method
- type: type || "GET",
- dataType: "html",
- data: params
- } ).done( function( responseText ) {
-
- // Save response for use in complete callback
- response = arguments;
-
- self.html( selector ?
-
- // If a selector was specified, locate the right elements in a dummy div
- // Exclude scripts to avoid IE 'Permission Denied' errors
- jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
- // Otherwise use the full result
- responseText );
-
- // If the request succeeds, this function gets "data", "status", "jqXHR"
- // but they are ignored because response was set above.
- // If it fails, this function gets "jqXHR", "status", "error"
- } ).always( callback && function( jqXHR, status ) {
- self.each( function() {
- callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
- } );
- } );
- }
-
- return this;
-};
-
-
-
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
- "ajaxStart",
- "ajaxStop",
- "ajaxComplete",
- "ajaxError",
- "ajaxSuccess",
- "ajaxSend"
-], function( i, type ) {
- jQuery.fn[ type ] = function( fn ) {
- return this.on( type, fn );
- };
-} );
-
-
-
-
-jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep( jQuery.timers, function( fn ) {
- return elem === fn.elem;
- } ).length;
-};
-
-
-
-
-
-/**
- * Gets a window from an element
- */
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ?
- elem :
- elem.nodeType === 9 ?
- elem.defaultView || elem.parentWindow :
- false;
-}
-
-jQuery.offset = {
- setOffset: function( elem, options, i ) {
- var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
- position = jQuery.css( elem, "position" ),
- curElem = jQuery( elem ),
- props = {};
-
- // set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- curOffset = curElem.offset();
- curCSSTop = jQuery.css( elem, "top" );
- curCSSLeft = jQuery.css( elem, "left" );
- calculatePosition = ( position === "absolute" || position === "fixed" ) &&
- jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;
-
- // need to be able to calculate position if either top or left
- // is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( jQuery.isFunction( options ) ) {
-
- // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
- options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
- }
-
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
- }
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
- } else {
- curElem.css( props );
- }
- }
-};
-
-jQuery.fn.extend( {
- offset: function( options ) {
- if ( arguments.length ) {
- return options === undefined ?
- this :
- this.each( function( i ) {
- jQuery.offset.setOffset( this, options, i );
- } );
- }
-
- var docElem, win,
- box = { top: 0, left: 0 },
- elem = this[ 0 ],
- doc = elem && elem.ownerDocument;
-
- if ( !doc ) {
- return;
- }
-
- docElem = doc.documentElement;
-
- // Make sure it's not a disconnected DOM node
- if ( !jQuery.contains( docElem, elem ) ) {
- return box;
- }
-
- // If we don't have gBCR, just use 0,0 rather than error
- // BlackBerry 5, iOS 3 (original iPhone)
- if ( typeof elem.getBoundingClientRect !== "undefined" ) {
- box = elem.getBoundingClientRect();
- }
- win = getWindow( doc );
- return {
- top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
- left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
- };
- },
-
- position: function() {
- if ( !this[ 0 ] ) {
- return;
- }
-
- var offsetParent, offset,
- parentOffset = { top: 0, left: 0 },
- elem = this[ 0 ];
-
- // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
- // because it is its only offset parent
- if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
- // we assume that getBoundingClientRect is available when computed position is fixed
- offset = elem.getBoundingClientRect();
- } else {
-
- // Get *real* offsetParent
- offsetParent = this.offsetParent();
-
- // Get correct offsets
- offset = this.offset();
- if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
- parentOffset = offsetParent.offset();
- }
-
- // Add offsetParent borders
- parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
- parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
- }
-
- // Subtract parent offsets and element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
- return {
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
- };
- },
-
- offsetParent: function() {
- return this.map( function() {
- var offsetParent = this.offsetParent;
-
- while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
- jQuery.css( offsetParent, "position" ) === "static" ) ) {
- offsetParent = offsetParent.offsetParent;
- }
- return offsetParent || documentElement;
- } );
- }
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
- var top = /Y/.test( prop );
-
- jQuery.fn[ method ] = function( val ) {
- return access( this, function( elem, method, val ) {
- var win = getWindow( elem );
-
- if ( val === undefined ) {
- return win ? ( prop in win ) ? win[ prop ] :
- win.document.documentElement[ method ] :
- elem[ method ];
- }
-
- if ( win ) {
- win.scrollTo(
- !top ? val : jQuery( win ).scrollLeft(),
- top ? val : jQuery( win ).scrollTop()
- );
-
- } else {
- elem[ method ] = val;
- }
- }, method, val, arguments.length, null );
- };
-} );
-
-// Support: Safari<7-8+, Chrome<37-44+
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// getComputedStyle returns percent when specified for top/left/bottom/right
-// rather than make the css module depend on the offset module, we just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
- jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
- function( elem, computed ) {
- if ( computed ) {
- computed = curCSS( elem, prop );
-
- // if curCSS returns percentage, fallback to offset
- return rnumnonpx.test( computed ) ?
- jQuery( elem ).position()[ prop ] + "px" :
- computed;
- }
- }
- );
-} );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
-
- // margin is only for outerHeight, outerWidth
- jQuery.fn[ funcName ] = function( margin, value ) {
- var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
- extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
- return access( this, function( elem, type, value ) {
- var doc;
-
- if ( jQuery.isWindow( elem ) ) {
-
- // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
- // isn't a whole lot we can do. See pull request at this URL for discussion:
- // https://github.com/jquery/jquery/pull/764
- return elem.document.documentElement[ "client" + name ];
- }
-
- // Get document width or height
- if ( elem.nodeType === 9 ) {
- doc = elem.documentElement;
-
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
- // whichever is greatest
- // unfortunately, this causes bug #3838 in IE6/8 only,
- // but there is currently no good, small way to fix it.
- return Math.max(
- elem.body[ "scroll" + name ], doc[ "scroll" + name ],
- elem.body[ "offset" + name ], doc[ "offset" + name ],
- doc[ "client" + name ]
- );
- }
-
- return value === undefined ?
-
- // Get width or height on the element, requesting but not forcing parseFloat
- jQuery.css( elem, type, extra ) :
-
- // Set width or height on the element
- jQuery.style( elem, type, value, extra );
- }, type, chainable ? margin : undefined, chainable, null );
- };
- } );
-} );
-
-
-jQuery.fn.extend( {
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
-
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length === 1 ?
- this.off( selector, "**" ) :
- this.off( types, selector || "**", fn );
- }
-} );
-
-// The number of elements contained in the matched element set
-jQuery.fn.size = function() {
- return this.length;
-};
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
- define( "jquery", [], function() {
- return jQuery;
- } );
-}
-
-
-
-var
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$;
-
-jQuery.noConflict = function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in
-// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
- window.jQuery = window.$ = jQuery;
-}
-
-return jQuery;
-}));
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_444444_256x240.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_444444_256x240.png
deleted file mode 100755
index 19f664d..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_444444_256x240.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_555555_256x240.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_555555_256x240.png
deleted file mode 100755
index e965f6d..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_555555_256x240.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_777620_256x240.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_777620_256x240.png
deleted file mode 100755
index 9785948..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_777620_256x240.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_777777_256x240.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_777777_256x240.png
deleted file mode 100755
index 323c456..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_777777_256x240.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_cc0000_256x240.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_cc0000_256x240.png
deleted file mode 100755
index 45ac778..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_cc0000_256x240.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_ffffff_256x240.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_ffffff_256x240.png
deleted file mode 100755
index fe41d2d..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/images/ui-icons_ffffff_256x240.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/index.html b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/index.html
deleted file mode 100755
index 1796b1c..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/index.html
+++ /dev/null
@@ -1,559 +0,0 @@
-<!doctype html>
-<html lang="us">
-<head>
- <meta charset="utf-8">
- <title>jQuery UI Example Page</title>
- <link href="jquery-ui.css" rel="stylesheet">
- <style>
- body{
- font-family: "Trebuchet MS", sans-serif;
- margin: 50px;
- }
- .demoHeaders {
- margin-top: 2em;
- }
- #dialog-link {
- padding: .4em 1em .4em 20px;
- text-decoration: none;
- position: relative;
- }
- #dialog-link span.ui-icon {
- margin: 0 5px 0 0;
- position: absolute;
- left: .2em;
- top: 50%;
- margin-top: -8px;
- }
- #icons {
- margin: 0;
- padding: 0;
- }
- #icons li {
- margin: 2px;
- position: relative;
- padding: 4px 0;
- cursor: pointer;
- float: left;
- list-style: none;
- }
- #icons span.ui-icon {
- float: left;
- margin: 0 4px;
- }
- .fakewindowcontain .ui-widget-overlay {
- position: absolute;
- }
- select {
- width: 200px;
- }
- </style>
-</head>
-<body>
-
-<h1>Welcome to jQuery UI!</h1>
-
-<div class="ui-widget">
- <p>This page demonstrates the widgets and theme you selected in Download Builder. Please make sure you are using them with a compatible jQuery version.</p>
-</div>
-
-<h1>YOUR COMPONENTS:</h1>
-
-
-<!-- Accordion -->
-<h2 class="demoHeaders">Accordion</h2>
-<div id="accordion">
- <h3>First</h3>
- <div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
- <h3>Second</h3>
- <div>Phasellus mattis tincidunt nibh.</div>
- <h3>Third</h3>
- <div>Nam dui erat, auctor a, dignissim quis.</div>
-</div>
-
-
-
-<!-- Autocomplete -->
-<h2 class="demoHeaders">Autocomplete</h2>
-<div>
- <input id="autocomplete" title="type &quot;a&quot;">
-</div>
-
-
-
-<!-- Button -->
-<h2 class="demoHeaders">Button</h2>
-<button id="button">A button element</button>
-<button id="button-icon">An icon-only button</button>
-
-
-
-<!-- Checkboxradio -->
-<h2 class="demoHeaders">Checkboxradio</h2>
-<form style="margin-top: 1em;">
- <div id="radioset">
- <input type="radio" id="radio1" name="radio"><label for="radio1">Choice 1</label>
- <input type="radio" id="radio2" name="radio" checked="checked"><label for="radio2">Choice 2</label>
- <input type="radio" id="radio3" name="radio"><label for="radio3">Choice 3</label>
- </div>
-</form>
-
-
-
-<!-- Controlgroup -->
-<h2 class="demoHeaders">Controlgroup</h2>
-<fieldset>
- <legend>Rental Car</legend>
- <div id="controlgroup">
- <select id="car-type">
- <option>Compact car</option>
- <option>Midsize car</option>
- <option>Full size car</option>
- <option>SUV</option>
- <option>Luxury</option>
- <option>Truck</option>
- <option>Van</option>
- </select>
- <label for="transmission-standard">Standard</label>
- <input type="radio" name="transmission" id="transmission-standard">
- <label for="transmission-automatic">Automatic</label>
- <input type="radio" name="transmission" id="transmission-automatic">
- <label for="insurance">Insurance</label>
- <input type="checkbox" name="insurance" id="insurance">
- <label for="horizontal-spinner" class="ui-controlgroup-label"># of cars</label>
- <input id="horizontal-spinner" class="ui-spinner-input">
- <button>Book Now!</button>
- </div>
-</fieldset>
-
-
-
-<!-- Tabs -->
-<h2 class="demoHeaders">Tabs</h2>
-<div id="tabs">
- <ul>
- <li><a href="#tabs-1">First</a></li>
- <li><a href="#tabs-2">Second</a></li>
- <li><a href="#tabs-3">Third</a></li>
- </ul>
- <div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
- <div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
- <div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
-</div>
-
-
-
-<h2 class="demoHeaders">Dialog</h2>
-<p>
- <button id="dialog-link" class="ui-button ui-corner-all ui-widget">
- <span class="ui-icon ui-icon-newwin"></span>Open Dialog
- </button>
-</p>
-
-<h2 class="demoHeaders">Overlay and Shadow Classes</h2>
-<div style="position: relative; width: 96%; height: 200px; padding:1% 2%; overflow:hidden;" class="fakewindowcontain">
- <p>Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. </p><p>Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. </p><p>Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. </p><p>Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. </p>
-
- <!-- ui-dialog -->
- <div class="ui-widget-overlay ui-front"></div>
- <div style="position: absolute; width: 320px; left: 50px; top: 30px; padding: 1.2em" class="ui-widget ui-front ui-widget-content ui-corner-all ui-widget-shadow">
- Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
- </div>
-
-</div>
-
-<!-- ui-dialog -->
-<div id="dialog" title="Dialog Title">
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
-</div>
-
-
-
-<h2 class="demoHeaders">Framework Icons (content color preview)</h2>
-<ul id="icons" class="ui-widget ui-helper-clearfix">
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-n"><span class="ui-icon ui-icon-caret-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-ne"><span class="ui-icon ui-icon-caret-1-ne"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-e"><span class="ui-icon ui-icon-caret-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-se"><span class="ui-icon ui-icon-caret-1-se"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-s"><span class="ui-icon ui-icon-caret-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-sw"><span class="ui-icon ui-icon-caret-1-sw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-w"><span class="ui-icon ui-icon-caret-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-nw"><span class="ui-icon ui-icon-caret-1-nw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-2-n-s"><span class="ui-icon ui-icon-caret-2-n-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-caret-2-e-w"><span class="ui-icon ui-icon-caret-2-e-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-n"><span class="ui-icon ui-icon-triangle-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-ne"><span class="ui-icon ui-icon-triangle-1-ne"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-e"><span class="ui-icon ui-icon-triangle-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-se"><span class="ui-icon ui-icon-triangle-1-se"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-s"><span class="ui-icon ui-icon-triangle-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-sw"><span class="ui-icon ui-icon-triangle-1-sw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-w"><span class="ui-icon ui-icon-triangle-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-nw"><span class="ui-icon ui-icon-triangle-1-nw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-n-s"><span class="ui-icon ui-icon-triangle-2-n-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-e-w"><span class="ui-icon ui-icon-triangle-2-e-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-n"><span class="ui-icon ui-icon-arrow-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-ne"><span class="ui-icon ui-icon-arrow-1-ne"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-e"><span class="ui-icon ui-icon-arrow-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-se"><span class="ui-icon ui-icon-arrow-1-se"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-s"><span class="ui-icon ui-icon-arrow-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-sw"><span class="ui-icon ui-icon-arrow-1-sw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-w"><span class="ui-icon ui-icon-arrow-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-nw"><span class="ui-icon ui-icon-arrow-1-nw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-n-s"><span class="ui-icon ui-icon-arrow-2-n-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-ne-sw"><span class="ui-icon ui-icon-arrow-2-ne-sw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-e-w"><span class="ui-icon ui-icon-arrow-2-e-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-se-nw"><span class="ui-icon ui-icon-arrow-2-se-nw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-n"><span class="ui-icon ui-icon-arrowstop-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-e"><span class="ui-icon ui-icon-arrowstop-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-s"><span class="ui-icon ui-icon-arrowstop-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-w"><span class="ui-icon ui-icon-arrowstop-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-n"><span class="ui-icon ui-icon-arrowthick-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-ne"><span class="ui-icon ui-icon-arrowthick-1-ne"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-e"><span class="ui-icon ui-icon-arrowthick-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-se"><span class="ui-icon ui-icon-arrowthick-1-se"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-s"><span class="ui-icon ui-icon-arrowthick-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-sw"><span class="ui-icon ui-icon-arrowthick-1-sw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-w"><span class="ui-icon ui-icon-arrowthick-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-nw"><span class="ui-icon ui-icon-arrowthick-1-nw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-n-s"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-ne-sw"><span class="ui-icon ui-icon-arrowthick-2-ne-sw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-e-w"><span class="ui-icon ui-icon-arrowthick-2-e-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-se-nw"><span class="ui-icon ui-icon-arrowthick-2-se-nw"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-n"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-e"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-s"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-w"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-w"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-n"><span class="ui-icon ui-icon-arrowreturnthick-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-e"><span class="ui-icon ui-icon-arrowreturnthick-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-s"><span class="ui-icon ui-icon-arrowreturnthick-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-w"><span class="ui-icon ui-icon-arrowreturn-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-n"><span class="ui-icon ui-icon-arrowreturn-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-e"><span class="ui-icon ui-icon-arrowreturn-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-s"><span class="ui-icon ui-icon-arrowreturn-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-w"><span class="ui-icon ui-icon-arrowrefresh-1-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-n"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-e"><span class="ui-icon ui-icon-arrowrefresh-1-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-s"><span class="ui-icon ui-icon-arrowrefresh-1-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4"><span class="ui-icon ui-icon-arrow-4"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4-diag"><span class="ui-icon ui-icon-arrow-4-diag"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-extlink"><span class="ui-icon ui-icon-extlink"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-newwin"><span class="ui-icon ui-icon-newwin"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-refresh"><span class="ui-icon ui-icon-refresh"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-shuffle"><span class="ui-icon ui-icon-shuffle"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-transfer-e-w"><span class="ui-icon ui-icon-transfer-e-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-transferthick-e-w"><span class="ui-icon ui-icon-transferthick-e-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-folder-collapsed"><span class="ui-icon ui-icon-folder-collapsed"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-folder-open"><span class="ui-icon ui-icon-folder-open"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-document"><span class="ui-icon ui-icon-document"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-document-b"><span class="ui-icon ui-icon-document-b"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-note"><span class="ui-icon ui-icon-note"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-mail-open"><span class="ui-icon ui-icon-mail-open"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-suitcase"><span class="ui-icon ui-icon-suitcase"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-comment"><span class="ui-icon ui-icon-comment"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-person"><span class="ui-icon ui-icon-person"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-print"><span class="ui-icon ui-icon-print"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-trash"><span class="ui-icon ui-icon-trash"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-locked"><span class="ui-icon ui-icon-locked"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-unlocked"><span class="ui-icon ui-icon-unlocked"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-bookmark"><span class="ui-icon ui-icon-bookmark"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-tag"><span class="ui-icon ui-icon-tag"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-home"><span class="ui-icon ui-icon-home"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-flag"><span class="ui-icon ui-icon-flag"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-calculator"><span class="ui-icon ui-icon-calculator"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-cart"><span class="ui-icon ui-icon-cart"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-pencil"><span class="ui-icon ui-icon-pencil"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-clock"><span class="ui-icon ui-icon-clock"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-disk"><span class="ui-icon ui-icon-disk"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-calendar"><span class="ui-icon ui-icon-calendar"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-zoomin"><span class="ui-icon ui-icon-zoomin"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-zoomout"><span class="ui-icon ui-icon-zoomout"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-search"><span class="ui-icon ui-icon-search"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-wrench"><span class="ui-icon ui-icon-wrench"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-gear"><span class="ui-icon ui-icon-gear"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-heart"><span class="ui-icon ui-icon-heart"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-star"><span class="ui-icon ui-icon-star"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-link"><span class="ui-icon ui-icon-link"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-cancel"><span class="ui-icon ui-icon-cancel"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-plus"><span class="ui-icon ui-icon-plus"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-minus"><span class="ui-icon ui-icon-minus"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-minusthick"><span class="ui-icon ui-icon-minusthick"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-close"><span class="ui-icon ui-icon-close"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-closethick"><span class="ui-icon ui-icon-closethick"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-key"><span class="ui-icon ui-icon-key"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-lightbulb"><span class="ui-icon ui-icon-lightbulb"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-scissors"><span class="ui-icon ui-icon-scissors"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-clipboard"><span class="ui-icon ui-icon-clipboard"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-copy"><span class="ui-icon ui-icon-copy"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-contact"><span class="ui-icon ui-icon-contact"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-image"><span class="ui-icon ui-icon-image"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-video"><span class="ui-icon ui-icon-video"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-script"><span class="ui-icon ui-icon-script"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-alert"><span class="ui-icon ui-icon-alert"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-info"><span class="ui-icon ui-icon-info"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-notice"><span class="ui-icon ui-icon-notice"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-help"><span class="ui-icon ui-icon-help"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-bullet"><span class="ui-icon ui-icon-bullet"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-radio-off"><span class="ui-icon ui-icon-radio-off"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-radio-on"><span class="ui-icon ui-icon-radio-on"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-pin-w"><span class="ui-icon ui-icon-pin-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-pin-s"><span class="ui-icon ui-icon-pin-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-play"><span class="ui-icon ui-icon-play"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-pause"><span class="ui-icon ui-icon-pause"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-seek-next"><span class="ui-icon ui-icon-seek-next"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-seek-prev"><span class="ui-icon ui-icon-seek-prev"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-seek-end"><span class="ui-icon ui-icon-seek-end"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-seek-first"><span class="ui-icon ui-icon-seek-first"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-stop"><span class="ui-icon ui-icon-stop"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-eject"><span class="ui-icon ui-icon-eject"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-volume-off"><span class="ui-icon ui-icon-volume-off"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-volume-on"><span class="ui-icon ui-icon-volume-on"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-power"><span class="ui-icon ui-icon-power"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-signal-diag"><span class="ui-icon ui-icon-signal-diag"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-signal"><span class="ui-icon ui-icon-signal"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-battery-0"><span class="ui-icon ui-icon-battery-0"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-battery-1"><span class="ui-icon ui-icon-battery-1"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-battery-2"><span class="ui-icon ui-icon-battery-2"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-battery-3"><span class="ui-icon ui-icon-battery-3"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-plus"><span class="ui-icon ui-icon-circle-plus"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-minus"><span class="ui-icon ui-icon-circle-minus"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-close"><span class="ui-icon ui-icon-circle-close"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-e"><span class="ui-icon ui-icon-circle-triangle-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-s"><span class="ui-icon ui-icon-circle-triangle-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-w"><span class="ui-icon ui-icon-circle-triangle-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-n"><span class="ui-icon ui-icon-circle-triangle-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-e"><span class="ui-icon ui-icon-circle-arrow-e"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-s"><span class="ui-icon ui-icon-circle-arrow-s"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-w"><span class="ui-icon ui-icon-circle-arrow-w"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-n"><span class="ui-icon ui-icon-circle-arrow-n"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomin"><span class="ui-icon ui-icon-circle-zoomin"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomout"><span class="ui-icon ui-icon-circle-zoomout"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circle-check"><span class="ui-icon ui-icon-circle-check"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-plus"><span class="ui-icon ui-icon-circlesmall-plus"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-minus"><span class="ui-icon ui-icon-circlesmall-minus"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-close"><span class="ui-icon ui-icon-circlesmall-close"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-plus"><span class="ui-icon ui-icon-squaresmall-plus"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-minus"><span class="ui-icon ui-icon-squaresmall-minus"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-close"><span class="ui-icon ui-icon-squaresmall-close"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-vertical"><span class="ui-icon ui-icon-grip-dotted-vertical"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-horizontal"><span class="ui-icon ui-icon-grip-dotted-horizontal"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-vertical"><span class="ui-icon ui-icon-grip-solid-vertical"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-horizontal"><span class="ui-icon ui-icon-grip-solid-horizontal"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-gripsmall-diagonal-se"><span class="ui-icon ui-icon-gripsmall-diagonal-se"></span></li>
- <li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li>
-</ul>
-
-
-<!-- Slider -->
-<h2 class="demoHeaders">Slider</h2>
-<div id="slider"></div>
-
-
-
-<!-- Datepicker -->
-<h2 class="demoHeaders">Datepicker</h2>
-<div id="datepicker"></div>
-
-
-
-<!-- Progressbar -->
-<h2 class="demoHeaders">Progressbar</h2>
-<div id="progressbar"></div>
-
-
-
-<!-- Progressbar -->
-<h2 class="demoHeaders">Selectmenu</h2>
-<select id="selectmenu">
- <option>Slower</option>
- <option>Slow</option>
- <option selected="selected">Medium</option>
- <option>Fast</option>
- <option>Faster</option>
-</select>
-
-
-
-<!-- Spinner -->
-<h2 class="demoHeaders">Spinner</h2>
-<input id="spinner">
-
-
-
-<!-- Menu -->
-<h2 class="demoHeaders">Menu</h2>
-<ul style="width:100px;" id="menu">
- <li><div>Item 1</div></li>
- <li><div>Item 2</div></li>
- <li><div>Item 3</div>
- <ul>
- <li><div>Item 3-1</div></li>
- <li><div>Item 3-2</div></li>
- <li><div>Item 3-3</div></li>
- <li><div>Item 3-4</div></li>
- <li><div>Item 3-5</div></li>
- </ul>
- </li>
- <li><div>Item 4</div></li>
- <li><div>Item 5</div></li>
-</ul>
-
-
-
-<!-- Tooltip -->
-<h2 class="demoHeaders">Tooltip</h2>
-<p id="tooltip">
- <a href="#" title="That&apos;s what this widget is">Tooltips</a> can be attached to any element. When you hover
-the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip.
-</p>
-
-
-<!-- Highlight / Error -->
-<h2 class="demoHeaders">Highlight / Error</h2>
-<div class="ui-widget">
- <div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;">
- <p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
- <strong>Hey!</strong> Sample ui-state-highlight style.</p>
- </div>
-</div>
-<br>
-<div class="ui-widget">
- <div class="ui-state-error ui-corner-all" style="padding: 0 .7em;">
- <p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>
- <strong>Alert:</strong> Sample ui-state-error style.</p>
- </div>
-</div>
-
-<script src="external/jquery/jquery.js"></script>
-<script src="jquery-ui.js"></script>
-<script>
-
-$( "#accordion" ).accordion();
-
-
-
-var availableTags = [
- "ActionScript",
- "AppleScript",
- "Asp",
- "BASIC",
- "C",
- "C++",
- "Clojure",
- "COBOL",
- "ColdFusion",
- "Erlang",
- "Fortran",
- "Groovy",
- "Haskell",
- "Java",
- "JavaScript",
- "Lisp",
- "Perl",
- "PHP",
- "Python",
- "Ruby",
- "Scala",
- "Scheme"
-];
-$( "#autocomplete" ).autocomplete({
- source: availableTags
-});
-
-
-
-$( "#button" ).button();
-$( "#button-icon" ).button({
- icon: "ui-icon-gear",
- showLabel: false
-});
-
-
-
-$( "#radioset" ).buttonset();
-
-
-
-$( "#controlgroup" ).controlgroup();
-
-
-
-$( "#tabs" ).tabs();
-
-
-
-$( "#dialog" ).dialog({
- autoOpen: false,
- width: 400,
- buttons: [
- {
- text: "Ok",
- click: function() {
- $( this ).dialog( "close" );
- }
- },
- {
- text: "Cancel",
- click: function() {
- $( this ).dialog( "close" );
- }
- }
- ]
-});
-
-// Link to open the dialog
-$( "#dialog-link" ).click(function( event ) {
- $( "#dialog" ).dialog( "open" );
- event.preventDefault();
-});
-
-
-
-$( "#datepicker" ).datepicker({
- inline: true
-});
-
-
-
-$( "#slider" ).slider({
- range: true,
- values: [ 17, 67 ]
-});
-
-
-
-$( "#progressbar" ).progressbar({
- value: 20
-});
-
-
-
-$( "#spinner" ).spinner();
-
-
-
-$( "#menu" ).menu();
-
-
-
-$( "#tooltip" ).tooltip();
-
-
-
-$( "#selectmenu" ).selectmenu();
-
-
-// Hover states on the static widgets
-$( "#dialog-link, #icons li" ).hover(
- function() {
- $( this ).addClass( "ui-state-hover" );
- },
- function() {
- $( this ).removeClass( "ui-state-hover" );
- }
-);
-</script>
-</body>
-</html>
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.css
deleted file mode 100755
index 1f9b6ec..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.css
+++ /dev/null
@@ -1,1312 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2017-04-02
-* http://jqueryui.com
-* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.ui-helper-reset {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- line-height: 1.3;
- text-decoration: none;
- font-size: 100%;
- list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
- cursor: default !important;
- pointer-events: none;
-}
-
-
-/* Icons
-----------------------------------*/
-.ui-icon {
- display: inline-block;
- vertical-align: middle;
- margin-top: -.25em;
- position: relative;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
-}
-
-.ui-widget-icon-block {
- left: 50%;
- margin-left: -8px;
- display: block;
-}
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
- display: none;
-}
-.ui-resizable-n {
- cursor: n-resize;
- height: 7px;
- width: 100%;
- top: -5px;
- left: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-se {
- cursor: se-resize;
- width: 12px;
- height: 12px;
- right: 1px;
- bottom: 1px;
-}
-.ui-resizable-sw {
- cursor: sw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- bottom: -5px;
-}
-.ui-resizable-nw {
- cursor: nw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- top: -5px;
-}
-.ui-resizable-ne {
- cursor: ne-resize;
- width: 9px;
- height: 9px;
- right: -5px;
- top: -5px;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: 0;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- margin: 0;
- cursor: pointer;
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-item-wrapper {
- position: relative;
- padding: 3px 1em 3px .4em;
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item-wrapper {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-button {
- padding: .4em 1em;
- display: inline-block;
- position: relative;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- /* Support: IE <= 11 */
- overflow: visible;
-}
-
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2em;
- box-sizing: border-box;
- text-indent: -9999px;
- white-space: nowrap;
-}
-
-/* no icon support for input elements */
-input.ui-button.ui-button-icon-only {
- text-indent: 0;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon {
- position: absolute;
- top: 50%;
- left: 50%;
- margin-top: -8px;
- margin-left: -8px;
-}
-
-.ui-button.ui-icon-notext .ui-icon {
- padding: 0;
- width: 2.1em;
- height: 2.1em;
- text-indent: -9999px;
- white-space: nowrap;
-
-}
-
-input.ui-button.ui-icon-notext .ui-icon {
- width: auto;
- height: auto;
- text-indent: 0;
- white-space: normal;
- padding: .4em 1em;
-}
-
-/* workarounds */
-/* Support: Firefox 5 - 40 */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-controlgroup {
- vertical-align: middle;
- display: inline-block;
-}
-.ui-controlgroup > .ui-controlgroup-item {
- float: left;
- margin-left: 0;
- margin-right: 0;
-}
-.ui-controlgroup > .ui-controlgroup-item:focus,
-.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
- z-index: 9999;
-}
-.ui-controlgroup-vertical > .ui-controlgroup-item {
- display: block;
- float: none;
- width: 100%;
- margin-top: 0;
- margin-bottom: 0;
- text-align: left;
-}
-.ui-controlgroup-vertical .ui-controlgroup-item {
- box-sizing: border-box;
-}
-.ui-controlgroup .ui-controlgroup-label {
- padding: .4em 1em;
-}
-.ui-controlgroup .ui-controlgroup-label span {
- font-size: 80%;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
- border-left: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
- border-top: none;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
- border-right: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
- border-bottom: none;
-}
-
-/* Spinner specific style fixes */
-.ui-controlgroup-vertical .ui-spinner-input {
-
- /* Support: IE8 only, Android < 4.4 only */
- width: 75%;
- width: calc( 100% - 2.4em );
-}
-.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
- border-top-style: solid;
-}
-
-.ui-checkboxradio-label .ui-icon-background {
- box-shadow: inset 1px 1px 1px #ccc;
- border-radius: .12em;
- border: none;
-}
-.ui-checkboxradio-radio-label .ui-icon-background {
- width: 16px;
- height: 16px;
- border-radius: 1em;
- overflow: visible;
- border: none;
-}
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
- background-image: none;
- width: 8px;
- height: 8px;
- border-width: 4px;
- border-style: solid;
-}
-.ui-checkboxradio-disabled {
- pointer-events: none;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.ui-datepicker .ui-datepicker-header {
- position: relative;
- padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
- position: absolute;
- top: 2px;
- width: 1.8em;
- height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
- top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
- left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
- right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
- left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
- right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
- display: block;
- position: absolute;
- left: 50%;
- margin-left: -8px;
- top: 50%;
- margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
- margin: 0 2.3em;
- line-height: 1.8em;
- text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.ui-datepicker table {
- width: 100%;
- font-size: .9em;
- border-collapse: collapse;
- margin: 0 0 .4em;
-}
-.ui-datepicker th {
- padding: .7em .3em;
- text-align: center;
- font-weight: bold;
- border: 0;
-}
-.ui-datepicker td {
- border: 0;
- padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
- display: block;
- padding: .2em;
- text-align: right;
- text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
- background-image: none;
- margin: .7em 0 0 0;
- padding: 0 .2em;
- border-left: 0;
- border-right: 0;
- border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
- float: right;
- margin: .5em .2em .4em;
- cursor: pointer;
- padding: .2em .6em .3em .6em;
- width: auto;
- overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
- float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
- width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
- float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
- width: 95%;
- margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
- width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
- width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
- width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
- border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
- clear: left;
-}
-.ui-datepicker-row-break {
- clear: both;
- width: 100%;
- font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
- direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
- right: 2px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
- left: 2px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
- right: 1px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
- left: 1px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
- clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
- float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-
-/* Icons */
-.ui-datepicker .ui-icon {
- display: block;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
- left: .5em;
- top: .3em;
-}
-.ui-dialog {
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-n {
- height: 2px;
- top: 0;
-}
-.ui-dialog .ui-resizable-e {
- width: 2px;
- right: 0;
-}
-.ui-dialog .ui-resizable-s {
- height: 2px;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-w {
- width: 2px;
- left: 0;
-}
-.ui-dialog .ui-resizable-se,
-.ui-dialog .ui-resizable-sw,
-.ui-dialog .ui-resizable-ne,
-.ui-dialog .ui-resizable-nw {
- width: 7px;
- height: 7px;
-}
-.ui-dialog .ui-resizable-se {
- right: 0;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-sw {
- left: 0;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-ne {
- right: 0;
- top: 0;
-}
-.ui-dialog .ui-resizable-nw {
- left: 0;
- top: 0;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-progressbar {
- height: 2em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,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");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-text {
- display: block;
- margin-right: 20px;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-selectmenu-button.ui-button {
- text-align: left;
- white-space: nowrap;
- width: 14em;
-}
-.ui-selectmenu-icon.ui-icon {
- float: right;
- margin-top: 0;
-}
-.ui-slider {
- position: relative;
- text-align: left;
-}
-.ui-slider .ui-slider-handle {
- position: absolute;
- z-index: 2;
- width: 1.2em;
- height: 1.2em;
- cursor: default;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.ui-slider-horizontal {
- height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
- top: -.3em;
- margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
- top: 0;
- height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
- left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
- right: 0;
-}
-
-.ui-slider-vertical {
- width: .8em;
- height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
- left: -.3em;
- margin-left: 0;
- margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
- left: 0;
- width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
- bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
- top: 0;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: .222em 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 2em;
-}
-.ui-spinner-button {
- width: 1.6em;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top-style: none;
- border-bottom-style: none;
- border-right-style: none;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Arial,Helvetica,sans-serif;
- font-size: 1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Arial,Helvetica,sans-serif;
- font-size: 1em;
-}
-.ui-widget.ui-widget-content {
- border: 1px solid #c5c5c5;
-}
-.ui-widget-content {
- border: 1px solid #dddddd;
- background: #ffffff;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #dddddd;
- background: #e9e9e9;
- color: #333333;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #333333;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default,
-.ui-button,
-
-/* We use html here because we need a greater specificity to make sure disabled
-works properly when clicked or hovered */
-html .ui-button.ui-state-disabled:hover,
-html .ui-button.ui-state-disabled:active {
- border: 1px solid #c5c5c5;
- background: #f6f6f6;
- font-weight: normal;
- color: #454545;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited,
-a.ui-button,
-a:link.ui-button,
-a:visited.ui-button,
-.ui-button {
- color: #454545;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus,
-.ui-button:hover,
-.ui-button:focus {
- border: 1px solid #cccccc;
- background: #ededed;
- font-weight: normal;
- color: #2b2b2b;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited,
-a.ui-button:hover,
-a.ui-button:focus {
- color: #2b2b2b;
- text-decoration: none;
-}
-
-.ui-visual-focus {
- box-shadow: 0 0 3px 1px rgb(94, 158, 214);
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active,
-a.ui-button:active,
-.ui-button:active,
-.ui-button.ui-state-active:hover {
- border: 1px solid #003eff;
- background: #007fff;
- font-weight: normal;
- color: #ffffff;
-}
-.ui-icon-background,
-.ui-state-active .ui-icon-background {
- border: #003eff;
- background-color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #dad55e;
- background: #fffa90;
- color: #777620;
-}
-.ui-state-checked {
- border: 1px solid #dad55e;
- background: #fffa90;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #777620;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #f1a899;
- background: #fddfdf;
- color: #5f3f3f;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #5f3f3f;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #5f3f3f;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("images/ui-icons_444444_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("images/ui-icons_444444_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon,
-.ui-button:hover .ui-icon,
-.ui-button:focus .ui-icon {
- background-image: url("images/ui-icons_555555_256x240.png");
-}
-.ui-state-active .ui-icon,
-.ui-button:active .ui-icon {
- background-image: url("images/ui-icons_ffffff_256x240.png");
-}
-.ui-state-highlight .ui-icon,
-.ui-button .ui-state-highlight.ui-icon {
- background-image: url("images/ui-icons_777620_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("images/ui-icons_cc0000_256x240.png");
-}
-.ui-button .ui-icon {
- background-image: url("images/ui-icons_777777_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-caret-1-n { background-position: 0 0; }
-.ui-icon-caret-1-ne { background-position: -16px 0; }
-.ui-icon-caret-1-e { background-position: -32px 0; }
-.ui-icon-caret-1-se { background-position: -48px 0; }
-.ui-icon-caret-1-s { background-position: -65px 0; }
-.ui-icon-caret-1-sw { background-position: -80px 0; }
-.ui-icon-caret-1-w { background-position: -96px 0; }
-.ui-icon-caret-1-nw { background-position: -112px 0; }
-.ui-icon-caret-2-n-s { background-position: -128px 0; }
-.ui-icon-caret-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -65px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -65px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 3px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #aaaaaa;
- opacity: .3;
- filter: Alpha(Opacity=30); /* support: IE8 */
-}
-.ui-widget-shadow {
- -webkit-box-shadow: 0px 0px 5px #666666;
- box-shadow: 0px 0px 5px #666666;
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.js
deleted file mode 100755
index 28b4a12..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.js
+++ /dev/null
@@ -1,18706 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2017-04-02
-* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
-
- // AMD. Register as an anonymous module.
- define([ "jquery" ], factory );
- } else {
-
- // Browser globals
- factory( jQuery );
- }
-}(function( $ ) {
-
-$.ui = $.ui || {};
-
-var version = $.ui.version = "1.12.1";
-
-
-/*!
- * jQuery UI Widget 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Widget
-//>>group: Core
-//>>description: Provides a factory for creating stateful widgets with a common API.
-//>>docs: http://api.jqueryui.com/jQuery.widget/
-//>>demos: http://jqueryui.com/widget/
-
-
-
-var widgetUuid = 0;
-var widgetSlice = Array.prototype.slice;
-
-$.cleanData = ( function( orig ) {
- return function( elems ) {
- var events, elem, i;
- for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
- try {
-
- // Only trigger remove when necessary to save time
- events = $._data( elem, "events" );
- if ( events && events.remove ) {
- $( elem ).triggerHandler( "remove" );
- }
-
- // Http://bugs.jquery.com/ticket/8235
- } catch ( e ) {}
- }
- orig( elems );
- };
-} )( $.cleanData );
-
-$.widget = function( name, base, prototype ) {
- var existingConstructor, constructor, basePrototype;
-
- // ProxiedPrototype allows the provided prototype to remain unmodified
- // so that it can be used as a mixin for multiple widgets (#8876)
- var proxiedPrototype = {};
-
- var namespace = name.split( "." )[ 0 ];
- name = name.split( "." )[ 1 ];
- var fullName = namespace + "-" + name;
-
- if ( !prototype ) {
- prototype = base;
- base = $.Widget;
- }
-
- if ( $.isArray( prototype ) ) {
- prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
- }
-
- // Create selector for plugin
- $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
- return !!$.data( elem, fullName );
- };
-
- $[ namespace ] = $[ namespace ] || {};
- existingConstructor = $[ namespace ][ name ];
- constructor = $[ namespace ][ name ] = function( options, element ) {
-
- // Allow instantiation without "new" keyword
- if ( !this._createWidget ) {
- return new constructor( options, element );
- }
-
- // Allow instantiation without initializing for simple inheritance
- // must use "new" keyword (the code above always passes args)
- if ( arguments.length ) {
- this._createWidget( options, element );
- }
- };
-
- // Extend with the existing constructor to carry over any static properties
- $.extend( constructor, existingConstructor, {
- version: prototype.version,
-
- // Copy the object used to create the prototype in case we need to
- // redefine the widget later
- _proto: $.extend( {}, prototype ),
-
- // Track widgets that inherit from this widget in case this widget is
- // redefined after a widget inherits from it
- _childConstructors: []
- } );
-
- basePrototype = new base();
-
- // We need to make the options hash a property directly on the new instance
- // otherwise we'll modify the options hash on the prototype that we're
- // inheriting from
- basePrototype.options = $.widget.extend( {}, basePrototype.options );
- $.each( prototype, function( prop, value ) {
- if ( !$.isFunction( value ) ) {
- proxiedPrototype[ prop ] = value;
- return;
- }
- proxiedPrototype[ prop ] = ( function() {
- function _super() {
- return base.prototype[ prop ].apply( this, arguments );
- }
-
- function _superApply( args ) {
- return base.prototype[ prop ].apply( this, args );
- }
-
- return function() {
- var __super = this._super;
- var __superApply = this._superApply;
- var returnValue;
-
- this._super = _super;
- this._superApply = _superApply;
-
- returnValue = value.apply( this, arguments );
-
- this._super = __super;
- this._superApply = __superApply;
-
- return returnValue;
- };
- } )();
- } );
- constructor.prototype = $.widget.extend( basePrototype, {
-
- // TODO: remove support for widgetEventPrefix
- // always use the name + a colon as the prefix, e.g., draggable:start
- // don't prefix for widgets that aren't DOM-based
- widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
- }, proxiedPrototype, {
- constructor: constructor,
- namespace: namespace,
- widgetName: name,
- widgetFullName: fullName
- } );
-
- // If this widget is being redefined then we need to find all widgets that
- // are inheriting from it and redefine all of them so that they inherit from
- // the new version of this widget. We're essentially trying to replace one
- // level in the prototype chain.
- if ( existingConstructor ) {
- $.each( existingConstructor._childConstructors, function( i, child ) {
- var childPrototype = child.prototype;
-
- // Redefine the child widget using the same prototype that was
- // originally used, but inherit from the new version of the base
- $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
- child._proto );
- } );
-
- // Remove the list of existing child constructors from the old constructor
- // so the old child constructors can be garbage collected
- delete existingConstructor._childConstructors;
- } else {
- base._childConstructors.push( constructor );
- }
-
- $.widget.bridge( name, constructor );
-
- return constructor;
-};
-
-$.widget.extend = function( target ) {
- var input = widgetSlice.call( arguments, 1 );
- var inputIndex = 0;
- var inputLength = input.length;
- var key;
- var value;
-
- for ( ; inputIndex < inputLength; inputIndex++ ) {
- for ( key in input[ inputIndex ] ) {
- value = input[ inputIndex ][ key ];
- if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
-
- // Clone objects
- if ( $.isPlainObject( value ) ) {
- target[ key ] = $.isPlainObject( target[ key ] ) ?
- $.widget.extend( {}, target[ key ], value ) :
-
- // Don't extend strings, arrays, etc. with objects
- $.widget.extend( {}, value );
-
- // Copy everything else by reference
- } else {
- target[ key ] = value;
- }
- }
- }
- }
- return target;
-};
-
-$.widget.bridge = function( name, object ) {
- var fullName = object.prototype.widgetFullName || name;
- $.fn[ name ] = function( options ) {
- var isMethodCall = typeof options === "string";
- var args = widgetSlice.call( arguments, 1 );
- var returnValue = this;
-
- if ( isMethodCall ) {
-
- // If this is an empty collection, we need to have the instance method
- // return undefined instead of the jQuery instance
- if ( !this.length && options === "instance" ) {
- returnValue = undefined;
- } else {
- this.each( function() {
- var methodValue;
- var instance = $.data( this, fullName );
-
- if ( options === "instance" ) {
- returnValue = instance;
- return false;
- }
-
- if ( !instance ) {
- return $.error( "cannot call methods on " + name +
- " prior to initialization; " +
- "attempted to call method '" + options + "'" );
- }
-
- if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
- return $.error( "no such method '" + options + "' for " + name +
- " widget instance" );
- }
-
- methodValue = instance[ options ].apply( instance, args );
-
- if ( methodValue !== instance && methodValue !== undefined ) {
- returnValue = methodValue && methodValue.jquery ?
- returnValue.pushStack( methodValue.get() ) :
- methodValue;
- return false;
- }
- } );
- }
- } else {
-
- // Allow multiple hashes to be passed on init
- if ( args.length ) {
- options = $.widget.extend.apply( null, [ options ].concat( args ) );
- }
-
- this.each( function() {
- var instance = $.data( this, fullName );
- if ( instance ) {
- instance.option( options || {} );
- if ( instance._init ) {
- instance._init();
- }
- } else {
- $.data( this, fullName, new object( options, this ) );
- }
- } );
- }
-
- return returnValue;
- };
-};
-
-$.Widget = function( /* options, element */ ) {};
-$.Widget._childConstructors = [];
-
-$.Widget.prototype = {
- widgetName: "widget",
- widgetEventPrefix: "",
- defaultElement: "<div>",
-
- options: {
- classes: {},
- disabled: false,
-
- // Callbacks
- create: null
- },
-
- _createWidget: function( options, element ) {
- element = $( element || this.defaultElement || this )[ 0 ];
- this.element = $( element );
- this.uuid = widgetUuid++;
- this.eventNamespace = "." + this.widgetName + this.uuid;
-
- this.bindings = $();
- this.hoverable = $();
- this.focusable = $();
- this.classesElementLookup = {};
-
- if ( element !== this ) {
- $.data( element, this.widgetFullName, this );
- this._on( true, this.element, {
- remove: function( event ) {
- if ( event.target === element ) {
- this.destroy();
- }
- }
- } );
- this.document = $( element.style ?
-
- // Element within the document
- element.ownerDocument :
-
- // Element is window or document
- element.document || element );
- this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
- }
-
- this.options = $.widget.extend( {},
- this.options,
- this._getCreateOptions(),
- options );
-
- this._create();
-
- if ( this.options.disabled ) {
- this._setOptionDisabled( this.options.disabled );
- }
-
- this._trigger( "create", null, this._getCreateEventData() );
- this._init();
- },
-
- _getCreateOptions: function() {
- return {};
- },
-
- _getCreateEventData: $.noop,
-
- _create: $.noop,
-
- _init: $.noop,
-
- destroy: function() {
- var that = this;
-
- this._destroy();
- $.each( this.classesElementLookup, function( key, value ) {
- that._removeClass( value, key );
- } );
-
- // We can probably remove the unbind calls in 2.0
- // all event bindings should go through this._on()
- this.element
- .off( this.eventNamespace )
- .removeData( this.widgetFullName );
- this.widget()
- .off( this.eventNamespace )
- .removeAttr( "aria-disabled" );
-
- // Clean up events and states
- this.bindings.off( this.eventNamespace );
- },
-
- _destroy: $.noop,
-
- widget: function() {
- return this.element;
- },
-
- option: function( key, value ) {
- var options = key;
- var parts;
- var curOption;
- var i;
-
- if ( arguments.length === 0 ) {
-
- // Don't return a reference to the internal hash
- return $.widget.extend( {}, this.options );
- }
-
- if ( typeof key === "string" ) {
-
- // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
- options = {};
- parts = key.split( "." );
- key = parts.shift();
- if ( parts.length ) {
- curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
- for ( i = 0; i < parts.length - 1; i++ ) {
- curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
- curOption = curOption[ parts[ i ] ];
- }
- key = parts.pop();
- if ( arguments.length === 1 ) {
- return curOption[ key ] === undefined ? null : curOption[ key ];
- }
- curOption[ key ] = value;
- } else {
- if ( arguments.length === 1 ) {
- return this.options[ key ] === undefined ? null : this.options[ key ];
- }
- options[ key ] = value;
- }
- }
-
- this._setOptions( options );
-
- return this;
- },
-
- _setOptions: function( options ) {
- var key;
-
- for ( key in options ) {
- this._setOption( key, options[ key ] );
- }
-
- return this;
- },
-
- _setOption: function( key, value ) {
- if ( key === "classes" ) {
- this._setOptionClasses( value );
- }
-
- this.options[ key ] = value;
-
- if ( key === "disabled" ) {
- this._setOptionDisabled( value );
- }
-
- return this;
- },
-
- _setOptionClasses: function( value ) {
- var classKey, elements, currentElements;
-
- for ( classKey in value ) {
- currentElements = this.classesElementLookup[ classKey ];
- if ( value[ classKey ] === this.options.classes[ classKey ] ||
- !currentElements ||
- !currentElements.length ) {
- continue;
- }
-
- // We are doing this to create a new jQuery object because the _removeClass() call
- // on the next line is going to destroy the reference to the current elements being
- // tracked. We need to save a copy of this collection so that we can add the new classes
- // below.
- elements = $( currentElements.get() );
- this._removeClass( currentElements, classKey );
-
- // We don't use _addClass() here, because that uses this.options.classes
- // for generating the string of classes. We want to use the value passed in from
- // _setOption(), this is the new value of the classes option which was passed to
- // _setOption(). We pass this value directly to _classes().
- elements.addClass( this._classes( {
- element: elements,
- keys: classKey,
- classes: value,
- add: true
- } ) );
- }
- },
-
- _setOptionDisabled: function( value ) {
- this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
-
- // If the widget is becoming disabled, then nothing is interactive
- if ( value ) {
- this._removeClass( this.hoverable, null, "ui-state-hover" );
- this._removeClass( this.focusable, null, "ui-state-focus" );
- }
- },
-
- enable: function() {
- return this._setOptions( { disabled: false } );
- },
-
- disable: function() {
- return this._setOptions( { disabled: true } );
- },
-
- _classes: function( options ) {
- var full = [];
- var that = this;
-
- options = $.extend( {
- element: this.element,
- classes: this.options.classes || {}
- }, options );
-
- function processClassString( classes, checkOption ) {
- var current, i;
- for ( i = 0; i < classes.length; i++ ) {
- current = that.classesElementLookup[ classes[ i ] ] || $();
- if ( options.add ) {
- current = $( $.unique( current.get().concat( options.element.get() ) ) );
- } else {
- current = $( current.not( options.element ).get() );
- }
- that.classesElementLookup[ classes[ i ] ] = current;
- full.push( classes[ i ] );
- if ( checkOption && options.classes[ classes[ i ] ] ) {
- full.push( options.classes[ classes[ i ] ] );
- }
- }
- }
-
- this._on( options.element, {
- "remove": "_untrackClassesElement"
- } );
-
- if ( options.keys ) {
- processClassString( options.keys.match( /\S+/g ) || [], true );
- }
- if ( options.extra ) {
- processClassString( options.extra.match( /\S+/g ) || [] );
- }
-
- return full.join( " " );
- },
-
- _untrackClassesElement: function( event ) {
- var that = this;
- $.each( that.classesElementLookup, function( key, value ) {
- if ( $.inArray( event.target, value ) !== -1 ) {
- that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
- }
- } );
- },
-
- _removeClass: function( element, keys, extra ) {
- return this._toggleClass( element, keys, extra, false );
- },
-
- _addClass: function( element, keys, extra ) {
- return this._toggleClass( element, keys, extra, true );
- },
-
- _toggleClass: function( element, keys, extra, add ) {
- add = ( typeof add === "boolean" ) ? add : extra;
- var shift = ( typeof element === "string" || element === null ),
- options = {
- extra: shift ? keys : extra,
- keys: shift ? element : keys,
- element: shift ? this.element : element,
- add: add
- };
- options.element.toggleClass( this._classes( options ), add );
- return this;
- },
-
- _on: function( suppressDisabledCheck, element, handlers ) {
- var delegateElement;
- var instance = this;
-
- // No suppressDisabledCheck flag, shuffle arguments
- if ( typeof suppressDisabledCheck !== "boolean" ) {
- handlers = element;
- element = suppressDisabledCheck;
- suppressDisabledCheck = false;
- }
-
- // No element argument, shuffle and use this.element
- if ( !handlers ) {
- handlers = element;
- element = this.element;
- delegateElement = this.widget();
- } else {
- element = delegateElement = $( element );
- this.bindings = this.bindings.add( element );
- }
-
- $.each( handlers, function( event, handler ) {
- function handlerProxy() {
-
- // Allow widgets to customize the disabled handling
- // - disabled as an array instead of boolean
- // - disabled class as method for disabling individual parts
- if ( !suppressDisabledCheck &&
- ( instance.options.disabled === true ||
- $( this ).hasClass( "ui-state-disabled" ) ) ) {
- return;
- }
- return ( typeof handler === "string" ? instance[ handler ] : handler )
- .apply( instance, arguments );
- }
-
- // Copy the guid so direct unbinding works
- if ( typeof handler !== "string" ) {
- handlerProxy.guid = handler.guid =
- handler.guid || handlerProxy.guid || $.guid++;
- }
-
- var match = event.match( /^([\w:-]*)\s*(.*)$/ );
- var eventName = match[ 1 ] + instance.eventNamespace;
- var selector = match[ 2 ];
-
- if ( selector ) {
- delegateElement.on( eventName, selector, handlerProxy );
- } else {
- element.on( eventName, handlerProxy );
- }
- } );
- },
-
- _off: function( element, eventName ) {
- eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
- this.eventNamespace;
- element.off( eventName ).off( eventName );
-
- // Clear the stack to avoid memory leaks (#10056)
- this.bindings = $( this.bindings.not( element ).get() );
- this.focusable = $( this.focusable.not( element ).get() );
- this.hoverable = $( this.hoverable.not( element ).get() );
- },
-
- _delay: function( handler, delay ) {
- function handlerProxy() {
- return ( typeof handler === "string" ? instance[ handler ] : handler )
- .apply( instance, arguments );
- }
- var instance = this;
- return setTimeout( handlerProxy, delay || 0 );
- },
-
- _hoverable: function( element ) {
- this.hoverable = this.hoverable.add( element );
- this._on( element, {
- mouseenter: function( event ) {
- this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
- },
- mouseleave: function( event ) {
- this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
- }
- } );
- },
-
- _focusable: function( element ) {
- this.focusable = this.focusable.add( element );
- this._on( element, {
- focusin: function( event ) {
- this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
- },
- focusout: function( event ) {
- this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
- }
- } );
- },
-
- _trigger: function( type, event, data ) {
- var prop, orig;
- var callback = this.options[ type ];
-
- data = data || {};
- event = $.Event( event );
- event.type = ( type === this.widgetEventPrefix ?
- type :
- this.widgetEventPrefix + type ).toLowerCase();
-
- // The original event may come from any element
- // so we need to reset the target on the new event
- event.target = this.element[ 0 ];
-
- // Copy original event properties over to the new event
- orig = event.originalEvent;
- if ( orig ) {
- for ( prop in orig ) {
- if ( !( prop in event ) ) {
- event[ prop ] = orig[ prop ];
- }
- }
- }
-
- this.element.trigger( event, data );
- return !( $.isFunction( callback ) &&
- callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
- event.isDefaultPrevented() );
- }
-};
-
-$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
- $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
- if ( typeof options === "string" ) {
- options = { effect: options };
- }
-
- var hasOptions;
- var effectName = !options ?
- method :
- options === true || typeof options === "number" ?
- defaultEffect :
- options.effect || defaultEffect;
-
- options = options || {};
- if ( typeof options === "number" ) {
- options = { duration: options };
- }
-
- hasOptions = !$.isEmptyObject( options );
- options.complete = callback;
-
- if ( options.delay ) {
- element.delay( options.delay );
- }
-
- if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
- element[ method ]( options );
- } else if ( effectName !== method && element[ effectName ] ) {
- element[ effectName ]( options.duration, options.easing, callback );
- } else {
- element.queue( function( next ) {
- $( this )[ method ]();
- if ( callback ) {
- callback.call( element[ 0 ] );
- }
- next();
- } );
- }
- };
-} );
-
-var widget = $.widget;
-
-
-/*!
- * jQuery UI Position 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/position/
- */
-
-//>>label: Position
-//>>group: Core
-//>>description: Positions elements relative to other elements.
-//>>docs: http://api.jqueryui.com/position/
-//>>demos: http://jqueryui.com/position/
-
-
-( function() {
-var cachedScrollbarWidth,
- max = Math.max,
- abs = Math.abs,
- rhorizontal = /left|center|right/,
- rvertical = /top|center|bottom/,
- roffset = /[\+\-]\d+(\.[\d]+)?%?/,
- rposition = /^\w+/,
- rpercent = /%$/,
- _position = $.fn.position;
-
-function getOffsets( offsets, width, height ) {
- return [
- parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
- parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
- ];
-}
-
-function parseCss( element, property ) {
- return parseInt( $.css( element, property ), 10 ) || 0;
-}
-
-function getDimensions( elem ) {
- var raw = elem[ 0 ];
- if ( raw.nodeType === 9 ) {
- return {
- width: elem.width(),
- height: elem.height(),
- offset: { top: 0, left: 0 }
- };
- }
- if ( $.isWindow( raw ) ) {
- return {
- width: elem.width(),
- height: elem.height(),
- offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
- };
- }
- if ( raw.preventDefault ) {
- return {
- width: 0,
- height: 0,
- offset: { top: raw.pageY, left: raw.pageX }
- };
- }
- return {
- width: elem.outerWidth(),
- height: elem.outerHeight(),
- offset: elem.offset()
- };
-}
-
-$.position = {
- scrollbarWidth: function() {
- if ( cachedScrollbarWidth !== undefined ) {
- return cachedScrollbarWidth;
- }
- var w1, w2,
- div = $( "<div " +
- "style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'>" +
- "<div style='height:100px;width:auto;'></div></div>" ),
- innerDiv = div.children()[ 0 ];
-
- $( "body" ).append( div );
- w1 = innerDiv.offsetWidth;
- div.css( "overflow", "scroll" );
-
- w2 = innerDiv.offsetWidth;
-
- if ( w1 === w2 ) {
- w2 = div[ 0 ].clientWidth;
- }
-
- div.remove();
-
- return ( cachedScrollbarWidth = w1 - w2 );
- },
- getScrollInfo: function( within ) {
- var overflowX = within.isWindow || within.isDocument ? "" :
- within.element.css( "overflow-x" ),
- overflowY = within.isWindow || within.isDocument ? "" :
- within.element.css( "overflow-y" ),
- hasOverflowX = overflowX === "scroll" ||
- ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
- hasOverflowY = overflowY === "scroll" ||
- ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
- return {
- width: hasOverflowY ? $.position.scrollbarWidth() : 0,
- height: hasOverflowX ? $.position.scrollbarWidth() : 0
- };
- },
- getWithinInfo: function( element ) {
- var withinElement = $( element || window ),
- isWindow = $.isWindow( withinElement[ 0 ] ),
- isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
- hasOffset = !isWindow && !isDocument;
- return {
- element: withinElement,
- isWindow: isWindow,
- isDocument: isDocument,
- offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
- scrollLeft: withinElement.scrollLeft(),
- scrollTop: withinElement.scrollTop(),
- width: withinElement.outerWidth(),
- height: withinElement.outerHeight()
- };
- }
-};
-
-$.fn.position = function( options ) {
- if ( !options || !options.of ) {
- return _position.apply( this, arguments );
- }
-
- // Make a copy, we don't want to modify arguments
- options = $.extend( {}, options );
-
- var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
- target = $( options.of ),
- within = $.position.getWithinInfo( options.within ),
- scrollInfo = $.position.getScrollInfo( within ),
- collision = ( options.collision || "flip" ).split( " " ),
- offsets = {};
-
- dimensions = getDimensions( target );
- if ( target[ 0 ].preventDefault ) {
-
- // Force left top to allow flipping
- options.at = "left top";
- }
- targetWidth = dimensions.width;
- targetHeight = dimensions.height;
- targetOffset = dimensions.offset;
-
- // Clone to reuse original targetOffset later
- basePosition = $.extend( {}, targetOffset );
-
- // Force my and at to have valid horizontal and vertical positions
- // if a value is missing or invalid, it will be converted to center
- $.each( [ "my", "at" ], function() {
- var pos = ( options[ this ] || "" ).split( " " ),
- horizontalOffset,
- verticalOffset;
-
- if ( pos.length === 1 ) {
- pos = rhorizontal.test( pos[ 0 ] ) ?
- pos.concat( [ "center" ] ) :
- rvertical.test( pos[ 0 ] ) ?
- [ "center" ].concat( pos ) :
- [ "center", "center" ];
- }
- pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
- pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
-
- // Calculate offsets
- horizontalOffset = roffset.exec( pos[ 0 ] );
- verticalOffset = roffset.exec( pos[ 1 ] );
- offsets[ this ] = [
- horizontalOffset ? horizontalOffset[ 0 ] : 0,
- verticalOffset ? verticalOffset[ 0 ] : 0
- ];
-
- // Reduce to just the positions without the offsets
- options[ this ] = [
- rposition.exec( pos[ 0 ] )[ 0 ],
- rposition.exec( pos[ 1 ] )[ 0 ]
- ];
- } );
-
- // Normalize collision option
- if ( collision.length === 1 ) {
- collision[ 1 ] = collision[ 0 ];
- }
-
- if ( options.at[ 0 ] === "right" ) {
- basePosition.left += targetWidth;
- } else if ( options.at[ 0 ] === "center" ) {
- basePosition.left += targetWidth / 2;
- }
-
- if ( options.at[ 1 ] === "bottom" ) {
- basePosition.top += targetHeight;
- } else if ( options.at[ 1 ] === "center" ) {
- basePosition.top += targetHeight / 2;
- }
-
- atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
- basePosition.left += atOffset[ 0 ];
- basePosition.top += atOffset[ 1 ];
-
- return this.each( function() {
- var collisionPosition, using,
- elem = $( this ),
- elemWidth = elem.outerWidth(),
- elemHeight = elem.outerHeight(),
- marginLeft = parseCss( this, "marginLeft" ),
- marginTop = parseCss( this, "marginTop" ),
- collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
- scrollInfo.width,
- collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
- scrollInfo.height,
- position = $.extend( {}, basePosition ),
- myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
-
- if ( options.my[ 0 ] === "right" ) {
- position.left -= elemWidth;
- } else if ( options.my[ 0 ] === "center" ) {
- position.left -= elemWidth / 2;
- }
-
- if ( options.my[ 1 ] === "bottom" ) {
- position.top -= elemHeight;
- } else if ( options.my[ 1 ] === "center" ) {
- position.top -= elemHeight / 2;
- }
-
- position.left += myOffset[ 0 ];
- position.top += myOffset[ 1 ];
-
- collisionPosition = {
- marginLeft: marginLeft,
- marginTop: marginTop
- };
-
- $.each( [ "left", "top" ], function( i, dir ) {
- if ( $.ui.position[ collision[ i ] ] ) {
- $.ui.position[ collision[ i ] ][ dir ]( position, {
- targetWidth: targetWidth,
- targetHeight: targetHeight,
- elemWidth: elemWidth,
- elemHeight: elemHeight,
- collisionPosition: collisionPosition,
- collisionWidth: collisionWidth,
- collisionHeight: collisionHeight,
- offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
- my: options.my,
- at: options.at,
- within: within,
- elem: elem
- } );
- }
- } );
-
- if ( options.using ) {
-
- // Adds feedback as second argument to using callback, if present
- using = function( props ) {
- var left = targetOffset.left - position.left,
- right = left + targetWidth - elemWidth,
- top = targetOffset.top - position.top,
- bottom = top + targetHeight - elemHeight,
- feedback = {
- target: {
- element: target,
- left: targetOffset.left,
- top: targetOffset.top,
- width: targetWidth,
- height: targetHeight
- },
- element: {
- element: elem,
- left: position.left,
- top: position.top,
- width: elemWidth,
- height: elemHeight
- },
- horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
- vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
- };
- if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
- feedback.horizontal = "center";
- }
- if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
- feedback.vertical = "middle";
- }
- if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
- feedback.important = "horizontal";
- } else {
- feedback.important = "vertical";
- }
- options.using.call( this, props, feedback );
- };
- }
-
- elem.offset( $.extend( position, { using: using } ) );
- } );
-};
-
-$.ui.position = {
- fit: {
- left: function( position, data ) {
- var within = data.within,
- withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
- outerWidth = within.width,
- collisionPosLeft = position.left - data.collisionPosition.marginLeft,
- overLeft = withinOffset - collisionPosLeft,
- overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
- newOverRight;
-
- // Element is wider than within
- if ( data.collisionWidth > outerWidth ) {
-
- // Element is initially over the left side of within
- if ( overLeft > 0 && overRight <= 0 ) {
- newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
- withinOffset;
- position.left += overLeft - newOverRight;
-
- // Element is initially over right side of within
- } else if ( overRight > 0 && overLeft <= 0 ) {
- position.left = withinOffset;
-
- // Element is initially over both left and right sides of within
- } else {
- if ( overLeft > overRight ) {
- position.left = withinOffset + outerWidth - data.collisionWidth;
- } else {
- position.left = withinOffset;
- }
- }
-
- // Too far left -> align with left edge
- } else if ( overLeft > 0 ) {
- position.left += overLeft;
-
- // Too far right -> align with right edge
- } else if ( overRight > 0 ) {
- position.left -= overRight;
-
- // Adjust based on position and margin
- } else {
- position.left = max( position.left - collisionPosLeft, position.left );
- }
- },
- top: function( position, data ) {
- var within = data.within,
- withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
- outerHeight = data.within.height,
- collisionPosTop = position.top - data.collisionPosition.marginTop,
- overTop = withinOffset - collisionPosTop,
- overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
- newOverBottom;
-
- // Element is taller than within
- if ( data.collisionHeight > outerHeight ) {
-
- // Element is initially over the top of within
- if ( overTop > 0 && overBottom <= 0 ) {
- newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
- withinOffset;
- position.top += overTop - newOverBottom;
-
- // Element is initially over bottom of within
- } else if ( overBottom > 0 && overTop <= 0 ) {
- position.top = withinOffset;
-
- // Element is initially over both top and bottom of within
- } else {
- if ( overTop > overBottom ) {
- position.top = withinOffset + outerHeight - data.collisionHeight;
- } else {
- position.top = withinOffset;
- }
- }
-
- // Too far up -> align with top
- } else if ( overTop > 0 ) {
- position.top += overTop;
-
- // Too far down -> align with bottom edge
- } else if ( overBottom > 0 ) {
- position.top -= overBottom;
-
- // Adjust based on position and margin
- } else {
- position.top = max( position.top - collisionPosTop, position.top );
- }
- }
- },
- flip: {
- left: function( position, data ) {
- var within = data.within,
- withinOffset = within.offset.left + within.scrollLeft,
- outerWidth = within.width,
- offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
- collisionPosLeft = position.left - data.collisionPosition.marginLeft,
- overLeft = collisionPosLeft - offsetLeft,
- overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
- myOffset = data.my[ 0 ] === "left" ?
- -data.elemWidth :
- data.my[ 0 ] === "right" ?
- data.elemWidth :
- 0,
- atOffset = data.at[ 0 ] === "left" ?
- data.targetWidth :
- data.at[ 0 ] === "right" ?
- -data.targetWidth :
- 0,
- offset = -2 * data.offset[ 0 ],
- newOverRight,
- newOverLeft;
-
- if ( overLeft < 0 ) {
- newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
- outerWidth - withinOffset;
- if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
- position.left += myOffset + atOffset + offset;
- }
- } else if ( overRight > 0 ) {
- newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
- atOffset + offset - offsetLeft;
- if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
- position.left += myOffset + atOffset + offset;
- }
- }
- },
- top: function( position, data ) {
- var within = data.within,
- withinOffset = within.offset.top + within.scrollTop,
- outerHeight = within.height,
- offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
- collisionPosTop = position.top - data.collisionPosition.marginTop,
- overTop = collisionPosTop - offsetTop,
- overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
- top = data.my[ 1 ] === "top",
- myOffset = top ?
- -data.elemHeight :
- data.my[ 1 ] === "bottom" ?
- data.elemHeight :
- 0,
- atOffset = data.at[ 1 ] === "top" ?
- data.targetHeight :
- data.at[ 1 ] === "bottom" ?
- -data.targetHeight :
- 0,
- offset = -2 * data.offset[ 1 ],
- newOverTop,
- newOverBottom;
- if ( overTop < 0 ) {
- newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
- outerHeight - withinOffset;
- if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
- position.top += myOffset + atOffset + offset;
- }
- } else if ( overBottom > 0 ) {
- newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
- offset - offsetTop;
- if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
- position.top += myOffset + atOffset + offset;
- }
- }
- }
- },
- flipfit: {
- left: function() {
- $.ui.position.flip.left.apply( this, arguments );
- $.ui.position.fit.left.apply( this, arguments );
- },
- top: function() {
- $.ui.position.flip.top.apply( this, arguments );
- $.ui.position.fit.top.apply( this, arguments );
- }
- }
-};
-
-} )();
-
-var position = $.ui.position;
-
-
-/*!
- * jQuery UI :data 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :data Selector
-//>>group: Core
-//>>description: Selects elements which have data stored under the specified key.
-//>>docs: http://api.jqueryui.com/data-selector/
-
-
-var data = $.extend( $.expr[ ":" ], {
- data: $.expr.createPseudo ?
- $.expr.createPseudo( function( dataName ) {
- return function( elem ) {
- return !!$.data( elem, dataName );
- };
- } ) :
-
- // Support: jQuery <1.8
- function( elem, i, match ) {
- return !!$.data( elem, match[ 3 ] );
- }
-} );
-
-/*!
- * jQuery UI Disable Selection 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: disableSelection
-//>>group: Core
-//>>description: Disable selection of text content within the set of matched elements.
-//>>docs: http://api.jqueryui.com/disableSelection/
-
-// This file is deprecated
-
-
-var disableSelection = $.fn.extend( {
- disableSelection: ( function() {
- var eventType = "onselectstart" in document.createElement( "div" ) ?
- "selectstart" :
- "mousedown";
-
- return function() {
- return this.on( eventType + ".ui-disableSelection", function( event ) {
- event.preventDefault();
- } );
- };
- } )(),
-
- enableSelection: function() {
- return this.off( ".ui-disableSelection" );
- }
-} );
-
-
-/*!
- * jQuery UI Focusable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :focusable Selector
-//>>group: Core
-//>>description: Selects elements which can be focused.
-//>>docs: http://api.jqueryui.com/focusable-selector/
-
-
-
-// Selectors
-$.ui.focusable = function( element, hasTabindex ) {
- var map, mapName, img, focusableIfVisible, fieldset,
- nodeName = element.nodeName.toLowerCase();
-
- if ( "area" === nodeName ) {
- map = element.parentNode;
- mapName = map.name;
- if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
- return false;
- }
- img = $( "img[usemap='#" + mapName + "']" );
- return img.length > 0 && img.is( ":visible" );
- }
-
- if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) {
- focusableIfVisible = !element.disabled;
-
- if ( focusableIfVisible ) {
-
- // Form controls within a disabled fieldset are disabled.
- // However, controls within the fieldset's legend do not get disabled.
- // Since controls generally aren't placed inside legends, we skip
- // this portion of the check.
- fieldset = $( element ).closest( "fieldset" )[ 0 ];
- if ( fieldset ) {
- focusableIfVisible = !fieldset.disabled;
- }
- }
- } else if ( "a" === nodeName ) {
- focusableIfVisible = element.href || hasTabindex;
- } else {
- focusableIfVisible = hasTabindex;
- }
-
- return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) );
-};
-
-// Support: IE 8 only
-// IE 8 doesn't resolve inherit to visible/hidden for computed values
-function visible( element ) {
- var visibility = element.css( "visibility" );
- while ( visibility === "inherit" ) {
- element = element.parent();
- visibility = element.css( "visibility" );
- }
- return visibility !== "hidden";
-}
-
-$.extend( $.expr[ ":" ], {
- focusable: function( element ) {
- return $.ui.focusable( element, $.attr( element, "tabindex" ) != null );
- }
-} );
-
-var focusable = $.ui.focusable;
-
-
-
-
-// Support: IE8 Only
-// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
-// with a string, so we need to find the proper form.
-var form = $.fn.form = function() {
- return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
-};
-
-
-/*!
- * jQuery UI Form Reset Mixin 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Form Reset Mixin
-//>>group: Core
-//>>description: Refresh input widgets when their form is reset
-//>>docs: http://api.jqueryui.com/form-reset-mixin/
-
-
-
-var formResetMixin = $.ui.formResetMixin = {
- _formResetHandler: function() {
- var form = $( this );
-
- // Wait for the form reset to actually happen before refreshing
- setTimeout( function() {
- var instances = form.data( "ui-form-reset-instances" );
- $.each( instances, function() {
- this.refresh();
- } );
- } );
- },
-
- _bindFormResetHandler: function() {
- this.form = this.element.form();
- if ( !this.form.length ) {
- return;
- }
-
- var instances = this.form.data( "ui-form-reset-instances" ) || [];
- if ( !instances.length ) {
-
- // We don't use _on() here because we use a single event handler per form
- this.form.on( "reset.ui-form-reset", this._formResetHandler );
- }
- instances.push( this );
- this.form.data( "ui-form-reset-instances", instances );
- },
-
- _unbindFormResetHandler: function() {
- if ( !this.form.length ) {
- return;
- }
-
- var instances = this.form.data( "ui-form-reset-instances" );
- instances.splice( $.inArray( this, instances ), 1 );
- if ( instances.length ) {
- this.form.data( "ui-form-reset-instances", instances );
- } else {
- this.form
- .removeData( "ui-form-reset-instances" )
- .off( "reset.ui-form-reset" );
- }
- }
-};
-
-
-/*!
- * jQuery UI Support for jQuery core 1.7.x 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- */
-
-//>>label: jQuery 1.7 Support
-//>>group: Core
-//>>description: Support version 1.7.x of jQuery core
-
-
-
-// Support: jQuery 1.7 only
-// Not a great way to check versions, but since we only support 1.7+ and only
-// need to detect <1.8, this is a simple check that should suffice. Checking
-// for "1.7." would be a bit safer, but the version string is 1.7, not 1.7.0
-// and we'll never reach 1.70.0 (if we do, we certainly won't be supporting
-// 1.7 anymore). See #11197 for why we're not using feature detection.
-if ( $.fn.jquery.substring( 0, 3 ) === "1.7" ) {
-
- // Setters for .innerWidth(), .innerHeight(), .outerWidth(), .outerHeight()
- // Unlike jQuery Core 1.8+, these only support numeric values to set the
- // dimensions in pixels
- $.each( [ "Width", "Height" ], function( i, name ) {
- var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
- type = name.toLowerCase(),
- orig = {
- innerWidth: $.fn.innerWidth,
- innerHeight: $.fn.innerHeight,
- outerWidth: $.fn.outerWidth,
- outerHeight: $.fn.outerHeight
- };
-
- function reduce( elem, size, border, margin ) {
- $.each( side, function() {
- size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
- if ( border ) {
- size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
- }
- if ( margin ) {
- size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
- }
- } );
- return size;
- }
-
- $.fn[ "inner" + name ] = function( size ) {
- if ( size === undefined ) {
- return orig[ "inner" + name ].call( this );
- }
-
- return this.each( function() {
- $( this ).css( type, reduce( this, size ) + "px" );
- } );
- };
-
- $.fn[ "outer" + name ] = function( size, margin ) {
- if ( typeof size !== "number" ) {
- return orig[ "outer" + name ].call( this, size );
- }
-
- return this.each( function() {
- $( this ).css( type, reduce( this, size, true, margin ) + "px" );
- } );
- };
- } );
-
- $.fn.addBack = function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
- );
- };
-}
-
-;
-/*!
- * jQuery UI Keycode 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Keycode
-//>>group: Core
-//>>description: Provide keycodes as keynames
-//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
-
-
-var keycode = $.ui.keyCode = {
- BACKSPACE: 8,
- COMMA: 188,
- DELETE: 46,
- DOWN: 40,
- END: 35,
- ENTER: 13,
- ESCAPE: 27,
- HOME: 36,
- LEFT: 37,
- PAGE_DOWN: 34,
- PAGE_UP: 33,
- PERIOD: 190,
- RIGHT: 39,
- SPACE: 32,
- TAB: 9,
- UP: 38
-};
-
-
-
-
-// Internal use only
-var escapeSelector = $.ui.escapeSelector = ( function() {
- var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
- return function( selector ) {
- return selector.replace( selectorEscape, "\\$1" );
- };
-} )();
-
-
-/*!
- * jQuery UI Labels 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: labels
-//>>group: Core
-//>>description: Find all the labels associated with a given input
-//>>docs: http://api.jqueryui.com/labels/
-
-
-
-var labels = $.fn.labels = function() {
- var ancestor, selector, id, labels, ancestors;
-
- // Check control.labels first
- if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
- return this.pushStack( this[ 0 ].labels );
- }
-
- // Support: IE <= 11, FF <= 37, Android <= 2.3 only
- // Above browsers do not support control.labels. Everything below is to support them
- // as well as document fragments. control.labels does not work on document fragments
- labels = this.eq( 0 ).parents( "label" );
-
- // Look for the label based on the id
- id = this.attr( "id" );
- if ( id ) {
-
- // We don't search against the document in case the element
- // is disconnected from the DOM
- ancestor = this.eq( 0 ).parents().last();
-
- // Get a full set of top level ancestors
- ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
-
- // Create a selector for the label based on the id
- selector = "label[for='" + $.ui.escapeSelector( id ) + "']";
-
- labels = labels.add( ancestors.find( selector ).addBack( selector ) );
-
- }
-
- // Return whatever we have found for labels
- return this.pushStack( labels );
-};
-
-
-/*!
- * jQuery UI Scroll Parent 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: scrollParent
-//>>group: Core
-//>>description: Get the closest ancestor element that is scrollable.
-//>>docs: http://api.jqueryui.com/scrollParent/
-
-
-
-var scrollParent = $.fn.scrollParent = function( includeHidden ) {
- var position = this.css( "position" ),
- excludeStaticParent = position === "absolute",
- overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
- scrollParent = this.parents().filter( function() {
- var parent = $( this );
- if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
- return false;
- }
- return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
- parent.css( "overflow-x" ) );
- } ).eq( 0 );
-
- return position === "fixed" || !scrollParent.length ?
- $( this[ 0 ].ownerDocument || document ) :
- scrollParent;
-};
-
-
-/*!
- * jQuery UI Tabbable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: :tabbable Selector
-//>>group: Core
-//>>description: Selects elements which can be tabbed to.
-//>>docs: http://api.jqueryui.com/tabbable-selector/
-
-
-
-var tabbable = $.extend( $.expr[ ":" ], {
- tabbable: function( element ) {
- var tabIndex = $.attr( element, "tabindex" ),
- hasTabindex = tabIndex != null;
- return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex );
- }
-} );
-
-
-/*!
- * jQuery UI Unique ID 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: uniqueId
-//>>group: Core
-//>>description: Functions to generate and remove uniqueId's
-//>>docs: http://api.jqueryui.com/uniqueId/
-
-
-
-var uniqueId = $.fn.extend( {
- uniqueId: ( function() {
- var uuid = 0;
-
- return function() {
- return this.each( function() {
- if ( !this.id ) {
- this.id = "ui-id-" + ( ++uuid );
- }
- } );
- };
- } )(),
-
- removeUniqueId: function() {
- return this.each( function() {
- if ( /^ui-id-\d+$/.test( this.id ) ) {
- $( this ).removeAttr( "id" );
- }
- } );
- }
-} );
-
-
-
-
-// This file is deprecated
-var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
-
-/*!
- * jQuery UI Mouse 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Mouse
-//>>group: Widgets
-//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
-//>>docs: http://api.jqueryui.com/mouse/
-
-
-
-var mouseHandled = false;
-$( document ).on( "mouseup", function() {
- mouseHandled = false;
-} );
-
-var widgetsMouse = $.widget( "ui.mouse", {
- version: "1.12.1",
- options: {
- cancel: "input, textarea, button, select, option",
- distance: 1,
- delay: 0
- },
- _mouseInit: function() {
- var that = this;
-
- this.element
- .on( "mousedown." + this.widgetName, function( event ) {
- return that._mouseDown( event );
- } )
- .on( "click." + this.widgetName, function( event ) {
- if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
- $.removeData( event.target, that.widgetName + ".preventClickEvent" );
- event.stopImmediatePropagation();
- return false;
- }
- } );
-
- this.started = false;
- },
-
- // TODO: make sure destroying one instance of mouse doesn't mess with
- // other instances of mouse
- _mouseDestroy: function() {
- this.element.off( "." + this.widgetName );
- if ( this._mouseMoveDelegate ) {
- this.document
- .off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
- .off( "mouseup." + this.widgetName, this._mouseUpDelegate );
- }
- },
-
- _mouseDown: function( event ) {
-
- // don't let more than one widget handle mouseStart
- if ( mouseHandled ) {
- return;
- }
-
- this._mouseMoved = false;
-
- // We may have missed mouseup (out of window)
- ( this._mouseStarted && this._mouseUp( event ) );
-
- this._mouseDownEvent = event;
-
- var that = this,
- btnIsLeft = ( event.which === 1 ),
-
- // event.target.nodeName works around a bug in IE 8 with
- // disabled inputs (#7620)
- elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
- $( event.target ).closest( this.options.cancel ).length : false );
- if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
- return true;
- }
-
- this.mouseDelayMet = !this.options.delay;
- if ( !this.mouseDelayMet ) {
- this._mouseDelayTimer = setTimeout( function() {
- that.mouseDelayMet = true;
- }, this.options.delay );
- }
-
- if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
- this._mouseStarted = ( this._mouseStart( event ) !== false );
- if ( !this._mouseStarted ) {
- event.preventDefault();
- return true;
- }
- }
-
- // Click event may never have fired (Gecko & Opera)
- if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
- $.removeData( event.target, this.widgetName + ".preventClickEvent" );
- }
-
- // These delegates are required to keep context
- this._mouseMoveDelegate = function( event ) {
- return that._mouseMove( event );
- };
- this._mouseUpDelegate = function( event ) {
- return that._mouseUp( event );
- };
-
- this.document
- .on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
- .on( "mouseup." + this.widgetName, this._mouseUpDelegate );
-
- event.preventDefault();
-
- mouseHandled = true;
- return true;
- },
-
- _mouseMove: function( event ) {
-
- // Only check for mouseups outside the document if you've moved inside the document
- // at least once. This prevents the firing of mouseup in the case of IE<9, which will
- // fire a mousemove event if content is placed under the cursor. See #7778
- // Support: IE <9
- if ( this._mouseMoved ) {
-
- // IE mouseup check - mouseup happened when mouse was out of window
- if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
- !event.button ) {
- return this._mouseUp( event );
-
- // Iframe mouseup check - mouseup occurred in another document
- } else if ( !event.which ) {
-
- // Support: Safari <=8 - 9
- // Safari sets which to 0 if you press any of the following keys
- // during a drag (#14461)
- if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
- event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
- this.ignoreMissingWhich = true;
- } else if ( !this.ignoreMissingWhich ) {
- return this._mouseUp( event );
- }
- }
- }
-
- if ( event.which || event.button ) {
- this._mouseMoved = true;
- }
-
- if ( this._mouseStarted ) {
- this._mouseDrag( event );
- return event.preventDefault();
- }
-
- if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
- this._mouseStarted =
- ( this._mouseStart( this._mouseDownEvent, event ) !== false );
- ( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
- }
-
- return !this._mouseStarted;
- },
-
- _mouseUp: function( event ) {
- this.document
- .off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
- .off( "mouseup." + this.widgetName, this._mouseUpDelegate );
-
- if ( this._mouseStarted ) {
- this._mouseStarted = false;
-
- if ( event.target === this._mouseDownEvent.target ) {
- $.data( event.target, this.widgetName + ".preventClickEvent", true );
- }
-
- this._mouseStop( event );
- }
-
- if ( this._mouseDelayTimer ) {
- clearTimeout( this._mouseDelayTimer );
- delete this._mouseDelayTimer;
- }
-
- this.ignoreMissingWhich = false;
- mouseHandled = false;
- event.preventDefault();
- },
-
- _mouseDistanceMet: function( event ) {
- return ( Math.max(
- Math.abs( this._mouseDownEvent.pageX - event.pageX ),
- Math.abs( this._mouseDownEvent.pageY - event.pageY )
- ) >= this.options.distance
- );
- },
-
- _mouseDelayMet: function( /* event */ ) {
- return this.mouseDelayMet;
- },
-
- // These are placeholder methods, to be overriden by extending plugin
- _mouseStart: function( /* event */ ) {},
- _mouseDrag: function( /* event */ ) {},
- _mouseStop: function( /* event */ ) {},
- _mouseCapture: function( /* event */ ) { return true; }
-} );
-
-
-
-
-// $.ui.plugin is deprecated. Use $.widget() extensions instead.
-var plugin = $.ui.plugin = {
- add: function( module, option, set ) {
- var i,
- proto = $.ui[ module ].prototype;
- for ( i in set ) {
- proto.plugins[ i ] = proto.plugins[ i ] || [];
- proto.plugins[ i ].push( [ option, set[ i ] ] );
- }
- },
- call: function( instance, name, args, allowDisconnected ) {
- var i,
- set = instance.plugins[ name ];
-
- if ( !set ) {
- return;
- }
-
- if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
- instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
- return;
- }
-
- for ( i = 0; i < set.length; i++ ) {
- if ( instance.options[ set[ i ][ 0 ] ] ) {
- set[ i ][ 1 ].apply( instance.element, args );
- }
- }
- }
-};
-
-
-
-var safeActiveElement = $.ui.safeActiveElement = function( document ) {
- var activeElement;
-
- // Support: IE 9 only
- // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe>
- try {
- activeElement = document.activeElement;
- } catch ( error ) {
- activeElement = document.body;
- }
-
- // Support: IE 9 - 11 only
- // IE may return null instead of an element
- // Interestingly, this only seems to occur when NOT in an iframe
- if ( !activeElement ) {
- activeElement = document.body;
- }
-
- // Support: IE 11 only
- // IE11 returns a seemingly empty object in some cases when accessing
- // document.activeElement from an <iframe>
- if ( !activeElement.nodeName ) {
- activeElement = document.body;
- }
-
- return activeElement;
-};
-
-
-
-var safeBlur = $.ui.safeBlur = function( element ) {
-
- // Support: IE9 - 10 only
- // If the <body> is blurred, IE will switch windows, see #9420
- if ( element && element.nodeName.toLowerCase() !== "body" ) {
- $( element ).trigger( "blur" );
- }
-};
-
-
-/*!
- * jQuery UI Draggable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Draggable
-//>>group: Interactions
-//>>description: Enables dragging functionality for any element.
-//>>docs: http://api.jqueryui.com/draggable/
-//>>demos: http://jqueryui.com/draggable/
-//>>css.structure: ../../themes/base/draggable.css
-
-
-
-$.widget( "ui.draggable", $.ui.mouse, {
- version: "1.12.1",
- widgetEventPrefix: "drag",
- options: {
- addClasses: true,
- appendTo: "parent",
- axis: false,
- connectToSortable: false,
- containment: false,
- cursor: "auto",
- cursorAt: false,
- grid: false,
- handle: false,
- helper: "original",
- iframeFix: false,
- opacity: false,
- refreshPositions: false,
- revert: false,
- revertDuration: 500,
- scope: "default",
- scroll: true,
- scrollSensitivity: 20,
- scrollSpeed: 20,
- snap: false,
- snapMode: "both",
- snapTolerance: 20,
- stack: false,
- zIndex: false,
-
- // Callbacks
- drag: null,
- start: null,
- stop: null
- },
- _create: function() {
-
- if ( this.options.helper === "original" ) {
- this._setPositionRelative();
- }
- if ( this.options.addClasses ) {
- this._addClass( "ui-draggable" );
- }
- this._setHandleClassName();
-
- this._mouseInit();
- },
-
- _setOption: function( key, value ) {
- this._super( key, value );
- if ( key === "handle" ) {
- this._removeHandleClassName();
- this._setHandleClassName();
- }
- },
-
- _destroy: function() {
- if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) {
- this.destroyOnClear = true;
- return;
- }
- this._removeHandleClassName();
- this._mouseDestroy();
- },
-
- _mouseCapture: function( event ) {
- var o = this.options;
-
- // Among others, prevent a drag on a resizable-handle
- if ( this.helper || o.disabled ||
- $( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
- return false;
- }
-
- //Quit if we're not on a valid handle
- this.handle = this._getHandle( event );
- if ( !this.handle ) {
- return false;
- }
-
- this._blurActiveElement( event );
-
- this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );
-
- return true;
-
- },
-
- _blockFrames: function( selector ) {
- this.iframeBlocks = this.document.find( selector ).map( function() {
- var iframe = $( this );
-
- return $( "<div>" )
- .css( "position", "absolute" )
- .appendTo( iframe.parent() )
- .outerWidth( iframe.outerWidth() )
- .outerHeight( iframe.outerHeight() )
- .offset( iframe.offset() )[ 0 ];
- } );
- },
-
- _unblockFrames: function() {
- if ( this.iframeBlocks ) {
- this.iframeBlocks.remove();
- delete this.iframeBlocks;
- }
- },
-
- _blurActiveElement: function( event ) {
- var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
- target = $( event.target );
-
- // Don't blur if the event occurred on an element that is within
- // the currently focused element
- // See #10527, #12472
- if ( target.closest( activeElement ).length ) {
- return;
- }
-
- // Blur any element that currently has focus, see #4261
- $.ui.safeBlur( activeElement );
- },
-
- _mouseStart: function( event ) {
-
- var o = this.options;
-
- //Create and append the visible helper
- this.helper = this._createHelper( event );
-
- this._addClass( this.helper, "ui-draggable-dragging" );
-
- //Cache the helper size
- this._cacheHelperProportions();
-
- //If ddmanager is used for droppables, set the global draggable
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.current = this;
- }
-
- /*
- * - Position generation -
- * This block generates everything position related - it's the core of draggables.
- */
-
- //Cache the margins of the original element
- this._cacheMargins();
-
- //Store the helper's css position
- this.cssPosition = this.helper.css( "position" );
- this.scrollParent = this.helper.scrollParent( true );
- this.offsetParent = this.helper.offsetParent();
- this.hasFixedAncestor = this.helper.parents().filter( function() {
- return $( this ).css( "position" ) === "fixed";
- } ).length > 0;
-
- //The element's absolute position on the page minus margins
- this.positionAbs = this.element.offset();
- this._refreshOffsets( event );
-
- //Generate the original position
- this.originalPosition = this.position = this._generatePosition( event, false );
- this.originalPageX = event.pageX;
- this.originalPageY = event.pageY;
-
- //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
- ( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
-
- //Set a containment if given in the options
- this._setContainment();
-
- //Trigger event + callbacks
- if ( this._trigger( "start", event ) === false ) {
- this._clear();
- return false;
- }
-
- //Recache the helper size
- this._cacheHelperProportions();
-
- //Prepare the droppable offsets
- if ( $.ui.ddmanager && !o.dropBehaviour ) {
- $.ui.ddmanager.prepareOffsets( this, event );
- }
-
- // Execute the drag once - this causes the helper not to be visible before getting its
- // correct position
- this._mouseDrag( event, true );
-
- // If the ddmanager is used for droppables, inform the manager that dragging has started
- // (see #5003)
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.dragStart( this, event );
- }
-
- return true;
- },
-
- _refreshOffsets: function( event ) {
- this.offset = {
- top: this.positionAbs.top - this.margins.top,
- left: this.positionAbs.left - this.margins.left,
- scroll: false,
- parent: this._getParentOffset(),
- relative: this._getRelativeOffset()
- };
-
- this.offset.click = {
- left: event.pageX - this.offset.left,
- top: event.pageY - this.offset.top
- };
- },
-
- _mouseDrag: function( event, noPropagation ) {
-
- // reset any necessary cached properties (see #5009)
- if ( this.hasFixedAncestor ) {
- this.offset.parent = this._getParentOffset();
- }
-
- //Compute the helpers position
- this.position = this._generatePosition( event, true );
- this.positionAbs = this._convertPositionTo( "absolute" );
-
- //Call plugins and callbacks and use the resulting position if something is returned
- if ( !noPropagation ) {
- var ui = this._uiHash();
- if ( this._trigger( "drag", event, ui ) === false ) {
- this._mouseUp( new $.Event( "mouseup", event ) );
- return false;
- }
- this.position = ui.position;
- }
-
- this.helper[ 0 ].style.left = this.position.left + "px";
- this.helper[ 0 ].style.top = this.position.top + "px";
-
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.drag( this, event );
- }
-
- return false;
- },
-
- _mouseStop: function( event ) {
-
- //If we are using droppables, inform the manager about the drop
- var that = this,
- dropped = false;
- if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
- dropped = $.ui.ddmanager.drop( this, event );
- }
-
- //if a drop comes from outside (a sortable)
- if ( this.dropped ) {
- dropped = this.dropped;
- this.dropped = false;
- }
-
- if ( ( this.options.revert === "invalid" && !dropped ) ||
- ( this.options.revert === "valid" && dropped ) ||
- this.options.revert === true || ( $.isFunction( this.options.revert ) &&
- this.options.revert.call( this.element, dropped ) )
- ) {
- $( this.helper ).animate(
- this.originalPosition,
- parseInt( this.options.revertDuration, 10 ),
- function() {
- if ( that._trigger( "stop", event ) !== false ) {
- that._clear();
- }
- }
- );
- } else {
- if ( this._trigger( "stop", event ) !== false ) {
- this._clear();
- }
- }
-
- return false;
- },
-
- _mouseUp: function( event ) {
- this._unblockFrames();
-
- // If the ddmanager is used for droppables, inform the manager that dragging has stopped
- // (see #5003)
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.dragStop( this, event );
- }
-
- // Only need to focus if the event occurred on the draggable itself, see #10527
- if ( this.handleElement.is( event.target ) ) {
-
- // The interaction is over; whether or not the click resulted in a drag,
- // focus the element
- this.element.trigger( "focus" );
- }
-
- return $.ui.mouse.prototype._mouseUp.call( this, event );
- },
-
- cancel: function() {
-
- if ( this.helper.is( ".ui-draggable-dragging" ) ) {
- this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) );
- } else {
- this._clear();
- }
-
- return this;
-
- },
-
- _getHandle: function( event ) {
- return this.options.handle ?
- !!$( event.target ).closest( this.element.find( this.options.handle ) ).length :
- true;
- },
-
- _setHandleClassName: function() {
- this.handleElement = this.options.handle ?
- this.element.find( this.options.handle ) : this.element;
- this._addClass( this.handleElement, "ui-draggable-handle" );
- },
-
- _removeHandleClassName: function() {
- this._removeClass( this.handleElement, "ui-draggable-handle" );
- },
-
- _createHelper: function( event ) {
-
- var o = this.options,
- helperIsFunction = $.isFunction( o.helper ),
- helper = helperIsFunction ?
- $( o.helper.apply( this.element[ 0 ], [ event ] ) ) :
- ( o.helper === "clone" ?
- this.element.clone().removeAttr( "id" ) :
- this.element );
-
- if ( !helper.parents( "body" ).length ) {
- helper.appendTo( ( o.appendTo === "parent" ?
- this.element[ 0 ].parentNode :
- o.appendTo ) );
- }
-
- // Http://bugs.jqueryui.com/ticket/9446
- // a helper function can return the original element
- // which wouldn't have been set to relative in _create
- if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {
- this._setPositionRelative();
- }
-
- if ( helper[ 0 ] !== this.element[ 0 ] &&
- !( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
- helper.css( "position", "absolute" );
- }
-
- return helper;
-
- },
-
- _setPositionRelative: function() {
- if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) {
- this.element[ 0 ].style.position = "relative";
- }
- },
-
- _adjustOffsetFromHelper: function( obj ) {
- if ( typeof obj === "string" ) {
- obj = obj.split( " " );
- }
- if ( $.isArray( obj ) ) {
- obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
- }
- if ( "left" in obj ) {
- this.offset.click.left = obj.left + this.margins.left;
- }
- if ( "right" in obj ) {
- this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
- }
- if ( "top" in obj ) {
- this.offset.click.top = obj.top + this.margins.top;
- }
- if ( "bottom" in obj ) {
- this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
- }
- },
-
- _isRootNode: function( element ) {
- return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];
- },
-
- _getParentOffset: function() {
-
- //Get the offsetParent and cache its position
- var po = this.offsetParent.offset(),
- document = this.document[ 0 ];
-
- // This is a special case where we need to modify a offset calculated on start, since the
- // following happened:
- // 1. The position of the helper is absolute, so it's position is calculated based on the
- // next positioned parent
- // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
- // the document, which means that the scroll is included in the initial calculation of the
- // offset of the parent, and never recalculated upon drag
- if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
- $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
- po.left += this.scrollParent.scrollLeft();
- po.top += this.scrollParent.scrollTop();
- }
-
- if ( this._isRootNode( this.offsetParent[ 0 ] ) ) {
- po = { top: 0, left: 0 };
- }
-
- return {
- top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
- left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
- };
-
- },
-
- _getRelativeOffset: function() {
- if ( this.cssPosition !== "relative" ) {
- return { top: 0, left: 0 };
- }
-
- var p = this.element.position(),
- scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
-
- return {
- top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
- ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),
- left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
- ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )
- };
-
- },
-
- _cacheMargins: function() {
- this.margins = {
- left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ),
- top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ),
- right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ),
- bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 )
- };
- },
-
- _cacheHelperProportions: function() {
- this.helperProportions = {
- width: this.helper.outerWidth(),
- height: this.helper.outerHeight()
- };
- },
-
- _setContainment: function() {
-
- var isUserScrollable, c, ce,
- o = this.options,
- document = this.document[ 0 ];
-
- this.relativeContainer = null;
-
- if ( !o.containment ) {
- this.containment = null;
- return;
- }
-
- if ( o.containment === "window" ) {
- this.containment = [
- $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
- $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
- $( window ).scrollLeft() + $( window ).width() -
- this.helperProportions.width - this.margins.left,
- $( window ).scrollTop() +
- ( $( window ).height() || document.body.parentNode.scrollHeight ) -
- this.helperProportions.height - this.margins.top
- ];
- return;
- }
-
- if ( o.containment === "document" ) {
- this.containment = [
- 0,
- 0,
- $( document ).width() - this.helperProportions.width - this.margins.left,
- ( $( document ).height() || document.body.parentNode.scrollHeight ) -
- this.helperProportions.height - this.margins.top
- ];
- return;
- }
-
- if ( o.containment.constructor === Array ) {
- this.containment = o.containment;
- return;
- }
-
- if ( o.containment === "parent" ) {
- o.containment = this.helper[ 0 ].parentNode;
- }
-
- c = $( o.containment );
- ce = c[ 0 ];
-
- if ( !ce ) {
- return;
- }
-
- isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) );
-
- this.containment = [
- ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
- ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
- ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
- ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
- ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
- ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
- ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
- this.helperProportions.width -
- this.margins.left -
- this.margins.right,
- ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
- ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
- ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
- this.helperProportions.height -
- this.margins.top -
- this.margins.bottom
- ];
- this.relativeContainer = c;
- },
-
- _convertPositionTo: function( d, pos ) {
-
- if ( !pos ) {
- pos = this.position;
- }
-
- var mod = d === "absolute" ? 1 : -1,
- scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );
-
- return {
- top: (
-
- // The absolute mouse position
- pos.top +
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.top * mod +
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.top * mod -
- ( ( this.cssPosition === "fixed" ?
- -this.offset.scroll.top :
- ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )
- ),
- left: (
-
- // The absolute mouse position
- pos.left +
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.left * mod +
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.left * mod -
- ( ( this.cssPosition === "fixed" ?
- -this.offset.scroll.left :
- ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )
- )
- };
-
- },
-
- _generatePosition: function( event, constrainPosition ) {
-
- var containment, co, top, left,
- o = this.options,
- scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),
- pageX = event.pageX,
- pageY = event.pageY;
-
- // Cache the scroll
- if ( !scrollIsRootNode || !this.offset.scroll ) {
- this.offset.scroll = {
- top: this.scrollParent.scrollTop(),
- left: this.scrollParent.scrollLeft()
- };
- }
-
- /*
- * - Position constraining -
- * Constrain the position to a mix of grid, containment.
- */
-
- // If we are not dragging yet, we won't check for options
- if ( constrainPosition ) {
- if ( this.containment ) {
- if ( this.relativeContainer ) {
- co = this.relativeContainer.offset();
- containment = [
- this.containment[ 0 ] + co.left,
- this.containment[ 1 ] + co.top,
- this.containment[ 2 ] + co.left,
- this.containment[ 3 ] + co.top
- ];
- } else {
- containment = this.containment;
- }
-
- if ( event.pageX - this.offset.click.left < containment[ 0 ] ) {
- pageX = containment[ 0 ] + this.offset.click.left;
- }
- if ( event.pageY - this.offset.click.top < containment[ 1 ] ) {
- pageY = containment[ 1 ] + this.offset.click.top;
- }
- if ( event.pageX - this.offset.click.left > containment[ 2 ] ) {
- pageX = containment[ 2 ] + this.offset.click.left;
- }
- if ( event.pageY - this.offset.click.top > containment[ 3 ] ) {
- pageY = containment[ 3 ] + this.offset.click.top;
- }
- }
-
- if ( o.grid ) {
-
- //Check for grid elements set to 0 to prevent divide by 0 error causing invalid
- // argument errors in IE (see ticket #6950)
- top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -
- this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
- pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
- top - this.offset.click.top > containment[ 3 ] ) ?
- top :
- ( ( top - this.offset.click.top >= containment[ 1 ] ) ?
- top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
-
- left = o.grid[ 0 ] ? this.originalPageX +
- Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
- this.originalPageX;
- pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
- left - this.offset.click.left > containment[ 2 ] ) ?
- left :
- ( ( left - this.offset.click.left >= containment[ 0 ] ) ?
- left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
- }
-
- if ( o.axis === "y" ) {
- pageX = this.originalPageX;
- }
-
- if ( o.axis === "x" ) {
- pageY = this.originalPageY;
- }
- }
-
- return {
- top: (
-
- // The absolute mouse position
- pageY -
-
- // Click offset (relative to the element)
- this.offset.click.top -
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.top -
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.top +
- ( this.cssPosition === "fixed" ?
- -this.offset.scroll.top :
- ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )
- ),
- left: (
-
- // The absolute mouse position
- pageX -
-
- // Click offset (relative to the element)
- this.offset.click.left -
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.left -
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.left +
- ( this.cssPosition === "fixed" ?
- -this.offset.scroll.left :
- ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )
- )
- };
-
- },
-
- _clear: function() {
- this._removeClass( this.helper, "ui-draggable-dragging" );
- if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {
- this.helper.remove();
- }
- this.helper = null;
- this.cancelHelperRemoval = false;
- if ( this.destroyOnClear ) {
- this.destroy();
- }
- },
-
- // From now on bulk stuff - mainly helpers
-
- _trigger: function( type, event, ui ) {
- ui = ui || this._uiHash();
- $.ui.plugin.call( this, type, [ event, ui, this ], true );
-
- // Absolute position and offset (see #6884 ) have to be recalculated after plugins
- if ( /^(drag|start|stop)/.test( type ) ) {
- this.positionAbs = this._convertPositionTo( "absolute" );
- ui.offset = this.positionAbs;
- }
- return $.Widget.prototype._trigger.call( this, type, event, ui );
- },
-
- plugins: {},
-
- _uiHash: function() {
- return {
- helper: this.helper,
- position: this.position,
- originalPosition: this.originalPosition,
- offset: this.positionAbs
- };
- }
-
-} );
-
-$.ui.plugin.add( "draggable", "connectToSortable", {
- start: function( event, ui, draggable ) {
- var uiSortable = $.extend( {}, ui, {
- item: draggable.element
- } );
-
- draggable.sortables = [];
- $( draggable.options.connectToSortable ).each( function() {
- var sortable = $( this ).sortable( "instance" );
-
- if ( sortable && !sortable.options.disabled ) {
- draggable.sortables.push( sortable );
-
- // RefreshPositions is called at drag start to refresh the containerCache
- // which is used in drag. This ensures it's initialized and synchronized
- // with any changes that might have happened on the page since initialization.
- sortable.refreshPositions();
- sortable._trigger( "activate", event, uiSortable );
- }
- } );
- },
- stop: function( event, ui, draggable ) {
- var uiSortable = $.extend( {}, ui, {
- item: draggable.element
- } );
-
- draggable.cancelHelperRemoval = false;
-
- $.each( draggable.sortables, function() {
- var sortable = this;
-
- if ( sortable.isOver ) {
- sortable.isOver = 0;
-
- // Allow this sortable to handle removing the helper
- draggable.cancelHelperRemoval = true;
- sortable.cancelHelperRemoval = false;
-
- // Use _storedCSS To restore properties in the sortable,
- // as this also handles revert (#9675) since the draggable
- // may have modified them in unexpected ways (#8809)
- sortable._storedCSS = {
- position: sortable.placeholder.css( "position" ),
- top: sortable.placeholder.css( "top" ),
- left: sortable.placeholder.css( "left" )
- };
-
- sortable._mouseStop( event );
-
- // Once drag has ended, the sortable should return to using
- // its original helper, not the shared helper from draggable
- sortable.options.helper = sortable.options._helper;
- } else {
-
- // Prevent this Sortable from removing the helper.
- // However, don't set the draggable to remove the helper
- // either as another connected Sortable may yet handle the removal.
- sortable.cancelHelperRemoval = true;
-
- sortable._trigger( "deactivate", event, uiSortable );
- }
- } );
- },
- drag: function( event, ui, draggable ) {
- $.each( draggable.sortables, function() {
- var innermostIntersecting = false,
- sortable = this;
-
- // Copy over variables that sortable's _intersectsWith uses
- sortable.positionAbs = draggable.positionAbs;
- sortable.helperProportions = draggable.helperProportions;
- sortable.offset.click = draggable.offset.click;
-
- if ( sortable._intersectsWith( sortable.containerCache ) ) {
- innermostIntersecting = true;
-
- $.each( draggable.sortables, function() {
-
- // Copy over variables that sortable's _intersectsWith uses
- this.positionAbs = draggable.positionAbs;
- this.helperProportions = draggable.helperProportions;
- this.offset.click = draggable.offset.click;
-
- if ( this !== sortable &&
- this._intersectsWith( this.containerCache ) &&
- $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
- innermostIntersecting = false;
- }
-
- return innermostIntersecting;
- } );
- }
-
- if ( innermostIntersecting ) {
-
- // If it intersects, we use a little isOver variable and set it once,
- // so that the move-in stuff gets fired only once.
- if ( !sortable.isOver ) {
- sortable.isOver = 1;
-
- // Store draggable's parent in case we need to reappend to it later.
- draggable._parent = ui.helper.parent();
-
- sortable.currentItem = ui.helper
- .appendTo( sortable.element )
- .data( "ui-sortable-item", true );
-
- // Store helper option to later restore it
- sortable.options._helper = sortable.options.helper;
-
- sortable.options.helper = function() {
- return ui.helper[ 0 ];
- };
-
- // Fire the start events of the sortable with our passed browser event,
- // and our own helper (so it doesn't create a new one)
- event.target = sortable.currentItem[ 0 ];
- sortable._mouseCapture( event, true );
- sortable._mouseStart( event, true, true );
-
- // Because the browser event is way off the new appended portlet,
- // modify necessary variables to reflect the changes
- sortable.offset.click.top = draggable.offset.click.top;
- sortable.offset.click.left = draggable.offset.click.left;
- sortable.offset.parent.left -= draggable.offset.parent.left -
- sortable.offset.parent.left;
- sortable.offset.parent.top -= draggable.offset.parent.top -
- sortable.offset.parent.top;
-
- draggable._trigger( "toSortable", event );
-
- // Inform draggable that the helper is in a valid drop zone,
- // used solely in the revert option to handle "valid/invalid".
- draggable.dropped = sortable.element;
-
- // Need to refreshPositions of all sortables in the case that
- // adding to one sortable changes the location of the other sortables (#9675)
- $.each( draggable.sortables, function() {
- this.refreshPositions();
- } );
-
- // Hack so receive/update callbacks work (mostly)
- draggable.currentItem = draggable.element;
- sortable.fromOutside = draggable;
- }
-
- if ( sortable.currentItem ) {
- sortable._mouseDrag( event );
-
- // Copy the sortable's position because the draggable's can potentially reflect
- // a relative position, while sortable is always absolute, which the dragged
- // element has now become. (#8809)
- ui.position = sortable.position;
- }
- } else {
-
- // If it doesn't intersect with the sortable, and it intersected before,
- // we fake the drag stop of the sortable, but make sure it doesn't remove
- // the helper by using cancelHelperRemoval.
- if ( sortable.isOver ) {
-
- sortable.isOver = 0;
- sortable.cancelHelperRemoval = true;
-
- // Calling sortable's mouseStop would trigger a revert,
- // so revert must be temporarily false until after mouseStop is called.
- sortable.options._revert = sortable.options.revert;
- sortable.options.revert = false;
-
- sortable._trigger( "out", event, sortable._uiHash( sortable ) );
- sortable._mouseStop( event, true );
-
- // Restore sortable behaviors that were modfied
- // when the draggable entered the sortable area (#9481)
- sortable.options.revert = sortable.options._revert;
- sortable.options.helper = sortable.options._helper;
-
- if ( sortable.placeholder ) {
- sortable.placeholder.remove();
- }
-
- // Restore and recalculate the draggable's offset considering the sortable
- // may have modified them in unexpected ways. (#8809, #10669)
- ui.helper.appendTo( draggable._parent );
- draggable._refreshOffsets( event );
- ui.position = draggable._generatePosition( event, true );
-
- draggable._trigger( "fromSortable", event );
-
- // Inform draggable that the helper is no longer in a valid drop zone
- draggable.dropped = false;
-
- // Need to refreshPositions of all sortables just in case removing
- // from one sortable changes the location of other sortables (#9675)
- $.each( draggable.sortables, function() {
- this.refreshPositions();
- } );
- }
- }
- } );
- }
-} );
-
-$.ui.plugin.add( "draggable", "cursor", {
- start: function( event, ui, instance ) {
- var t = $( "body" ),
- o = instance.options;
-
- if ( t.css( "cursor" ) ) {
- o._cursor = t.css( "cursor" );
- }
- t.css( "cursor", o.cursor );
- },
- stop: function( event, ui, instance ) {
- var o = instance.options;
- if ( o._cursor ) {
- $( "body" ).css( "cursor", o._cursor );
- }
- }
-} );
-
-$.ui.plugin.add( "draggable", "opacity", {
- start: function( event, ui, instance ) {
- var t = $( ui.helper ),
- o = instance.options;
- if ( t.css( "opacity" ) ) {
- o._opacity = t.css( "opacity" );
- }
- t.css( "opacity", o.opacity );
- },
- stop: function( event, ui, instance ) {
- var o = instance.options;
- if ( o._opacity ) {
- $( ui.helper ).css( "opacity", o._opacity );
- }
- }
-} );
-
-$.ui.plugin.add( "draggable", "scroll", {
- start: function( event, ui, i ) {
- if ( !i.scrollParentNotHidden ) {
- i.scrollParentNotHidden = i.helper.scrollParent( false );
- }
-
- if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
- i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
- i.overflowOffset = i.scrollParentNotHidden.offset();
- }
- },
- drag: function( event, ui, i ) {
-
- var o = i.options,
- scrolled = false,
- scrollParent = i.scrollParentNotHidden[ 0 ],
- document = i.document[ 0 ];
-
- if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
- if ( !o.axis || o.axis !== "x" ) {
- if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
- o.scrollSensitivity ) {
- scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
- } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
- scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
- }
- }
-
- if ( !o.axis || o.axis !== "y" ) {
- if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
- o.scrollSensitivity ) {
- scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
- } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
- scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
- }
- }
-
- } else {
-
- if ( !o.axis || o.axis !== "x" ) {
- if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
- scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
- } else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
- o.scrollSensitivity ) {
- scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
- }
- }
-
- if ( !o.axis || o.axis !== "y" ) {
- if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {
- scrolled = $( document ).scrollLeft(
- $( document ).scrollLeft() - o.scrollSpeed
- );
- } else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
- o.scrollSensitivity ) {
- scrolled = $( document ).scrollLeft(
- $( document ).scrollLeft() + o.scrollSpeed
- );
- }
- }
-
- }
-
- if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
- $.ui.ddmanager.prepareOffsets( i, event );
- }
-
- }
-} );
-
-$.ui.plugin.add( "draggable", "snap", {
- start: function( event, ui, i ) {
-
- var o = i.options;
-
- i.snapElements = [];
-
- $( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap )
- .each( function() {
- var $t = $( this ),
- $o = $t.offset();
- if ( this !== i.element[ 0 ] ) {
- i.snapElements.push( {
- item: this,
- width: $t.outerWidth(), height: $t.outerHeight(),
- top: $o.top, left: $o.left
- } );
- }
- } );
-
- },
- drag: function( event, ui, inst ) {
-
- var ts, bs, ls, rs, l, r, t, b, i, first,
- o = inst.options,
- d = o.snapTolerance,
- x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
- y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
-
- for ( i = inst.snapElements.length - 1; i >= 0; i-- ) {
-
- l = inst.snapElements[ i ].left - inst.margins.left;
- r = l + inst.snapElements[ i ].width;
- t = inst.snapElements[ i ].top - inst.margins.top;
- b = t + inst.snapElements[ i ].height;
-
- if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
- !$.contains( inst.snapElements[ i ].item.ownerDocument,
- inst.snapElements[ i ].item ) ) {
- if ( inst.snapElements[ i ].snapping ) {
- ( inst.options.snap.release &&
- inst.options.snap.release.call(
- inst.element,
- event,
- $.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )
- ) );
- }
- inst.snapElements[ i ].snapping = false;
- continue;
- }
-
- if ( o.snapMode !== "inner" ) {
- ts = Math.abs( t - y2 ) <= d;
- bs = Math.abs( b - y1 ) <= d;
- ls = Math.abs( l - x2 ) <= d;
- rs = Math.abs( r - x1 ) <= d;
- if ( ts ) {
- ui.position.top = inst._convertPositionTo( "relative", {
- top: t - inst.helperProportions.height,
- left: 0
- } ).top;
- }
- if ( bs ) {
- ui.position.top = inst._convertPositionTo( "relative", {
- top: b,
- left: 0
- } ).top;
- }
- if ( ls ) {
- ui.position.left = inst._convertPositionTo( "relative", {
- top: 0,
- left: l - inst.helperProportions.width
- } ).left;
- }
- if ( rs ) {
- ui.position.left = inst._convertPositionTo( "relative", {
- top: 0,
- left: r
- } ).left;
- }
- }
-
- first = ( ts || bs || ls || rs );
-
- if ( o.snapMode !== "outer" ) {
- ts = Math.abs( t - y1 ) <= d;
- bs = Math.abs( b - y2 ) <= d;
- ls = Math.abs( l - x1 ) <= d;
- rs = Math.abs( r - x2 ) <= d;
- if ( ts ) {
- ui.position.top = inst._convertPositionTo( "relative", {
- top: t,
- left: 0
- } ).top;
- }
- if ( bs ) {
- ui.position.top = inst._convertPositionTo( "relative", {
- top: b - inst.helperProportions.height,
- left: 0
- } ).top;
- }
- if ( ls ) {
- ui.position.left = inst._convertPositionTo( "relative", {
- top: 0,
- left: l
- } ).left;
- }
- if ( rs ) {
- ui.position.left = inst._convertPositionTo( "relative", {
- top: 0,
- left: r - inst.helperProportions.width
- } ).left;
- }
- }
-
- if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {
- ( inst.options.snap.snap &&
- inst.options.snap.snap.call(
- inst.element,
- event,
- $.extend( inst._uiHash(), {
- snapItem: inst.snapElements[ i ].item
- } ) ) );
- }
- inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );
-
- }
-
- }
-} );
-
-$.ui.plugin.add( "draggable", "stack", {
- start: function( event, ui, instance ) {
- var min,
- o = instance.options,
- group = $.makeArray( $( o.stack ) ).sort( function( a, b ) {
- return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) -
- ( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 );
- } );
-
- if ( !group.length ) { return; }
-
- min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0;
- $( group ).each( function( i ) {
- $( this ).css( "zIndex", min + i );
- } );
- this.css( "zIndex", ( min + group.length ) );
- }
-} );
-
-$.ui.plugin.add( "draggable", "zIndex", {
- start: function( event, ui, instance ) {
- var t = $( ui.helper ),
- o = instance.options;
-
- if ( t.css( "zIndex" ) ) {
- o._zIndex = t.css( "zIndex" );
- }
- t.css( "zIndex", o.zIndex );
- },
- stop: function( event, ui, instance ) {
- var o = instance.options;
-
- if ( o._zIndex ) {
- $( ui.helper ).css( "zIndex", o._zIndex );
- }
- }
-} );
-
-var widgetsDraggable = $.ui.draggable;
-
-
-/*!
- * jQuery UI Droppable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Droppable
-//>>group: Interactions
-//>>description: Enables drop targets for draggable elements.
-//>>docs: http://api.jqueryui.com/droppable/
-//>>demos: http://jqueryui.com/droppable/
-
-
-
-$.widget( "ui.droppable", {
- version: "1.12.1",
- widgetEventPrefix: "drop",
- options: {
- accept: "*",
- addClasses: true,
- greedy: false,
- scope: "default",
- tolerance: "intersect",
-
- // Callbacks
- activate: null,
- deactivate: null,
- drop: null,
- out: null,
- over: null
- },
- _create: function() {
-
- var proportions,
- o = this.options,
- accept = o.accept;
-
- this.isover = false;
- this.isout = true;
-
- this.accept = $.isFunction( accept ) ? accept : function( d ) {
- return d.is( accept );
- };
-
- this.proportions = function( /* valueToWrite */ ) {
- if ( arguments.length ) {
-
- // Store the droppable's proportions
- proportions = arguments[ 0 ];
- } else {
-
- // Retrieve or derive the droppable's proportions
- return proportions ?
- proportions :
- proportions = {
- width: this.element[ 0 ].offsetWidth,
- height: this.element[ 0 ].offsetHeight
- };
- }
- };
-
- this._addToManager( o.scope );
-
- o.addClasses && this._addClass( "ui-droppable" );
-
- },
-
- _addToManager: function( scope ) {
-
- // Add the reference and positions to the manager
- $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];
- $.ui.ddmanager.droppables[ scope ].push( this );
- },
-
- _splice: function( drop ) {
- var i = 0;
- for ( ; i < drop.length; i++ ) {
- if ( drop[ i ] === this ) {
- drop.splice( i, 1 );
- }
- }
- },
-
- _destroy: function() {
- var drop = $.ui.ddmanager.droppables[ this.options.scope ];
-
- this._splice( drop );
- },
-
- _setOption: function( key, value ) {
-
- if ( key === "accept" ) {
- this.accept = $.isFunction( value ) ? value : function( d ) {
- return d.is( value );
- };
- } else if ( key === "scope" ) {
- var drop = $.ui.ddmanager.droppables[ this.options.scope ];
-
- this._splice( drop );
- this._addToManager( value );
- }
-
- this._super( key, value );
- },
-
- _activate: function( event ) {
- var draggable = $.ui.ddmanager.current;
-
- this._addActiveClass();
- if ( draggable ) {
- this._trigger( "activate", event, this.ui( draggable ) );
- }
- },
-
- _deactivate: function( event ) {
- var draggable = $.ui.ddmanager.current;
-
- this._removeActiveClass();
- if ( draggable ) {
- this._trigger( "deactivate", event, this.ui( draggable ) );
- }
- },
-
- _over: function( event ) {
-
- var draggable = $.ui.ddmanager.current;
-
- // Bail if draggable and droppable are same element
- if ( !draggable || ( draggable.currentItem ||
- draggable.element )[ 0 ] === this.element[ 0 ] ) {
- return;
- }
-
- if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
- draggable.element ) ) ) {
- this._addHoverClass();
- this._trigger( "over", event, this.ui( draggable ) );
- }
-
- },
-
- _out: function( event ) {
-
- var draggable = $.ui.ddmanager.current;
-
- // Bail if draggable and droppable are same element
- if ( !draggable || ( draggable.currentItem ||
- draggable.element )[ 0 ] === this.element[ 0 ] ) {
- return;
- }
-
- if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
- draggable.element ) ) ) {
- this._removeHoverClass();
- this._trigger( "out", event, this.ui( draggable ) );
- }
-
- },
-
- _drop: function( event, custom ) {
-
- var draggable = custom || $.ui.ddmanager.current,
- childrenIntersection = false;
-
- // Bail if draggable and droppable are same element
- if ( !draggable || ( draggable.currentItem ||
- draggable.element )[ 0 ] === this.element[ 0 ] ) {
- return false;
- }
-
- this.element
- .find( ":data(ui-droppable)" )
- .not( ".ui-draggable-dragging" )
- .each( function() {
- var inst = $( this ).droppable( "instance" );
- if (
- inst.options.greedy &&
- !inst.options.disabled &&
- inst.options.scope === draggable.options.scope &&
- inst.accept.call(
- inst.element[ 0 ], ( draggable.currentItem || draggable.element )
- ) &&
- intersect(
- draggable,
- $.extend( inst, { offset: inst.element.offset() } ),
- inst.options.tolerance, event
- )
- ) {
- childrenIntersection = true;
- return false; }
- } );
- if ( childrenIntersection ) {
- return false;
- }
-
- if ( this.accept.call( this.element[ 0 ],
- ( draggable.currentItem || draggable.element ) ) ) {
- this._removeActiveClass();
- this._removeHoverClass();
-
- this._trigger( "drop", event, this.ui( draggable ) );
- return this.element;
- }
-
- return false;
-
- },
-
- ui: function( c ) {
- return {
- draggable: ( c.currentItem || c.element ),
- helper: c.helper,
- position: c.position,
- offset: c.positionAbs
- };
- },
-
- // Extension points just to make backcompat sane and avoid duplicating logic
- // TODO: Remove in 1.13 along with call to it below
- _addHoverClass: function() {
- this._addClass( "ui-droppable-hover" );
- },
-
- _removeHoverClass: function() {
- this._removeClass( "ui-droppable-hover" );
- },
-
- _addActiveClass: function() {
- this._addClass( "ui-droppable-active" );
- },
-
- _removeActiveClass: function() {
- this._removeClass( "ui-droppable-active" );
- }
-} );
-
-var intersect = $.ui.intersect = ( function() {
- function isOverAxis( x, reference, size ) {
- return ( x >= reference ) && ( x < ( reference + size ) );
- }
-
- return function( draggable, droppable, toleranceMode, event ) {
-
- if ( !droppable.offset ) {
- return false;
- }
-
- var x1 = ( draggable.positionAbs ||
- draggable.position.absolute ).left + draggable.margins.left,
- y1 = ( draggable.positionAbs ||
- draggable.position.absolute ).top + draggable.margins.top,
- x2 = x1 + draggable.helperProportions.width,
- y2 = y1 + draggable.helperProportions.height,
- l = droppable.offset.left,
- t = droppable.offset.top,
- r = l + droppable.proportions().width,
- b = t + droppable.proportions().height;
-
- switch ( toleranceMode ) {
- case "fit":
- return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
- case "intersect":
- return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
- x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
- t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
- y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
- case "pointer":
- return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
- isOverAxis( event.pageX, l, droppable.proportions().width );
- case "touch":
- return (
- ( y1 >= t && y1 <= b ) || // Top edge touching
- ( y2 >= t && y2 <= b ) || // Bottom edge touching
- ( y1 < t && y2 > b ) // Surrounded vertically
- ) && (
- ( x1 >= l && x1 <= r ) || // Left edge touching
- ( x2 >= l && x2 <= r ) || // Right edge touching
- ( x1 < l && x2 > r ) // Surrounded horizontally
- );
- default:
- return false;
- }
- };
-} )();
-
-/*
- This manager tracks offsets of draggables and droppables
-*/
-$.ui.ddmanager = {
- current: null,
- droppables: { "default": [] },
- prepareOffsets: function( t, event ) {
-
- var i, j,
- m = $.ui.ddmanager.droppables[ t.options.scope ] || [],
- type = event ? event.type : null, // workaround for #2317
- list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack();
-
- droppablesLoop: for ( i = 0; i < m.length; i++ ) {
-
- // No disabled and non-accepted
- if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
- ( t.currentItem || t.element ) ) ) ) {
- continue;
- }
-
- // Filter out elements in the current dragged item
- for ( j = 0; j < list.length; j++ ) {
- if ( list[ j ] === m[ i ].element[ 0 ] ) {
- m[ i ].proportions().height = 0;
- continue droppablesLoop;
- }
- }
-
- m[ i ].visible = m[ i ].element.css( "display" ) !== "none";
- if ( !m[ i ].visible ) {
- continue;
- }
-
- // Activate the droppable if used directly from draggables
- if ( type === "mousedown" ) {
- m[ i ]._activate.call( m[ i ], event );
- }
-
- m[ i ].offset = m[ i ].element.offset();
- m[ i ].proportions( {
- width: m[ i ].element[ 0 ].offsetWidth,
- height: m[ i ].element[ 0 ].offsetHeight
- } );
-
- }
-
- },
- drop: function( draggable, event ) {
-
- var dropped = false;
-
- // Create a copy of the droppables in case the list changes during the drop (#9116)
- $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {
-
- if ( !this.options ) {
- return;
- }
- if ( !this.options.disabled && this.visible &&
- intersect( draggable, this, this.options.tolerance, event ) ) {
- dropped = this._drop.call( this, event ) || dropped;
- }
-
- if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
- ( draggable.currentItem || draggable.element ) ) ) {
- this.isout = true;
- this.isover = false;
- this._deactivate.call( this, event );
- }
-
- } );
- return dropped;
-
- },
- dragStart: function( draggable, event ) {
-
- // Listen for scrolling so that if the dragging causes scrolling the position of the
- // droppables can be recalculated (see #5003)
- draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() {
- if ( !draggable.options.refreshPositions ) {
- $.ui.ddmanager.prepareOffsets( draggable, event );
- }
- } );
- },
- drag: function( draggable, event ) {
-
- // If you have a highly dynamic page, you might try this option. It renders positions
- // every time you move the mouse.
- if ( draggable.options.refreshPositions ) {
- $.ui.ddmanager.prepareOffsets( draggable, event );
- }
-
- // Run through all droppables and check their positions based on specific tolerance options
- $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {
-
- if ( this.options.disabled || this.greedyChild || !this.visible ) {
- return;
- }
-
- var parentInstance, scope, parent,
- intersects = intersect( draggable, this, this.options.tolerance, event ),
- c = !intersects && this.isover ?
- "isout" :
- ( intersects && !this.isover ? "isover" : null );
- if ( !c ) {
- return;
- }
-
- if ( this.options.greedy ) {
-
- // find droppable parents with same scope
- scope = this.options.scope;
- parent = this.element.parents( ":data(ui-droppable)" ).filter( function() {
- return $( this ).droppable( "instance" ).options.scope === scope;
- } );
-
- if ( parent.length ) {
- parentInstance = $( parent[ 0 ] ).droppable( "instance" );
- parentInstance.greedyChild = ( c === "isover" );
- }
- }
-
- // We just moved into a greedy child
- if ( parentInstance && c === "isover" ) {
- parentInstance.isover = false;
- parentInstance.isout = true;
- parentInstance._out.call( parentInstance, event );
- }
-
- this[ c ] = true;
- this[ c === "isout" ? "isover" : "isout" ] = false;
- this[ c === "isover" ? "_over" : "_out" ].call( this, event );
-
- // We just moved out of a greedy child
- if ( parentInstance && c === "isout" ) {
- parentInstance.isout = false;
- parentInstance.isover = true;
- parentInstance._over.call( parentInstance, event );
- }
- } );
-
- },
- dragStop: function( draggable, event ) {
- draggable.element.parentsUntil( "body" ).off( "scroll.droppable" );
-
- // Call prepareOffsets one final time since IE does not fire return scroll events when
- // overflow was caused by drag (see #5003)
- if ( !draggable.options.refreshPositions ) {
- $.ui.ddmanager.prepareOffsets( draggable, event );
- }
- }
-};
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for activeClass and hoverClass options
- $.widget( "ui.droppable", $.ui.droppable, {
- options: {
- hoverClass: false,
- activeClass: false
- },
- _addActiveClass: function() {
- this._super();
- if ( this.options.activeClass ) {
- this.element.addClass( this.options.activeClass );
- }
- },
- _removeActiveClass: function() {
- this._super();
- if ( this.options.activeClass ) {
- this.element.removeClass( this.options.activeClass );
- }
- },
- _addHoverClass: function() {
- this._super();
- if ( this.options.hoverClass ) {
- this.element.addClass( this.options.hoverClass );
- }
- },
- _removeHoverClass: function() {
- this._super();
- if ( this.options.hoverClass ) {
- this.element.removeClass( this.options.hoverClass );
- }
- }
- } );
-}
-
-var widgetsDroppable = $.ui.droppable;
-
-
-/*!
- * jQuery UI Resizable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Resizable
-//>>group: Interactions
-//>>description: Enables resize functionality for any element.
-//>>docs: http://api.jqueryui.com/resizable/
-//>>demos: http://jqueryui.com/resizable/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/resizable.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.resizable", $.ui.mouse, {
- version: "1.12.1",
- widgetEventPrefix: "resize",
- options: {
- alsoResize: false,
- animate: false,
- animateDuration: "slow",
- animateEasing: "swing",
- aspectRatio: false,
- autoHide: false,
- classes: {
- "ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se"
- },
- containment: false,
- ghost: false,
- grid: false,
- handles: "e,s,se",
- helper: false,
- maxHeight: null,
- maxWidth: null,
- minHeight: 10,
- minWidth: 10,
-
- // See #7960
- zIndex: 90,
-
- // Callbacks
- resize: null,
- start: null,
- stop: null
- },
-
- _num: function( value ) {
- return parseFloat( value ) || 0;
- },
-
- _isNumber: function( value ) {
- return !isNaN( parseFloat( value ) );
- },
-
- _hasScroll: function( el, a ) {
-
- if ( $( el ).css( "overflow" ) === "hidden" ) {
- return false;
- }
-
- var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
- has = false;
-
- if ( el[ scroll ] > 0 ) {
- return true;
- }
-
- // TODO: determine which cases actually cause this to happen
- // if the element doesn't have the scroll set, see if it's possible to
- // set the scroll
- el[ scroll ] = 1;
- has = ( el[ scroll ] > 0 );
- el[ scroll ] = 0;
- return has;
- },
-
- _create: function() {
-
- var margins,
- o = this.options,
- that = this;
- this._addClass( "ui-resizable" );
-
- $.extend( this, {
- _aspectRatio: !!( o.aspectRatio ),
- aspectRatio: o.aspectRatio,
- originalElement: this.element,
- _proportionallyResizeElements: [],
- _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
- } );
-
- // Wrap the element if it cannot hold child nodes
- if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) {
-
- this.element.wrap(
- $( "<div class='ui-wrapper' style='overflow: hidden;'></div>" ).css( {
- position: this.element.css( "position" ),
- width: this.element.outerWidth(),
- height: this.element.outerHeight(),
- top: this.element.css( "top" ),
- left: this.element.css( "left" )
- } )
- );
-
- this.element = this.element.parent().data(
- "ui-resizable", this.element.resizable( "instance" )
- );
-
- this.elementIsWrapper = true;
-
- margins = {
- marginTop: this.originalElement.css( "marginTop" ),
- marginRight: this.originalElement.css( "marginRight" ),
- marginBottom: this.originalElement.css( "marginBottom" ),
- marginLeft: this.originalElement.css( "marginLeft" )
- };
-
- this.element.css( margins );
- this.originalElement.css( "margin", 0 );
-
- // support: Safari
- // Prevent Safari textarea resize
- this.originalResizeStyle = this.originalElement.css( "resize" );
- this.originalElement.css( "resize", "none" );
-
- this._proportionallyResizeElements.push( this.originalElement.css( {
- position: "static",
- zoom: 1,
- display: "block"
- } ) );
-
- // Support: IE9
- // avoid IE jump (hard set the margin)
- this.originalElement.css( margins );
-
- this._proportionallyResize();
- }
-
- this._setupHandles();
-
- if ( o.autoHide ) {
- $( this.element )
- .on( "mouseenter", function() {
- if ( o.disabled ) {
- return;
- }
- that._removeClass( "ui-resizable-autohide" );
- that._handles.show();
- } )
- .on( "mouseleave", function() {
- if ( o.disabled ) {
- return;
- }
- if ( !that.resizing ) {
- that._addClass( "ui-resizable-autohide" );
- that._handles.hide();
- }
- } );
- }
-
- this._mouseInit();
- },
-
- _destroy: function() {
-
- this._mouseDestroy();
-
- var wrapper,
- _destroy = function( exp ) {
- $( exp )
- .removeData( "resizable" )
- .removeData( "ui-resizable" )
- .off( ".resizable" )
- .find( ".ui-resizable-handle" )
- .remove();
- };
-
- // TODO: Unwrap at same DOM position
- if ( this.elementIsWrapper ) {
- _destroy( this.element );
- wrapper = this.element;
- this.originalElement.css( {
- position: wrapper.css( "position" ),
- width: wrapper.outerWidth(),
- height: wrapper.outerHeight(),
- top: wrapper.css( "top" ),
- left: wrapper.css( "left" )
- } ).insertAfter( wrapper );
- wrapper.remove();
- }
-
- this.originalElement.css( "resize", this.originalResizeStyle );
- _destroy( this.originalElement );
-
- return this;
- },
-
- _setOption: function( key, value ) {
- this._super( key, value );
-
- switch ( key ) {
- case "handles":
- this._removeHandles();
- this._setupHandles();
- break;
- default:
- break;
- }
- },
-
- _setupHandles: function() {
- var o = this.options, handle, i, n, hname, axis, that = this;
- this.handles = o.handles ||
- ( !$( ".ui-resizable-handle", this.element ).length ?
- "e,s,se" : {
- n: ".ui-resizable-n",
- e: ".ui-resizable-e",
- s: ".ui-resizable-s",
- w: ".ui-resizable-w",
- se: ".ui-resizable-se",
- sw: ".ui-resizable-sw",
- ne: ".ui-resizable-ne",
- nw: ".ui-resizable-nw"
- } );
-
- this._handles = $();
- if ( this.handles.constructor === String ) {
-
- if ( this.handles === "all" ) {
- this.handles = "n,e,s,w,se,sw,ne,nw";
- }
-
- n = this.handles.split( "," );
- this.handles = {};
-
- for ( i = 0; i < n.length; i++ ) {
-
- handle = $.trim( n[ i ] );
- hname = "ui-resizable-" + handle;
- axis = $( "<div>" );
- this._addClass( axis, "ui-resizable-handle " + hname );
-
- axis.css( { zIndex: o.zIndex } );
-
- this.handles[ handle ] = ".ui-resizable-" + handle;
- this.element.append( axis );
- }
-
- }
-
- this._renderAxis = function( target ) {
-
- var i, axis, padPos, padWrapper;
-
- target = target || this.element;
-
- for ( i in this.handles ) {
-
- if ( this.handles[ i ].constructor === String ) {
- this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show();
- } else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {
- this.handles[ i ] = $( this.handles[ i ] );
- this._on( this.handles[ i ], { "mousedown": that._mouseDown } );
- }
-
- if ( this.elementIsWrapper &&
- this.originalElement[ 0 ]
- .nodeName
- .match( /^(textarea|input|select|button)$/i ) ) {
- axis = $( this.handles[ i ], this.element );
-
- padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
- axis.outerHeight() :
- axis.outerWidth();
-
- padPos = [ "padding",
- /ne|nw|n/.test( i ) ? "Top" :
- /se|sw|s/.test( i ) ? "Bottom" :
- /^e$/.test( i ) ? "Right" : "Left" ].join( "" );
-
- target.css( padPos, padWrapper );
-
- this._proportionallyResize();
- }
-
- this._handles = this._handles.add( this.handles[ i ] );
- }
- };
-
- // TODO: make renderAxis a prototype function
- this._renderAxis( this.element );
-
- this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) );
- this._handles.disableSelection();
-
- this._handles.on( "mouseover", function() {
- if ( !that.resizing ) {
- if ( this.className ) {
- axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i );
- }
- that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se";
- }
- } );
-
- if ( o.autoHide ) {
- this._handles.hide();
- this._addClass( "ui-resizable-autohide" );
- }
- },
-
- _removeHandles: function() {
- this._handles.remove();
- },
-
- _mouseCapture: function( event ) {
- var i, handle,
- capture = false;
-
- for ( i in this.handles ) {
- handle = $( this.handles[ i ] )[ 0 ];
- if ( handle === event.target || $.contains( handle, event.target ) ) {
- capture = true;
- }
- }
-
- return !this.options.disabled && capture;
- },
-
- _mouseStart: function( event ) {
-
- var curleft, curtop, cursor,
- o = this.options,
- el = this.element;
-
- this.resizing = true;
-
- this._renderProxy();
-
- curleft = this._num( this.helper.css( "left" ) );
- curtop = this._num( this.helper.css( "top" ) );
-
- if ( o.containment ) {
- curleft += $( o.containment ).scrollLeft() || 0;
- curtop += $( o.containment ).scrollTop() || 0;
- }
-
- this.offset = this.helper.offset();
- this.position = { left: curleft, top: curtop };
-
- this.size = this._helper ? {
- width: this.helper.width(),
- height: this.helper.height()
- } : {
- width: el.width(),
- height: el.height()
- };
-
- this.originalSize = this._helper ? {
- width: el.outerWidth(),
- height: el.outerHeight()
- } : {
- width: el.width(),
- height: el.height()
- };
-
- this.sizeDiff = {
- width: el.outerWidth() - el.width(),
- height: el.outerHeight() - el.height()
- };
-
- this.originalPosition = { left: curleft, top: curtop };
- this.originalMousePosition = { left: event.pageX, top: event.pageY };
-
- this.aspectRatio = ( typeof o.aspectRatio === "number" ) ?
- o.aspectRatio :
- ( ( this.originalSize.width / this.originalSize.height ) || 1 );
-
- cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" );
- $( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor );
-
- this._addClass( "ui-resizable-resizing" );
- this._propagate( "start", event );
- return true;
- },
-
- _mouseDrag: function( event ) {
-
- var data, props,
- smp = this.originalMousePosition,
- a = this.axis,
- dx = ( event.pageX - smp.left ) || 0,
- dy = ( event.pageY - smp.top ) || 0,
- trigger = this._change[ a ];
-
- this._updatePrevProperties();
-
- if ( !trigger ) {
- return false;
- }
-
- data = trigger.apply( this, [ event, dx, dy ] );
-
- this._updateVirtualBoundaries( event.shiftKey );
- if ( this._aspectRatio || event.shiftKey ) {
- data = this._updateRatio( data, event );
- }
-
- data = this._respectSize( data, event );
-
- this._updateCache( data );
-
- this._propagate( "resize", event );
-
- props = this._applyChanges();
-
- if ( !this._helper && this._proportionallyResizeElements.length ) {
- this._proportionallyResize();
- }
-
- if ( !$.isEmptyObject( props ) ) {
- this._updatePrevProperties();
- this._trigger( "resize", event, this.ui() );
- this._applyChanges();
- }
-
- return false;
- },
-
- _mouseStop: function( event ) {
-
- this.resizing = false;
- var pr, ista, soffseth, soffsetw, s, left, top,
- o = this.options, that = this;
-
- if ( this._helper ) {
-
- pr = this._proportionallyResizeElements;
- ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName );
- soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height;
- soffsetw = ista ? 0 : that.sizeDiff.width;
-
- s = {
- width: ( that.helper.width() - soffsetw ),
- height: ( that.helper.height() - soffseth )
- };
- left = ( parseFloat( that.element.css( "left" ) ) +
- ( that.position.left - that.originalPosition.left ) ) || null;
- top = ( parseFloat( that.element.css( "top" ) ) +
- ( that.position.top - that.originalPosition.top ) ) || null;
-
- if ( !o.animate ) {
- this.element.css( $.extend( s, { top: top, left: left } ) );
- }
-
- that.helper.height( that.size.height );
- that.helper.width( that.size.width );
-
- if ( this._helper && !o.animate ) {
- this._proportionallyResize();
- }
- }
-
- $( "body" ).css( "cursor", "auto" );
-
- this._removeClass( "ui-resizable-resizing" );
-
- this._propagate( "stop", event );
-
- if ( this._helper ) {
- this.helper.remove();
- }
-
- return false;
-
- },
-
- _updatePrevProperties: function() {
- this.prevPosition = {
- top: this.position.top,
- left: this.position.left
- };
- this.prevSize = {
- width: this.size.width,
- height: this.size.height
- };
- },
-
- _applyChanges: function() {
- var props = {};
-
- if ( this.position.top !== this.prevPosition.top ) {
- props.top = this.position.top + "px";
- }
- if ( this.position.left !== this.prevPosition.left ) {
- props.left = this.position.left + "px";
- }
- if ( this.size.width !== this.prevSize.width ) {
- props.width = this.size.width + "px";
- }
- if ( this.size.height !== this.prevSize.height ) {
- props.height = this.size.height + "px";
- }
-
- this.helper.css( props );
-
- return props;
- },
-
- _updateVirtualBoundaries: function( forceAspectRatio ) {
- var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
- o = this.options;
-
- b = {
- minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0,
- maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity,
- minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0,
- maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity
- };
-
- if ( this._aspectRatio || forceAspectRatio ) {
- pMinWidth = b.minHeight * this.aspectRatio;
- pMinHeight = b.minWidth / this.aspectRatio;
- pMaxWidth = b.maxHeight * this.aspectRatio;
- pMaxHeight = b.maxWidth / this.aspectRatio;
-
- if ( pMinWidth > b.minWidth ) {
- b.minWidth = pMinWidth;
- }
- if ( pMinHeight > b.minHeight ) {
- b.minHeight = pMinHeight;
- }
- if ( pMaxWidth < b.maxWidth ) {
- b.maxWidth = pMaxWidth;
- }
- if ( pMaxHeight < b.maxHeight ) {
- b.maxHeight = pMaxHeight;
- }
- }
- this._vBoundaries = b;
- },
-
- _updateCache: function( data ) {
- this.offset = this.helper.offset();
- if ( this._isNumber( data.left ) ) {
- this.position.left = data.left;
- }
- if ( this._isNumber( data.top ) ) {
- this.position.top = data.top;
- }
- if ( this._isNumber( data.height ) ) {
- this.size.height = data.height;
- }
- if ( this._isNumber( data.width ) ) {
- this.size.width = data.width;
- }
- },
-
- _updateRatio: function( data ) {
-
- var cpos = this.position,
- csize = this.size,
- a = this.axis;
-
- if ( this._isNumber( data.height ) ) {
- data.width = ( data.height * this.aspectRatio );
- } else if ( this._isNumber( data.width ) ) {
- data.height = ( data.width / this.aspectRatio );
- }
-
- if ( a === "sw" ) {
- data.left = cpos.left + ( csize.width - data.width );
- data.top = null;
- }
- if ( a === "nw" ) {
- data.top = cpos.top + ( csize.height - data.height );
- data.left = cpos.left + ( csize.width - data.width );
- }
-
- return data;
- },
-
- _respectSize: function( data ) {
-
- var o = this._vBoundaries,
- a = this.axis,
- ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ),
- ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ),
- isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ),
- isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ),
- dw = this.originalPosition.left + this.originalSize.width,
- dh = this.originalPosition.top + this.originalSize.height,
- cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a );
- if ( isminw ) {
- data.width = o.minWidth;
- }
- if ( isminh ) {
- data.height = o.minHeight;
- }
- if ( ismaxw ) {
- data.width = o.maxWidth;
- }
- if ( ismaxh ) {
- data.height = o.maxHeight;
- }
-
- if ( isminw && cw ) {
- data.left = dw - o.minWidth;
- }
- if ( ismaxw && cw ) {
- data.left = dw - o.maxWidth;
- }
- if ( isminh && ch ) {
- data.top = dh - o.minHeight;
- }
- if ( ismaxh && ch ) {
- data.top = dh - o.maxHeight;
- }
-
- // Fixing jump error on top/left - bug #2330
- if ( !data.width && !data.height && !data.left && data.top ) {
- data.top = null;
- } else if ( !data.width && !data.height && !data.top && data.left ) {
- data.left = null;
- }
-
- return data;
- },
-
- _getPaddingPlusBorderDimensions: function( element ) {
- var i = 0,
- widths = [],
- borders = [
- element.css( "borderTopWidth" ),
- element.css( "borderRightWidth" ),
- element.css( "borderBottomWidth" ),
- element.css( "borderLeftWidth" )
- ],
- paddings = [
- element.css( "paddingTop" ),
- element.css( "paddingRight" ),
- element.css( "paddingBottom" ),
- element.css( "paddingLeft" )
- ];
-
- for ( ; i < 4; i++ ) {
- widths[ i ] = ( parseFloat( borders[ i ] ) || 0 );
- widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 );
- }
-
- return {
- height: widths[ 0 ] + widths[ 2 ],
- width: widths[ 1 ] + widths[ 3 ]
- };
- },
-
- _proportionallyResize: function() {
-
- if ( !this._proportionallyResizeElements.length ) {
- return;
- }
-
- var prel,
- i = 0,
- element = this.helper || this.element;
-
- for ( ; i < this._proportionallyResizeElements.length; i++ ) {
-
- prel = this._proportionallyResizeElements[ i ];
-
- // TODO: Seems like a bug to cache this.outerDimensions
- // considering that we are in a loop.
- if ( !this.outerDimensions ) {
- this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
- }
-
- prel.css( {
- height: ( element.height() - this.outerDimensions.height ) || 0,
- width: ( element.width() - this.outerDimensions.width ) || 0
- } );
-
- }
-
- },
-
- _renderProxy: function() {
-
- var el = this.element, o = this.options;
- this.elementOffset = el.offset();
-
- if ( this._helper ) {
-
- this.helper = this.helper || $( "<div style='overflow:hidden;'></div>" );
-
- this._addClass( this.helper, this._helper );
- this.helper.css( {
- width: this.element.outerWidth(),
- height: this.element.outerHeight(),
- position: "absolute",
- left: this.elementOffset.left + "px",
- top: this.elementOffset.top + "px",
- zIndex: ++o.zIndex //TODO: Don't modify option
- } );
-
- this.helper
- .appendTo( "body" )
- .disableSelection();
-
- } else {
- this.helper = this.element;
- }
-
- },
-
- _change: {
- e: function( event, dx ) {
- return { width: this.originalSize.width + dx };
- },
- w: function( event, dx ) {
- var cs = this.originalSize, sp = this.originalPosition;
- return { left: sp.left + dx, width: cs.width - dx };
- },
- n: function( event, dx, dy ) {
- var cs = this.originalSize, sp = this.originalPosition;
- return { top: sp.top + dy, height: cs.height - dy };
- },
- s: function( event, dx, dy ) {
- return { height: this.originalSize.height + dy };
- },
- se: function( event, dx, dy ) {
- return $.extend( this._change.s.apply( this, arguments ),
- this._change.e.apply( this, [ event, dx, dy ] ) );
- },
- sw: function( event, dx, dy ) {
- return $.extend( this._change.s.apply( this, arguments ),
- this._change.w.apply( this, [ event, dx, dy ] ) );
- },
- ne: function( event, dx, dy ) {
- return $.extend( this._change.n.apply( this, arguments ),
- this._change.e.apply( this, [ event, dx, dy ] ) );
- },
- nw: function( event, dx, dy ) {
- return $.extend( this._change.n.apply( this, arguments ),
- this._change.w.apply( this, [ event, dx, dy ] ) );
- }
- },
-
- _propagate: function( n, event ) {
- $.ui.plugin.call( this, n, [ event, this.ui() ] );
- ( n !== "resize" && this._trigger( n, event, this.ui() ) );
- },
-
- plugins: {},
-
- ui: function() {
- return {
- originalElement: this.originalElement,
- element: this.element,
- helper: this.helper,
- position: this.position,
- size: this.size,
- originalSize: this.originalSize,
- originalPosition: this.originalPosition
- };
- }
-
-} );
-
-/*
- * Resizable Extensions
- */
-
-$.ui.plugin.add( "resizable", "animate", {
-
- stop: function( event ) {
- var that = $( this ).resizable( "instance" ),
- o = that.options,
- pr = that._proportionallyResizeElements,
- ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ),
- soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height,
- soffsetw = ista ? 0 : that.sizeDiff.width,
- style = {
- width: ( that.size.width - soffsetw ),
- height: ( that.size.height - soffseth )
- },
- left = ( parseFloat( that.element.css( "left" ) ) +
- ( that.position.left - that.originalPosition.left ) ) || null,
- top = ( parseFloat( that.element.css( "top" ) ) +
- ( that.position.top - that.originalPosition.top ) ) || null;
-
- that.element.animate(
- $.extend( style, top && left ? { top: top, left: left } : {} ), {
- duration: o.animateDuration,
- easing: o.animateEasing,
- step: function() {
-
- var data = {
- width: parseFloat( that.element.css( "width" ) ),
- height: parseFloat( that.element.css( "height" ) ),
- top: parseFloat( that.element.css( "top" ) ),
- left: parseFloat( that.element.css( "left" ) )
- };
-
- if ( pr && pr.length ) {
- $( pr[ 0 ] ).css( { width: data.width, height: data.height } );
- }
-
- // Propagating resize, and updating values for each animation step
- that._updateCache( data );
- that._propagate( "resize", event );
-
- }
- }
- );
- }
-
-} );
-
-$.ui.plugin.add( "resizable", "containment", {
-
- start: function() {
- var element, p, co, ch, cw, width, height,
- that = $( this ).resizable( "instance" ),
- o = that.options,
- el = that.element,
- oc = o.containment,
- ce = ( oc instanceof $ ) ?
- oc.get( 0 ) :
- ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
-
- if ( !ce ) {
- return;
- }
-
- that.containerElement = $( ce );
-
- if ( /document/.test( oc ) || oc === document ) {
- that.containerOffset = {
- left: 0,
- top: 0
- };
- that.containerPosition = {
- left: 0,
- top: 0
- };
-
- that.parentData = {
- element: $( document ),
- left: 0,
- top: 0,
- width: $( document ).width(),
- height: $( document ).height() || document.body.parentNode.scrollHeight
- };
- } else {
- element = $( ce );
- p = [];
- $( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) {
- p[ i ] = that._num( element.css( "padding" + name ) );
- } );
-
- that.containerOffset = element.offset();
- that.containerPosition = element.position();
- that.containerSize = {
- height: ( element.innerHeight() - p[ 3 ] ),
- width: ( element.innerWidth() - p[ 1 ] )
- };
-
- co = that.containerOffset;
- ch = that.containerSize.height;
- cw = that.containerSize.width;
- width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
- height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
-
- that.parentData = {
- element: ce,
- left: co.left,
- top: co.top,
- width: width,
- height: height
- };
- }
- },
-
- resize: function( event ) {
- var woset, hoset, isParent, isOffsetRelative,
- that = $( this ).resizable( "instance" ),
- o = that.options,
- co = that.containerOffset,
- cp = that.position,
- pRatio = that._aspectRatio || event.shiftKey,
- cop = {
- top: 0,
- left: 0
- },
- ce = that.containerElement,
- continueResize = true;
-
- if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
- cop = co;
- }
-
- if ( cp.left < ( that._helper ? co.left : 0 ) ) {
- that.size.width = that.size.width +
- ( that._helper ?
- ( that.position.left - co.left ) :
- ( that.position.left - cop.left ) );
-
- if ( pRatio ) {
- that.size.height = that.size.width / that.aspectRatio;
- continueResize = false;
- }
- that.position.left = o.helper ? co.left : 0;
- }
-
- if ( cp.top < ( that._helper ? co.top : 0 ) ) {
- that.size.height = that.size.height +
- ( that._helper ?
- ( that.position.top - co.top ) :
- that.position.top );
-
- if ( pRatio ) {
- that.size.width = that.size.height * that.aspectRatio;
- continueResize = false;
- }
- that.position.top = that._helper ? co.top : 0;
- }
-
- isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
- isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
-
- if ( isParent && isOffsetRelative ) {
- that.offset.left = that.parentData.left + that.position.left;
- that.offset.top = that.parentData.top + that.position.top;
- } else {
- that.offset.left = that.element.offset().left;
- that.offset.top = that.element.offset().top;
- }
-
- woset = Math.abs( that.sizeDiff.width +
- ( that._helper ?
- that.offset.left - cop.left :
- ( that.offset.left - co.left ) ) );
-
- hoset = Math.abs( that.sizeDiff.height +
- ( that._helper ?
- that.offset.top - cop.top :
- ( that.offset.top - co.top ) ) );
-
- if ( woset + that.size.width >= that.parentData.width ) {
- that.size.width = that.parentData.width - woset;
- if ( pRatio ) {
- that.size.height = that.size.width / that.aspectRatio;
- continueResize = false;
- }
- }
-
- if ( hoset + that.size.height >= that.parentData.height ) {
- that.size.height = that.parentData.height - hoset;
- if ( pRatio ) {
- that.size.width = that.size.height * that.aspectRatio;
- continueResize = false;
- }
- }
-
- if ( !continueResize ) {
- that.position.left = that.prevPosition.left;
- that.position.top = that.prevPosition.top;
- that.size.width = that.prevSize.width;
- that.size.height = that.prevSize.height;
- }
- },
-
- stop: function() {
- var that = $( this ).resizable( "instance" ),
- o = that.options,
- co = that.containerOffset,
- cop = that.containerPosition,
- ce = that.containerElement,
- helper = $( that.helper ),
- ho = helper.offset(),
- w = helper.outerWidth() - that.sizeDiff.width,
- h = helper.outerHeight() - that.sizeDiff.height;
-
- if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
- $( this ).css( {
- left: ho.left - cop.left - co.left,
- width: w,
- height: h
- } );
- }
-
- if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
- $( this ).css( {
- left: ho.left - cop.left - co.left,
- width: w,
- height: h
- } );
- }
- }
-} );
-
-$.ui.plugin.add( "resizable", "alsoResize", {
-
- start: function() {
- var that = $( this ).resizable( "instance" ),
- o = that.options;
-
- $( o.alsoResize ).each( function() {
- var el = $( this );
- el.data( "ui-resizable-alsoresize", {
- width: parseFloat( el.width() ), height: parseFloat( el.height() ),
- left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) )
- } );
- } );
- },
-
- resize: function( event, ui ) {
- var that = $( this ).resizable( "instance" ),
- o = that.options,
- os = that.originalSize,
- op = that.originalPosition,
- delta = {
- height: ( that.size.height - os.height ) || 0,
- width: ( that.size.width - os.width ) || 0,
- top: ( that.position.top - op.top ) || 0,
- left: ( that.position.left - op.left ) || 0
- };
-
- $( o.alsoResize ).each( function() {
- var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
- css = el.parents( ui.originalElement[ 0 ] ).length ?
- [ "width", "height" ] :
- [ "width", "height", "top", "left" ];
-
- $.each( css, function( i, prop ) {
- var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
- if ( sum && sum >= 0 ) {
- style[ prop ] = sum || null;
- }
- } );
-
- el.css( style );
- } );
- },
-
- stop: function() {
- $( this ).removeData( "ui-resizable-alsoresize" );
- }
-} );
-
-$.ui.plugin.add( "resizable", "ghost", {
-
- start: function() {
-
- var that = $( this ).resizable( "instance" ), cs = that.size;
-
- that.ghost = that.originalElement.clone();
- that.ghost.css( {
- opacity: 0.25,
- display: "block",
- position: "relative",
- height: cs.height,
- width: cs.width,
- margin: 0,
- left: 0,
- top: 0
- } );
-
- that._addClass( that.ghost, "ui-resizable-ghost" );
-
- // DEPRECATED
- // TODO: remove after 1.12
- if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) {
-
- // Ghost option
- that.ghost.addClass( this.options.ghost );
- }
-
- that.ghost.appendTo( that.helper );
-
- },
-
- resize: function() {
- var that = $( this ).resizable( "instance" );
- if ( that.ghost ) {
- that.ghost.css( {
- position: "relative",
- height: that.size.height,
- width: that.size.width
- } );
- }
- },
-
- stop: function() {
- var that = $( this ).resizable( "instance" );
- if ( that.ghost && that.helper ) {
- that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) );
- }
- }
-
-} );
-
-$.ui.plugin.add( "resizable", "grid", {
-
- resize: function() {
- var outerDimensions,
- that = $( this ).resizable( "instance" ),
- o = that.options,
- cs = that.size,
- os = that.originalSize,
- op = that.originalPosition,
- a = that.axis,
- grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
- gridX = ( grid[ 0 ] || 1 ),
- gridY = ( grid[ 1 ] || 1 ),
- ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX,
- oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY,
- newWidth = os.width + ox,
- newHeight = os.height + oy,
- isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ),
- isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ),
- isMinWidth = o.minWidth && ( o.minWidth > newWidth ),
- isMinHeight = o.minHeight && ( o.minHeight > newHeight );
-
- o.grid = grid;
-
- if ( isMinWidth ) {
- newWidth += gridX;
- }
- if ( isMinHeight ) {
- newHeight += gridY;
- }
- if ( isMaxWidth ) {
- newWidth -= gridX;
- }
- if ( isMaxHeight ) {
- newHeight -= gridY;
- }
-
- if ( /^(se|s|e)$/.test( a ) ) {
- that.size.width = newWidth;
- that.size.height = newHeight;
- } else if ( /^(ne)$/.test( a ) ) {
- that.size.width = newWidth;
- that.size.height = newHeight;
- that.position.top = op.top - oy;
- } else if ( /^(sw)$/.test( a ) ) {
- that.size.width = newWidth;
- that.size.height = newHeight;
- that.position.left = op.left - ox;
- } else {
- if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) {
- outerDimensions = that._getPaddingPlusBorderDimensions( this );
- }
-
- if ( newHeight - gridY > 0 ) {
- that.size.height = newHeight;
- that.position.top = op.top - oy;
- } else {
- newHeight = gridY - outerDimensions.height;
- that.size.height = newHeight;
- that.position.top = op.top + os.height - newHeight;
- }
- if ( newWidth - gridX > 0 ) {
- that.size.width = newWidth;
- that.position.left = op.left - ox;
- } else {
- newWidth = gridX - outerDimensions.width;
- that.size.width = newWidth;
- that.position.left = op.left + os.width - newWidth;
- }
- }
- }
-
-} );
-
-var widgetsResizable = $.ui.resizable;
-
-
-/*!
- * jQuery UI Selectable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Selectable
-//>>group: Interactions
-//>>description: Allows groups of elements to be selected with the mouse.
-//>>docs: http://api.jqueryui.com/selectable/
-//>>demos: http://jqueryui.com/selectable/
-//>>css.structure: ../../themes/base/selectable.css
-
-
-
-var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, {
- version: "1.12.1",
- options: {
- appendTo: "body",
- autoRefresh: true,
- distance: 0,
- filter: "*",
- tolerance: "touch",
-
- // Callbacks
- selected: null,
- selecting: null,
- start: null,
- stop: null,
- unselected: null,
- unselecting: null
- },
- _create: function() {
- var that = this;
-
- this._addClass( "ui-selectable" );
-
- this.dragged = false;
-
- // Cache selectee children based on filter
- this.refresh = function() {
- that.elementPos = $( that.element[ 0 ] ).offset();
- that.selectees = $( that.options.filter, that.element[ 0 ] );
- that._addClass( that.selectees, "ui-selectee" );
- that.selectees.each( function() {
- var $this = $( this ),
- selecteeOffset = $this.offset(),
- pos = {
- left: selecteeOffset.left - that.elementPos.left,
- top: selecteeOffset.top - that.elementPos.top
- };
- $.data( this, "selectable-item", {
- element: this,
- $element: $this,
- left: pos.left,
- top: pos.top,
- right: pos.left + $this.outerWidth(),
- bottom: pos.top + $this.outerHeight(),
- startselected: false,
- selected: $this.hasClass( "ui-selected" ),
- selecting: $this.hasClass( "ui-selecting" ),
- unselecting: $this.hasClass( "ui-unselecting" )
- } );
- } );
- };
- this.refresh();
-
- this._mouseInit();
-
- this.helper = $( "<div>" );
- this._addClass( this.helper, "ui-selectable-helper" );
- },
-
- _destroy: function() {
- this.selectees.removeData( "selectable-item" );
- this._mouseDestroy();
- },
-
- _mouseStart: function( event ) {
- var that = this,
- options = this.options;
-
- this.opos = [ event.pageX, event.pageY ];
- this.elementPos = $( this.element[ 0 ] ).offset();
-
- if ( this.options.disabled ) {
- return;
- }
-
- this.selectees = $( options.filter, this.element[ 0 ] );
-
- this._trigger( "start", event );
-
- $( options.appendTo ).append( this.helper );
-
- // position helper (lasso)
- this.helper.css( {
- "left": event.pageX,
- "top": event.pageY,
- "width": 0,
- "height": 0
- } );
-
- if ( options.autoRefresh ) {
- this.refresh();
- }
-
- this.selectees.filter( ".ui-selected" ).each( function() {
- var selectee = $.data( this, "selectable-item" );
- selectee.startselected = true;
- if ( !event.metaKey && !event.ctrlKey ) {
- that._removeClass( selectee.$element, "ui-selected" );
- selectee.selected = false;
- that._addClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = true;
-
- // selectable UNSELECTING callback
- that._trigger( "unselecting", event, {
- unselecting: selectee.element
- } );
- }
- } );
-
- $( event.target ).parents().addBack().each( function() {
- var doSelect,
- selectee = $.data( this, "selectable-item" );
- if ( selectee ) {
- doSelect = ( !event.metaKey && !event.ctrlKey ) ||
- !selectee.$element.hasClass( "ui-selected" );
- that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" )
- ._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" );
- selectee.unselecting = !doSelect;
- selectee.selecting = doSelect;
- selectee.selected = doSelect;
-
- // selectable (UN)SELECTING callback
- if ( doSelect ) {
- that._trigger( "selecting", event, {
- selecting: selectee.element
- } );
- } else {
- that._trigger( "unselecting", event, {
- unselecting: selectee.element
- } );
- }
- return false;
- }
- } );
-
- },
-
- _mouseDrag: function( event ) {
-
- this.dragged = true;
-
- if ( this.options.disabled ) {
- return;
- }
-
- var tmp,
- that = this,
- options = this.options,
- x1 = this.opos[ 0 ],
- y1 = this.opos[ 1 ],
- x2 = event.pageX,
- y2 = event.pageY;
-
- if ( x1 > x2 ) { tmp = x2; x2 = x1; x1 = tmp; }
- if ( y1 > y2 ) { tmp = y2; y2 = y1; y1 = tmp; }
- this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } );
-
- this.selectees.each( function() {
- var selectee = $.data( this, "selectable-item" ),
- hit = false,
- offset = {};
-
- //prevent helper from being selected if appendTo: selectable
- if ( !selectee || selectee.element === that.element[ 0 ] ) {
- return;
- }
-
- offset.left = selectee.left + that.elementPos.left;
- offset.right = selectee.right + that.elementPos.left;
- offset.top = selectee.top + that.elementPos.top;
- offset.bottom = selectee.bottom + that.elementPos.top;
-
- if ( options.tolerance === "touch" ) {
- hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
- offset.bottom < y1 ) );
- } else if ( options.tolerance === "fit" ) {
- hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
- offset.bottom < y2 );
- }
-
- if ( hit ) {
-
- // SELECT
- if ( selectee.selected ) {
- that._removeClass( selectee.$element, "ui-selected" );
- selectee.selected = false;
- }
- if ( selectee.unselecting ) {
- that._removeClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = false;
- }
- if ( !selectee.selecting ) {
- that._addClass( selectee.$element, "ui-selecting" );
- selectee.selecting = true;
-
- // selectable SELECTING callback
- that._trigger( "selecting", event, {
- selecting: selectee.element
- } );
- }
- } else {
-
- // UNSELECT
- if ( selectee.selecting ) {
- if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) {
- that._removeClass( selectee.$element, "ui-selecting" );
- selectee.selecting = false;
- that._addClass( selectee.$element, "ui-selected" );
- selectee.selected = true;
- } else {
- that._removeClass( selectee.$element, "ui-selecting" );
- selectee.selecting = false;
- if ( selectee.startselected ) {
- that._addClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = true;
- }
-
- // selectable UNSELECTING callback
- that._trigger( "unselecting", event, {
- unselecting: selectee.element
- } );
- }
- }
- if ( selectee.selected ) {
- if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) {
- that._removeClass( selectee.$element, "ui-selected" );
- selectee.selected = false;
-
- that._addClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = true;
-
- // selectable UNSELECTING callback
- that._trigger( "unselecting", event, {
- unselecting: selectee.element
- } );
- }
- }
- }
- } );
-
- return false;
- },
-
- _mouseStop: function( event ) {
- var that = this;
-
- this.dragged = false;
-
- $( ".ui-unselecting", this.element[ 0 ] ).each( function() {
- var selectee = $.data( this, "selectable-item" );
- that._removeClass( selectee.$element, "ui-unselecting" );
- selectee.unselecting = false;
- selectee.startselected = false;
- that._trigger( "unselected", event, {
- unselected: selectee.element
- } );
- } );
- $( ".ui-selecting", this.element[ 0 ] ).each( function() {
- var selectee = $.data( this, "selectable-item" );
- that._removeClass( selectee.$element, "ui-selecting" )
- ._addClass( selectee.$element, "ui-selected" );
- selectee.selecting = false;
- selectee.selected = true;
- selectee.startselected = true;
- that._trigger( "selected", event, {
- selected: selectee.element
- } );
- } );
- this._trigger( "stop", event );
-
- this.helper.remove();
-
- return false;
- }
-
-} );
-
-
-/*!
- * jQuery UI Sortable 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Sortable
-//>>group: Interactions
-//>>description: Enables items in a list to be sorted using the mouse.
-//>>docs: http://api.jqueryui.com/sortable/
-//>>demos: http://jqueryui.com/sortable/
-//>>css.structure: ../../themes/base/sortable.css
-
-
-
-var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, {
- version: "1.12.1",
- widgetEventPrefix: "sort",
- ready: false,
- options: {
- appendTo: "parent",
- axis: false,
- connectWith: false,
- containment: false,
- cursor: "auto",
- cursorAt: false,
- dropOnEmpty: true,
- forcePlaceholderSize: false,
- forceHelperSize: false,
- grid: false,
- handle: false,
- helper: "original",
- items: "> *",
- opacity: false,
- placeholder: false,
- revert: false,
- scroll: true,
- scrollSensitivity: 20,
- scrollSpeed: 20,
- scope: "default",
- tolerance: "intersect",
- zIndex: 1000,
-
- // Callbacks
- activate: null,
- beforeStop: null,
- change: null,
- deactivate: null,
- out: null,
- over: null,
- receive: null,
- remove: null,
- sort: null,
- start: null,
- stop: null,
- update: null
- },
-
- _isOverAxis: function( x, reference, size ) {
- return ( x >= reference ) && ( x < ( reference + size ) );
- },
-
- _isFloating: function( item ) {
- return ( /left|right/ ).test( item.css( "float" ) ) ||
- ( /inline|table-cell/ ).test( item.css( "display" ) );
- },
-
- _create: function() {
- this.containerCache = {};
- this._addClass( "ui-sortable" );
-
- //Get the items
- this.refresh();
-
- //Let's determine the parent's offset
- this.offset = this.element.offset();
-
- //Initialize mouse events for interaction
- this._mouseInit();
-
- this._setHandleClassName();
-
- //We're ready to go
- this.ready = true;
-
- },
-
- _setOption: function( key, value ) {
- this._super( key, value );
-
- if ( key === "handle" ) {
- this._setHandleClassName();
- }
- },
-
- _setHandleClassName: function() {
- var that = this;
- this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
- $.each( this.items, function() {
- that._addClass(
- this.instance.options.handle ?
- this.item.find( this.instance.options.handle ) :
- this.item,
- "ui-sortable-handle"
- );
- } );
- },
-
- _destroy: function() {
- this._mouseDestroy();
-
- for ( var i = this.items.length - 1; i >= 0; i-- ) {
- this.items[ i ].item.removeData( this.widgetName + "-item" );
- }
-
- return this;
- },
-
- _mouseCapture: function( event, overrideHandle ) {
- var currentItem = null,
- validHandle = false,
- that = this;
-
- if ( this.reverting ) {
- return false;
- }
-
- if ( this.options.disabled || this.options.type === "static" ) {
- return false;
- }
-
- //We have to refresh the items data once first
- this._refreshItems( event );
-
- //Find out if the clicked node (or one of its parents) is a actual item in this.items
- $( event.target ).parents().each( function() {
- if ( $.data( this, that.widgetName + "-item" ) === that ) {
- currentItem = $( this );
- return false;
- }
- } );
- if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
- currentItem = $( event.target );
- }
-
- if ( !currentItem ) {
- return false;
- }
- if ( this.options.handle && !overrideHandle ) {
- $( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
- if ( this === event.target ) {
- validHandle = true;
- }
- } );
- if ( !validHandle ) {
- return false;
- }
- }
-
- this.currentItem = currentItem;
- this._removeCurrentsFromItems();
- return true;
-
- },
-
- _mouseStart: function( event, overrideHandle, noActivation ) {
-
- var i, body,
- o = this.options;
-
- this.currentContainer = this;
-
- //We only need to call refreshPositions, because the refreshItems call has been moved to
- // mouseCapture
- this.refreshPositions();
-
- //Create and append the visible helper
- this.helper = this._createHelper( event );
-
- //Cache the helper size
- this._cacheHelperProportions();
-
- /*
- * - Position generation -
- * This block generates everything position related - it's the core of draggables.
- */
-
- //Cache the margins of the original element
- this._cacheMargins();
-
- //Get the next scrolling parent
- this.scrollParent = this.helper.scrollParent();
-
- //The element's absolute position on the page minus margins
- this.offset = this.currentItem.offset();
- this.offset = {
- top: this.offset.top - this.margins.top,
- left: this.offset.left - this.margins.left
- };
-
- $.extend( this.offset, {
- click: { //Where the click happened, relative to the element
- left: event.pageX - this.offset.left,
- top: event.pageY - this.offset.top
- },
- parent: this._getParentOffset(),
-
- // This is a relative to absolute position minus the actual position calculation -
- // only used for relative positioned helper
- relative: this._getRelativeOffset()
- } );
-
- // Only after we got the offset, we can change the helper's position to absolute
- // TODO: Still need to figure out a way to make relative sorting possible
- this.helper.css( "position", "absolute" );
- this.cssPosition = this.helper.css( "position" );
-
- //Generate the original position
- this.originalPosition = this._generatePosition( event );
- this.originalPageX = event.pageX;
- this.originalPageY = event.pageY;
-
- //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
- ( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
-
- //Cache the former DOM position
- this.domPosition = {
- prev: this.currentItem.prev()[ 0 ],
- parent: this.currentItem.parent()[ 0 ]
- };
-
- // If the helper is not the original, hide the original so it's not playing any role during
- // the drag, won't cause anything bad this way
- if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
- this.currentItem.hide();
- }
-
- //Create the placeholder
- this._createPlaceholder();
-
- //Set a containment if given in the options
- if ( o.containment ) {
- this._setContainment();
- }
-
- if ( o.cursor && o.cursor !== "auto" ) { // cursor option
- body = this.document.find( "body" );
-
- // Support: IE
- this.storedCursor = body.css( "cursor" );
- body.css( "cursor", o.cursor );
-
- this.storedStylesheet =
- $( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
- }
-
- if ( o.opacity ) { // opacity option
- if ( this.helper.css( "opacity" ) ) {
- this._storedOpacity = this.helper.css( "opacity" );
- }
- this.helper.css( "opacity", o.opacity );
- }
-
- if ( o.zIndex ) { // zIndex option
- if ( this.helper.css( "zIndex" ) ) {
- this._storedZIndex = this.helper.css( "zIndex" );
- }
- this.helper.css( "zIndex", o.zIndex );
- }
-
- //Prepare scrolling
- if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- this.scrollParent[ 0 ].tagName !== "HTML" ) {
- this.overflowOffset = this.scrollParent.offset();
- }
-
- //Call callbacks
- this._trigger( "start", event, this._uiHash() );
-
- //Recache the helper size
- if ( !this._preserveHelperProportions ) {
- this._cacheHelperProportions();
- }
-
- //Post "activate" events to possible containers
- if ( !noActivation ) {
- for ( i = this.containers.length - 1; i >= 0; i-- ) {
- this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
- }
- }
-
- //Prepare possible droppables
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.current = this;
- }
-
- if ( $.ui.ddmanager && !o.dropBehaviour ) {
- $.ui.ddmanager.prepareOffsets( this, event );
- }
-
- this.dragging = true;
-
- this._addClass( this.helper, "ui-sortable-helper" );
-
- // Execute the drag once - this causes the helper not to be visiblebefore getting its
- // correct position
- this._mouseDrag( event );
- return true;
-
- },
-
- _mouseDrag: function( event ) {
- var i, item, itemElement, intersection,
- o = this.options,
- scrolled = false;
-
- //Compute the helpers position
- this.position = this._generatePosition( event );
- this.positionAbs = this._convertPositionTo( "absolute" );
-
- if ( !this.lastPositionAbs ) {
- this.lastPositionAbs = this.positionAbs;
- }
-
- //Do scrolling
- if ( this.options.scroll ) {
- if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- this.scrollParent[ 0 ].tagName !== "HTML" ) {
-
- if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
- event.pageY < o.scrollSensitivity ) {
- this.scrollParent[ 0 ].scrollTop =
- scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
- } else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
- this.scrollParent[ 0 ].scrollTop =
- scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
- }
-
- if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
- event.pageX < o.scrollSensitivity ) {
- this.scrollParent[ 0 ].scrollLeft = scrolled =
- this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
- } else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
- this.scrollParent[ 0 ].scrollLeft = scrolled =
- this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
- }
-
- } else {
-
- if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
- scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
- } else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
- o.scrollSensitivity ) {
- scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
- }
-
- if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
- scrolled = this.document.scrollLeft(
- this.document.scrollLeft() - o.scrollSpeed
- );
- } else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
- o.scrollSensitivity ) {
- scrolled = this.document.scrollLeft(
- this.document.scrollLeft() + o.scrollSpeed
- );
- }
-
- }
-
- if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
- $.ui.ddmanager.prepareOffsets( this, event );
- }
- }
-
- //Regenerate the absolute position used for position checks
- this.positionAbs = this._convertPositionTo( "absolute" );
-
- //Set the helper position
- if ( !this.options.axis || this.options.axis !== "y" ) {
- this.helper[ 0 ].style.left = this.position.left + "px";
- }
- if ( !this.options.axis || this.options.axis !== "x" ) {
- this.helper[ 0 ].style.top = this.position.top + "px";
- }
-
- //Rearrange
- for ( i = this.items.length - 1; i >= 0; i-- ) {
-
- //Cache variables and intersection, continue if no intersection
- item = this.items[ i ];
- itemElement = item.item[ 0 ];
- intersection = this._intersectsWithPointer( item );
- if ( !intersection ) {
- continue;
- }
-
- // Only put the placeholder inside the current Container, skip all
- // items from other containers. This works because when moving
- // an item from one container to another the
- // currentContainer is switched before the placeholder is moved.
- //
- // Without this, moving items in "sub-sortables" can cause
- // the placeholder to jitter between the outer and inner container.
- if ( item.instance !== this.currentContainer ) {
- continue;
- }
-
- // Cannot intersect with itself
- // no useless actions that have been done before
- // no action if the item moved is the parent of the item checked
- if ( itemElement !== this.currentItem[ 0 ] &&
- this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement &&
- !$.contains( this.placeholder[ 0 ], itemElement ) &&
- ( this.options.type === "semi-dynamic" ?
- !$.contains( this.element[ 0 ], itemElement ) :
- true
- )
- ) {
-
- this.direction = intersection === 1 ? "down" : "up";
-
- if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) {
- this._rearrange( event, item );
- } else {
- break;
- }
-
- this._trigger( "change", event, this._uiHash() );
- break;
- }
- }
-
- //Post events to containers
- this._contactContainers( event );
-
- //Interconnect with droppables
- if ( $.ui.ddmanager ) {
- $.ui.ddmanager.drag( this, event );
- }
-
- //Call callbacks
- this._trigger( "sort", event, this._uiHash() );
-
- this.lastPositionAbs = this.positionAbs;
- return false;
-
- },
-
- _mouseStop: function( event, noPropagation ) {
-
- if ( !event ) {
- return;
- }
-
- //If we are using droppables, inform the manager about the drop
- if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
- $.ui.ddmanager.drop( this, event );
- }
-
- if ( this.options.revert ) {
- var that = this,
- cur = this.placeholder.offset(),
- axis = this.options.axis,
- animation = {};
-
- if ( !axis || axis === "x" ) {
- animation.left = cur.left - this.offset.parent.left - this.margins.left +
- ( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
- 0 :
- this.offsetParent[ 0 ].scrollLeft
- );
- }
- if ( !axis || axis === "y" ) {
- animation.top = cur.top - this.offset.parent.top - this.margins.top +
- ( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
- 0 :
- this.offsetParent[ 0 ].scrollTop
- );
- }
- this.reverting = true;
- $( this.helper ).animate(
- animation,
- parseInt( this.options.revert, 10 ) || 500,
- function() {
- that._clear( event );
- }
- );
- } else {
- this._clear( event, noPropagation );
- }
-
- return false;
-
- },
-
- cancel: function() {
-
- if ( this.dragging ) {
-
- this._mouseUp( new $.Event( "mouseup", { target: null } ) );
-
- if ( this.options.helper === "original" ) {
- this.currentItem.css( this._storedCSS );
- this._removeClass( this.currentItem, "ui-sortable-helper" );
- } else {
- this.currentItem.show();
- }
-
- //Post deactivating events to containers
- for ( var i = this.containers.length - 1; i >= 0; i-- ) {
- this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
- if ( this.containers[ i ].containerCache.over ) {
- this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
- this.containers[ i ].containerCache.over = 0;
- }
- }
-
- }
-
- if ( this.placeholder ) {
-
- //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
- // it unbinds ALL events from the original node!
- if ( this.placeholder[ 0 ].parentNode ) {
- this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
- }
- if ( this.options.helper !== "original" && this.helper &&
- this.helper[ 0 ].parentNode ) {
- this.helper.remove();
- }
-
- $.extend( this, {
- helper: null,
- dragging: false,
- reverting: false,
- _noFinalSort: null
- } );
-
- if ( this.domPosition.prev ) {
- $( this.domPosition.prev ).after( this.currentItem );
- } else {
- $( this.domPosition.parent ).prepend( this.currentItem );
- }
- }
-
- return this;
-
- },
-
- serialize: function( o ) {
-
- var items = this._getItemsAsjQuery( o && o.connected ),
- str = [];
- o = o || {};
-
- $( items ).each( function() {
- var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
- .match( o.expression || ( /(.+)[\-=_](.+)/ ) );
- if ( res ) {
- str.push(
- ( o.key || res[ 1 ] + "[]" ) +
- "=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
- }
- } );
-
- if ( !str.length && o.key ) {
- str.push( o.key + "=" );
- }
-
- return str.join( "&" );
-
- },
-
- toArray: function( o ) {
-
- var items = this._getItemsAsjQuery( o && o.connected ),
- ret = [];
-
- o = o || {};
-
- items.each( function() {
- ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
- } );
- return ret;
-
- },
-
- /* Be careful with the following core functions */
- _intersectsWith: function( item ) {
-
- var x1 = this.positionAbs.left,
- x2 = x1 + this.helperProportions.width,
- y1 = this.positionAbs.top,
- y2 = y1 + this.helperProportions.height,
- l = item.left,
- r = l + item.width,
- t = item.top,
- b = t + item.height,
- dyClick = this.offset.click.top,
- dxClick = this.offset.click.left,
- isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
- ( y1 + dyClick ) < b ),
- isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
- ( x1 + dxClick ) < r ),
- isOverElement = isOverElementHeight && isOverElementWidth;
-
- if ( this.options.tolerance === "pointer" ||
- this.options.forcePointerForContainers ||
- ( this.options.tolerance !== "pointer" &&
- this.helperProportions[ this.floating ? "width" : "height" ] >
- item[ this.floating ? "width" : "height" ] )
- ) {
- return isOverElement;
- } else {
-
- return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
- x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
- t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
- y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
-
- }
- },
-
- _intersectsWithPointer: function( item ) {
- var verticalDirection, horizontalDirection,
- isOverElementHeight = ( this.options.axis === "x" ) ||
- this._isOverAxis(
- this.positionAbs.top + this.offset.click.top, item.top, item.height ),
- isOverElementWidth = ( this.options.axis === "y" ) ||
- this._isOverAxis(
- this.positionAbs.left + this.offset.click.left, item.left, item.width ),
- isOverElement = isOverElementHeight && isOverElementWidth;
-
- if ( !isOverElement ) {
- return false;
- }
-
- verticalDirection = this._getDragVerticalDirection();
- horizontalDirection = this._getDragHorizontalDirection();
-
- return this.floating ?
- ( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 )
- : ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
-
- },
-
- _intersectsWithSides: function( item ) {
-
- var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
- this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
- isOverRightHalf = this._isOverAxis( this.positionAbs.left +
- this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
- verticalDirection = this._getDragVerticalDirection(),
- horizontalDirection = this._getDragHorizontalDirection();
-
- if ( this.floating && horizontalDirection ) {
- return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
- ( horizontalDirection === "left" && !isOverRightHalf ) );
- } else {
- return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
- ( verticalDirection === "up" && !isOverBottomHalf ) );
- }
-
- },
-
- _getDragVerticalDirection: function() {
- var delta = this.positionAbs.top - this.lastPositionAbs.top;
- return delta !== 0 && ( delta > 0 ? "down" : "up" );
- },
-
- _getDragHorizontalDirection: function() {
- var delta = this.positionAbs.left - this.lastPositionAbs.left;
- return delta !== 0 && ( delta > 0 ? "right" : "left" );
- },
-
- refresh: function( event ) {
- this._refreshItems( event );
- this._setHandleClassName();
- this.refreshPositions();
- return this;
- },
-
- _connectWith: function() {
- var options = this.options;
- return options.connectWith.constructor === String ?
- [ options.connectWith ] :
- options.connectWith;
- },
-
- _getItemsAsjQuery: function( connected ) {
-
- var i, j, cur, inst,
- items = [],
- queries = [],
- connectWith = this._connectWith();
-
- if ( connectWith && connected ) {
- for ( i = connectWith.length - 1; i >= 0; i-- ) {
- cur = $( connectWith[ i ], this.document[ 0 ] );
- for ( j = cur.length - 1; j >= 0; j-- ) {
- inst = $.data( cur[ j ], this.widgetFullName );
- if ( inst && inst !== this && !inst.options.disabled ) {
- queries.push( [ $.isFunction( inst.options.items ) ?
- inst.options.items.call( inst.element ) :
- $( inst.options.items, inst.element )
- .not( ".ui-sortable-helper" )
- .not( ".ui-sortable-placeholder" ), inst ] );
- }
- }
- }
- }
-
- queries.push( [ $.isFunction( this.options.items ) ?
- this.options.items
- .call( this.element, null, { options: this.options, item: this.currentItem } ) :
- $( this.options.items, this.element )
- .not( ".ui-sortable-helper" )
- .not( ".ui-sortable-placeholder" ), this ] );
-
- function addItems() {
- items.push( this );
- }
- for ( i = queries.length - 1; i >= 0; i-- ) {
- queries[ i ][ 0 ].each( addItems );
- }
-
- return $( items );
-
- },
-
- _removeCurrentsFromItems: function() {
-
- var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
-
- this.items = $.grep( this.items, function( item ) {
- for ( var j = 0; j < list.length; j++ ) {
- if ( list[ j ] === item.item[ 0 ] ) {
- return false;
- }
- }
- return true;
- } );
-
- },
-
- _refreshItems: function( event ) {
-
- this.items = [];
- this.containers = [ this ];
-
- var i, j, cur, inst, targetData, _queries, item, queriesLength,
- items = this.items,
- queries = [ [ $.isFunction( this.options.items ) ?
- this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
- $( this.options.items, this.element ), this ] ],
- connectWith = this._connectWith();
-
- //Shouldn't be run the first time through due to massive slow-down
- if ( connectWith && this.ready ) {
- for ( i = connectWith.length - 1; i >= 0; i-- ) {
- cur = $( connectWith[ i ], this.document[ 0 ] );
- for ( j = cur.length - 1; j >= 0; j-- ) {
- inst = $.data( cur[ j ], this.widgetFullName );
- if ( inst && inst !== this && !inst.options.disabled ) {
- queries.push( [ $.isFunction( inst.options.items ) ?
- inst.options.items
- .call( inst.element[ 0 ], event, { item: this.currentItem } ) :
- $( inst.options.items, inst.element ), inst ] );
- this.containers.push( inst );
- }
- }
- }
- }
-
- for ( i = queries.length - 1; i >= 0; i-- ) {
- targetData = queries[ i ][ 1 ];
- _queries = queries[ i ][ 0 ];
-
- for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
- item = $( _queries[ j ] );
-
- // Data for target checking (mouse manager)
- item.data( this.widgetName + "-item", targetData );
-
- items.push( {
- item: item,
- instance: targetData,
- width: 0, height: 0,
- left: 0, top: 0
- } );
- }
- }
-
- },
-
- refreshPositions: function( fast ) {
-
- // Determine whether items are being displayed horizontally
- this.floating = this.items.length ?
- this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
- false;
-
- //This has to be redone because due to the item being moved out/into the offsetParent,
- // the offsetParent's position will change
- if ( this.offsetParent && this.helper ) {
- this.offset.parent = this._getParentOffset();
- }
-
- var i, item, t, p;
-
- for ( i = this.items.length - 1; i >= 0; i-- ) {
- item = this.items[ i ];
-
- //We ignore calculating positions of all connected containers when we're not over them
- if ( item.instance !== this.currentContainer && this.currentContainer &&
- item.item[ 0 ] !== this.currentItem[ 0 ] ) {
- continue;
- }
-
- t = this.options.toleranceElement ?
- $( this.options.toleranceElement, item.item ) :
- item.item;
-
- if ( !fast ) {
- item.width = t.outerWidth();
- item.height = t.outerHeight();
- }
-
- p = t.offset();
- item.left = p.left;
- item.top = p.top;
- }
-
- if ( this.options.custom && this.options.custom.refreshContainers ) {
- this.options.custom.refreshContainers.call( this );
- } else {
- for ( i = this.containers.length - 1; i >= 0; i-- ) {
- p = this.containers[ i ].element.offset();
- this.containers[ i ].containerCache.left = p.left;
- this.containers[ i ].containerCache.top = p.top;
- this.containers[ i ].containerCache.width =
- this.containers[ i ].element.outerWidth();
- this.containers[ i ].containerCache.height =
- this.containers[ i ].element.outerHeight();
- }
- }
-
- return this;
- },
-
- _createPlaceholder: function( that ) {
- that = that || this;
- var className,
- o = that.options;
-
- if ( !o.placeholder || o.placeholder.constructor === String ) {
- className = o.placeholder;
- o.placeholder = {
- element: function() {
-
- var nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),
- element = $( "<" + nodeName + ">", that.document[ 0 ] );
-
- that._addClass( element, "ui-sortable-placeholder",
- className || that.currentItem[ 0 ].className )
- ._removeClass( element, "ui-sortable-helper" );
-
- if ( nodeName === "tbody" ) {
- that._createTrPlaceholder(
- that.currentItem.find( "tr" ).eq( 0 ),
- $( "<tr>", that.document[ 0 ] ).appendTo( element )
- );
- } else if ( nodeName === "tr" ) {
- that._createTrPlaceholder( that.currentItem, element );
- } else if ( nodeName === "img" ) {
- element.attr( "src", that.currentItem.attr( "src" ) );
- }
-
- if ( !className ) {
- element.css( "visibility", "hidden" );
- }
-
- return element;
- },
- update: function( container, p ) {
-
- // 1. If a className is set as 'placeholder option, we don't force sizes -
- // the class is responsible for that
- // 2. The option 'forcePlaceholderSize can be enabled to force it even if a
- // class name is specified
- if ( className && !o.forcePlaceholderSize ) {
- return;
- }
-
- //If the element doesn't have a actual height by itself (without styles coming
- // from a stylesheet), it receives the inline height from the dragged item
- if ( !p.height() ) {
- p.height(
- that.currentItem.innerHeight() -
- parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
- parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
- }
- if ( !p.width() ) {
- p.width(
- that.currentItem.innerWidth() -
- parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
- parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
- }
- }
- };
- }
-
- //Create the placeholder
- that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
-
- //Append it after the actual current item
- that.currentItem.after( that.placeholder );
-
- //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
- o.placeholder.update( that, that.placeholder );
-
- },
-
- _createTrPlaceholder: function( sourceTr, targetTr ) {
- var that = this;
-
- sourceTr.children().each( function() {
- $( "<td>&#160;</td>", that.document[ 0 ] )
- .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
- .appendTo( targetTr );
- } );
- },
-
- _contactContainers: function( event ) {
- var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
- floating, axis,
- innermostContainer = null,
- innermostIndex = null;
-
- // Get innermost container that intersects with item
- for ( i = this.containers.length - 1; i >= 0; i-- ) {
-
- // Never consider a container that's located within the item itself
- if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
- continue;
- }
-
- if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
-
- // If we've already found a container and it's more "inner" than this, then continue
- if ( innermostContainer &&
- $.contains(
- this.containers[ i ].element[ 0 ],
- innermostContainer.element[ 0 ] ) ) {
- continue;
- }
-
- innermostContainer = this.containers[ i ];
- innermostIndex = i;
-
- } else {
-
- // container doesn't intersect. trigger "out" event if necessary
- if ( this.containers[ i ].containerCache.over ) {
- this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
- this.containers[ i ].containerCache.over = 0;
- }
- }
-
- }
-
- // If no intersecting containers found, return
- if ( !innermostContainer ) {
- return;
- }
-
- // Move the item into the container if it's not there already
- if ( this.containers.length === 1 ) {
- if ( !this.containers[ innermostIndex ].containerCache.over ) {
- this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
- this.containers[ innermostIndex ].containerCache.over = 1;
- }
- } else {
-
- // When entering a new container, we will find the item with the least distance and
- // append our item near it
- dist = 10000;
- itemWithLeastDistance = null;
- floating = innermostContainer.floating || this._isFloating( this.currentItem );
- posProperty = floating ? "left" : "top";
- sizeProperty = floating ? "width" : "height";
- axis = floating ? "pageX" : "pageY";
-
- for ( j = this.items.length - 1; j >= 0; j-- ) {
- if ( !$.contains(
- this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
- ) {
- continue;
- }
- if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
- continue;
- }
-
- cur = this.items[ j ].item.offset()[ posProperty ];
- nearBottom = false;
- if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
- nearBottom = true;
- }
-
- if ( Math.abs( event[ axis ] - cur ) < dist ) {
- dist = Math.abs( event[ axis ] - cur );
- itemWithLeastDistance = this.items[ j ];
- this.direction = nearBottom ? "up" : "down";
- }
- }
-
- //Check if dropOnEmpty is enabled
- if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
- return;
- }
-
- if ( this.currentContainer === this.containers[ innermostIndex ] ) {
- if ( !this.currentContainer.containerCache.over ) {
- this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
- this.currentContainer.containerCache.over = 1;
- }
- return;
- }
-
- itemWithLeastDistance ?
- this._rearrange( event, itemWithLeastDistance, null, true ) :
- this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
- this._trigger( "change", event, this._uiHash() );
- this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
- this.currentContainer = this.containers[ innermostIndex ];
-
- //Update the placeholder
- this.options.placeholder.update( this.currentContainer, this.placeholder );
-
- this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
- this.containers[ innermostIndex ].containerCache.over = 1;
- }
-
- },
-
- _createHelper: function( event ) {
-
- var o = this.options,
- helper = $.isFunction( o.helper ) ?
- $( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
- ( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
-
- //Add the helper to the DOM if that didn't happen already
- if ( !helper.parents( "body" ).length ) {
- $( o.appendTo !== "parent" ?
- o.appendTo :
- this.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );
- }
-
- if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
- this._storedCSS = {
- width: this.currentItem[ 0 ].style.width,
- height: this.currentItem[ 0 ].style.height,
- position: this.currentItem.css( "position" ),
- top: this.currentItem.css( "top" ),
- left: this.currentItem.css( "left" )
- };
- }
-
- if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
- helper.width( this.currentItem.width() );
- }
- if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
- helper.height( this.currentItem.height() );
- }
-
- return helper;
-
- },
-
- _adjustOffsetFromHelper: function( obj ) {
- if ( typeof obj === "string" ) {
- obj = obj.split( " " );
- }
- if ( $.isArray( obj ) ) {
- obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
- }
- if ( "left" in obj ) {
- this.offset.click.left = obj.left + this.margins.left;
- }
- if ( "right" in obj ) {
- this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
- }
- if ( "top" in obj ) {
- this.offset.click.top = obj.top + this.margins.top;
- }
- if ( "bottom" in obj ) {
- this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
- }
- },
-
- _getParentOffset: function() {
-
- //Get the offsetParent and cache its position
- this.offsetParent = this.helper.offsetParent();
- var po = this.offsetParent.offset();
-
- // This is a special case where we need to modify a offset calculated on start, since the
- // following happened:
- // 1. The position of the helper is absolute, so it's position is calculated based on the
- // next positioned parent
- // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
- // the document, which means that the scroll is included in the initial calculation of the
- // offset of the parent, and never recalculated upon drag
- if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
- po.left += this.scrollParent.scrollLeft();
- po.top += this.scrollParent.scrollTop();
- }
-
- // This needs to be actually done for all browsers, since pageX/pageY includes this
- // information with an ugly IE fix
- if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
- ( this.offsetParent[ 0 ].tagName &&
- this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
- po = { top: 0, left: 0 };
- }
-
- return {
- top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
- left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
- };
-
- },
-
- _getRelativeOffset: function() {
-
- if ( this.cssPosition === "relative" ) {
- var p = this.currentItem.position();
- return {
- top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
- this.scrollParent.scrollTop(),
- left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
- this.scrollParent.scrollLeft()
- };
- } else {
- return { top: 0, left: 0 };
- }
-
- },
-
- _cacheMargins: function() {
- this.margins = {
- left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
- top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
- };
- },
-
- _cacheHelperProportions: function() {
- this.helperProportions = {
- width: this.helper.outerWidth(),
- height: this.helper.outerHeight()
- };
- },
-
- _setContainment: function() {
-
- var ce, co, over,
- o = this.options;
- if ( o.containment === "parent" ) {
- o.containment = this.helper[ 0 ].parentNode;
- }
- if ( o.containment === "document" || o.containment === "window" ) {
- this.containment = [
- 0 - this.offset.relative.left - this.offset.parent.left,
- 0 - this.offset.relative.top - this.offset.parent.top,
- o.containment === "document" ?
- this.document.width() :
- this.window.width() - this.helperProportions.width - this.margins.left,
- ( o.containment === "document" ?
- ( this.document.height() || document.body.parentNode.scrollHeight ) :
- this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
- ) - this.helperProportions.height - this.margins.top
- ];
- }
-
- if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
- ce = $( o.containment )[ 0 ];
- co = $( o.containment ).offset();
- over = ( $( ce ).css( "overflow" ) !== "hidden" );
-
- this.containment = [
- co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
- ( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
- co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
- ( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
- co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
- ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
- ( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
- this.helperProportions.width - this.margins.left,
- co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
- ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
- ( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
- this.helperProportions.height - this.margins.top
- ];
- }
-
- },
-
- _convertPositionTo: function( d, pos ) {
-
- if ( !pos ) {
- pos = this.position;
- }
- var mod = d === "absolute" ? 1 : -1,
- scroll = this.cssPosition === "absolute" &&
- !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
- this.offsetParent :
- this.scrollParent,
- scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
-
- return {
- top: (
-
- // The absolute mouse position
- pos.top +
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.top * mod +
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.top * mod -
- ( ( this.cssPosition === "fixed" ?
- -this.scrollParent.scrollTop() :
- ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
- ),
- left: (
-
- // The absolute mouse position
- pos.left +
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.left * mod +
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.left * mod -
- ( ( this.cssPosition === "fixed" ?
- -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
- scroll.scrollLeft() ) * mod )
- )
- };
-
- },
-
- _generatePosition: function( event ) {
-
- var top, left,
- o = this.options,
- pageX = event.pageX,
- pageY = event.pageY,
- scroll = this.cssPosition === "absolute" &&
- !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
- this.offsetParent :
- this.scrollParent,
- scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
-
- // This is another very weird special case that only happens for relative elements:
- // 1. If the css position is relative
- // 2. and the scroll parent is the document or similar to the offset parent
- // we have to refresh the relative offset during the scroll so there are no jumps
- if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
- this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
- this.offset.relative = this._getRelativeOffset();
- }
-
- /*
- * - Position constraining -
- * Constrain the position to a mix of grid, containment.
- */
-
- if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
-
- if ( this.containment ) {
- if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
- pageX = this.containment[ 0 ] + this.offset.click.left;
- }
- if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
- pageY = this.containment[ 1 ] + this.offset.click.top;
- }
- if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
- pageX = this.containment[ 2 ] + this.offset.click.left;
- }
- if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
- pageY = this.containment[ 3 ] + this.offset.click.top;
- }
- }
-
- if ( o.grid ) {
- top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
- o.grid[ 1 ] ) * o.grid[ 1 ];
- pageY = this.containment ?
- ( ( top - this.offset.click.top >= this.containment[ 1 ] &&
- top - this.offset.click.top <= this.containment[ 3 ] ) ?
- top :
- ( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
- top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
- top;
-
- left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
- o.grid[ 0 ] ) * o.grid[ 0 ];
- pageX = this.containment ?
- ( ( left - this.offset.click.left >= this.containment[ 0 ] &&
- left - this.offset.click.left <= this.containment[ 2 ] ) ?
- left :
- ( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
- left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
- left;
- }
-
- }
-
- return {
- top: (
-
- // The absolute mouse position
- pageY -
-
- // Click offset (relative to the element)
- this.offset.click.top -
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.top -
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.top +
- ( ( this.cssPosition === "fixed" ?
- -this.scrollParent.scrollTop() :
- ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
- ),
- left: (
-
- // The absolute mouse position
- pageX -
-
- // Click offset (relative to the element)
- this.offset.click.left -
-
- // Only for relative positioned nodes: Relative offset from element to offset parent
- this.offset.relative.left -
-
- // The offsetParent's offset without borders (offset + border)
- this.offset.parent.left +
- ( ( this.cssPosition === "fixed" ?
- -this.scrollParent.scrollLeft() :
- scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
- )
- };
-
- },
-
- _rearrange: function( event, i, a, hardRefresh ) {
-
- a ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :
- i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
- ( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
-
- //Various things done here to improve the performance:
- // 1. we create a setTimeout, that calls refreshPositions
- // 2. on the instance, we have a counter variable, that get's higher after every append
- // 3. on the local scope, we copy the counter variable, and check in the timeout,
- // if it's still the same
- // 4. this lets only the last addition to the timeout stack through
- this.counter = this.counter ? ++this.counter : 1;
- var counter = this.counter;
-
- this._delay( function() {
- if ( counter === this.counter ) {
-
- //Precompute after each DOM insertion, NOT on mousemove
- this.refreshPositions( !hardRefresh );
- }
- } );
-
- },
-
- _clear: function( event, noPropagation ) {
-
- this.reverting = false;
-
- // We delay all events that have to be triggered to after the point where the placeholder
- // has been removed and everything else normalized again
- var i,
- delayedTriggers = [];
-
- // We first have to update the dom position of the actual currentItem
- // Note: don't do it if the current item is already removed (by a user), or it gets
- // reappended (see #4088)
- if ( !this._noFinalSort && this.currentItem.parent().length ) {
- this.placeholder.before( this.currentItem );
- }
- this._noFinalSort = null;
-
- if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
- for ( i in this._storedCSS ) {
- if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
- this._storedCSS[ i ] = "";
- }
- }
- this.currentItem.css( this._storedCSS );
- this._removeClass( this.currentItem, "ui-sortable-helper" );
- } else {
- this.currentItem.show();
- }
-
- if ( this.fromOutside && !noPropagation ) {
- delayedTriggers.push( function( event ) {
- this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
- } );
- }
- if ( ( this.fromOutside ||
- this.domPosition.prev !==
- this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
- this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
-
- // Trigger update callback if the DOM position has changed
- delayedTriggers.push( function( event ) {
- this._trigger( "update", event, this._uiHash() );
- } );
- }
-
- // Check if the items Container has Changed and trigger appropriate
- // events.
- if ( this !== this.currentContainer ) {
- if ( !noPropagation ) {
- delayedTriggers.push( function( event ) {
- this._trigger( "remove", event, this._uiHash() );
- } );
- delayedTriggers.push( ( function( c ) {
- return function( event ) {
- c._trigger( "receive", event, this._uiHash( this ) );
- };
- } ).call( this, this.currentContainer ) );
- delayedTriggers.push( ( function( c ) {
- return function( event ) {
- c._trigger( "update", event, this._uiHash( this ) );
- };
- } ).call( this, this.currentContainer ) );
- }
- }
-
- //Post events to containers
- function delayEvent( type, instance, container ) {
- return function( event ) {
- container._trigger( type, event, instance._uiHash( instance ) );
- };
- }
- for ( i = this.containers.length - 1; i >= 0; i-- ) {
- if ( !noPropagation ) {
- delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
- }
- if ( this.containers[ i ].containerCache.over ) {
- delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
- this.containers[ i ].containerCache.over = 0;
- }
- }
-
- //Do what was originally in plugins
- if ( this.storedCursor ) {
- this.document.find( "body" ).css( "cursor", this.storedCursor );
- this.storedStylesheet.remove();
- }
- if ( this._storedOpacity ) {
- this.helper.css( "opacity", this._storedOpacity );
- }
- if ( this._storedZIndex ) {
- this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
- }
-
- this.dragging = false;
-
- if ( !noPropagation ) {
- this._trigger( "beforeStop", event, this._uiHash() );
- }
-
- //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
- // it unbinds ALL events from the original node!
- this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
-
- if ( !this.cancelHelperRemoval ) {
- if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
- this.helper.remove();
- }
- this.helper = null;
- }
-
- if ( !noPropagation ) {
- for ( i = 0; i < delayedTriggers.length; i++ ) {
-
- // Trigger all delayed events
- delayedTriggers[ i ].call( this, event );
- }
- this._trigger( "stop", event, this._uiHash() );
- }
-
- this.fromOutside = false;
- return !this.cancelHelperRemoval;
-
- },
-
- _trigger: function() {
- if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
- this.cancel();
- }
- },
-
- _uiHash: function( _inst ) {
- var inst = _inst || this;
- return {
- helper: inst.helper,
- placeholder: inst.placeholder || $( [] ),
- position: inst.position,
- originalPosition: inst.originalPosition,
- offset: inst.positionAbs,
- item: inst.currentItem,
- sender: _inst ? _inst.element : null
- };
- }
-
-} );
-
-
-/*!
- * jQuery UI Accordion 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Accordion
-//>>group: Widgets
-// jscs:disable maximumLineLength
-//>>description: Displays collapsible content panels for presenting information in a limited amount of space.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/accordion/
-//>>demos: http://jqueryui.com/accordion/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/accordion.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsAccordion = $.widget( "ui.accordion", {
- version: "1.12.1",
- options: {
- active: 0,
- animate: {},
- classes: {
- "ui-accordion-header": "ui-corner-top",
- "ui-accordion-header-collapsed": "ui-corner-all",
- "ui-accordion-content": "ui-corner-bottom"
- },
- collapsible: false,
- event: "click",
- header: "> li > :first-child, > :not(li):even",
- heightStyle: "auto",
- icons: {
- activeHeader: "ui-icon-triangle-1-s",
- header: "ui-icon-triangle-1-e"
- },
-
- // Callbacks
- activate: null,
- beforeActivate: null
- },
-
- hideProps: {
- borderTopWidth: "hide",
- borderBottomWidth: "hide",
- paddingTop: "hide",
- paddingBottom: "hide",
- height: "hide"
- },
-
- showProps: {
- borderTopWidth: "show",
- borderBottomWidth: "show",
- paddingTop: "show",
- paddingBottom: "show",
- height: "show"
- },
-
- _create: function() {
- var options = this.options;
-
- this.prevShow = this.prevHide = $();
- this._addClass( "ui-accordion", "ui-widget ui-helper-reset" );
- this.element.attr( "role", "tablist" );
-
- // Don't allow collapsible: false and active: false / null
- if ( !options.collapsible && ( options.active === false || options.active == null ) ) {
- options.active = 0;
- }
-
- this._processPanels();
-
- // handle negative values
- if ( options.active < 0 ) {
- options.active += this.headers.length;
- }
- this._refresh();
- },
-
- _getCreateEventData: function() {
- return {
- header: this.active,
- panel: !this.active.length ? $() : this.active.next()
- };
- },
-
- _createIcons: function() {
- var icon, children,
- icons = this.options.icons;
-
- if ( icons ) {
- icon = $( "<span>" );
- this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header );
- icon.prependTo( this.headers );
- children = this.active.children( ".ui-accordion-header-icon" );
- this._removeClass( children, icons.header )
- ._addClass( children, null, icons.activeHeader )
- ._addClass( this.headers, "ui-accordion-icons" );
- }
- },
-
- _destroyIcons: function() {
- this._removeClass( this.headers, "ui-accordion-icons" );
- this.headers.children( ".ui-accordion-header-icon" ).remove();
- },
-
- _destroy: function() {
- var contents;
-
- // Clean up main element
- this.element.removeAttr( "role" );
-
- // Clean up headers
- this.headers
- .removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" )
- .removeUniqueId();
-
- this._destroyIcons();
-
- // Clean up content panels
- contents = this.headers.next()
- .css( "display", "" )
- .removeAttr( "role aria-hidden aria-labelledby" )
- .removeUniqueId();
-
- if ( this.options.heightStyle !== "content" ) {
- contents.css( "height", "" );
- }
- },
-
- _setOption: function( key, value ) {
- if ( key === "active" ) {
-
- // _activate() will handle invalid values and update this.options
- this._activate( value );
- return;
- }
-
- if ( key === "event" ) {
- if ( this.options.event ) {
- this._off( this.headers, this.options.event );
- }
- this._setupEvents( value );
- }
-
- this._super( key, value );
-
- // Setting collapsible: false while collapsed; open first panel
- if ( key === "collapsible" && !value && this.options.active === false ) {
- this._activate( 0 );
- }
-
- if ( key === "icons" ) {
- this._destroyIcons();
- if ( value ) {
- this._createIcons();
- }
- }
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this.element.attr( "aria-disabled", value );
-
- // Support: IE8 Only
- // #5332 / #6059 - opacity doesn't cascade to positioned elements in IE
- // so we need to add the disabled class to the headers and panels
- this._toggleClass( null, "ui-state-disabled", !!value );
- this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled",
- !!value );
- },
-
- _keydown: function( event ) {
- if ( event.altKey || event.ctrlKey ) {
- return;
- }
-
- var keyCode = $.ui.keyCode,
- length = this.headers.length,
- currentIndex = this.headers.index( event.target ),
- toFocus = false;
-
- switch ( event.keyCode ) {
- case keyCode.RIGHT:
- case keyCode.DOWN:
- toFocus = this.headers[ ( currentIndex + 1 ) % length ];
- break;
- case keyCode.LEFT:
- case keyCode.UP:
- toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
- break;
- case keyCode.SPACE:
- case keyCode.ENTER:
- this._eventHandler( event );
- break;
- case keyCode.HOME:
- toFocus = this.headers[ 0 ];
- break;
- case keyCode.END:
- toFocus = this.headers[ length - 1 ];
- break;
- }
-
- if ( toFocus ) {
- $( event.target ).attr( "tabIndex", -1 );
- $( toFocus ).attr( "tabIndex", 0 );
- $( toFocus ).trigger( "focus" );
- event.preventDefault();
- }
- },
-
- _panelKeyDown: function( event ) {
- if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
- $( event.currentTarget ).prev().trigger( "focus" );
- }
- },
-
- refresh: function() {
- var options = this.options;
- this._processPanels();
-
- // Was collapsed or no panel
- if ( ( options.active === false && options.collapsible === true ) ||
- !this.headers.length ) {
- options.active = false;
- this.active = $();
-
- // active false only when collapsible is true
- } else if ( options.active === false ) {
- this._activate( 0 );
-
- // was active, but active panel is gone
- } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
-
- // all remaining panel are disabled
- if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) {
- options.active = false;
- this.active = $();
-
- // activate previous panel
- } else {
- this._activate( Math.max( 0, options.active - 1 ) );
- }
-
- // was active, active panel still exists
- } else {
-
- // make sure active index is correct
- options.active = this.headers.index( this.active );
- }
-
- this._destroyIcons();
-
- this._refresh();
- },
-
- _processPanels: function() {
- var prevHeaders = this.headers,
- prevPanels = this.panels;
-
- this.headers = this.element.find( this.options.header );
- this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed",
- "ui-state-default" );
-
- this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide();
- this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" );
-
- // Avoid memory leaks (#10056)
- if ( prevPanels ) {
- this._off( prevHeaders.not( this.headers ) );
- this._off( prevPanels.not( this.panels ) );
- }
- },
-
- _refresh: function() {
- var maxHeight,
- options = this.options,
- heightStyle = options.heightStyle,
- parent = this.element.parent();
-
- this.active = this._findActive( options.active );
- this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" )
- ._removeClass( this.active, "ui-accordion-header-collapsed" );
- this._addClass( this.active.next(), "ui-accordion-content-active" );
- this.active.next().show();
-
- this.headers
- .attr( "role", "tab" )
- .each( function() {
- var header = $( this ),
- headerId = header.uniqueId().attr( "id" ),
- panel = header.next(),
- panelId = panel.uniqueId().attr( "id" );
- header.attr( "aria-controls", panelId );
- panel.attr( "aria-labelledby", headerId );
- } )
- .next()
- .attr( "role", "tabpanel" );
-
- this.headers
- .not( this.active )
- .attr( {
- "aria-selected": "false",
- "aria-expanded": "false",
- tabIndex: -1
- } )
- .next()
- .attr( {
- "aria-hidden": "true"
- } )
- .hide();
-
- // Make sure at least one header is in the tab order
- if ( !this.active.length ) {
- this.headers.eq( 0 ).attr( "tabIndex", 0 );
- } else {
- this.active.attr( {
- "aria-selected": "true",
- "aria-expanded": "true",
- tabIndex: 0
- } )
- .next()
- .attr( {
- "aria-hidden": "false"
- } );
- }
-
- this._createIcons();
-
- this._setupEvents( options.event );
-
- if ( heightStyle === "fill" ) {
- maxHeight = parent.height();
- this.element.siblings( ":visible" ).each( function() {
- var elem = $( this ),
- position = elem.css( "position" );
-
- if ( position === "absolute" || position === "fixed" ) {
- return;
- }
- maxHeight -= elem.outerHeight( true );
- } );
-
- this.headers.each( function() {
- maxHeight -= $( this ).outerHeight( true );
- } );
-
- this.headers.next()
- .each( function() {
- $( this ).height( Math.max( 0, maxHeight -
- $( this ).innerHeight() + $( this ).height() ) );
- } )
- .css( "overflow", "auto" );
- } else if ( heightStyle === "auto" ) {
- maxHeight = 0;
- this.headers.next()
- .each( function() {
- var isVisible = $( this ).is( ":visible" );
- if ( !isVisible ) {
- $( this ).show();
- }
- maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
- if ( !isVisible ) {
- $( this ).hide();
- }
- } )
- .height( maxHeight );
- }
- },
-
- _activate: function( index ) {
- var active = this._findActive( index )[ 0 ];
-
- // Trying to activate the already active panel
- if ( active === this.active[ 0 ] ) {
- return;
- }
-
- // Trying to collapse, simulate a click on the currently active header
- active = active || this.active[ 0 ];
-
- this._eventHandler( {
- target: active,
- currentTarget: active,
- preventDefault: $.noop
- } );
- },
-
- _findActive: function( selector ) {
- return typeof selector === "number" ? this.headers.eq( selector ) : $();
- },
-
- _setupEvents: function( event ) {
- var events = {
- keydown: "_keydown"
- };
- if ( event ) {
- $.each( event.split( " " ), function( index, eventName ) {
- events[ eventName ] = "_eventHandler";
- } );
- }
-
- this._off( this.headers.add( this.headers.next() ) );
- this._on( this.headers, events );
- this._on( this.headers.next(), { keydown: "_panelKeyDown" } );
- this._hoverable( this.headers );
- this._focusable( this.headers );
- },
-
- _eventHandler: function( event ) {
- var activeChildren, clickedChildren,
- options = this.options,
- active = this.active,
- clicked = $( event.currentTarget ),
- clickedIsActive = clicked[ 0 ] === active[ 0 ],
- collapsing = clickedIsActive && options.collapsible,
- toShow = collapsing ? $() : clicked.next(),
- toHide = active.next(),
- eventData = {
- oldHeader: active,
- oldPanel: toHide,
- newHeader: collapsing ? $() : clicked,
- newPanel: toShow
- };
-
- event.preventDefault();
-
- if (
-
- // click on active header, but not collapsible
- ( clickedIsActive && !options.collapsible ) ||
-
- // allow canceling activation
- ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
- return;
- }
-
- options.active = collapsing ? false : this.headers.index( clicked );
-
- // When the call to ._toggle() comes after the class changes
- // it causes a very odd bug in IE 8 (see #6720)
- this.active = clickedIsActive ? $() : clicked;
- this._toggle( eventData );
-
- // Switch classes
- // corner classes on the previously active header stay after the animation
- this._removeClass( active, "ui-accordion-header-active", "ui-state-active" );
- if ( options.icons ) {
- activeChildren = active.children( ".ui-accordion-header-icon" );
- this._removeClass( activeChildren, null, options.icons.activeHeader )
- ._addClass( activeChildren, null, options.icons.header );
- }
-
- if ( !clickedIsActive ) {
- this._removeClass( clicked, "ui-accordion-header-collapsed" )
- ._addClass( clicked, "ui-accordion-header-active", "ui-state-active" );
- if ( options.icons ) {
- clickedChildren = clicked.children( ".ui-accordion-header-icon" );
- this._removeClass( clickedChildren, null, options.icons.header )
- ._addClass( clickedChildren, null, options.icons.activeHeader );
- }
-
- this._addClass( clicked.next(), "ui-accordion-content-active" );
- }
- },
-
- _toggle: function( data ) {
- var toShow = data.newPanel,
- toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
-
- // Handle activating a panel during the animation for another activation
- this.prevShow.add( this.prevHide ).stop( true, true );
- this.prevShow = toShow;
- this.prevHide = toHide;
-
- if ( this.options.animate ) {
- this._animate( toShow, toHide, data );
- } else {
- toHide.hide();
- toShow.show();
- this._toggleComplete( data );
- }
-
- toHide.attr( {
- "aria-hidden": "true"
- } );
- toHide.prev().attr( {
- "aria-selected": "false",
- "aria-expanded": "false"
- } );
-
- // if we're switching panels, remove the old header from the tab order
- // if we're opening from collapsed state, remove the previous header from the tab order
- // if we're collapsing, then keep the collapsing header in the tab order
- if ( toShow.length && toHide.length ) {
- toHide.prev().attr( {
- "tabIndex": -1,
- "aria-expanded": "false"
- } );
- } else if ( toShow.length ) {
- this.headers.filter( function() {
- return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0;
- } )
- .attr( "tabIndex", -1 );
- }
-
- toShow
- .attr( "aria-hidden", "false" )
- .prev()
- .attr( {
- "aria-selected": "true",
- "aria-expanded": "true",
- tabIndex: 0
- } );
- },
-
- _animate: function( toShow, toHide, data ) {
- var total, easing, duration,
- that = this,
- adjust = 0,
- boxSizing = toShow.css( "box-sizing" ),
- down = toShow.length &&
- ( !toHide.length || ( toShow.index() < toHide.index() ) ),
- animate = this.options.animate || {},
- options = down && animate.down || animate,
- complete = function() {
- that._toggleComplete( data );
- };
-
- if ( typeof options === "number" ) {
- duration = options;
- }
- if ( typeof options === "string" ) {
- easing = options;
- }
-
- // fall back from options to animation in case of partial down settings
- easing = easing || options.easing || animate.easing;
- duration = duration || options.duration || animate.duration;
-
- if ( !toHide.length ) {
- return toShow.animate( this.showProps, duration, easing, complete );
- }
- if ( !toShow.length ) {
- return toHide.animate( this.hideProps, duration, easing, complete );
- }
-
- total = toShow.show().outerHeight();
- toHide.animate( this.hideProps, {
- duration: duration,
- easing: easing,
- step: function( now, fx ) {
- fx.now = Math.round( now );
- }
- } );
- toShow
- .hide()
- .animate( this.showProps, {
- duration: duration,
- easing: easing,
- complete: complete,
- step: function( now, fx ) {
- fx.now = Math.round( now );
- if ( fx.prop !== "height" ) {
- if ( boxSizing === "content-box" ) {
- adjust += fx.now;
- }
- } else if ( that.options.heightStyle !== "content" ) {
- fx.now = Math.round( total - toHide.outerHeight() - adjust );
- adjust = 0;
- }
- }
- } );
- },
-
- _toggleComplete: function( data ) {
- var toHide = data.oldPanel,
- prev = toHide.prev();
-
- this._removeClass( toHide, "ui-accordion-content-active" );
- this._removeClass( prev, "ui-accordion-header-active" )
- ._addClass( prev, "ui-accordion-header-collapsed" );
-
- // Work around for rendering bug in IE (#5421)
- if ( toHide.length ) {
- toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;
- }
- this._trigger( "activate", null, data );
- }
-} );
-
-
-/*!
- * jQuery UI Menu 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Menu
-//>>group: Widgets
-//>>description: Creates nestable menus.
-//>>docs: http://api.jqueryui.com/menu/
-//>>demos: http://jqueryui.com/menu/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/menu.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsMenu = $.widget( "ui.menu", {
- version: "1.12.1",
- defaultElement: "<ul>",
- delay: 300,
- options: {
- icons: {
- submenu: "ui-icon-caret-1-e"
- },
- items: "> *",
- menus: "ul",
- position: {
- my: "left top",
- at: "right top"
- },
- role: "menu",
-
- // Callbacks
- blur: null,
- focus: null,
- select: null
- },
-
- _create: function() {
- this.activeMenu = this.element;
-
- // Flag used to prevent firing of the click handler
- // as the event bubbles up through nested menus
- this.mouseHandled = false;
- this.element
- .uniqueId()
- .attr( {
- role: this.options.role,
- tabIndex: 0
- } );
-
- this._addClass( "ui-menu", "ui-widget ui-widget-content" );
- this._on( {
-
- // Prevent focus from sticking to links inside menu after clicking
- // them (focus should always stay on UL during navigation).
- "mousedown .ui-menu-item": function( event ) {
- event.preventDefault();
- },
- "click .ui-menu-item": function( event ) {
- var target = $( event.target );
- var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
- if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {
- this.select( event );
-
- // Only set the mouseHandled flag if the event will bubble, see #9469.
- if ( !event.isPropagationStopped() ) {
- this.mouseHandled = true;
- }
-
- // Open submenu on click
- if ( target.has( ".ui-menu" ).length ) {
- this.expand( event );
- } else if ( !this.element.is( ":focus" ) &&
- active.closest( ".ui-menu" ).length ) {
-
- // Redirect focus to the menu
- this.element.trigger( "focus", [ true ] );
-
- // If the active item is on the top level, let it stay active.
- // Otherwise, blur the active item since it is no longer visible.
- if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
- clearTimeout( this.timer );
- }
- }
- }
- },
- "mouseenter .ui-menu-item": function( event ) {
-
- // Ignore mouse events while typeahead is active, see #10458.
- // Prevents focusing the wrong item when typeahead causes a scroll while the mouse
- // is over an item in the menu
- if ( this.previousFilter ) {
- return;
- }
-
- var actualTarget = $( event.target ).closest( ".ui-menu-item" ),
- target = $( event.currentTarget );
-
- // Ignore bubbled events on parent items, see #11641
- if ( actualTarget[ 0 ] !== target[ 0 ] ) {
- return;
- }
-
- // Remove ui-state-active class from siblings of the newly focused menu item
- // to avoid a jump caused by adjacent elements both having a class with a border
- this._removeClass( target.siblings().children( ".ui-state-active" ),
- null, "ui-state-active" );
- this.focus( event, target );
- },
- mouseleave: "collapseAll",
- "mouseleave .ui-menu": "collapseAll",
- focus: function( event, keepActiveItem ) {
-
- // If there's already an active item, keep it active
- // If not, activate the first item
- var item = this.active || this.element.find( this.options.items ).eq( 0 );
-
- if ( !keepActiveItem ) {
- this.focus( event, item );
- }
- },
- blur: function( event ) {
- this._delay( function() {
- var notContained = !$.contains(
- this.element[ 0 ],
- $.ui.safeActiveElement( this.document[ 0 ] )
- );
- if ( notContained ) {
- this.collapseAll( event );
- }
- } );
- },
- keydown: "_keydown"
- } );
-
- this.refresh();
-
- // Clicks outside of a menu collapse any open menus
- this._on( this.document, {
- click: function( event ) {
- if ( this._closeOnDocumentClick( event ) ) {
- this.collapseAll( event );
- }
-
- // Reset the mouseHandled flag
- this.mouseHandled = false;
- }
- } );
- },
-
- _destroy: function() {
- var items = this.element.find( ".ui-menu-item" )
- .removeAttr( "role aria-disabled" ),
- submenus = items.children( ".ui-menu-item-wrapper" )
- .removeUniqueId()
- .removeAttr( "tabIndex role aria-haspopup" );
-
- // Destroy (sub)menus
- this.element
- .removeAttr( "aria-activedescendant" )
- .find( ".ui-menu" ).addBack()
- .removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
- "tabIndex" )
- .removeUniqueId()
- .show();
-
- submenus.children().each( function() {
- var elem = $( this );
- if ( elem.data( "ui-menu-submenu-caret" ) ) {
- elem.remove();
- }
- } );
- },
-
- _keydown: function( event ) {
- var match, prev, character, skip,
- preventDefault = true;
-
- switch ( event.keyCode ) {
- case $.ui.keyCode.PAGE_UP:
- this.previousPage( event );
- break;
- case $.ui.keyCode.PAGE_DOWN:
- this.nextPage( event );
- break;
- case $.ui.keyCode.HOME:
- this._move( "first", "first", event );
- break;
- case $.ui.keyCode.END:
- this._move( "last", "last", event );
- break;
- case $.ui.keyCode.UP:
- this.previous( event );
- break;
- case $.ui.keyCode.DOWN:
- this.next( event );
- break;
- case $.ui.keyCode.LEFT:
- this.collapse( event );
- break;
- case $.ui.keyCode.RIGHT:
- if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
- this.expand( event );
- }
- break;
- case $.ui.keyCode.ENTER:
- case $.ui.keyCode.SPACE:
- this._activate( event );
- break;
- case $.ui.keyCode.ESCAPE:
- this.collapse( event );
- break;
- default:
- preventDefault = false;
- prev = this.previousFilter || "";
- skip = false;
-
- // Support number pad values
- character = event.keyCode >= 96 && event.keyCode <= 105 ?
- ( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
-
- clearTimeout( this.filterTimer );
-
- if ( character === prev ) {
- skip = true;
- } else {
- character = prev + character;
- }
-
- match = this._filterMenuItems( character );
- match = skip && match.index( this.active.next() ) !== -1 ?
- this.active.nextAll( ".ui-menu-item" ) :
- match;
-
- // If no matches on the current filter, reset to the last character pressed
- // to move down the menu to the first item that starts with that character
- if ( !match.length ) {
- character = String.fromCharCode( event.keyCode );
- match = this._filterMenuItems( character );
- }
-
- if ( match.length ) {
- this.focus( event, match );
- this.previousFilter = character;
- this.filterTimer = this._delay( function() {
- delete this.previousFilter;
- }, 1000 );
- } else {
- delete this.previousFilter;
- }
- }
-
- if ( preventDefault ) {
- event.preventDefault();
- }
- },
-
- _activate: function( event ) {
- if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
- if ( this.active.children( "[aria-haspopup='true']" ).length ) {
- this.expand( event );
- } else {
- this.select( event );
- }
- }
- },
-
- refresh: function() {
- var menus, items, newSubmenus, newItems, newWrappers,
- that = this,
- icon = this.options.icons.submenu,
- submenus = this.element.find( this.options.menus );
-
- this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length );
-
- // Initialize nested menus
- newSubmenus = submenus.filter( ":not(.ui-menu)" )
- .hide()
- .attr( {
- role: this.options.role,
- "aria-hidden": "true",
- "aria-expanded": "false"
- } )
- .each( function() {
- var menu = $( this ),
- item = menu.prev(),
- submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true );
-
- that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon );
- item
- .attr( "aria-haspopup", "true" )
- .prepend( submenuCaret );
- menu.attr( "aria-labelledby", item.attr( "id" ) );
- } );
-
- this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" );
-
- menus = submenus.add( this.element );
- items = menus.find( this.options.items );
-
- // Initialize menu-items containing spaces and/or dashes only as dividers
- items.not( ".ui-menu-item" ).each( function() {
- var item = $( this );
- if ( that._isDivider( item ) ) {
- that._addClass( item, "ui-menu-divider", "ui-widget-content" );
- }
- } );
-
- // Don't refresh list items that are already adapted
- newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
- newWrappers = newItems.children()
- .not( ".ui-menu" )
- .uniqueId()
- .attr( {
- tabIndex: -1,
- role: this._itemRole()
- } );
- this._addClass( newItems, "ui-menu-item" )
- ._addClass( newWrappers, "ui-menu-item-wrapper" );
-
- // Add aria-disabled attribute to any disabled menu item
- items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
-
- // If the active item has been removed, blur the menu
- if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
- this.blur();
- }
- },
-
- _itemRole: function() {
- return {
- menu: "menuitem",
- listbox: "option"
- }[ this.options.role ];
- },
-
- _setOption: function( key, value ) {
- if ( key === "icons" ) {
- var icons = this.element.find( ".ui-menu-icon" );
- this._removeClass( icons, null, this.options.icons.submenu )
- ._addClass( icons, null, value.submenu );
- }
- this._super( key, value );
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this.element.attr( "aria-disabled", String( value ) );
- this._toggleClass( null, "ui-state-disabled", !!value );
- },
-
- focus: function( event, item ) {
- var nested, focused, activeParent;
- this.blur( event, event && event.type === "focus" );
-
- this._scrollIntoView( item );
-
- this.active = item.first();
-
- focused = this.active.children( ".ui-menu-item-wrapper" );
- this._addClass( focused, null, "ui-state-active" );
-
- // Only update aria-activedescendant if there's a role
- // otherwise we assume focus is managed elsewhere
- if ( this.options.role ) {
- this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
- }
-
- // Highlight active parent menu item, if any
- activeParent = this.active
- .parent()
- .closest( ".ui-menu-item" )
- .children( ".ui-menu-item-wrapper" );
- this._addClass( activeParent, null, "ui-state-active" );
-
- if ( event && event.type === "keydown" ) {
- this._close();
- } else {
- this.timer = this._delay( function() {
- this._close();
- }, this.delay );
- }
-
- nested = item.children( ".ui-menu" );
- if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {
- this._startOpening( nested );
- }
- this.activeMenu = item.parent();
-
- this._trigger( "focus", event, { item: item } );
- },
-
- _scrollIntoView: function( item ) {
- var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
- if ( this._hasScroll() ) {
- borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0;
- paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0;
- offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
- scroll = this.activeMenu.scrollTop();
- elementHeight = this.activeMenu.height();
- itemHeight = item.outerHeight();
-
- if ( offset < 0 ) {
- this.activeMenu.scrollTop( scroll + offset );
- } else if ( offset + itemHeight > elementHeight ) {
- this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
- }
- }
- },
-
- blur: function( event, fromFocus ) {
- if ( !fromFocus ) {
- clearTimeout( this.timer );
- }
-
- if ( !this.active ) {
- return;
- }
-
- this._removeClass( this.active.children( ".ui-menu-item-wrapper" ),
- null, "ui-state-active" );
-
- this._trigger( "blur", event, { item: this.active } );
- this.active = null;
- },
-
- _startOpening: function( submenu ) {
- clearTimeout( this.timer );
-
- // Don't open if already open fixes a Firefox bug that caused a .5 pixel
- // shift in the submenu position when mousing over the caret icon
- if ( submenu.attr( "aria-hidden" ) !== "true" ) {
- return;
- }
-
- this.timer = this._delay( function() {
- this._close();
- this._open( submenu );
- }, this.delay );
- },
-
- _open: function( submenu ) {
- var position = $.extend( {
- of: this.active
- }, this.options.position );
-
- clearTimeout( this.timer );
- this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
- .hide()
- .attr( "aria-hidden", "true" );
-
- submenu
- .show()
- .removeAttr( "aria-hidden" )
- .attr( "aria-expanded", "true" )
- .position( position );
- },
-
- collapseAll: function( event, all ) {
- clearTimeout( this.timer );
- this.timer = this._delay( function() {
-
- // If we were passed an event, look for the submenu that contains the event
- var currentMenu = all ? this.element :
- $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
-
- // If we found no valid submenu ancestor, use the main menu to close all
- // sub menus anyway
- if ( !currentMenu.length ) {
- currentMenu = this.element;
- }
-
- this._close( currentMenu );
-
- this.blur( event );
-
- // Work around active item staying active after menu is blurred
- this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" );
-
- this.activeMenu = currentMenu;
- }, this.delay );
- },
-
- // With no arguments, closes the currently active menu - if nothing is active
- // it closes all menus. If passed an argument, it will search for menus BELOW
- _close: function( startMenu ) {
- if ( !startMenu ) {
- startMenu = this.active ? this.active.parent() : this.element;
- }
-
- startMenu.find( ".ui-menu" )
- .hide()
- .attr( "aria-hidden", "true" )
- .attr( "aria-expanded", "false" );
- },
-
- _closeOnDocumentClick: function( event ) {
- return !$( event.target ).closest( ".ui-menu" ).length;
- },
-
- _isDivider: function( item ) {
-
- // Match hyphen, em dash, en dash
- return !/[^\-\u2014\u2013\s]/.test( item.text() );
- },
-
- collapse: function( event ) {
- var newItem = this.active &&
- this.active.parent().closest( ".ui-menu-item", this.element );
- if ( newItem && newItem.length ) {
- this._close();
- this.focus( event, newItem );
- }
- },
-
- expand: function( event ) {
- var newItem = this.active &&
- this.active
- .children( ".ui-menu " )
- .find( this.options.items )
- .first();
-
- if ( newItem && newItem.length ) {
- this._open( newItem.parent() );
-
- // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
- this._delay( function() {
- this.focus( event, newItem );
- } );
- }
- },
-
- next: function( event ) {
- this._move( "next", "first", event );
- },
-
- previous: function( event ) {
- this._move( "prev", "last", event );
- },
-
- isFirstItem: function() {
- return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
- },
-
- isLastItem: function() {
- return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
- },
-
- _move: function( direction, filter, event ) {
- var next;
- if ( this.active ) {
- if ( direction === "first" || direction === "last" ) {
- next = this.active
- [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
- .eq( -1 );
- } else {
- next = this.active
- [ direction + "All" ]( ".ui-menu-item" )
- .eq( 0 );
- }
- }
- if ( !next || !next.length || !this.active ) {
- next = this.activeMenu.find( this.options.items )[ filter ]();
- }
-
- this.focus( event, next );
- },
-
- nextPage: function( event ) {
- var item, base, height;
-
- if ( !this.active ) {
- this.next( event );
- return;
- }
- if ( this.isLastItem() ) {
- return;
- }
- if ( this._hasScroll() ) {
- base = this.active.offset().top;
- height = this.element.height();
- this.active.nextAll( ".ui-menu-item" ).each( function() {
- item = $( this );
- return item.offset().top - base - height < 0;
- } );
-
- this.focus( event, item );
- } else {
- this.focus( event, this.activeMenu.find( this.options.items )
- [ !this.active ? "first" : "last" ]() );
- }
- },
-
- previousPage: function( event ) {
- var item, base, height;
- if ( !this.active ) {
- this.next( event );
- return;
- }
- if ( this.isFirstItem() ) {
- return;
- }
- if ( this._hasScroll() ) {
- base = this.active.offset().top;
- height = this.element.height();
- this.active.prevAll( ".ui-menu-item" ).each( function() {
- item = $( this );
- return item.offset().top - base + height > 0;
- } );
-
- this.focus( event, item );
- } else {
- this.focus( event, this.activeMenu.find( this.options.items ).first() );
- }
- },
-
- _hasScroll: function() {
- return this.element.outerHeight() < this.element.prop( "scrollHeight" );
- },
-
- select: function( event ) {
-
- // TODO: It should never be possible to not have an active item at this
- // point, but the tests don't trigger mouseenter before click.
- this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
- var ui = { item: this.active };
- if ( !this.active.has( ".ui-menu" ).length ) {
- this.collapseAll( event, true );
- }
- this._trigger( "select", event, ui );
- },
-
- _filterMenuItems: function( character ) {
- var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
- regex = new RegExp( "^" + escapedCharacter, "i" );
-
- return this.activeMenu
- .find( this.options.items )
-
- // Only match on items, not dividers or other content (#10571)
- .filter( ".ui-menu-item" )
- .filter( function() {
- return regex.test(
- $.trim( $( this ).children( ".ui-menu-item-wrapper" ).text() ) );
- } );
- }
-} );
-
-
-/*!
- * jQuery UI Autocomplete 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Autocomplete
-//>>group: Widgets
-//>>description: Lists suggested words as the user is typing.
-//>>docs: http://api.jqueryui.com/autocomplete/
-//>>demos: http://jqueryui.com/autocomplete/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/autocomplete.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.autocomplete", {
- version: "1.12.1",
- defaultElement: "<input>",
- options: {
- appendTo: null,
- autoFocus: false,
- delay: 300,
- minLength: 1,
- position: {
- my: "left top",
- at: "left bottom",
- collision: "none"
- },
- source: null,
-
- // Callbacks
- change: null,
- close: null,
- focus: null,
- open: null,
- response: null,
- search: null,
- select: null
- },
-
- requestIndex: 0,
- pending: 0,
-
- _create: function() {
-
- // Some browsers only repeat keydown events, not keypress events,
- // so we use the suppressKeyPress flag to determine if we've already
- // handled the keydown event. #7269
- // Unfortunately the code for & in keypress is the same as the up arrow,
- // so we use the suppressKeyPressRepeat flag to avoid handling keypress
- // events when we know the keydown event was used to modify the
- // search term. #7799
- var suppressKeyPress, suppressKeyPressRepeat, suppressInput,
- nodeName = this.element[ 0 ].nodeName.toLowerCase(),
- isTextarea = nodeName === "textarea",
- isInput = nodeName === "input";
-
- // Textareas are always multi-line
- // Inputs are always single-line, even if inside a contentEditable element
- // IE also treats inputs as contentEditable
- // All other element types are determined by whether or not they're contentEditable
- this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element );
-
- this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];
- this.isNewMenu = true;
-
- this._addClass( "ui-autocomplete-input" );
- this.element.attr( "autocomplete", "off" );
-
- this._on( this.element, {
- keydown: function( event ) {
- if ( this.element.prop( "readOnly" ) ) {
- suppressKeyPress = true;
- suppressInput = true;
- suppressKeyPressRepeat = true;
- return;
- }
-
- suppressKeyPress = false;
- suppressInput = false;
- suppressKeyPressRepeat = false;
- var keyCode = $.ui.keyCode;
- switch ( event.keyCode ) {
- case keyCode.PAGE_UP:
- suppressKeyPress = true;
- this._move( "previousPage", event );
- break;
- case keyCode.PAGE_DOWN:
- suppressKeyPress = true;
- this._move( "nextPage", event );
- break;
- case keyCode.UP:
- suppressKeyPress = true;
- this._keyEvent( "previous", event );
- break;
- case keyCode.DOWN:
- suppressKeyPress = true;
- this._keyEvent( "next", event );
- break;
- case keyCode.ENTER:
-
- // when menu is open and has focus
- if ( this.menu.active ) {
-
- // #6055 - Opera still allows the keypress to occur
- // which causes forms to submit
- suppressKeyPress = true;
- event.preventDefault();
- this.menu.select( event );
- }
- break;
- case keyCode.TAB:
- if ( this.menu.active ) {
- this.menu.select( event );
- }
- break;
- case keyCode.ESCAPE:
- if ( this.menu.element.is( ":visible" ) ) {
- if ( !this.isMultiLine ) {
- this._value( this.term );
- }
- this.close( event );
-
- // Different browsers have different default behavior for escape
- // Single press can mean undo or clear
- // Double press in IE means clear the whole form
- event.preventDefault();
- }
- break;
- default:
- suppressKeyPressRepeat = true;
-
- // search timeout should be triggered before the input value is changed
- this._searchTimeout( event );
- break;
- }
- },
- keypress: function( event ) {
- if ( suppressKeyPress ) {
- suppressKeyPress = false;
- if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
- event.preventDefault();
- }
- return;
- }
- if ( suppressKeyPressRepeat ) {
- return;
- }
-
- // Replicate some key handlers to allow them to repeat in Firefox and Opera
- var keyCode = $.ui.keyCode;
- switch ( event.keyCode ) {
- case keyCode.PAGE_UP:
- this._move( "previousPage", event );
- break;
- case keyCode.PAGE_DOWN:
- this._move( "nextPage", event );
- break;
- case keyCode.UP:
- this._keyEvent( "previous", event );
- break;
- case keyCode.DOWN:
- this._keyEvent( "next", event );
- break;
- }
- },
- input: function( event ) {
- if ( suppressInput ) {
- suppressInput = false;
- event.preventDefault();
- return;
- }
- this._searchTimeout( event );
- },
- focus: function() {
- this.selectedItem = null;
- this.previous = this._value();
- },
- blur: function( event ) {
- if ( this.cancelBlur ) {
- delete this.cancelBlur;
- return;
- }
-
- clearTimeout( this.searching );
- this.close( event );
- this._change( event );
- }
- } );
-
- this._initSource();
- this.menu = $( "<ul>" )
- .appendTo( this._appendTo() )
- .menu( {
-
- // disable ARIA support, the live region takes care of that
- role: null
- } )
- .hide()
- .menu( "instance" );
-
- this._addClass( this.menu.element, "ui-autocomplete", "ui-front" );
- this._on( this.menu.element, {
- mousedown: function( event ) {
-
- // prevent moving focus out of the text field
- event.preventDefault();
-
- // IE doesn't prevent moving focus even with event.preventDefault()
- // so we set a flag to know when we should ignore the blur event
- this.cancelBlur = true;
- this._delay( function() {
- delete this.cancelBlur;
-
- // Support: IE 8 only
- // Right clicking a menu item or selecting text from the menu items will
- // result in focus moving out of the input. However, we've already received
- // and ignored the blur event because of the cancelBlur flag set above. So
- // we restore focus to ensure that the menu closes properly based on the user's
- // next actions.
- if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
- this.element.trigger( "focus" );
- }
- } );
- },
- menufocus: function( event, ui ) {
- var label, item;
-
- // support: Firefox
- // Prevent accidental activation of menu items in Firefox (#7024 #9118)
- if ( this.isNewMenu ) {
- this.isNewMenu = false;
- if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
- this.menu.blur();
-
- this.document.one( "mousemove", function() {
- $( event.target ).trigger( event.originalEvent );
- } );
-
- return;
- }
- }
-
- item = ui.item.data( "ui-autocomplete-item" );
- if ( false !== this._trigger( "focus", event, { item: item } ) ) {
-
- // use value to match what will end up in the input, if it was a key event
- if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
- this._value( item.value );
- }
- }
-
- // Announce the value in the liveRegion
- label = ui.item.attr( "aria-label" ) || item.value;
- if ( label && $.trim( label ).length ) {
- this.liveRegion.children().hide();
- $( "<div>" ).text( label ).appendTo( this.liveRegion );
- }
- },
- menuselect: function( event, ui ) {
- var item = ui.item.data( "ui-autocomplete-item" ),
- previous = this.previous;
-
- // Only trigger when focus was lost (click on menu)
- if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) {
- this.element.trigger( "focus" );
- this.previous = previous;
-
- // #6109 - IE triggers two focus events and the second
- // is asynchronous, so we need to reset the previous
- // term synchronously and asynchronously :-(
- this._delay( function() {
- this.previous = previous;
- this.selectedItem = item;
- } );
- }
-
- if ( false !== this._trigger( "select", event, { item: item } ) ) {
- this._value( item.value );
- }
-
- // reset the term after the select event
- // this allows custom select handling to work properly
- this.term = this._value();
-
- this.close( event );
- this.selectedItem = item;
- }
- } );
-
- this.liveRegion = $( "<div>", {
- role: "status",
- "aria-live": "assertive",
- "aria-relevant": "additions"
- } )
- .appendTo( this.document[ 0 ].body );
-
- this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
-
- // Turning off autocomplete prevents the browser from remembering the
- // value when navigating through history, so we re-enable autocomplete
- // if the page is unloaded before the widget is destroyed. #7790
- this._on( this.window, {
- beforeunload: function() {
- this.element.removeAttr( "autocomplete" );
- }
- } );
- },
-
- _destroy: function() {
- clearTimeout( this.searching );
- this.element.removeAttr( "autocomplete" );
- this.menu.element.remove();
- this.liveRegion.remove();
- },
-
- _setOption: function( key, value ) {
- this._super( key, value );
- if ( key === "source" ) {
- this._initSource();
- }
- if ( key === "appendTo" ) {
- this.menu.element.appendTo( this._appendTo() );
- }
- if ( key === "disabled" && value && this.xhr ) {
- this.xhr.abort();
- }
- },
-
- _isEventTargetInWidget: function( event ) {
- var menuElement = this.menu.element[ 0 ];
-
- return event.target === this.element[ 0 ] ||
- event.target === menuElement ||
- $.contains( menuElement, event.target );
- },
-
- _closeOnClickOutside: function( event ) {
- if ( !this._isEventTargetInWidget( event ) ) {
- this.close();
- }
- },
-
- _appendTo: function() {
- var element = this.options.appendTo;
-
- if ( element ) {
- element = element.jquery || element.nodeType ?
- $( element ) :
- this.document.find( element ).eq( 0 );
- }
-
- if ( !element || !element[ 0 ] ) {
- element = this.element.closest( ".ui-front, dialog" );
- }
-
- if ( !element.length ) {
- element = this.document[ 0 ].body;
- }
-
- return element;
- },
-
- _initSource: function() {
- var array, url,
- that = this;
- if ( $.isArray( this.options.source ) ) {
- array = this.options.source;
- this.source = function( request, response ) {
- response( $.ui.autocomplete.filter( array, request.term ) );
- };
- } else if ( typeof this.options.source === "string" ) {
- url = this.options.source;
- this.source = function( request, response ) {
- if ( that.xhr ) {
- that.xhr.abort();
- }
- that.xhr = $.ajax( {
- url: url,
- data: request,
- dataType: "json",
- success: function( data ) {
- response( data );
- },
- error: function() {
- response( [] );
- }
- } );
- };
- } else {
- this.source = this.options.source;
- }
- },
-
- _searchTimeout: function( event ) {
- clearTimeout( this.searching );
- this.searching = this._delay( function() {
-
- // Search if the value has changed, or if the user retypes the same value (see #7434)
- var equalValues = this.term === this._value(),
- menuVisible = this.menu.element.is( ":visible" ),
- modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
-
- if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {
- this.selectedItem = null;
- this.search( null, event );
- }
- }, this.options.delay );
- },
-
- search: function( value, event ) {
- value = value != null ? value : this._value();
-
- // Always save the actual value, not the one passed as an argument
- this.term = this._value();
-
- if ( value.length < this.options.minLength ) {
- return this.close( event );
- }
-
- if ( this._trigger( "search", event ) === false ) {
- return;
- }
-
- return this._search( value );
- },
-
- _search: function( value ) {
- this.pending++;
- this._addClass( "ui-autocomplete-loading" );
- this.cancelSearch = false;
-
- this.source( { term: value }, this._response() );
- },
-
- _response: function() {
- var index = ++this.requestIndex;
-
- return $.proxy( function( content ) {
- if ( index === this.requestIndex ) {
- this.__response( content );
- }
-
- this.pending--;
- if ( !this.pending ) {
- this._removeClass( "ui-autocomplete-loading" );
- }
- }, this );
- },
-
- __response: function( content ) {
- if ( content ) {
- content = this._normalize( content );
- }
- this._trigger( "response", null, { content: content } );
- if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
- this._suggest( content );
- this._trigger( "open" );
- } else {
-
- // use ._close() instead of .close() so we don't cancel future searches
- this._close();
- }
- },
-
- close: function( event ) {
- this.cancelSearch = true;
- this._close( event );
- },
-
- _close: function( event ) {
-
- // Remove the handler that closes the menu on outside clicks
- this._off( this.document, "mousedown" );
-
- if ( this.menu.element.is( ":visible" ) ) {
- this.menu.element.hide();
- this.menu.blur();
- this.isNewMenu = true;
- this._trigger( "close", event );
- }
- },
-
- _change: function( event ) {
- if ( this.previous !== this._value() ) {
- this._trigger( "change", event, { item: this.selectedItem } );
- }
- },
-
- _normalize: function( items ) {
-
- // assume all items have the right format when the first item is complete
- if ( items.length && items[ 0 ].label && items[ 0 ].value ) {
- return items;
- }
- return $.map( items, function( item ) {
- if ( typeof item === "string" ) {
- return {
- label: item,
- value: item
- };
- }
- return $.extend( {}, item, {
- label: item.label || item.value,
- value: item.value || item.label
- } );
- } );
- },
-
- _suggest: function( items ) {
- var ul = this.menu.element.empty();
- this._renderMenu( ul, items );
- this.isNewMenu = true;
- this.menu.refresh();
-
- // Size and position menu
- ul.show();
- this._resizeMenu();
- ul.position( $.extend( {
- of: this.element
- }, this.options.position ) );
-
- if ( this.options.autoFocus ) {
- this.menu.next();
- }
-
- // Listen for interactions outside of the widget (#6642)
- this._on( this.document, {
- mousedown: "_closeOnClickOutside"
- } );
- },
-
- _resizeMenu: function() {
- var ul = this.menu.element;
- ul.outerWidth( Math.max(
-
- // Firefox wraps long text (possibly a rounding bug)
- // so we add 1px to avoid the wrapping (#7513)
- ul.width( "" ).outerWidth() + 1,
- this.element.outerWidth()
- ) );
- },
-
- _renderMenu: function( ul, items ) {
- var that = this;
- $.each( items, function( index, item ) {
- that._renderItemData( ul, item );
- } );
- },
-
- _renderItemData: function( ul, item ) {
- return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
- },
-
- _renderItem: function( ul, item ) {
- return $( "<li>" )
- .append( $( "<div>" ).text( item.label ) )
- .appendTo( ul );
- },
-
- _move: function( direction, event ) {
- if ( !this.menu.element.is( ":visible" ) ) {
- this.search( null, event );
- return;
- }
- if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
- this.menu.isLastItem() && /^next/.test( direction ) ) {
-
- if ( !this.isMultiLine ) {
- this._value( this.term );
- }
-
- this.menu.blur();
- return;
- }
- this.menu[ direction ]( event );
- },
-
- widget: function() {
- return this.menu.element;
- },
-
- _value: function() {
- return this.valueMethod.apply( this.element, arguments );
- },
-
- _keyEvent: function( keyEvent, event ) {
- if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
- this._move( keyEvent, event );
-
- // Prevents moving cursor to beginning/end of the text field in some browsers
- event.preventDefault();
- }
- },
-
- // Support: Chrome <=50
- // We should be able to just use this.element.prop( "isContentEditable" )
- // but hidden elements always report false in Chrome.
- // https://code.google.com/p/chromium/issues/detail?id=313082
- _isContentEditable: function( element ) {
- if ( !element.length ) {
- return false;
- }
-
- var editable = element.prop( "contentEditable" );
-
- if ( editable === "inherit" ) {
- return this._isContentEditable( element.parent() );
- }
-
- return editable === "true";
- }
-} );
-
-$.extend( $.ui.autocomplete, {
- escapeRegex: function( value ) {
- return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
- },
- filter: function( array, term ) {
- var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" );
- return $.grep( array, function( value ) {
- return matcher.test( value.label || value.value || value );
- } );
- }
-} );
-
-// Live region extension, adding a `messages` option
-// NOTE: This is an experimental API. We are still investigating
-// a full solution for string manipulation and internationalization.
-$.widget( "ui.autocomplete", $.ui.autocomplete, {
- options: {
- messages: {
- noResults: "No search results.",
- results: function( amount ) {
- return amount + ( amount > 1 ? " results are" : " result is" ) +
- " available, use up and down arrow keys to navigate.";
- }
- }
- },
-
- __response: function( content ) {
- var message;
- this._superApply( arguments );
- if ( this.options.disabled || this.cancelSearch ) {
- return;
- }
- if ( content && content.length ) {
- message = this.options.messages.results( content.length );
- } else {
- message = this.options.messages.noResults;
- }
- this.liveRegion.children().hide();
- $( "<div>" ).text( message ).appendTo( this.liveRegion );
- }
-} );
-
-var widgetsAutocomplete = $.ui.autocomplete;
-
-
-/*!
- * jQuery UI Controlgroup 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Controlgroup
-//>>group: Widgets
-//>>description: Visually groups form control widgets
-//>>docs: http://api.jqueryui.com/controlgroup/
-//>>demos: http://jqueryui.com/controlgroup/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/controlgroup.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
-
-var widgetsControlgroup = $.widget( "ui.controlgroup", {
- version: "1.12.1",
- defaultElement: "<div>",
- options: {
- direction: "horizontal",
- disabled: null,
- onlyVisible: true,
- items: {
- "button": "input[type=button], input[type=submit], input[type=reset], button, a",
- "controlgroupLabel": ".ui-controlgroup-label",
- "checkboxradio": "input[type='checkbox'], input[type='radio']",
- "selectmenu": "select",
- "spinner": ".ui-spinner-input"
- }
- },
-
- _create: function() {
- this._enhance();
- },
-
- // To support the enhanced option in jQuery Mobile, we isolate DOM manipulation
- _enhance: function() {
- this.element.attr( "role", "toolbar" );
- this.refresh();
- },
-
- _destroy: function() {
- this._callChildMethod( "destroy" );
- this.childWidgets.removeData( "ui-controlgroup-data" );
- this.element.removeAttr( "role" );
- if ( this.options.items.controlgroupLabel ) {
- this.element
- .find( this.options.items.controlgroupLabel )
- .find( ".ui-controlgroup-label-contents" )
- .contents().unwrap();
- }
- },
-
- _initWidgets: function() {
- var that = this,
- childWidgets = [];
-
- // First we iterate over each of the items options
- $.each( this.options.items, function( widget, selector ) {
- var labels;
- var options = {};
-
- // Make sure the widget has a selector set
- if ( !selector ) {
- return;
- }
-
- if ( widget === "controlgroupLabel" ) {
- labels = that.element.find( selector );
- labels.each( function() {
- var element = $( this );
-
- if ( element.children( ".ui-controlgroup-label-contents" ).length ) {
- return;
- }
- element.contents()
- .wrapAll( "<span class='ui-controlgroup-label-contents'></span>" );
- } );
- that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" );
- childWidgets = childWidgets.concat( labels.get() );
- return;
- }
-
- // Make sure the widget actually exists
- if ( !$.fn[ widget ] ) {
- return;
- }
-
- // We assume everything is in the middle to start because we can't determine
- // first / last elements until all enhancments are done.
- if ( that[ "_" + widget + "Options" ] ) {
- options = that[ "_" + widget + "Options" ]( "middle" );
- } else {
- options = { classes: {} };
- }
-
- // Find instances of this widget inside controlgroup and init them
- that.element
- .find( selector )
- .each( function() {
- var element = $( this );
- var instance = element[ widget ]( "instance" );
-
- // We need to clone the default options for this type of widget to avoid
- // polluting the variable options which has a wider scope than a single widget.
- var instanceOptions = $.widget.extend( {}, options );
-
- // If the button is the child of a spinner ignore it
- // TODO: Find a more generic solution
- if ( widget === "button" && element.parent( ".ui-spinner" ).length ) {
- return;
- }
-
- // Create the widget if it doesn't exist
- if ( !instance ) {
- instance = element[ widget ]()[ widget ]( "instance" );
- }
- if ( instance ) {
- instanceOptions.classes =
- that._resolveClassesValues( instanceOptions.classes, instance );
- }
- element[ widget ]( instanceOptions );
-
- // Store an instance of the controlgroup to be able to reference
- // from the outermost element for changing options and refresh
- var widgetElement = element[ widget ]( "widget" );
- $.data( widgetElement[ 0 ], "ui-controlgroup-data",
- instance ? instance : element[ widget ]( "instance" ) );
-
- childWidgets.push( widgetElement[ 0 ] );
- } );
- } );
-
- this.childWidgets = $( $.unique( childWidgets ) );
- this._addClass( this.childWidgets, "ui-controlgroup-item" );
- },
-
- _callChildMethod: function( method ) {
- this.childWidgets.each( function() {
- var element = $( this ),
- data = element.data( "ui-controlgroup-data" );
- if ( data && data[ method ] ) {
- data[ method ]();
- }
- } );
- },
-
- _updateCornerClass: function( element, position ) {
- var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all";
- var add = this._buildSimpleOptions( position, "label" ).classes.label;
-
- this._removeClass( element, null, remove );
- this._addClass( element, null, add );
- },
-
- _buildSimpleOptions: function( position, key ) {
- var direction = this.options.direction === "vertical";
- var result = {
- classes: {}
- };
- result.classes[ key ] = {
- "middle": "",
- "first": "ui-corner-" + ( direction ? "top" : "left" ),
- "last": "ui-corner-" + ( direction ? "bottom" : "right" ),
- "only": "ui-corner-all"
- }[ position ];
-
- return result;
- },
-
- _spinnerOptions: function( position ) {
- var options = this._buildSimpleOptions( position, "ui-spinner" );
-
- options.classes[ "ui-spinner-up" ] = "";
- options.classes[ "ui-spinner-down" ] = "";
-
- return options;
- },
-
- _buttonOptions: function( position ) {
- return this._buildSimpleOptions( position, "ui-button" );
- },
-
- _checkboxradioOptions: function( position ) {
- return this._buildSimpleOptions( position, "ui-checkboxradio-label" );
- },
-
- _selectmenuOptions: function( position ) {
- var direction = this.options.direction === "vertical";
- return {
- width: direction ? "auto" : false,
- classes: {
- middle: {
- "ui-selectmenu-button-open": "",
- "ui-selectmenu-button-closed": ""
- },
- first: {
- "ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
- "ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
- },
- last: {
- "ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
- "ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
- },
- only: {
- "ui-selectmenu-button-open": "ui-corner-top",
- "ui-selectmenu-button-closed": "ui-corner-all"
- }
-
- }[ position ]
- };
- },
-
- _resolveClassesValues: function( classes, instance ) {
- var result = {};
- $.each( classes, function( key ) {
- var current = instance.options.classes[ key ] || "";
- current = $.trim( current.replace( controlgroupCornerRegex, "" ) );
- result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " );
- } );
- return result;
- },
-
- _setOption: function( key, value ) {
- if ( key === "direction" ) {
- this._removeClass( "ui-controlgroup-" + this.options.direction );
- }
-
- this._super( key, value );
- if ( key === "disabled" ) {
- this._callChildMethod( value ? "disable" : "enable" );
- return;
- }
-
- this.refresh();
- },
-
- refresh: function() {
- var children,
- that = this;
-
- this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction );
-
- if ( this.options.direction === "horizontal" ) {
- this._addClass( null, "ui-helper-clearfix" );
- }
- this._initWidgets();
-
- children = this.childWidgets;
-
- // We filter here because we need to track all childWidgets not just the visible ones
- if ( this.options.onlyVisible ) {
- children = children.filter( ":visible" );
- }
-
- if ( children.length ) {
-
- // We do this last because we need to make sure all enhancment is done
- // before determining first and last
- $.each( [ "first", "last" ], function( index, value ) {
- var instance = children[ value ]().data( "ui-controlgroup-data" );
-
- if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
- var options = that[ "_" + instance.widgetName + "Options" ](
- children.length === 1 ? "only" : value
- );
- options.classes = that._resolveClassesValues( options.classes, instance );
- instance.element[ instance.widgetName ]( options );
- } else {
- that._updateCornerClass( children[ value ](), value );
- }
- } );
-
- // Finally call the refresh method on each of the child widgets.
- this._callChildMethod( "refresh" );
- }
- }
-} );
-
-/*!
- * jQuery UI Checkboxradio 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Checkboxradio
-//>>group: Widgets
-//>>description: Enhances a form with multiple themeable checkboxes or radio buttons.
-//>>docs: http://api.jqueryui.com/checkboxradio/
-//>>demos: http://jqueryui.com/checkboxradio/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/button.css
-//>>css.structure: ../../themes/base/checkboxradio.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
- version: "1.12.1",
- options: {
- disabled: null,
- label: null,
- icon: true,
- classes: {
- "ui-checkboxradio-label": "ui-corner-all",
- "ui-checkboxradio-icon": "ui-corner-all"
- }
- },
-
- _getCreateOptions: function() {
- var disabled, labels;
- var that = this;
- var options = this._super() || {};
-
- // We read the type here, because it makes more sense to throw a element type error first,
- // rather then the error for lack of a label. Often if its the wrong type, it
- // won't have a label (e.g. calling on a div, btn, etc)
- this._readType();
-
- labels = this.element.labels();
-
- // If there are multiple labels, use the last one
- this.label = $( labels[ labels.length - 1 ] );
- if ( !this.label.length ) {
- $.error( "No label found for checkboxradio widget" );
- }
-
- this.originalLabel = "";
-
- // We need to get the label text but this may also need to make sure it does not contain the
- // input itself.
- this.label.contents().not( this.element[ 0 ] ).each( function() {
-
- // The label contents could be text, html, or a mix. We concat each element to get a
- // string representation of the label, without the input as part of it.
- that.originalLabel += this.nodeType === 3 ? $( this ).text() : this.outerHTML;
- } );
-
- // Set the label option if we found label text
- if ( this.originalLabel ) {
- options.label = this.originalLabel;
- }
-
- disabled = this.element[ 0 ].disabled;
- if ( disabled != null ) {
- options.disabled = disabled;
- }
- return options;
- },
-
- _create: function() {
- var checked = this.element[ 0 ].checked;
-
- this._bindFormResetHandler();
-
- if ( this.options.disabled == null ) {
- this.options.disabled = this.element[ 0 ].disabled;
- }
-
- this._setOption( "disabled", this.options.disabled );
- this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" );
- this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" );
-
- if ( this.type === "radio" ) {
- this._addClass( this.label, "ui-checkboxradio-radio-label" );
- }
-
- if ( this.options.label && this.options.label !== this.originalLabel ) {
- this._updateLabel();
- } else if ( this.originalLabel ) {
- this.options.label = this.originalLabel;
- }
-
- this._enhance();
-
- if ( checked ) {
- this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" );
- if ( this.icon ) {
- this._addClass( this.icon, null, "ui-state-hover" );
- }
- }
-
- this._on( {
- change: "_toggleClasses",
- focus: function() {
- this._addClass( this.label, null, "ui-state-focus ui-visual-focus" );
- },
- blur: function() {
- this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" );
- }
- } );
- },
-
- _readType: function() {
- var nodeName = this.element[ 0 ].nodeName.toLowerCase();
- this.type = this.element[ 0 ].type;
- if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) {
- $.error( "Can't create checkboxradio on element.nodeName=" + nodeName +
- " and element.type=" + this.type );
- }
- },
-
- // Support jQuery Mobile enhanced option
- _enhance: function() {
- this._updateIcon( this.element[ 0 ].checked );
- },
-
- widget: function() {
- return this.label;
- },
-
- _getRadioGroup: function() {
- var group;
- var name = this.element[ 0 ].name;
- var nameSelector = "input[name='" + $.ui.escapeSelector( name ) + "']";
-
- if ( !name ) {
- return $( [] );
- }
-
- if ( this.form.length ) {
- group = $( this.form[ 0 ].elements ).filter( nameSelector );
- } else {
-
- // Not inside a form, check all inputs that also are not inside a form
- group = $( nameSelector ).filter( function() {
- return $( this ).form().length === 0;
- } );
- }
-
- return group.not( this.element );
- },
-
- _toggleClasses: function() {
- var checked = this.element[ 0 ].checked;
- this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
-
- if ( this.options.icon && this.type === "checkbox" ) {
- this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked )
- ._toggleClass( this.icon, null, "ui-icon-blank", !checked );
- }
-
- if ( this.type === "radio" ) {
- this._getRadioGroup()
- .each( function() {
- var instance = $( this ).checkboxradio( "instance" );
-
- if ( instance ) {
- instance._removeClass( instance.label,
- "ui-checkboxradio-checked", "ui-state-active" );
- }
- } );
- }
- },
-
- _destroy: function() {
- this._unbindFormResetHandler();
-
- if ( this.icon ) {
- this.icon.remove();
- this.iconSpace.remove();
- }
- },
-
- _setOption: function( key, value ) {
-
- // We don't allow the value to be set to nothing
- if ( key === "label" && !value ) {
- return;
- }
-
- this._super( key, value );
-
- if ( key === "disabled" ) {
- this._toggleClass( this.label, null, "ui-state-disabled", value );
- this.element[ 0 ].disabled = value;
-
- // Don't refresh when setting disabled
- return;
- }
- this.refresh();
- },
-
- _updateIcon: function( checked ) {
- var toAdd = "ui-icon ui-icon-background ";
-
- if ( this.options.icon ) {
- if ( !this.icon ) {
- this.icon = $( "<span>" );
- this.iconSpace = $( "<span> </span>" );
- this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" );
- }
-
- if ( this.type === "checkbox" ) {
- toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank";
- this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" );
- } else {
- toAdd += "ui-icon-blank";
- }
- this._addClass( this.icon, "ui-checkboxradio-icon", toAdd );
- if ( !checked ) {
- this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" );
- }
- this.icon.prependTo( this.label ).after( this.iconSpace );
- } else if ( this.icon !== undefined ) {
- this.icon.remove();
- this.iconSpace.remove();
- delete this.icon;
- }
- },
-
- _updateLabel: function() {
-
- // Remove the contents of the label ( minus the icon, icon space, and input )
- var contents = this.label.contents().not( this.element[ 0 ] );
- if ( this.icon ) {
- contents = contents.not( this.icon[ 0 ] );
- }
- if ( this.iconSpace ) {
- contents = contents.not( this.iconSpace[ 0 ] );
- }
- contents.remove();
-
- this.label.append( this.options.label );
- },
-
- refresh: function() {
- var checked = this.element[ 0 ].checked,
- isDisabled = this.element[ 0 ].disabled;
-
- this._updateIcon( checked );
- this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked );
- if ( this.options.label !== null ) {
- this._updateLabel();
- }
-
- if ( isDisabled !== this.options.disabled ) {
- this._setOptions( { "disabled": isDisabled } );
- }
- }
-
-} ] );
-
-var widgetsCheckboxradio = $.ui.checkboxradio;
-
-
-/*!
- * jQuery UI Button 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Button
-//>>group: Widgets
-//>>description: Enhances a form with themeable buttons.
-//>>docs: http://api.jqueryui.com/button/
-//>>demos: http://jqueryui.com/button/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/button.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.button", {
- version: "1.12.1",
- defaultElement: "<button>",
- options: {
- classes: {
- "ui-button": "ui-corner-all"
- },
- disabled: null,
- icon: null,
- iconPosition: "beginning",
- label: null,
- showLabel: true
- },
-
- _getCreateOptions: function() {
- var disabled,
-
- // This is to support cases like in jQuery Mobile where the base widget does have
- // an implementation of _getCreateOptions
- options = this._super() || {};
-
- this.isInput = this.element.is( "input" );
-
- disabled = this.element[ 0 ].disabled;
- if ( disabled != null ) {
- options.disabled = disabled;
- }
-
- this.originalLabel = this.isInput ? this.element.val() : this.element.html();
- if ( this.originalLabel ) {
- options.label = this.originalLabel;
- }
-
- return options;
- },
-
- _create: function() {
- if ( !this.option.showLabel & !this.options.icon ) {
- this.options.showLabel = true;
- }
-
- // We have to check the option again here even though we did in _getCreateOptions,
- // because null may have been passed on init which would override what was set in
- // _getCreateOptions
- if ( this.options.disabled == null ) {
- this.options.disabled = this.element[ 0 ].disabled || false;
- }
-
- this.hasTitle = !!this.element.attr( "title" );
-
- // Check to see if the label needs to be set or if its already correct
- if ( this.options.label && this.options.label !== this.originalLabel ) {
- if ( this.isInput ) {
- this.element.val( this.options.label );
- } else {
- this.element.html( this.options.label );
- }
- }
- this._addClass( "ui-button", "ui-widget" );
- this._setOption( "disabled", this.options.disabled );
- this._enhance();
-
- if ( this.element.is( "a" ) ) {
- this._on( {
- "keyup": function( event ) {
- if ( event.keyCode === $.ui.keyCode.SPACE ) {
- event.preventDefault();
-
- // Support: PhantomJS <= 1.9, IE 8 Only
- // If a native click is available use it so we actually cause navigation
- // otherwise just trigger a click event
- if ( this.element[ 0 ].click ) {
- this.element[ 0 ].click();
- } else {
- this.element.trigger( "click" );
- }
- }
- }
- } );
- }
- },
-
- _enhance: function() {
- if ( !this.element.is( "button" ) ) {
- this.element.attr( "role", "button" );
- }
-
- if ( this.options.icon ) {
- this._updateIcon( "icon", this.options.icon );
- this._updateTooltip();
- }
- },
-
- _updateTooltip: function() {
- this.title = this.element.attr( "title" );
-
- if ( !this.options.showLabel && !this.title ) {
- this.element.attr( "title", this.options.label );
- }
- },
-
- _updateIcon: function( option, value ) {
- var icon = option !== "iconPosition",
- position = icon ? this.options.iconPosition : value,
- displayBlock = position === "top" || position === "bottom";
-
- // Create icon
- if ( !this.icon ) {
- this.icon = $( "<span>" );
-
- this._addClass( this.icon, "ui-button-icon", "ui-icon" );
-
- if ( !this.options.showLabel ) {
- this._addClass( "ui-button-icon-only" );
- }
- } else if ( icon ) {
-
- // If we are updating the icon remove the old icon class
- this._removeClass( this.icon, null, this.options.icon );
- }
-
- // If we are updating the icon add the new icon class
- if ( icon ) {
- this._addClass( this.icon, null, value );
- }
-
- this._attachIcon( position );
-
- // If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove
- // the iconSpace if there is one.
- if ( displayBlock ) {
- this._addClass( this.icon, null, "ui-widget-icon-block" );
- if ( this.iconSpace ) {
- this.iconSpace.remove();
- }
- } else {
-
- // Position is beginning or end so remove the ui-widget-icon-block class and add the
- // space if it does not exist
- if ( !this.iconSpace ) {
- this.iconSpace = $( "<span> </span>" );
- this._addClass( this.iconSpace, "ui-button-icon-space" );
- }
- this._removeClass( this.icon, null, "ui-wiget-icon-block" );
- this._attachIconSpace( position );
- }
- },
-
- _destroy: function() {
- this.element.removeAttr( "role" );
-
- if ( this.icon ) {
- this.icon.remove();
- }
- if ( this.iconSpace ) {
- this.iconSpace.remove();
- }
- if ( !this.hasTitle ) {
- this.element.removeAttr( "title" );
- }
- },
-
- _attachIconSpace: function( iconPosition ) {
- this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace );
- },
-
- _attachIcon: function( iconPosition ) {
- this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon );
- },
-
- _setOptions: function( options ) {
- var newShowLabel = options.showLabel === undefined ?
- this.options.showLabel :
- options.showLabel,
- newIcon = options.icon === undefined ? this.options.icon : options.icon;
-
- if ( !newShowLabel && !newIcon ) {
- options.showLabel = true;
- }
- this._super( options );
- },
-
- _setOption: function( key, value ) {
- if ( key === "icon" ) {
- if ( value ) {
- this._updateIcon( key, value );
- } else if ( this.icon ) {
- this.icon.remove();
- if ( this.iconSpace ) {
- this.iconSpace.remove();
- }
- }
- }
-
- if ( key === "iconPosition" ) {
- this._updateIcon( key, value );
- }
-
- // Make sure we can't end up with a button that has neither text nor icon
- if ( key === "showLabel" ) {
- this._toggleClass( "ui-button-icon-only", null, !value );
- this._updateTooltip();
- }
-
- if ( key === "label" ) {
- if ( this.isInput ) {
- this.element.val( value );
- } else {
-
- // If there is an icon, append it, else nothing then append the value
- // this avoids removal of the icon when setting label text
- this.element.html( value );
- if ( this.icon ) {
- this._attachIcon( this.options.iconPosition );
- this._attachIconSpace( this.options.iconPosition );
- }
- }
- }
-
- this._super( key, value );
-
- if ( key === "disabled" ) {
- this._toggleClass( null, "ui-state-disabled", value );
- this.element[ 0 ].disabled = value;
- if ( value ) {
- this.element.blur();
- }
- }
- },
-
- refresh: function() {
-
- // Make sure to only check disabled if its an element that supports this otherwise
- // check for the disabled class to determine state
- var isDisabled = this.element.is( "input, button" ) ?
- this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" );
-
- if ( isDisabled !== this.options.disabled ) {
- this._setOptions( { disabled: isDisabled } );
- }
-
- this._updateTooltip();
- }
-} );
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
-
- // Text and Icons options
- $.widget( "ui.button", $.ui.button, {
- options: {
- text: true,
- icons: {
- primary: null,
- secondary: null
- }
- },
-
- _create: function() {
- if ( this.options.showLabel && !this.options.text ) {
- this.options.showLabel = this.options.text;
- }
- if ( !this.options.showLabel && this.options.text ) {
- this.options.text = this.options.showLabel;
- }
- if ( !this.options.icon && ( this.options.icons.primary ||
- this.options.icons.secondary ) ) {
- if ( this.options.icons.primary ) {
- this.options.icon = this.options.icons.primary;
- } else {
- this.options.icon = this.options.icons.secondary;
- this.options.iconPosition = "end";
- }
- } else if ( this.options.icon ) {
- this.options.icons.primary = this.options.icon;
- }
- this._super();
- },
-
- _setOption: function( key, value ) {
- if ( key === "text" ) {
- this._super( "showLabel", value );
- return;
- }
- if ( key === "showLabel" ) {
- this.options.text = value;
- }
- if ( key === "icon" ) {
- this.options.icons.primary = value;
- }
- if ( key === "icons" ) {
- if ( value.primary ) {
- this._super( "icon", value.primary );
- this._super( "iconPosition", "beginning" );
- } else if ( value.secondary ) {
- this._super( "icon", value.secondary );
- this._super( "iconPosition", "end" );
- }
- }
- this._superApply( arguments );
- }
- } );
-
- $.fn.button = ( function( orig ) {
- return function() {
- if ( !this.length || ( this.length && this[ 0 ].tagName !== "INPUT" ) ||
- ( this.length && this[ 0 ].tagName === "INPUT" && (
- this.attr( "type" ) !== "checkbox" && this.attr( "type" ) !== "radio"
- ) ) ) {
- return orig.apply( this, arguments );
- }
- if ( !$.ui.checkboxradio ) {
- $.error( "Checkboxradio widget missing" );
- }
- if ( arguments.length === 0 ) {
- return this.checkboxradio( {
- "icon": false
- } );
- }
- return this.checkboxradio.apply( this, arguments );
- };
- } )( $.fn.button );
-
- $.fn.buttonset = function() {
- if ( !$.ui.controlgroup ) {
- $.error( "Controlgroup widget missing" );
- }
- if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) {
- return this.controlgroup.apply( this,
- [ arguments[ 0 ], "items.button", arguments[ 2 ] ] );
- }
- if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) {
- return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] );
- }
- if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) {
- arguments[ 0 ].items = {
- button: arguments[ 0 ].items
- };
- }
- return this.controlgroup.apply( this, arguments );
- };
-}
-
-var widgetsButton = $.ui.button;
-
-
-// jscs:disable maximumLineLength
-/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
-/*!
- * jQuery UI Datepicker 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Datepicker
-//>>group: Widgets
-//>>description: Displays a calendar from an input or inline for selecting dates.
-//>>docs: http://api.jqueryui.com/datepicker/
-//>>demos: http://jqueryui.com/datepicker/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/datepicker.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.extend( $.ui, { datepicker: { version: "1.12.1" } } );
-
-var datepicker_instActive;
-
-function datepicker_getZindex( elem ) {
- var position, value;
- while ( elem.length && elem[ 0 ] !== document ) {
-
- // Ignore z-index if position is set to a value where z-index is ignored by the browser
- // This makes behavior of this function consistent across browsers
- // WebKit always returns auto if the element is positioned
- position = elem.css( "position" );
- if ( position === "absolute" || position === "relative" || position === "fixed" ) {
-
- // IE returns 0 when zIndex is not specified
- // other browsers return a string
- // we ignore the case of nested elements with an explicit value of 0
- // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
- value = parseInt( elem.css( "zIndex" ), 10 );
- if ( !isNaN( value ) && value !== 0 ) {
- return value;
- }
- }
- elem = elem.parent();
- }
-
- return 0;
-}
-/* Date picker manager.
- Use the singleton instance of this class, $.datepicker, to interact with the date picker.
- Settings for (groups of) date pickers are maintained in an instance object,
- allowing multiple different settings on the same page. */
-
-function Datepicker() {
- this._curInst = null; // The current instance in use
- this._keyEvent = false; // If the last event was a key event
- this._disabledInputs = []; // List of date picker inputs that have been disabled
- this._datepickerShowing = false; // True if the popup picker is showing , false if not
- this._inDialog = false; // True if showing within a "dialog", false if not
- this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division
- this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class
- this._appendClass = "ui-datepicker-append"; // The name of the append marker class
- this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class
- this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class
- this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class
- this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class
- this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class
- this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class
- this.regional = []; // Available regional settings, indexed by language code
- this.regional[ "" ] = { // Default regional settings
- closeText: "Done", // Display text for close link
- prevText: "Prev", // Display text for previous month link
- nextText: "Next", // Display text for next month link
- currentText: "Today", // Display text for current month link
- monthNames: [ "January","February","March","April","May","June",
- "July","August","September","October","November","December" ], // Names of months for drop-down and formatting
- monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting
- dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting
- dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting
- dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ], // Column headings for days starting at Sunday
- weekHeader: "Wk", // Column header for week of the year
- dateFormat: "mm/dd/yy", // See format options on parseDate
- firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
- isRTL: false, // True if right-to-left language, false if left-to-right
- showMonthAfterYear: false, // True if the year select precedes month, false for month then year
- yearSuffix: "" // Additional text to append to the year in the month headers
- };
- this._defaults = { // Global defaults for all the date picker instances
- showOn: "focus", // "focus" for popup on focus,
- // "button" for trigger button, or "both" for either
- showAnim: "fadeIn", // Name of jQuery animation for popup
- showOptions: {}, // Options for enhanced animations
- defaultDate: null, // Used when field is blank: actual date,
- // +/-number for offset from today, null for today
- appendText: "", // Display text following the input box, e.g. showing the format
- buttonText: "...", // Text for trigger button
- buttonImage: "", // URL for trigger button image
- buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
- hideIfNoPrevNext: false, // True to hide next/previous month links
- // if not applicable, false to just disable them
- navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
- gotoCurrent: false, // True if today link goes back to current selection instead
- changeMonth: false, // True if month can be selected directly, false if only prev/next
- changeYear: false, // True if year can be selected directly, false if only prev/next
- yearRange: "c-10:c+10", // Range of years to display in drop-down,
- // either relative to today's year (-nn:+nn), relative to currently displayed year
- // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
- showOtherMonths: false, // True to show dates in other months, false to leave blank
- selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
- showWeek: false, // True to show week of the year, false to not show it
- calculateWeek: this.iso8601Week, // How to calculate the week of the year,
- // takes a Date and returns the number of the week for it
- shortYearCutoff: "+10", // Short year values < this are in the current century,
- // > this are in the previous century,
- // string value starting with "+" for current year + value
- minDate: null, // The earliest selectable date, or null for no limit
- maxDate: null, // The latest selectable date, or null for no limit
- duration: "fast", // Duration of display/closure
- beforeShowDay: null, // Function that takes a date and returns an array with
- // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
- // [2] = cell title (optional), e.g. $.datepicker.noWeekends
- beforeShow: null, // Function that takes an input field and
- // returns a set of custom settings for the date picker
- onSelect: null, // Define a callback function when a date is selected
- onChangeMonthYear: null, // Define a callback function when the month or year is changed
- onClose: null, // Define a callback function when the datepicker is closed
- numberOfMonths: 1, // Number of months to show at a time
- showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
- stepMonths: 1, // Number of months to step back/forward
- stepBigMonths: 12, // Number of months to step back/forward for the big links
- altField: "", // Selector for an alternate field to store selected dates into
- altFormat: "", // The date format to use for the alternate field
- constrainInput: true, // The input is constrained by the current date format
- showButtonPanel: false, // True to show button panel, false to not show it
- autoSize: false, // True to size the input for the date format, false to leave as is
- disabled: false // The initial disabled state
- };
- $.extend( this._defaults, this.regional[ "" ] );
- this.regional.en = $.extend( true, {}, this.regional[ "" ] );
- this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en );
- this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) );
-}
-
-$.extend( Datepicker.prototype, {
- /* Class name added to elements to indicate already configured with a date picker. */
- markerClassName: "hasDatepicker",
-
- //Keep track of the maximum number of rows displayed (see #7043)
- maxRows: 4,
-
- // TODO rename to "widget" when switching to widget factory
- _widgetDatepicker: function() {
- return this.dpDiv;
- },
-
- /* Override the default settings for all instances of the date picker.
- * @param settings object - the new settings to use as defaults (anonymous object)
- * @return the manager object
- */
- setDefaults: function( settings ) {
- datepicker_extendRemove( this._defaults, settings || {} );
- return this;
- },
-
- /* Attach the date picker to a jQuery selection.
- * @param target element - the target input field or division or span
- * @param settings object - the new settings to use for this date picker instance (anonymous)
- */
- _attachDatepicker: function( target, settings ) {
- var nodeName, inline, inst;
- nodeName = target.nodeName.toLowerCase();
- inline = ( nodeName === "div" || nodeName === "span" );
- if ( !target.id ) {
- this.uuid += 1;
- target.id = "dp" + this.uuid;
- }
- inst = this._newInst( $( target ), inline );
- inst.settings = $.extend( {}, settings || {} );
- if ( nodeName === "input" ) {
- this._connectDatepicker( target, inst );
- } else if ( inline ) {
- this._inlineDatepicker( target, inst );
- }
- },
-
- /* Create a new instance object. */
- _newInst: function( target, inline ) {
- var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars
- return { id: id, input: target, // associated target
- selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
- drawMonth: 0, drawYear: 0, // month being drawn
- inline: inline, // is datepicker inline or not
- dpDiv: ( !inline ? this.dpDiv : // presentation div
- datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
- },
-
- /* Attach the date picker to an input field. */
- _connectDatepicker: function( target, inst ) {
- var input = $( target );
- inst.append = $( [] );
- inst.trigger = $( [] );
- if ( input.hasClass( this.markerClassName ) ) {
- return;
- }
- this._attachments( input, inst );
- input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
- on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
- this._autoSize( inst );
- $.data( target, "datepicker", inst );
-
- //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
- if ( inst.settings.disabled ) {
- this._disableDatepicker( target );
- }
- },
-
- /* Make attachments based on settings. */
- _attachments: function( input, inst ) {
- var showOn, buttonText, buttonImage,
- appendText = this._get( inst, "appendText" ),
- isRTL = this._get( inst, "isRTL" );
-
- if ( inst.append ) {
- inst.append.remove();
- }
- if ( appendText ) {
- inst.append = $( "<span class='" + this._appendClass + "'>" + appendText + "</span>" );
- input[ isRTL ? "before" : "after" ]( inst.append );
- }
-
- input.off( "focus", this._showDatepicker );
-
- if ( inst.trigger ) {
- inst.trigger.remove();
- }
-
- showOn = this._get( inst, "showOn" );
- if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field
- input.on( "focus", this._showDatepicker );
- }
- if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked
- buttonText = this._get( inst, "buttonText" );
- buttonImage = this._get( inst, "buttonImage" );
- inst.trigger = $( this._get( inst, "buttonImageOnly" ) ?
- $( "<img/>" ).addClass( this._triggerClass ).
- attr( { src: buttonImage, alt: buttonText, title: buttonText } ) :
- $( "<button type='button'></button>" ).addClass( this._triggerClass ).
- html( !buttonImage ? buttonText : $( "<img/>" ).attr(
- { src:buttonImage, alt:buttonText, title:buttonText } ) ) );
- input[ isRTL ? "before" : "after" ]( inst.trigger );
- inst.trigger.on( "click", function() {
- if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {
- $.datepicker._hideDatepicker();
- } else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {
- $.datepicker._hideDatepicker();
- $.datepicker._showDatepicker( input[ 0 ] );
- } else {
- $.datepicker._showDatepicker( input[ 0 ] );
- }
- return false;
- } );
- }
- },
-
- /* Apply the maximum length for the date format. */
- _autoSize: function( inst ) {
- if ( this._get( inst, "autoSize" ) && !inst.inline ) {
- var findMax, max, maxI, i,
- date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits
- dateFormat = this._get( inst, "dateFormat" );
-
- if ( dateFormat.match( /[DM]/ ) ) {
- findMax = function( names ) {
- max = 0;
- maxI = 0;
- for ( i = 0; i < names.length; i++ ) {
- if ( names[ i ].length > max ) {
- max = names[ i ].length;
- maxI = i;
- }
- }
- return maxI;
- };
- date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?
- "monthNames" : "monthNamesShort" ) ) ) );
- date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?
- "dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() );
- }
- inst.input.attr( "size", this._formatDate( inst, date ).length );
- }
- },
-
- /* Attach an inline date picker to a div. */
- _inlineDatepicker: function( target, inst ) {
- var divSpan = $( target );
- if ( divSpan.hasClass( this.markerClassName ) ) {
- return;
- }
- divSpan.addClass( this.markerClassName ).append( inst.dpDiv );
- $.data( target, "datepicker", inst );
- this._setDate( inst, this._getDefaultDate( inst ), true );
- this._updateDatepicker( inst );
- this._updateAlternate( inst );
-
- //If disabled option is true, disable the datepicker before showing it (see ticket #5665)
- if ( inst.settings.disabled ) {
- this._disableDatepicker( target );
- }
-
- // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
- // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
- inst.dpDiv.css( "display", "block" );
- },
-
- /* Pop-up the date picker in a "dialog" box.
- * @param input element - ignored
- * @param date string or Date - the initial date to display
- * @param onSelect function - the function to call when a date is selected
- * @param settings object - update the dialog date picker instance's settings (anonymous object)
- * @param pos int[2] - coordinates for the dialog's position within the screen or
- * event - with x/y coordinates or
- * leave empty for default (screen centre)
- * @return the manager object
- */
- _dialogDatepicker: function( input, date, onSelect, settings, pos ) {
- var id, browserWidth, browserHeight, scrollX, scrollY,
- inst = this._dialogInst; // internal instance
-
- if ( !inst ) {
- this.uuid += 1;
- id = "dp" + this.uuid;
- this._dialogInput = $( "<input type='text' id='" + id +
- "' style='position: absolute; top: -100px; width: 0px;'/>" );
- this._dialogInput.on( "keydown", this._doKeyDown );
- $( "body" ).append( this._dialogInput );
- inst = this._dialogInst = this._newInst( this._dialogInput, false );
- inst.settings = {};
- $.data( this._dialogInput[ 0 ], "datepicker", inst );
- }
- datepicker_extendRemove( inst.settings, settings || {} );
- date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );
- this._dialogInput.val( date );
-
- this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );
- if ( !this._pos ) {
- browserWidth = document.documentElement.clientWidth;
- browserHeight = document.documentElement.clientHeight;
- scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
- scrollY = document.documentElement.scrollTop || document.body.scrollTop;
- this._pos = // should use actual width/height below
- [ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];
- }
-
- // Move input on screen for focus, but hidden behind dialog
- this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" );
- inst.settings.onSelect = onSelect;
- this._inDialog = true;
- this.dpDiv.addClass( this._dialogClass );
- this._showDatepicker( this._dialogInput[ 0 ] );
- if ( $.blockUI ) {
- $.blockUI( this.dpDiv );
- }
- $.data( this._dialogInput[ 0 ], "datepicker", inst );
- return this;
- },
-
- /* Detach a datepicker from its control.
- * @param target element - the target input field or division or span
- */
- _destroyDatepicker: function( target ) {
- var nodeName,
- $target = $( target ),
- inst = $.data( target, "datepicker" );
-
- if ( !$target.hasClass( this.markerClassName ) ) {
- return;
- }
-
- nodeName = target.nodeName.toLowerCase();
- $.removeData( target, "datepicker" );
- if ( nodeName === "input" ) {
- inst.append.remove();
- inst.trigger.remove();
- $target.removeClass( this.markerClassName ).
- off( "focus", this._showDatepicker ).
- off( "keydown", this._doKeyDown ).
- off( "keypress", this._doKeyPress ).
- off( "keyup", this._doKeyUp );
- } else if ( nodeName === "div" || nodeName === "span" ) {
- $target.removeClass( this.markerClassName ).empty();
- }
-
- if ( datepicker_instActive === inst ) {
- datepicker_instActive = null;
- }
- },
-
- /* Enable the date picker to a jQuery selection.
- * @param target element - the target input field or division or span
- */
- _enableDatepicker: function( target ) {
- var nodeName, inline,
- $target = $( target ),
- inst = $.data( target, "datepicker" );
-
- if ( !$target.hasClass( this.markerClassName ) ) {
- return;
- }
-
- nodeName = target.nodeName.toLowerCase();
- if ( nodeName === "input" ) {
- target.disabled = false;
- inst.trigger.filter( "button" ).
- each( function() { this.disabled = false; } ).end().
- filter( "img" ).css( { opacity: "1.0", cursor: "" } );
- } else if ( nodeName === "div" || nodeName === "span" ) {
- inline = $target.children( "." + this._inlineClass );
- inline.children().removeClass( "ui-state-disabled" );
- inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
- prop( "disabled", false );
- }
- this._disabledInputs = $.map( this._disabledInputs,
- function( value ) { return ( value === target ? null : value ); } ); // delete entry
- },
-
- /* Disable the date picker to a jQuery selection.
- * @param target element - the target input field or division or span
- */
- _disableDatepicker: function( target ) {
- var nodeName, inline,
- $target = $( target ),
- inst = $.data( target, "datepicker" );
-
- if ( !$target.hasClass( this.markerClassName ) ) {
- return;
- }
-
- nodeName = target.nodeName.toLowerCase();
- if ( nodeName === "input" ) {
- target.disabled = true;
- inst.trigger.filter( "button" ).
- each( function() { this.disabled = true; } ).end().
- filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
- } else if ( nodeName === "div" || nodeName === "span" ) {
- inline = $target.children( "." + this._inlineClass );
- inline.children().addClass( "ui-state-disabled" );
- inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
- prop( "disabled", true );
- }
- this._disabledInputs = $.map( this._disabledInputs,
- function( value ) { return ( value === target ? null : value ); } ); // delete entry
- this._disabledInputs[ this._disabledInputs.length ] = target;
- },
-
- /* Is the first field in a jQuery collection disabled as a datepicker?
- * @param target element - the target input field or division or span
- * @return boolean - true if disabled, false if enabled
- */
- _isDisabledDatepicker: function( target ) {
- if ( !target ) {
- return false;
- }
- for ( var i = 0; i < this._disabledInputs.length; i++ ) {
- if ( this._disabledInputs[ i ] === target ) {
- return true;
- }
- }
- return false;
- },
-
- /* Retrieve the instance data for the target control.
- * @param target element - the target input field or division or span
- * @return object - the associated instance data
- * @throws error if a jQuery problem getting data
- */
- _getInst: function( target ) {
- try {
- return $.data( target, "datepicker" );
- }
- catch ( err ) {
- throw "Missing instance data for this datepicker";
- }
- },
-
- /* Update or retrieve the settings for a date picker attached to an input field or division.
- * @param target element - the target input field or division or span
- * @param name object - the new settings to update or
- * string - the name of the setting to change or retrieve,
- * when retrieving also "all" for all instance settings or
- * "defaults" for all global defaults
- * @param value any - the new value for the setting
- * (omit if above is an object or to retrieve a value)
- */
- _optionDatepicker: function( target, name, value ) {
- var settings, date, minDate, maxDate,
- inst = this._getInst( target );
-
- if ( arguments.length === 2 && typeof name === "string" ) {
- return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
- ( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
- this._get( inst, name ) ) : null ) );
- }
-
- settings = name || {};
- if ( typeof name === "string" ) {
- settings = {};
- settings[ name ] = value;
- }
-
- if ( inst ) {
- if ( this._curInst === inst ) {
- this._hideDatepicker();
- }
-
- date = this._getDateDatepicker( target, true );
- minDate = this._getMinMaxDate( inst, "min" );
- maxDate = this._getMinMaxDate( inst, "max" );
- datepicker_extendRemove( inst.settings, settings );
-
- // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
- if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {
- inst.settings.minDate = this._formatDate( inst, minDate );
- }
- if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {
- inst.settings.maxDate = this._formatDate( inst, maxDate );
- }
- if ( "disabled" in settings ) {
- if ( settings.disabled ) {
- this._disableDatepicker( target );
- } else {
- this._enableDatepicker( target );
- }
- }
- this._attachments( $( target ), inst );
- this._autoSize( inst );
- this._setDate( inst, date );
- this._updateAlternate( inst );
- this._updateDatepicker( inst );
- }
- },
-
- // Change method deprecated
- _changeDatepicker: function( target, name, value ) {
- this._optionDatepicker( target, name, value );
- },
-
- /* Redraw the date picker attached to an input field or division.
- * @param target element - the target input field or division or span
- */
- _refreshDatepicker: function( target ) {
- var inst = this._getInst( target );
- if ( inst ) {
- this._updateDatepicker( inst );
- }
- },
-
- /* Set the dates for a jQuery selection.
- * @param target element - the target input field or division or span
- * @param date Date - the new date
- */
- _setDateDatepicker: function( target, date ) {
- var inst = this._getInst( target );
- if ( inst ) {
- this._setDate( inst, date );
- this._updateDatepicker( inst );
- this._updateAlternate( inst );
- }
- },
-
- /* Get the date(s) for the first entry in a jQuery selection.
- * @param target element - the target input field or division or span
- * @param noDefault boolean - true if no default date is to be used
- * @return Date - the current date
- */
- _getDateDatepicker: function( target, noDefault ) {
- var inst = this._getInst( target );
- if ( inst && !inst.inline ) {
- this._setDateFromField( inst, noDefault );
- }
- return ( inst ? this._getDate( inst ) : null );
- },
-
- /* Handle keystrokes. */
- _doKeyDown: function( event ) {
- var onSelect, dateStr, sel,
- inst = $.datepicker._getInst( event.target ),
- handled = true,
- isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" );
-
- inst._keyEvent = true;
- if ( $.datepicker._datepickerShowing ) {
- switch ( event.keyCode ) {
- case 9: $.datepicker._hideDatepicker();
- handled = false;
- break; // hide on tab out
- case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
- $.datepicker._currentClass + ")", inst.dpDiv );
- if ( sel[ 0 ] ) {
- $.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
- }
-
- onSelect = $.datepicker._get( inst, "onSelect" );
- if ( onSelect ) {
- dateStr = $.datepicker._formatDate( inst );
-
- // Trigger custom callback
- onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
- } else {
- $.datepicker._hideDatepicker();
- }
-
- return false; // don't submit the form
- case 27: $.datepicker._hideDatepicker();
- break; // hide on escape
- case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
- -$.datepicker._get( inst, "stepBigMonths" ) :
- -$.datepicker._get( inst, "stepMonths" ) ), "M" );
- break; // previous month/year on page up/+ ctrl
- case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
- +$.datepicker._get( inst, "stepBigMonths" ) :
- +$.datepicker._get( inst, "stepMonths" ) ), "M" );
- break; // next month/year on page down/+ ctrl
- case 35: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._clearDate( event.target );
- }
- handled = event.ctrlKey || event.metaKey;
- break; // clear on ctrl or command +end
- case 36: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._gotoToday( event.target );
- }
- handled = event.ctrlKey || event.metaKey;
- break; // current on ctrl or command +home
- case 37: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
- }
- handled = event.ctrlKey || event.metaKey;
-
- // -1 day on ctrl or command +left
- if ( event.originalEvent.altKey ) {
- $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
- -$.datepicker._get( inst, "stepBigMonths" ) :
- -$.datepicker._get( inst, "stepMonths" ) ), "M" );
- }
-
- // next month/year on alt +left on Mac
- break;
- case 38: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._adjustDate( event.target, -7, "D" );
- }
- handled = event.ctrlKey || event.metaKey;
- break; // -1 week on ctrl or command +up
- case 39: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
- }
- handled = event.ctrlKey || event.metaKey;
-
- // +1 day on ctrl or command +right
- if ( event.originalEvent.altKey ) {
- $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
- +$.datepicker._get( inst, "stepBigMonths" ) :
- +$.datepicker._get( inst, "stepMonths" ) ), "M" );
- }
-
- // next month/year on alt +right
- break;
- case 40: if ( event.ctrlKey || event.metaKey ) {
- $.datepicker._adjustDate( event.target, +7, "D" );
- }
- handled = event.ctrlKey || event.metaKey;
- break; // +1 week on ctrl or command +down
- default: handled = false;
- }
- } else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
- $.datepicker._showDatepicker( this );
- } else {
- handled = false;
- }
-
- if ( handled ) {
- event.preventDefault();
- event.stopPropagation();
- }
- },
-
- /* Filter entered characters - based on date format. */
- _doKeyPress: function( event ) {
- var chars, chr,
- inst = $.datepicker._getInst( event.target );
-
- if ( $.datepicker._get( inst, "constrainInput" ) ) {
- chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) );
- chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );
- return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 );
- }
- },
-
- /* Synchronise manual entry and field/alternate field. */
- _doKeyUp: function( event ) {
- var date,
- inst = $.datepicker._getInst( event.target );
-
- if ( inst.input.val() !== inst.lastVal ) {
- try {
- date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
- ( inst.input ? inst.input.val() : null ),
- $.datepicker._getFormatConfig( inst ) );
-
- if ( date ) { // only if valid
- $.datepicker._setDateFromField( inst );
- $.datepicker._updateAlternate( inst );
- $.datepicker._updateDatepicker( inst );
- }
- }
- catch ( err ) {
- }
- }
- return true;
- },
-
- /* Pop-up the date picker for a given input field.
- * If false returned from beforeShow event handler do not show.
- * @param input element - the input field attached to the date picker or
- * event - if triggered by focus
- */
- _showDatepicker: function( input ) {
- input = input.target || input;
- if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger
- input = $( "input", input.parentNode )[ 0 ];
- }
-
- if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here
- return;
- }
-
- var inst, beforeShow, beforeShowSettings, isFixed,
- offset, showAnim, duration;
-
- inst = $.datepicker._getInst( input );
- if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {
- $.datepicker._curInst.dpDiv.stop( true, true );
- if ( inst && $.datepicker._datepickerShowing ) {
- $.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );
- }
- }
-
- beforeShow = $.datepicker._get( inst, "beforeShow" );
- beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};
- if ( beforeShowSettings === false ) {
- return;
- }
- datepicker_extendRemove( inst.settings, beforeShowSettings );
-
- inst.lastVal = null;
- $.datepicker._lastInput = input;
- $.datepicker._setDateFromField( inst );
-
- if ( $.datepicker._inDialog ) { // hide cursor
- input.value = "";
- }
- if ( !$.datepicker._pos ) { // position below input
- $.datepicker._pos = $.datepicker._findPos( input );
- $.datepicker._pos[ 1 ] += input.offsetHeight; // add the height
- }
-
- isFixed = false;
- $( input ).parents().each( function() {
- isFixed |= $( this ).css( "position" ) === "fixed";
- return !isFixed;
- } );
-
- offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };
- $.datepicker._pos = null;
-
- //to avoid flashes on Firefox
- inst.dpDiv.empty();
-
- // determine sizing offscreen
- inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } );
- $.datepicker._updateDatepicker( inst );
-
- // fix width for dynamic number of date pickers
- // and adjust position before showing
- offset = $.datepicker._checkOffset( inst, offset, isFixed );
- inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
- "static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
- left: offset.left + "px", top: offset.top + "px" } );
-
- if ( !inst.inline ) {
- showAnim = $.datepicker._get( inst, "showAnim" );
- duration = $.datepicker._get( inst, "duration" );
- inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 );
- $.datepicker._datepickerShowing = true;
-
- if ( $.effects && $.effects.effect[ showAnim ] ) {
- inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration );
- } else {
- inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null );
- }
-
- if ( $.datepicker._shouldFocusInput( inst ) ) {
- inst.input.trigger( "focus" );
- }
-
- $.datepicker._curInst = inst;
- }
- },
-
- /* Generate the date picker content. */
- _updateDatepicker: function( inst ) {
- this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
- datepicker_instActive = inst; // for delegate hover events
- inst.dpDiv.empty().append( this._generateHTML( inst ) );
- this._attachHandlers( inst );
-
- var origyearshtml,
- numMonths = this._getNumberOfMonths( inst ),
- cols = numMonths[ 1 ],
- width = 17,
- activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
-
- if ( activeCell.length > 0 ) {
- datepicker_handleMouseover.apply( activeCell.get( 0 ) );
- }
-
- inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" );
- if ( cols > 1 ) {
- inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
- }
- inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
- "Class" ]( "ui-datepicker-multi" );
- inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
- "Class" ]( "ui-datepicker-rtl" );
-
- if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
- inst.input.trigger( "focus" );
- }
-
- // Deffered render of the years select (to avoid flashes on Firefox)
- if ( inst.yearshtml ) {
- origyearshtml = inst.yearshtml;
- setTimeout( function() {
-
- //assure that inst.yearshtml didn't change.
- if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
- inst.dpDiv.find( "select.ui-datepicker-year:first" ).replaceWith( inst.yearshtml );
- }
- origyearshtml = inst.yearshtml = null;
- }, 0 );
- }
- },
-
- // #6694 - don't focus the input if it's already focused
- // this breaks the change event in IE
- // Support: IE and jQuery <1.9
- _shouldFocusInput: function( inst ) {
- return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" );
- },
-
- /* Check positioning to remain on screen. */
- _checkOffset: function( inst, offset, isFixed ) {
- var dpWidth = inst.dpDiv.outerWidth(),
- dpHeight = inst.dpDiv.outerHeight(),
- inputWidth = inst.input ? inst.input.outerWidth() : 0,
- inputHeight = inst.input ? inst.input.outerHeight() : 0,
- viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),
- viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );
-
- offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 );
- offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;
- offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;
-
- // Now check if datepicker is showing outside window viewport - move to a better place if so.
- offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?
- Math.abs( offset.left + dpWidth - viewWidth ) : 0 );
- offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?
- Math.abs( dpHeight + inputHeight ) : 0 );
-
- return offset;
- },
-
- /* Find an object's position on the screen. */
- _findPos: function( obj ) {
- var position,
- inst = this._getInst( obj ),
- isRTL = this._get( inst, "isRTL" );
-
- while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden( obj ) ) ) {
- obj = obj[ isRTL ? "previousSibling" : "nextSibling" ];
- }
-
- position = $( obj ).offset();
- return [ position.left, position.top ];
- },
-
- /* Hide the date picker from view.
- * @param input element - the input field attached to the date picker
- */
- _hideDatepicker: function( input ) {
- var showAnim, duration, postProcess, onClose,
- inst = this._curInst;
-
- if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) {
- return;
- }
-
- if ( this._datepickerShowing ) {
- showAnim = this._get( inst, "showAnim" );
- duration = this._get( inst, "duration" );
- postProcess = function() {
- $.datepicker._tidyDialog( inst );
- };
-
- // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
- if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {
- inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess );
- } else {
- inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" :
- ( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess );
- }
-
- if ( !showAnim ) {
- postProcess();
- }
- this._datepickerShowing = false;
-
- onClose = this._get( inst, "onClose" );
- if ( onClose ) {
- onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] );
- }
-
- this._lastInput = null;
- if ( this._inDialog ) {
- this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } );
- if ( $.blockUI ) {
- $.unblockUI();
- $( "body" ).append( this.dpDiv );
- }
- }
- this._inDialog = false;
- }
- },
-
- /* Tidy up after a dialog display. */
- _tidyDialog: function( inst ) {
- inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" );
- },
-
- /* Close date picker if clicked elsewhere. */
- _checkExternalClick: function( event ) {
- if ( !$.datepicker._curInst ) {
- return;
- }
-
- var $target = $( event.target ),
- inst = $.datepicker._getInst( $target[ 0 ] );
-
- if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&
- $target.parents( "#" + $.datepicker._mainDivId ).length === 0 &&
- !$target.hasClass( $.datepicker.markerClassName ) &&
- !$target.closest( "." + $.datepicker._triggerClass ).length &&
- $.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
- ( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
- $.datepicker._hideDatepicker();
- }
- },
-
- /* Adjust one of the date sub-fields. */
- _adjustDate: function( id, offset, period ) {
- var target = $( id ),
- inst = this._getInst( target[ 0 ] );
-
- if ( this._isDisabledDatepicker( target[ 0 ] ) ) {
- return;
- }
- this._adjustInstDate( inst, offset +
- ( period === "M" ? this._get( inst, "showCurrentAtPos" ) : 0 ), // undo positioning
- period );
- this._updateDatepicker( inst );
- },
-
- /* Action for current link. */
- _gotoToday: function( id ) {
- var date,
- target = $( id ),
- inst = this._getInst( target[ 0 ] );
-
- if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) {
- inst.selectedDay = inst.currentDay;
- inst.drawMonth = inst.selectedMonth = inst.currentMonth;
- inst.drawYear = inst.selectedYear = inst.currentYear;
- } else {
- date = new Date();
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- }
- this._notifyChange( inst );
- this._adjustDate( target );
- },
-
- /* Action for selecting a new month/year. */
- _selectMonthYear: function( id, select, period ) {
- var target = $( id ),
- inst = this._getInst( target[ 0 ] );
-
- inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
- inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
- parseInt( select.options[ select.selectedIndex ].value, 10 );
-
- this._notifyChange( inst );
- this._adjustDate( target );
- },
-
- /* Action for selecting a day. */
- _selectDay: function( id, month, year, td ) {
- var inst,
- target = $( id );
-
- if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {
- return;
- }
-
- inst = this._getInst( target[ 0 ] );
- inst.selectedDay = inst.currentDay = $( "a", td ).html();
- inst.selectedMonth = inst.currentMonth = month;
- inst.selectedYear = inst.currentYear = year;
- this._selectDate( id, this._formatDate( inst,
- inst.currentDay, inst.currentMonth, inst.currentYear ) );
- },
-
- /* Erase the input field and hide the date picker. */
- _clearDate: function( id ) {
- var target = $( id );
- this._selectDate( target, "" );
- },
-
- /* Update the input field with the selected date. */
- _selectDate: function( id, dateStr ) {
- var onSelect,
- target = $( id ),
- inst = this._getInst( target[ 0 ] );
-
- dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );
- if ( inst.input ) {
- inst.input.val( dateStr );
- }
- this._updateAlternate( inst );
-
- onSelect = this._get( inst, "onSelect" );
- if ( onSelect ) {
- onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] ); // trigger custom callback
- } else if ( inst.input ) {
- inst.input.trigger( "change" ); // fire the change event
- }
-
- if ( inst.inline ) {
- this._updateDatepicker( inst );
- } else {
- this._hideDatepicker();
- this._lastInput = inst.input[ 0 ];
- if ( typeof( inst.input[ 0 ] ) !== "object" ) {
- inst.input.trigger( "focus" ); // restore focus
- }
- this._lastInput = null;
- }
- },
-
- /* Update any alternate field to synchronise with the main field. */
- _updateAlternate: function( inst ) {
- var altFormat, date, dateStr,
- altField = this._get( inst, "altField" );
-
- if ( altField ) { // update alternate field too
- altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" );
- date = this._getDate( inst );
- dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );
- $( altField ).val( dateStr );
- }
- },
-
- /* Set as beforeShowDay function to prevent selection of weekends.
- * @param date Date - the date to customise
- * @return [boolean, string] - is this date selectable?, what is its CSS class?
- */
- noWeekends: function( date ) {
- var day = date.getDay();
- return [ ( day > 0 && day < 6 ), "" ];
- },
-
- /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
- * @param date Date - the date to get the week for
- * @return number - the number of the week within the year that contains this date
- */
- iso8601Week: function( date ) {
- var time,
- checkDate = new Date( date.getTime() );
-
- // Find Thursday of this week starting on Monday
- checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );
-
- time = checkDate.getTime();
- checkDate.setMonth( 0 ); // Compare with Jan 1
- checkDate.setDate( 1 );
- return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;
- },
-
- /* Parse a string value into a date object.
- * See formatDate below for the possible formats.
- *
- * @param format string - the expected format of the date
- * @param value string - the date in the above format
- * @param settings Object - attributes include:
- * shortYearCutoff number - the cutoff year for determining the century (optional)
- * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
- * dayNames string[7] - names of the days from Sunday (optional)
- * monthNamesShort string[12] - abbreviated names of the months (optional)
- * monthNames string[12] - names of the months (optional)
- * @return Date - the extracted date value or null if value is blank
- */
- parseDate: function( format, value, settings ) {
- if ( format == null || value == null ) {
- throw "Invalid arguments";
- }
-
- value = ( typeof value === "object" ? value.toString() : value + "" );
- if ( value === "" ) {
- return null;
- }
-
- var iFormat, dim, extra,
- iValue = 0,
- shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,
- shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp :
- new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),
- dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
- dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
- monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
- monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
- year = -1,
- month = -1,
- day = -1,
- doy = -1,
- literal = false,
- date,
-
- // Check whether a format character is doubled
- lookAhead = function( match ) {
- var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
- if ( matches ) {
- iFormat++;
- }
- return matches;
- },
-
- // Extract a number from the string value
- getNumber = function( match ) {
- var isDoubled = lookAhead( match ),
- size = ( match === "@" ? 14 : ( match === "!" ? 20 :
- ( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
- minSize = ( match === "y" ? size : 1 ),
- digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
- num = value.substring( iValue ).match( digits );
- if ( !num ) {
- throw "Missing number at position " + iValue;
- }
- iValue += num[ 0 ].length;
- return parseInt( num[ 0 ], 10 );
- },
-
- // Extract a name from the string value and convert to an index
- getName = function( match, shortNames, longNames ) {
- var index = -1,
- names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {
- return [ [ k, v ] ];
- } ).sort( function( a, b ) {
- return -( a[ 1 ].length - b[ 1 ].length );
- } );
-
- $.each( names, function( i, pair ) {
- var name = pair[ 1 ];
- if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {
- index = pair[ 0 ];
- iValue += name.length;
- return false;
- }
- } );
- if ( index !== -1 ) {
- return index + 1;
- } else {
- throw "Unknown name at position " + iValue;
- }
- },
-
- // Confirm that a literal character matches the string value
- checkLiteral = function() {
- if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {
- throw "Unexpected literal at position " + iValue;
- }
- iValue++;
- };
-
- for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
- if ( literal ) {
- if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
- literal = false;
- } else {
- checkLiteral();
- }
- } else {
- switch ( format.charAt( iFormat ) ) {
- case "d":
- day = getNumber( "d" );
- break;
- case "D":
- getName( "D", dayNamesShort, dayNames );
- break;
- case "o":
- doy = getNumber( "o" );
- break;
- case "m":
- month = getNumber( "m" );
- break;
- case "M":
- month = getName( "M", monthNamesShort, monthNames );
- break;
- case "y":
- year = getNumber( "y" );
- break;
- case "@":
- date = new Date( getNumber( "@" ) );
- year = date.getFullYear();
- month = date.getMonth() + 1;
- day = date.getDate();
- break;
- case "!":
- date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
- year = date.getFullYear();
- month = date.getMonth() + 1;
- day = date.getDate();
- break;
- case "'":
- if ( lookAhead( "'" ) ) {
- checkLiteral();
- } else {
- literal = true;
- }
- break;
- default:
- checkLiteral();
- }
- }
- }
-
- if ( iValue < value.length ) {
- extra = value.substr( iValue );
- if ( !/^\s+/.test( extra ) ) {
- throw "Extra/unparsed characters found in date: " + extra;
- }
- }
-
- if ( year === -1 ) {
- year = new Date().getFullYear();
- } else if ( year < 100 ) {
- year += new Date().getFullYear() - new Date().getFullYear() % 100 +
- ( year <= shortYearCutoff ? 0 : -100 );
- }
-
- if ( doy > -1 ) {
- month = 1;
- day = doy;
- do {
- dim = this._getDaysInMonth( year, month - 1 );
- if ( day <= dim ) {
- break;
- }
- month++;
- day -= dim;
- } while ( true );
- }
-
- date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
- if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
- throw "Invalid date"; // E.g. 31/02/00
- }
- return date;
- },
-
- /* Standard date formats. */
- ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601)
- COOKIE: "D, dd M yy",
- ISO_8601: "yy-mm-dd",
- RFC_822: "D, d M y",
- RFC_850: "DD, dd-M-y",
- RFC_1036: "D, d M y",
- RFC_1123: "D, d M yy",
- RFC_2822: "D, d M yy",
- RSS: "D, d M y", // RFC 822
- TICKS: "!",
- TIMESTAMP: "@",
- W3C: "yy-mm-dd", // ISO 8601
-
- _ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +
- Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),
-
- /* Format a date object into a string value.
- * The format can be combinations of the following:
- * d - day of month (no leading zero)
- * dd - day of month (two digit)
- * o - day of year (no leading zeros)
- * oo - day of year (three digit)
- * D - day name short
- * DD - day name long
- * m - month of year (no leading zero)
- * mm - month of year (two digit)
- * M - month name short
- * MM - month name long
- * y - year (two digit)
- * yy - year (four digit)
- * @ - Unix timestamp (ms since 01/01/1970)
- * ! - Windows ticks (100ns since 01/01/0001)
- * "..." - literal text
- * '' - single quote
- *
- * @param format string - the desired format of the date
- * @param date Date - the date value to format
- * @param settings Object - attributes include:
- * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
- * dayNames string[7] - names of the days from Sunday (optional)
- * monthNamesShort string[12] - abbreviated names of the months (optional)
- * monthNames string[12] - names of the months (optional)
- * @return string - the date in the above format
- */
- formatDate: function( format, date, settings ) {
- if ( !date ) {
- return "";
- }
-
- var iFormat,
- dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,
- dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,
- monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
- monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
-
- // Check whether a format character is doubled
- lookAhead = function( match ) {
- var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
- if ( matches ) {
- iFormat++;
- }
- return matches;
- },
-
- // Format a number, with leading zero if necessary
- formatNumber = function( match, value, len ) {
- var num = "" + value;
- if ( lookAhead( match ) ) {
- while ( num.length < len ) {
- num = "0" + num;
- }
- }
- return num;
- },
-
- // Format a name, short or long as requested
- formatName = function( match, value, shortNames, longNames ) {
- return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );
- },
- output = "",
- literal = false;
-
- if ( date ) {
- for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
- if ( literal ) {
- if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
- literal = false;
- } else {
- output += format.charAt( iFormat );
- }
- } else {
- switch ( format.charAt( iFormat ) ) {
- case "d":
- output += formatNumber( "d", date.getDate(), 2 );
- break;
- case "D":
- output += formatName( "D", date.getDay(), dayNamesShort, dayNames );
- break;
- case "o":
- output += formatNumber( "o",
- Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );
- break;
- case "m":
- output += formatNumber( "m", date.getMonth() + 1, 2 );
- break;
- case "M":
- output += formatName( "M", date.getMonth(), monthNamesShort, monthNames );
- break;
- case "y":
- output += ( lookAhead( "y" ) ? date.getFullYear() :
- ( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 );
- break;
- case "@":
- output += date.getTime();
- break;
- case "!":
- output += date.getTime() * 10000 + this._ticksTo1970;
- break;
- case "'":
- if ( lookAhead( "'" ) ) {
- output += "'";
- } else {
- literal = true;
- }
- break;
- default:
- output += format.charAt( iFormat );
- }
- }
- }
- }
- return output;
- },
-
- /* Extract all possible characters from the date format. */
- _possibleChars: function( format ) {
- var iFormat,
- chars = "",
- literal = false,
-
- // Check whether a format character is doubled
- lookAhead = function( match ) {
- var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );
- if ( matches ) {
- iFormat++;
- }
- return matches;
- };
-
- for ( iFormat = 0; iFormat < format.length; iFormat++ ) {
- if ( literal ) {
- if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) {
- literal = false;
- } else {
- chars += format.charAt( iFormat );
- }
- } else {
- switch ( format.charAt( iFormat ) ) {
- case "d": case "m": case "y": case "@":
- chars += "0123456789";
- break;
- case "D": case "M":
- return null; // Accept anything
- case "'":
- if ( lookAhead( "'" ) ) {
- chars += "'";
- } else {
- literal = true;
- }
- break;
- default:
- chars += format.charAt( iFormat );
- }
- }
- }
- return chars;
- },
-
- /* Get a setting value, defaulting if necessary. */
- _get: function( inst, name ) {
- return inst.settings[ name ] !== undefined ?
- inst.settings[ name ] : this._defaults[ name ];
- },
-
- /* Parse existing date and initialise date picker. */
- _setDateFromField: function( inst, noDefault ) {
- if ( inst.input.val() === inst.lastVal ) {
- return;
- }
-
- var dateFormat = this._get( inst, "dateFormat" ),
- dates = inst.lastVal = inst.input ? inst.input.val() : null,
- defaultDate = this._getDefaultDate( inst ),
- date = defaultDate,
- settings = this._getFormatConfig( inst );
-
- try {
- date = this.parseDate( dateFormat, dates, settings ) || defaultDate;
- } catch ( event ) {
- dates = ( noDefault ? "" : dates );
- }
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- inst.currentDay = ( dates ? date.getDate() : 0 );
- inst.currentMonth = ( dates ? date.getMonth() : 0 );
- inst.currentYear = ( dates ? date.getFullYear() : 0 );
- this._adjustInstDate( inst );
- },
-
- /* Retrieve the default date shown on opening. */
- _getDefaultDate: function( inst ) {
- return this._restrictMinMax( inst,
- this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) );
- },
-
- /* A date may be specified as an exact value or a relative one. */
- _determineDate: function( inst, date, defaultDate ) {
- var offsetNumeric = function( offset ) {
- var date = new Date();
- date.setDate( date.getDate() + offset );
- return date;
- },
- offsetString = function( offset ) {
- try {
- return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ),
- offset, $.datepicker._getFormatConfig( inst ) );
- }
- catch ( e ) {
-
- // Ignore
- }
-
- var date = ( offset.toLowerCase().match( /^c/ ) ?
- $.datepicker._getDate( inst ) : null ) || new Date(),
- year = date.getFullYear(),
- month = date.getMonth(),
- day = date.getDate(),
- pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,
- matches = pattern.exec( offset );
-
- while ( matches ) {
- switch ( matches[ 2 ] || "d" ) {
- case "d" : case "D" :
- day += parseInt( matches[ 1 ], 10 ); break;
- case "w" : case "W" :
- day += parseInt( matches[ 1 ], 10 ) * 7; break;
- case "m" : case "M" :
- month += parseInt( matches[ 1 ], 10 );
- day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
- break;
- case "y": case "Y" :
- year += parseInt( matches[ 1 ], 10 );
- day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );
- break;
- }
- matches = pattern.exec( offset );
- }
- return new Date( year, month, day );
- },
- newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) :
- ( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );
-
- newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate );
- if ( newDate ) {
- newDate.setHours( 0 );
- newDate.setMinutes( 0 );
- newDate.setSeconds( 0 );
- newDate.setMilliseconds( 0 );
- }
- return this._daylightSavingAdjust( newDate );
- },
-
- /* Handle switch to/from daylight saving.
- * Hours may be non-zero on daylight saving cut-over:
- * > 12 when midnight changeover, but then cannot generate
- * midnight datetime, so jump to 1AM, otherwise reset.
- * @param date (Date) the date to check
- * @return (Date) the corrected date
- */
- _daylightSavingAdjust: function( date ) {
- if ( !date ) {
- return null;
- }
- date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );
- return date;
- },
-
- /* Set the date(s) directly. */
- _setDate: function( inst, date, noChange ) {
- var clear = !date,
- origMonth = inst.selectedMonth,
- origYear = inst.selectedYear,
- newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );
-
- inst.selectedDay = inst.currentDay = newDate.getDate();
- inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
- inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
- if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {
- this._notifyChange( inst );
- }
- this._adjustInstDate( inst );
- if ( inst.input ) {
- inst.input.val( clear ? "" : this._formatDate( inst ) );
- }
- },
-
- /* Retrieve the date(s) directly. */
- _getDate: function( inst ) {
- var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
- this._daylightSavingAdjust( new Date(
- inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
- return startDate;
- },
-
- /* Attach the onxxx handlers. These are declared statically so
- * they work with static code transformers like Caja.
- */
- _attachHandlers: function( inst ) {
- var stepMonths = this._get( inst, "stepMonths" ),
- id = "#" + inst.id.replace( /\\\\/g, "\\" );
- inst.dpDiv.find( "[data-handler]" ).map( function() {
- var handler = {
- prev: function() {
- $.datepicker._adjustDate( id, -stepMonths, "M" );
- },
- next: function() {
- $.datepicker._adjustDate( id, +stepMonths, "M" );
- },
- hide: function() {
- $.datepicker._hideDatepicker();
- },
- today: function() {
- $.datepicker._gotoToday( id );
- },
- selectDay: function() {
- $.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this );
- return false;
- },
- selectMonth: function() {
- $.datepicker._selectMonthYear( id, this, "M" );
- return false;
- },
- selectYear: function() {
- $.datepicker._selectMonthYear( id, this, "Y" );
- return false;
- }
- };
- $( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] );
- } );
- },
-
- /* Generate the HTML for the current state of the date picker. */
- _generateHTML: function( inst ) {
- var maxDraw, prevText, prev, nextText, next, currentText, gotoDate,
- controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,
- monthNames, monthNamesShort, beforeShowDay, showOtherMonths,
- selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,
- cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,
- printDate, dRow, tbody, daySettings, otherMonth, unselectable,
- tempDate = new Date(),
- today = this._daylightSavingAdjust(
- new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time
- isRTL = this._get( inst, "isRTL" ),
- showButtonPanel = this._get( inst, "showButtonPanel" ),
- hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ),
- navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ),
- numMonths = this._getNumberOfMonths( inst ),
- showCurrentAtPos = this._get( inst, "showCurrentAtPos" ),
- stepMonths = this._get( inst, "stepMonths" ),
- isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),
- currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :
- new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),
- minDate = this._getMinMaxDate( inst, "min" ),
- maxDate = this._getMinMaxDate( inst, "max" ),
- drawMonth = inst.drawMonth - showCurrentAtPos,
- drawYear = inst.drawYear;
-
- if ( drawMonth < 0 ) {
- drawMonth += 12;
- drawYear--;
- }
- if ( maxDate ) {
- maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),
- maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );
- maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );
- while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {
- drawMonth--;
- if ( drawMonth < 0 ) {
- drawMonth = 11;
- drawYear--;
- }
- }
- }
- inst.drawMonth = drawMonth;
- inst.drawYear = drawYear;
-
- prevText = this._get( inst, "prevText" );
- prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,
- this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),
- this._getFormatConfig( inst ) ) );
-
- prev = ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ?
- "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" +
- " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" :
- ( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w" ) + "'>" + prevText + "</span></a>" ) );
-
- nextText = this._get( inst, "nextText" );
- nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,
- this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),
- this._getFormatConfig( inst ) ) );
-
- next = ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ?
- "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" +
- " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" :
- ( hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e" ) + "'>" + nextText + "</span></a>" ) );
-
- currentText = this._get( inst, "currentText" );
- gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today );
- currentText = ( !navigationAsDateFormat ? currentText :
- this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );
-
- controls = ( !inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" +
- this._get( inst, "closeText" ) + "</button>" : "" );
-
- buttonPanel = ( showButtonPanel ) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + ( isRTL ? controls : "" ) +
- ( this._isInRange( inst, gotoDate ) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" +
- ">" + currentText + "</button>" : "" ) + ( isRTL ? "" : controls ) + "</div>" : "";
-
- firstDay = parseInt( this._get( inst, "firstDay" ), 10 );
- firstDay = ( isNaN( firstDay ) ? 0 : firstDay );
-
- showWeek = this._get( inst, "showWeek" );
- dayNames = this._get( inst, "dayNames" );
- dayNamesMin = this._get( inst, "dayNamesMin" );
- monthNames = this._get( inst, "monthNames" );
- monthNamesShort = this._get( inst, "monthNamesShort" );
- beforeShowDay = this._get( inst, "beforeShowDay" );
- showOtherMonths = this._get( inst, "showOtherMonths" );
- selectOtherMonths = this._get( inst, "selectOtherMonths" );
- defaultDate = this._getDefaultDate( inst );
- html = "";
-
- for ( row = 0; row < numMonths[ 0 ]; row++ ) {
- group = "";
- this.maxRows = 4;
- for ( col = 0; col < numMonths[ 1 ]; col++ ) {
- selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );
- cornerClass = " ui-corner-all";
- calender = "";
- if ( isMultiMonth ) {
- calender += "<div class='ui-datepicker-group";
- if ( numMonths[ 1 ] > 1 ) {
- switch ( col ) {
- case 0: calender += " ui-datepicker-group-first";
- cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break;
- case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last";
- cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break;
- default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break;
- }
- }
- calender += "'>";
- }
- calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" +
- ( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
- ( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
- this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
- row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
- "</div><table class='ui-datepicker-calendar'><thead>" +
- "<tr>";
- thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
- for ( dow = 0; dow < 7; dow++ ) { // days of the week
- day = ( dow + firstDay ) % 7;
- thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" +
- "<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>";
- }
- calender += thead + "</tr></thead><tbody>";
- daysInMonth = this._getDaysInMonth( drawYear, drawMonth );
- if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {
- inst.selectedDay = Math.min( inst.selectedDay, daysInMonth );
- }
- leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;
- curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate
- numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)
- this.maxRows = numRows;
- printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );
- for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows
- calender += "<tr>";
- tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" +
- this._get( inst, "calculateWeek" )( printDate ) + "</td>" );
- for ( dow = 0; dow < 7; dow++ ) { // create date picker days
- daySettings = ( beforeShowDay ?
- beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] );
- otherMonth = ( printDate.getMonth() !== drawMonth );
- unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||
- ( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );
- tbody += "<td class='" +
- ( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends
- ( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months
- ( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
- ( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
-
- // or defaultDate is current printedDate and defaultDate is selectedDate
- " " + this._dayOverClass : "" ) + // highlight selected day
- ( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) + // highlight unselectable days
- ( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
- ( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
- ( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
- ( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
- ( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
- ( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
- ( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
- ( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
- ( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
- ( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
- "' href='#'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
- printDate.setDate( printDate.getDate() + 1 );
- printDate = this._daylightSavingAdjust( printDate );
- }
- calender += tbody + "</tr>";
- }
- drawMonth++;
- if ( drawMonth > 11 ) {
- drawMonth = 0;
- drawYear++;
- }
- calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
- ( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
- group += calender;
- }
- html += group;
- }
- html += buttonPanel;
- inst._keyEvent = false;
- return html;
- },
-
- /* Generate the month and year header. */
- _generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
- secondary, monthNames, monthNamesShort ) {
-
- var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
- changeMonth = this._get( inst, "changeMonth" ),
- changeYear = this._get( inst, "changeYear" ),
- showMonthAfterYear = this._get( inst, "showMonthAfterYear" ),
- html = "<div class='ui-datepicker-title'>",
- monthHtml = "";
-
- // Month selection
- if ( secondary || !changeMonth ) {
- monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>";
- } else {
- inMinYear = ( minDate && minDate.getFullYear() === drawYear );
- inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );
- monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>";
- for ( month = 0; month < 12; month++ ) {
- if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {
- monthHtml += "<option value='" + month + "'" +
- ( month === drawMonth ? " selected='selected'" : "" ) +
- ">" + monthNamesShort[ month ] + "</option>";
- }
- }
- monthHtml += "</select>";
- }
-
- if ( !showMonthAfterYear ) {
- html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" );
- }
-
- // Year selection
- if ( !inst.yearshtml ) {
- inst.yearshtml = "";
- if ( secondary || !changeYear ) {
- html += "<span class='ui-datepicker-year'>" + drawYear + "</span>";
- } else {
-
- // determine range of years to display
- years = this._get( inst, "yearRange" ).split( ":" );
- thisYear = new Date().getFullYear();
- determineYear = function( value ) {
- var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
- ( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
- parseInt( value, 10 ) ) );
- return ( isNaN( year ) ? thisYear : year );
- };
- year = determineYear( years[ 0 ] );
- endYear = Math.max( year, determineYear( years[ 1 ] || "" ) );
- year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );
- endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );
- inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";
- for ( ; year <= endYear; year++ ) {
- inst.yearshtml += "<option value='" + year + "'" +
- ( year === drawYear ? " selected='selected'" : "" ) +
- ">" + year + "</option>";
- }
- inst.yearshtml += "</select>";
-
- html += inst.yearshtml;
- inst.yearshtml = null;
- }
- }
-
- html += this._get( inst, "yearSuffix" );
- if ( showMonthAfterYear ) {
- html += ( secondary || !( changeMonth && changeYear ) ? "&#xa0;" : "" ) + monthHtml;
- }
- html += "</div>"; // Close datepicker_header
- return html;
- },
-
- /* Adjust one of the date sub-fields. */
- _adjustInstDate: function( inst, offset, period ) {
- var year = inst.selectedYear + ( period === "Y" ? offset : 0 ),
- month = inst.selectedMonth + ( period === "M" ? offset : 0 ),
- day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ),
- date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );
-
- inst.selectedDay = date.getDate();
- inst.drawMonth = inst.selectedMonth = date.getMonth();
- inst.drawYear = inst.selectedYear = date.getFullYear();
- if ( period === "M" || period === "Y" ) {
- this._notifyChange( inst );
- }
- },
-
- /* Ensure a date is within any min/max bounds. */
- _restrictMinMax: function( inst, date ) {
- var minDate = this._getMinMaxDate( inst, "min" ),
- maxDate = this._getMinMaxDate( inst, "max" ),
- newDate = ( minDate && date < minDate ? minDate : date );
- return ( maxDate && newDate > maxDate ? maxDate : newDate );
- },
-
- /* Notify change of month/year. */
- _notifyChange: function( inst ) {
- var onChange = this._get( inst, "onChangeMonthYear" );
- if ( onChange ) {
- onChange.apply( ( inst.input ? inst.input[ 0 ] : null ),
- [ inst.selectedYear, inst.selectedMonth + 1, inst ] );
- }
- },
-
- /* Determine the number of months to show. */
- _getNumberOfMonths: function( inst ) {
- var numMonths = this._get( inst, "numberOfMonths" );
- return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) );
- },
-
- /* Determine the current maximum date - ensure no time components are set. */
- _getMinMaxDate: function( inst, minMax ) {
- return this._determineDate( inst, this._get( inst, minMax + "Date" ), null );
- },
-
- /* Find the number of days in a given month. */
- _getDaysInMonth: function( year, month ) {
- return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();
- },
-
- /* Find the day of the week of the first of a month. */
- _getFirstDayOfMonth: function( year, month ) {
- return new Date( year, month, 1 ).getDay();
- },
-
- /* Determines if we should allow a "next/prev" month display change. */
- _canAdjustMonth: function( inst, offset, curYear, curMonth ) {
- var numMonths = this._getNumberOfMonths( inst ),
- date = this._daylightSavingAdjust( new Date( curYear,
- curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
-
- if ( offset < 0 ) {
- date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
- }
- return this._isInRange( inst, date );
- },
-
- /* Is the given date in the accepted range? */
- _isInRange: function( inst, date ) {
- var yearSplit, currentYear,
- minDate = this._getMinMaxDate( inst, "min" ),
- maxDate = this._getMinMaxDate( inst, "max" ),
- minYear = null,
- maxYear = null,
- years = this._get( inst, "yearRange" );
- if ( years ) {
- yearSplit = years.split( ":" );
- currentYear = new Date().getFullYear();
- minYear = parseInt( yearSplit[ 0 ], 10 );
- maxYear = parseInt( yearSplit[ 1 ], 10 );
- if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
- minYear += currentYear;
- }
- if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
- maxYear += currentYear;
- }
- }
-
- return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
- ( !maxDate || date.getTime() <= maxDate.getTime() ) &&
- ( !minYear || date.getFullYear() >= minYear ) &&
- ( !maxYear || date.getFullYear() <= maxYear ) );
- },
-
- /* Provide the configuration settings for formatting/parsing. */
- _getFormatConfig: function( inst ) {
- var shortYearCutoff = this._get( inst, "shortYearCutoff" );
- shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff :
- new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );
- return { shortYearCutoff: shortYearCutoff,
- dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ),
- monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) };
- },
-
- /* Format the given date for display. */
- _formatDate: function( inst, day, month, year ) {
- if ( !day ) {
- inst.currentDay = inst.selectedDay;
- inst.currentMonth = inst.selectedMonth;
- inst.currentYear = inst.selectedYear;
- }
- var date = ( day ? ( typeof day === "object" ? day :
- this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
- this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
- return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
- }
-} );
-
-/*
- * Bind hover events for datepicker elements.
- * Done via delegate so the binding only occurs once in the lifetime of the parent div.
- * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
- */
-function datepicker_bindHover( dpDiv ) {
- var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
- return dpDiv.on( "mouseout", selector, function() {
- $( this ).removeClass( "ui-state-hover" );
- if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
- $( this ).removeClass( "ui-datepicker-prev-hover" );
- }
- if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
- $( this ).removeClass( "ui-datepicker-next-hover" );
- }
- } )
- .on( "mouseover", selector, datepicker_handleMouseover );
-}
-
-function datepicker_handleMouseover() {
- if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {
- $( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" );
- $( this ).addClass( "ui-state-hover" );
- if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
- $( this ).addClass( "ui-datepicker-prev-hover" );
- }
- if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
- $( this ).addClass( "ui-datepicker-next-hover" );
- }
- }
-}
-
-/* jQuery extend now ignores nulls! */
-function datepicker_extendRemove( target, props ) {
- $.extend( target, props );
- for ( var name in props ) {
- if ( props[ name ] == null ) {
- target[ name ] = props[ name ];
- }
- }
- return target;
-}
-
-/* Invoke the datepicker functionality.
- @param options string - a command, optionally followed by additional parameters or
- Object - settings for attaching new datepicker functionality
- @return jQuery object */
-$.fn.datepicker = function( options ) {
-
- /* Verify an empty collection wasn't passed - Fixes #6976 */
- if ( !this.length ) {
- return this;
- }
-
- /* Initialise the date picker. */
- if ( !$.datepicker.initialized ) {
- $( document ).on( "mousedown", $.datepicker._checkExternalClick );
- $.datepicker.initialized = true;
- }
-
- /* Append datepicker main container to body if not exist. */
- if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) {
- $( "body" ).append( $.datepicker.dpDiv );
- }
-
- var otherArgs = Array.prototype.slice.call( arguments, 1 );
- if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
- return $.datepicker[ "_" + options + "Datepicker" ].
- apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
- }
- if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
- return $.datepicker[ "_" + options + "Datepicker" ].
- apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
- }
- return this.each( function() {
- typeof options === "string" ?
- $.datepicker[ "_" + options + "Datepicker" ].
- apply( $.datepicker, [ this ].concat( otherArgs ) ) :
- $.datepicker._attachDatepicker( this, options );
- } );
-};
-
-$.datepicker = new Datepicker(); // singleton instance
-$.datepicker.initialized = false;
-$.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.12.1";
-
-var widgetsDatepicker = $.datepicker;
-
-
-/*!
- * jQuery UI Dialog 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Dialog
-//>>group: Widgets
-//>>description: Displays customizable dialog windows.
-//>>docs: http://api.jqueryui.com/dialog/
-//>>demos: http://jqueryui.com/dialog/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/dialog.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.dialog", {
- version: "1.12.1",
- options: {
- appendTo: "body",
- autoOpen: true,
- buttons: [],
- classes: {
- "ui-dialog": "ui-corner-all",
- "ui-dialog-titlebar": "ui-corner-all"
- },
- closeOnEscape: true,
- closeText: "Close",
- draggable: true,
- hide: null,
- height: "auto",
- maxHeight: null,
- maxWidth: null,
- minHeight: 150,
- minWidth: 150,
- modal: false,
- position: {
- my: "center",
- at: "center",
- of: window,
- collision: "fit",
-
- // Ensure the titlebar is always visible
- using: function( pos ) {
- var topOffset = $( this ).css( pos ).offset().top;
- if ( topOffset < 0 ) {
- $( this ).css( "top", pos.top - topOffset );
- }
- }
- },
- resizable: true,
- show: null,
- title: null,
- width: 300,
-
- // Callbacks
- beforeClose: null,
- close: null,
- drag: null,
- dragStart: null,
- dragStop: null,
- focus: null,
- open: null,
- resize: null,
- resizeStart: null,
- resizeStop: null
- },
-
- sizeRelatedOptions: {
- buttons: true,
- height: true,
- maxHeight: true,
- maxWidth: true,
- minHeight: true,
- minWidth: true,
- width: true
- },
-
- resizableRelatedOptions: {
- maxHeight: true,
- maxWidth: true,
- minHeight: true,
- minWidth: true
- },
-
- _create: function() {
- this.originalCss = {
- display: this.element[ 0 ].style.display,
- width: this.element[ 0 ].style.width,
- minHeight: this.element[ 0 ].style.minHeight,
- maxHeight: this.element[ 0 ].style.maxHeight,
- height: this.element[ 0 ].style.height
- };
- this.originalPosition = {
- parent: this.element.parent(),
- index: this.element.parent().children().index( this.element )
- };
- this.originalTitle = this.element.attr( "title" );
- if ( this.options.title == null && this.originalTitle != null ) {
- this.options.title = this.originalTitle;
- }
-
- // Dialogs can't be disabled
- if ( this.options.disabled ) {
- this.options.disabled = false;
- }
-
- this._createWrapper();
-
- this.element
- .show()
- .removeAttr( "title" )
- .appendTo( this.uiDialog );
-
- this._addClass( "ui-dialog-content", "ui-widget-content" );
-
- this._createTitlebar();
- this._createButtonPane();
-
- if ( this.options.draggable && $.fn.draggable ) {
- this._makeDraggable();
- }
- if ( this.options.resizable && $.fn.resizable ) {
- this._makeResizable();
- }
-
- this._isOpen = false;
-
- this._trackFocus();
- },
-
- _init: function() {
- if ( this.options.autoOpen ) {
- this.open();
- }
- },
-
- _appendTo: function() {
- var element = this.options.appendTo;
- if ( element && ( element.jquery || element.nodeType ) ) {
- return $( element );
- }
- return this.document.find( element || "body" ).eq( 0 );
- },
-
- _destroy: function() {
- var next,
- originalPosition = this.originalPosition;
-
- this._untrackInstance();
- this._destroyOverlay();
-
- this.element
- .removeUniqueId()
- .css( this.originalCss )
-
- // Without detaching first, the following becomes really slow
- .detach();
-
- this.uiDialog.remove();
-
- if ( this.originalTitle ) {
- this.element.attr( "title", this.originalTitle );
- }
-
- next = originalPosition.parent.children().eq( originalPosition.index );
-
- // Don't try to place the dialog next to itself (#8613)
- if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
- next.before( this.element );
- } else {
- originalPosition.parent.append( this.element );
- }
- },
-
- widget: function() {
- return this.uiDialog;
- },
-
- disable: $.noop,
- enable: $.noop,
-
- close: function( event ) {
- var that = this;
-
- if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) {
- return;
- }
-
- this._isOpen = false;
- this._focusedElement = null;
- this._destroyOverlay();
- this._untrackInstance();
-
- if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) {
-
- // Hiding a focused element doesn't trigger blur in WebKit
- // so in case we have nothing to focus on, explicitly blur the active element
- // https://bugs.webkit.org/show_bug.cgi?id=47182
- $.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) );
- }
-
- this._hide( this.uiDialog, this.options.hide, function() {
- that._trigger( "close", event );
- } );
- },
-
- isOpen: function() {
- return this._isOpen;
- },
-
- moveToTop: function() {
- this._moveToTop();
- },
-
- _moveToTop: function( event, silent ) {
- var moved = false,
- zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() {
- return +$( this ).css( "z-index" );
- } ).get(),
- zIndexMax = Math.max.apply( null, zIndices );
-
- if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) {
- this.uiDialog.css( "z-index", zIndexMax + 1 );
- moved = true;
- }
-
- if ( moved && !silent ) {
- this._trigger( "focus", event );
- }
- return moved;
- },
-
- open: function() {
- var that = this;
- if ( this._isOpen ) {
- if ( this._moveToTop() ) {
- this._focusTabbable();
- }
- return;
- }
-
- this._isOpen = true;
- this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) );
-
- this._size();
- this._position();
- this._createOverlay();
- this._moveToTop( null, true );
-
- // Ensure the overlay is moved to the top with the dialog, but only when
- // opening. The overlay shouldn't move after the dialog is open so that
- // modeless dialogs opened after the modal dialog stack properly.
- if ( this.overlay ) {
- this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 );
- }
-
- this._show( this.uiDialog, this.options.show, function() {
- that._focusTabbable();
- that._trigger( "focus" );
- } );
-
- // Track the dialog immediately upon openening in case a focus event
- // somehow occurs outside of the dialog before an element inside the
- // dialog is focused (#10152)
- this._makeFocusTarget();
-
- this._trigger( "open" );
- },
-
- _focusTabbable: function() {
-
- // Set focus to the first match:
- // 1. An element that was focused previously
- // 2. First element inside the dialog matching [autofocus]
- // 3. Tabbable element inside the content element
- // 4. Tabbable element inside the buttonpane
- // 5. The close button
- // 6. The dialog itself
- var hasFocus = this._focusedElement;
- if ( !hasFocus ) {
- hasFocus = this.element.find( "[autofocus]" );
- }
- if ( !hasFocus.length ) {
- hasFocus = this.element.find( ":tabbable" );
- }
- if ( !hasFocus.length ) {
- hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
- }
- if ( !hasFocus.length ) {
- hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" );
- }
- if ( !hasFocus.length ) {
- hasFocus = this.uiDialog;
- }
- hasFocus.eq( 0 ).trigger( "focus" );
- },
-
- _keepFocus: function( event ) {
- function checkFocus() {
- var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ),
- isActive = this.uiDialog[ 0 ] === activeElement ||
- $.contains( this.uiDialog[ 0 ], activeElement );
- if ( !isActive ) {
- this._focusTabbable();
- }
- }
- event.preventDefault();
- checkFocus.call( this );
-
- // support: IE
- // IE <= 8 doesn't prevent moving focus even with event.preventDefault()
- // so we check again later
- this._delay( checkFocus );
- },
-
- _createWrapper: function() {
- this.uiDialog = $( "<div>" )
- .hide()
- .attr( {
-
- // Setting tabIndex makes the div focusable
- tabIndex: -1,
- role: "dialog"
- } )
- .appendTo( this._appendTo() );
-
- this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" );
- this._on( this.uiDialog, {
- keydown: function( event ) {
- if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
- event.keyCode === $.ui.keyCode.ESCAPE ) {
- event.preventDefault();
- this.close( event );
- return;
- }
-
- // Prevent tabbing out of dialogs
- if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {
- return;
- }
- var tabbables = this.uiDialog.find( ":tabbable" ),
- first = tabbables.filter( ":first" ),
- last = tabbables.filter( ":last" );
-
- if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
- !event.shiftKey ) {
- this._delay( function() {
- first.trigger( "focus" );
- } );
- event.preventDefault();
- } else if ( ( event.target === first[ 0 ] ||
- event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
- this._delay( function() {
- last.trigger( "focus" );
- } );
- event.preventDefault();
- }
- },
- mousedown: function( event ) {
- if ( this._moveToTop( event ) ) {
- this._focusTabbable();
- }
- }
- } );
-
- // We assume that any existing aria-describedby attribute means
- // that the dialog content is marked up properly
- // otherwise we brute force the content as the description
- if ( !this.element.find( "[aria-describedby]" ).length ) {
- this.uiDialog.attr( {
- "aria-describedby": this.element.uniqueId().attr( "id" )
- } );
- }
- },
-
- _createTitlebar: function() {
- var uiDialogTitle;
-
- this.uiDialogTitlebar = $( "<div>" );
- this._addClass( this.uiDialogTitlebar,
- "ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" );
- this._on( this.uiDialogTitlebar, {
- mousedown: function( event ) {
-
- // Don't prevent click on close button (#8838)
- // Focusing a dialog that is partially scrolled out of view
- // causes the browser to scroll it into view, preventing the click event
- if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) {
-
- // Dialog isn't getting focus when dragging (#8063)
- this.uiDialog.trigger( "focus" );
- }
- }
- } );
-
- // Support: IE
- // Use type="button" to prevent enter keypresses in textboxes from closing the
- // dialog in IE (#9312)
- this.uiDialogTitlebarClose = $( "<button type='button'></button>" )
- .button( {
- label: $( "<a>" ).text( this.options.closeText ).html(),
- icon: "ui-icon-closethick",
- showLabel: false
- } )
- .appendTo( this.uiDialogTitlebar );
-
- this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" );
- this._on( this.uiDialogTitlebarClose, {
- click: function( event ) {
- event.preventDefault();
- this.close( event );
- }
- } );
-
- uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar );
- this._addClass( uiDialogTitle, "ui-dialog-title" );
- this._title( uiDialogTitle );
-
- this.uiDialogTitlebar.prependTo( this.uiDialog );
-
- this.uiDialog.attr( {
- "aria-labelledby": uiDialogTitle.attr( "id" )
- } );
- },
-
- _title: function( title ) {
- if ( this.options.title ) {
- title.text( this.options.title );
- } else {
- title.html( "&#160;" );
- }
- },
-
- _createButtonPane: function() {
- this.uiDialogButtonPane = $( "<div>" );
- this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane",
- "ui-widget-content ui-helper-clearfix" );
-
- this.uiButtonSet = $( "<div>" )
- .appendTo( this.uiDialogButtonPane );
- this._addClass( this.uiButtonSet, "ui-dialog-buttonset" );
-
- this._createButtons();
- },
-
- _createButtons: function() {
- var that = this,
- buttons = this.options.buttons;
-
- // If we already have a button pane, remove it
- this.uiDialogButtonPane.remove();
- this.uiButtonSet.empty();
-
- if ( $.isEmptyObject( buttons ) || ( $.isArray( buttons ) && !buttons.length ) ) {
- this._removeClass( this.uiDialog, "ui-dialog-buttons" );
- return;
- }
-
- $.each( buttons, function( name, props ) {
- var click, buttonOptions;
- props = $.isFunction( props ) ?
- { click: props, text: name } :
- props;
-
- // Default to a non-submitting button
- props = $.extend( { type: "button" }, props );
-
- // Change the context for the click callback to be the main element
- click = props.click;
- buttonOptions = {
- icon: props.icon,
- iconPosition: props.iconPosition,
- showLabel: props.showLabel,
-
- // Deprecated options
- icons: props.icons,
- text: props.text
- };
-
- delete props.click;
- delete props.icon;
- delete props.iconPosition;
- delete props.showLabel;
-
- // Deprecated options
- delete props.icons;
- if ( typeof props.text === "boolean" ) {
- delete props.text;
- }
-
- $( "<button></button>", props )
- .button( buttonOptions )
- .appendTo( that.uiButtonSet )
- .on( "click", function() {
- click.apply( that.element[ 0 ], arguments );
- } );
- } );
- this._addClass( this.uiDialog, "ui-dialog-buttons" );
- this.uiDialogButtonPane.appendTo( this.uiDialog );
- },
-
- _makeDraggable: function() {
- var that = this,
- options = this.options;
-
- function filteredUi( ui ) {
- return {
- position: ui.position,
- offset: ui.offset
- };
- }
-
- this.uiDialog.draggable( {
- cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
- handle: ".ui-dialog-titlebar",
- containment: "document",
- start: function( event, ui ) {
- that._addClass( $( this ), "ui-dialog-dragging" );
- that._blockFrames();
- that._trigger( "dragStart", event, filteredUi( ui ) );
- },
- drag: function( event, ui ) {
- that._trigger( "drag", event, filteredUi( ui ) );
- },
- stop: function( event, ui ) {
- var left = ui.offset.left - that.document.scrollLeft(),
- top = ui.offset.top - that.document.scrollTop();
-
- options.position = {
- my: "left top",
- at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
- "top" + ( top >= 0 ? "+" : "" ) + top,
- of: that.window
- };
- that._removeClass( $( this ), "ui-dialog-dragging" );
- that._unblockFrames();
- that._trigger( "dragStop", event, filteredUi( ui ) );
- }
- } );
- },
-
- _makeResizable: function() {
- var that = this,
- options = this.options,
- handles = options.resizable,
-
- // .ui-resizable has position: relative defined in the stylesheet
- // but dialogs have to use absolute or fixed positioning
- position = this.uiDialog.css( "position" ),
- resizeHandles = typeof handles === "string" ?
- handles :
- "n,e,s,w,se,sw,ne,nw";
-
- function filteredUi( ui ) {
- return {
- originalPosition: ui.originalPosition,
- originalSize: ui.originalSize,
- position: ui.position,
- size: ui.size
- };
- }
-
- this.uiDialog.resizable( {
- cancel: ".ui-dialog-content",
- containment: "document",
- alsoResize: this.element,
- maxWidth: options.maxWidth,
- maxHeight: options.maxHeight,
- minWidth: options.minWidth,
- minHeight: this._minHeight(),
- handles: resizeHandles,
- start: function( event, ui ) {
- that._addClass( $( this ), "ui-dialog-resizing" );
- that._blockFrames();
- that._trigger( "resizeStart", event, filteredUi( ui ) );
- },
- resize: function( event, ui ) {
- that._trigger( "resize", event, filteredUi( ui ) );
- },
- stop: function( event, ui ) {
- var offset = that.uiDialog.offset(),
- left = offset.left - that.document.scrollLeft(),
- top = offset.top - that.document.scrollTop();
-
- options.height = that.uiDialog.height();
- options.width = that.uiDialog.width();
- options.position = {
- my: "left top",
- at: "left" + ( left >= 0 ? "+" : "" ) + left + " " +
- "top" + ( top >= 0 ? "+" : "" ) + top,
- of: that.window
- };
- that._removeClass( $( this ), "ui-dialog-resizing" );
- that._unblockFrames();
- that._trigger( "resizeStop", event, filteredUi( ui ) );
- }
- } )
- .css( "position", position );
- },
-
- _trackFocus: function() {
- this._on( this.widget(), {
- focusin: function( event ) {
- this._makeFocusTarget();
- this._focusedElement = $( event.target );
- }
- } );
- },
-
- _makeFocusTarget: function() {
- this._untrackInstance();
- this._trackingInstances().unshift( this );
- },
-
- _untrackInstance: function() {
- var instances = this._trackingInstances(),
- exists = $.inArray( this, instances );
- if ( exists !== -1 ) {
- instances.splice( exists, 1 );
- }
- },
-
- _trackingInstances: function() {
- var instances = this.document.data( "ui-dialog-instances" );
- if ( !instances ) {
- instances = [];
- this.document.data( "ui-dialog-instances", instances );
- }
- return instances;
- },
-
- _minHeight: function() {
- var options = this.options;
-
- return options.height === "auto" ?
- options.minHeight :
- Math.min( options.minHeight, options.height );
- },
-
- _position: function() {
-
- // Need to show the dialog to get the actual offset in the position plugin
- var isVisible = this.uiDialog.is( ":visible" );
- if ( !isVisible ) {
- this.uiDialog.show();
- }
- this.uiDialog.position( this.options.position );
- if ( !isVisible ) {
- this.uiDialog.hide();
- }
- },
-
- _setOptions: function( options ) {
- var that = this,
- resize = false,
- resizableOptions = {};
-
- $.each( options, function( key, value ) {
- that._setOption( key, value );
-
- if ( key in that.sizeRelatedOptions ) {
- resize = true;
- }
- if ( key in that.resizableRelatedOptions ) {
- resizableOptions[ key ] = value;
- }
- } );
-
- if ( resize ) {
- this._size();
- this._position();
- }
- if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
- this.uiDialog.resizable( "option", resizableOptions );
- }
- },
-
- _setOption: function( key, value ) {
- var isDraggable, isResizable,
- uiDialog = this.uiDialog;
-
- if ( key === "disabled" ) {
- return;
- }
-
- this._super( key, value );
-
- if ( key === "appendTo" ) {
- this.uiDialog.appendTo( this._appendTo() );
- }
-
- if ( key === "buttons" ) {
- this._createButtons();
- }
-
- if ( key === "closeText" ) {
- this.uiDialogTitlebarClose.button( {
-
- // Ensure that we always pass a string
- label: $( "<a>" ).text( "" + this.options.closeText ).html()
- } );
- }
-
- if ( key === "draggable" ) {
- isDraggable = uiDialog.is( ":data(ui-draggable)" );
- if ( isDraggable && !value ) {
- uiDialog.draggable( "destroy" );
- }
-
- if ( !isDraggable && value ) {
- this._makeDraggable();
- }
- }
-
- if ( key === "position" ) {
- this._position();
- }
-
- if ( key === "resizable" ) {
-
- // currently resizable, becoming non-resizable
- isResizable = uiDialog.is( ":data(ui-resizable)" );
- if ( isResizable && !value ) {
- uiDialog.resizable( "destroy" );
- }
-
- // Currently resizable, changing handles
- if ( isResizable && typeof value === "string" ) {
- uiDialog.resizable( "option", "handles", value );
- }
-
- // Currently non-resizable, becoming resizable
- if ( !isResizable && value !== false ) {
- this._makeResizable();
- }
- }
-
- if ( key === "title" ) {
- this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) );
- }
- },
-
- _size: function() {
-
- // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
- // divs will both have width and height set, so we need to reset them
- var nonContentHeight, minContentHeight, maxContentHeight,
- options = this.options;
-
- // Reset content sizing
- this.element.show().css( {
- width: "auto",
- minHeight: 0,
- maxHeight: "none",
- height: 0
- } );
-
- if ( options.minWidth > options.width ) {
- options.width = options.minWidth;
- }
-
- // Reset wrapper sizing
- // determine the height of all the non-content elements
- nonContentHeight = this.uiDialog.css( {
- height: "auto",
- width: options.width
- } )
- .outerHeight();
- minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
- maxContentHeight = typeof options.maxHeight === "number" ?
- Math.max( 0, options.maxHeight - nonContentHeight ) :
- "none";
-
- if ( options.height === "auto" ) {
- this.element.css( {
- minHeight: minContentHeight,
- maxHeight: maxContentHeight,
- height: "auto"
- } );
- } else {
- this.element.height( Math.max( 0, options.height - nonContentHeight ) );
- }
-
- if ( this.uiDialog.is( ":data(ui-resizable)" ) ) {
- this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
- }
- },
-
- _blockFrames: function() {
- this.iframeBlocks = this.document.find( "iframe" ).map( function() {
- var iframe = $( this );
-
- return $( "<div>" )
- .css( {
- position: "absolute",
- width: iframe.outerWidth(),
- height: iframe.outerHeight()
- } )
- .appendTo( iframe.parent() )
- .offset( iframe.offset() )[ 0 ];
- } );
- },
-
- _unblockFrames: function() {
- if ( this.iframeBlocks ) {
- this.iframeBlocks.remove();
- delete this.iframeBlocks;
- }
- },
-
- _allowInteraction: function( event ) {
- if ( $( event.target ).closest( ".ui-dialog" ).length ) {
- return true;
- }
-
- // TODO: Remove hack when datepicker implements
- // the .ui-front logic (#8989)
- return !!$( event.target ).closest( ".ui-datepicker" ).length;
- },
-
- _createOverlay: function() {
- if ( !this.options.modal ) {
- return;
- }
-
- // We use a delay in case the overlay is created from an
- // event that we're going to be cancelling (#2804)
- var isOpening = true;
- this._delay( function() {
- isOpening = false;
- } );
-
- if ( !this.document.data( "ui-dialog-overlays" ) ) {
-
- // Prevent use of anchors and inputs
- // Using _on() for an event handler shared across many instances is
- // safe because the dialogs stack and must be closed in reverse order
- this._on( this.document, {
- focusin: function( event ) {
- if ( isOpening ) {
- return;
- }
-
- if ( !this._allowInteraction( event ) ) {
- event.preventDefault();
- this._trackingInstances()[ 0 ]._focusTabbable();
- }
- }
- } );
- }
-
- this.overlay = $( "<div>" )
- .appendTo( this._appendTo() );
-
- this._addClass( this.overlay, null, "ui-widget-overlay ui-front" );
- this._on( this.overlay, {
- mousedown: "_keepFocus"
- } );
- this.document.data( "ui-dialog-overlays",
- ( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 );
- },
-
- _destroyOverlay: function() {
- if ( !this.options.modal ) {
- return;
- }
-
- if ( this.overlay ) {
- var overlays = this.document.data( "ui-dialog-overlays" ) - 1;
-
- if ( !overlays ) {
- this._off( this.document, "focusin" );
- this.document.removeData( "ui-dialog-overlays" );
- } else {
- this.document.data( "ui-dialog-overlays", overlays );
- }
-
- this.overlay.remove();
- this.overlay = null;
- }
- }
-} );
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for dialogClass option
- $.widget( "ui.dialog", $.ui.dialog, {
- options: {
- dialogClass: ""
- },
- _createWrapper: function() {
- this._super();
- this.uiDialog.addClass( this.options.dialogClass );
- },
- _setOption: function( key, value ) {
- if ( key === "dialogClass" ) {
- this.uiDialog
- .removeClass( this.options.dialogClass )
- .addClass( value );
- }
- this._superApply( arguments );
- }
- } );
-}
-
-var widgetsDialog = $.ui.dialog;
-
-
-/*!
- * jQuery UI Progressbar 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Progressbar
-//>>group: Widgets
-// jscs:disable maximumLineLength
-//>>description: Displays a status indicator for loading state, standard percentage, and other progress indicators.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/progressbar/
-//>>demos: http://jqueryui.com/progressbar/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/progressbar.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsProgressbar = $.widget( "ui.progressbar", {
- version: "1.12.1",
- options: {
- classes: {
- "ui-progressbar": "ui-corner-all",
- "ui-progressbar-value": "ui-corner-left",
- "ui-progressbar-complete": "ui-corner-right"
- },
- max: 100,
- value: 0,
-
- change: null,
- complete: null
- },
-
- min: 0,
-
- _create: function() {
-
- // Constrain initial value
- this.oldValue = this.options.value = this._constrainedValue();
-
- this.element.attr( {
-
- // Only set static values; aria-valuenow and aria-valuemax are
- // set inside _refreshValue()
- role: "progressbar",
- "aria-valuemin": this.min
- } );
- this._addClass( "ui-progressbar", "ui-widget ui-widget-content" );
-
- this.valueDiv = $( "<div>" ).appendTo( this.element );
- this._addClass( this.valueDiv, "ui-progressbar-value", "ui-widget-header" );
- this._refreshValue();
- },
-
- _destroy: function() {
- this.element.removeAttr( "role aria-valuemin aria-valuemax aria-valuenow" );
-
- this.valueDiv.remove();
- },
-
- value: function( newValue ) {
- if ( newValue === undefined ) {
- return this.options.value;
- }
-
- this.options.value = this._constrainedValue( newValue );
- this._refreshValue();
- },
-
- _constrainedValue: function( newValue ) {
- if ( newValue === undefined ) {
- newValue = this.options.value;
- }
-
- this.indeterminate = newValue === false;
-
- // Sanitize value
- if ( typeof newValue !== "number" ) {
- newValue = 0;
- }
-
- return this.indeterminate ? false :
- Math.min( this.options.max, Math.max( this.min, newValue ) );
- },
-
- _setOptions: function( options ) {
-
- // Ensure "value" option is set after other values (like max)
- var value = options.value;
- delete options.value;
-
- this._super( options );
-
- this.options.value = this._constrainedValue( value );
- this._refreshValue();
- },
-
- _setOption: function( key, value ) {
- if ( key === "max" ) {
-
- // Don't allow a max less than min
- value = Math.max( this.min, value );
- }
- this._super( key, value );
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this.element.attr( "aria-disabled", value );
- this._toggleClass( null, "ui-state-disabled", !!value );
- },
-
- _percentage: function() {
- return this.indeterminate ?
- 100 :
- 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );
- },
-
- _refreshValue: function() {
- var value = this.options.value,
- percentage = this._percentage();
-
- this.valueDiv
- .toggle( this.indeterminate || value > this.min )
- .width( percentage.toFixed( 0 ) + "%" );
-
- this
- ._toggleClass( this.valueDiv, "ui-progressbar-complete", null,
- value === this.options.max )
- ._toggleClass( "ui-progressbar-indeterminate", null, this.indeterminate );
-
- if ( this.indeterminate ) {
- this.element.removeAttr( "aria-valuenow" );
- if ( !this.overlayDiv ) {
- this.overlayDiv = $( "<div>" ).appendTo( this.valueDiv );
- this._addClass( this.overlayDiv, "ui-progressbar-overlay" );
- }
- } else {
- this.element.attr( {
- "aria-valuemax": this.options.max,
- "aria-valuenow": value
- } );
- if ( this.overlayDiv ) {
- this.overlayDiv.remove();
- this.overlayDiv = null;
- }
- }
-
- if ( this.oldValue !== value ) {
- this.oldValue = value;
- this._trigger( "change" );
- }
- if ( value === this.options.max ) {
- this._trigger( "complete" );
- }
- }
-} );
-
-
-/*!
- * jQuery UI Selectmenu 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Selectmenu
-//>>group: Widgets
-// jscs:disable maximumLineLength
-//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/selectmenu/
-//>>demos: http://jqueryui.com/selectmenu/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
- version: "1.12.1",
- defaultElement: "<select>",
- options: {
- appendTo: null,
- classes: {
- "ui-selectmenu-button-open": "ui-corner-top",
- "ui-selectmenu-button-closed": "ui-corner-all"
- },
- disabled: null,
- icons: {
- button: "ui-icon-triangle-1-s"
- },
- position: {
- my: "left top",
- at: "left bottom",
- collision: "none"
- },
- width: false,
-
- // Callbacks
- change: null,
- close: null,
- focus: null,
- open: null,
- select: null
- },
-
- _create: function() {
- var selectmenuId = this.element.uniqueId().attr( "id" );
- this.ids = {
- element: selectmenuId,
- button: selectmenuId + "-button",
- menu: selectmenuId + "-menu"
- };
-
- this._drawButton();
- this._drawMenu();
- this._bindFormResetHandler();
-
- this._rendered = false;
- this.menuItems = $();
- },
-
- _drawButton: function() {
- var icon,
- that = this,
- item = this._parseOption(
- this.element.find( "option:selected" ),
- this.element[ 0 ].selectedIndex
- );
-
- // Associate existing label with the new button
- this.labels = this.element.labels().attr( "for", this.ids.button );
- this._on( this.labels, {
- click: function( event ) {
- this.button.focus();
- event.preventDefault();
- }
- } );
-
- // Hide original select element
- this.element.hide();
-
- // Create button
- this.button = $( "<span>", {
- tabindex: this.options.disabled ? -1 : 0,
- id: this.ids.button,
- role: "combobox",
- "aria-expanded": "false",
- "aria-autocomplete": "list",
- "aria-owns": this.ids.menu,
- "aria-haspopup": "true",
- title: this.element.attr( "title" )
- } )
- .insertAfter( this.element );
-
- this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
- "ui-button ui-widget" );
-
- icon = $( "<span>" ).appendTo( this.button );
- this._addClass( icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button );
- this.buttonItem = this._renderButtonItem( item )
- .appendTo( this.button );
-
- if ( this.options.width !== false ) {
- this._resizeButton();
- }
-
- this._on( this.button, this._buttonEvents );
- this.button.one( "focusin", function() {
-
- // Delay rendering the menu items until the button receives focus.
- // The menu may have already been rendered via a programmatic open.
- if ( !that._rendered ) {
- that._refreshMenu();
- }
- } );
- },
-
- _drawMenu: function() {
- var that = this;
-
- // Create menu
- this.menu = $( "<ul>", {
- "aria-hidden": "true",
- "aria-labelledby": this.ids.button,
- id: this.ids.menu
- } );
-
- // Wrap menu
- this.menuWrap = $( "<div>" ).append( this.menu );
- this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" );
- this.menuWrap.appendTo( this._appendTo() );
-
- // Initialize menu widget
- this.menuInstance = this.menu
- .menu( {
- classes: {
- "ui-menu": "ui-corner-bottom"
- },
- role: "listbox",
- select: function( event, ui ) {
- event.preventDefault();
-
- // Support: IE8
- // If the item was selected via a click, the text selection
- // will be destroyed in IE
- that._setSelection();
-
- that._select( ui.item.data( "ui-selectmenu-item" ), event );
- },
- focus: function( event, ui ) {
- var item = ui.item.data( "ui-selectmenu-item" );
-
- // Prevent inital focus from firing and check if its a newly focused item
- if ( that.focusIndex != null && item.index !== that.focusIndex ) {
- that._trigger( "focus", event, { item: item } );
- if ( !that.isOpen ) {
- that._select( item, event );
- }
- }
- that.focusIndex = item.index;
-
- that.button.attr( "aria-activedescendant",
- that.menuItems.eq( item.index ).attr( "id" ) );
- }
- } )
- .menu( "instance" );
-
- // Don't close the menu on mouseleave
- this.menuInstance._off( this.menu, "mouseleave" );
-
- // Cancel the menu's collapseAll on document click
- this.menuInstance._closeOnDocumentClick = function() {
- return false;
- };
-
- // Selects often contain empty items, but never contain dividers
- this.menuInstance._isDivider = function() {
- return false;
- };
- },
-
- refresh: function() {
- this._refreshMenu();
- this.buttonItem.replaceWith(
- this.buttonItem = this._renderButtonItem(
-
- // Fall back to an empty object in case there are no options
- this._getSelectedItem().data( "ui-selectmenu-item" ) || {}
- )
- );
- if ( this.options.width === null ) {
- this._resizeButton();
- }
- },
-
- _refreshMenu: function() {
- var item,
- options = this.element.find( "option" );
-
- this.menu.empty();
-
- this._parseOptions( options );
- this._renderMenu( this.menu, this.items );
-
- this.menuInstance.refresh();
- this.menuItems = this.menu.find( "li" )
- .not( ".ui-selectmenu-optgroup" )
- .find( ".ui-menu-item-wrapper" );
-
- this._rendered = true;
-
- if ( !options.length ) {
- return;
- }
-
- item = this._getSelectedItem();
-
- // Update the menu to have the correct item focused
- this.menuInstance.focus( null, item );
- this._setAria( item.data( "ui-selectmenu-item" ) );
-
- // Set disabled state
- this._setOption( "disabled", this.element.prop( "disabled" ) );
- },
-
- open: function( event ) {
- if ( this.options.disabled ) {
- return;
- }
-
- // If this is the first time the menu is being opened, render the items
- if ( !this._rendered ) {
- this._refreshMenu();
- } else {
-
- // Menu clears focus on close, reset focus to selected item
- this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" );
- this.menuInstance.focus( null, this._getSelectedItem() );
- }
-
- // If there are no options, don't open the menu
- if ( !this.menuItems.length ) {
- return;
- }
-
- this.isOpen = true;
- this._toggleAttr();
- this._resizeMenu();
- this._position();
-
- this._on( this.document, this._documentClick );
-
- this._trigger( "open", event );
- },
-
- _position: function() {
- this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );
- },
-
- close: function( event ) {
- if ( !this.isOpen ) {
- return;
- }
-
- this.isOpen = false;
- this._toggleAttr();
-
- this.range = null;
- this._off( this.document );
-
- this._trigger( "close", event );
- },
-
- widget: function() {
- return this.button;
- },
-
- menuWidget: function() {
- return this.menu;
- },
-
- _renderButtonItem: function( item ) {
- var buttonItem = $( "<span>" );
-
- this._setText( buttonItem, item.label );
- this._addClass( buttonItem, "ui-selectmenu-text" );
-
- return buttonItem;
- },
-
- _renderMenu: function( ul, items ) {
- var that = this,
- currentOptgroup = "";
-
- $.each( items, function( index, item ) {
- var li;
-
- if ( item.optgroup !== currentOptgroup ) {
- li = $( "<li>", {
- text: item.optgroup
- } );
- that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" +
- ( item.element.parent( "optgroup" ).prop( "disabled" ) ?
- " ui-state-disabled" :
- "" ) );
-
- li.appendTo( ul );
-
- currentOptgroup = item.optgroup;
- }
-
- that._renderItemData( ul, item );
- } );
- },
-
- _renderItemData: function( ul, item ) {
- return this._renderItem( ul, item ).data( "ui-selectmenu-item", item );
- },
-
- _renderItem: function( ul, item ) {
- var li = $( "<li>" ),
- wrapper = $( "<div>", {
- title: item.element.attr( "title" )
- } );
-
- if ( item.disabled ) {
- this._addClass( li, null, "ui-state-disabled" );
- }
- this._setText( wrapper, item.label );
-
- return li.append( wrapper ).appendTo( ul );
- },
-
- _setText: function( element, value ) {
- if ( value ) {
- element.text( value );
- } else {
- element.html( "&#160;" );
- }
- },
-
- _move: function( direction, event ) {
- var item, next,
- filter = ".ui-menu-item";
-
- if ( this.isOpen ) {
- item = this.menuItems.eq( this.focusIndex ).parent( "li" );
- } else {
- item = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
- filter += ":not(.ui-state-disabled)";
- }
-
- if ( direction === "first" || direction === "last" ) {
- next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 );
- } else {
- next = item[ direction + "All" ]( filter ).eq( 0 );
- }
-
- if ( next.length ) {
- this.menuInstance.focus( event, next );
- }
- },
-
- _getSelectedItem: function() {
- return this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" );
- },
-
- _toggle: function( event ) {
- this[ this.isOpen ? "close" : "open" ]( event );
- },
-
- _setSelection: function() {
- var selection;
-
- if ( !this.range ) {
- return;
- }
-
- if ( window.getSelection ) {
- selection = window.getSelection();
- selection.removeAllRanges();
- selection.addRange( this.range );
-
- // Support: IE8
- } else {
- this.range.select();
- }
-
- // Support: IE
- // Setting the text selection kills the button focus in IE, but
- // restoring the focus doesn't kill the selection.
- this.button.focus();
- },
-
- _documentClick: {
- mousedown: function( event ) {
- if ( !this.isOpen ) {
- return;
- }
-
- if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" +
- $.ui.escapeSelector( this.ids.button ) ).length ) {
- this.close( event );
- }
- }
- },
-
- _buttonEvents: {
-
- // Prevent text selection from being reset when interacting with the selectmenu (#10144)
- mousedown: function() {
- var selection;
-
- if ( window.getSelection ) {
- selection = window.getSelection();
- if ( selection.rangeCount ) {
- this.range = selection.getRangeAt( 0 );
- }
-
- // Support: IE8
- } else {
- this.range = document.selection.createRange();
- }
- },
-
- click: function( event ) {
- this._setSelection();
- this._toggle( event );
- },
-
- keydown: function( event ) {
- var preventDefault = true;
- switch ( event.keyCode ) {
- case $.ui.keyCode.TAB:
- case $.ui.keyCode.ESCAPE:
- this.close( event );
- preventDefault = false;
- break;
- case $.ui.keyCode.ENTER:
- if ( this.isOpen ) {
- this._selectFocusedItem( event );
- }
- break;
- case $.ui.keyCode.UP:
- if ( event.altKey ) {
- this._toggle( event );
- } else {
- this._move( "prev", event );
- }
- break;
- case $.ui.keyCode.DOWN:
- if ( event.altKey ) {
- this._toggle( event );
- } else {
- this._move( "next", event );
- }
- break;
- case $.ui.keyCode.SPACE:
- if ( this.isOpen ) {
- this._selectFocusedItem( event );
- } else {
- this._toggle( event );
- }
- break;
- case $.ui.keyCode.LEFT:
- this._move( "prev", event );
- break;
- case $.ui.keyCode.RIGHT:
- this._move( "next", event );
- break;
- case $.ui.keyCode.HOME:
- case $.ui.keyCode.PAGE_UP:
- this._move( "first", event );
- break;
- case $.ui.keyCode.END:
- case $.ui.keyCode.PAGE_DOWN:
- this._move( "last", event );
- break;
- default:
- this.menu.trigger( event );
- preventDefault = false;
- }
-
- if ( preventDefault ) {
- event.preventDefault();
- }
- }
- },
-
- _selectFocusedItem: function( event ) {
- var item = this.menuItems.eq( this.focusIndex ).parent( "li" );
- if ( !item.hasClass( "ui-state-disabled" ) ) {
- this._select( item.data( "ui-selectmenu-item" ), event );
- }
- },
-
- _select: function( item, event ) {
- var oldIndex = this.element[ 0 ].selectedIndex;
-
- // Change native select element
- this.element[ 0 ].selectedIndex = item.index;
- this.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) );
- this._setAria( item );
- this._trigger( "select", event, { item: item } );
-
- if ( item.index !== oldIndex ) {
- this._trigger( "change", event, { item: item } );
- }
-
- this.close( event );
- },
-
- _setAria: function( item ) {
- var id = this.menuItems.eq( item.index ).attr( "id" );
-
- this.button.attr( {
- "aria-labelledby": id,
- "aria-activedescendant": id
- } );
- this.menu.attr( "aria-activedescendant", id );
- },
-
- _setOption: function( key, value ) {
- if ( key === "icons" ) {
- var icon = this.button.find( "span.ui-icon" );
- this._removeClass( icon, null, this.options.icons.button )
- ._addClass( icon, null, value.button );
- }
-
- this._super( key, value );
-
- if ( key === "appendTo" ) {
- this.menuWrap.appendTo( this._appendTo() );
- }
-
- if ( key === "width" ) {
- this._resizeButton();
- }
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this.menuInstance.option( "disabled", value );
- this.button.attr( "aria-disabled", value );
- this._toggleClass( this.button, null, "ui-state-disabled", value );
-
- this.element.prop( "disabled", value );
- if ( value ) {
- this.button.attr( "tabindex", -1 );
- this.close();
- } else {
- this.button.attr( "tabindex", 0 );
- }
- },
-
- _appendTo: function() {
- var element = this.options.appendTo;
-
- if ( element ) {
- element = element.jquery || element.nodeType ?
- $( element ) :
- this.document.find( element ).eq( 0 );
- }
-
- if ( !element || !element[ 0 ] ) {
- element = this.element.closest( ".ui-front, dialog" );
- }
-
- if ( !element.length ) {
- element = this.document[ 0 ].body;
- }
-
- return element;
- },
-
- _toggleAttr: function() {
- this.button.attr( "aria-expanded", this.isOpen );
-
- // We can't use two _toggleClass() calls here, because we need to make sure
- // we always remove classes first and add them second, otherwise if both classes have the
- // same theme class, it will be removed after we add it.
- this._removeClass( this.button, "ui-selectmenu-button-" +
- ( this.isOpen ? "closed" : "open" ) )
- ._addClass( this.button, "ui-selectmenu-button-" +
- ( this.isOpen ? "open" : "closed" ) )
- ._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen );
-
- this.menu.attr( "aria-hidden", !this.isOpen );
- },
-
- _resizeButton: function() {
- var width = this.options.width;
-
- // For `width: false`, just remove inline style and stop
- if ( width === false ) {
- this.button.css( "width", "" );
- return;
- }
-
- // For `width: null`, match the width of the original element
- if ( width === null ) {
- width = this.element.show().outerWidth();
- this.element.hide();
- }
-
- this.button.outerWidth( width );
- },
-
- _resizeMenu: function() {
- this.menu.outerWidth( Math.max(
- this.button.outerWidth(),
-
- // Support: IE10
- // IE10 wraps long text (possibly a rounding bug)
- // so we add 1px to avoid the wrapping
- this.menu.width( "" ).outerWidth() + 1
- ) );
- },
-
- _getCreateOptions: function() {
- var options = this._super();
-
- options.disabled = this.element.prop( "disabled" );
-
- return options;
- },
-
- _parseOptions: function( options ) {
- var that = this,
- data = [];
- options.each( function( index, item ) {
- data.push( that._parseOption( $( item ), index ) );
- } );
- this.items = data;
- },
-
- _parseOption: function( option, index ) {
- var optgroup = option.parent( "optgroup" );
-
- return {
- element: option,
- index: index,
- value: option.val(),
- label: option.text(),
- optgroup: optgroup.attr( "label" ) || "",
- disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
- };
- },
-
- _destroy: function() {
- this._unbindFormResetHandler();
- this.menuWrap.remove();
- this.button.remove();
- this.element.show();
- this.element.removeUniqueId();
- this.labels.attr( "for", this.ids.element );
- }
-} ] );
-
-
-/*!
- * jQuery UI Slider 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Slider
-//>>group: Widgets
-//>>description: Displays a flexible slider with ranges and accessibility via keyboard.
-//>>docs: http://api.jqueryui.com/slider/
-//>>demos: http://jqueryui.com/slider/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/slider.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, {
- version: "1.12.1",
- widgetEventPrefix: "slide",
-
- options: {
- animate: false,
- classes: {
- "ui-slider": "ui-corner-all",
- "ui-slider-handle": "ui-corner-all",
-
- // Note: ui-widget-header isn't the most fittingly semantic framework class for this
- // element, but worked best visually with a variety of themes
- "ui-slider-range": "ui-corner-all ui-widget-header"
- },
- distance: 0,
- max: 100,
- min: 0,
- orientation: "horizontal",
- range: false,
- step: 1,
- value: 0,
- values: null,
-
- // Callbacks
- change: null,
- slide: null,
- start: null,
- stop: null
- },
-
- // Number of pages in a slider
- // (how many times can you page up/down to go through the whole range)
- numPages: 5,
-
- _create: function() {
- this._keySliding = false;
- this._mouseSliding = false;
- this._animateOff = true;
- this._handleIndex = null;
- this._detectOrientation();
- this._mouseInit();
- this._calculateNewMax();
-
- this._addClass( "ui-slider ui-slider-" + this.orientation,
- "ui-widget ui-widget-content" );
-
- this._refresh();
-
- this._animateOff = false;
- },
-
- _refresh: function() {
- this._createRange();
- this._createHandles();
- this._setupEvents();
- this._refreshValue();
- },
-
- _createHandles: function() {
- var i, handleCount,
- options = this.options,
- existingHandles = this.element.find( ".ui-slider-handle" ),
- handle = "<span tabindex='0'></span>",
- handles = [];
-
- handleCount = ( options.values && options.values.length ) || 1;
-
- if ( existingHandles.length > handleCount ) {
- existingHandles.slice( handleCount ).remove();
- existingHandles = existingHandles.slice( 0, handleCount );
- }
-
- for ( i = existingHandles.length; i < handleCount; i++ ) {
- handles.push( handle );
- }
-
- this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
-
- this._addClass( this.handles, "ui-slider-handle", "ui-state-default" );
-
- this.handle = this.handles.eq( 0 );
-
- this.handles.each( function( i ) {
- $( this )
- .data( "ui-slider-handle-index", i )
- .attr( "tabIndex", 0 );
- } );
- },
-
- _createRange: function() {
- var options = this.options;
-
- if ( options.range ) {
- if ( options.range === true ) {
- if ( !options.values ) {
- options.values = [ this._valueMin(), this._valueMin() ];
- } else if ( options.values.length && options.values.length !== 2 ) {
- options.values = [ options.values[ 0 ], options.values[ 0 ] ];
- } else if ( $.isArray( options.values ) ) {
- options.values = options.values.slice( 0 );
- }
- }
-
- if ( !this.range || !this.range.length ) {
- this.range = $( "<div>" )
- .appendTo( this.element );
-
- this._addClass( this.range, "ui-slider-range" );
- } else {
- this._removeClass( this.range, "ui-slider-range-min ui-slider-range-max" );
-
- // Handle range switching from true to min/max
- this.range.css( {
- "left": "",
- "bottom": ""
- } );
- }
- if ( options.range === "min" || options.range === "max" ) {
- this._addClass( this.range, "ui-slider-range-" + options.range );
- }
- } else {
- if ( this.range ) {
- this.range.remove();
- }
- this.range = null;
- }
- },
-
- _setupEvents: function() {
- this._off( this.handles );
- this._on( this.handles, this._handleEvents );
- this._hoverable( this.handles );
- this._focusable( this.handles );
- },
-
- _destroy: function() {
- this.handles.remove();
- if ( this.range ) {
- this.range.remove();
- }
-
- this._mouseDestroy();
- },
-
- _mouseCapture: function( event ) {
- var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
- that = this,
- o = this.options;
-
- if ( o.disabled ) {
- return false;
- }
-
- this.elementSize = {
- width: this.element.outerWidth(),
- height: this.element.outerHeight()
- };
- this.elementOffset = this.element.offset();
-
- position = { x: event.pageX, y: event.pageY };
- normValue = this._normValueFromMouse( position );
- distance = this._valueMax() - this._valueMin() + 1;
- this.handles.each( function( i ) {
- var thisDistance = Math.abs( normValue - that.values( i ) );
- if ( ( distance > thisDistance ) ||
- ( distance === thisDistance &&
- ( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) {
- distance = thisDistance;
- closestHandle = $( this );
- index = i;
- }
- } );
-
- allowed = this._start( event, index );
- if ( allowed === false ) {
- return false;
- }
- this._mouseSliding = true;
-
- this._handleIndex = index;
-
- this._addClass( closestHandle, null, "ui-state-active" );
- closestHandle.trigger( "focus" );
-
- offset = closestHandle.offset();
- mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" );
- this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
- left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
- top: event.pageY - offset.top -
- ( closestHandle.height() / 2 ) -
- ( parseInt( closestHandle.css( "borderTopWidth" ), 10 ) || 0 ) -
- ( parseInt( closestHandle.css( "borderBottomWidth" ), 10 ) || 0 ) +
- ( parseInt( closestHandle.css( "marginTop" ), 10 ) || 0 )
- };
-
- if ( !this.handles.hasClass( "ui-state-hover" ) ) {
- this._slide( event, index, normValue );
- }
- this._animateOff = true;
- return true;
- },
-
- _mouseStart: function() {
- return true;
- },
-
- _mouseDrag: function( event ) {
- var position = { x: event.pageX, y: event.pageY },
- normValue = this._normValueFromMouse( position );
-
- this._slide( event, this._handleIndex, normValue );
-
- return false;
- },
-
- _mouseStop: function( event ) {
- this._removeClass( this.handles, null, "ui-state-active" );
- this._mouseSliding = false;
-
- this._stop( event, this._handleIndex );
- this._change( event, this._handleIndex );
-
- this._handleIndex = null;
- this._clickOffset = null;
- this._animateOff = false;
-
- return false;
- },
-
- _detectOrientation: function() {
- this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
- },
-
- _normValueFromMouse: function( position ) {
- var pixelTotal,
- pixelMouse,
- percentMouse,
- valueTotal,
- valueMouse;
-
- if ( this.orientation === "horizontal" ) {
- pixelTotal = this.elementSize.width;
- pixelMouse = position.x - this.elementOffset.left -
- ( this._clickOffset ? this._clickOffset.left : 0 );
- } else {
- pixelTotal = this.elementSize.height;
- pixelMouse = position.y - this.elementOffset.top -
- ( this._clickOffset ? this._clickOffset.top : 0 );
- }
-
- percentMouse = ( pixelMouse / pixelTotal );
- if ( percentMouse > 1 ) {
- percentMouse = 1;
- }
- if ( percentMouse < 0 ) {
- percentMouse = 0;
- }
- if ( this.orientation === "vertical" ) {
- percentMouse = 1 - percentMouse;
- }
-
- valueTotal = this._valueMax() - this._valueMin();
- valueMouse = this._valueMin() + percentMouse * valueTotal;
-
- return this._trimAlignValue( valueMouse );
- },
-
- _uiHash: function( index, value, values ) {
- var uiHash = {
- handle: this.handles[ index ],
- handleIndex: index,
- value: value !== undefined ? value : this.value()
- };
-
- if ( this._hasMultipleValues() ) {
- uiHash.value = value !== undefined ? value : this.values( index );
- uiHash.values = values || this.values();
- }
-
- return uiHash;
- },
-
- _hasMultipleValues: function() {
- return this.options.values && this.options.values.length;
- },
-
- _start: function( event, index ) {
- return this._trigger( "start", event, this._uiHash( index ) );
- },
-
- _slide: function( event, index, newVal ) {
- var allowed, otherVal,
- currentValue = this.value(),
- newValues = this.values();
-
- if ( this._hasMultipleValues() ) {
- otherVal = this.values( index ? 0 : 1 );
- currentValue = this.values( index );
-
- if ( this.options.values.length === 2 && this.options.range === true ) {
- newVal = index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal );
- }
-
- newValues[ index ] = newVal;
- }
-
- if ( newVal === currentValue ) {
- return;
- }
-
- allowed = this._trigger( "slide", event, this._uiHash( index, newVal, newValues ) );
-
- // A slide can be canceled by returning false from the slide callback
- if ( allowed === false ) {
- return;
- }
-
- if ( this._hasMultipleValues() ) {
- this.values( index, newVal );
- } else {
- this.value( newVal );
- }
- },
-
- _stop: function( event, index ) {
- this._trigger( "stop", event, this._uiHash( index ) );
- },
-
- _change: function( event, index ) {
- if ( !this._keySliding && !this._mouseSliding ) {
-
- //store the last changed value index for reference when handles overlap
- this._lastChangedValue = index;
- this._trigger( "change", event, this._uiHash( index ) );
- }
- },
-
- value: function( newValue ) {
- if ( arguments.length ) {
- this.options.value = this._trimAlignValue( newValue );
- this._refreshValue();
- this._change( null, 0 );
- return;
- }
-
- return this._value();
- },
-
- values: function( index, newValue ) {
- var vals,
- newValues,
- i;
-
- if ( arguments.length > 1 ) {
- this.options.values[ index ] = this._trimAlignValue( newValue );
- this._refreshValue();
- this._change( null, index );
- return;
- }
-
- if ( arguments.length ) {
- if ( $.isArray( arguments[ 0 ] ) ) {
- vals = this.options.values;
- newValues = arguments[ 0 ];
- for ( i = 0; i < vals.length; i += 1 ) {
- vals[ i ] = this._trimAlignValue( newValues[ i ] );
- this._change( null, i );
- }
- this._refreshValue();
- } else {
- if ( this._hasMultipleValues() ) {
- return this._values( index );
- } else {
- return this.value();
- }
- }
- } else {
- return this._values();
- }
- },
-
- _setOption: function( key, value ) {
- var i,
- valsLength = 0;
-
- if ( key === "range" && this.options.range === true ) {
- if ( value === "min" ) {
- this.options.value = this._values( 0 );
- this.options.values = null;
- } else if ( value === "max" ) {
- this.options.value = this._values( this.options.values.length - 1 );
- this.options.values = null;
- }
- }
-
- if ( $.isArray( this.options.values ) ) {
- valsLength = this.options.values.length;
- }
-
- this._super( key, value );
-
- switch ( key ) {
- case "orientation":
- this._detectOrientation();
- this._removeClass( "ui-slider-horizontal ui-slider-vertical" )
- ._addClass( "ui-slider-" + this.orientation );
- this._refreshValue();
- if ( this.options.range ) {
- this._refreshRange( value );
- }
-
- // Reset positioning from previous orientation
- this.handles.css( value === "horizontal" ? "bottom" : "left", "" );
- break;
- case "value":
- this._animateOff = true;
- this._refreshValue();
- this._change( null, 0 );
- this._animateOff = false;
- break;
- case "values":
- this._animateOff = true;
- this._refreshValue();
-
- // Start from the last handle to prevent unreachable handles (#9046)
- for ( i = valsLength - 1; i >= 0; i-- ) {
- this._change( null, i );
- }
- this._animateOff = false;
- break;
- case "step":
- case "min":
- case "max":
- this._animateOff = true;
- this._calculateNewMax();
- this._refreshValue();
- this._animateOff = false;
- break;
- case "range":
- this._animateOff = true;
- this._refresh();
- this._animateOff = false;
- break;
- }
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this._toggleClass( null, "ui-state-disabled", !!value );
- },
-
- //internal value getter
- // _value() returns value trimmed by min and max, aligned by step
- _value: function() {
- var val = this.options.value;
- val = this._trimAlignValue( val );
-
- return val;
- },
-
- //internal values getter
- // _values() returns array of values trimmed by min and max, aligned by step
- // _values( index ) returns single value trimmed by min and max, aligned by step
- _values: function( index ) {
- var val,
- vals,
- i;
-
- if ( arguments.length ) {
- val = this.options.values[ index ];
- val = this._trimAlignValue( val );
-
- return val;
- } else if ( this._hasMultipleValues() ) {
-
- // .slice() creates a copy of the array
- // this copy gets trimmed by min and max and then returned
- vals = this.options.values.slice();
- for ( i = 0; i < vals.length; i += 1 ) {
- vals[ i ] = this._trimAlignValue( vals[ i ] );
- }
-
- return vals;
- } else {
- return [];
- }
- },
-
- // Returns the step-aligned value that val is closest to, between (inclusive) min and max
- _trimAlignValue: function( val ) {
- if ( val <= this._valueMin() ) {
- return this._valueMin();
- }
- if ( val >= this._valueMax() ) {
- return this._valueMax();
- }
- var step = ( this.options.step > 0 ) ? this.options.step : 1,
- valModStep = ( val - this._valueMin() ) % step,
- alignValue = val - valModStep;
-
- if ( Math.abs( valModStep ) * 2 >= step ) {
- alignValue += ( valModStep > 0 ) ? step : ( -step );
- }
-
- // Since JavaScript has problems with large floats, round
- // the final value to 5 digits after the decimal point (see #4124)
- return parseFloat( alignValue.toFixed( 5 ) );
- },
-
- _calculateNewMax: function() {
- var max = this.options.max,
- min = this._valueMin(),
- step = this.options.step,
- aboveMin = Math.round( ( max - min ) / step ) * step;
- max = aboveMin + min;
- if ( max > this.options.max ) {
-
- //If max is not divisible by step, rounding off may increase its value
- max -= step;
- }
- this.max = parseFloat( max.toFixed( this._precision() ) );
- },
-
- _precision: function() {
- var precision = this._precisionOf( this.options.step );
- if ( this.options.min !== null ) {
- precision = Math.max( precision, this._precisionOf( this.options.min ) );
- }
- return precision;
- },
-
- _precisionOf: function( num ) {
- var str = num.toString(),
- decimal = str.indexOf( "." );
- return decimal === -1 ? 0 : str.length - decimal - 1;
- },
-
- _valueMin: function() {
- return this.options.min;
- },
-
- _valueMax: function() {
- return this.max;
- },
-
- _refreshRange: function( orientation ) {
- if ( orientation === "vertical" ) {
- this.range.css( { "width": "", "left": "" } );
- }
- if ( orientation === "horizontal" ) {
- this.range.css( { "height": "", "bottom": "" } );
- }
- },
-
- _refreshValue: function() {
- var lastValPercent, valPercent, value, valueMin, valueMax,
- oRange = this.options.range,
- o = this.options,
- that = this,
- animate = ( !this._animateOff ) ? o.animate : false,
- _set = {};
-
- if ( this._hasMultipleValues() ) {
- this.handles.each( function( i ) {
- valPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() -
- that._valueMin() ) * 100;
- _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
- $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
- if ( that.options.range === true ) {
- if ( that.orientation === "horizontal" ) {
- if ( i === 0 ) {
- that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- left: valPercent + "%"
- }, o.animate );
- }
- if ( i === 1 ) {
- that.range[ animate ? "animate" : "css" ]( {
- width: ( valPercent - lastValPercent ) + "%"
- }, {
- queue: false,
- duration: o.animate
- } );
- }
- } else {
- if ( i === 0 ) {
- that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- bottom: ( valPercent ) + "%"
- }, o.animate );
- }
- if ( i === 1 ) {
- that.range[ animate ? "animate" : "css" ]( {
- height: ( valPercent - lastValPercent ) + "%"
- }, {
- queue: false,
- duration: o.animate
- } );
- }
- }
- }
- lastValPercent = valPercent;
- } );
- } else {
- value = this.value();
- valueMin = this._valueMin();
- valueMax = this._valueMax();
- valPercent = ( valueMax !== valueMin ) ?
- ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
- 0;
- _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
- this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-
- if ( oRange === "min" && this.orientation === "horizontal" ) {
- this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- width: valPercent + "%"
- }, o.animate );
- }
- if ( oRange === "max" && this.orientation === "horizontal" ) {
- this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- width: ( 100 - valPercent ) + "%"
- }, o.animate );
- }
- if ( oRange === "min" && this.orientation === "vertical" ) {
- this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- height: valPercent + "%"
- }, o.animate );
- }
- if ( oRange === "max" && this.orientation === "vertical" ) {
- this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( {
- height: ( 100 - valPercent ) + "%"
- }, o.animate );
- }
- }
- },
-
- _handleEvents: {
- keydown: function( event ) {
- var allowed, curVal, newVal, step,
- index = $( event.target ).data( "ui-slider-handle-index" );
-
- switch ( event.keyCode ) {
- case $.ui.keyCode.HOME:
- case $.ui.keyCode.END:
- case $.ui.keyCode.PAGE_UP:
- case $.ui.keyCode.PAGE_DOWN:
- case $.ui.keyCode.UP:
- case $.ui.keyCode.RIGHT:
- case $.ui.keyCode.DOWN:
- case $.ui.keyCode.LEFT:
- event.preventDefault();
- if ( !this._keySliding ) {
- this._keySliding = true;
- this._addClass( $( event.target ), null, "ui-state-active" );
- allowed = this._start( event, index );
- if ( allowed === false ) {
- return;
- }
- }
- break;
- }
-
- step = this.options.step;
- if ( this._hasMultipleValues() ) {
- curVal = newVal = this.values( index );
- } else {
- curVal = newVal = this.value();
- }
-
- switch ( event.keyCode ) {
- case $.ui.keyCode.HOME:
- newVal = this._valueMin();
- break;
- case $.ui.keyCode.END:
- newVal = this._valueMax();
- break;
- case $.ui.keyCode.PAGE_UP:
- newVal = this._trimAlignValue(
- curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )
- );
- break;
- case $.ui.keyCode.PAGE_DOWN:
- newVal = this._trimAlignValue(
- curVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) );
- break;
- case $.ui.keyCode.UP:
- case $.ui.keyCode.RIGHT:
- if ( curVal === this._valueMax() ) {
- return;
- }
- newVal = this._trimAlignValue( curVal + step );
- break;
- case $.ui.keyCode.DOWN:
- case $.ui.keyCode.LEFT:
- if ( curVal === this._valueMin() ) {
- return;
- }
- newVal = this._trimAlignValue( curVal - step );
- break;
- }
-
- this._slide( event, index, newVal );
- },
- keyup: function( event ) {
- var index = $( event.target ).data( "ui-slider-handle-index" );
-
- if ( this._keySliding ) {
- this._keySliding = false;
- this._stop( event, index );
- this._change( event, index );
- this._removeClass( $( event.target ), null, "ui-state-active" );
- }
- }
- }
-} );
-
-
-/*!
- * jQuery UI Spinner 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Spinner
-//>>group: Widgets
-//>>description: Displays buttons to easily input numbers via the keyboard or mouse.
-//>>docs: http://api.jqueryui.com/spinner/
-//>>demos: http://jqueryui.com/spinner/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/spinner.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-function spinnerModifer( fn ) {
- return function() {
- var previous = this.element.val();
- fn.apply( this, arguments );
- this._refresh();
- if ( previous !== this.element.val() ) {
- this._trigger( "change" );
- }
- };
-}
-
-$.widget( "ui.spinner", {
- version: "1.12.1",
- defaultElement: "<input>",
- widgetEventPrefix: "spin",
- options: {
- classes: {
- "ui-spinner": "ui-corner-all",
- "ui-spinner-down": "ui-corner-br",
- "ui-spinner-up": "ui-corner-tr"
- },
- culture: null,
- icons: {
- down: "ui-icon-triangle-1-s",
- up: "ui-icon-triangle-1-n"
- },
- incremental: true,
- max: null,
- min: null,
- numberFormat: null,
- page: 10,
- step: 1,
-
- change: null,
- spin: null,
- start: null,
- stop: null
- },
-
- _create: function() {
-
- // handle string values that need to be parsed
- this._setOption( "max", this.options.max );
- this._setOption( "min", this.options.min );
- this._setOption( "step", this.options.step );
-
- // Only format if there is a value, prevents the field from being marked
- // as invalid in Firefox, see #9573.
- if ( this.value() !== "" ) {
-
- // Format the value, but don't constrain.
- this._value( this.element.val(), true );
- }
-
- this._draw();
- this._on( this._events );
- this._refresh();
-
- // Turning off autocomplete prevents the browser from remembering the
- // value when navigating through history, so we re-enable autocomplete
- // if the page is unloaded before the widget is destroyed. #7790
- this._on( this.window, {
- beforeunload: function() {
- this.element.removeAttr( "autocomplete" );
- }
- } );
- },
-
- _getCreateOptions: function() {
- var options = this._super();
- var element = this.element;
-
- $.each( [ "min", "max", "step" ], function( i, option ) {
- var value = element.attr( option );
- if ( value != null && value.length ) {
- options[ option ] = value;
- }
- } );
-
- return options;
- },
-
- _events: {
- keydown: function( event ) {
- if ( this._start( event ) && this._keydown( event ) ) {
- event.preventDefault();
- }
- },
- keyup: "_stop",
- focus: function() {
- this.previous = this.element.val();
- },
- blur: function( event ) {
- if ( this.cancelBlur ) {
- delete this.cancelBlur;
- return;
- }
-
- this._stop();
- this._refresh();
- if ( this.previous !== this.element.val() ) {
- this._trigger( "change", event );
- }
- },
- mousewheel: function( event, delta ) {
- if ( !delta ) {
- return;
- }
- if ( !this.spinning && !this._start( event ) ) {
- return false;
- }
-
- this._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );
- clearTimeout( this.mousewheelTimer );
- this.mousewheelTimer = this._delay( function() {
- if ( this.spinning ) {
- this._stop( event );
- }
- }, 100 );
- event.preventDefault();
- },
- "mousedown .ui-spinner-button": function( event ) {
- var previous;
-
- // We never want the buttons to have focus; whenever the user is
- // interacting with the spinner, the focus should be on the input.
- // If the input is focused then this.previous is properly set from
- // when the input first received focus. If the input is not focused
- // then we need to set this.previous based on the value before spinning.
- previous = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?
- this.previous : this.element.val();
- function checkFocus() {
- var isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );
- if ( !isActive ) {
- this.element.trigger( "focus" );
- this.previous = previous;
-
- // support: IE
- // IE sets focus asynchronously, so we need to check if focus
- // moved off of the input because the user clicked on the button.
- this._delay( function() {
- this.previous = previous;
- } );
- }
- }
-
- // Ensure focus is on (or stays on) the text field
- event.preventDefault();
- checkFocus.call( this );
-
- // Support: IE
- // IE doesn't prevent moving focus even with event.preventDefault()
- // so we set a flag to know when we should ignore the blur event
- // and check (again) if focus moved off of the input.
- this.cancelBlur = true;
- this._delay( function() {
- delete this.cancelBlur;
- checkFocus.call( this );
- } );
-
- if ( this._start( event ) === false ) {
- return;
- }
-
- this._repeat( null, $( event.currentTarget )
- .hasClass( "ui-spinner-up" ) ? 1 : -1, event );
- },
- "mouseup .ui-spinner-button": "_stop",
- "mouseenter .ui-spinner-button": function( event ) {
-
- // button will add ui-state-active if mouse was down while mouseleave and kept down
- if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
- return;
- }
-
- if ( this._start( event ) === false ) {
- return false;
- }
- this._repeat( null, $( event.currentTarget )
- .hasClass( "ui-spinner-up" ) ? 1 : -1, event );
- },
-
- // TODO: do we really want to consider this a stop?
- // shouldn't we just stop the repeater and wait until mouseup before
- // we trigger the stop event?
- "mouseleave .ui-spinner-button": "_stop"
- },
-
- // Support mobile enhanced option and make backcompat more sane
- _enhance: function() {
- this.uiSpinner = this.element
- .attr( "autocomplete", "off" )
- .wrap( "<span>" )
- .parent()
-
- // Add buttons
- .append(
- "<a></a><a></a>"
- );
- },
-
- _draw: function() {
- this._enhance();
-
- this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" );
- this._addClass( "ui-spinner-input" );
-
- this.element.attr( "role", "spinbutton" );
-
- // Button bindings
- this.buttons = this.uiSpinner.children( "a" )
- .attr( "tabIndex", -1 )
- .attr( "aria-hidden", true )
- .button( {
- classes: {
- "ui-button": ""
- }
- } );
-
- // TODO: Right now button does not support classes this is already updated in button PR
- this._removeClass( this.buttons, "ui-corner-all" );
-
- this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" );
- this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" );
- this.buttons.first().button( {
- "icon": this.options.icons.up,
- "showLabel": false
- } );
- this.buttons.last().button( {
- "icon": this.options.icons.down,
- "showLabel": false
- } );
-
- // IE 6 doesn't understand height: 50% for the buttons
- // unless the wrapper has an explicit height
- if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&
- this.uiSpinner.height() > 0 ) {
- this.uiSpinner.height( this.uiSpinner.height() );
- }
- },
-
- _keydown: function( event ) {
- var options = this.options,
- keyCode = $.ui.keyCode;
-
- switch ( event.keyCode ) {
- case keyCode.UP:
- this._repeat( null, 1, event );
- return true;
- case keyCode.DOWN:
- this._repeat( null, -1, event );
- return true;
- case keyCode.PAGE_UP:
- this._repeat( null, options.page, event );
- return true;
- case keyCode.PAGE_DOWN:
- this._repeat( null, -options.page, event );
- return true;
- }
-
- return false;
- },
-
- _start: function( event ) {
- if ( !this.spinning && this._trigger( "start", event ) === false ) {
- return false;
- }
-
- if ( !this.counter ) {
- this.counter = 1;
- }
- this.spinning = true;
- return true;
- },
-
- _repeat: function( i, steps, event ) {
- i = i || 500;
-
- clearTimeout( this.timer );
- this.timer = this._delay( function() {
- this._repeat( 40, steps, event );
- }, i );
-
- this._spin( steps * this.options.step, event );
- },
-
- _spin: function( step, event ) {
- var value = this.value() || 0;
-
- if ( !this.counter ) {
- this.counter = 1;
- }
-
- value = this._adjustValue( value + step * this._increment( this.counter ) );
-
- if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false ) {
- this._value( value );
- this.counter++;
- }
- },
-
- _increment: function( i ) {
- var incremental = this.options.incremental;
-
- if ( incremental ) {
- return $.isFunction( incremental ) ?
- incremental( i ) :
- Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );
- }
-
- return 1;
- },
-
- _precision: function() {
- var precision = this._precisionOf( this.options.step );
- if ( this.options.min !== null ) {
- precision = Math.max( precision, this._precisionOf( this.options.min ) );
- }
- return precision;
- },
-
- _precisionOf: function( num ) {
- var str = num.toString(),
- decimal = str.indexOf( "." );
- return decimal === -1 ? 0 : str.length - decimal - 1;
- },
-
- _adjustValue: function( value ) {
- var base, aboveMin,
- options = this.options;
-
- // Make sure we're at a valid step
- // - find out where we are relative to the base (min or 0)
- base = options.min !== null ? options.min : 0;
- aboveMin = value - base;
-
- // - round to the nearest step
- aboveMin = Math.round( aboveMin / options.step ) * options.step;
-
- // - rounding is based on 0, so adjust back to our base
- value = base + aboveMin;
-
- // Fix precision from bad JS floating point math
- value = parseFloat( value.toFixed( this._precision() ) );
-
- // Clamp the value
- if ( options.max !== null && value > options.max ) {
- return options.max;
- }
- if ( options.min !== null && value < options.min ) {
- return options.min;
- }
-
- return value;
- },
-
- _stop: function( event ) {
- if ( !this.spinning ) {
- return;
- }
-
- clearTimeout( this.timer );
- clearTimeout( this.mousewheelTimer );
- this.counter = 0;
- this.spinning = false;
- this._trigger( "stop", event );
- },
-
- _setOption: function( key, value ) {
- var prevValue, first, last;
-
- if ( key === "culture" || key === "numberFormat" ) {
- prevValue = this._parse( this.element.val() );
- this.options[ key ] = value;
- this.element.val( this._format( prevValue ) );
- return;
- }
-
- if ( key === "max" || key === "min" || key === "step" ) {
- if ( typeof value === "string" ) {
- value = this._parse( value );
- }
- }
- if ( key === "icons" ) {
- first = this.buttons.first().find( ".ui-icon" );
- this._removeClass( first, null, this.options.icons.up );
- this._addClass( first, null, value.up );
- last = this.buttons.last().find( ".ui-icon" );
- this._removeClass( last, null, this.options.icons.down );
- this._addClass( last, null, value.down );
- }
-
- this._super( key, value );
- },
-
- _setOptionDisabled: function( value ) {
- this._super( value );
-
- this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value );
- this.element.prop( "disabled", !!value );
- this.buttons.button( value ? "disable" : "enable" );
- },
-
- _setOptions: spinnerModifer( function( options ) {
- this._super( options );
- } ),
-
- _parse: function( val ) {
- if ( typeof val === "string" && val !== "" ) {
- val = window.Globalize && this.options.numberFormat ?
- Globalize.parseFloat( val, 10, this.options.culture ) : +val;
- }
- return val === "" || isNaN( val ) ? null : val;
- },
-
- _format: function( value ) {
- if ( value === "" ) {
- return "";
- }
- return window.Globalize && this.options.numberFormat ?
- Globalize.format( value, this.options.numberFormat, this.options.culture ) :
- value;
- },
-
- _refresh: function() {
- this.element.attr( {
- "aria-valuemin": this.options.min,
- "aria-valuemax": this.options.max,
-
- // TODO: what should we do with values that can't be parsed?
- "aria-valuenow": this._parse( this.element.val() )
- } );
- },
-
- isValid: function() {
- var value = this.value();
-
- // Null is invalid
- if ( value === null ) {
- return false;
- }
-
- // If value gets adjusted, it's invalid
- return value === this._adjustValue( value );
- },
-
- // Update the value without triggering change
- _value: function( value, allowAny ) {
- var parsed;
- if ( value !== "" ) {
- parsed = this._parse( value );
- if ( parsed !== null ) {
- if ( !allowAny ) {
- parsed = this._adjustValue( parsed );
- }
- value = this._format( parsed );
- }
- }
- this.element.val( value );
- this._refresh();
- },
-
- _destroy: function() {
- this.element
- .prop( "disabled", false )
- .removeAttr( "autocomplete role aria-valuemin aria-valuemax aria-valuenow" );
-
- this.uiSpinner.replaceWith( this.element );
- },
-
- stepUp: spinnerModifer( function( steps ) {
- this._stepUp( steps );
- } ),
- _stepUp: function( steps ) {
- if ( this._start() ) {
- this._spin( ( steps || 1 ) * this.options.step );
- this._stop();
- }
- },
-
- stepDown: spinnerModifer( function( steps ) {
- this._stepDown( steps );
- } ),
- _stepDown: function( steps ) {
- if ( this._start() ) {
- this._spin( ( steps || 1 ) * -this.options.step );
- this._stop();
- }
- },
-
- pageUp: spinnerModifer( function( pages ) {
- this._stepUp( ( pages || 1 ) * this.options.page );
- } ),
-
- pageDown: spinnerModifer( function( pages ) {
- this._stepDown( ( pages || 1 ) * this.options.page );
- } ),
-
- value: function( newVal ) {
- if ( !arguments.length ) {
- return this._parse( this.element.val() );
- }
- spinnerModifer( this._value ).call( this, newVal );
- },
-
- widget: function() {
- return this.uiSpinner;
- }
-} );
-
-// DEPRECATED
-// TODO: switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for spinner html extension points
- $.widget( "ui.spinner", $.ui.spinner, {
- _enhance: function() {
- this.uiSpinner = this.element
- .attr( "autocomplete", "off" )
- .wrap( this._uiSpinnerHtml() )
- .parent()
-
- // Add buttons
- .append( this._buttonHtml() );
- },
- _uiSpinnerHtml: function() {
- return "<span>";
- },
-
- _buttonHtml: function() {
- return "<a></a><a></a>";
- }
- } );
-}
-
-var widgetsSpinner = $.ui.spinner;
-
-
-/*!
- * jQuery UI Tabs 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Tabs
-//>>group: Widgets
-//>>description: Transforms a set of container elements into a tab structure.
-//>>docs: http://api.jqueryui.com/tabs/
-//>>demos: http://jqueryui.com/tabs/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/tabs.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.tabs", {
- version: "1.12.1",
- delay: 300,
- options: {
- active: null,
- classes: {
- "ui-tabs": "ui-corner-all",
- "ui-tabs-nav": "ui-corner-all",
- "ui-tabs-panel": "ui-corner-bottom",
- "ui-tabs-tab": "ui-corner-top"
- },
- collapsible: false,
- event: "click",
- heightStyle: "content",
- hide: null,
- show: null,
-
- // Callbacks
- activate: null,
- beforeActivate: null,
- beforeLoad: null,
- load: null
- },
-
- _isLocal: ( function() {
- var rhash = /#.*$/;
-
- return function( anchor ) {
- var anchorUrl, locationUrl;
-
- anchorUrl = anchor.href.replace( rhash, "" );
- locationUrl = location.href.replace( rhash, "" );
-
- // Decoding may throw an error if the URL isn't UTF-8 (#9518)
- try {
- anchorUrl = decodeURIComponent( anchorUrl );
- } catch ( error ) {}
- try {
- locationUrl = decodeURIComponent( locationUrl );
- } catch ( error ) {}
-
- return anchor.hash.length > 1 && anchorUrl === locationUrl;
- };
- } )(),
-
- _create: function() {
- var that = this,
- options = this.options;
-
- this.running = false;
-
- this._addClass( "ui-tabs", "ui-widget ui-widget-content" );
- this._toggleClass( "ui-tabs-collapsible", null, options.collapsible );
-
- this._processTabs();
- options.active = this._initialActive();
-
- // Take disabling tabs via class attribute from HTML
- // into account and update option properly.
- if ( $.isArray( options.disabled ) ) {
- options.disabled = $.unique( options.disabled.concat(
- $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
- return that.tabs.index( li );
- } )
- ) ).sort();
- }
-
- // Check for length avoids error when initializing empty list
- if ( this.options.active !== false && this.anchors.length ) {
- this.active = this._findActive( options.active );
- } else {
- this.active = $();
- }
-
- this._refresh();
-
- if ( this.active.length ) {
- this.load( options.active );
- }
- },
-
- _initialActive: function() {
- var active = this.options.active,
- collapsible = this.options.collapsible,
- locationHash = location.hash.substring( 1 );
-
- if ( active === null ) {
-
- // check the fragment identifier in the URL
- if ( locationHash ) {
- this.tabs.each( function( i, tab ) {
- if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
- active = i;
- return false;
- }
- } );
- }
-
- // Check for a tab marked active via a class
- if ( active === null ) {
- active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
- }
-
- // No active tab, set to false
- if ( active === null || active === -1 ) {
- active = this.tabs.length ? 0 : false;
- }
- }
-
- // Handle numbers: negative, out of range
- if ( active !== false ) {
- active = this.tabs.index( this.tabs.eq( active ) );
- if ( active === -1 ) {
- active = collapsible ? false : 0;
- }
- }
-
- // Don't allow collapsible: false and active: false
- if ( !collapsible && active === false && this.anchors.length ) {
- active = 0;
- }
-
- return active;
- },
-
- _getCreateEventData: function() {
- return {
- tab: this.active,
- panel: !this.active.length ? $() : this._getPanelForTab( this.active )
- };
- },
-
- _tabKeydown: function( event ) {
- var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ),
- selectedIndex = this.tabs.index( focusedTab ),
- goingForward = true;
-
- if ( this._handlePageNav( event ) ) {
- return;
- }
-
- switch ( event.keyCode ) {
- case $.ui.keyCode.RIGHT:
- case $.ui.keyCode.DOWN:
- selectedIndex++;
- break;
- case $.ui.keyCode.UP:
- case $.ui.keyCode.LEFT:
- goingForward = false;
- selectedIndex--;
- break;
- case $.ui.keyCode.END:
- selectedIndex = this.anchors.length - 1;
- break;
- case $.ui.keyCode.HOME:
- selectedIndex = 0;
- break;
- case $.ui.keyCode.SPACE:
-
- // Activate only, no collapsing
- event.preventDefault();
- clearTimeout( this.activating );
- this._activate( selectedIndex );
- return;
- case $.ui.keyCode.ENTER:
-
- // Toggle (cancel delayed activation, allow collapsing)
- event.preventDefault();
- clearTimeout( this.activating );
-
- // Determine if we should collapse or activate
- this._activate( selectedIndex === this.options.active ? false : selectedIndex );
- return;
- default:
- return;
- }
-
- // Focus the appropriate tab, based on which key was pressed
- event.preventDefault();
- clearTimeout( this.activating );
- selectedIndex = this._focusNextTab( selectedIndex, goingForward );
-
- // Navigating with control/command key will prevent automatic activation
- if ( !event.ctrlKey && !event.metaKey ) {
-
- // Update aria-selected immediately so that AT think the tab is already selected.
- // Otherwise AT may confuse the user by stating that they need to activate the tab,
- // but the tab will already be activated by the time the announcement finishes.
- focusedTab.attr( "aria-selected", "false" );
- this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
-
- this.activating = this._delay( function() {
- this.option( "active", selectedIndex );
- }, this.delay );
- }
- },
-
- _panelKeydown: function( event ) {
- if ( this._handlePageNav( event ) ) {
- return;
- }
-
- // Ctrl+up moves focus to the current tab
- if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
- event.preventDefault();
- this.active.trigger( "focus" );
- }
- },
-
- // Alt+page up/down moves focus to the previous/next tab (and activates)
- _handlePageNav: function( event ) {
- if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
- this._activate( this._focusNextTab( this.options.active - 1, false ) );
- return true;
- }
- if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
- this._activate( this._focusNextTab( this.options.active + 1, true ) );
- return true;
- }
- },
-
- _findNextTab: function( index, goingForward ) {
- var lastTabIndex = this.tabs.length - 1;
-
- function constrain() {
- if ( index > lastTabIndex ) {
- index = 0;
- }
- if ( index < 0 ) {
- index = lastTabIndex;
- }
- return index;
- }
-
- while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
- index = goingForward ? index + 1 : index - 1;
- }
-
- return index;
- },
-
- _focusNextTab: function( index, goingForward ) {
- index = this._findNextTab( index, goingForward );
- this.tabs.eq( index ).trigger( "focus" );
- return index;
- },
-
- _setOption: function( key, value ) {
- if ( key === "active" ) {
-
- // _activate() will handle invalid values and update this.options
- this._activate( value );
- return;
- }
-
- this._super( key, value );
-
- if ( key === "collapsible" ) {
- this._toggleClass( "ui-tabs-collapsible", null, value );
-
- // Setting collapsible: false while collapsed; open first panel
- if ( !value && this.options.active === false ) {
- this._activate( 0 );
- }
- }
-
- if ( key === "event" ) {
- this._setupEvents( value );
- }
-
- if ( key === "heightStyle" ) {
- this._setupHeightStyle( value );
- }
- },
-
- _sanitizeSelector: function( hash ) {
- return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
- },
-
- refresh: function() {
- var options = this.options,
- lis = this.tablist.children( ":has(a[href])" );
-
- // Get disabled tabs from class attribute from HTML
- // this will get converted to a boolean if needed in _refresh()
- options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
- return lis.index( tab );
- } );
-
- this._processTabs();
-
- // Was collapsed or no tabs
- if ( options.active === false || !this.anchors.length ) {
- options.active = false;
- this.active = $();
-
- // was active, but active tab is gone
- } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
-
- // all remaining tabs are disabled
- if ( this.tabs.length === options.disabled.length ) {
- options.active = false;
- this.active = $();
-
- // activate previous tab
- } else {
- this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
- }
-
- // was active, active tab still exists
- } else {
-
- // make sure active index is correct
- options.active = this.tabs.index( this.active );
- }
-
- this._refresh();
- },
-
- _refresh: function() {
- this._setOptionDisabled( this.options.disabled );
- this._setupEvents( this.options.event );
- this._setupHeightStyle( this.options.heightStyle );
-
- this.tabs.not( this.active ).attr( {
- "aria-selected": "false",
- "aria-expanded": "false",
- tabIndex: -1
- } );
- this.panels.not( this._getPanelForTab( this.active ) )
- .hide()
- .attr( {
- "aria-hidden": "true"
- } );
-
- // Make sure one tab is in the tab order
- if ( !this.active.length ) {
- this.tabs.eq( 0 ).attr( "tabIndex", 0 );
- } else {
- this.active
- .attr( {
- "aria-selected": "true",
- "aria-expanded": "true",
- tabIndex: 0
- } );
- this._addClass( this.active, "ui-tabs-active", "ui-state-active" );
- this._getPanelForTab( this.active )
- .show()
- .attr( {
- "aria-hidden": "false"
- } );
- }
- },
-
- _processTabs: function() {
- var that = this,
- prevTabs = this.tabs,
- prevAnchors = this.anchors,
- prevPanels = this.panels;
-
- this.tablist = this._getList().attr( "role", "tablist" );
- this._addClass( this.tablist, "ui-tabs-nav",
- "ui-helper-reset ui-helper-clearfix ui-widget-header" );
-
- // Prevent users from focusing disabled tabs via click
- this.tablist
- .on( "mousedown" + this.eventNamespace, "> li", function( event ) {
- if ( $( this ).is( ".ui-state-disabled" ) ) {
- event.preventDefault();
- }
- } )
-
- // Support: IE <9
- // Preventing the default action in mousedown doesn't prevent IE
- // from focusing the element, so if the anchor gets focused, blur.
- // We don't have to worry about focusing the previously focused
- // element since clicking on a non-focusable element should focus
- // the body anyway.
- .on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() {
- if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
- this.blur();
- }
- } );
-
- this.tabs = this.tablist.find( "> li:has(a[href])" )
- .attr( {
- role: "tab",
- tabIndex: -1
- } );
- this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" );
-
- this.anchors = this.tabs.map( function() {
- return $( "a", this )[ 0 ];
- } )
- .attr( {
- role: "presentation",
- tabIndex: -1
- } );
- this._addClass( this.anchors, "ui-tabs-anchor" );
-
- this.panels = $();
-
- this.anchors.each( function( i, anchor ) {
- var selector, panel, panelId,
- anchorId = $( anchor ).uniqueId().attr( "id" ),
- tab = $( anchor ).closest( "li" ),
- originalAriaControls = tab.attr( "aria-controls" );
-
- // Inline tab
- if ( that._isLocal( anchor ) ) {
- selector = anchor.hash;
- panelId = selector.substring( 1 );
- panel = that.element.find( that._sanitizeSelector( selector ) );
-
- // remote tab
- } else {
-
- // If the tab doesn't already have aria-controls,
- // generate an id by using a throw-away element
- panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id;
- selector = "#" + panelId;
- panel = that.element.find( selector );
- if ( !panel.length ) {
- panel = that._createPanel( panelId );
- panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
- }
- panel.attr( "aria-live", "polite" );
- }
-
- if ( panel.length ) {
- that.panels = that.panels.add( panel );
- }
- if ( originalAriaControls ) {
- tab.data( "ui-tabs-aria-controls", originalAriaControls );
- }
- tab.attr( {
- "aria-controls": panelId,
- "aria-labelledby": anchorId
- } );
- panel.attr( "aria-labelledby", anchorId );
- } );
-
- this.panels.attr( "role", "tabpanel" );
- this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" );
-
- // Avoid memory leaks (#10056)
- if ( prevTabs ) {
- this._off( prevTabs.not( this.tabs ) );
- this._off( prevAnchors.not( this.anchors ) );
- this._off( prevPanels.not( this.panels ) );
- }
- },
-
- // Allow overriding how to find the list for rare usage scenarios (#7715)
- _getList: function() {
- return this.tablist || this.element.find( "ol, ul" ).eq( 0 );
- },
-
- _createPanel: function( id ) {
- return $( "<div>" )
- .attr( "id", id )
- .data( "ui-tabs-destroy", true );
- },
-
- _setOptionDisabled: function( disabled ) {
- var currentItem, li, i;
-
- if ( $.isArray( disabled ) ) {
- if ( !disabled.length ) {
- disabled = false;
- } else if ( disabled.length === this.anchors.length ) {
- disabled = true;
- }
- }
-
- // Disable tabs
- for ( i = 0; ( li = this.tabs[ i ] ); i++ ) {
- currentItem = $( li );
- if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
- currentItem.attr( "aria-disabled", "true" );
- this._addClass( currentItem, null, "ui-state-disabled" );
- } else {
- currentItem.removeAttr( "aria-disabled" );
- this._removeClass( currentItem, null, "ui-state-disabled" );
- }
- }
-
- this.options.disabled = disabled;
-
- this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null,
- disabled === true );
- },
-
- _setupEvents: function( event ) {
- var events = {};
- if ( event ) {
- $.each( event.split( " " ), function( index, eventName ) {
- events[ eventName ] = "_eventHandler";
- } );
- }
-
- this._off( this.anchors.add( this.tabs ).add( this.panels ) );
-
- // Always prevent the default action, even when disabled
- this._on( true, this.anchors, {
- click: function( event ) {
- event.preventDefault();
- }
- } );
- this._on( this.anchors, events );
- this._on( this.tabs, { keydown: "_tabKeydown" } );
- this._on( this.panels, { keydown: "_panelKeydown" } );
-
- this._focusable( this.tabs );
- this._hoverable( this.tabs );
- },
-
- _setupHeightStyle: function( heightStyle ) {
- var maxHeight,
- parent = this.element.parent();
-
- if ( heightStyle === "fill" ) {
- maxHeight = parent.height();
- maxHeight -= this.element.outerHeight() - this.element.height();
-
- this.element.siblings( ":visible" ).each( function() {
- var elem = $( this ),
- position = elem.css( "position" );
-
- if ( position === "absolute" || position === "fixed" ) {
- return;
- }
- maxHeight -= elem.outerHeight( true );
- } );
-
- this.element.children().not( this.panels ).each( function() {
- maxHeight -= $( this ).outerHeight( true );
- } );
-
- this.panels.each( function() {
- $( this ).height( Math.max( 0, maxHeight -
- $( this ).innerHeight() + $( this ).height() ) );
- } )
- .css( "overflow", "auto" );
- } else if ( heightStyle === "auto" ) {
- maxHeight = 0;
- this.panels.each( function() {
- maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
- } ).height( maxHeight );
- }
- },
-
- _eventHandler: function( event ) {
- var options = this.options,
- active = this.active,
- anchor = $( event.currentTarget ),
- tab = anchor.closest( "li" ),
- clickedIsActive = tab[ 0 ] === active[ 0 ],
- collapsing = clickedIsActive && options.collapsible,
- toShow = collapsing ? $() : this._getPanelForTab( tab ),
- toHide = !active.length ? $() : this._getPanelForTab( active ),
- eventData = {
- oldTab: active,
- oldPanel: toHide,
- newTab: collapsing ? $() : tab,
- newPanel: toShow
- };
-
- event.preventDefault();
-
- if ( tab.hasClass( "ui-state-disabled" ) ||
-
- // tab is already loading
- tab.hasClass( "ui-tabs-loading" ) ||
-
- // can't switch durning an animation
- this.running ||
-
- // click on active header, but not collapsible
- ( clickedIsActive && !options.collapsible ) ||
-
- // allow canceling activation
- ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
- return;
- }
-
- options.active = collapsing ? false : this.tabs.index( tab );
-
- this.active = clickedIsActive ? $() : tab;
- if ( this.xhr ) {
- this.xhr.abort();
- }
-
- if ( !toHide.length && !toShow.length ) {
- $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
- }
-
- if ( toShow.length ) {
- this.load( this.tabs.index( tab ), event );
- }
- this._toggle( event, eventData );
- },
-
- // Handles show/hide for selecting tabs
- _toggle: function( event, eventData ) {
- var that = this,
- toShow = eventData.newPanel,
- toHide = eventData.oldPanel;
-
- this.running = true;
-
- function complete() {
- that.running = false;
- that._trigger( "activate", event, eventData );
- }
-
- function show() {
- that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" );
-
- if ( toShow.length && that.options.show ) {
- that._show( toShow, that.options.show, complete );
- } else {
- toShow.show();
- complete();
- }
- }
-
- // Start out by hiding, then showing, then completing
- if ( toHide.length && this.options.hide ) {
- this._hide( toHide, this.options.hide, function() {
- that._removeClass( eventData.oldTab.closest( "li" ),
- "ui-tabs-active", "ui-state-active" );
- show();
- } );
- } else {
- this._removeClass( eventData.oldTab.closest( "li" ),
- "ui-tabs-active", "ui-state-active" );
- toHide.hide();
- show();
- }
-
- toHide.attr( "aria-hidden", "true" );
- eventData.oldTab.attr( {
- "aria-selected": "false",
- "aria-expanded": "false"
- } );
-
- // If we're switching tabs, remove the old tab from the tab order.
- // If we're opening from collapsed state, remove the previous tab from the tab order.
- // If we're collapsing, then keep the collapsing tab in the tab order.
- if ( toShow.length && toHide.length ) {
- eventData.oldTab.attr( "tabIndex", -1 );
- } else if ( toShow.length ) {
- this.tabs.filter( function() {
- return $( this ).attr( "tabIndex" ) === 0;
- } )
- .attr( "tabIndex", -1 );
- }
-
- toShow.attr( "aria-hidden", "false" );
- eventData.newTab.attr( {
- "aria-selected": "true",
- "aria-expanded": "true",
- tabIndex: 0
- } );
- },
-
- _activate: function( index ) {
- var anchor,
- active = this._findActive( index );
-
- // Trying to activate the already active panel
- if ( active[ 0 ] === this.active[ 0 ] ) {
- return;
- }
-
- // Trying to collapse, simulate a click on the current active header
- if ( !active.length ) {
- active = this.active;
- }
-
- anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
- this._eventHandler( {
- target: anchor,
- currentTarget: anchor,
- preventDefault: $.noop
- } );
- },
-
- _findActive: function( index ) {
- return index === false ? $() : this.tabs.eq( index );
- },
-
- _getIndex: function( index ) {
-
- // meta-function to give users option to provide a href string instead of a numerical index.
- if ( typeof index === "string" ) {
- index = this.anchors.index( this.anchors.filter( "[href$='" +
- $.ui.escapeSelector( index ) + "']" ) );
- }
-
- return index;
- },
-
- _destroy: function() {
- if ( this.xhr ) {
- this.xhr.abort();
- }
-
- this.tablist
- .removeAttr( "role" )
- .off( this.eventNamespace );
-
- this.anchors
- .removeAttr( "role tabIndex" )
- .removeUniqueId();
-
- this.tabs.add( this.panels ).each( function() {
- if ( $.data( this, "ui-tabs-destroy" ) ) {
- $( this ).remove();
- } else {
- $( this ).removeAttr( "role tabIndex " +
- "aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" );
- }
- } );
-
- this.tabs.each( function() {
- var li = $( this ),
- prev = li.data( "ui-tabs-aria-controls" );
- if ( prev ) {
- li
- .attr( "aria-controls", prev )
- .removeData( "ui-tabs-aria-controls" );
- } else {
- li.removeAttr( "aria-controls" );
- }
- } );
-
- this.panels.show();
-
- if ( this.options.heightStyle !== "content" ) {
- this.panels.css( "height", "" );
- }
- },
-
- enable: function( index ) {
- var disabled = this.options.disabled;
- if ( disabled === false ) {
- return;
- }
-
- if ( index === undefined ) {
- disabled = false;
- } else {
- index = this._getIndex( index );
- if ( $.isArray( disabled ) ) {
- disabled = $.map( disabled, function( num ) {
- return num !== index ? num : null;
- } );
- } else {
- disabled = $.map( this.tabs, function( li, num ) {
- return num !== index ? num : null;
- } );
- }
- }
- this._setOptionDisabled( disabled );
- },
-
- disable: function( index ) {
- var disabled = this.options.disabled;
- if ( disabled === true ) {
- return;
- }
-
- if ( index === undefined ) {
- disabled = true;
- } else {
- index = this._getIndex( index );
- if ( $.inArray( index, disabled ) !== -1 ) {
- return;
- }
- if ( $.isArray( disabled ) ) {
- disabled = $.merge( [ index ], disabled ).sort();
- } else {
- disabled = [ index ];
- }
- }
- this._setOptionDisabled( disabled );
- },
-
- load: function( index, event ) {
- index = this._getIndex( index );
- var that = this,
- tab = this.tabs.eq( index ),
- anchor = tab.find( ".ui-tabs-anchor" ),
- panel = this._getPanelForTab( tab ),
- eventData = {
- tab: tab,
- panel: panel
- },
- complete = function( jqXHR, status ) {
- if ( status === "abort" ) {
- that.panels.stop( false, true );
- }
-
- that._removeClass( tab, "ui-tabs-loading" );
- panel.removeAttr( "aria-busy" );
-
- if ( jqXHR === that.xhr ) {
- delete that.xhr;
- }
- };
-
- // Not remote
- if ( this._isLocal( anchor[ 0 ] ) ) {
- return;
- }
-
- this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
-
- // Support: jQuery <1.8
- // jQuery <1.8 returns false if the request is canceled in beforeSend,
- // but as of 1.8, $.ajax() always returns a jqXHR object.
- if ( this.xhr && this.xhr.statusText !== "canceled" ) {
- this._addClass( tab, "ui-tabs-loading" );
- panel.attr( "aria-busy", "true" );
-
- this.xhr
- .done( function( response, status, jqXHR ) {
-
- // support: jQuery <1.8
- // http://bugs.jquery.com/ticket/11778
- setTimeout( function() {
- panel.html( response );
- that._trigger( "load", event, eventData );
-
- complete( jqXHR, status );
- }, 1 );
- } )
- .fail( function( jqXHR, status ) {
-
- // support: jQuery <1.8
- // http://bugs.jquery.com/ticket/11778
- setTimeout( function() {
- complete( jqXHR, status );
- }, 1 );
- } );
- }
- },
-
- _ajaxSettings: function( anchor, event, eventData ) {
- var that = this;
- return {
-
- // Support: IE <11 only
- // Strip any hash that exists to prevent errors with the Ajax request
- url: anchor.attr( "href" ).replace( /#.*$/, "" ),
- beforeSend: function( jqXHR, settings ) {
- return that._trigger( "beforeLoad", event,
- $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );
- }
- };
- },
-
- _getPanelForTab: function( tab ) {
- var id = $( tab ).attr( "aria-controls" );
- return this.element.find( this._sanitizeSelector( "#" + id ) );
- }
-} );
-
-// DEPRECATED
-// TODO: Switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for ui-tab class (now ui-tabs-tab)
- $.widget( "ui.tabs", $.ui.tabs, {
- _processTabs: function() {
- this._superApply( arguments );
- this._addClass( this.tabs, "ui-tab" );
- }
- } );
-}
-
-var widgetsTabs = $.ui.tabs;
-
-
-/*!
- * jQuery UI Tooltip 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Tooltip
-//>>group: Widgets
-//>>description: Shows additional information for any element on hover or focus.
-//>>docs: http://api.jqueryui.com/tooltip/
-//>>demos: http://jqueryui.com/tooltip/
-//>>css.structure: ../../themes/base/core.css
-//>>css.structure: ../../themes/base/tooltip.css
-//>>css.theme: ../../themes/base/theme.css
-
-
-
-$.widget( "ui.tooltip", {
- version: "1.12.1",
- options: {
- classes: {
- "ui-tooltip": "ui-corner-all ui-widget-shadow"
- },
- content: function() {
-
- // support: IE<9, Opera in jQuery <1.7
- // .text() can't accept undefined, so coerce to a string
- var title = $( this ).attr( "title" ) || "";
-
- // Escape title, since we're going from an attribute to raw HTML
- return $( "<a>" ).text( title ).html();
- },
- hide: true,
-
- // Disabled elements have inconsistent behavior across browsers (#8661)
- items: "[title]:not([disabled])",
- position: {
- my: "left top+15",
- at: "left bottom",
- collision: "flipfit flip"
- },
- show: true,
- track: false,
-
- // Callbacks
- close: null,
- open: null
- },
-
- _addDescribedBy: function( elem, id ) {
- var describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ );
- describedby.push( id );
- elem
- .data( "ui-tooltip-id", id )
- .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
- },
-
- _removeDescribedBy: function( elem ) {
- var id = elem.data( "ui-tooltip-id" ),
- describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ),
- index = $.inArray( id, describedby );
-
- if ( index !== -1 ) {
- describedby.splice( index, 1 );
- }
-
- elem.removeData( "ui-tooltip-id" );
- describedby = $.trim( describedby.join( " " ) );
- if ( describedby ) {
- elem.attr( "aria-describedby", describedby );
- } else {
- elem.removeAttr( "aria-describedby" );
- }
- },
-
- _create: function() {
- this._on( {
- mouseover: "open",
- focusin: "open"
- } );
-
- // IDs of generated tooltips, needed for destroy
- this.tooltips = {};
-
- // IDs of parent tooltips where we removed the title attribute
- this.parents = {};
-
- // Append the aria-live region so tooltips announce correctly
- this.liveRegion = $( "<div>" )
- .attr( {
- role: "log",
- "aria-live": "assertive",
- "aria-relevant": "additions"
- } )
- .appendTo( this.document[ 0 ].body );
- this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" );
-
- this.disabledTitles = $( [] );
- },
-
- _setOption: function( key, value ) {
- var that = this;
-
- this._super( key, value );
-
- if ( key === "content" ) {
- $.each( this.tooltips, function( id, tooltipData ) {
- that._updateContent( tooltipData.element );
- } );
- }
- },
-
- _setOptionDisabled: function( value ) {
- this[ value ? "_disable" : "_enable" ]();
- },
-
- _disable: function() {
- var that = this;
-
- // Close open tooltips
- $.each( this.tooltips, function( id, tooltipData ) {
- var event = $.Event( "blur" );
- event.target = event.currentTarget = tooltipData.element[ 0 ];
- that.close( event, true );
- } );
-
- // Remove title attributes to prevent native tooltips
- this.disabledTitles = this.disabledTitles.add(
- this.element.find( this.options.items ).addBack()
- .filter( function() {
- var element = $( this );
- if ( element.is( "[title]" ) ) {
- return element
- .data( "ui-tooltip-title", element.attr( "title" ) )
- .removeAttr( "title" );
- }
- } )
- );
- },
-
- _enable: function() {
-
- // restore title attributes
- this.disabledTitles.each( function() {
- var element = $( this );
- if ( element.data( "ui-tooltip-title" ) ) {
- element.attr( "title", element.data( "ui-tooltip-title" ) );
- }
- } );
- this.disabledTitles = $( [] );
- },
-
- open: function( event ) {
- var that = this,
- target = $( event ? event.target : this.element )
-
- // we need closest here due to mouseover bubbling,
- // but always pointing at the same event target
- .closest( this.options.items );
-
- // No element to show a tooltip for or the tooltip is already open
- if ( !target.length || target.data( "ui-tooltip-id" ) ) {
- return;
- }
-
- if ( target.attr( "title" ) ) {
- target.data( "ui-tooltip-title", target.attr( "title" ) );
- }
-
- target.data( "ui-tooltip-open", true );
-
- // Kill parent tooltips, custom or native, for hover
- if ( event && event.type === "mouseover" ) {
- target.parents().each( function() {
- var parent = $( this ),
- blurEvent;
- if ( parent.data( "ui-tooltip-open" ) ) {
- blurEvent = $.Event( "blur" );
- blurEvent.target = blurEvent.currentTarget = this;
- that.close( blurEvent, true );
- }
- if ( parent.attr( "title" ) ) {
- parent.uniqueId();
- that.parents[ this.id ] = {
- element: this,
- title: parent.attr( "title" )
- };
- parent.attr( "title", "" );
- }
- } );
- }
-
- this._registerCloseHandlers( event, target );
- this._updateContent( target, event );
- },
-
- _updateContent: function( target, event ) {
- var content,
- contentOption = this.options.content,
- that = this,
- eventType = event ? event.type : null;
-
- if ( typeof contentOption === "string" || contentOption.nodeType ||
- contentOption.jquery ) {
- return this._open( event, target, contentOption );
- }
-
- content = contentOption.call( target[ 0 ], function( response ) {
-
- // IE may instantly serve a cached response for ajax requests
- // delay this call to _open so the other call to _open runs first
- that._delay( function() {
-
- // Ignore async response if tooltip was closed already
- if ( !target.data( "ui-tooltip-open" ) ) {
- return;
- }
-
- // JQuery creates a special event for focusin when it doesn't
- // exist natively. To improve performance, the native event
- // object is reused and the type is changed. Therefore, we can't
- // rely on the type being correct after the event finished
- // bubbling, so we set it back to the previous value. (#8740)
- if ( event ) {
- event.type = eventType;
- }
- this._open( event, target, response );
- } );
- } );
- if ( content ) {
- this._open( event, target, content );
- }
- },
-
- _open: function( event, target, content ) {
- var tooltipData, tooltip, delayedShow, a11yContent,
- positionOption = $.extend( {}, this.options.position );
-
- if ( !content ) {
- return;
- }
-
- // Content can be updated multiple times. If the tooltip already
- // exists, then just update the content and bail.
- tooltipData = this._find( target );
- if ( tooltipData ) {
- tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content );
- return;
- }
-
- // If we have a title, clear it to prevent the native tooltip
- // we have to check first to avoid defining a title if none exists
- // (we don't want to cause an element to start matching [title])
- //
- // We use removeAttr only for key events, to allow IE to export the correct
- // accessible attributes. For mouse events, set to empty string to avoid
- // native tooltip showing up (happens only when removing inside mouseover).
- if ( target.is( "[title]" ) ) {
- if ( event && event.type === "mouseover" ) {
- target.attr( "title", "" );
- } else {
- target.removeAttr( "title" );
- }
- }
-
- tooltipData = this._tooltip( target );
- tooltip = tooltipData.tooltip;
- this._addDescribedBy( target, tooltip.attr( "id" ) );
- tooltip.find( ".ui-tooltip-content" ).html( content );
-
- // Support: Voiceover on OS X, JAWS on IE <= 9
- // JAWS announces deletions even when aria-relevant="additions"
- // Voiceover will sometimes re-read the entire log region's contents from the beginning
- this.liveRegion.children().hide();
- a11yContent = $( "<div>" ).html( tooltip.find( ".ui-tooltip-content" ).html() );
- a11yContent.removeAttr( "name" ).find( "[name]" ).removeAttr( "name" );
- a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" );
- a11yContent.appendTo( this.liveRegion );
-
- function position( event ) {
- positionOption.of = event;
- if ( tooltip.is( ":hidden" ) ) {
- return;
- }
- tooltip.position( positionOption );
- }
- if ( this.options.track && event && /^mouse/.test( event.type ) ) {
- this._on( this.document, {
- mousemove: position
- } );
-
- // trigger once to override element-relative positioning
- position( event );
- } else {
- tooltip.position( $.extend( {
- of: target
- }, this.options.position ) );
- }
-
- tooltip.hide();
-
- this._show( tooltip, this.options.show );
-
- // Handle tracking tooltips that are shown with a delay (#8644). As soon
- // as the tooltip is visible, position the tooltip using the most recent
- // event.
- // Adds the check to add the timers only when both delay and track options are set (#14682)
- if ( this.options.track && this.options.show && this.options.show.delay ) {
- delayedShow = this.delayedShow = setInterval( function() {
- if ( tooltip.is( ":visible" ) ) {
- position( positionOption.of );
- clearInterval( delayedShow );
- }
- }, $.fx.interval );
- }
-
- this._trigger( "open", event, { tooltip: tooltip } );
- },
-
- _registerCloseHandlers: function( event, target ) {
- var events = {
- keyup: function( event ) {
- if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
- var fakeEvent = $.Event( event );
- fakeEvent.currentTarget = target[ 0 ];
- this.close( fakeEvent, true );
- }
- }
- };
-
- // Only bind remove handler for delegated targets. Non-delegated
- // tooltips will handle this in destroy.
- if ( target[ 0 ] !== this.element[ 0 ] ) {
- events.remove = function() {
- this._removeTooltip( this._find( target ).tooltip );
- };
- }
-
- if ( !event || event.type === "mouseover" ) {
- events.mouseleave = "close";
- }
- if ( !event || event.type === "focusin" ) {
- events.focusout = "close";
- }
- this._on( true, target, events );
- },
-
- close: function( event ) {
- var tooltip,
- that = this,
- target = $( event ? event.currentTarget : this.element ),
- tooltipData = this._find( target );
-
- // The tooltip may already be closed
- if ( !tooltipData ) {
-
- // We set ui-tooltip-open immediately upon open (in open()), but only set the
- // additional data once there's actually content to show (in _open()). So even if the
- // tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in
- // the period between open() and _open().
- target.removeData( "ui-tooltip-open" );
- return;
- }
-
- tooltip = tooltipData.tooltip;
-
- // Disabling closes the tooltip, so we need to track when we're closing
- // to avoid an infinite loop in case the tooltip becomes disabled on close
- if ( tooltipData.closing ) {
- return;
- }
-
- // Clear the interval for delayed tracking tooltips
- clearInterval( this.delayedShow );
-
- // Only set title if we had one before (see comment in _open())
- // If the title attribute has changed since open(), don't restore
- if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) {
- target.attr( "title", target.data( "ui-tooltip-title" ) );
- }
-
- this._removeDescribedBy( target );
-
- tooltipData.hiding = true;
- tooltip.stop( true );
- this._hide( tooltip, this.options.hide, function() {
- that._removeTooltip( $( this ) );
- } );
-
- target.removeData( "ui-tooltip-open" );
- this._off( target, "mouseleave focusout keyup" );
-
- // Remove 'remove' binding only on delegated targets
- if ( target[ 0 ] !== this.element[ 0 ] ) {
- this._off( target, "remove" );
- }
- this._off( this.document, "mousemove" );
-
- if ( event && event.type === "mouseleave" ) {
- $.each( this.parents, function( id, parent ) {
- $( parent.element ).attr( "title", parent.title );
- delete that.parents[ id ];
- } );
- }
-
- tooltipData.closing = true;
- this._trigger( "close", event, { tooltip: tooltip } );
- if ( !tooltipData.hiding ) {
- tooltipData.closing = false;
- }
- },
-
- _tooltip: function( element ) {
- var tooltip = $( "<div>" ).attr( "role", "tooltip" ),
- content = $( "<div>" ).appendTo( tooltip ),
- id = tooltip.uniqueId().attr( "id" );
-
- this._addClass( content, "ui-tooltip-content" );
- this._addClass( tooltip, "ui-tooltip", "ui-widget ui-widget-content" );
-
- tooltip.appendTo( this._appendTo( element ) );
-
- return this.tooltips[ id ] = {
- element: element,
- tooltip: tooltip
- };
- },
-
- _find: function( target ) {
- var id = target.data( "ui-tooltip-id" );
- return id ? this.tooltips[ id ] : null;
- },
-
- _removeTooltip: function( tooltip ) {
- tooltip.remove();
- delete this.tooltips[ tooltip.attr( "id" ) ];
- },
-
- _appendTo: function( target ) {
- var element = target.closest( ".ui-front, dialog" );
-
- if ( !element.length ) {
- element = this.document[ 0 ].body;
- }
-
- return element;
- },
-
- _destroy: function() {
- var that = this;
-
- // Close open tooltips
- $.each( this.tooltips, function( id, tooltipData ) {
-
- // Delegate to close method to handle common cleanup
- var event = $.Event( "blur" ),
- element = tooltipData.element;
- event.target = event.currentTarget = element[ 0 ];
- that.close( event, true );
-
- // Remove immediately; destroying an open tooltip doesn't use the
- // hide animation
- $( "#" + id ).remove();
-
- // Restore the title
- if ( element.data( "ui-tooltip-title" ) ) {
-
- // If the title attribute has changed since open(), don't restore
- if ( !element.attr( "title" ) ) {
- element.attr( "title", element.data( "ui-tooltip-title" ) );
- }
- element.removeData( "ui-tooltip-title" );
- }
- } );
- this.liveRegion.remove();
- }
-} );
-
-// DEPRECATED
-// TODO: Switch return back to widget declaration at top of file when this is removed
-if ( $.uiBackCompat !== false ) {
-
- // Backcompat for tooltipClass option
- $.widget( "ui.tooltip", $.ui.tooltip, {
- options: {
- tooltipClass: null
- },
- _tooltip: function() {
- var tooltipData = this._superApply( arguments );
- if ( this.options.tooltipClass ) {
- tooltipData.tooltip.addClass( this.options.tooltipClass );
- }
- return tooltipData;
- }
- } );
-}
-
-var widgetsTooltip = $.ui.tooltip;
-
-
-/*!
- * jQuery UI Effects 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Effects Core
-//>>group: Effects
-// jscs:disable maximumLineLength
-//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/category/effects-core/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var dataSpace = "ui-effects-",
- dataSpaceStyle = "ui-effects-style",
- dataSpaceAnimated = "ui-effects-animated",
-
- // Create a local jQuery because jQuery Color relies on it and the
- // global may not exist with AMD and a custom build (#10199)
- jQuery = $;
-
-$.effects = {
- effect: {}
-};
-
-/*!
- * jQuery Color Animations v2.1.2
- * https://github.com/jquery/jquery-color
- *
- * Copyright 2014 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * Date: Wed Jan 16 08:47:09 2013 -0600
- */
-( function( jQuery, undefined ) {
-
- var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " +
- "borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",
-
- // Plusequals test for += 100 -= 100
- rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
-
- // A set of RE's that can match strings and generate color tuples.
- stringParsers = [ {
- re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
- parse: function( execResult ) {
- return [
- execResult[ 1 ],
- execResult[ 2 ],
- execResult[ 3 ],
- execResult[ 4 ]
- ];
- }
- }, {
- re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
- parse: function( execResult ) {
- return [
- execResult[ 1 ] * 2.55,
- execResult[ 2 ] * 2.55,
- execResult[ 3 ] * 2.55,
- execResult[ 4 ]
- ];
- }
- }, {
-
- // This regex ignores A-F because it's compared against an already lowercased string
- re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
- parse: function( execResult ) {
- return [
- parseInt( execResult[ 1 ], 16 ),
- parseInt( execResult[ 2 ], 16 ),
- parseInt( execResult[ 3 ], 16 )
- ];
- }
- }, {
-
- // This regex ignores A-F because it's compared against an already lowercased string
- re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
- parse: function( execResult ) {
- return [
- parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
- parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
- parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
- ];
- }
- }, {
- re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,
- space: "hsla",
- parse: function( execResult ) {
- return [
- execResult[ 1 ],
- execResult[ 2 ] / 100,
- execResult[ 3 ] / 100,
- execResult[ 4 ]
- ];
- }
- } ],
-
- // JQuery.Color( )
- color = jQuery.Color = function( color, green, blue, alpha ) {
- return new jQuery.Color.fn.parse( color, green, blue, alpha );
- },
- spaces = {
- rgba: {
- props: {
- red: {
- idx: 0,
- type: "byte"
- },
- green: {
- idx: 1,
- type: "byte"
- },
- blue: {
- idx: 2,
- type: "byte"
- }
- }
- },
-
- hsla: {
- props: {
- hue: {
- idx: 0,
- type: "degrees"
- },
- saturation: {
- idx: 1,
- type: "percent"
- },
- lightness: {
- idx: 2,
- type: "percent"
- }
- }
- }
- },
- propTypes = {
- "byte": {
- floor: true,
- max: 255
- },
- "percent": {
- max: 1
- },
- "degrees": {
- mod: 360,
- floor: true
- }
- },
- support = color.support = {},
-
- // Element for support tests
- supportElem = jQuery( "<p>" )[ 0 ],
-
- // Colors = jQuery.Color.names
- colors,
-
- // Local aliases of functions called often
- each = jQuery.each;
-
-// Determine rgba support immediately
-supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
-support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
-
-// Define cache name and alpha properties
-// for rgba and hsla spaces
-each( spaces, function( spaceName, space ) {
- space.cache = "_" + spaceName;
- space.props.alpha = {
- idx: 3,
- type: "percent",
- def: 1
- };
-} );
-
-function clamp( value, prop, allowEmpty ) {
- var type = propTypes[ prop.type ] || {};
-
- if ( value == null ) {
- return ( allowEmpty || !prop.def ) ? null : prop.def;
- }
-
- // ~~ is an short way of doing floor for positive numbers
- value = type.floor ? ~~value : parseFloat( value );
-
- // IE will pass in empty strings as value for alpha,
- // which will hit this case
- if ( isNaN( value ) ) {
- return prop.def;
- }
-
- if ( type.mod ) {
-
- // We add mod before modding to make sure that negatives values
- // get converted properly: -10 -> 350
- return ( value + type.mod ) % type.mod;
- }
-
- // For now all property types without mod have min and max
- return 0 > value ? 0 : type.max < value ? type.max : value;
-}
-
-function stringParse( string ) {
- var inst = color(),
- rgba = inst._rgba = [];
-
- string = string.toLowerCase();
-
- each( stringParsers, function( i, parser ) {
- var parsed,
- match = parser.re.exec( string ),
- values = match && parser.parse( match ),
- spaceName = parser.space || "rgba";
-
- if ( values ) {
- parsed = inst[ spaceName ]( values );
-
- // If this was an rgba parse the assignment might happen twice
- // oh well....
- inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
- rgba = inst._rgba = parsed._rgba;
-
- // Exit each( stringParsers ) here because we matched
- return false;
- }
- } );
-
- // Found a stringParser that handled it
- if ( rgba.length ) {
-
- // If this came from a parsed string, force "transparent" when alpha is 0
- // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
- if ( rgba.join() === "0,0,0,0" ) {
- jQuery.extend( rgba, colors.transparent );
- }
- return inst;
- }
-
- // Named colors
- return colors[ string ];
-}
-
-color.fn = jQuery.extend( color.prototype, {
- parse: function( red, green, blue, alpha ) {
- if ( red === undefined ) {
- this._rgba = [ null, null, null, null ];
- return this;
- }
- if ( red.jquery || red.nodeType ) {
- red = jQuery( red ).css( green );
- green = undefined;
- }
-
- var inst = this,
- type = jQuery.type( red ),
- rgba = this._rgba = [];
-
- // More than 1 argument specified - assume ( red, green, blue, alpha )
- if ( green !== undefined ) {
- red = [ red, green, blue, alpha ];
- type = "array";
- }
-
- if ( type === "string" ) {
- return this.parse( stringParse( red ) || colors._default );
- }
-
- if ( type === "array" ) {
- each( spaces.rgba.props, function( key, prop ) {
- rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
- } );
- return this;
- }
-
- if ( type === "object" ) {
- if ( red instanceof color ) {
- each( spaces, function( spaceName, space ) {
- if ( red[ space.cache ] ) {
- inst[ space.cache ] = red[ space.cache ].slice();
- }
- } );
- } else {
- each( spaces, function( spaceName, space ) {
- var cache = space.cache;
- each( space.props, function( key, prop ) {
-
- // If the cache doesn't exist, and we know how to convert
- if ( !inst[ cache ] && space.to ) {
-
- // If the value was null, we don't need to copy it
- // if the key was alpha, we don't need to copy it either
- if ( key === "alpha" || red[ key ] == null ) {
- return;
- }
- inst[ cache ] = space.to( inst._rgba );
- }
-
- // This is the only case where we allow nulls for ALL properties.
- // call clamp with alwaysAllowEmpty
- inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
- } );
-
- // Everything defined but alpha?
- if ( inst[ cache ] &&
- jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
-
- // Use the default of 1
- inst[ cache ][ 3 ] = 1;
- if ( space.from ) {
- inst._rgba = space.from( inst[ cache ] );
- }
- }
- } );
- }
- return this;
- }
- },
- is: function( compare ) {
- var is = color( compare ),
- same = true,
- inst = this;
-
- each( spaces, function( _, space ) {
- var localCache,
- isCache = is[ space.cache ];
- if ( isCache ) {
- localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
- each( space.props, function( _, prop ) {
- if ( isCache[ prop.idx ] != null ) {
- same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
- return same;
- }
- } );
- }
- return same;
- } );
- return same;
- },
- _space: function() {
- var used = [],
- inst = this;
- each( spaces, function( spaceName, space ) {
- if ( inst[ space.cache ] ) {
- used.push( spaceName );
- }
- } );
- return used.pop();
- },
- transition: function( other, distance ) {
- var end = color( other ),
- spaceName = end._space(),
- space = spaces[ spaceName ],
- startColor = this.alpha() === 0 ? color( "transparent" ) : this,
- start = startColor[ space.cache ] || space.to( startColor._rgba ),
- result = start.slice();
-
- end = end[ space.cache ];
- each( space.props, function( key, prop ) {
- var index = prop.idx,
- startValue = start[ index ],
- endValue = end[ index ],
- type = propTypes[ prop.type ] || {};
-
- // If null, don't override start value
- if ( endValue === null ) {
- return;
- }
-
- // If null - use end
- if ( startValue === null ) {
- result[ index ] = endValue;
- } else {
- if ( type.mod ) {
- if ( endValue - startValue > type.mod / 2 ) {
- startValue += type.mod;
- } else if ( startValue - endValue > type.mod / 2 ) {
- startValue -= type.mod;
- }
- }
- result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
- }
- } );
- return this[ spaceName ]( result );
- },
- blend: function( opaque ) {
-
- // If we are already opaque - return ourself
- if ( this._rgba[ 3 ] === 1 ) {
- return this;
- }
-
- var rgb = this._rgba.slice(),
- a = rgb.pop(),
- blend = color( opaque )._rgba;
-
- return color( jQuery.map( rgb, function( v, i ) {
- return ( 1 - a ) * blend[ i ] + a * v;
- } ) );
- },
- toRgbaString: function() {
- var prefix = "rgba(",
- rgba = jQuery.map( this._rgba, function( v, i ) {
- return v == null ? ( i > 2 ? 1 : 0 ) : v;
- } );
-
- if ( rgba[ 3 ] === 1 ) {
- rgba.pop();
- prefix = "rgb(";
- }
-
- return prefix + rgba.join() + ")";
- },
- toHslaString: function() {
- var prefix = "hsla(",
- hsla = jQuery.map( this.hsla(), function( v, i ) {
- if ( v == null ) {
- v = i > 2 ? 1 : 0;
- }
-
- // Catch 1 and 2
- if ( i && i < 3 ) {
- v = Math.round( v * 100 ) + "%";
- }
- return v;
- } );
-
- if ( hsla[ 3 ] === 1 ) {
- hsla.pop();
- prefix = "hsl(";
- }
- return prefix + hsla.join() + ")";
- },
- toHexString: function( includeAlpha ) {
- var rgba = this._rgba.slice(),
- alpha = rgba.pop();
-
- if ( includeAlpha ) {
- rgba.push( ~~( alpha * 255 ) );
- }
-
- return "#" + jQuery.map( rgba, function( v ) {
-
- // Default to 0 when nulls exist
- v = ( v || 0 ).toString( 16 );
- return v.length === 1 ? "0" + v : v;
- } ).join( "" );
- },
- toString: function() {
- return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
- }
-} );
-color.fn.parse.prototype = color.fn;
-
-// Hsla conversions adapted from:
-// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
-
-function hue2rgb( p, q, h ) {
- h = ( h + 1 ) % 1;
- if ( h * 6 < 1 ) {
- return p + ( q - p ) * h * 6;
- }
- if ( h * 2 < 1 ) {
- return q;
- }
- if ( h * 3 < 2 ) {
- return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;
- }
- return p;
-}
-
-spaces.hsla.to = function( rgba ) {
- if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
- return [ null, null, null, rgba[ 3 ] ];
- }
- var r = rgba[ 0 ] / 255,
- g = rgba[ 1 ] / 255,
- b = rgba[ 2 ] / 255,
- a = rgba[ 3 ],
- max = Math.max( r, g, b ),
- min = Math.min( r, g, b ),
- diff = max - min,
- add = max + min,
- l = add * 0.5,
- h, s;
-
- if ( min === max ) {
- h = 0;
- } else if ( r === max ) {
- h = ( 60 * ( g - b ) / diff ) + 360;
- } else if ( g === max ) {
- h = ( 60 * ( b - r ) / diff ) + 120;
- } else {
- h = ( 60 * ( r - g ) / diff ) + 240;
- }
-
- // Chroma (diff) == 0 means greyscale which, by definition, saturation = 0%
- // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)
- if ( diff === 0 ) {
- s = 0;
- } else if ( l <= 0.5 ) {
- s = diff / add;
- } else {
- s = diff / ( 2 - add );
- }
- return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ];
-};
-
-spaces.hsla.from = function( hsla ) {
- if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
- return [ null, null, null, hsla[ 3 ] ];
- }
- var h = hsla[ 0 ] / 360,
- s = hsla[ 1 ],
- l = hsla[ 2 ],
- a = hsla[ 3 ],
- q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
- p = 2 * l - q;
-
- return [
- Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
- Math.round( hue2rgb( p, q, h ) * 255 ),
- Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
- a
- ];
-};
-
-each( spaces, function( spaceName, space ) {
- var props = space.props,
- cache = space.cache,
- to = space.to,
- from = space.from;
-
- // Makes rgba() and hsla()
- color.fn[ spaceName ] = function( value ) {
-
- // Generate a cache for this space if it doesn't exist
- if ( to && !this[ cache ] ) {
- this[ cache ] = to( this._rgba );
- }
- if ( value === undefined ) {
- return this[ cache ].slice();
- }
-
- var ret,
- type = jQuery.type( value ),
- arr = ( type === "array" || type === "object" ) ? value : arguments,
- local = this[ cache ].slice();
-
- each( props, function( key, prop ) {
- var val = arr[ type === "object" ? key : prop.idx ];
- if ( val == null ) {
- val = local[ prop.idx ];
- }
- local[ prop.idx ] = clamp( val, prop );
- } );
-
- if ( from ) {
- ret = color( from( local ) );
- ret[ cache ] = local;
- return ret;
- } else {
- return color( local );
- }
- };
-
- // Makes red() green() blue() alpha() hue() saturation() lightness()
- each( props, function( key, prop ) {
-
- // Alpha is included in more than one space
- if ( color.fn[ key ] ) {
- return;
- }
- color.fn[ key ] = function( value ) {
- var vtype = jQuery.type( value ),
- fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
- local = this[ fn ](),
- cur = local[ prop.idx ],
- match;
-
- if ( vtype === "undefined" ) {
- return cur;
- }
-
- if ( vtype === "function" ) {
- value = value.call( this, cur );
- vtype = jQuery.type( value );
- }
- if ( value == null && prop.empty ) {
- return this;
- }
- if ( vtype === "string" ) {
- match = rplusequals.exec( value );
- if ( match ) {
- value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
- }
- }
- local[ prop.idx ] = value;
- return this[ fn ]( local );
- };
- } );
-} );
-
-// Add cssHook and .fx.step function for each named hook.
-// accept a space separated string of properties
-color.hook = function( hook ) {
- var hooks = hook.split( " " );
- each( hooks, function( i, hook ) {
- jQuery.cssHooks[ hook ] = {
- set: function( elem, value ) {
- var parsed, curElem,
- backgroundColor = "";
-
- if ( value !== "transparent" && ( jQuery.type( value ) !== "string" ||
- ( parsed = stringParse( value ) ) ) ) {
- value = color( parsed || value );
- if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
- curElem = hook === "backgroundColor" ? elem.parentNode : elem;
- while (
- ( backgroundColor === "" || backgroundColor === "transparent" ) &&
- curElem && curElem.style
- ) {
- try {
- backgroundColor = jQuery.css( curElem, "backgroundColor" );
- curElem = curElem.parentNode;
- } catch ( e ) {
- }
- }
-
- value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
- backgroundColor :
- "_default" );
- }
-
- value = value.toRgbaString();
- }
- try {
- elem.style[ hook ] = value;
- } catch ( e ) {
-
- // Wrapped to prevent IE from throwing errors on "invalid" values like
- // 'auto' or 'inherit'
- }
- }
- };
- jQuery.fx.step[ hook ] = function( fx ) {
- if ( !fx.colorInit ) {
- fx.start = color( fx.elem, hook );
- fx.end = color( fx.end );
- fx.colorInit = true;
- }
- jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
- };
- } );
-
-};
-
-color.hook( stepHooks );
-
-jQuery.cssHooks.borderColor = {
- expand: function( value ) {
- var expanded = {};
-
- each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
- expanded[ "border" + part + "Color" ] = value;
- } );
- return expanded;
- }
-};
-
-// Basic color names only.
-// Usage of any of the other color names requires adding yourself or including
-// jquery.color.svg-names.js.
-colors = jQuery.Color.names = {
-
- // 4.1. Basic color keywords
- aqua: "#00ffff",
- black: "#000000",
- blue: "#0000ff",
- fuchsia: "#ff00ff",
- gray: "#808080",
- green: "#008000",
- lime: "#00ff00",
- maroon: "#800000",
- navy: "#000080",
- olive: "#808000",
- purple: "#800080",
- red: "#ff0000",
- silver: "#c0c0c0",
- teal: "#008080",
- white: "#ffffff",
- yellow: "#ffff00",
-
- // 4.2.3. "transparent" color keyword
- transparent: [ null, null, null, 0 ],
-
- _default: "#ffffff"
-};
-
-} )( jQuery );
-
-/******************************************************************************/
-/****************************** CLASS ANIMATIONS ******************************/
-/******************************************************************************/
-( function() {
-
-var classAnimationActions = [ "add", "remove", "toggle" ],
- shorthandStyles = {
- border: 1,
- borderBottom: 1,
- borderColor: 1,
- borderLeft: 1,
- borderRight: 1,
- borderTop: 1,
- borderWidth: 1,
- margin: 1,
- padding: 1
- };
-
-$.each(
- [ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ],
- function( _, prop ) {
- $.fx.step[ prop ] = function( fx ) {
- if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
- jQuery.style( fx.elem, prop, fx.end );
- fx.setAttr = true;
- }
- };
- }
-);
-
-function getElementStyles( elem ) {
- var key, len,
- style = elem.ownerDocument.defaultView ?
- elem.ownerDocument.defaultView.getComputedStyle( elem, null ) :
- elem.currentStyle,
- styles = {};
-
- if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
- len = style.length;
- while ( len-- ) {
- key = style[ len ];
- if ( typeof style[ key ] === "string" ) {
- styles[ $.camelCase( key ) ] = style[ key ];
- }
- }
-
- // Support: Opera, IE <9
- } else {
- for ( key in style ) {
- if ( typeof style[ key ] === "string" ) {
- styles[ key ] = style[ key ];
- }
- }
- }
-
- return styles;
-}
-
-function styleDifference( oldStyle, newStyle ) {
- var diff = {},
- name, value;
-
- for ( name in newStyle ) {
- value = newStyle[ name ];
- if ( oldStyle[ name ] !== value ) {
- if ( !shorthandStyles[ name ] ) {
- if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
- diff[ name ] = value;
- }
- }
- }
- }
-
- return diff;
-}
-
-// Support: jQuery <1.8
-if ( !$.fn.addBack ) {
- $.fn.addBack = function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter( selector )
- );
- };
-}
-
-$.effects.animateClass = function( value, duration, easing, callback ) {
- var o = $.speed( duration, easing, callback );
-
- return this.queue( function() {
- var animated = $( this ),
- baseClass = animated.attr( "class" ) || "",
- applyClassChange,
- allAnimations = o.children ? animated.find( "*" ).addBack() : animated;
-
- // Map the animated objects to store the original styles.
- allAnimations = allAnimations.map( function() {
- var el = $( this );
- return {
- el: el,
- start: getElementStyles( this )
- };
- } );
-
- // Apply class change
- applyClassChange = function() {
- $.each( classAnimationActions, function( i, action ) {
- if ( value[ action ] ) {
- animated[ action + "Class" ]( value[ action ] );
- }
- } );
- };
- applyClassChange();
-
- // Map all animated objects again - calculate new styles and diff
- allAnimations = allAnimations.map( function() {
- this.end = getElementStyles( this.el[ 0 ] );
- this.diff = styleDifference( this.start, this.end );
- return this;
- } );
-
- // Apply original class
- animated.attr( "class", baseClass );
-
- // Map all animated objects again - this time collecting a promise
- allAnimations = allAnimations.map( function() {
- var styleInfo = this,
- dfd = $.Deferred(),
- opts = $.extend( {}, o, {
- queue: false,
- complete: function() {
- dfd.resolve( styleInfo );
- }
- } );
-
- this.el.animate( this.diff, opts );
- return dfd.promise();
- } );
-
- // Once all animations have completed:
- $.when.apply( $, allAnimations.get() ).done( function() {
-
- // Set the final class
- applyClassChange();
-
- // For each animated element,
- // clear all css properties that were animated
- $.each( arguments, function() {
- var el = this.el;
- $.each( this.diff, function( key ) {
- el.css( key, "" );
- } );
- } );
-
- // This is guarnteed to be there if you use jQuery.speed()
- // it also handles dequeuing the next anim...
- o.complete.call( animated[ 0 ] );
- } );
- } );
-};
-
-$.fn.extend( {
- addClass: ( function( orig ) {
- return function( classNames, speed, easing, callback ) {
- return speed ?
- $.effects.animateClass.call( this,
- { add: classNames }, speed, easing, callback ) :
- orig.apply( this, arguments );
- };
- } )( $.fn.addClass ),
-
- removeClass: ( function( orig ) {
- return function( classNames, speed, easing, callback ) {
- return arguments.length > 1 ?
- $.effects.animateClass.call( this,
- { remove: classNames }, speed, easing, callback ) :
- orig.apply( this, arguments );
- };
- } )( $.fn.removeClass ),
-
- toggleClass: ( function( orig ) {
- return function( classNames, force, speed, easing, callback ) {
- if ( typeof force === "boolean" || force === undefined ) {
- if ( !speed ) {
-
- // Without speed parameter
- return orig.apply( this, arguments );
- } else {
- return $.effects.animateClass.call( this,
- ( force ? { add: classNames } : { remove: classNames } ),
- speed, easing, callback );
- }
- } else {
-
- // Without force parameter
- return $.effects.animateClass.call( this,
- { toggle: classNames }, force, speed, easing );
- }
- };
- } )( $.fn.toggleClass ),
-
- switchClass: function( remove, add, speed, easing, callback ) {
- return $.effects.animateClass.call( this, {
- add: add,
- remove: remove
- }, speed, easing, callback );
- }
-} );
-
-} )();
-
-/******************************************************************************/
-/*********************************** EFFECTS **********************************/
-/******************************************************************************/
-
-( function() {
-
-if ( $.expr && $.expr.filters && $.expr.filters.animated ) {
- $.expr.filters.animated = ( function( orig ) {
- return function( elem ) {
- return !!$( elem ).data( dataSpaceAnimated ) || orig( elem );
- };
- } )( $.expr.filters.animated );
-}
-
-if ( $.uiBackCompat !== false ) {
- $.extend( $.effects, {
-
- // Saves a set of properties in a data storage
- save: function( element, set ) {
- var i = 0, length = set.length;
- for ( ; i < length; i++ ) {
- if ( set[ i ] !== null ) {
- element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
- }
- }
- },
-
- // Restores a set of previously saved properties from a data storage
- restore: function( element, set ) {
- var val, i = 0, length = set.length;
- for ( ; i < length; i++ ) {
- if ( set[ i ] !== null ) {
- val = element.data( dataSpace + set[ i ] );
- element.css( set[ i ], val );
- }
- }
- },
-
- setMode: function( el, mode ) {
- if ( mode === "toggle" ) {
- mode = el.is( ":hidden" ) ? "show" : "hide";
- }
- return mode;
- },
-
- // Wraps the element around a wrapper that copies position properties
- createWrapper: function( element ) {
-
- // If the element is already wrapped, return it
- if ( element.parent().is( ".ui-effects-wrapper" ) ) {
- return element.parent();
- }
-
- // Wrap the element
- var props = {
- width: element.outerWidth( true ),
- height: element.outerHeight( true ),
- "float": element.css( "float" )
- },
- wrapper = $( "<div></div>" )
- .addClass( "ui-effects-wrapper" )
- .css( {
- fontSize: "100%",
- background: "transparent",
- border: "none",
- margin: 0,
- padding: 0
- } ),
-
- // Store the size in case width/height are defined in % - Fixes #5245
- size = {
- width: element.width(),
- height: element.height()
- },
- active = document.activeElement;
-
- // Support: Firefox
- // Firefox incorrectly exposes anonymous content
- // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
- try {
- active.id;
- } catch ( e ) {
- active = document.body;
- }
-
- element.wrap( wrapper );
-
- // Fixes #7595 - Elements lose focus when wrapped.
- if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
- $( active ).trigger( "focus" );
- }
-
- // Hotfix for jQuery 1.4 since some change in wrap() seems to actually
- // lose the reference to the wrapped element
- wrapper = element.parent();
-
- // Transfer positioning properties to the wrapper
- if ( element.css( "position" ) === "static" ) {
- wrapper.css( { position: "relative" } );
- element.css( { position: "relative" } );
- } else {
- $.extend( props, {
- position: element.css( "position" ),
- zIndex: element.css( "z-index" )
- } );
- $.each( [ "top", "left", "bottom", "right" ], function( i, pos ) {
- props[ pos ] = element.css( pos );
- if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
- props[ pos ] = "auto";
- }
- } );
- element.css( {
- position: "relative",
- top: 0,
- left: 0,
- right: "auto",
- bottom: "auto"
- } );
- }
- element.css( size );
-
- return wrapper.css( props ).show();
- },
-
- removeWrapper: function( element ) {
- var active = document.activeElement;
-
- if ( element.parent().is( ".ui-effects-wrapper" ) ) {
- element.parent().replaceWith( element );
-
- // Fixes #7595 - Elements lose focus when wrapped.
- if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
- $( active ).trigger( "focus" );
- }
- }
-
- return element;
- }
- } );
-}
-
-$.extend( $.effects, {
- version: "1.12.1",
-
- define: function( name, mode, effect ) {
- if ( !effect ) {
- effect = mode;
- mode = "effect";
- }
-
- $.effects.effect[ name ] = effect;
- $.effects.effect[ name ].mode = mode;
-
- return effect;
- },
-
- scaledDimensions: function( element, percent, direction ) {
- if ( percent === 0 ) {
- return {
- height: 0,
- width: 0,
- outerHeight: 0,
- outerWidth: 0
- };
- }
-
- var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1,
- y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1;
-
- return {
- height: element.height() * y,
- width: element.width() * x,
- outerHeight: element.outerHeight() * y,
- outerWidth: element.outerWidth() * x
- };
-
- },
-
- clipToBox: function( animation ) {
- return {
- width: animation.clip.right - animation.clip.left,
- height: animation.clip.bottom - animation.clip.top,
- left: animation.clip.left,
- top: animation.clip.top
- };
- },
-
- // Injects recently queued functions to be first in line (after "inprogress")
- unshift: function( element, queueLength, count ) {
- var queue = element.queue();
-
- if ( queueLength > 1 ) {
- queue.splice.apply( queue,
- [ 1, 0 ].concat( queue.splice( queueLength, count ) ) );
- }
- element.dequeue();
- },
-
- saveStyle: function( element ) {
- element.data( dataSpaceStyle, element[ 0 ].style.cssText );
- },
-
- restoreStyle: function( element ) {
- element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || "";
- element.removeData( dataSpaceStyle );
- },
-
- mode: function( element, mode ) {
- var hidden = element.is( ":hidden" );
-
- if ( mode === "toggle" ) {
- mode = hidden ? "show" : "hide";
- }
- if ( hidden ? mode === "hide" : mode === "show" ) {
- mode = "none";
- }
- return mode;
- },
-
- // Translates a [top,left] array into a baseline value
- getBaseline: function( origin, original ) {
- var y, x;
-
- switch ( origin[ 0 ] ) {
- case "top":
- y = 0;
- break;
- case "middle":
- y = 0.5;
- break;
- case "bottom":
- y = 1;
- break;
- default:
- y = origin[ 0 ] / original.height;
- }
-
- switch ( origin[ 1 ] ) {
- case "left":
- x = 0;
- break;
- case "center":
- x = 0.5;
- break;
- case "right":
- x = 1;
- break;
- default:
- x = origin[ 1 ] / original.width;
- }
-
- return {
- x: x,
- y: y
- };
- },
-
- // Creates a placeholder element so that the original element can be made absolute
- createPlaceholder: function( element ) {
- var placeholder,
- cssPosition = element.css( "position" ),
- position = element.position();
-
- // Lock in margins first to account for form elements, which
- // will change margin if you explicitly set height
- // see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380
- // Support: Safari
- element.css( {
- marginTop: element.css( "marginTop" ),
- marginBottom: element.css( "marginBottom" ),
- marginLeft: element.css( "marginLeft" ),
- marginRight: element.css( "marginRight" )
- } )
- .outerWidth( element.outerWidth() )
- .outerHeight( element.outerHeight() );
-
- if ( /^(static|relative)/.test( cssPosition ) ) {
- cssPosition = "absolute";
-
- placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( {
-
- // Convert inline to inline block to account for inline elements
- // that turn to inline block based on content (like img)
- display: /^(inline|ruby)/.test( element.css( "display" ) ) ?
- "inline-block" :
- "block",
- visibility: "hidden",
-
- // Margins need to be set to account for margin collapse
- marginTop: element.css( "marginTop" ),
- marginBottom: element.css( "marginBottom" ),
- marginLeft: element.css( "marginLeft" ),
- marginRight: element.css( "marginRight" ),
- "float": element.css( "float" )
- } )
- .outerWidth( element.outerWidth() )
- .outerHeight( element.outerHeight() )
- .addClass( "ui-effects-placeholder" );
-
- element.data( dataSpace + "placeholder", placeholder );
- }
-
- element.css( {
- position: cssPosition,
- left: position.left,
- top: position.top
- } );
-
- return placeholder;
- },
-
- removePlaceholder: function( element ) {
- var dataKey = dataSpace + "placeholder",
- placeholder = element.data( dataKey );
-
- if ( placeholder ) {
- placeholder.remove();
- element.removeData( dataKey );
- }
- },
-
- // Removes a placeholder if it exists and restores
- // properties that were modified during placeholder creation
- cleanUp: function( element ) {
- $.effects.restoreStyle( element );
- $.effects.removePlaceholder( element );
- },
-
- setTransition: function( element, list, factor, value ) {
- value = value || {};
- $.each( list, function( i, x ) {
- var unit = element.cssUnit( x );
- if ( unit[ 0 ] > 0 ) {
- value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
- }
- } );
- return value;
- }
-} );
-
-// Return an effect options object for the given parameters:
-function _normalizeArguments( effect, options, speed, callback ) {
-
- // Allow passing all options as the first parameter
- if ( $.isPlainObject( effect ) ) {
- options = effect;
- effect = effect.effect;
- }
-
- // Convert to an object
- effect = { effect: effect };
-
- // Catch (effect, null, ...)
- if ( options == null ) {
- options = {};
- }
-
- // Catch (effect, callback)
- if ( $.isFunction( options ) ) {
- callback = options;
- speed = null;
- options = {};
- }
-
- // Catch (effect, speed, ?)
- if ( typeof options === "number" || $.fx.speeds[ options ] ) {
- callback = speed;
- speed = options;
- options = {};
- }
-
- // Catch (effect, options, callback)
- if ( $.isFunction( speed ) ) {
- callback = speed;
- speed = null;
- }
-
- // Add options to effect
- if ( options ) {
- $.extend( effect, options );
- }
-
- speed = speed || options.duration;
- effect.duration = $.fx.off ? 0 :
- typeof speed === "number" ? speed :
- speed in $.fx.speeds ? $.fx.speeds[ speed ] :
- $.fx.speeds._default;
-
- effect.complete = callback || options.complete;
-
- return effect;
-}
-
-function standardAnimationOption( option ) {
-
- // Valid standard speeds (nothing, number, named speed)
- if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) {
- return true;
- }
-
- // Invalid strings - treat as "normal" speed
- if ( typeof option === "string" && !$.effects.effect[ option ] ) {
- return true;
- }
-
- // Complete callback
- if ( $.isFunction( option ) ) {
- return true;
- }
-
- // Options hash (but not naming an effect)
- if ( typeof option === "object" && !option.effect ) {
- return true;
- }
-
- // Didn't match any standard API
- return false;
-}
-
-$.fn.extend( {
- effect: function( /* effect, options, speed, callback */ ) {
- var args = _normalizeArguments.apply( this, arguments ),
- effectMethod = $.effects.effect[ args.effect ],
- defaultMode = effectMethod.mode,
- queue = args.queue,
- queueName = queue || "fx",
- complete = args.complete,
- mode = args.mode,
- modes = [],
- prefilter = function( next ) {
- var el = $( this ),
- normalizedMode = $.effects.mode( el, mode ) || defaultMode;
-
- // Sentinel for duck-punching the :animated psuedo-selector
- el.data( dataSpaceAnimated, true );
-
- // Save effect mode for later use,
- // we can't just call $.effects.mode again later,
- // as the .show() below destroys the initial state
- modes.push( normalizedMode );
-
- // See $.uiBackCompat inside of run() for removal of defaultMode in 1.13
- if ( defaultMode && ( normalizedMode === "show" ||
- ( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
- el.show();
- }
-
- if ( !defaultMode || normalizedMode !== "none" ) {
- $.effects.saveStyle( el );
- }
-
- if ( $.isFunction( next ) ) {
- next();
- }
- };
-
- if ( $.fx.off || !effectMethod ) {
-
- // Delegate to the original method (e.g., .show()) if possible
- if ( mode ) {
- return this[ mode ]( args.duration, complete );
- } else {
- return this.each( function() {
- if ( complete ) {
- complete.call( this );
- }
- } );
- }
- }
-
- function run( next ) {
- var elem = $( this );
-
- function cleanup() {
- elem.removeData( dataSpaceAnimated );
-
- $.effects.cleanUp( elem );
-
- if ( args.mode === "hide" ) {
- elem.hide();
- }
-
- done();
- }
-
- function done() {
- if ( $.isFunction( complete ) ) {
- complete.call( elem[ 0 ] );
- }
-
- if ( $.isFunction( next ) ) {
- next();
- }
- }
-
- // Override mode option on a per element basis,
- // as toggle can be either show or hide depending on element state
- args.mode = modes.shift();
-
- if ( $.uiBackCompat !== false && !defaultMode ) {
- if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
-
- // Call the core method to track "olddisplay" properly
- elem[ mode ]();
- done();
- } else {
- effectMethod.call( elem[ 0 ], args, done );
- }
- } else {
- if ( args.mode === "none" ) {
-
- // Call the core method to track "olddisplay" properly
- elem[ mode ]();
- done();
- } else {
- effectMethod.call( elem[ 0 ], args, cleanup );
- }
- }
- }
-
- // Run prefilter on all elements first to ensure that
- // any showing or hiding happens before placeholder creation,
- // which ensures that any layout changes are correctly captured.
- return queue === false ?
- this.each( prefilter ).each( run ) :
- this.queue( queueName, prefilter ).queue( queueName, run );
- },
-
- show: ( function( orig ) {
- return function( option ) {
- if ( standardAnimationOption( option ) ) {
- return orig.apply( this, arguments );
- } else {
- var args = _normalizeArguments.apply( this, arguments );
- args.mode = "show";
- return this.effect.call( this, args );
- }
- };
- } )( $.fn.show ),
-
- hide: ( function( orig ) {
- return function( option ) {
- if ( standardAnimationOption( option ) ) {
- return orig.apply( this, arguments );
- } else {
- var args = _normalizeArguments.apply( this, arguments );
- args.mode = "hide";
- return this.effect.call( this, args );
- }
- };
- } )( $.fn.hide ),
-
- toggle: ( function( orig ) {
- return function( option ) {
- if ( standardAnimationOption( option ) || typeof option === "boolean" ) {
- return orig.apply( this, arguments );
- } else {
- var args = _normalizeArguments.apply( this, arguments );
- args.mode = "toggle";
- return this.effect.call( this, args );
- }
- };
- } )( $.fn.toggle ),
-
- cssUnit: function( key ) {
- var style = this.css( key ),
- val = [];
-
- $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
- if ( style.indexOf( unit ) > 0 ) {
- val = [ parseFloat( style ), unit ];
- }
- } );
- return val;
- },
-
- cssClip: function( clipObj ) {
- if ( clipObj ) {
- return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " +
- clipObj.bottom + "px " + clipObj.left + "px)" );
- }
- return parseClip( this.css( "clip" ), this );
- },
-
- transfer: function( options, done ) {
- var element = $( this ),
- target = $( options.to ),
- targetFixed = target.css( "position" ) === "fixed",
- body = $( "body" ),
- fixTop = targetFixed ? body.scrollTop() : 0,
- fixLeft = targetFixed ? body.scrollLeft() : 0,
- endPosition = target.offset(),
- animation = {
- top: endPosition.top - fixTop,
- left: endPosition.left - fixLeft,
- height: target.innerHeight(),
- width: target.innerWidth()
- },
- startPosition = element.offset(),
- transfer = $( "<div class='ui-effects-transfer'></div>" )
- .appendTo( "body" )
- .addClass( options.className )
- .css( {
- top: startPosition.top - fixTop,
- left: startPosition.left - fixLeft,
- height: element.innerHeight(),
- width: element.innerWidth(),
- position: targetFixed ? "fixed" : "absolute"
- } )
- .animate( animation, options.duration, options.easing, function() {
- transfer.remove();
- if ( $.isFunction( done ) ) {
- done();
- }
- } );
- }
-} );
-
-function parseClip( str, element ) {
- var outerWidth = element.outerWidth(),
- outerHeight = element.outerHeight(),
- clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
- values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
-
- return {
- top: parseFloat( values[ 1 ] ) || 0,
- right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
- bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
- left: parseFloat( values[ 4 ] ) || 0
- };
-}
-
-$.fx.step.clip = function( fx ) {
- if ( !fx.clipInit ) {
- fx.start = $( fx.elem ).cssClip();
- if ( typeof fx.end === "string" ) {
- fx.end = parseClip( fx.end, fx.elem );
- }
- fx.clipInit = true;
- }
-
- $( fx.elem ).cssClip( {
- top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top,
- right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right,
- bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom,
- left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left
- } );
-};
-
-} )();
-
-/******************************************************************************/
-/*********************************** EASING ***********************************/
-/******************************************************************************/
-
-( function() {
-
-// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
-
-var baseEasings = {};
-
-$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
- baseEasings[ name ] = function( p ) {
- return Math.pow( p, i + 2 );
- };
-} );
-
-$.extend( baseEasings, {
- Sine: function( p ) {
- return 1 - Math.cos( p * Math.PI / 2 );
- },
- Circ: function( p ) {
- return 1 - Math.sqrt( 1 - p * p );
- },
- Elastic: function( p ) {
- return p === 0 || p === 1 ? p :
- -Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 );
- },
- Back: function( p ) {
- return p * p * ( 3 * p - 2 );
- },
- Bounce: function( p ) {
- var pow2,
- bounce = 4;
-
- while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
- return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
- }
-} );
-
-$.each( baseEasings, function( name, easeIn ) {
- $.easing[ "easeIn" + name ] = easeIn;
- $.easing[ "easeOut" + name ] = function( p ) {
- return 1 - easeIn( 1 - p );
- };
- $.easing[ "easeInOut" + name ] = function( p ) {
- return p < 0.5 ?
- easeIn( p * 2 ) / 2 :
- 1 - easeIn( p * -2 + 2 ) / 2;
- };
-} );
-
-} )();
-
-var effect = $.effects;
-
-
-/*!
- * jQuery UI Effects Blind 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Blind Effect
-//>>group: Effects
-//>>description: Blinds the element.
-//>>docs: http://api.jqueryui.com/blind-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) {
- var map = {
- up: [ "bottom", "top" ],
- vertical: [ "bottom", "top" ],
- down: [ "top", "bottom" ],
- left: [ "right", "left" ],
- horizontal: [ "right", "left" ],
- right: [ "left", "right" ]
- },
- element = $( this ),
- direction = options.direction || "up",
- start = element.cssClip(),
- animate = { clip: $.extend( {}, start ) },
- placeholder = $.effects.createPlaceholder( element );
-
- animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ];
-
- if ( options.mode === "show" ) {
- element.cssClip( animate.clip );
- if ( placeholder ) {
- placeholder.css( $.effects.clipToBox( animate ) );
- }
-
- animate.clip = start;
- }
-
- if ( placeholder ) {
- placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing );
- }
-
- element.animate( animate, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Bounce 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Bounce Effect
-//>>group: Effects
-//>>description: Bounces an element horizontally or vertically n times.
-//>>docs: http://api.jqueryui.com/bounce-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) {
- var upAnim, downAnim, refValue,
- element = $( this ),
-
- // Defaults:
- mode = options.mode,
- hide = mode === "hide",
- show = mode === "show",
- direction = options.direction || "up",
- distance = options.distance,
- times = options.times || 5,
-
- // Number of internal animations
- anims = times * 2 + ( show || hide ? 1 : 0 ),
- speed = options.duration / anims,
- easing = options.easing,
-
- // Utility:
- ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
- motion = ( direction === "up" || direction === "left" ),
- i = 0,
-
- queuelen = element.queue().length;
-
- $.effects.createPlaceholder( element );
-
- refValue = element.css( ref );
-
- // Default distance for the BIGGEST bounce is the outer Distance / 3
- if ( !distance ) {
- distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
- }
-
- if ( show ) {
- downAnim = { opacity: 1 };
- downAnim[ ref ] = refValue;
-
- // If we are showing, force opacity 0 and set the initial position
- // then do the "first" animation
- element
- .css( "opacity", 0 )
- .css( ref, motion ? -distance * 2 : distance * 2 )
- .animate( downAnim, speed, easing );
- }
-
- // Start at the smallest distance if we are hiding
- if ( hide ) {
- distance = distance / Math.pow( 2, times - 1 );
- }
-
- downAnim = {};
- downAnim[ ref ] = refValue;
-
- // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
- for ( ; i < times; i++ ) {
- upAnim = {};
- upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
-
- element
- .animate( upAnim, speed, easing )
- .animate( downAnim, speed, easing );
-
- distance = hide ? distance * 2 : distance / 2;
- }
-
- // Last Bounce when Hiding
- if ( hide ) {
- upAnim = { opacity: 0 };
- upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
-
- element.animate( upAnim, speed, easing );
- }
-
- element.queue( done );
-
- $.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Clip 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Clip Effect
-//>>group: Effects
-//>>description: Clips the element on and off like an old TV.
-//>>docs: http://api.jqueryui.com/clip-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) {
- var start,
- animate = {},
- element = $( this ),
- direction = options.direction || "vertical",
- both = direction === "both",
- horizontal = both || direction === "horizontal",
- vertical = both || direction === "vertical";
-
- start = element.cssClip();
- animate.clip = {
- top: vertical ? ( start.bottom - start.top ) / 2 : start.top,
- right: horizontal ? ( start.right - start.left ) / 2 : start.right,
- bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom,
- left: horizontal ? ( start.right - start.left ) / 2 : start.left
- };
-
- $.effects.createPlaceholder( element );
-
- if ( options.mode === "show" ) {
- element.cssClip( animate.clip );
- animate.clip = start;
- }
-
- element.animate( animate, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-
-} );
-
-
-/*!
- * jQuery UI Effects Drop 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Drop Effect
-//>>group: Effects
-//>>description: Moves an element in one direction and hides it at the same time.
-//>>docs: http://api.jqueryui.com/drop-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) {
-
- var distance,
- element = $( this ),
- mode = options.mode,
- show = mode === "show",
- direction = options.direction || "left",
- ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
- motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=",
- oppositeMotion = ( motion === "+=" ) ? "-=" : "+=",
- animation = {
- opacity: 0
- };
-
- $.effects.createPlaceholder( element );
-
- distance = options.distance ||
- element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2;
-
- animation[ ref ] = motion + distance;
-
- if ( show ) {
- element.css( animation );
-
- animation[ ref ] = oppositeMotion + distance;
- animation.opacity = 1;
- }
-
- // Animate
- element.animate( animation, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Explode 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Explode Effect
-//>>group: Effects
-// jscs:disable maximumLineLength
-//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness.
-// jscs:enable maximumLineLength
-//>>docs: http://api.jqueryui.com/explode-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) {
-
- var i, j, left, top, mx, my,
- rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3,
- cells = rows,
- element = $( this ),
- mode = options.mode,
- show = mode === "show",
-
- // Show and then visibility:hidden the element before calculating offset
- offset = element.show().css( "visibility", "hidden" ).offset(),
-
- // Width and height of a piece
- width = Math.ceil( element.outerWidth() / cells ),
- height = Math.ceil( element.outerHeight() / rows ),
- pieces = [];
-
- // Children animate complete:
- function childComplete() {
- pieces.push( this );
- if ( pieces.length === rows * cells ) {
- animComplete();
- }
- }
-
- // Clone the element for each row and cell.
- for ( i = 0; i < rows; i++ ) { // ===>
- top = offset.top + i * height;
- my = i - ( rows - 1 ) / 2;
-
- for ( j = 0; j < cells; j++ ) { // |||
- left = offset.left + j * width;
- mx = j - ( cells - 1 ) / 2;
-
- // Create a clone of the now hidden main element that will be absolute positioned
- // within a wrapper div off the -left and -top equal to size of our pieces
- element
- .clone()
- .appendTo( "body" )
- .wrap( "<div></div>" )
- .css( {
- position: "absolute",
- visibility: "visible",
- left: -j * width,
- top: -i * height
- } )
-
- // Select the wrapper - make it overflow: hidden and absolute positioned based on
- // where the original was located +left and +top equal to the size of pieces
- .parent()
- .addClass( "ui-effects-explode" )
- .css( {
- position: "absolute",
- overflow: "hidden",
- width: width,
- height: height,
- left: left + ( show ? mx * width : 0 ),
- top: top + ( show ? my * height : 0 ),
- opacity: show ? 0 : 1
- } )
- .animate( {
- left: left + ( show ? 0 : mx * width ),
- top: top + ( show ? 0 : my * height ),
- opacity: show ? 1 : 0
- }, options.duration || 500, options.easing, childComplete );
- }
- }
-
- function animComplete() {
- element.css( {
- visibility: "visible"
- } );
- $( pieces ).remove();
- done();
- }
-} );
-
-
-/*!
- * jQuery UI Effects Fade 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Fade Effect
-//>>group: Effects
-//>>description: Fades the element.
-//>>docs: http://api.jqueryui.com/fade-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) {
- var show = options.mode === "show";
-
- $( this )
- .css( "opacity", show ? 0 : 1 )
- .animate( {
- opacity: show ? 1 : 0
- }, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Fold 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Fold Effect
-//>>group: Effects
-//>>description: Folds an element first horizontally and then vertically.
-//>>docs: http://api.jqueryui.com/fold-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) {
-
- // Create element
- var element = $( this ),
- mode = options.mode,
- show = mode === "show",
- hide = mode === "hide",
- size = options.size || 15,
- percent = /([0-9]+)%/.exec( size ),
- horizFirst = !!options.horizFirst,
- ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ],
- duration = options.duration / 2,
-
- placeholder = $.effects.createPlaceholder( element ),
-
- start = element.cssClip(),
- animation1 = { clip: $.extend( {}, start ) },
- animation2 = { clip: $.extend( {}, start ) },
-
- distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ],
-
- queuelen = element.queue().length;
-
- if ( percent ) {
- size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
- }
- animation1.clip[ ref[ 0 ] ] = size;
- animation2.clip[ ref[ 0 ] ] = size;
- animation2.clip[ ref[ 1 ] ] = 0;
-
- if ( show ) {
- element.cssClip( animation2.clip );
- if ( placeholder ) {
- placeholder.css( $.effects.clipToBox( animation2 ) );
- }
-
- animation2.clip = start;
- }
-
- // Animate
- element
- .queue( function( next ) {
- if ( placeholder ) {
- placeholder
- .animate( $.effects.clipToBox( animation1 ), duration, options.easing )
- .animate( $.effects.clipToBox( animation2 ), duration, options.easing );
- }
-
- next();
- } )
- .animate( animation1, duration, options.easing )
- .animate( animation2, duration, options.easing )
- .queue( done );
-
- $.effects.unshift( element, queuelen, 4 );
-} );
-
-
-/*!
- * jQuery UI Effects Highlight 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Highlight Effect
-//>>group: Effects
-//>>description: Highlights the background of an element in a defined color for a custom duration.
-//>>docs: http://api.jqueryui.com/highlight-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) {
- var element = $( this ),
- animation = {
- backgroundColor: element.css( "backgroundColor" )
- };
-
- if ( options.mode === "hide" ) {
- animation.opacity = 0;
- }
-
- $.effects.saveStyle( element );
-
- element
- .css( {
- backgroundImage: "none",
- backgroundColor: options.color || "#ffff99"
- } )
- .animate( animation, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Size 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Size Effect
-//>>group: Effects
-//>>description: Resize an element to a specified width and height.
-//>>docs: http://api.jqueryui.com/size-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectSize = $.effects.define( "size", function( options, done ) {
-
- // Create element
- var baseline, factor, temp,
- element = $( this ),
-
- // Copy for children
- cProps = [ "fontSize" ],
- vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
- hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
-
- // Set options
- mode = options.mode,
- restore = mode !== "effect",
- scale = options.scale || "both",
- origin = options.origin || [ "middle", "center" ],
- position = element.css( "position" ),
- pos = element.position(),
- original = $.effects.scaledDimensions( element ),
- from = options.from || original,
- to = options.to || $.effects.scaledDimensions( element, 0 );
-
- $.effects.createPlaceholder( element );
-
- if ( mode === "show" ) {
- temp = from;
- from = to;
- to = temp;
- }
-
- // Set scaling factor
- factor = {
- from: {
- y: from.height / original.height,
- x: from.width / original.width
- },
- to: {
- y: to.height / original.height,
- x: to.width / original.width
- }
- };
-
- // Scale the css box
- if ( scale === "box" || scale === "both" ) {
-
- // Vertical props scaling
- if ( factor.from.y !== factor.to.y ) {
- from = $.effects.setTransition( element, vProps, factor.from.y, from );
- to = $.effects.setTransition( element, vProps, factor.to.y, to );
- }
-
- // Horizontal props scaling
- if ( factor.from.x !== factor.to.x ) {
- from = $.effects.setTransition( element, hProps, factor.from.x, from );
- to = $.effects.setTransition( element, hProps, factor.to.x, to );
- }
- }
-
- // Scale the content
- if ( scale === "content" || scale === "both" ) {
-
- // Vertical props scaling
- if ( factor.from.y !== factor.to.y ) {
- from = $.effects.setTransition( element, cProps, factor.from.y, from );
- to = $.effects.setTransition( element, cProps, factor.to.y, to );
- }
- }
-
- // Adjust the position properties based on the provided origin points
- if ( origin ) {
- baseline = $.effects.getBaseline( origin, original );
- from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top;
- from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left;
- to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top;
- to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left;
- }
- element.css( from );
-
- // Animate the children if desired
- if ( scale === "content" || scale === "both" ) {
-
- vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps );
- hProps = hProps.concat( [ "marginLeft", "marginRight" ] );
-
- // Only animate children with width attributes specified
- // TODO: is this right? should we include anything with css width specified as well
- element.find( "*[width]" ).each( function() {
- var child = $( this ),
- childOriginal = $.effects.scaledDimensions( child ),
- childFrom = {
- height: childOriginal.height * factor.from.y,
- width: childOriginal.width * factor.from.x,
- outerHeight: childOriginal.outerHeight * factor.from.y,
- outerWidth: childOriginal.outerWidth * factor.from.x
- },
- childTo = {
- height: childOriginal.height * factor.to.y,
- width: childOriginal.width * factor.to.x,
- outerHeight: childOriginal.height * factor.to.y,
- outerWidth: childOriginal.width * factor.to.x
- };
-
- // Vertical props scaling
- if ( factor.from.y !== factor.to.y ) {
- childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom );
- childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo );
- }
-
- // Horizontal props scaling
- if ( factor.from.x !== factor.to.x ) {
- childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom );
- childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo );
- }
-
- if ( restore ) {
- $.effects.saveStyle( child );
- }
-
- // Animate children
- child.css( childFrom );
- child.animate( childTo, options.duration, options.easing, function() {
-
- // Restore children
- if ( restore ) {
- $.effects.restoreStyle( child );
- }
- } );
- } );
- }
-
- // Animate
- element.animate( to, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: function() {
-
- var offset = element.offset();
-
- if ( to.opacity === 0 ) {
- element.css( "opacity", from.opacity );
- }
-
- if ( !restore ) {
- element
- .css( "position", position === "static" ? "relative" : position )
- .offset( offset );
-
- // Need to save style here so that automatic style restoration
- // doesn't restore to the original styles from before the animation.
- $.effects.saveStyle( element );
- }
-
- done();
- }
- } );
-
-} );
-
-
-/*!
- * jQuery UI Effects Scale 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Scale Effect
-//>>group: Effects
-//>>description: Grows or shrinks an element and its content.
-//>>docs: http://api.jqueryui.com/scale-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectScale = $.effects.define( "scale", function( options, done ) {
-
- // Create element
- var el = $( this ),
- mode = options.mode,
- percent = parseInt( options.percent, 10 ) ||
- ( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ),
-
- newOptions = $.extend( true, {
- from: $.effects.scaledDimensions( el ),
- to: $.effects.scaledDimensions( el, percent, options.direction || "both" ),
- origin: options.origin || [ "middle", "center" ]
- }, options );
-
- // Fade option to support puff
- if ( options.fade ) {
- newOptions.from.opacity = 1;
- newOptions.to.opacity = 0;
- }
-
- $.effects.effect.size.call( this, newOptions, done );
-} );
-
-
-/*!
- * jQuery UI Effects Puff 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Puff Effect
-//>>group: Effects
-//>>description: Creates a puff effect by scaling the element up and hiding it at the same time.
-//>>docs: http://api.jqueryui.com/puff-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) {
- var newOptions = $.extend( true, {}, options, {
- fade: true,
- percent: parseInt( options.percent, 10 ) || 150
- } );
-
- $.effects.effect.scale.call( this, newOptions, done );
-} );
-
-
-/*!
- * jQuery UI Effects Pulsate 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Pulsate Effect
-//>>group: Effects
-//>>description: Pulsates an element n times by changing the opacity to zero and back.
-//>>docs: http://api.jqueryui.com/pulsate-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) {
- var element = $( this ),
- mode = options.mode,
- show = mode === "show",
- hide = mode === "hide",
- showhide = show || hide,
-
- // Showing or hiding leaves off the "last" animation
- anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
- duration = options.duration / anims,
- animateTo = 0,
- i = 1,
- queuelen = element.queue().length;
-
- if ( show || !element.is( ":visible" ) ) {
- element.css( "opacity", 0 ).show();
- animateTo = 1;
- }
-
- // Anims - 1 opacity "toggles"
- for ( ; i < anims; i++ ) {
- element.animate( { opacity: animateTo }, duration, options.easing );
- animateTo = 1 - animateTo;
- }
-
- element.animate( { opacity: animateTo }, duration, options.easing );
-
- element.queue( done );
-
- $.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Shake 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Shake Effect
-//>>group: Effects
-//>>description: Shakes an element horizontally or vertically n times.
-//>>docs: http://api.jqueryui.com/shake-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectShake = $.effects.define( "shake", function( options, done ) {
-
- var i = 1,
- element = $( this ),
- direction = options.direction || "left",
- distance = options.distance || 20,
- times = options.times || 3,
- anims = times * 2 + 1,
- speed = Math.round( options.duration / anims ),
- ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
- positiveMotion = ( direction === "up" || direction === "left" ),
- animation = {},
- animation1 = {},
- animation2 = {},
-
- queuelen = element.queue().length;
-
- $.effects.createPlaceholder( element );
-
- // Animation
- animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
- animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
- animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
-
- // Animate
- element.animate( animation, speed, options.easing );
-
- // Shakes
- for ( ; i < times; i++ ) {
- element
- .animate( animation1, speed, options.easing )
- .animate( animation2, speed, options.easing );
- }
-
- element
- .animate( animation1, speed, options.easing )
- .animate( animation, speed / 2, options.easing )
- .queue( done );
-
- $.effects.unshift( element, queuelen, anims + 1 );
-} );
-
-
-/*!
- * jQuery UI Effects Slide 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Slide Effect
-//>>group: Effects
-//>>description: Slides an element in and out of the viewport.
-//>>docs: http://api.jqueryui.com/slide-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) {
- var startClip, startRef,
- element = $( this ),
- map = {
- up: [ "bottom", "top" ],
- down: [ "top", "bottom" ],
- left: [ "right", "left" ],
- right: [ "left", "right" ]
- },
- mode = options.mode,
- direction = options.direction || "left",
- ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
- positiveMotion = ( direction === "up" || direction === "left" ),
- distance = options.distance ||
- element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ),
- animation = {};
-
- $.effects.createPlaceholder( element );
-
- startClip = element.cssClip();
- startRef = element.position()[ ref ];
-
- // Define hide animation
- animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef;
- animation.clip = element.cssClip();
- animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ];
-
- // Reverse the animation if we're showing
- if ( mode === "show" ) {
- element.cssClip( animation.clip );
- element.css( ref, animation[ ref ] );
- animation.clip = startClip;
- animation[ ref ] = startRef;
- }
-
- // Actually animate
- element.animate( animation, {
- queue: false,
- duration: options.duration,
- easing: options.easing,
- complete: done
- } );
-} );
-
-
-/*!
- * jQuery UI Effects Transfer 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-//>>label: Transfer Effect
-//>>group: Effects
-//>>description: Displays a transfer effect from one element to another.
-//>>docs: http://api.jqueryui.com/transfer-effect/
-//>>demos: http://jqueryui.com/effect/
-
-
-
-var effect;
-if ( $.uiBackCompat !== false ) {
- effect = $.effects.define( "transfer", function( options, done ) {
- $( this ).transfer( options, done );
- } );
-}
-var effectsEffectTransfer = effect;
-
-
-
-
-}));
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.min.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.min.css
deleted file mode 100755
index 26691f6..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2017-04-02
-* http://jqueryui.com
-* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.min.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.min.js
deleted file mode 100755
index d48fb47..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2017-04-02
-* http://jqueryui.com
-* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}function i(t){for(var e,i;t.length&&t[0]!==document;){if(e=t.css("position"),("absolute"===e||"relative"===e||"fixed"===e)&&(i=parseInt(t.css("zIndex"),10),!isNaN(i)&&0!==i))return i;t=t.parent()}return 0}function s(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.regional.en=t.extend(!0,{},this.regional[""]),this.regional["en-US"]=t.extend(!0,{},this.regional.en),this.dpDiv=n(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function n(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.on("mouseout",i,function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).on("mouseover",i,o)}function o(){t.datepicker._isDisabledDatepicker(p.inline?p.dpDiv.parent()[0]:p.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))}function a(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}function r(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.ui=t.ui||{},t.ui.version="1.12.1";var h=0,l=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,s,n=l.call(arguments,1),o=0,a=n.length;a>o;o++)for(i in n[o])s=n[o][i],n[o].hasOwnProperty(i)&&void 0!==s&&(e[i]=t.isPlainObject(s)?t.isPlainObject(e[i])?t.widget.extend({},e[i],s):t.widget.extend({},s):s);return e},t.widget.bridge=function(e,i){var s=i.prototype.widgetFullName||e;t.fn[e]=function(n){var o="string"==typeof n,a=l.call(arguments,1),r=this;return o?this.length||"instance"!==n?this.each(function(){var i,o=t.data(this,s);return"instance"===n?(r=o,!1):o?t.isFunction(o[n])&&"_"!==n.charAt(0)?(i=o[n].apply(o,a),i!==o&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+n+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+n+"'")}):r=void 0:(a.length&&(n=t.widget.extend.apply(null,[n].concat(a))),this.each(function(){var e=t.data(this,s);e?(e.option(n||{}),e._init&&e._init()):t.data(this,s,new i(n,this))})),r}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,i){i=t(i||this.defaultElement||this)[0],this.element=t(i),this.uuid=h++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},i!==this&&(t.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===i&&this.destroy()}}),this.document=t(i.style?i.ownerDocument:i.document||i),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,g,m,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),k={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,g=_.offset,m=t.extend({},g),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),k[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?m.left+=p:"center"===n.at[0]&&(m.left+=p/2),"bottom"===n.at[1]?m.top+=f:"center"===n.at[1]&&(m.top+=f/2),u=e(k.at,p,f),m.left+=u[0],m.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),x=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},m),I=e(k.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=I[0],D.top+=I[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:x,collisionHeight:C,offset:[u[0]+I[0],u[1]+I[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=g.left-D.left,i=e+p-l,s=g.top-D.top,r=s+f-c,u={target:{element:v,left:g.left,top:g.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var c=!1;t(document).on("mouseup",function(){c=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!c){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,n="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),c=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,c=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.ui.safeBlur=function(e){e&&"body"!==e.nodeName.toLowerCase()&&t(e).trigger("blur")},t.widget("ui.draggable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this._addClass("ui-draggable"),this._setHandleClassName(),this._mouseInit()},_setOption:function(t,e){this._super(t,e),"handle"===t&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(this._blurActiveElement(e),this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(e){this.iframeBlocks=this.document.find(e).map(function(){var e=t(this);return t("<div>").css("position","absolute").appendTo(e.parent()).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(e){var i=t.ui.safeActiveElement(this.document[0]),s=t(e.target);s.closest(i).length||t.ui.safeBlur(i)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this._addClass(this.helper,"ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===t(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(e),this.originalPosition=this.position=this._generatePosition(e,!1),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_refreshOffsets:function(t){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:t.pageX-this.offset.left,top:t.pageY-this.offset.top}},_mouseDrag:function(e,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp(new t.Event("mouseup",e)),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1},_mouseUp:function(e){return this._unblockFrames(),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),this.handleElement.is(e.target)&&this.element.trigger("focus"),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp(new t.Event("mouseup",{target:this.element[0]})):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this._addClass(this.handleElement,"ui-draggable-handle")},_removeHandleClassName:function(){this._removeClass(this.handleElement,"ui-draggable-handle")},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper),n=s?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_isRootNode:function(t){return/(html|body)/i.test(t.tagName)||t===this.document[0]},_getParentOffset:function(){var e=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var t=this.element.position(),e=this._isRootNode(this.scrollParent[0]);return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+(e?0:this.scrollParent.scrollTop()),left:t.left-(parseInt(this.helper.css("left"),10)||0)+(e?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options,o=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,t(o).width()-this.helperProportions.width-this.margins.left,(t(o).height()||o.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)
-},_convertPositionTo:function(t,e){e||(e=this.position);var i="absolute"===t?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:e.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:e.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(t,e){var i,s,n,o,a=this.options,r=this._isRootNode(this.scrollParent[0]),h=t.pageX,l=t.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),e&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,t.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),t.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),t.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),t.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o),"y"===a.axis&&(h=this.originalPageX),"x"===a.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this._removeClass(this.helper,"ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s,this],!0),/^(drag|start|stop)/.test(e)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i,s){var n=t.extend({},i,{item:s.element});s.sortables=[],t(s.options.connectToSortable).each(function(){var i=t(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",e,n))})},stop:function(e,i,s){var n=t.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,t.each(s.sortables,function(){var t=this;t.isOver?(t.isOver=0,s.cancelHelperRemoval=!0,t.cancelHelperRemoval=!1,t._storedCSS={position:t.placeholder.css("position"),top:t.placeholder.css("top"),left:t.placeholder.css("left")},t._mouseStop(e),t.options.helper=t.options._helper):(t.cancelHelperRemoval=!0,t._trigger("deactivate",e,n))})},drag:function(e,i,s){t.each(s.sortables,function(){var n=!1,o=this;o.positionAbs=s.positionAbs,o.helperProportions=s.helperProportions,o.offset.click=s.offset.click,o._intersectsWith(o.containerCache)&&(n=!0,t.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==o&&this._intersectsWith(this.containerCache)&&t.contains(o.element[0],this.element[0])&&(n=!1),n})),n?(o.isOver||(o.isOver=1,s._parent=i.helper.parent(),o.currentItem=i.helper.appendTo(o.element).data("ui-sortable-item",!0),o.options._helper=o.options.helper,o.options.helper=function(){return i.helper[0]},e.target=o.currentItem[0],o._mouseCapture(e,!0),o._mouseStart(e,!0,!0),o.offset.click.top=s.offset.click.top,o.offset.click.left=s.offset.click.left,o.offset.parent.left-=s.offset.parent.left-o.offset.parent.left,o.offset.parent.top-=s.offset.parent.top-o.offset.parent.top,s._trigger("toSortable",e),s.dropped=o.element,t.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,o.fromOutside=s),o.currentItem&&(o._mouseDrag(e),i.position=o.position)):o.isOver&&(o.isOver=0,o.cancelHelperRemoval=!0,o.options._revert=o.options.revert,o.options.revert=!1,o._trigger("out",e,o._uiHash(o)),o._mouseStop(e,!0),o.options.revert=o.options._revert,o.options.helper=o.options._helper,o.placeholder&&o.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(e),i.position=s._generatePosition(e,!0),s._trigger("fromSortable",e),s.dropped=!1,t.each(s.sortables,function(){this.refreshPositions()}))})}}),t.ui.plugin.add("draggable","cursor",{start:function(e,i,s){var n=t("body"),o=s.options;n.css("cursor")&&(o._cursor=n.css("cursor")),n.css("cursor",o.cursor)},stop:function(e,i,s){var n=s.options;n._cursor&&t("body").css("cursor",n._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("opacity")&&(o._opacity=n.css("opacity")),n.css("opacity",o.opacity)},stop:function(e,i,s){var n=s.options;n._opacity&&t(i.helper).css("opacity",n._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(t,e,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(e,i,s){var n=s.options,o=!1,a=s.scrollParentNotHidden[0],r=s.document[0];a!==r&&"HTML"!==a.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+a.offsetHeight-e.pageY<n.scrollSensitivity?a.scrollTop=o=a.scrollTop+n.scrollSpeed:e.pageY-s.overflowOffset.top<n.scrollSensitivity&&(a.scrollTop=o=a.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+a.offsetWidth-e.pageX<n.scrollSensitivity?a.scrollLeft=o=a.scrollLeft+n.scrollSpeed:e.pageX-s.overflowOffset.left<n.scrollSensitivity&&(a.scrollLeft=o=a.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(e.pageY-t(r).scrollTop()<n.scrollSensitivity?o=t(r).scrollTop(t(r).scrollTop()-n.scrollSpeed):t(window).height()-(e.pageY-t(r).scrollTop())<n.scrollSensitivity&&(o=t(r).scrollTop(t(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(e.pageX-t(r).scrollLeft()<n.scrollSensitivity?o=t(r).scrollLeft(t(r).scrollLeft()-n.scrollSpeed):t(window).width()-(e.pageX-t(r).scrollLeft())<n.scrollSensitivity&&(o=t(r).scrollLeft(t(r).scrollLeft()+n.scrollSpeed)))),o!==!1&&t.ui.ddmanager&&!n.dropBehaviour&&t.ui.ddmanager.prepareOffsets(s,e)}}),t.ui.plugin.add("draggable","snap",{start:function(e,i,s){var n=s.options;s.snapElements=[],t(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var e=t(this),i=e.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:e.outerWidth(),height:e.outerHeight(),top:i.top,left:i.left})})},drag:function(e,i,s){var n,o,a,r,h,l,c,u,d,p,f=s.options,g=f.snapTolerance,m=i.offset.left,_=m+s.helperProportions.width,v=i.offset.top,b=v+s.helperProportions.height;for(d=s.snapElements.length-1;d>=0;d--)h=s.snapElements[d].left-s.margins.left,l=h+s.snapElements[d].width,c=s.snapElements[d].top-s.margins.top,u=c+s.snapElements[d].height,h-g>_||m>l+g||c-g>b||v>u+g||!t.contains(s.snapElements[d].item.ownerDocument,s.snapElements[d].item)?(s.snapElements[d].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=!1):("inner"!==f.snapMode&&(n=g>=Math.abs(c-b),o=g>=Math.abs(u-v),a=g>=Math.abs(h-_),r=g>=Math.abs(l-m),n&&(i.position.top=s._convertPositionTo("relative",{top:c-s.helperProportions.height,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||o||a||r,"outer"!==f.snapMode&&(n=g>=Math.abs(c-v),o=g>=Math.abs(u-b),a=g>=Math.abs(h-m),r=g>=Math.abs(l-_),n&&(i.position.top=s._convertPositionTo("relative",{top:c,left:0}).top),o&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[d].snapping&&(n||o||a||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,e,t.extend(s._uiHash(),{snapItem:s.snapElements[d].item})),s.snapElements[d].snapping=n||o||a||r||p)}}),t.ui.plugin.add("draggable","stack",{start:function(e,i,s){var n,o=s.options,a=t.makeArray(t(o.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});a.length&&(n=parseInt(t(a[0]).css("zIndex"),10)||0,t(a).each(function(e){t(this).css("zIndex",n+e)}),this.css("zIndex",n+a.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i,s){var n=t(i.helper),o=s.options;n.css("zIndex")&&(o._zIndex=n.css("zIndex")),n.css("zIndex",o.zIndex)},stop:function(e,i,s){var n=s.options;n._zIndex&&t(i.helper).css("zIndex",n._zIndex)}}),t.ui.draggable,t.widget("ui.droppable",{version:"1.12.1",widgetEventPrefix:"drop",options:{accept:"*",addClasses:!0,greedy:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(s)?s:function(t){return t.is(s)},this.proportions=function(){return arguments.length?(e=arguments[0],void 0):e?e:e={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this._addClass("ui-droppable")},_addToManager:function(e){t.ui.ddmanager.droppables[e]=t.ui.ddmanager.droppables[e]||[],t.ui.ddmanager.droppables[e].push(this)},_splice:function(t){for(var e=0;t.length>e;e++)t[e]===this&&t.splice(e,1)},_destroy:function(){var e=t.ui.ddmanager.droppables[this.options.scope];this._splice(e)},_setOption:function(e,i){if("accept"===e)this.accept=t.isFunction(i)?i:function(t){return t.is(i)};else if("scope"===e){var s=t.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(e,i)},_activate:function(e){var i=t.ui.ddmanager.current;this._addActiveClass(),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this._removeActiveClass(),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._addHoverClass(),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this._removeHoverClass(),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=t(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&u(s,t.extend(i,{offset:i.element.offset()}),i.options.tolerance,e)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this._removeActiveClass(),this._removeHoverClass(),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}},_addHoverClass:function(){this._addClass("ui-droppable-hover")},_removeHoverClass:function(){this._removeClass("ui-droppable-hover")},_addActiveClass:function(){this._addClass("ui-droppable-active")},_removeActiveClass:function(){this._removeClass("ui-droppable-active")}});var u=t.ui.intersect=function(){function t(t,e,i){return t>=e&&e+i>t}return function(e,i,s,n){if(!i.offset)return!1;var o=(e.positionAbs||e.position.absolute).left+e.margins.left,a=(e.positionAbs||e.position.absolute).top+e.margins.top,r=o+e.helperProportions.width,h=a+e.helperProportions.height,l=i.offset.left,c=i.offset.top,u=l+i.proportions().width,d=c+i.proportions().height;switch(s){case"fit":return o>=l&&u>=r&&a>=c&&d>=h;case"intersect":return o+e.helperProportions.width/2>l&&u>r-e.helperProportions.width/2&&a+e.helperProportions.height/2>c&&d>h-e.helperProportions.height/2;case"pointer":return t(n.pageY,c,i.proportions().height)&&t(n.pageX,l,i.proportions().width);case"touch":return(a>=c&&d>=a||h>=c&&d>=h||c>a&&h>d)&&(o>=l&&u>=o||r>=l&&u>=r||l>o&&r>u);default:return!1}}}();t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions().height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions({width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight}))}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&u(e,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").on("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=u(e,this,this.options.tolerance,i),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t(this).droppable("instance").options.scope===n}),o.length&&(s=t(o[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").off("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}},t.uiBackCompat!==!1&&t.widget("ui.droppable",t.ui.droppable,{options:{hoverClass:!1,activeClass:!1},_addActiveClass:function(){this._super(),this.options.activeClass&&this.element.addClass(this.options.activeClass)},_removeActiveClass:function(){this._super(),this.options.activeClass&&this.element.removeClass(this.options.activeClass)},_addHoverClass:function(){this._super(),this.options.hoverClass&&this.element.addClass(this.options.hoverClass)},_removeHoverClass:function(){this._super(),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass)}}),t.ui.droppable,t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};
-t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,g=s.maxWidth&&p>s.maxWidth,m=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),g&&(p-=l),m&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable,t.widget("ui.selectable",t.ui.mouse,{version:"1.12.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e=this;this._addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e.elementPos=t(e.element[0]).offset(),e.selectees=t(e.options.filter,e.element[0]),e._addClass(e.selectees,"ui-selectee"),e.selectees.each(function(){var i=t(this),s=i.offset(),n={left:s.left-e.elementPos.left,top:s.top-e.elementPos.top};t.data(this,"selectable-item",{element:this,$element:i,left:n.left,top:n.top,right:n.left+i.outerWidth(),bottom:n.top+i.outerHeight(),startselected:!1,selected:i.hasClass("ui-selected"),selecting:i.hasClass("ui-selecting"),unselecting:i.hasClass("ui-unselecting")})})},this.refresh(),this._mouseInit(),this.helper=t("<div>"),this._addClass(this.helper,"ui-selectable-helper")},_destroy:function(){this.selectees.removeData("selectable-item"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.elementPos=t(this.element[0]).offset(),this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(i._removeClass(s.$element,"ui-selected"),s.selected=!1,i._addClass(s.$element,"ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),i._removeClass(n.$element,s?"ui-unselecting":"ui-selected")._addClass(n.$element,s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!1,c={};i&&i.element!==s.element[0]&&(c.left=i.left+s.elementPos.left,c.right=i.right+s.elementPos.left,c.top=i.top+s.elementPos.top,c.bottom=i.bottom+s.elementPos.top,"touch"===n.tolerance?l=!(c.left>r||o>c.right||c.top>h||a>c.bottom):"fit"===n.tolerance&&(l=c.left>o&&r>c.right&&c.top>a&&h>c.bottom),l?(i.selected&&(s._removeClass(i.$element,"ui-selected"),i.selected=!1),i.unselecting&&(s._removeClass(i.$element,"ui-unselecting"),i.unselecting=!1),i.selecting||(s._addClass(i.$element,"ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,s._addClass(i.$element,"ui-selected"),i.selected=!0):(s._removeClass(i.$element,"ui-selecting"),i.selecting=!1,i.startselected&&(s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(s._removeClass(i.$element,"ui-selected"),i.selected=!1,s._addClass(i.$element,"ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");i._removeClass(s.$element,"ui-selecting")._addClass(s.$element,"ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}}),t.widget("ui.sortable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(t,e,i){return t>=e&&e+i>t},_isFloating:function(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))},_create:function(){this.containerCache={},this._addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(t,e){this._super(t,e),"handle"===t&&this._setHandleClassName()},_setHandleClassName:function(){var e=this;this._removeClass(this.element.find(".ui-sortable-handle"),"ui-sortable-handle"),t.each(this.items,function(){e._addClass(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item,"ui-sortable-handle")})},_destroy:function(){this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):void 0}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this._addClass(this.helper,"ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-this.document.scrollTop()<a.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-a.scrollSpeed):this.window.height()-(e.pageY-this.document.scrollTop())<a.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+a.scrollSpeed)),e.pageX-this.document.scrollLeft()<a.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-a.scrollSpeed):this.window.width()-(e.pageX-this.document.scrollLeft())<a.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp(new t.Event("mouseup",{target:null})),"original"===this.options.helper?(this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var e,i,s="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),n="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),o=s&&n;return o?(e=this._getDragVerticalDirection(),i=this._getDragHorizontalDirection(),this.floating?"right"===i||"down"===e?2:1:e&&("down"===e?2:1)):!1},_intersectsWithSides:function(t){var e=this._isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&e||"up"===s&&!e)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){function i(){r.push(this)}var s,n,o,a,r=[],h=[],l=this._connectWith();if(l&&e)for(s=l.length-1;s>=0;s--)for(o=t(l[s],this.document[0]),n=o.length-1;n>=0;n--)a=t.data(o[n],this.widgetFullName),a&&a!==this&&!a.options.disabled&&h.push([t.isFunction(a.options.items)?a.options.items.call(a.element):t(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a]);for(h.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return t(r)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i],this.document[0]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]);return e._addClass(n,"ui-sortable-placeholder",i||e.currentItem[0].className)._removeClass(n,"ui-sortable-helper"),"tbody"===s?e._createTrPlaceholder(e.currentItem.find("tr").eq(0),t("<tr>",e.document[0]).appendTo(n)):"tr"===s?e._createTrPlaceholder(e.currentItem,n):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_createTrPlaceholder:function(e,i){var s=this;e.children().each(function(){t("<td>&#160;</td>",s.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(e){var i,s,n,o,a,r,h,l,c,u,d=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!t.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(d&&t.contains(this.containers[i].element[0],d.element[0]))continue;d=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",e,this._uiHash(this)),this.containers[i].containerCache.over=0);if(d)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,o=null,c=d.floating||this._isFloating(this.currentItem),a=c?"left":"top",r=c?"width":"height",u=c?"pageX":"pageY",s=this.items.length-1;s>=0;s--)t.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[a],l=!1,e[u]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(e[u]-h)&&(n=Math.abs(e[u]-h),o=this.items[s],this.direction=l?"up":"down"));if(!o&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",e,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;o?this._rearrange(e,o,null,!0):this._rearrange(e,null,this.containers[p].element,!0),this._trigger("change",e,this._uiHash()),this.containers[p]._trigger("change",e,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",e,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.height()||document.body.parentNode.scrollHeight:this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){function i(t,e,i){return function(s){i._trigger(t,s,e._uiHash(e))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS),this._removeClass(this.currentItem,"ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&n.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||n.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(n.push(function(t){this._trigger("remove",t,this._uiHash())}),n.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)e||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!e){for(s=0;n.length>s;s++)n[s].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}}),t.widget("ui.accordion",{version:"1.12.1",options:{active:0,animate:{},classes:{"ui-accordion-header":"ui-corner-top","ui-accordion-header-collapsed":"ui-corner-all","ui-accordion-content":"ui-corner-bottom"},collapsible:!1,event:"click",header:"> li > :first-child, > :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t()}},_createIcons:function(){var e,i,s=this.options.icons;s&&(e=t("<span>"),this._addClass(e,"ui-accordion-header-icon","ui-icon "+s.header),e.prependTo(this.headers),i=this.active.children(".ui-accordion-header-icon"),this._removeClass(i,s.header)._addClass(i,null,s.activeHeader)._addClass(this.headers,"ui-accordion-icons"))
-},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),void 0)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),t(o).trigger("focus"),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().trigger("focus")},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var e,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var e=t(this),i=e.uniqueId().attr("id"),s=e.next(),n=s.uniqueId().attr("id");e.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(e=n.height(),this.element.siblings(":visible").each(function(){var i=t(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(e-=i.outerHeight(!0))}),this.headers.each(function(){e-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,e-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===s&&(e=0,this.headers.next().each(function(){var i=t(this).is(":visible");i||t(this).show(),e=Math.max(e,t(this).css("height","").height()),i||t(this).hide()}).height(e))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i,s,n=this.options,o=this.active,a=t(e.currentTarget),r=a[0]===o[0],h=r&&n.collapsible,l=h?t():a.next(),c=o.next(),u={oldHeader:o,oldPanel:c,newHeader:h?t():a,newPanel:l};e.preventDefault(),r&&!n.collapsible||this._trigger("beforeActivate",e,u)===!1||(n.active=h?!1:this.headers.index(a),this.active=r?t():a,this._toggle(u),this._removeClass(o,"ui-accordion-header-active","ui-state-active"),n.icons&&(i=o.children(".ui-accordion-header-icon"),this._removeClass(i,null,n.icons.activeHeader)._addClass(i,null,n.icons.header)),r||(this._removeClass(a,"ui-accordion-header-collapsed")._addClass(a,"ui-accordion-header-active","ui-state-active"),n.icons&&(s=a.children(".ui-accordion-header-icon"),this._removeClass(s,null,n.icons.header)._addClass(s,null,n.icons.activeHeader)),this._addClass(a.next(),"ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(t(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,e,i){var s,n,o,a=this,r=0,h=t.css("box-sizing"),l=t.length&&(!e.length||t.index()<e.index()),c=this.options.animate||{},u=l&&c.down||c,d=function(){a._toggleComplete(i)};return"number"==typeof u&&(o=u),"string"==typeof u&&(n=u),n=n||u.easing||c.easing,o=o||u.duration||c.duration,e.length?t.length?(s=t.show().outerHeight(),e.animate(this.hideProps,{duration:o,easing:n,step:function(t,e){e.now=Math.round(t)}}),t.hide().animate(this.showProps,{duration:o,easing:n,complete:d,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==a.options.heightStyle&&(i.now=Math.round(s-e.outerHeight()-r),r=0)}}),void 0):e.animate(this.hideProps,o,n,d):t.animate(this.showProps,o,n,d)},_toggleComplete:function(t){var e=t.oldPanel,i=e.prev();this._removeClass(e,"ui-accordion-content-active"),this._removeClass(i,"ui-accordion-header-active")._addClass(i,"ui-accordion-header-collapsed"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}}),t.widget("ui.menu",{version:"1.12.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,h=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=h.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("<span>").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=h.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)},_filterMenuItems:function(e){var i=e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(t.trim(t(this).children(".ui-menu-item-wrapper").text()))})}}),t.widget("ui.autocomplete",{version:"1.12.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("<ul>").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("<div>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):void 0},_search:function(t){this.pending++,this._addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var e=++this.requestIndex;return t.proxy(function(t){e===this.requestIndex&&this.__response(t),this.pending--,this.pending||this._removeClass("ui-autocomplete-loading")},this)},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this._off(this.document,"mousedown"),this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({},e,{label:e.label||e.value,value:e.value||e.label})})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next(),this._on(this.document,{mousedown:"_closeOnClickOutside"})},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<div>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("<div>").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete;var d=/ui-corner-([a-z]){2,6}/g;t.widget("ui.controlgroup",{version:"1.12.1",defaultElement:"<div>",options:{direction:"horizontal",disabled:null,onlyVisible:!0,items:{button:"input[type=button], input[type=submit], input[type=reset], button, a",controlgroupLabel:".ui-controlgroup-label",checkboxradio:"input[type='checkbox'], input[type='radio']",selectmenu:"select",spinner:".ui-spinner-input"}},_create:function(){this._enhance()},_enhance:function(){this.element.attr("role","toolbar"),this.refresh()},_destroy:function(){this._callChildMethod("destroy"),this.childWidgets.removeData("ui-controlgroup-data"),this.element.removeAttr("role"),this.options.items.controlgroupLabel&&this.element.find(this.options.items.controlgroupLabel).find(".ui-controlgroup-label-contents").contents().unwrap()},_initWidgets:function(){var e=this,i=[];t.each(this.options.items,function(s,n){var o,a={};return n?"controlgroupLabel"===s?(o=e.element.find(n),o.each(function(){var e=t(this);e.children(".ui-controlgroup-label-contents").length||e.contents().wrapAll("<span class='ui-controlgroup-label-contents'></span>")}),e._addClass(o,null,"ui-widget ui-widget-content ui-state-default"),i=i.concat(o.get()),void 0):(t.fn[s]&&(a=e["_"+s+"Options"]?e["_"+s+"Options"]("middle"):{classes:{}},e.element.find(n).each(function(){var n=t(this),o=n[s]("instance"),r=t.widget.extend({},a);if("button"!==s||!n.parent(".ui-spinner").length){o||(o=n[s]()[s]("instance")),o&&(r.classes=e._resolveClassesValues(r.classes,o)),n[s](r);var h=n[s]("widget");t.data(h[0],"ui-controlgroup-data",o?o:n[s]("instance")),i.push(h[0])}})),void 0):void 0}),this.childWidgets=t(t.unique(i)),this._addClass(this.childWidgets,"ui-controlgroup-item")},_callChildMethod:function(e){this.childWidgets.each(function(){var i=t(this),s=i.data("ui-controlgroup-data");s&&s[e]&&s[e]()})},_updateCornerClass:function(t,e){var i="ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all",s=this._buildSimpleOptions(e,"label").classes.label;this._removeClass(t,null,i),this._addClass(t,null,s)},_buildSimpleOptions:function(t,e){var i="vertical"===this.options.direction,s={classes:{}};return s.classes[e]={middle:"",first:"ui-corner-"+(i?"top":"left"),last:"ui-corner-"+(i?"bottom":"right"),only:"ui-corner-all"}[t],s},_spinnerOptions:function(t){var e=this._buildSimpleOptions(t,"ui-spinner");return e.classes["ui-spinner-up"]="",e.classes["ui-spinner-down"]="",e},_buttonOptions:function(t){return this._buildSimpleOptions(t,"ui-button")},_checkboxradioOptions:function(t){return this._buildSimpleOptions(t,"ui-checkboxradio-label")},_selectmenuOptions:function(t){var e="vertical"===this.options.direction;return{width:e?"auto":!1,classes:{middle:{"ui-selectmenu-button-open":"","ui-selectmenu-button-closed":""},first:{"ui-selectmenu-button-open":"ui-corner-"+(e?"top":"tl"),"ui-selectmenu-button-closed":"ui-corner-"+(e?"top":"left")},last:{"ui-selectmenu-button-open":e?"":"ui-corner-tr","ui-selectmenu-button-closed":"ui-corner-"+(e?"bottom":"right")},only:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"}}[t]}},_resolveClassesValues:function(e,i){var s={};return t.each(e,function(n){var o=i.options.classes[n]||"";o=t.trim(o.replace(d,"")),s[n]=(o+" "+e[n]).replace(/\s+/g," ")}),s},_setOption:function(t,e){return"direction"===t&&this._removeClass("ui-controlgroup-"+this.options.direction),this._super(t,e),"disabled"===t?(this._callChildMethod(e?"disable":"enable"),void 0):(this.refresh(),void 0)},refresh:function(){var e,i=this;this._addClass("ui-controlgroup ui-controlgroup-"+this.options.direction),"horizontal"===this.options.direction&&this._addClass(null,"ui-helper-clearfix"),this._initWidgets(),e=this.childWidgets,this.options.onlyVisible&&(e=e.filter(":visible")),e.length&&(t.each(["first","last"],function(t,s){var n=e[s]().data("ui-controlgroup-data");if(n&&i["_"+n.widgetName+"Options"]){var o=i["_"+n.widgetName+"Options"](1===e.length?"only":s);o.classes=i._resolveClassesValues(o.classes,n),n.element[n.widgetName](o)}else i._updateCornerClass(e[s](),s)}),this._callChildMethod("refresh"))}}),t.widget("ui.checkboxradio",[t.ui.formResetMixin,{version:"1.12.1",options:{disabled:null,label:null,icon:!0,classes:{"ui-checkboxradio-label":"ui-corner-all","ui-checkboxradio-icon":"ui-corner-all"}},_getCreateOptions:function(){var e,i,s=this,n=this._super()||{};return this._readType(),i=this.element.labels(),this.label=t(i[i.length-1]),this.label.length||t.error("No label found for checkboxradio widget"),this.originalLabel="",this.label.contents().not(this.element[0]).each(function(){s.originalLabel+=3===this.nodeType?t(this).text():this.outerHTML}),this.originalLabel&&(n.label=this.originalLabel),e=this.element[0].disabled,null!=e&&(n.disabled=e),n},_create:function(){var t=this.element[0].checked;this._bindFormResetHandler(),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled),this._setOption("disabled",this.options.disabled),this._addClass("ui-checkboxradio","ui-helper-hidden-accessible"),this._addClass(this.label,"ui-checkboxradio-label","ui-button ui-widget"),"radio"===this.type&&this._addClass(this.label,"ui-checkboxradio-radio-label"),this.options.label&&this.options.label!==this.originalLabel?this._updateLabel():this.originalLabel&&(this.options.label=this.originalLabel),this._enhance(),t&&(this._addClass(this.label,"ui-checkboxradio-checked","ui-state-active"),this.icon&&this._addClass(this.icon,null,"ui-state-hover")),this._on({change:"_toggleClasses",focus:function(){this._addClass(this.label,null,"ui-state-focus ui-visual-focus")},blur:function(){this._removeClass(this.label,null,"ui-state-focus ui-visual-focus")}})},_readType:function(){var e=this.element[0].nodeName.toLowerCase();this.type=this.element[0].type,"input"===e&&/radio|checkbox/.test(this.type)||t.error("Can't create checkboxradio on element.nodeName="+e+" and element.type="+this.type)},_enhance:function(){this._updateIcon(this.element[0].checked)},widget:function(){return this.label},_getRadioGroup:function(){var e,i=this.element[0].name,s="input[name='"+t.ui.escapeSelector(i)+"']";return i?(e=this.form.length?t(this.form[0].elements).filter(s):t(s).filter(function(){return 0===t(this).form().length}),e.not(this.element)):t([])},_toggleClasses:function(){var e=this.element[0].checked;this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",e),this.options.icon&&"checkbox"===this.type&&this._toggleClass(this.icon,null,"ui-icon-check ui-state-checked",e)._toggleClass(this.icon,null,"ui-icon-blank",!e),"radio"===this.type&&this._getRadioGroup().each(function(){var e=t(this).checkboxradio("instance");e&&e._removeClass(e.label,"ui-checkboxradio-checked","ui-state-active")})},_destroy:function(){this._unbindFormResetHandler(),this.icon&&(this.icon.remove(),this.iconSpace.remove())},_setOption:function(t,e){return"label"!==t||e?(this._super(t,e),"disabled"===t?(this._toggleClass(this.label,null,"ui-state-disabled",e),this.element[0].disabled=e,void 0):(this.refresh(),void 0)):void 0},_updateIcon:function(e){var i="ui-icon ui-icon-background ";this.options.icon?(this.icon||(this.icon=t("<span>"),this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-checkboxradio-icon-space")),"checkbox"===this.type?(i+=e?"ui-icon-check ui-state-checked":"ui-icon-blank",this._removeClass(this.icon,null,e?"ui-icon-blank":"ui-icon-check")):i+="ui-icon-blank",this._addClass(this.icon,"ui-checkboxradio-icon",i),e||this._removeClass(this.icon,null,"ui-icon-check ui-state-checked"),this.icon.prependTo(this.label).after(this.iconSpace)):void 0!==this.icon&&(this.icon.remove(),this.iconSpace.remove(),delete this.icon)
-},_updateLabel:function(){var t=this.label.contents().not(this.element[0]);this.icon&&(t=t.not(this.icon[0])),this.iconSpace&&(t=t.not(this.iconSpace[0])),t.remove(),this.label.append(this.options.label)},refresh:function(){var t=this.element[0].checked,e=this.element[0].disabled;this._updateIcon(t),this._toggleClass(this.label,"ui-checkboxradio-checked","ui-state-active",t),null!==this.options.label&&this._updateLabel(),e!==this.options.disabled&&this._setOptions({disabled:e})}}]),t.ui.checkboxradio,t.widget("ui.button",{version:"1.12.1",defaultElement:"<button>",options:{classes:{"ui-button":"ui-corner-all"},disabled:null,icon:null,iconPosition:"beginning",label:null,showLabel:!0},_getCreateOptions:function(){var t,e=this._super()||{};return this.isInput=this.element.is("input"),t=this.element[0].disabled,null!=t&&(e.disabled=t),this.originalLabel=this.isInput?this.element.val():this.element.html(),this.originalLabel&&(e.label=this.originalLabel),e},_create:function(){!this.option.showLabel&!this.options.icon&&(this.options.showLabel=!0),null==this.options.disabled&&(this.options.disabled=this.element[0].disabled||!1),this.hasTitle=!!this.element.attr("title"),this.options.label&&this.options.label!==this.originalLabel&&(this.isInput?this.element.val(this.options.label):this.element.html(this.options.label)),this._addClass("ui-button","ui-widget"),this._setOption("disabled",this.options.disabled),this._enhance(),this.element.is("a")&&this._on({keyup:function(e){e.keyCode===t.ui.keyCode.SPACE&&(e.preventDefault(),this.element[0].click?this.element[0].click():this.element.trigger("click"))}})},_enhance:function(){this.element.is("button")||this.element.attr("role","button"),this.options.icon&&(this._updateIcon("icon",this.options.icon),this._updateTooltip())},_updateTooltip:function(){this.title=this.element.attr("title"),this.options.showLabel||this.title||this.element.attr("title",this.options.label)},_updateIcon:function(e,i){var s="iconPosition"!==e,n=s?this.options.iconPosition:i,o="top"===n||"bottom"===n;this.icon?s&&this._removeClass(this.icon,null,this.options.icon):(this.icon=t("<span>"),this._addClass(this.icon,"ui-button-icon","ui-icon"),this.options.showLabel||this._addClass("ui-button-icon-only")),s&&this._addClass(this.icon,null,i),this._attachIcon(n),o?(this._addClass(this.icon,null,"ui-widget-icon-block"),this.iconSpace&&this.iconSpace.remove()):(this.iconSpace||(this.iconSpace=t("<span> </span>"),this._addClass(this.iconSpace,"ui-button-icon-space")),this._removeClass(this.icon,null,"ui-wiget-icon-block"),this._attachIconSpace(n))},_destroy:function(){this.element.removeAttr("role"),this.icon&&this.icon.remove(),this.iconSpace&&this.iconSpace.remove(),this.hasTitle||this.element.removeAttr("title")},_attachIconSpace:function(t){this.icon[/^(?:end|bottom)/.test(t)?"before":"after"](this.iconSpace)},_attachIcon:function(t){this.element[/^(?:end|bottom)/.test(t)?"append":"prepend"](this.icon)},_setOptions:function(t){var e=void 0===t.showLabel?this.options.showLabel:t.showLabel,i=void 0===t.icon?this.options.icon:t.icon;e||i||(t.showLabel=!0),this._super(t)},_setOption:function(t,e){"icon"===t&&(e?this._updateIcon(t,e):this.icon&&(this.icon.remove(),this.iconSpace&&this.iconSpace.remove())),"iconPosition"===t&&this._updateIcon(t,e),"showLabel"===t&&(this._toggleClass("ui-button-icon-only",null,!e),this._updateTooltip()),"label"===t&&(this.isInput?this.element.val(e):(this.element.html(e),this.icon&&(this._attachIcon(this.options.iconPosition),this._attachIconSpace(this.options.iconPosition)))),this._super(t,e),"disabled"===t&&(this._toggleClass(null,"ui-state-disabled",e),this.element[0].disabled=e,e&&this.element.blur())},refresh:function(){var t=this.element.is("input, button")?this.element[0].disabled:this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOptions({disabled:t}),this._updateTooltip()}}),t.uiBackCompat!==!1&&(t.widget("ui.button",t.ui.button,{options:{text:!0,icons:{primary:null,secondary:null}},_create:function(){this.options.showLabel&&!this.options.text&&(this.options.showLabel=this.options.text),!this.options.showLabel&&this.options.text&&(this.options.text=this.options.showLabel),this.options.icon||!this.options.icons.primary&&!this.options.icons.secondary?this.options.icon&&(this.options.icons.primary=this.options.icon):this.options.icons.primary?this.options.icon=this.options.icons.primary:(this.options.icon=this.options.icons.secondary,this.options.iconPosition="end"),this._super()},_setOption:function(t,e){return"text"===t?(this._super("showLabel",e),void 0):("showLabel"===t&&(this.options.text=e),"icon"===t&&(this.options.icons.primary=e),"icons"===t&&(e.primary?(this._super("icon",e.primary),this._super("iconPosition","beginning")):e.secondary&&(this._super("icon",e.secondary),this._super("iconPosition","end"))),this._superApply(arguments),void 0)}}),t.fn.button=function(e){return function(){return!this.length||this.length&&"INPUT"!==this[0].tagName||this.length&&"INPUT"===this[0].tagName&&"checkbox"!==this.attr("type")&&"radio"!==this.attr("type")?e.apply(this,arguments):(t.ui.checkboxradio||t.error("Checkboxradio widget missing"),0===arguments.length?this.checkboxradio({icon:!1}):this.checkboxradio.apply(this,arguments))}}(t.fn.button),t.fn.buttonset=function(){return t.ui.controlgroup||t.error("Controlgroup widget missing"),"option"===arguments[0]&&"items"===arguments[1]&&arguments[2]?this.controlgroup.apply(this,[arguments[0],"items.button",arguments[2]]):"option"===arguments[0]&&"items"===arguments[1]?this.controlgroup.apply(this,[arguments[0],"items.button"]):("object"==typeof arguments[0]&&arguments[0].items&&(arguments[0].items={button:arguments[0].items}),this.controlgroup.apply(this,arguments))}),t.ui.button,t.extend(t.ui,{datepicker:{version:"1.12.1"}});var p;t.extend(s.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return a(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var s=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?n(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).on("keydown",this._doKeyDown).on("keypress",this._doKeyPress).on("keyup",this._doKeyUp),this._autoSize(i),t.data(e,"datepicker",i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.off("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.on("focus",this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.on("click",function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,n,o){var r,h,l,c,u,d=this._dialogInst;return d||(this.uuid+=1,r="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+r+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.on("keydown",this._doKeyDown),t("body").append(this._dialogInput),d=this._dialogInst=this._newInst(this._dialogInput,!1),d.settings={},t.data(this._dialogInput[0],"datepicker",d)),a(d.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(d,i):i,this._dialogInput.val(i),this._pos=o?o.length?o:[o.pageX,o.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,c=document.documentElement.scrollLeft||document.body.scrollLeft,u=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+c,l/2-150+u]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),d.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],"datepicker",d),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,"datepicker");s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).off("focus",this._showDatepicker).off("keydown",this._doKeyDown).off("keypress",this._doKeyPress).off("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),p===n&&(p=null))},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,"datepicker");n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,i,s){var n,o,r,h,l=this._getInst(e);return 2===arguments.length&&"string"==typeof i?"defaults"===i?t.extend({},t.datepicker._defaults):l?"all"===i?t.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),o=this._getDateDatepicker(e,!0),r=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),a(l.settings,n),null!==r&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,r)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(e):this._enableDatepicker(e)),this._attachments(t(e),l),this._autoSize(l),this._setDate(l,o),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var i,s,n=t.datepicker._getInst(e.target);return t.datepicker._get(n,"constrainInput")?(i=t.datepicker._possibleChars(t.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),e.ctrlKey||e.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var s,n,o,r,h,l,c;s=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==s&&(t.datepicker._curInst.dpDiv.stop(!0,!0),s&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),n=t.datepicker._get(s,"beforeShow"),o=n?n.apply(e,[e,s]):{},o!==!1&&(a(s.settings,o),s.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(s),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),r=!1,t(e).parents().each(function(){return r|="fixed"===t(this).css("position"),!r}),h={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,s.dpDiv.empty(),s.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(s),h=t.datepicker._checkOffset(s,h,r),s.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":r?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),s.inline||(l=t.datepicker._get(s,"showAnim"),c=t.datepicker._get(s,"duration"),s.dpDiv.css("z-index",i(t(e))+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[l]?s.dpDiv.show(l,t.datepicker._get(s,"showOptions"),c):s.dpDiv[l||"show"](l?c:null),t.datepicker._shouldFocusInput(s)&&s.input.trigger("focus"),t.datepicker._curInst=s))}},_updateDatepicker:function(e){this.maxRows=4,p=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var i,s=this._getNumberOfMonths(e),n=s[1],a=17,r=e.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.trigger("focus"),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,a=this._curInst;!a||e&&a!==t.data(e,"datepicker")||this._datepickerShowing&&(i=this._get(a,"showAnim"),s=this._get(a,"duration"),n=function(){t.datepicker._tidyDialog(a)},t.effects&&(t.effects.effect[i]||t.effects[i])?a.dpDiv.hide(i,t.datepicker._get(a,"showOptions"),s,n):a.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(a,"onClose"),o&&o.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).off(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.trigger("focus"),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).val(n))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(e,i,s){if(null==e||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,o,a,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,c="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),u=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,d=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,g=-1,m=-1,_=-1,v=-1,b=!1,y=function(t){var i=e.length>n+1&&e.charAt(n+1)===t;return i&&n++,i},w=function(t){var e=y(t),s="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n="y"===t?s:1,o=RegExp("^\\d{"+n+","+s+"}"),a=i.substring(h).match(o);if(!a)throw"Missing number at position "+h;return h+=a[0].length,parseInt(a[0],10)},k=function(e,s,n){var o=-1,a=t.map(y(e)?n:s,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(a,function(t,e){var s=e[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(o=e[0],h+=s.length,!1):void 0}),-1!==o)return o+1;throw"Unknown name at position "+h},x=function(){if(i.charAt(h)!==e.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;e.length>n;n++)if(b)"'"!==e.charAt(n)||y("'")?x():b=!1;else switch(e.charAt(n)){case"d":_=w("d");break;case"D":k("D",u,d);break;case"o":v=w("o");break;case"m":m=w("m");break;case"M":m=k("M",p,f);break;case"y":g=w("y");break;case"@":r=new Date(w("@")),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"!":r=new Date((w("!")-this._ticksTo1970)/1e4),g=r.getFullYear(),m=r.getMonth()+1,_=r.getDate();break;case"'":y("'")?x():b=!0;break;default:x()}if(i.length>h&&(a=i.substr(h),!/^\s+/.test(a)))throw"Extra/unparsed characters found in date: "+a;if(-1===g?g=(new Date).getFullYear():100>g&&(g+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c>=g?0:-100)),v>-1)for(m=1,_=v;;){if(o=this._getDaysInMonth(g,m-1),o>=_)break;m++,_-=o}if(r=this._daylightSavingAdjust(new Date(g,m-1,_)),r.getFullYear()!==g||r.getMonth()+1!==m||r.getDate()!==_)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("y")?e.getFullYear():(10>e.getFullYear()%100?"0":"")+e.getFullYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":h("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,e){return void 0!==t.settings[e]?t.settings[e]:this._defaults[e]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).on(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,_,v,b,y,w,k,x,C,D,I,P,T,M,S,H,z,O,A,N,W,E,F,L,R=new Date,B=this._daylightSavingAdjust(new Date(R.getFullYear(),R.getMonth(),R.getDate())),Y=this._get(t,"isRTL"),j=this._get(t,"showButtonPanel"),q=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),V=this._get(t,"showCurrentAtPos"),$=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],G=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-V,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=Q&&Q>e?Q:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-$,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":q?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+$,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":q?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?G:B,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",l=j?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(Y?"":h)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),_=this._get(t,"showOtherMonths"),v=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,C=0;U[1]>C;C++){if(D=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),I=" ui-corner-all",P="",X){if(P+="<div class='ui-datepicker-group",U[1]>1)switch(C){case 0:P+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");
-break;case U[1]-1:P+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:P+=" ui-datepicker-group-middle",I=""}P+="'>"}for(P+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,Q,J,k>0||C>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",T=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,T+="<th scope='col'"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(P+=T+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),H=(this._getFirstDayOfMonth(te,Z)-c+7)%7,z=Math.ceil((H+S)/7),O=X?this.maxRows>z?this.maxRows:z:z,this.maxRows=O,A=this._daylightSavingAdjust(new Date(te,Z,1-H)),N=0;O>N;N++){for(P+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(A)+"</td>":"",w=0;7>w;w++)E=m?m.apply(t.input?t.input[0]:null,[A]):[!0,""],F=A.getMonth()!==Z,L=F&&!v||!E[0]||Q&&Q>A||J&&A>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(A.getTime()===D.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===A.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!_?"":" "+E[1]+(A.getTime()===G.getTime()?" "+this._currentClass:"")+(A.getTime()===B.getTime()?" ui-datepicker-today":""))+"'"+(F&&!_||!E[2]?"":" title='"+E[2].replace(/'/g,"&#39;")+"'")+(L?"":" data-handler='selectDay' data-event='click' data-month='"+A.getMonth()+"' data-year='"+A.getFullYear()+"'")+">"+(F&&!_?"&#xa0;":L?"<span class='ui-state-default'>"+A.getDate()+"</span>":"<a class='ui-state-default"+(A.getTime()===B.getTime()?" ui-state-highlight":"")+(A.getTime()===G.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+A.getDate()+"</a>")+"</td>",A.setDate(A.getDate()+1),A=this._daylightSavingAdjust(A);P+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),P+="</tbody></table>"+(X?"</div>"+(U[0]>0&&C===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=P}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g,m=this._get(t,"changeMonth"),_=this._get(t,"changeYear"),v=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(v||(b+=y+(!o&&m&&_?"":"&#xa0;")),!t.yearshtml)if(t.yearshtml="",o||!_)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),v&&(b+=(!o&&m&&_?"":"&#xa0;")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.selectedYear+("Y"===i?e:0),n=t.selectedMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).on("mousedown",t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new s,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.12.1",t.datepicker,t.widget("ui.dialog",{version:"1.12.1",options:{appendTo:"body",autoOpen:!0,buttons:[],classes:{"ui-dialog":"ui-corner-all","ui-dialog-titlebar":"ui-corner-all"},closeOnEscape:!0,closeText:"Close",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),null==this.options.title&&null!=this.originalTitle&&(this.options.title=this.originalTitle),this.options.disabled&&(this.options.disabled=!1),this._createWrapper(),this.element.show().removeAttr("title").appendTo(this.uiDialog),this._addClass("ui-dialog-content","ui-widget-content"),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().css(this.originalCss).detach(),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),this.opener.filter(":focusable").trigger("focus").length||t.ui.safeBlur(t.ui.safeActiveElement(this.document[0])),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(e,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+t(this).css("z-index")}).get(),o=Math.max.apply(null,n);return o>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",o+1),s=!0),s&&!i&&this._trigger("focus",e),s},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=t(t.ui.safeActiveElement(this.document[0])),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var t=this._focusedElement;t||(t=this.element.find("[autofocus]")),t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).trigger("focus")},_keepFocus:function(e){function i(){var e=t.ui.safeActiveElement(this.document[0]),i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._addClass(this.uiDialog,"ui-dialog","ui-widget ui-widget-content ui-front"),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),void 0;if(e.keyCode===t.ui.keyCode.TAB&&!e.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(this._delay(function(){n.trigger("focus")}),e.preventDefault()):(this._delay(function(){s.trigger("focus")}),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>"),this._addClass(this.uiDialogTitlebar,"ui-dialog-titlebar","ui-widget-header ui-helper-clearfix"),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.trigger("focus")}}),this.uiDialogTitlebarClose=t("<button type='button'></button>").button({label:t("<a>").text(this.options.closeText).html(),icon:"ui-icon-closethick",showLabel:!1}).appendTo(this.uiDialogTitlebar),this._addClass(this.uiDialogTitlebarClose,"ui-dialog-titlebar-close"),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().prependTo(this.uiDialogTitlebar),this._addClass(e,"ui-dialog-title"),this._title(e),this.uiDialogTitlebar.prependTo(this.uiDialog),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title?t.text(this.options.title):t.html("&#160;")},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>"),this._addClass(this.uiDialogButtonPane,"ui-dialog-buttonpane","ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").appendTo(this.uiDialogButtonPane),this._addClass(this.uiButtonSet,"ui-dialog-buttonset"),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this._removeClass(this.uiDialog,"ui-dialog-buttons"),void 0):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,o={icon:s.icon,iconPosition:s.iconPosition,showLabel:s.showLabel,icons:s.icons,text:s.text},delete s.click,delete s.icon,delete s.iconPosition,delete s.showLabel,delete s.icons,"boolean"==typeof s.text&&delete s.text,t("<button></button>",s).button(o).appendTo(e.uiButtonSet).on("click",function(){n.apply(e.element[0],arguments)})}),this._addClass(this.uiDialog,"ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){i._addClass(t(this),"ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){var a=o.offset.left-i.document.scrollLeft(),r=o.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(a>=0?"+":"")+a+" "+"top"+(r>=0?"+":"")+r,of:i.window},i._removeClass(t(this),"ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){i._addClass(t(this),"ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){var a=i.uiDialog.offset(),r=a.left-i.document.scrollLeft(),h=a.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},i._removeClass(t(this),"ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_trackFocus:function(){this._on(this.widget(),{focusin:function(e){this._makeFocusTarget(),this._focusedElement=t(e.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var e=this._trackingInstances(),i=t.inArray(this,e);-1!==i&&e.splice(i,1)},_trackingInstances:function(){var t=this.document.data("ui-dialog-instances");return t||(t=[],this.document.data("ui-dialog-instances",t)),t},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(e){var i=this,s=!1,n={};t.each(e,function(t,e){i._setOption(t,e),t in i.sizeRelatedOptions&&(s=!0),t in i.resizableRelatedOptions&&(n[t]=e)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,i){var s,n,o=this.uiDialog;"disabled"!==e&&(this._super(e,i),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:t("<a>").text(""+this.options.closeText).html()}),"draggable"===e&&(s=o.is(":data(ui-draggable)"),s&&!i&&o.draggable("destroy"),!s&&i&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(n=o.is(":data(ui-resizable)"),n&&!i&&o.resizable("destroy"),n&&"string"==typeof i&&o.resizable("option","handles",i),n||i===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=!0;this._delay(function(){e=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(t){e||this._allowInteraction(t)||(t.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=t("<div>").appendTo(this._appendTo()),this._addClass(this.overlay,null,"ui-widget-overlay ui-front"),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var t=this.document.data("ui-dialog-overlays")-1;t?this.document.data("ui-dialog-overlays",t):(this._off(this.document,"focusin"),this.document.removeData("ui-dialog-overlays")),this.overlay.remove(),this.overlay=null}}}),t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{options:{dialogClass:""},_createWrapper:function(){this._super(),this.uiDialog.addClass(this.options.dialogClass)},_setOption:function(t,e){"dialogClass"===t&&this.uiDialog.removeClass(this.options.dialogClass).addClass(e),this._superApply(arguments)}}),t.ui.dialog,t.widget("ui.progressbar",{version:"1.12.1",options:{classes:{"ui-progressbar":"ui-corner-all","ui-progressbar-value":"ui-corner-left","ui-progressbar-complete":"ui-corner-right"},max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.attr({role:"progressbar","aria-valuemin":this.min}),this._addClass("ui-progressbar","ui-widget ui-widget-content"),this.valueDiv=t("<div>").appendTo(this.element),this._addClass(this.valueDiv,"ui-progressbar-value","ui-widget-header"),this._refreshValue()},_destroy:function(){this.element.removeAttr("role aria-valuemin aria-valuemax aria-valuenow"),this.valueDiv.remove()},value:function(t){return void 0===t?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),void 0)},_constrainedValue:function(t){return void 0===t&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).width(i.toFixed(0)+"%"),this._toggleClass(this.valueDiv,"ui-progressbar-complete",null,e===this.options.max)._toggleClass("ui-progressbar-indeterminate",null,this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div>").appendTo(this.valueDiv),this._addClass(this.overlayDiv,"ui-progressbar-overlay"))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}}),t.widget("ui.selectmenu",[t.ui.formResetMixin,{version:"1.12.1",defaultElement:"<select>",options:{appendTo:null,classes:{"ui-selectmenu-button-open":"ui-corner-top","ui-selectmenu-button-closed":"ui-corner-all"},disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:!1,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this._bindFormResetHandler(),this._rendered=!1,this.menuItems=t()},_drawButton:function(){var e,i=this,s=this._parseOption(this.element.find("option:selected"),this.element[0].selectedIndex);this.labels=this.element.labels().attr("for",this.ids.button),this._on(this.labels,{click:function(t){this.button.focus(),t.preventDefault()}}),this.element.hide(),this.button=t("<span>",{tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true",title:this.element.attr("title")}).insertAfter(this.element),this._addClass(this.button,"ui-selectmenu-button ui-selectmenu-button-closed","ui-button ui-widget"),e=t("<span>").appendTo(this.button),this._addClass(e,"ui-selectmenu-icon","ui-icon "+this.options.icons.button),this.buttonItem=this._renderButtonItem(s).appendTo(this.button),this.options.width!==!1&&this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){i._rendered||i._refreshMenu()})},_drawMenu:function(){var e=this;this.menu=t("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=t("<div>").append(this.menu),this._addClass(this.menuWrap,"ui-selectmenu-menu","ui-front"),this.menuWrap.appendTo(this._appendTo()),this.menuInstance=this.menu.menu({classes:{"ui-menu":"ui-corner-bottom"},role:"listbox",select:function(t,i){t.preventDefault(),e._setSelection(),e._select(i.item.data("ui-selectmenu-item"),t)},focus:function(t,i){var s=i.item.data("ui-selectmenu-item");null!=e.focusIndex&&s.index!==e.focusIndex&&(e._trigger("focus",t,{item:s}),e.isOpen||e._select(s,t)),e.focusIndex=s.index,e.button.attr("aria-activedescendant",e.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(this._getSelectedItem().data("ui-selectmenu-item")||{})),null===this.options.width&&this._resizeButton()},_refreshMenu:function(){var t,e=this.element.find("option");this.menu.empty(),this._parseOptions(e),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup").find(".ui-menu-item-wrapper"),this._rendered=!0,e.length&&(t=this._getSelectedItem(),this.menuInstance.focus(null,t),this._setAria(t.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(t){this.options.disabled||(this._rendered?(this._removeClass(this.menu.find(".ui-state-active"),null,"ui-state-active"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.menuItems.length&&(this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",t)))},_position:function(){this.menuWrap.position(t.extend({of:this.button},this.options.position))},close:function(t){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",t))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderButtonItem:function(e){var i=t("<span>");return this._setText(i,e.label),this._addClass(i,"ui-selectmenu-text"),i},_renderMenu:function(e,i){var s=this,n="";t.each(i,function(i,o){var a;o.optgroup!==n&&(a=t("<li>",{text:o.optgroup}),s._addClass(a,"ui-selectmenu-optgroup","ui-menu-divider"+(o.element.parent("optgroup").prop("disabled")?" ui-state-disabled":"")),a.appendTo(e),n=o.optgroup),s._renderItemData(e,o)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-selectmenu-item",e)},_renderItem:function(e,i){var s=t("<li>"),n=t("<div>",{title:i.element.attr("title")});return i.disabled&&this._addClass(s,null,"ui-state-disabled"),this._setText(n,i.label),s.append(n).appendTo(e)},_setText:function(t,e){e?t.text(e):t.html("&#160;")},_move:function(t,e){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex).parent("li"):(i=this.menuItems.eq(this.element[0].selectedIndex).parent("li"),n+=":not(.ui-state-disabled)"),s="first"===t||"last"===t?i["first"===t?"prevAll":"nextAll"](n).eq(-1):i[t+"All"](n).eq(0),s.length&&this.menuInstance.focus(e,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex).parent("li")},_toggle:function(t){this[this.isOpen?"close":"open"](t)},_setSelection:function(){var t;this.range&&(window.getSelection?(t=window.getSelection(),t.removeAllRanges(),t.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(e){this.isOpen&&(t(e.target).closest(".ui-selectmenu-menu, #"+t.ui.escapeSelector(this.ids.button)).length||this.close(e))}},_buttonEvents:{mousedown:function(){var t;window.getSelection?(t=window.getSelection(),t.rangeCount&&(this.range=t.getRangeAt(0))):this.range=document.selection.createRange()},click:function(t){this._setSelection(),this._toggle(t)},keydown:function(e){var i=!0;switch(e.keyCode){case t.ui.keyCode.TAB:case t.ui.keyCode.ESCAPE:this.close(e),i=!1;break;case t.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(e);break;case t.ui.keyCode.UP:e.altKey?this._toggle(e):this._move("prev",e);break;case t.ui.keyCode.DOWN:e.altKey?this._toggle(e):this._move("next",e);break;case t.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(e):this._toggle(e);break;case t.ui.keyCode.LEFT:this._move("prev",e);break;case t.ui.keyCode.RIGHT:this._move("next",e);break;case t.ui.keyCode.HOME:case t.ui.keyCode.PAGE_UP:this._move("first",e);break;case t.ui.keyCode.END:case t.ui.keyCode.PAGE_DOWN:this._move("last",e);break;default:this.menu.trigger(e),i=!1}i&&e.preventDefault()}},_selectFocusedItem:function(t){var e=this.menuItems.eq(this.focusIndex).parent("li");e.hasClass("ui-state-disabled")||this._select(e.data("ui-selectmenu-item"),t)},_select:function(t,e){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=t.index,this.buttonItem.replaceWith(this.buttonItem=this._renderButtonItem(t)),this._setAria(t),this._trigger("select",e,{item:t}),t.index!==i&&this._trigger("change",e,{item:t}),this.close(e)},_setAria:function(t){var e=this.menuItems.eq(t.index).attr("id");this.button.attr({"aria-labelledby":e,"aria-activedescendant":e}),this.menu.attr("aria-activedescendant",e)},_setOption:function(t,e){if("icons"===t){var i=this.button.find("span.ui-icon");this._removeClass(i,null,this.options.icons.button)._addClass(i,null,e.button)}this._super(t,e),"appendTo"===t&&this.menuWrap.appendTo(this._appendTo()),"width"===t&&this._resizeButton()},_setOptionDisabled:function(t){this._super(t),this.menuInstance.option("disabled",t),this.button.attr("aria-disabled",t),this._toggleClass(this.button,null,"ui-state-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_toggleAttr:function(){this.button.attr("aria-expanded",this.isOpen),this._removeClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"closed":"open"))._addClass(this.button,"ui-selectmenu-button-"+(this.isOpen?"open":"closed"))._toggleClass(this.menuWrap,"ui-selectmenu-open",null,this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var t=this.options.width;return t===!1?(this.button.css("width",""),void 0):(null===t&&(t=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(t),void 0)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){var t=this._super();return t.disabled=this.element.prop("disabled"),t},_parseOptions:function(e){var i=this,s=[];e.each(function(e,n){s.push(i._parseOption(t(n),e))}),this.items=s},_parseOption:function(t,e){var i=t.parent("optgroup");return{element:t,index:e,value:t.val(),label:t.text(),optgroup:i.attr("label")||"",disabled:i.prop("disabled")||t.prop("disabled")}},_destroy:function(){this._unbindFormResetHandler(),this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.labels.attr("for",this.ids.element)}}]),t.widget("ui.slider",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"slide",options:{animate:!1,classes:{"ui-slider":"ui-corner-all","ui-slider-handle":"ui-corner-all","ui-slider-range":"ui-corner-all ui-widget-header"},distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this._addClass("ui-slider ui-slider-"+this.orientation,"ui-widget ui-widget-content"),this._refresh(),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle"),o="<span tabindex='0'></span>",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this._addClass(this.handles,"ui-slider-handle","ui-state-default"),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e).attr("tabIndex",0)})},_createRange:function(){var e=this.options;e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?(this._removeClass(this.range,"ui-slider-range-min ui-slider-range-max"),this.range.css({left:"",bottom:""})):(this.range=t("<div>").appendTo(this.element),this._addClass(this.range,"ui-slider-range")),("min"===e.range||"max"===e.range)&&this._addClass(this.range,"ui-slider-range-"+e.range)):(this.range&&this.range.remove(),this.range=null)
-},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,h,l,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,this._addClass(o,null,"ui-state-active"),o.trigger("focus"),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this._removeClass(this.handles,null,"ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_uiHash:function(t,e,i){var s={handle:this.handles[t],handleIndex:t,value:void 0!==e?e:this.value()};return this._hasMultipleValues()&&(s.value=void 0!==e?e:this.values(t),s.values=i||this.values()),s},_hasMultipleValues:function(){return this.options.values&&this.options.values.length},_start:function(t,e){return this._trigger("start",t,this._uiHash(e))},_slide:function(t,e,i){var s,n,o=this.value(),a=this.values();this._hasMultipleValues()&&(n=this.values(e?0:1),o=this.values(e),2===this.options.values.length&&this.options.range===!0&&(i=0===e?Math.min(n,i):Math.max(n,i)),a[e]=i),i!==o&&(s=this._trigger("slide",t,this._uiHash(e,i,a)),s!==!1&&(this._hasMultipleValues()?this.values(e,i):this.value(i)))},_stop:function(t,e){this._trigger("stop",t,this._uiHash(e))},_change:function(t,e){this._keySliding||this._mouseSliding||(this._lastChangedValue=e,this._trigger("change",t,this._uiHash(e)))},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),void 0;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this._hasMultipleValues()?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),this._super(e,i),e){case"orientation":this._detectOrientation(),this._removeClass("ui-slider-horizontal ui-slider-vertical")._addClass("ui-slider-"+this.orientation),this._refreshValue(),this.options.range&&this._refreshRange(i),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=n-1;s>=0;s--)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_setOptionDisabled:function(t){this._super(t),this._toggleClass(null,"ui-state-disabled",!!t)},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this._hasMultipleValues()){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var t=this.options.max,e=this._valueMin(),i=this.options.step,s=Math.round((t-e)/i)*i;t=s+e,t>this.options.max&&(t-=i),this.max=parseFloat(t.toFixed(this._precision()))},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshRange:function(t){"vertical"===t&&this.range.css({width:"",left:""}),"horizontal"===t&&this.range.css({height:"",bottom:""})},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,c={};this._hasMultipleValues()?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:100-i+"%"},r.animate),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:100-i+"%"},r.animate))},_handleEvents:{keydown:function(e){var i,s,n,o,a=t(e.target).data("ui-slider-handle-index");switch(e.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(e.preventDefault(),!this._keySliding&&(this._keySliding=!0,this._addClass(t(e.target),null,"ui-state-active"),i=this._start(e,a),i===!1))return}switch(o=this.options.step,s=n=this._hasMultipleValues()?this.values(a):this.value(),e.keyCode){case t.ui.keyCode.HOME:n=this._valueMin();break;case t.ui.keyCode.END:n=this._valueMax();break;case t.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+o);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-o)}this._slide(e,a,n)},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),this._removeClass(t(e.target),null,"ui-state-active"))}}}),t.widget("ui.spinner",{version:"1.12.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{classes:{"ui-spinner":"ui-corner-all","ui-spinner-down":"ui-corner-br","ui-spinner-up":"ui-corner-tr"},culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e=this._super(),i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);null!=n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var e=this.element[0]===t.ui.safeActiveElement(this.document[0]);e||(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===t.ui.safeActiveElement(this.document[0])?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap("<span>").parent().append("<a></a><a></a>")},_draw:function(){this._enhance(),this._addClass(this.uiSpinner,"ui-spinner","ui-widget ui-widget-content"),this._addClass("ui-spinner-input"),this.element.attr("role","spinbutton"),this.buttons=this.uiSpinner.children("a").attr("tabIndex",-1).attr("aria-hidden",!0).button({classes:{"ui-button":""}}),this._removeClass(this.buttons,"ui-corner-all"),this._addClass(this.buttons.first(),"ui-spinner-button ui-spinner-up"),this._addClass(this.buttons.last(),"ui-spinner-button ui-spinner-down"),this.buttons.first().button({icon:this.options.icons.up,showLabel:!1}),this.buttons.last().button({icon:this.options.icons.down,showLabel:!1}),this.buttons.height()>Math.ceil(.5*this.uiSpinner.height())&&this.uiSpinner.height()>0&&this.uiSpinner.height(this.uiSpinner.height())},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){var i,s,n;return"culture"===t||"numberFormat"===t?(i=this._parse(this.element.val()),this.options[t]=e,this.element.val(this._format(i)),void 0):(("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(s=this.buttons.first().find(".ui-icon"),this._removeClass(s,null,this.options.icons.up),this._addClass(s,null,e.up),n=this.buttons.last().find(".ui-icon"),this._removeClass(n,null,this.options.icons.down),this._addClass(n,null,e.down)),this._super(t,e),void 0)},_setOptionDisabled:function(t){this._super(t),this._toggleClass(this.uiSpinner,null,"ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable")},_setOptions:r(function(t){this._super(t)}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var t=this.value();return null===t?!1:t===this._adjustValue(t)},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.prop("disabled",!1).removeAttr("autocomplete role aria-valuemin aria-valuemax aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:r(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:r(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:r(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:r(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(r(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),t.uiBackCompat!==!1&&t.widget("ui.spinner",t.ui.spinner,{_enhance:function(){this.uiSpinner=this.element.attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml())},_uiSpinnerHtml:function(){return"<span>"},_buttonHtml:function(){return"<a></a><a></a>"}}),t.ui.spinner,t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),h=t(s).closest("li"),l=h.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=h.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},h=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),h(n,e)},1)}).fail(function(t,e){setTimeout(function(){h(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs,t.widget("ui.tooltip",{version:"1.12.1",options:{classes:{"ui-tooltip":"ui-corner-all ui-widget-shadow"},content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,track:!1,close:null,open:null},_addDescribedBy:function(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))},_removeDescribedBy:function(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.liveRegion=t("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this.disabledTitles=t([])},_setOption:function(e,i){var s=this;this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e.element)})},_setOptionDisabled:function(t){this[t?"_disable":"_enable"]()},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s.element[0],e.close(n,!0)}),this.disabledTitles=this.disabledTitles.add(this.element.find(this.options.items).addBack().filter(function(){var e=t(this);return e.is("[title]")?e.data("ui-tooltip-title",e.attr("title")).removeAttr("title"):void 0}))},_enable:function(){this.disabledTitles.each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))}),this.disabledTitles=t([])},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(e,s),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s||s.nodeType||s.jquery?this._open(e,t,s):(i=s.call(t[0],function(i){n._delay(function(){t.data("ui-tooltip-open")&&(e&&(e.type=o),this._open(e,t,i))})}),i&&this._open(e,t,i),void 0)},_open:function(e,i,s){function n(t){l.of=t,a.is(":hidden")||a.position(l)}var o,a,r,h,l=t.extend({},this.options.position);if(s){if(o=this._find(i))return o.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(e&&"mouseover"===e.type?i.attr("title",""):i.removeAttr("title")),o=this._tooltip(i),a=o.tooltip,this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),h=t("<div>").html(a.find(".ui-tooltip-content").html()),h.removeAttr("name").find("[name]").removeAttr("name"),h.removeAttr("id").find("[id]").removeAttr("id"),h.appendTo(this.liveRegion),this.options.track&&e&&/^mouse/.test(e.type)?(this._on(this.document,{mousemove:n}),n(e)):a.position(t.extend({of:i},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.track&&this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(l.of),clearInterval(r))},t.fx.interval)),this._trigger("open",e,{tooltip:a})}},_registerCloseHandlers:function(e,i){var s={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var s=t.Event(e);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),e&&"mouseover"!==e.type||(s.mouseleave="close"),e&&"focusin"!==e.type||(s.focusout="close"),this._on(!0,i,s)},close:function(e){var i,s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);return o?(i=o.tooltip,o.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),o.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]
-}),o.closing=!0,this._trigger("close",e,{tooltip:i}),o.hiding||(o.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(e){var i=t("<div>").attr("role","tooltip"),s=t("<div>").appendTo(i),n=i.uniqueId().attr("id");return this._addClass(s,"ui-tooltip-content"),this._addClass(i,"ui-tooltip","ui-widget ui-widget-content"),i.appendTo(this._appendTo(e)),this.tooltips[n]={element:e,tooltip:i}},_find:function(t){var e=t.data("ui-tooltip-id");return e?this.tooltips[e]:null},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_appendTo:function(t){var e=t.closest(".ui-front, dialog");return e.length||(e=this.document[0].body),e},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur"),o=s.element;n.target=n.currentTarget=o[0],e.close(n,!0),t("#"+i).remove(),o.data("ui-tooltip-title")&&(o.attr("title")||o.attr("title",o.data("ui-tooltip-title")),o.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}}),t.uiBackCompat!==!1&&t.widget("ui.tooltip",t.ui.tooltip,{options:{tooltipClass:null},_tooltip:function(){var t=this._superApply(arguments);return this.options.tooltipClass&&t.tooltip.addClass(this.options.tooltipClass),t}}),t.ui.tooltip;var f="ui-effects-",g="ui-effects-style",m="ui-effects-animated",_=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(_),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(_.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),l=l.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function s(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(m)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,s=e.length;s>i;i++)null!==e[i]&&t.data(f+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,s=0,n=e.length;n>s;s++)null!==e[s]&&(i=t.data(f+e[s]),t.css(e[s],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(g,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(g)||"",t.removeData(g)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,s=e.css("position"),n=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(s)&&(s="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(f+"placeholder",i)),e.css({position:s,left:n.left,top:n.top}),i},removePlaceholder:function(t){var e=f+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){r.removeData(m),t.effects.cleanUp(r),"hide"===s.mode&&r.hide(),a()}function a(){t.isFunction(h)&&h.call(r[0]),t.isFunction(e)&&e()}var r=t(this);s.mode=c.shift(),t.uiBackCompat===!1||o?"none"===s.mode?(r[l](),a()):n.call(r[0],s,i):(r.is(":hidden")?"hide"===l:"show"===l)?(r[l](),a()):n.call(r[0],s,a)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],o=n.mode,a=s.queue,r=a||"fx",h=s.complete,l=s.mode,c=[],u=function(e){var i=t(this),s=t.effects.mode(i,l)||o;i.data(m,!0),c.push(s),o&&("show"===s||s===o&&"hide"===s)&&i.show(),o&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?l?this[l](s.duration,h):this.each(function(){h&&h.call(this)}):a===!1?this.each(u).each(i):this.queue(r,u).queue(r,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):s(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=s(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}();var v=t.effects;t.effects.define("blind","hide",function(e,i){var s={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},n=t(this),o=e.direction||"up",a=n.cssClip(),r={clip:t.extend({},a)},h=t.effects.createPlaceholder(n);r.clip[s[o][0]]=r.clip[s[o][1]],"show"===e.mode&&(n.cssClip(r.clip),h&&h.css(t.effects.clipToBox(r)),r.clip=a),h&&h.animate(t.effects.clipToBox(r),e.duration,e.easing),n.animate(r,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("bounce",function(e,i){var s,n,o,a=t(this),r=e.mode,h="hide"===r,l="show"===r,c=e.direction||"up",u=e.distance,d=e.times||5,p=2*d+(l||h?1:0),f=e.duration/p,g=e.easing,m="up"===c||"down"===c?"top":"left",_="up"===c||"left"===c,v=0,b=a.queue().length;for(t.effects.createPlaceholder(a),o=a.css(m),u||(u=a["top"===m?"outerHeight":"outerWidth"]()/3),l&&(n={opacity:1},n[m]=o,a.css("opacity",0).css(m,_?2*-u:2*u).animate(n,f,g)),h&&(u/=Math.pow(2,d-1)),n={},n[m]=o;d>v;v++)s={},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g).animate(n,f,g),u=h?2*u:u/2;h&&(s={opacity:0},s[m]=(_?"-=":"+=")+u,a.animate(s,f,g)),a.queue(i),t.effects.unshift(a,b,p+1)}),t.effects.define("clip","hide",function(e,i){var s,n={},o=t(this),a=e.direction||"vertical",r="both"===a,h=r||"horizontal"===a,l=r||"vertical"===a;s=o.cssClip(),n.clip={top:l?(s.bottom-s.top)/2:s.top,right:h?(s.right-s.left)/2:s.right,bottom:l?(s.bottom-s.top)/2:s.bottom,left:h?(s.right-s.left)/2:s.left},t.effects.createPlaceholder(o),"show"===e.mode&&(o.cssClip(n.clip),n.clip=s),o.animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("drop","hide",function(e,i){var s,n=t(this),o=e.mode,a="show"===o,r=e.direction||"left",h="up"===r||"down"===r?"top":"left",l="up"===r||"left"===r?"-=":"+=",c="+="===l?"-=":"+=",u={opacity:0};t.effects.createPlaceholder(n),s=e.distance||n["top"===h?"outerHeight":"outerWidth"](!0)/2,u[h]=l+s,a&&(n.css(u),u[h]=c+s,u.opacity=1),n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("explode","hide",function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=e.mode,g="show"===f,m=p.show().css("visibility","hidden").offset(),_=Math.ceil(p.outerWidth()/d),v=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*v,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*_,l=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*_,top:-o*v}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:_,height:v,left:r+(g?l*_:0),top:h+(g?c*v:0),opacity:g?0:1}).animate({left:r+(g?0:l*_),top:h+(g?0:c*v),opacity:g?1:0},e.duration||500,e.easing,s)}),t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("fold","hide",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=e.size||15,h=/([0-9]+)%/.exec(r),l=!!e.horizFirst,c=l?["right","bottom"]:["bottom","right"],u=e.duration/2,d=t.effects.createPlaceholder(s),p=s.cssClip(),f={clip:t.extend({},p)},g={clip:t.extend({},p)},m=[p[c[0]],p[c[1]]],_=s.queue().length;h&&(r=parseInt(h[1],10)/100*m[a?0:1]),f.clip[c[0]]=r,g.clip[c[0]]=r,g.clip[c[1]]=0,o&&(s.cssClip(g.clip),d&&d.css(t.effects.clipToBox(g)),g.clip=p),s.queue(function(i){d&&d.animate(t.effects.clipToBox(f),u,e.easing).animate(t.effects.clipToBox(g),u,e.easing),i()}).animate(f,u,e.easing).animate(g,u,e.easing).queue(i),t.effects.unshift(s,_,4)}),t.effects.define("highlight","show",function(e,i){var s=t(this),n={backgroundColor:s.css("backgroundColor")};"hide"===e.mode&&(n.opacity=0),t.effects.saveStyle(s),s.css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(n,{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("size",function(e,i){var s,n,o,a=t(this),r=["fontSize"],h=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],l=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],c=e.mode,u="effect"!==c,d=e.scale||"both",p=e.origin||["middle","center"],f=a.css("position"),g=a.position(),m=t.effects.scaledDimensions(a),_=e.from||m,v=e.to||t.effects.scaledDimensions(a,0);t.effects.createPlaceholder(a),"show"===c&&(o=_,_=v,v=o),n={from:{y:_.height/m.height,x:_.width/m.width},to:{y:v.height/m.height,x:v.width/m.width}},("box"===d||"both"===d)&&(n.from.y!==n.to.y&&(_=t.effects.setTransition(a,h,n.from.y,_),v=t.effects.setTransition(a,h,n.to.y,v)),n.from.x!==n.to.x&&(_=t.effects.setTransition(a,l,n.from.x,_),v=t.effects.setTransition(a,l,n.to.x,v))),("content"===d||"both"===d)&&n.from.y!==n.to.y&&(_=t.effects.setTransition(a,r,n.from.y,_),v=t.effects.setTransition(a,r,n.to.y,v)),p&&(s=t.effects.getBaseline(p,m),_.top=(m.outerHeight-_.outerHeight)*s.y+g.top,_.left=(m.outerWidth-_.outerWidth)*s.x+g.left,v.top=(m.outerHeight-v.outerHeight)*s.y+g.top,v.left=(m.outerWidth-v.outerWidth)*s.x+g.left),a.css(_),("content"===d||"both"===d)&&(h=h.concat(["marginTop","marginBottom"]).concat(r),l=l.concat(["marginLeft","marginRight"]),a.find("*[width]").each(function(){var i=t(this),s=t.effects.scaledDimensions(i),o={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},a={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x};n.from.y!==n.to.y&&(o=t.effects.setTransition(i,h,n.from.y,o),a=t.effects.setTransition(i,h,n.to.y,a)),n.from.x!==n.to.x&&(o=t.effects.setTransition(i,l,n.from.x,o),a=t.effects.setTransition(i,l,n.to.x,a)),u&&t.effects.saveStyle(i),i.css(o),i.animate(a,e.duration,e.easing,function(){u&&t.effects.restoreStyle(i)})})),a.animate(v,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){var e=a.offset();0===v.opacity&&a.css("opacity",_.opacity),u||(a.css("position","static"===f?"relative":f).offset(e),t.effects.saveStyle(a)),i()}})}),t.effects.define("scale",function(e,i){var s=t(this),n=e.mode,o=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"effect"!==n?0:100),a=t.extend(!0,{from:t.effects.scaledDimensions(s),to:t.effects.scaledDimensions(s,o,e.direction||"both"),origin:e.origin||["middle","center"]},e);e.fade&&(a.from.opacity=1,a.to.opacity=0),t.effects.effect.size.call(this,a,i)}),t.effects.define("puff","hide",function(e,i){var s=t.extend(!0,{},e,{fade:!0,percent:parseInt(e.percent,10)||150});t.effects.effect.scale.call(this,s,i)}),t.effects.define("pulsate","show",function(e,i){var s=t(this),n=e.mode,o="show"===n,a="hide"===n,r=o||a,h=2*(e.times||5)+(r?1:0),l=e.duration/h,c=0,u=1,d=s.queue().length;for((o||!s.is(":visible"))&&(s.css("opacity",0).show(),c=1);h>u;u++)s.animate({opacity:c},l,e.easing),c=1-c;s.animate({opacity:c},l,e.easing),s.queue(i),t.effects.unshift(s,d,h+1)}),t.effects.define("shake",function(e,i){var s=1,n=t(this),o=e.direction||"left",a=e.distance||20,r=e.times||3,h=2*r+1,l=Math.round(e.duration/h),c="up"===o||"down"===o?"top":"left",u="up"===o||"left"===o,d={},p={},f={},g=n.queue().length;for(t.effects.createPlaceholder(n),d[c]=(u?"-=":"+=")+a,p[c]=(u?"+=":"-=")+2*a,f[c]=(u?"-=":"+=")+2*a,n.animate(d,l,e.easing);r>s;s++)n.animate(p,l,e.easing).animate(f,l,e.easing);n.animate(p,l,e.easing).animate(d,l/2,e.easing).queue(i),t.effects.unshift(n,g,h+1)}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u=e.distance||o["top"===l?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[l],d[l]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[h][1]]=d.clip[a[h][0]],"show"===r&&(o.cssClip(d.clip),o.css(l,d[l]),d.clip=s,d[l]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})});var v;t.uiBackCompat!==!1&&(v=t.effects.define("transfer",function(e,i){t(this).transfer(e,i)}))});
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.structure.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.structure.css
deleted file mode 100755
index 3bf8aa0..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.structure.css
+++ /dev/null
@@ -1,886 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/category/theming/
- */
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.ui-helper-reset {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- line-height: 1.3;
- text-decoration: none;
- font-size: 100%;
- list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
- cursor: default !important;
- pointer-events: none;
-}
-
-
-/* Icons
-----------------------------------*/
-.ui-icon {
- display: inline-block;
- vertical-align: middle;
- margin-top: -.25em;
- position: relative;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
-}
-
-.ui-widget-icon-block {
- left: 50%;
- margin-left: -8px;
- display: block;
-}
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
- display: none;
-}
-.ui-resizable-n {
- cursor: n-resize;
- height: 7px;
- width: 100%;
- top: -5px;
- left: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-se {
- cursor: se-resize;
- width: 12px;
- height: 12px;
- right: 1px;
- bottom: 1px;
-}
-.ui-resizable-sw {
- cursor: sw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- bottom: -5px;
-}
-.ui-resizable-nw {
- cursor: nw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- top: -5px;
-}
-.ui-resizable-ne {
- cursor: ne-resize;
- width: 9px;
- height: 9px;
- right: -5px;
- top: -5px;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: 0;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- margin: 0;
- cursor: pointer;
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-item-wrapper {
- position: relative;
- padding: 3px 1em 3px .4em;
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item-wrapper {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-button {
- padding: .4em 1em;
- display: inline-block;
- position: relative;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- /* Support: IE <= 11 */
- overflow: visible;
-}
-
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2em;
- box-sizing: border-box;
- text-indent: -9999px;
- white-space: nowrap;
-}
-
-/* no icon support for input elements */
-input.ui-button.ui-button-icon-only {
- text-indent: 0;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon {
- position: absolute;
- top: 50%;
- left: 50%;
- margin-top: -8px;
- margin-left: -8px;
-}
-
-.ui-button.ui-icon-notext .ui-icon {
- padding: 0;
- width: 2.1em;
- height: 2.1em;
- text-indent: -9999px;
- white-space: nowrap;
-
-}
-
-input.ui-button.ui-icon-notext .ui-icon {
- width: auto;
- height: auto;
- text-indent: 0;
- white-space: normal;
- padding: .4em 1em;
-}
-
-/* workarounds */
-/* Support: Firefox 5 - 40 */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-controlgroup {
- vertical-align: middle;
- display: inline-block;
-}
-.ui-controlgroup > .ui-controlgroup-item {
- float: left;
- margin-left: 0;
- margin-right: 0;
-}
-.ui-controlgroup > .ui-controlgroup-item:focus,
-.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
- z-index: 9999;
-}
-.ui-controlgroup-vertical > .ui-controlgroup-item {
- display: block;
- float: none;
- width: 100%;
- margin-top: 0;
- margin-bottom: 0;
- text-align: left;
-}
-.ui-controlgroup-vertical .ui-controlgroup-item {
- box-sizing: border-box;
-}
-.ui-controlgroup .ui-controlgroup-label {
- padding: .4em 1em;
-}
-.ui-controlgroup .ui-controlgroup-label span {
- font-size: 80%;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
- border-left: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
- border-top: none;
-}
-.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
- border-right: none;
-}
-.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
- border-bottom: none;
-}
-
-/* Spinner specific style fixes */
-.ui-controlgroup-vertical .ui-spinner-input {
-
- /* Support: IE8 only, Android < 4.4 only */
- width: 75%;
- width: calc( 100% - 2.4em );
-}
-.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
- border-top-style: solid;
-}
-
-.ui-checkboxradio-label .ui-icon-background {
- box-shadow: inset 1px 1px 1px #ccc;
- border-radius: .12em;
- border: none;
-}
-.ui-checkboxradio-radio-label .ui-icon-background {
- width: 16px;
- height: 16px;
- border-radius: 1em;
- overflow: visible;
- border: none;
-}
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
-.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
- background-image: none;
- width: 8px;
- height: 8px;
- border-width: 4px;
- border-style: solid;
-}
-.ui-checkboxradio-disabled {
- pointer-events: none;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.ui-datepicker .ui-datepicker-header {
- position: relative;
- padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
- position: absolute;
- top: 2px;
- width: 1.8em;
- height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
- top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
- left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
- right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
- left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
- right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
- display: block;
- position: absolute;
- left: 50%;
- margin-left: -8px;
- top: 50%;
- margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
- margin: 0 2.3em;
- line-height: 1.8em;
- text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.ui-datepicker table {
- width: 100%;
- font-size: .9em;
- border-collapse: collapse;
- margin: 0 0 .4em;
-}
-.ui-datepicker th {
- padding: .7em .3em;
- text-align: center;
- font-weight: bold;
- border: 0;
-}
-.ui-datepicker td {
- border: 0;
- padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
- display: block;
- padding: .2em;
- text-align: right;
- text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
- background-image: none;
- margin: .7em 0 0 0;
- padding: 0 .2em;
- border-left: 0;
- border-right: 0;
- border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
- float: right;
- margin: .5em .2em .4em;
- cursor: pointer;
- padding: .2em .6em .3em .6em;
- width: auto;
- overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
- float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
- width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
- float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
- width: 95%;
- margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
- width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
- width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
- width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
- border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
- clear: left;
-}
-.ui-datepicker-row-break {
- clear: both;
- width: 100%;
- font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
- direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
- right: 2px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
- left: 2px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
- right: 1px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
- left: 1px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
- clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
- float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-
-/* Icons */
-.ui-datepicker .ui-icon {
- display: block;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
- left: .5em;
- top: .3em;
-}
-.ui-dialog {
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-n {
- height: 2px;
- top: 0;
-}
-.ui-dialog .ui-resizable-e {
- width: 2px;
- right: 0;
-}
-.ui-dialog .ui-resizable-s {
- height: 2px;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-w {
- width: 2px;
- left: 0;
-}
-.ui-dialog .ui-resizable-se,
-.ui-dialog .ui-resizable-sw,
-.ui-dialog .ui-resizable-ne,
-.ui-dialog .ui-resizable-nw {
- width: 7px;
- height: 7px;
-}
-.ui-dialog .ui-resizable-se {
- right: 0;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-sw {
- left: 0;
- bottom: 0;
-}
-.ui-dialog .ui-resizable-ne {
- right: 0;
- top: 0;
-}
-.ui-dialog .ui-resizable-nw {
- left: 0;
- top: 0;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-progressbar {
- height: 2em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,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");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-text {
- display: block;
- margin-right: 20px;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-selectmenu-button.ui-button {
- text-align: left;
- white-space: nowrap;
- width: 14em;
-}
-.ui-selectmenu-icon.ui-icon {
- float: right;
- margin-top: 0;
-}
-.ui-slider {
- position: relative;
- text-align: left;
-}
-.ui-slider .ui-slider-handle {
- position: absolute;
- z-index: 2;
- width: 1.2em;
- height: 1.2em;
- cursor: default;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.ui-slider-horizontal {
- height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
- top: -.3em;
- margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
- top: 0;
- height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
- left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
- right: 0;
-}
-
-.ui-slider-vertical {
- width: .8em;
- height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
- left: -.3em;
- margin-left: 0;
- margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
- left: 0;
- width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
- bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
- top: 0;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: .222em 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 2em;
-}
-.ui-spinner-button {
- width: 1.6em;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top-style: none;
- border-bottom-style: none;
- border-right-style: none;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.structure.min.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.structure.min.css
deleted file mode 100755
index af44cc9..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.structure.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2017-04-02
-* http://jqueryui.com
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.theme.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.theme.css
deleted file mode 100755
index f559ff3..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.theme.css
+++ /dev/null
@@ -1,443 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.12.1
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/category/theming/
- *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Arial,Helvetica,sans-serif;
- font-size: 1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Arial,Helvetica,sans-serif;
- font-size: 1em;
-}
-.ui-widget.ui-widget-content {
- border: 1px solid #c5c5c5;
-}
-.ui-widget-content {
- border: 1px solid #dddddd;
- background: #ffffff;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #dddddd;
- background: #e9e9e9;
- color: #333333;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #333333;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default,
-.ui-button,
-
-/* We use html here because we need a greater specificity to make sure disabled
-works properly when clicked or hovered */
-html .ui-button.ui-state-disabled:hover,
-html .ui-button.ui-state-disabled:active {
- border: 1px solid #c5c5c5;
- background: #f6f6f6;
- font-weight: normal;
- color: #454545;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited,
-a.ui-button,
-a:link.ui-button,
-a:visited.ui-button,
-.ui-button {
- color: #454545;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus,
-.ui-button:hover,
-.ui-button:focus {
- border: 1px solid #cccccc;
- background: #ededed;
- font-weight: normal;
- color: #2b2b2b;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited,
-a.ui-button:hover,
-a.ui-button:focus {
- color: #2b2b2b;
- text-decoration: none;
-}
-
-.ui-visual-focus {
- box-shadow: 0 0 3px 1px rgb(94, 158, 214);
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active,
-a.ui-button:active,
-.ui-button:active,
-.ui-button.ui-state-active:hover {
- border: 1px solid #003eff;
- background: #007fff;
- font-weight: normal;
- color: #ffffff;
-}
-.ui-icon-background,
-.ui-state-active .ui-icon-background {
- border: #003eff;
- background-color: #ffffff;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #ffffff;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #dad55e;
- background: #fffa90;
- color: #777620;
-}
-.ui-state-checked {
- border: 1px solid #dad55e;
- background: #fffa90;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #777620;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #f1a899;
- background: #fddfdf;
- color: #5f3f3f;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #5f3f3f;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #5f3f3f;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("images/ui-icons_444444_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("images/ui-icons_444444_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon,
-.ui-button:hover .ui-icon,
-.ui-button:focus .ui-icon {
- background-image: url("images/ui-icons_555555_256x240.png");
-}
-.ui-state-active .ui-icon,
-.ui-button:active .ui-icon {
- background-image: url("images/ui-icons_ffffff_256x240.png");
-}
-.ui-state-highlight .ui-icon,
-.ui-button .ui-state-highlight.ui-icon {
- background-image: url("images/ui-icons_777620_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("images/ui-icons_cc0000_256x240.png");
-}
-.ui-button .ui-icon {
- background-image: url("images/ui-icons_777777_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-caret-1-n { background-position: 0 0; }
-.ui-icon-caret-1-ne { background-position: -16px 0; }
-.ui-icon-caret-1-e { background-position: -32px 0; }
-.ui-icon-caret-1-se { background-position: -48px 0; }
-.ui-icon-caret-1-s { background-position: -65px 0; }
-.ui-icon-caret-1-sw { background-position: -80px 0; }
-.ui-icon-caret-1-w { background-position: -96px 0; }
-.ui-icon-caret-1-nw { background-position: -112px 0; }
-.ui-icon-caret-2-n-s { background-position: -128px 0; }
-.ui-icon-caret-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -65px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -65px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 3px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 3px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #aaaaaa;
- opacity: .3;
- filter: Alpha(Opacity=30); /* support: IE8 */
-}
-.ui-widget-shadow {
- -webkit-box-shadow: 0px 0px 5px #666666;
- box-shadow: 0px 0px 5px #666666;
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.theme.min.css b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.theme.min.css
deleted file mode 100755
index e15e671..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/jquery-ui.theme.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.12.1 - 2017-04-02
-* http://jqueryui.com
-* Copyright jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/package.json b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/package.json
deleted file mode 100755
index e3c846e..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery-ui-1.12.1/package.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
- "name": "jquery-ui",
- "title": "jQuery UI",
- "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.",
- "version": "1.12.1",
- "homepage": "http://jqueryui.com",
- "author": {
- "name": "jQuery Foundation and other contributors",
- "url": "https://github.com/jquery/jquery-ui/blob/1.12.1/AUTHORS.txt"
- },
- "main": "ui/widget.js",
- "maintainers": [
- {
- "name": "Scott González",
- "email": "scott.gonzalez@gmail.com",
- "url": "http://scottgonzalez.com"
- },
- {
- "name": "Jörn Zaefferer",
- "email": "joern.zaefferer@gmail.com",
- "url": "http://bassistance.de"
- },
- {
- "name": "Mike Sherov",
- "email": "mike.sherov@gmail.com",
- "url": "http://mike.sherov.com"
- },
- {
- "name": "TJ VanToll",
- "email": "tj.vantoll@gmail.com",
- "url": "http://tjvantoll.com"
- },
- {
- "name": "Felix Nagel",
- "email": "info@felixnagel.com",
- "url": "http://www.felixnagel.com"
- },
- {
- "name": "Alex Schmitz",
- "email": "arschmitz@gmail.com",
- "url": "https://github.com/arschmitz"
- }
- ],
- "repository": {
- "type": "git",
- "url": "git://github.com/jquery/jquery-ui.git"
- },
- "bugs": "https://bugs.jqueryui.com/",
- "license": "MIT",
- "scripts": {
- "test": "grunt"
- },
- "dependencies": {},
- "devDependencies": {
- "commitplease": "2.3.0",
- "grunt": "0.4.5",
- "grunt-bowercopy": "1.2.4",
- "grunt-cli": "0.1.13",
- "grunt-compare-size": "0.4.0",
- "grunt-contrib-concat": "0.5.1",
- "grunt-contrib-csslint": "0.5.0",
- "grunt-contrib-jshint": "0.12.0",
- "grunt-contrib-qunit": "1.0.1",
- "grunt-contrib-requirejs": "0.4.4",
- "grunt-contrib-uglify": "0.11.1",
- "grunt-git-authors": "3.1.0",
- "grunt-html": "6.0.0",
- "grunt-jscs": "2.1.0",
- "load-grunt-tasks": "3.4.0",
- "rimraf": "2.5.1",
- "testswarm": "1.1.0"
- },
- "keywords": []
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.centerabsolute.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.centerabsolute.js
deleted file mode 100755
index cf31e03..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.centerabsolute.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * @author: Suissa
- * @name: Absolute Center
- * @date: 2007-10-09
- */
-$.fn.center = function() {
- return this.each(function(){
- var el = $(this);
- var h = el.height();
- var w = el.width();
- var w_box = $(window).width();
- var h_box = $(window).height();
- var w_total = (w_box - w)/2;
- var h_total = (h_box - h)/2;
- var css = {"position": 'absolute', "left": w_total+"px", "top":h_total+"px"};
- el.css(css)
- });
-};
-
-
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.couch.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.couch.js
deleted file mode 100755
index c7409a2..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.couch.js
+++ /dev/null
@@ -1,1083 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-/**
- * @namespace
- * $.couch is used to communicate with a CouchDB server, the server methods can
- * be called directly without creating an instance. Typically all methods are
- * passed an <code>options</code> object which defines a success callback which
- * is called with the data returned from the http request to CouchDB, you can
- * find the other settings that can be used in the <code>options</code> object
- * from <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
- * jQuery.ajax settings</a>
- * <pre><code>$.couch.activeTasks({
- * success: function (data) {
- * console.log(data);
- * }
- * });</code></pre>
- * Outputs (for example):
- * <pre><code>[
- * {
- * "pid" : "<0.11599.0>",
- * "status" : "Copied 0 of 18369 changes (0%)",
- * "task" : "recipes",
- * "type" : "Database Compaction"
- * }
- *]</code></pre>
- */
-(function($) {
-
- $.couch = $.couch || {};
- /** @lends $.couch */
-
- /**
- * @private
- */
- function encodeDocId(docID) {
- var parts = docID.split("/");
- if (parts[0] == "_design") {
- parts.shift();
- return "_design/" + encodeURIComponent(parts.join('/'));
- }
- return encodeURIComponent(docID);
- }
-
- /**
- * @private
- */
-
- var uuidCache = [];
-
- $.extend($.couch, {
- urlPrefix: 'http://faster.hevs.ch:5984/',
-
- /**
- * You can obtain a list of active tasks by using the /_active_tasks URL.
- * The result is a JSON array of the currently running tasks, with each task
- * being described with a single object.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/uploads/
- * all/documentation/couchbase-api-misc.html#couchbase-api-misc_active-task
- * s_get">docs for /_active_tasks</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/jQuery.ajax
- * /#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- activeTasks: function(options) {
- ajax(
- {url: this.urlPrefix + "/_active_tasks"},
- options,
- "Active task status could not be retrieved"
- );
- },
-
- /**
- * Returns a list of all the databases in the CouchDB instance
- * @see <a href="http://techzone.couchbase.com/sites/default/files/uploads/
- * all/documentation/couchbase-api-misc.html#couchbase-api-misc_active-task
- * s_get">docs for /_all_dbs</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/jQuery.ajax
- * /#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- allDbs: function(options) {
- ajax(
- {url: this.urlPrefix + "/_all_dbs"},
- options,
- "An error occurred retrieving the list of all databases"
- );
- },
-
- /**
- * View and edit the CouchDB configuration, called with just the options
- * parameter the entire config is returned, you can be more specific by
- * passing the section and option parameters, if you specify a value that
- * value will be stored in the configuration.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/uploads/
- * all/documentation/couchbase-api-config.html#couchbase-api-config_config
- * -section-key_put">docs for /_config</a>
- * @param {ajaxSettings} options
- * <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
- * jQuery ajax settings</a>
- * @param {String} [section] the section of the config
- * @param {String} [option] the particular config option
- * @param {String} [value] value to be set
- */
- config: function(options, section, option, value) {
- var req = {url: this.urlPrefix + "/_config/"};
- if (section) {
- req.url += encodeURIComponent(section) + "/";
- if (option) {
- req.url += encodeURIComponent(option);
- }
- }
- if (value === null) {
- req.type = "DELETE";
- } else if (value !== undefined) {
- req.type = "PUT";
- req.data = toJSON(value);
- req.contentType = "application/json";
- req.processData = false
- }
-
- ajax(req, options,
- "An error occurred retrieving/updating the server configuration"
- );
- },
-
- /**
- * Returns the session information for the currently logged in user.
- * @param {ajaxSettings} options
- * <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
- * jQuery ajax settings</a>
- */
- session: function(options) {
- options = options || {};
- ajax({
- type: "GET", url: this.urlPrefix + "/_session",
- data: {"basic":true},
- beforeSend: function(xhr) {
- xhr.setRequestHeader('Accept', 'application/json');
- },
- complete: function(req) {
- var resp = $.parseJSON(req.responseText);
- if (req.status == 200) {
- if (options.success) options.success(resp);
- } else if (options.error) {
- options.error(req.status, resp.error, resp.reason);
- } else {
- throw "An error occurred getting session info: " + resp.reason;
- }
- }
- });
- },
-
- /**
- * @private
- */
- userDb : function(callback) {
- $.couch.session({
- success : function(resp) {
- var userDb = $.couch.db(resp.info.authentication_db);
- callback(userDb);
- }
- });
- },
-
- /**
- * Create a new user on the CouchDB server, <code>user_doc</code> is an
- * object with a <code>name</code> field and other information you want
- * to store relating to that user, for example
- * <code>{"name": "daleharvey"}</code>
- * @param {Object} user_doc Users details
- * @param {String} password Users password
- * @param {ajaxSettings} options
- * <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
- * jQuery ajax settings</a>
- */
- signup: function(user_doc, password, options) {
- options = options || {};
- user_doc.password = password;
- user_doc.roles = user_doc.roles || [];
- user_doc.type = user_doc.type = "user" || [];
- var user_prefix = "org.couchdb.user:";
- user_doc._id = user_doc._id || user_prefix + user_doc.name;
-
- $.couch.userDb(function(db) {
- db.saveDoc(user_doc, options);
- });
- },
-
- /**
- * Authenticate against CouchDB, the <code>options</code> parameter is
- *expected to have <code>name</code> and <code>password</code> fields.
- * @param {ajaxSettings} options
- * <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
- * jQuery ajax settings</a>
- */
- login: function(options) {
- options = options || {};
- $.ajax({
- type: "POST", url: this.urlPrefix + "/_session", dataType: "json",
- data: {name: options.name, password: options.password},
- xhrFields: { withCredentials: true },
- beforeSend: function(xhr) {
- xhr.setRequestHeader('Accept', 'application/json');
- },
- complete: function(req) {
- var resp = $.parseJSON(req.responseText);
- if (req.status == 200) {
- if (options.success) options.success(resp);
- } else if (options.error) {
- options.error(req.status, resp.error, resp.reason);
- } else {
- throw 'An error occurred logging in: ' + resp.reason;
- }
- }
- });
- },
-
-
- /**
- * Delete your current CouchDB user session
- * @param {ajaxSettings} options
- * <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
- * jQuery ajax settings</a>
- */
- logout: function(options) {
- options = options || {};
- $.ajax({
- type: "DELETE", url: this.urlPrefix + "/_session", dataType: "json",
- xhrFields: { withCredentials: true },
- beforeSend: function(xhr) {
- xhr.setRequestHeader('Accept', 'application/json');
- },
- complete: function(req) {
- var resp = $.parseJSON(req.responseText);
- if (req.status == 200) {
- if (options.success) options.success(resp);
- } else if (options.error) {
- options.error(req.status, resp.error, resp.reason);
- } else {
- throw 'An error occurred logging out: ' + resp.reason;
- }
- }
- });
- },
-
- /**
- * @namespace
- * $.couch.db is used to communicate with a specific CouchDB database
- * <pre><code>var $db = $.couch.db("mydatabase");
- *$db.allApps({
- * success: function (data) {
- * ... process data ...
- * }
- *});
- * </code></pre>
- */
- db: function(name, db_opts) {
- db_opts = db_opts || {};
- var rawDocs = {};
- function maybeApplyVersion(doc) {
- if (doc._id && doc._rev && rawDocs[doc._id] &&
- rawDocs[doc._id].rev == doc._rev) {
- // todo: can we use commonjs require here?
- if (typeof Base64 == "undefined") {
- throw 'Base64 support not found.';
- } else {
- doc._attachments = doc._attachments || {};
- doc._attachments["rev-"+doc._rev.split("-")[0]] = {
- content_type :"application/json",
- data : Base64.encode(rawDocs[doc._id].raw)
- };
- return true;
- }
- }
- };
- return /** @lends $.couch.db */{
- name: name,
- uri: this.urlPrefix + "/" + encodeURIComponent(name) + "/",
-
- /**
- * Request compaction of the specified database.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
- * db-compact_post">docs for /db/_compact</a>
- * @param {ajaxSettings} options
- * <a href="http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings">
- * jQuery ajax settings</a>
- */
- compact: function(options) {
- $.extend(options, {successStatus: 202});
- ajax({
- type: "POST", url: this.uri + "_compact",
- data: "", processData: false
- },
- options,
- "The database could not be compacted"
- );
- },
-
- /**
- * Cleans up the cached view output on disk for a given view.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db
- * _db-view-cleanup_post">docs for /db/_compact</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- viewCleanup: function(options) {
- $.extend(options, {successStatus: 202});
- ajax({
- type: "POST", url: this.uri + "_view_cleanup",
- data: "", processData: false
- },
- options,
- "The views could not be cleaned up"
- );
- },
-
- /**
- * Compacts the view indexes associated with the specified design
- * document. You can use this in place of the full database compaction
- * if you know a specific set of view indexes have been affected by a
- * recent database change.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/upl
- * oads/all/documentation/couchbase-api-db.html#couchbase-api-db_db-
- * compact-design-doc_post">docs for /db/_compact/design-doc</a>
- * @param {String} groupname Name of design-doc to compact
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- compactView: function(groupname, options) {
- $.extend(options, {successStatus: 202});
- ajax({
- type: "POST", url: this.uri + "_compact/" + groupname,
- data: "", processData: false
- },
- options,
- "The view could not be compacted"
- );
- },
-
- /**
- * Create a new database
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
- * db_put">docs for PUT /db/</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- create: function(options) {
- $.extend(options, {successStatus: 201});
- ajax({
- type: "PUT", url: this.uri, contentType: "application/json",
- data: "", processData: false
- },
- options,
- "The database could not be created"
- );
- },
-
- /**
- * Deletes the specified database, and all the documents and
- * attachments contained within it.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
- * db_delete">docs for DELETE /db/</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- drop: function(options) {
- ajax(
- {type: "DELETE", url: this.uri},
- options,
- "The database could not be deleted"
- );
- },
-
- /**
- * Gets information about the specified database.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db
- * _db_get">docs for GET /db/</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- info: function(options) {
- ajax(
- {url: this.uri},
- options,
- "Database information could not be retrieved"
- );
- },
-
- /**
- * @namespace
- * $.couch.db.changes provides an API for subscribing to the changes
- * feed
- * <pre><code>var $changes = $.couch.db("mydatabase").changes();
- *$changes.onChange = function (data) {
- * ... process data ...
- * }
- * $changes.stop();
- * </code></pre>
- */
- changes: function(since, options) {
-
- options = options || {};
- // set up the promise object within a closure for this handler
- var timeout = 100, db = this, active = true,
- listeners = [],
- promise = /** @lends $.couch.db.changes */ {
- /**
- * Add a listener callback
- * @see <a href="http://techzone.couchbase.com/sites/default/
- * files/uploads/all/documentation/couchbase-api-db.html#couch
- * base-api-db_db-changes_get">docs for /db/_changes</a>
- * @param {Function} fun Callback function to run when
- * notified of changes.
- */
- onChange : function(fun) {
- listeners.push(fun);
- },
- /**
- * Stop subscribing to the changes feed
- */
- stop : function() {
- active = false;
- }
- };
- // call each listener when there is a change
- function triggerListeners(resp) {
- $.each(listeners, function() {
- this(resp);
- });
- };
- // when there is a change, call any listeners, then check for
- // another change
- options.success = function(resp) {
- timeout = 100;
- if (active) {
- since = resp.last_seq;
- triggerListeners(resp);
- getChangesSince();
- };
- };
- options.error = function() {
- if (active) {
- setTimeout(getChangesSince, timeout);
- timeout = timeout * 2;
- }
- };
- // actually make the changes request
- function getChangesSince() {
- var opts = $.extend({heartbeat : 10 * 1000}, options, {
- feed : "longpoll",
- since : since
- });
- ajax(
- {url: db.uri + "_changes"+encodeOptions(opts)},
- options,
- "Error connecting to "+db.uri+"/_changes."
- );
- }
- // start the first request
- if (since) {
- getChangesSince();
- } else {
- db.info({
- success : function(info) {
- since = info.update_seq;
- getChangesSince();
- }
- });
- }
- return promise;
- },
-
- /**
- * Fetch all the docs in this db, you can specify an array of keys to
- * fetch by passing the <code>keys</code> field in the
- * <code>options</code>
- * parameter.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
- * db-all-docs_get">docs for /db/all_docs/</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- allDocs: function(options) {
- var type = "GET";
- var data = null;
- if (options["keys"]) {
- type = "POST";
- var keys = options["keys"];
- delete options["keys"];
- data = toJSON({ "keys": keys });
- }
- ajax({
- type: type,
- data: data,
- url: this.uri + "_all_docs" + encodeOptions(options)
- },
- options,
- "An error occurred retrieving a list of all documents"
- );
- },
-
- /**
- * Fetch all the design docs in this db
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- allDesignDocs: function(options) {
- this.allDocs($.extend(
- {startkey:"_design", endkey:"_design0"}, options));
- },
-
- /**
- * Fetch all the design docs with an index.html, <code>options</code>
- * parameter expects an <code>eachApp</code> field which is a callback
- * called on each app found.
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- allApps: function(options) {
- options = options || {};
- var self = this;
- if (options.eachApp) {
- this.allDesignDocs({
- success: function(resp) {
- $.each(resp.rows, function() {
- self.openDoc(this.id, {
- success: function(ddoc) {
- var index, appPath, appName = ddoc._id.split('/');
- appName.shift();
- appName = appName.join('/');
- index = ddoc.couchapp && ddoc.couchapp.index;
- if (index) {
- appPath = ['', name, ddoc._id, index].join('/');
- } else if (ddoc._attachments &&
- ddoc._attachments["index.html"]) {
- appPath = ['', name, ddoc._id, "index.html"].join('/');
- }
- if (appPath) options.eachApp(appName, appPath, ddoc);
- }
- });
- });
- }
- });
- } else {
- throw 'Please provide an eachApp function for allApps()';
- }
- },
-
- /**
- * Returns the specified doc from the specified db.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-dbdoc.html#couchbase-api-
- * dbdoc_db-doc_get">docs for GET /db/doc</a>
- * @param {String} docId id of document to fetch
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- * @param {ajaxSettings} ajaxOptions <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- openDoc: function(docId, options, ajaxOptions) {
- options = options || {};
- if (db_opts.attachPrevRev || options.attachPrevRev) {
- $.extend(options, {
- beforeSuccess : function(req, doc) {
- rawDocs[doc._id] = {
- rev : doc._rev,
- raw : req.responseText
- };
- }
- });
- } else {
- $.extend(options, {
- beforeSuccess : function(req, doc) {
- if (doc["jquery.couch.attachPrevRev"]) {
- rawDocs[doc._id] = {
- rev : doc._rev,
- raw : req.responseText
- };
- }
- }
- });
- }
- ajax({url: this.uri + encodeDocId(docId) + encodeOptions(options)},
- options,
- "The document could not be retrieved",
- ajaxOptions
- );
- },
-
- /**
- * Create a new document in the specified database, using the supplied
- * JSON document structure. If the JSON structure includes the _id
- * field, then the document will be created with the specified document
- * ID. If the _id field is not specified, a new unique ID will be
- * generated.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-dbdoc.html#couchbase-api-
- * dbdoc_db_post">docs for GET /db/doc</a>
- * @param {String} doc document to save
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- saveDoc: function(doc, options) {
- options = options || {};
- var db = this;
- var beforeSend = fullCommit(options);
- if (doc._id === undefined) {
- var method = "POST";
- var uri = this.uri;
- } else {
- var method = "PUT";
- var uri = this.uri + encodeDocId(doc._id);
- }
- var versioned = maybeApplyVersion(doc);
- $.ajax({
- type: method, url: uri + encodeOptions(options),
- contentType: "application/json",
- dataType: "json", data: toJSON(doc),
- beforeSend : beforeSend,
- xhrFields: { withCredentials: true },
- complete: function(req) {
- var resp = $.parseJSON(req.responseText);
- if (req.status == 200 || req.status == 201 || req.status == 202) {
- doc._id = resp.id;
- doc._rev = resp.rev;
- if (versioned) {
- db.openDoc(doc._id, {
- attachPrevRev : true,
- success : function(d) {
- doc._attachments = d._attachments;
- if (options.success) options.success(resp);
- }
- });
- } else {
- if (options.success) options.success(resp);
- }
- } else if (options.error) {
- options.error(req.status, resp.error, resp.reason);
- } else {
- throw "The document could not be saved: " + resp.reason;
- }
- }
- });
- },
-
- /**
- * Save a list of documents
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
- * db-bulk-docs_post">docs for /db/_bulk_docs</a>
- * @param {Object[]} docs List of documents to save
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- bulkSave: function(docs, options) {
- var beforeSend = fullCommit(options);
- $.extend(options, {successStatus: 201, beforeSend : beforeSend});
- ajax({
- type: "POST",
- url: this.uri + "_bulk_docs" + encodeOptions(options),
- contentType: "application/json", data: toJSON(docs)
- },
- options,
- "The documents could not be saved"
- );
- },
-
- /**
- * Deletes the specified document from the database. You must supply
- * the current (latest) revision and <code>id</code> of the document
- * to delete eg <code>removeDoc({_id:"mydoc", _rev: "1-2345"})</code>
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-dbdoc.html#couchbase-api
- * -dbdoc_db-doc_delete">docs for DELETE /db/doc</a>
- * @param {Object} doc Document to delete
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- removeDoc: function(doc, options) {
- ajax({
- type: "DELETE",
- url: this.uri +
- encodeDocId(doc._id) +
- encodeOptions({rev: doc._rev})
- },
- options,
- "The document could not be deleted"
- );
- },
-
- /**
- * Remove a set of documents
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db_
- * db-bulk-docs_post">docs for /db/_bulk_docs</a>
- * @param {String[]} docs List of document id's to remove
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- bulkRemove: function(docs, options){
- docs.docs = $.each(
- docs.docs, function(i, doc){
- doc._deleted = true;
- }
- );
- $.extend(options, {successStatus: 201});
- ajax({
- type: "POST",
- url: this.uri + "_bulk_docs" + encodeOptions(options),
- data: toJSON(docs)
- },
- options,
- "The documents could not be deleted"
- );
- },
-
- /**
- * The COPY command (which is non-standard HTTP) copies an existing
- * document to a new or existing document.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-dbdoc.html#couchbase-api-
- * dbdoc_db-doc_copy">docs for COPY /db/doc</a>
- * @param {String[]} docId document id to copy
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- copyDoc: function(docId, options, ajaxOptions) {
- ajaxOptions = $.extend(ajaxOptions, {
- complete: function(req) {
- var resp = $.parseJSON(req.responseText);
- if (req.status == 201) {
- if (options.success) options.success(resp);
- } else if (options.error) {
- options.error(req.status, resp.error, resp.reason);
- } else {
- throw "The document could not be copied: " + resp.reason;
- }
- }
- });
- ajax({
- type: "COPY",
- url: this.uri + encodeDocId(docId)
- },
- options,
- "The document could not be copied",
- ajaxOptions
- );
- },
-
- /**
- * Creates (and executes) a temporary view based on the view function
- * supplied in the JSON request.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-db.html#couchbase-api-db
- * _db-temp-view_post">docs for /db/_temp_view</a>
- * @param {Function} mapFun Map function
- * @param {Function} reduceFun Reduce function
- * @param {Function} language Language the map / reduce funs are
- * implemented in
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- query: function(mapFun, reduceFun, language, options) {
- language = language || "javascript";
- if (typeof(mapFun) !== "string") {
- mapFun = mapFun.toSource ? mapFun.toSource()
- : "(" + mapFun.toString() + ")";
- }
- var body = {language: language, map: mapFun};
- if (reduceFun != null) {
- if (typeof(reduceFun) !== "string")
- reduceFun = reduceFun.toSource ? reduceFun.toSource()
- : "(" + reduceFun.toString() + ")";
- body.reduce = reduceFun;
- }
- ajax({
- type: "POST",
- url: this.uri + "_temp_view" + encodeOptions(options),
- contentType: "application/json", data: toJSON(body)
- },
- options,
- "An error occurred querying the database"
- );
- },
-
- /**
- * Fetch a _list view output, you can specify a list of
- * <code>keys</code> in the options object to recieve only those keys.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-design.html#couchbase-api
- * -design_db-design-designdoc-list-listname-viewname_get">
- * docs for /db/_design/design-doc/_list/l1/v1</a>
- * @param {String} list Listname in the form of ddoc/listname
- * @param {String} view View to run list against
- * @param {options} CouchDB <a href="http://wiki.apache.org/couchdb/
- * HTTP_view_API">View Options</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- list: function(list, view, options, ajaxOptions) {
- var list = list.split('/');
- var options = options || {};
- var type = 'GET';
- var data = null;
- if (options['keys']) {
- type = 'POST';
- var keys = options['keys'];
- delete options['keys'];
- data = toJSON({'keys': keys });
- }
- ajax({
- type: type,
- data: data,
- url: this.uri + '_design/' + list[0] +
- '/_list/' + list[1] + '/' + view + encodeOptions(options)
- },
- ajaxOptions, 'An error occured accessing the list'
- );
- },
-
- /**
- * Executes the specified view-name from the specified design-doc
- * design document, you can specify a list of <code>keys</code>
- * in the options object to recieve only those keys.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-design.html#couchbase-api-
- * design_db-design-designdoc-view-viewname_get">docs for /db/
- * _design/design-doc/_list/l1/v1</a>
- * @param {String} name View to run list against (string should have
- * the design-doc name followed by a slash and the view name)
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- view: function(name, options) {
- var name = name.split('/');
- var options = options || {};
- var type = "GET";
- var data= null;
- if (options["keys"]) {
- type = "POST";
- var keys = options["keys"];
- delete options["keys"];
- data = toJSON({ "keys": keys });
- }
- ajax({
- type: type,
- data: data,
- url: this.uri + "_design/" + name[0] +
- "/_view/" + name[1] + encodeOptions(options)
- },
- options, "An error occurred accessing the view"
- );
- },
-
- /**
- * Fetch an arbitrary CouchDB database property
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api.html">docs for /db/_prop</a>
- * @param {String} propName Propery name to fetch
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- * @param {ajaxSettings} ajaxOptions <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- getDbProperty: function(propName, options, ajaxOptions) {
- ajax({url: this.uri + propName + encodeOptions(options)},
- options,
- "The property could not be retrieved",
- ajaxOptions
- );
- },
-
- /**
- * Set an arbitrary CouchDB database property
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api.html">docs for /db/_prop</a>
- * @param {String} propName Propery name to fetch
- * @param {String} propValue Propery value to set
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- * @param {ajaxSettings} ajaxOptions <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- setDbProperty: function(propName, propValue, options, ajaxOptions) {
- ajax({
- type: "PUT",
- url: this.uri + propName + encodeOptions(options),
- data : JSON.stringify(propValue)
- },
- options,
- "The property could not be updated",
- ajaxOptions
- );
- }
- };
- },
-
- encodeDocId: encodeDocId,
-
- /**
- * Accessing the root of a CouchDB instance returns meta information about
- * the instance. The response is a JSON structure containing information
- * about the server, including a welcome message and the version of the
- * server.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/uploads/
- * all/documentation/couchbase-api-misc.html#couchbase-api-misc_root_get">
- * docs for GET /</a>
- * @param {ajaxSettings} options <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- */
- info: function(options) {
- ajax(
- {url: this.urlPrefix + "/"},
- options,
- "Server information could not be retrieved"
- );
- },
-
- /**
- * Request, configure, or stop, a replication operation.
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-misc.html#couchbase-api-
- * misc_replicate_post">docs for POST /_replicate</a>
- * @param {String} source Path or url to source database
- * @param {String} target Path or url to target database
- * @param {ajaxSettings} ajaxOptions <a href="http://api.jquery.com/
- * jQuery.ajax/#jQuery-ajax-settings">jQuery ajax settings</a>
- * @param {Object} repOpts Additional replication options
- */
- replicate: function(source, target, ajaxOptions, repOpts) {
- repOpts = $.extend({source: source, target: target}, repOpts);
- if (repOpts.continuous && !repOpts.cancel) {
- ajaxOptions.successStatus = 202;
- }
- ajax({
- type: "POST", url: this.urlPrefix + "/_replicate",
- data: JSON.stringify(repOpts),
- contentType: "application/json"
- },
- ajaxOptions,
- "Replication failed"
- );
- },
-
- /**
- * Fetch a new UUID
- * @see <a href="http://techzone.couchbase.com/sites/default/files/
- * uploads/all/documentation/couchbase-api-misc.html#couchbase-api-
- * misc_uuids_get">docs for /_uuids</a>
- * @param {Int} cacheNum Number of uuids to keep cached for future use
- */
- newUUID: function(cacheNum) {
- if (cacheNum === undefined) {
- cacheNum = 1;
- }
- if (!uuidCache.length) {
- ajax({url: this.urlPrefix + "/_uuids", data: {count: cacheNum}, async:
- false}, {
- success: function(resp) {
- uuidCache = resp.uuids;
- }
- },
- "Failed to retrieve UUID batch."
- );
- }
- return uuidCache.shift();
- }
- });
-
- /**
- * @private
- */
- function ajax(obj, options, errorMessage, ajaxOptions) {
- var timeStart;
- var defaultAjaxOpts = {
- contentType: "application/json",
- headers:{"Accept": "application/json"}
- };
-
- options = $.extend({successStatus: 200}, options);
- ajaxOptions = $.extend(defaultAjaxOpts, ajaxOptions);
- errorMessage = errorMessage || "Unknown error";
- timeStart = (new Date()).getTime();
- $.ajax($.extend($.extend({
- type: "GET", dataType: "json", cache : !$.browser.msie,
- xhrFields: { withCredentials: true },
- beforeSend: function(xhr){
- if(ajaxOptions && ajaxOptions.headers){
- for (var header in ajaxOptions.headers){
- xhr.setRequestHeader(header, ajaxOptions.headers[header]);
- }
- }
- },
- complete: function(req) {
- var reqDuration = (new Date()).getTime() - timeStart;
- try {
- var resp = $.parseJSON(req.responseText);
- } catch(e) {
- if (options.error) {
- options.error(req.status, req, e);
- } else {
- throw errorMessage + ': ' + e;
- }
- return;
- }
- if (options.ajaxStart) {
- options.ajaxStart(resp);
- }
- if (req.status == options.successStatus) {
- if (options.beforeSuccess) options.beforeSuccess(req, resp, reqDuration);
- if (options.success) options.success(resp, reqDuration);
- } else if (options.error) {
- options.error(req.status, resp && resp.error ||
- errorMessage, resp && resp.reason || "no response",
- reqDuration);
- } else {
- throw errorMessage + ": " + resp.reason;
- }
- }
- }, obj), ajaxOptions));
- }
-
- /**
- * @private
- */
- function fullCommit(options) {
- var options = options || {};
- if (typeof options.ensure_full_commit !== "undefined") {
- var commit = options.ensure_full_commit;
- delete options.ensure_full_commit;
- return function(xhr) {
- xhr.setRequestHeader('Accept', 'application/json');
- xhr.setRequestHeader("X-Couch-Full-Commit", commit.toString());
- };
- }
- };
-
- /**
- * @private
- */
- // Convert a options object to an url query string.
- // ex: {key:'value',key2:'value2'} becomes '?key="value"&key2="value2"'
- function encodeOptions(options) {
- var buf = [];
- if (typeof(options) === "object" && options !== null) {
- for (var name in options) {
- if ($.inArray(name,
- ["error", "success", "beforeSuccess", "ajaxStart"]) >= 0)
- continue;
- var value = options[name];
- if ($.inArray(name, ["key", "startkey", "endkey"]) >= 0) {
- value = toJSON(value);
- }
- buf.push(encodeURIComponent(name) + "=" + encodeURIComponent(value));
- }
- }
- return buf.length ? "?" + buf.join("&") : "";
- }
-
- /**
- * @private
- */
- function toJSON(obj) {
- return obj !== null ? JSON.stringify(obj) : null;
- }
-
-})(jQuery);
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.hotkeys.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.hotkeys.js
deleted file mode 100755
index a060fc0..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.hotkeys.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * jQuery Hotkeys Plugin
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- *
- * Based upon the plugin by Tzury Bar Yochay:
- * http://github.com/tzuryby/hotkeys
- *
- * Original idea by:
- * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
-*/
-
-/*
- * One small change is: now keys are passed by object { keys: '...' }
- * Might be useful, when you want to pass some other data to your handler
- */
-
-(function(jQuery){
-
- jQuery.hotkeys = {
- version: "0.8",
-
- specialKeys: {
- 8: "backspace", 9: "tab", 10: "return", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
- 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
- 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
- 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
- 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
- 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
- 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 186: ";", 191: "/",
- 220: "\\", 222: "'", 224: "meta"
- },
-
- shiftNums: {
- "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
- "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
- ".": ">", "/": "?", "\\": "|"
- }
- };
-
- function keyHandler( handleObj ) {
- if ( typeof handleObj.data === "string" ) {
- handleObj.data = { keys: handleObj.data };
- }
-
- // Only care when a possible input has been specified
- if ( !handleObj.data || !handleObj.data.keys || typeof handleObj.data.keys !== "string" ) {
- return;
- }
-
- var origHandler = handleObj.handler,
- keys = handleObj.data.keys.toLowerCase().split(" "),
- textAcceptingInputTypes = ["text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime", "datetime-local", "search", "color", "tel"];
-
- handleObj.handler = function( event ) {
- // Don't fire in text-accepting inputs that we didn't directly bind to
- if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
- jQuery.inArray(event.target.type, textAcceptingInputTypes) > -1 ) ) {
- return;
- }
-
- var special = jQuery.hotkeys.specialKeys[ event.keyCode ],
- character = String.fromCharCode( event.which ).toLowerCase(),
- modif = "", possible = {};
-
- // check combinations (alt|ctrl|shift+anything)
- if ( event.altKey && special !== "alt" ) {
- modif += "alt+";
- }
-
- if ( event.ctrlKey && special !== "ctrl" ) {
- modif += "ctrl+";
- }
-
- // TODO: Need to make sure this works consistently across platforms
- if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
- modif += "meta+";
- }
-
- if ( event.shiftKey && special !== "shift" ) {
- modif += "shift+";
- }
-
- if ( special ) {
- possible[ modif + special ] = true;
- }
-
- if ( character ) {
- possible[ modif + character ] = true;
- possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
-
- // "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
- if ( modif === "shift+" ) {
- possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
- }
- }
-
- for ( var i = 0, l = keys.length; i < l; i++ ) {
- if ( possible[ keys[i] ] ) {
- return origHandler.apply( this, arguments );
- }
- }
- };
- }
-
- jQuery.each([ "keydown", "keyup", "keypress" ], function() {
- jQuery.event.special[ this ] = { add: keyHandler };
- });
-
-})( this.jQuery );
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.imagemapster.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.imagemapster.js
deleted file mode 100755
index 2bdf158..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.imagemapster.js
+++ /dev/null
@@ -1,4670 +0,0 @@
-/* ImageMapster
- Version: 1.2.10 (2/25/2013)
-
-Copyright 2011-2012 James Treworgy
-
-http://www.outsharked.com/imagemapster
-https://github.com/jamietre/ImageMapster
-
-A jQuery plugin to enhance image maps.
-
-*/
-
-;
-
-/// LICENSE (MIT License)
-///
-/// 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.
-///
-/// January 19, 2011
-
-/** @license MIT License (c) copyright B Cavalier & J Hann */
-
-/**
-* when
-* A lightweight CommonJS Promises/A and when() implementation
-*
-* when is part of the cujo.js family of libraries (http://cujojs.com/)
-*
-* Licensed under the MIT License at:
-* http://www.opensource.org/licenses/mit-license.php
-*
-* @version 1.2.0
-*/
-
-/*lint-ignore-start*/
-
-(function (define) {
- define(function () {
- var freeze, reduceArray, slice, undef;
-
- //
- // Public API
- //
-
- when.defer = defer;
- when.reject = reject;
- when.isPromise = isPromise;
-
- when.all = all;
- when.some = some;
- when.any = any;
-
- when.map = map;
- when.reduce = reduce;
-
- when.chain = chain;
-
- /** Object.freeze */
- freeze = Object.freeze || function (o) { return o; };
-
- /**
- * Trusted Promise constructor. A Promise created from this constructor is
- * a trusted when.js promise. Any other duck-typed promise is considered
- * untrusted.
- *
- * @constructor
- */
- function Promise() { }
-
- Promise.prototype = freeze({
- always: function (alwaysback, progback) {
- return this.then(alwaysback, alwaysback, progback);
- },
-
- otherwise: function (errback) {
- return this.then(undef, errback);
- }
- });
-
- /**
- * Create an already-resolved promise for the supplied value
- * @private
- *
- * @param value anything
- * @return {Promise}
- */
- function resolved(value) {
-
- var p = new Promise();
-
- p.then = function (callback) {
- var nextValue;
- try {
- if (callback) nextValue = callback(value);
- return promise(nextValue === undef ? value : nextValue);
- } catch (e) {
- return rejected(e);
- }
- };
-
- return freeze(p);
- }
-
- /**
- * Create an already-rejected {@link Promise} with the supplied
- * rejection reason.
- * @private
- *
- * @param reason rejection reason
- * @return {Promise}
- */
- function rejected(reason) {
-
- var p = new Promise();
-
- p.then = function (callback, errback) {
- var nextValue;
- try {
- if (errback) {
- nextValue = errback(reason);
- return promise(nextValue === undef ? reason : nextValue)
- }
-
- return rejected(reason);
-
- } catch (e) {
- return rejected(e);
- }
- };
-
- return freeze(p);
- }
-
- /**
- * Returns a rejected promise for the supplied promiseOrValue. If
- * promiseOrValue is a value, it will be the rejection value of the
- * returned promise. If promiseOrValue is a promise, its
- * completion value will be the rejected value of the returned promise
- *
- * @param promiseOrValue {*} the rejected value of the returned {@link Promise}
- *
- * @return {Promise} rejected {@link Promise}
- */
- function reject(promiseOrValue) {
- return when(promiseOrValue, function (value) {
- return rejected(value);
- });
- }
-
- /**
- * Creates a new, CommonJS compliant, Deferred with fully isolated
- * resolver and promise parts, either or both of which may be given out
- * safely to consumers.
- * The Deferred itself has the full API: resolve, reject, progress, and
- * then. The resolver has resolve, reject, and progress. The promise
- * only has then.
- *
- * @memberOf when
- * @function
- *
- * @returns {Deferred}
- */
- function defer() {
- var deferred, promise, listeners, progressHandlers, _then, _progress, complete;
-
- listeners = [];
- progressHandlers = [];
-
- /**
- * Pre-resolution then() that adds the supplied callback, errback, and progback
- * functions to the registered listeners
- *
- * @private
- *
- * @param [callback] {Function} resolution handler
- * @param [errback] {Function} rejection handler
- * @param [progback] {Function} progress handler
- *
- * @throws {Error} if any argument is not null, undefined, or a Function
- */
- _then = function unresolvedThen(callback, errback, progback) {
- var deferred = defer();
-
- listeners.push(function (promise) {
- promise.then(callback, errback)
- .then(deferred.resolve, deferred.reject, deferred.progress);
- });
-
- progback && progressHandlers.push(progback);
-
- return deferred.promise;
- };
-
- /**
- * Registers a handler for this {@link Deferred}'s {@link Promise}. Even though all arguments
- * are optional, each argument that *is* supplied must be null, undefined, or a Function.
- * Any other value will cause an Error to be thrown.
- *
- * @memberOf Promise
- *
- * @param [callback] {Function} resolution handler
- * @param [errback] {Function} rejection handler
- * @param [progback] {Function} progress handler
- *
- * @throws {Error} if any argument is not null, undefined, or a Function
- */
- function then(callback, errback, progback) {
- return _then(callback, errback, progback);
- }
-
- /**
- * Resolves this {@link Deferred}'s {@link Promise} with val as the
- * resolution value.
- *
- * @memberOf Resolver
- *
- * @param val anything
- */
- function resolve(val) {
- complete(resolved(val));
- }
-
- /**
- * Rejects this {@link Deferred}'s {@link Promise} with err as the
- * reason.
- *
- * @memberOf Resolver
- *
- * @param err anything
- */
- function reject(err) {
- complete(rejected(err));
- }
-
- /**
- * @private
- * @param update
- */
- _progress = function (update) {
- var progress, i = 0;
- while (progress = progressHandlers[i++]) progress(update);
- };
-
- /**
- * Emits a progress update to all progress observers registered with
- * this {@link Deferred}'s {@link Promise}
- *
- * @memberOf Resolver
- *
- * @param update anything
- */
- function progress(update) {
- _progress(update);
- }
-
- /**
- * Transition from pre-resolution state to post-resolution state, notifying
- * all listeners of the resolution or rejection
- *
- * @private
- *
- * @param completed {Promise} the completed value of this deferred
- */
- complete = function (completed) {
- var listener, i = 0;
-
- // Replace _then with one that directly notifies with the result.
- _then = completed.then;
-
- // Replace complete so that this Deferred can only be completed
- // once. Also Replace _progress, so that subsequent attempts to issue
- // progress throw.
- complete = _progress = function alreadyCompleted() {
- // TODO: Consider silently returning here so that parties who
- // have a reference to the resolver cannot tell that the promise
- // has been resolved using try/catch
- throw new Error("already completed");
- };
-
- // Free progressHandlers array since we'll never issue progress events
- // for this promise again now that it's completed
- progressHandlers = undef;
-
- // Notify listeners
- // Traverse all listeners registered directly with this Deferred
-
- while (listener = listeners[i++]) {
- listener(completed);
- }
-
- listeners = [];
- };
-
- /**
- * The full Deferred object, with both {@link Promise} and {@link Resolver}
- * parts
- * @class Deferred
- * @name Deferred
- */
- deferred = {};
-
- // Promise and Resolver parts
- // Freeze Promise and Resolver APIs
-
- promise = new Promise();
- promise.then = deferred.then = then;
-
- /**
- * The {@link Promise} for this {@link Deferred}
- * @memberOf Deferred
- * @name promise
- * @type {Promise}
- */
- deferred.promise = freeze(promise);
-
- /**
- * The {@link Resolver} for this {@link Deferred}
- * @memberOf Deferred
- * @name resolver
- * @class Resolver
- */
- deferred.resolver = freeze({
- resolve: (deferred.resolve = resolve),
- reject: (deferred.reject = reject),
- progress: (deferred.progress = progress)
- });
-
- return deferred;
- }
-
- /**
- * Determines if promiseOrValue is a promise or not. Uses the feature
- * test from http://wiki.commonjs.org/wiki/Promises/A to determine if
- * promiseOrValue is a promise.
- *
- * @param promiseOrValue anything
- *
- * @returns {Boolean} true if promiseOrValue is a {@link Promise}
- */
- function isPromise(promiseOrValue) {
- return promiseOrValue && typeof promiseOrValue.then === 'function';
- }
-
- /**
- * Register an observer for a promise or immediate value.
- *
- * @function
- * @name when
- * @namespace
- *
- * @param promiseOrValue anything
- * @param {Function} [callback] callback to be called when promiseOrValue is
- * successfully resolved. If promiseOrValue is an immediate value, callback
- * will be invoked immediately.
- * @param {Function} [errback] callback to be called when promiseOrValue is
- * rejected.
- * @param {Function} [progressHandler] callback to be called when progress updates
- * are issued for promiseOrValue.
- *
- * @returns {Promise} a new {@link Promise} that will complete with the return
- * value of callback or errback or the completion value of promiseOrValue if
- * callback and/or errback is not supplied.
- */
- function when(promiseOrValue, callback, errback, progressHandler) {
- // Get a promise for the input promiseOrValue
- // See promise()
- var trustedPromise = promise(promiseOrValue);
-
- // Register promise handlers
- return trustedPromise.then(callback, errback, progressHandler);
- }
-
- /**
- * Returns promiseOrValue if promiseOrValue is a {@link Promise}, a new Promise if
- * promiseOrValue is a foreign promise, or a new, already-resolved {@link Promise}
- * whose resolution value is promiseOrValue if promiseOrValue is an immediate value.
- *
- * Note that this function is not safe to export since it will return its
- * input when promiseOrValue is a {@link Promise}
- *
- * @private
- *
- * @param promiseOrValue anything
- *
- * @returns Guaranteed to return a trusted Promise. If promiseOrValue is a when.js {@link Promise}
- * returns promiseOrValue, otherwise, returns a new, already-resolved, when.js {@link Promise}
- * whose resolution value is:
- * * the resolution value of promiseOrValue if it's a foreign promise, or
- * * promiseOrValue if it's a value
- */
- function promise(promiseOrValue) {
- var promise, deferred;
-
- if (promiseOrValue instanceof Promise) {
- // It's a when.js promise, so we trust it
- promise = promiseOrValue;
-
- } else {
- // It's not a when.js promise. Check to see if it's a foreign promise
- // or a value.
-
- deferred = defer();
- if (isPromise(promiseOrValue)) {
- // It's a compliant promise, but we don't know where it came from,
- // so we don't trust its implementation entirely. Introduce a trusted
- // middleman when.js promise
-
- // IMPORTANT: This is the only place when.js should ever call .then() on
- // an untrusted promise.
- promiseOrValue.then(deferred.resolve, deferred.reject, deferred.progress);
- promise = deferred.promise;
-
- } else {
- // It's a value, not a promise. Create an already-resolved promise
- // for it.
- deferred.resolve(promiseOrValue);
- promise = deferred.promise;
- }
- }
-
- return promise;
- }
-
- /**
- * Return a promise that will resolve when howMany of the supplied promisesOrValues
- * have resolved. The resolution value of the returned promise will be an array of
- * length howMany containing the resolutions values of the triggering promisesOrValues.
- *
- * @memberOf when
- *
- * @param promisesOrValues {Array} array of anything, may contain a mix
- * of {@link Promise}s and values
- * @param howMany
- * @param [callback]
- * @param [errback]
- * @param [progressHandler]
- *
- * @returns {Promise}
- */
- function some(promisesOrValues, howMany, callback, errback, progressHandler) {
-
- checkCallbacks(2, arguments);
-
- return when(promisesOrValues, function (promisesOrValues) {
-
- var toResolve, results, ret, deferred, resolver, rejecter, handleProgress, len, i;
-
- len = promisesOrValues.length >>> 0;
-
- toResolve = Math.max(0, Math.min(howMany, len));
- results = [];
- deferred = defer();
- ret = when(deferred, callback, errback, progressHandler);
-
- // Wrapper so that resolver can be replaced
- function resolve(val) {
- resolver(val);
- }
-
- // Wrapper so that rejecter can be replaced
- function reject(err) {
- rejecter(err);
- }
-
- // Wrapper so that progress can be replaced
- function progress(update) {
- handleProgress(update);
- }
-
- function complete() {
- resolver = rejecter = handleProgress = noop;
- }
-
- // No items in the input, resolve immediately
- if (!toResolve) {
- deferred.resolve(results);
-
- } else {
- // Resolver for promises. Captures the value and resolves
- // the returned promise when toResolve reaches zero.
- // Overwrites resolver var with a noop once promise has
- // be resolved to cover case where n < promises.length
- resolver = function (val) {
- // This orders the values based on promise resolution order
- // Another strategy would be to use the original position of
- // the corresponding promise.
- results.push(val);
-
- if (! --toResolve) {
- complete();
- deferred.resolve(results);
- }
- };
-
- // Rejecter for promises. Rejects returned promise
- // immediately, and overwrites rejecter var with a noop
- // once promise to cover case where n < promises.length.
- // TODO: Consider rejecting only when N (or promises.length - N?)
- // promises have been rejected instead of only one?
- rejecter = function (err) {
- complete();
- deferred.reject(err);
- };
-
- handleProgress = deferred.progress;
-
- // TODO: Replace while with forEach
- for (i = 0; i < len; ++i) {
- if (i in promisesOrValues) {
- when(promisesOrValues[i], resolve, reject, progress);
- }
- }
- }
-
- return ret;
- });
- }
-
- /**
- * Return a promise that will resolve only once all the supplied promisesOrValues
- * have resolved. The resolution value of the returned promise will be an array
- * containing the resolution values of each of the promisesOrValues.
- *
- * @memberOf when
- *
- * @param promisesOrValues {Array|Promise} array of anything, may contain a mix
- * of {@link Promise}s and values
- * @param [callback] {Function}
- * @param [errback] {Function}
- * @param [progressHandler] {Function}
- *
- * @returns {Promise}
- */
- function all(promisesOrValues, callback, errback, progressHandler) {
-
- checkCallbacks(1, arguments);
-
- return when(promisesOrValues, function (promisesOrValues) {
- return _reduce(promisesOrValues, reduceIntoArray, []);
- }).then(callback, errback, progressHandler);
- }
-
- function reduceIntoArray(current, val, i) {
- current[i] = val;
- return current;
- }
-
- /**
- * Return a promise that will resolve when any one of the supplied promisesOrValues
- * has resolved. The resolution value of the returned promise will be the resolution
- * value of the triggering promiseOrValue.
- *
- * @memberOf when
- *
- * @param promisesOrValues {Array|Promise} array of anything, may contain a mix
- * of {@link Promise}s and values
- * @param [callback] {Function}
- * @param [errback] {Function}
- * @param [progressHandler] {Function}
- *
- * @returns {Promise}
- */
- function any(promisesOrValues, callback, errback, progressHandler) {
-
- function unwrapSingleResult(val) {
- return callback ? callback(val[0]) : val[0];
- }
-
- return some(promisesOrValues, 1, unwrapSingleResult, errback, progressHandler);
- }
-
- /**
- * Traditional map function, similar to `Array.prototype.map()`, but allows
- * input to contain {@link Promise}s and/or values, and mapFunc may return
- * either a value or a {@link Promise}
- *
- * @memberOf when
- *
- * @param promise {Array|Promise} array of anything, may contain a mix
- * of {@link Promise}s and values
- * @param mapFunc {Function} mapping function mapFunc(value) which may return
- * either a {@link Promise} or value
- *
- * @returns {Promise} a {@link Promise} that will resolve to an array containing
- * the mapped output values.
- */
- function map(promise, mapFunc) {
- return when(promise, function (array) {
- return _map(array, mapFunc);
- });
- }
-
- /**
- * Private map helper to map an array of promises
- * @private
- *
- * @param promisesOrValues {Array}
- * @param mapFunc {Function}
- * @return {Promise}
- */
- function _map(promisesOrValues, mapFunc) {
-
- var results, len, i;
-
- // Since we know the resulting length, we can preallocate the results
- // array to avoid array expansions.
- len = promisesOrValues.length >>> 0;
- results = new Array(len);
-
- // Since mapFunc may be async, get all invocations of it into flight
- // asap, and then use reduce() to collect all the results
- for (i = 0; i < len; i++) {
- if (i in promisesOrValues)
- results[i] = when(promisesOrValues[i], mapFunc);
- }
-
- // Could use all() here, but that would result in another array
- // being allocated, i.e. map() would end up allocating 2 arrays
- // of size len instead of just 1. Since all() uses reduce()
- // anyway, avoid the additional allocation by calling reduce
- // directly.
- return _reduce(results, reduceIntoArray, results);
- }
-
- /**
- * Traditional reduce function, similar to `Array.prototype.reduce()`, but
- * input may contain {@link Promise}s and/or values, and reduceFunc
- * may return either a value or a {@link Promise}, *and* initialValue may
- * be a {@link Promise} for the starting value.
- *
- * @memberOf when
- *
- * @param promise {Array|Promise} array of anything, may contain a mix
- * of {@link Promise}s and values. May also be a {@link Promise} for
- * an array.
- * @param reduceFunc {Function} reduce function reduce(currentValue, nextValue, index, total),
- * where total is the total number of items being reduced, and will be the same
- * in each call to reduceFunc.
- * @param initialValue starting value, or a {@link Promise} for the starting value
- *
- * @returns {Promise} that will resolve to the final reduced value
- */
- function reduce(promise, reduceFunc, initialValue) {
- var args = slice.call(arguments, 1);
- return when(promise, function (array) {
- return _reduce.apply(undef, [array].concat(args));
- });
- }
-
- /**
- * Private reduce to reduce an array of promises
- * @private
- *
- * @param promisesOrValues {Array}
- * @param reduceFunc {Function}
- * @param initialValue {*}
- * @return {Promise}
- */
- function _reduce(promisesOrValues, reduceFunc, initialValue) {
-
- var total, args;
-
- total = promisesOrValues.length;
-
- // Skip promisesOrValues, since it will be used as 'this' in the call
- // to the actual reduce engine below.
-
- // Wrap the supplied reduceFunc with one that handles promises and then
- // delegates to the supplied.
-
- args = [
- function (current, val, i) {
- return when(current, function (c) {
- return when(val, function (value) {
- return reduceFunc(c, value, i, total);
- });
- });
- }
- ];
-
- if (arguments.length > 2) args.push(initialValue);
-
- return reduceArray.apply(promisesOrValues, args);
- }
-
- /**
- * Ensure that resolution of promiseOrValue will complete resolver with the completion
- * value of promiseOrValue, or instead with resolveValue if it is provided.
- *
- * @memberOf when
- *
- * @param promiseOrValue
- * @param resolver {Resolver}
- * @param [resolveValue] anything
- *
- * @returns {Promise}
- */
- function chain(promiseOrValue, resolver, resolveValue) {
- var useResolveValue = arguments.length > 2;
-
- return when(promiseOrValue,
- function (val) {
- if (useResolveValue) val = resolveValue;
- resolver.resolve(val);
- return val;
- },
- function (e) {
- resolver.reject(e);
- return rejected(e);
- },
- resolver.progress
- );
- }
-
- //
- // Utility functions
- //
-
- /**
- * Helper that checks arrayOfCallbacks to ensure that each element is either
- * a function, or null or undefined.
- *
- * @private
- *
- * @param arrayOfCallbacks {Array} array to check
- * @throws {Error} if any element of arrayOfCallbacks is something other than
- * a Functions, null, or undefined.
- */
- function checkCallbacks(start, arrayOfCallbacks) {
- var arg, i = arrayOfCallbacks.length;
- while (i > start) {
- arg = arrayOfCallbacks[--i];
- if (arg != null && typeof arg != 'function') throw new Error('callback is not a function');
- }
- }
-
- /**
- * No-Op function used in method replacement
- * @private
- */
- function noop() { }
-
- slice = [].slice;
-
- // ES5 reduce implementation if native not available
- // See: http://es5.github.com/#x15.4.4.21 as there are many
- // specifics and edge cases.
- reduceArray = [].reduce ||
- function (reduceFunc /*, initialValue */) {
- // ES5 dictates that reduce.length === 1
-
- // This implementation deviates from ES5 spec in the following ways:
- // 1. It does not check if reduceFunc is a Callable
-
- var arr, args, reduced, len, i;
-
- i = 0;
- arr = Object(this);
- len = arr.length >>> 0;
- args = arguments;
-
- // If no initialValue, use first item of array (we know length !== 0 here)
- // and adjust i to start at second item
- if (args.length <= 1) {
- // Skip to the first real element in the array
- for (; ; ) {
- if (i in arr) {
- reduced = arr[i++];
- break;
- }
-
- // If we reached the end of the array without finding any real
- // elements, it's a TypeError
- if (++i >= len) {
- throw new TypeError();
- }
- }
- } else {
- // If initialValue provided, use it
- reduced = args[1];
- }
-
- // Do the actual reduce
- for (; i < len; ++i) {
- // Skip holes
- if (i in arr)
- reduced = reduceFunc(reduced, arr[i], i, arr);
- }
-
- return reduced;
- };
-
- return when;
- });
-})(typeof define == 'function'
- ? define
- : function (factory) {
- typeof module != 'undefined'
- ? (module.exports = factory())
- : (jQuery.mapster_when = factory());
- }
-// Boilerplate for AMD, Node, and browser global
-);
-/*lint-ignore-end*/
-/* ImageMapster core */
-
-/*jslint laxbreak: true, evil: true, unparam: true */
-
-/*global jQuery: true, Zepto: true */
-
-
-(function ($) {
- // all public functions in $.mapster.impl are methods
- $.fn.mapster = function (method) {
- var m = $.mapster.impl;
- if ($.isFunction(m[method])) {
- return m[method].apply(this, Array.prototype.slice.call(arguments, 1));
- } else if (typeof method === 'object' || !method) {
- return m.bind.apply(this, arguments);
- } else {
- $.error('Method ' + method + ' does not exist on jQuery.mapster');
- }
- };
-
- $.mapster = {
- version: "1.2.10",
- render_defaults: {
- isSelectable: true,
- isDeselectable: true,
- fade: false,
- fadeDuration: 150,
- fill: true,
- fillColor: '000000',
- fillColorMask: 'FFFFFF',
- fillOpacity: 0.7,
- highlight: true,
- stroke: false,
- strokeColor: 'ff0000',
- strokeOpacity: 1,
- strokeWidth: 1,
- includeKeys: '',
- altImage: null,
- altImageId: null, // used internally
- altImages: {}
- },
- defaults: {
- clickNavigate: false,
- wrapClass: null,
- wrapCss: null,
- onGetList: null,
- sortList: false,
- listenToList: false,
- mapKey: '',
- mapValue: '',
- singleSelect: false,
- listKey: 'value',
- listSelectedAttribute: 'selected',
- listSelectedClass: null,
- onClick: null,
- onMouseover: null,
- onMouseout: null,
- mouseoutDelay: 0,
- onStateChange: null,
- boundList: null,
- onConfigured: null,
- configTimeout: 30000,
- noHrefIsMask: true,
- scaleMap: true,
- safeLoad: false,
- areas: []
- },
- shared_defaults: {
- render_highlight: { fade: true },
- render_select: { fade: false },
- staticState: null,
- selected: null
- },
- area_defaults:
- {
- includeKeys: '',
- isMask: false
- },
- canvas_style: {
- position: 'absolute',
- left: 0,
- top: 0,
- padding: 0,
- border: 0
- },
- hasCanvas: null,
- isTouch: null,
- map_cache: [],
- hooks: {},
- addHook: function(name,callback) {
- this.hooks[name]=(this.hooks[name]||[]).push(callback);
- },
- callHooks: function(name,context) {
- $.each(this.hooks[name]||[],function(i,e) {
- e.apply(context);
- });
- },
- utils: {
- when: $.mapster_when,
- defer: $.mapster_when.defer,
-
- // extends the constructor, returns a new object prototype. Does not refer to the
- // original constructor so is protected if the original object is altered. This way you
- // can "extend" an object by replacing it with its subclass.
- subclass: function(BaseClass, constr) {
- var Subclass=function() {
- var me=this,
- args=Array.prototype.slice.call(arguments,0);
- me.base = BaseClass.prototype;
- me.base.init = function() {
- BaseClass.prototype.constructor.apply(me,args);
- };
- constr.apply(me,args);
- };
- Subclass.prototype = new BaseClass();
- Subclass.prototype.constructor=Subclass;
- return Subclass;
- },
- asArray: function (obj) {
- return obj.constructor === Array ?
- obj : this.split(obj);
- },
- // clean split: no padding or empty elements
- split: function (text,cb) {
- var i,el, arr = text.split(',');
- for (i = 0; i < arr.length; i++) {
- el = $.trim(arr[i]);
- if (el==='') {
- arr.splice(i,1);
- } else {
- arr[i] = cb ? cb(el):el;
- }
- }
- return arr;
- },
- // similar to $.extend but does not add properties (only updates), unless the
- // first argument is an empty object, then all properties will be copied
- updateProps: function (_target, _template) {
- var onlyProps,
- target = _target || {},
- template = $.isEmptyObject(target) ? _template : _target;
-
- //if (template) {
- onlyProps = [];
- $.each(template, function (prop) {
- onlyProps.push(prop);
- });
- //}
-
- $.each(Array.prototype.slice.call(arguments, 1), function (i, src) {
- $.each(src || {}, function (prop) {
- if (!onlyProps || $.inArray(prop, onlyProps) >= 0) {
- var p = src[prop];
-
- if ($.isPlainObject(p)) {
- // not recursive - only copies 1 level of subobjects, and always merges
- target[prop] = $.extend(target[prop] || {}, p);
- } else if (p && p.constructor === Array) {
- target[prop] = p.slice(0);
- } else if (typeof p !== 'undefined') {
- target[prop] = src[prop];
- }
-
- }
- });
- });
- return target;
- },
- isElement: function (o) {
- return (typeof HTMLElement === "object" ? o instanceof HTMLElement :
- o && typeof o === "object" && o.nodeType === 1 && typeof o.nodeName === "string");
- },
- // finds element of array or object with a property "prop" having value "val"
- // if prop is not defined, then just looks for property with value "val"
- indexOfProp: function (obj, prop, val) {
- var result = obj.constructor === Array ? -1 : null;
- $.each(obj, function (i, e) {
- if (e && (prop ? e[prop] : e) === val) {
- result = i;
- return false;
- }
- });
- return result;
- },
- // returns "obj" if true or false, or "def" if not true/false
- boolOrDefault: function (obj, def) {
- return this.isBool(obj) ?
- obj : def || false;
- },
- isBool: function (obj) {
- return typeof obj === "boolean";
- },
- isUndef: function(obj) {
- return typeof obj === "undefined";
- },
- // evaluates "obj", if function, calls it with args
- // (todo - update this to handle variable lenght/more than one arg)
- ifFunction: function (obj, that, args) {
- if ($.isFunction(obj)) {
- obj.call(that, args);
- }
- },
- size: function(image, raw) {
- var u=$.mapster.utils;
- return {
- width: raw ? (image.width || image.naturalWidth) : u.imgWidth(image,true) ,
- height: raw ? (image.height || image.naturalHeight) : u.imgHeight(image,true),
- complete: function() { return !!this.height && !!this.width;}
- };
- },
-
-
- /**
- * Set the opacity of the element. This is an IE<8 specific function for handling VML.
- * When using VML we must override the "setOpacity" utility function (monkey patch ourselves).
- * jQuery does not deal with opacity correctly for VML elements. This deals with that.
- *
- * @param {Element} el The DOM element
- * @param {double} opacity A value between 0 and 1 inclusive.
- */
-
- setOpacity: function (el, opacity) {
- if ($.mapster.hasCanvas()) {
- el.style.opacity = opacity;
- } else {
- $(el).each(function(i,e) {
- if (typeof e.opacity !=='undefined') {
- e.opacity=opacity;
- } else {
- $(e).css("opacity",opacity);
- }
- });
- }
- },
-
-
- // fade "el" from opacity "op" to "endOp" over a period of time "duration"
-
- fader: (function () {
- var elements = {},
- lastKey = 0,
- fade_func = function (el, op, endOp, duration) {
- var index,
- cbIntervals = duration/15,
- obj, u = $.mapster.utils;
-
- if (typeof el === 'number') {
- obj = elements[el];
- if (!obj) {
- return;
- }
- } else {
- index = u.indexOfProp(elements, null, el);
- if (index) {
- delete elements[index];
- }
- elements[++lastKey] = obj = el;
- el = lastKey;
- }
-
- endOp = endOp || 1;
-
- op = (op + (endOp / cbIntervals) > endOp - 0.01) ? endOp : op + (endOp / cbIntervals);
-
- u.setOpacity(obj, op);
- if (op < endOp) {
- setTimeout(function () {
- fade_func(el, op, endOp, duration);
- }, 15);
- }
- };
- return fade_func;
- } ())
- },
- getBoundList: function (opts, key_list) {
- if (!opts.boundList) {
- return null;
- }
- var index, key, result = $(), list = $.mapster.utils.split(key_list);
- opts.boundList.each(function (i,e) {
- for (index = 0; index < list.length; index++) {
- key = list[index];
- if ($(e).is('[' + opts.listKey + '="' + key + '"]')) {
- result = result.add(e);
- }
- }
- });
- return result;
- },
- // Causes changes to the bound list based on the user action (select or deselect)
- // area: the jQuery area object
- // returns the matching elements from the bound list for the first area passed (normally only one should be passed, but
- // a list can be passed
- setBoundListProperties: function (opts, target, selected) {
- target.each(function (i,e) {
- if (opts.listSelectedClass) {
- if (selected) {
- $(e).addClass(opts.listSelectedClass);
- } else {
- $(e).removeClass(opts.listSelectedClass);
- }
- }
- if (opts.listSelectedAttribute) {
- $(e).attr(opts.listSelectedAttribute, selected);
- }
- });
- },
- getMapDataIndex: function (obj) {
- var img, id;
- switch (obj.tagName && obj.tagName.toLowerCase()) {
- case 'area':
- id = $(obj).parent().attr('name');
- img = $("img[usemap='#" + id + "']")[0];
- break;
- case 'img':
- img = obj;
- break;
- }
- return img ?
- this.utils.indexOfProp(this.map_cache, 'image', img) : -1;
- },
- getMapData: function (obj) {
- var index = this.getMapDataIndex(obj.length ? obj[0]:obj);
- if (index >= 0) {
- return index >= 0 ? this.map_cache[index] : null;
- }
- },
- /**
- * Queue a command to be run after the active async operation has finished
- * @param {MapData} map_data The target MapData object
- * @param {jQuery} that jQuery object on which the command was invoked
- * @param {string} command the ImageMapster method name
- * @param {object[]} args arguments passed to the method
- * @return {bool} true if the command was queued, false if not (e.g. there was no need to)
- */
- queueCommand: function (map_data, that, command, args) {
- if (!map_data) {
- return false;
- }
- if (!map_data.complete || map_data.currentAction) {
- map_data.commands.push(
- {
- that: that,
- command: command,
- args: args
- });
- return true;
- }
- return false;
- },
- unload: function () {
- this.impl.unload();
- this.utils = null;
- this.impl = null;
- $.fn.mapster = null;
- $.mapster = null;
- $('*').unbind();
- }
- };
-
- // Config for object prototypes
- // first: use only first object (for things that should not apply to lists)
- /// calls back one of two fuinctions, depending on whether an area was obtained.
- // opts: {
- // name: 'method name',
- // key: 'key,
- // args: 'args'
- //
- //}
- // name: name of method (required)
- // args: arguments to re-call with
- // Iterates through all the objects passed, and determines whether it's an area or an image, and calls the appropriate
- // callback for each. If anything is returned from that callback, the process is stopped and that data return. Otherwise,
- // the object itself is returned.
-
- var m = $.mapster,
- u = m.utils,
- ap = Array.prototype;
-
-
- // jQuery's width() and height() are broken on IE9 in some situations. This tries everything.
- $.each(["width","height"],function(i,e) {
- var capProp = e.substr(0,1).toUpperCase() + e.substr(1);
- // when jqwidth parm is passed, it also checks the jQuery width()/height() property
- // the issue is that jQUery width() can report a valid size before the image is loaded in some browsers
- // without it, we can read zero even when image is loaded in other browsers if its not visible
- // we must still check because stuff like adblock can temporarily block it
- // what a goddamn headache
- u["img"+capProp]=function(img,jqwidth) {
- return (jqwidth ? $(img)[e]() : 0) ||
- img[e] || img["natural"+capProp] || img["client"+capProp] || img["offset"+capProp];
- };
-
- });
-
- /**
- * The Method object encapsulates the process of testing an ImageMapster method to see if it's being
- * invoked on an image, or an area; then queues the command if the MapData is in an active state.
- *
- * @param {[jQuery]} that The target of the invocation
- * @param {[function]} func_map The callback if the target is an imagemap
- * @param {[function]} func_area The callback if the target is an area
- * @param {[object]} opt Options: { key: a map key if passed explicitly
- * name: the command name, if it can be queued,
- * args: arguments to the method
- * }
- */
-
- m.Method = function (that, func_map, func_area, opts) {
- var me = this;
- me.name = opts.name;
- me.output = that;
- me.input = that;
- me.first = opts.first || false;
- me.args = opts.args ? ap.slice.call(opts.args, 0) : [];
- me.key = opts.key;
- me.func_map = func_map;
- me.func_area = func_area;
- //$.extend(me, opts);
- me.name = opts.name;
- me.allowAsync = opts.allowAsync || false;
- };
- m.Method.prototype = {
- constructor: m.Method,
- go: function () {
- var i, data, ar, len, result, src = this.input,
- area_list = [],
- me = this;
-
- len = src.length;
- for (i = 0; i < len; i++) {
- data = $.mapster.getMapData(src[i]);
- if (data) {
- if (!me.allowAsync && m.queueCommand(data, me.input, me.name, me.args)) {
- if (this.first) {
- result = '';
- }
- continue;
- }
-
- ar = data.getData(src[i].nodeName === 'AREA' ? src[i] : this.key);
- if (ar) {
- if ($.inArray(ar, area_list) < 0) {
- area_list.push(ar);
- }
- } else {
- result = this.func_map.apply(data, me.args);
- }
- if (this.first || typeof result !== 'undefined') {
- break;
- }
- }
- }
- // if there were areas, call the area function for each unique group
- $(area_list).each(function (i,e) {
- result = me.func_area.apply(e, me.args);
- });
-
- if (typeof result !== 'undefined') {
- return result;
- } else {
- return this.output;
- }
- }
- };
-
- $.mapster.impl = (function () {
- var me = {},
- addMap= function (map_data) {
- return m.map_cache.push(map_data) - 1;
- },
- removeMap = function (map_data) {
- m.map_cache.splice(map_data.index, 1);
- for (var i = m.map_cache.length - 1; i >= this.index; i--) {
- m.map_cache[i].index--;
- }
- };
-
-
- /**
- * Test whether the browser supports VML. Credit: google.
- * http://stackoverflow.com/questions/654112/how-do-you-detect-support-for-vml-or-svg-in-a-browser
- *
- * @return {bool} true if vml is supported, false if not
- */
-
- function hasVml() {
- var a = $('<div />').appendTo('body');
- a.html('<v:shape id="vml_flag1" adj="1" />');
-
- var b = a[0].firstChild;
- b.style.behavior = "url(#default#VML)";
- var has = b ? typeof b.adj === "object" : true;
- a.remove();
- return has;
- }
-
- /**
- * Return a reference to the IE namespaces object, if available, or an empty object otherwise
- * @return {obkect} The document.namespaces object.
- */
- function namespaces() {
- return typeof(document.namespaces)==='object' ?
- document.namespaces :
- null;
- }
-
- /**
- * Test for the presence of HTML5 Canvas support. This also checks to see if excanvas.js has been
- * loaded and is faking it; if so, we assume that canvas is not supported.
- *
- * @return {bool} true if HTML5 canvas support, false if not
- */
-
- function hasCanvas() {
- var d = namespaces();
- // when g_vml_ is present, then we can be sure excanvas is active, meaning there's not a real canvas.
-
- return d && d.g_vml_ ?
- false :
- $('<canvas />')[0].getContext ?
- true :
- false;
- }
-
- /**
- * Merge new area data into existing area options on a MapData object. Used for rebinding.
- *
- * @param {[MapData]} map_data The MapData object
- * @param {[object[]]} areas areas array to merge
- */
-
- function merge_areas(map_data, areas) {
- var ar, index,
- map_areas = map_data.options.areas;
-
- if (areas) {
- $.each(areas, function (i, e) {
-
- // Issue #68 - ignore invalid data in areas array
-
- if (!e || !e.key) {
- return;
- }
-
- index = u.indexOfProp(map_areas, "key", e.key);
-
- if (index >= 0) {
- $.extend(map_areas[index], e);
- }
- else {
- map_areas.push(e);
- }
- ar = map_data.getDataForKey(e.key);
- if (ar) {
- $.extend(ar.options, e);
- }
- });
- }
- }
- function merge_options(map_data, options) {
- var temp_opts = u.updateProps({}, options);
- delete temp_opts.areas;
-
- u.updateProps(map_data.options, temp_opts);
-
- merge_areas(map_data, options.areas);
- // refresh the area_option template
- u.updateProps(map_data.area_options, map_data.options);
- }
-
- // Most methods use the "Method" object which handles figuring out whether it's an image or area called and
- // parsing key parameters. The constructor wants:
- // this, the jQuery object
- // a function that is called when an image was passed (with a this context of the MapData)
- // a function that is called when an area was passed (with a this context of the AreaData)
- // options: first = true means only the first member of a jQuery object is handled
- // key = the key parameters passed
- // defaultReturn: a value to return other than the jQuery object (if its not chainable)
- // args: the arguments
- // Returns a comma-separated list of user-selected areas. "staticState" areas are not considered selected for the purposes of this method.
-
- me.get = function (key) {
- var md = m.getMapData(this);
- if (!(md && md.complete)) {
- throw("Can't access data until binding complete.");
- }
-
- return (new m.Method(this,
- function () {
- // map_data return
- return this.getSelected();
- },
- function () {
- return this.isSelected();
- },
- { name: 'get',
- args: arguments,
- key: key,
- first: true,
- allowAsync: true,
- defaultReturn: ''
- }
- )).go();
- };
- me.data = function (key) {
- return (new m.Method(this,
- null,
- function () {
- return this;
- },
- { name: 'data',
- args: arguments,
- key: key
- }
- )).go();
- };
-
-
- // Set or return highlight state.
- // $(img).mapster('highlight') -- return highlighted area key, or null if none
- // $(area).mapster('highlight') -- highlight an area
- // $(img).mapster('highlight','area_key') -- highlight an area
- // $(img).mapster('highlight',false) -- remove highlight
- me.highlight = function (key) {
- return (new m.Method(this,
- function () {
- if (key === false) {
- this.ensureNoHighlight();
- } else {
- var id = this.highlightId;
- return id >= 0 ? this.data[id].key : null;
- }
- },
- function () {
- this.highlight();
- },
- { name: 'highlight',
- args: arguments,
- key: key,
- first: true
- }
- )).go();
- };
- // Return the primary keys for an area or group key.
- // $(area).mapster('key')
- // includes all keys (not just primary keys)
- // $(area).mapster('key',true)
- // $(img).mapster('key','group-key')
-
- // $(img).mapster('key','group-key', true)
- me.keys = function(key,all) {
- var keyList=[],
- md = m.getMapData(this);
-
- if (!(md && md.complete)) {
- throw("Can't access data until binding complete.");
- }
-
-
- function addUniqueKeys(ad) {
- var areas,keys=[];
- if (!all) {
- keys.push(ad.key);
- } else {
- areas=ad.areas();
- $.each(areas,function(i,e) {
- keys=keys.concat(e.keys);
- });
- }
- $.each(keys,function(i,e) {
- if ($.inArray(e,keyList)<0) {
- keyList.push(e);
- }
- });
- }
-
- if (!(md && md.complete)) {
- return '';
- }
- if (typeof key === 'string') {
- if (all) {
- addUniqueKeys(md.getDataForKey(key));
- } else {
- keyList=[md.getKeysForGroup(key)];
- }
- } else {
- all = key;
- this.each(function(i,e) {
- if (e.nodeName==='AREA') {
- addUniqueKeys(md.getDataForArea(e));
- }
- });
- }
- return keyList.join(',');
-
-
- };
- me.select = function () {
- me.set.call(this, true);
- };
- me.deselect = function () {
- me.set.call(this, false);
- };
-
- /**
- * Select or unselect areas. Areas can be identified by a single string key, a comma-separated list of keys,
- * or an array of strings.
- *
- *
- * @param {boolean} selected Determines whether areas are selected or deselected
- * @param {string|string[]} key A string, comma-separated string, or array of strings indicating
- * the areas to select or deselect
- * @param {object} options Rendering options to apply when selecting an area
- */
-
- me.set = function (selected, key, options) {
- var lastMap, map_data, opts=options,
- key_list, area_list; // array of unique areas passed
-
- function setSelection(ar) {
- if (ar) {
- switch (selected) {
- case true:
- ar.select(opts); break;
- case false:
- ar.deselect(true); break;
- default:
- ar.toggle(opts); break;
- }
- }
- }
- function addArea(ar) {
- if (ar && $.inArray(ar, area_list) < 0) {
- area_list.push(ar);
- key_list+=(key_list===''?'':',')+ar.key;
- }
- }
- // Clean up after a group that applied to the same map
- function finishSetForMap(map_data) {
- $.each(area_list, function (i, el) {
- setSelection(el);
- });
- if (!selected) {
- map_data.removeSelectionFinish();
- }
- if (map_data.options.boundList) {
- m.setBoundListProperties(map_data.options, m.getBoundList(map_data.options, key_list), selected);
- }
- }
-
- this.filter('img,area').each(function (i,e) {
- var keys;
- map_data = m.getMapData(e);
-
- if (map_data !== lastMap) {
- if (lastMap) {
- finishSetForMap(lastMap);
- }
-
- area_list = [];
- key_list='';
- }
-
- if (map_data) {
-
- keys = '';
- if (e.nodeName.toUpperCase()==='IMG') {
- if (!m.queueCommand(map_data, $(e), 'set', [selected, key, opts])) {
- if (key instanceof Array) {
- if (key.length) {
- keys = key.join(",");
- }
- }
- else {
- keys = key;
- }
-
- if (keys) {
- $.each(u.split(keys), function (i,key) {
- addArea(map_data.getDataForKey(key.toString()));
- lastMap = map_data;
- });
- }
- }
- } else {
- opts=key;
- if (!m.queueCommand(map_data, $(e), 'set', [selected, opts])) {
- addArea(map_data.getDataForArea(e));
- lastMap = map_data;
- }
-
- }
- }
- });
-
- if (map_data) {
- finishSetForMap(map_data);
- }
-
-
- return this;
- };
- me.unbind = function (preserveState) {
- return (new m.Method(this,
- function () {
- this.clearEvents();
- this.clearMapData(preserveState);
- removeMap(this);
- },
- null,
- { name: 'unbind',
- args: arguments
- }
- )).go();
- };
-
-
- // refresh options and update selection information.
- me.rebind = function (options) {
- return (new m.Method(this,
- function () {
- var me=this;
-
- me.complete=false;
- me.configureOptions(options);
- me.bindImages().then(function() {
- me.buildDataset(true);
- me.complete=true;
- });
- //this.redrawSelections();
- },
- null,
- {
- name: 'rebind',
- args: arguments
- }
- )).go();
- };
- // get options. nothing or false to get, or "true" to get effective options (versus passed options)
- me.get_options = function (key, effective) {
- var eff = u.isBool(key) ? key : effective; // allow 2nd parm as "effective" when no key
- return (new m.Method(this,
- function () {
- var opts = $.extend({}, this.options);
- if (eff) {
- opts.render_select = u.updateProps(
- {},
- m.render_defaults,
- opts,
- opts.render_select);
-
- opts.render_highlight = u.updateProps(
- {},
- m.render_defaults,
- opts,
- opts.render_highlight);
- }
- return opts;
- },
- function () {
- return eff ? this.effectiveOptions() : this.options;
- },
- {
- name: 'get_options',
- args: arguments,
- first: true,
- allowAsync: true,
- key: key
- }
- )).go();
- };
-
- // set options - pass an object with options to set,
- me.set_options = function (options) {
- return (new m.Method(this,
- function () {
- merge_options(this, options);
- },
- null,
- {
- name: 'set_options',
- args: arguments
- }
- )).go();
- };
- me.unload = function () {
- var i;
- for (i = m.map_cache.length - 1; i >= 0; i--) {
- if (m.map_cache[i]) {
- me.unbind.call($(m.map_cache[i].image));
- }
- }
- me.graphics = null;
- };
-
- me.snapshot = function () {
- return (new m.Method(this,
- function () {
- $.each(this.data, function (i, e) {
- e.selected = false;
- });
-
- this.base_canvas = this.graphics.createVisibleCanvas(this);
- $(this.image).before(this.base_canvas);
- },
- null,
- { name: 'snapshot' }
- )).go();
- };
-
- // do not queue this function
-
- me.state = function () {
- var md, result = null;
- $(this).each(function (i,e) {
- if (e.nodeName === 'IMG') {
- md = m.getMapData(e);
- if (md) {
- result = md.state();
- }
- return false;
- }
- });
- return result;
- };
-
- me.bind = function (options) {
-
- return this.each(function (i,e) {
- var img, map, usemap, md;
-
- // save ref to this image even if we can't access it yet. commands will be queued
- img = $(e);
-
- md = m.getMapData(e);
-
- // if already bound completely, do a total rebind
-
- if (md) {
- me.unbind.apply(img);
- if (!md.complete) {
- // will be queued
- img.bind();
- return true;
- }
- md = null;
- }
-
- // ensure it's a valid image
- // jQuery bug with Opera, results in full-url#usemap being returned from jQuery's attr.
- // So use raw getAttribute instead.
-
- usemap = this.getAttribute('usemap');
- map = usemap && $('map[name="' + usemap.substr(1) + '"]');
- if (!(img.is('img') && usemap && map.size() > 0)) {
- return true;
- }
-
- // sorry - your image must have border:0, things are too unpredictable otherwise.
- img.css('border', 0);
-
- if (!md) {
- md = new m.MapData(this, options);
-
- md.index = addMap(md);
- md.map = map;
- md.bindImages().then(function() {
- md.initialize();
- });
- }
- });
- };
-
- me.init = function (useCanvas) {
- var style, shapes;
-
- // for testing/debugging, use of canvas can be forced by initializing
- // manually with "true" or "false". But generally we test for it.
-
- m.hasCanvas = function() {
- if (!u.isBool(m.hasCanvas.value)) {
- m.hasCanvas.value = u.isBool(useCanvas) ?
- useCanvas :
- hasCanvas();
- }
- return m.hasCanvas.value;
- };
- m.hasVml = function() {
- if (!u.isBool(m.hasVml.value)) {
- // initialize VML the first time we detect its presence.
- var d = namespaces();
-
- if (d && !d.v) {
- d.add("v", "urn:schemas-microsoft-com:vml");
- style = document.createStyleSheet();
- shapes = ['shape', 'rect', 'oval', 'circ', 'fill', 'stroke', 'imagedata', 'group', 'textbox'];
- $.each(shapes,
- function (i, el) {
- style.addRule('v\\:' + el, "behavior: url(#default#VML); antialias:true");
- });
- }
- m.hasVml.value = hasVml();
- }
-
- return m.hasVml.value;
- };
-
- m.isTouch = !!document.documentElement.ontouchstart;
-
- $.extend(m.defaults, m.render_defaults,m.shared_defaults);
- $.extend(m.area_defaults, m.render_defaults,m.shared_defaults);
-
- };
- me.test = function (obj) {
- return eval(obj);
- };
- return me;
- } ());
-
- $.mapster.impl.init();
-
-
-} (jQuery));
-/* graphics.js
- Graphics object handles all rendering.
-*/
-(function ($) {
- var p, m=$.mapster,
- u=m.utils,
- canvasMethods,
- vmlMethods;
-
- /**
- * Implemenation to add each area in an AreaData object to the canvas
- * @param {Graphics} graphics The target graphics object
- * @param {AreaData} areaData The AreaData object (a collection of area elements and metadata)
- * @param {object} options Rendering options to apply when rendering this group of areas
- */
- function addShapeGroupImpl(graphics, areaData, options) {
- var me = graphics,
- md = me.map_data,
- isMask = options.isMask;
-
- // first get area options. Then override fade for selecting, and finally merge in the
- // "select" effect options.
-
- $.each(areaData.areas(), function (i,e) {
- options.isMask = isMask || (e.nohref && md.options.noHrefIsMask);
- me.addShape(e, options);
- });
-
- // it's faster just to manipulate the passed options isMask property and restore it, than to
- // copy the object each time
-
- options.isMask=isMask;
-
- }
-
- /**
- * Convert a hex value to decimal
- * @param {string} hex A hexadecimal toString
- * @return {int} Integer represenation of the hex string
- */
-
- function hex_to_decimal(hex) {
- return Math.max(0, Math.min(parseInt(hex, 16), 255));
- }
- function css3color(color, opacity) {
- return 'rgba(' + hex_to_decimal(color.substr(0, 2)) + ','
- + hex_to_decimal(color.substr(2, 2)) + ','
- + hex_to_decimal(color.substr(4, 2)) + ',' + opacity + ')';
- }
- /**
- * An object associated with a particular map_data instance to manage renderin.
- * @param {MapData} map_data The MapData object bound to this instance
- */
-
- m.Graphics = function (map_data) {
- //$(window).unload($.mapster.unload);
- // create graphics functions for canvas and vml browsers. usage:
- // 1) init with map_data, 2) call begin with canvas to be used (these are separate b/c may not require canvas to be specified
- // 3) call add_shape_to for each shape or mask, 4) call render() to finish
-
- var me = this;
- me.active = false;
- me.canvas = null;
- me.width = 0;
- me.height = 0;
- me.shapes = [];
- me.masks = [];
- me.map_data = map_data;
- };
-
- p = m.Graphics.prototype= {
- constructor: m.Graphics,
-
- /**
- * Initiate a graphics request for a canvas
- * @param {Element} canvas The canvas element that is the target of this operation
- * @param {string} [elementName] The name to assign to the element (VML only)
- */
-
- begin: function(canvas, elementName) {
- var c = $(canvas);
-
- this.elementName = elementName;
- this.canvas = canvas;
-
- this.width = c.width();
- this.height = c.height();
- this.shapes = [];
- this.masks = [];
- this.active = true;
-
- },
-
- /**
- * Add an area to be rendered to this canvas.
- * @param {MapArea} mapArea The MapArea object to render
- * @param {object} options An object containing any rendering options that should override the
- * defaults for the area
- */
-
- addShape: function(mapArea, options) {
- var addto = options.isMask ? this.masks : this.shapes;
- addto.push({ mapArea: mapArea, options: options });
- },
-
- /**
- * Create a canvas that is sized and styled for the MapData object
- * @param {MapData} mapData The MapData object that will receive this new canvas
- * @return {Element} A canvas element
- */
-
- createVisibleCanvas: function (mapData) {
- return $(this.createCanvasFor(mapData))
- .addClass('mapster_el')
- .css(m.canvas_style)[0];
- },
-
- /**
- * Add a group of shapes from an AreaData object to the canvas
- *
- * @param {AreaData} areaData An AreaData object (a set of area elements)
- * @param {string} mode The rendering mode, "select" or "highlight". This determines the target
- * canvas and which default options to use.
- * @param {striong} options Rendering options
- */
-
- addShapeGroup: function (areaData, mode,options) {
- // render includeKeys first - because they could be masks
- var me = this,
- list, name, canvas,
- map_data = this.map_data,
- opts = areaData.effectiveRenderOptions(mode);
-
- if (options) {
- $.extend(opts,options);
- }
-
- if (mode === 'select') {
- name = "static_" + areaData.areaId.toString();
- canvas = map_data.base_canvas;
- } else {
- canvas = map_data.overlay_canvas;
- }
-
- me.begin(canvas, name);
-
- if (opts.includeKeys) {
- list = u.split(opts.includeKeys);
- $.each(list, function (i,e) {
- var areaData = map_data.getDataForKey(e.toString());
- addShapeGroupImpl(me,areaData, areaData.effectiveRenderOptions(mode));
- });
- }
-
- addShapeGroupImpl(me,areaData, opts);
- me.render();
- if (opts.fade) {
-
- // fading requires special handling for IE. We must access the fill elements directly. The fader also has to deal with
- // the "opacity" attribute (not css)
-
- u.fader(m.hasCanvas() ?
- canvas :
- $(canvas).find('._fill').not('.mapster_mask'),
- 0,
- m.hasCanvas() ?
- 1 :
- opts.fillOpacity,
- opts.fadeDuration);
-
- }
-
- }
-
- // These prototype methods are implementation dependent
- };
-
- function noop() {}
-
-
- // configure remaining prototype methods for ie or canvas-supporting browser
-
- canvasMethods = {
- renderShape: function (context, mapArea, offset) {
- var i,
- c = mapArea.coords(null,offset);
-
- switch (mapArea.shape) {
- case 'rect':
- context.rect(c[0], c[1], c[2] - c[0], c[3] - c[1]);
- break;
- case 'poly':
- context.moveTo(c[0], c[1]);
-
- for (i = 2; i < mapArea.length; i += 2) {
- context.lineTo(c[i], c[i + 1]);
- }
- context.lineTo(c[0], c[1]);
- break;
- case 'circ':
- case 'circle':
- context.arc(c[0], c[1], c[2], 0, Math.PI * 2, false);
- break;
- }
- },
- addAltImage: function (context, image, mapArea, options) {
- context.beginPath();
-
- this.renderShape(context, mapArea);
- context.closePath();
- context.clip();
-
- context.globalAlpha = options.altImageOpacity || options.fillOpacity;
-
- context.drawImage(image, 0, 0, mapArea.owner.scaleInfo.width, mapArea.owner.scaleInfo.height);
- },
- render: function () {
- // firefox 6.0 context.save() seems to be broken. to work around, we have to draw the contents on one temp canvas,
- // the mask on another, and merge everything. ugh. fixed in 1.2.2. unfortunately this is a lot more code for masks,
- // but no other way around it that i can see.
-
- var maskCanvas, maskContext,
- me = this,
- md = me.map_data,
- hasMasks = me.masks.length,
- shapeCanvas = me.createCanvasFor(md),
- shapeContext = shapeCanvas.getContext('2d'),
- context = me.canvas.getContext('2d');
-
- if (hasMasks) {
- maskCanvas = me.createCanvasFor(md);
- maskContext = maskCanvas.getContext('2d');
- maskContext.clearRect(0, 0, maskCanvas.width, maskCanvas.height);
-
- $.each(me.masks, function (i,e) {
- maskContext.save();
- maskContext.beginPath();
- me.renderShape(maskContext, e.mapArea);
- maskContext.closePath();
- maskContext.clip();
- maskContext.lineWidth = 0;
- maskContext.fillStyle = '#000';
- maskContext.fill();
- maskContext.restore();
- });
-
- }
-
- $.each(me.shapes, function (i,s) {
- shapeContext.save();
- if (s.options.fill) {
- if (s.options.altImageId) {
- me.addAltImage(shapeContext, md.images[s.options.altImageId], s.mapArea, s.options);
- } else {
- shapeContext.beginPath();
- me.renderShape(shapeContext, s.mapArea);
- shapeContext.closePath();
- //shapeContext.clip();
- shapeContext.fillStyle = css3color(s.options.fillColor, s.options.fillOpacity);
- shapeContext.fill();
- }
- }
- shapeContext.restore();
- });
-
-
- // render strokes at end since masks get stroked too
-
- $.each(me.shapes.concat(me.masks), function (i,s) {
- var offset = s.options.strokeWidth === 1 ? 0.5 : 0;
- // offset applies only when stroke width is 1 and stroke would render between pixels.
-
- if (s.options.stroke) {
- shapeContext.save();
- shapeContext.strokeStyle = css3color(s.options.strokeColor, s.options.strokeOpacity);
- shapeContext.lineWidth = s.options.strokeWidth;
-
- shapeContext.beginPath();
-
- me.renderShape(shapeContext, s.mapArea, offset);
- shapeContext.closePath();
- shapeContext.stroke();
- shapeContext.restore();
- }
- });
-
- if (hasMasks) {
- // render the new shapes against the mask
-
- maskContext.globalCompositeOperation = "source-out";
- maskContext.drawImage(shapeCanvas, 0, 0);
-
- // flatten into the main canvas
- context.drawImage(maskCanvas, 0, 0);
- } else {
- context.drawImage(shapeCanvas, 0, 0);
- }
-
- me.active = false;
- return me.canvas;
- },
-
- // create a canvas mimicing dimensions of an existing element
- createCanvasFor: function (md) {
- return $('<canvas width="' + md.scaleInfo.width + '" height="' +md.scaleInfo.height + '"></canvas>')[0];
- },
- clearHighlight: function () {
- var c = this.map_data.overlay_canvas;
- c.getContext('2d').clearRect(0, 0, c.width, c.height);
- },
- // Draw all items from selected_list to a new canvas, then swap with the old one. This is used to delete items when using canvases.
- refreshSelections: function () {
- var canvas_temp, map_data = this.map_data;
- // draw new base canvas, then swap with the old one to avoid flickering
- canvas_temp = map_data.base_canvas;
-
- map_data.base_canvas = this.createVisibleCanvas(map_data);
- $(map_data.base_canvas).hide();
- $(canvas_temp).before(map_data.base_canvas);
-
- map_data.redrawSelections();
-
- $(map_data.base_canvas).show();
- $(canvas_temp).remove();
- }
- };
-
- vmlMethods = {
-
- renderShape: function (mapArea, options, cssclass) {
- var me = this, fill,stroke, e, t_fill, el_name, el_class, template, c = mapArea.coords();
- el_name = me.elementName ? 'name="' + me.elementName + '" ' : '';
- el_class = cssclass ? 'class="' + cssclass + '" ' : '';
-
- t_fill = '<v:fill color="#' + options.fillColor + '" class="_fill" opacity="' +
- (options.fill ?
- options.fillOpacity :
- 0) +
- '" /><v:stroke class="_fill" opacity="' +
- options.strokeOpacity + '"/>';
-
-
- stroke = options.stroke ?
- ' strokeweight=' + options.strokeWidth + ' stroked="t" strokecolor="#' +
- options.strokeColor + '"' :
- ' stroked="f"';
-
- fill = options.fill ?
- ' filled="t"' :
- ' filled="f"';
-
- switch (mapArea.shape) {
- case 'rect':
- template = '<v:rect ' + el_class + el_name + fill + stroke +
- ' style="zoom:1;margin:0;padding:0;display:block;position:absolute;left:' +
- c[0] + 'px;top:' + c[1] + 'px;width:' + (c[2] - c[0]) +
- 'px;height:' + (c[3] - c[1]) + 'px;">' + t_fill + '</v:rect>';
- break;
- case 'poly':
- template = '<v:shape ' + el_class + el_name + fill + stroke + ' coordorigin="0,0" coordsize="' + me.width + ',' + me.height
- + '" path="m ' + c[0] + ',' + c[1] + ' l ' + c.slice(2).join(',')
- + ' x e" style="zoom:1;margin:0;padding:0;display:block;position:absolute;top:0px;left:0px;width:' + me.width + 'px;height:' + me.height + 'px;">' + t_fill + '</v:shape>';
- break;
- case 'circ':
- case 'circle':
- template = '<v:oval ' + el_class + el_name + fill + stroke
- + ' style="zoom:1;margin:0;padding:0;display:block;position:absolute;left:' + (c[0] - c[2]) + 'px;top:' + (c[1] - c[2])
- + 'px;width:' + (c[2] * 2) + 'px;height:' + (c[2] * 2) + 'px;">' + t_fill + '</v:oval>';
- break;
- }
- e = $(template);
- $(me.canvas).append(e);
-
- return e;
- },
- render: function () {
- var opts, me = this;
-
- $.each(this.shapes, function (i,e) {
- me.renderShape(e.mapArea, e.options);
- });
-
- if (this.masks.length) {
- $.each(this.masks, function (i,e) {
- opts = u.updateProps({},
- e.options, {
- fillOpacity: 1,
- fillColor: e.options.fillColorMask
- });
- me.renderShape(e.mapArea, opts, 'mapster_mask');
- });
- }
-
- this.active = false;
- return this.canvas;
- },
-
- createCanvasFor: function (md) {
- var w = md.scaleInfo.width,
- h = md.scaleInfo.height;
- return $('<var width="' + w + '" height="' + h
- + '" style="zoom:1;overflow:hidden;display:block;width:'
- + w + 'px;height:' + h + 'px;"></var>')[0];
- },
-
- clearHighlight: function () {
- $(this.map_data.overlay_canvas).children().remove();
- },
- // remove single or all selections
- removeSelections: function (area_id) {
- if (area_id >= 0) {
- $(this.map_data.base_canvas).find('[name="static_' + area_id.toString() + '"]').remove();
- }
- else {
- $(this.map_data.base_canvas).children().remove();
- }
- }
-
- };
-
- // for all methods with two implemenatations, add a function that will automatically replace itself with the correct
- // method on first invocation
-
- $.each(['renderShape',
- 'addAltImage',
- 'render',
- 'createCanvasFor',
- 'clearHighlight',
- 'removeSelections',
- 'refreshSelections'],
- function(i,e) {
- p[e]=(function(method) {
- return function() {
- p[method] = (m.hasCanvas() ?
- canvasMethods[method] :
- vmlMethods[method]) || noop;
-
- return p[method].apply(this,arguments);
- };
- }(e));
- });
-
-
-} (jQuery));
-/* mapimage.js
- the MapImage object, repesents an instance of a single bound imagemap
-*/
-
-(function ($) {
-
- var m = $.mapster,
- u = m.utils,
- ap=[];
- /**
- * An object encapsulating all the images used by a MapData.
- */
-
- m.MapImages = function(owner) {
- this.owner = owner;
- this.clear();
- };
-
-
- m.MapImages.prototype = {
- constructor: m.MapImages,
-
- /* interface to make this array-like */
-
- slice: function() {
- return ap.slice.apply(this,arguments);
- },
- splice: function() {
- ap.slice.apply(this.status,arguments);
- var result= ap.slice.apply(this,arguments);
- return result;
- },
-
- /**
- * a boolean value indicates whether all images are done loading
- * @return {bool} true when all are done
- */
- complete: function() {
- return $.inArray(false, this.status) < 0;
- },
-
- /**
- * Save an image in the images array and return its index
- * @param {Image} image An Image object
- * @return {int} the index of the image
- */
-
- _add: function(image) {
- var index = ap.push.call(this,image)-1;
- this.status[index] = false;
- return index;
- },
-
- /**
- * Return the index of an Image within the images array
- * @param {Image} img An Image
- * @return {int} the index within the array, or -1 if it was not found
- */
-
- indexOf: function(image) {
- return $.inArray(image, this);
- },
-
- /**
- * Clear this object and reset it to its initial state after binding.
- */
-
- clear: function() {
- var me=this;
-
- if (me.ids && me.ids.length>0) {
- $.each(me.ids,function(i,e) {
- delete me[e];
- });
- }
-
- /**
- * A list of the cross-reference IDs bound to this object
- * @type {string[]}
- */
-
- me.ids=[];
-
- /**
- * Length property for array-like behavior, set to zero when initializing. Array prototype
- * methods will update it after that.
- *
- * @type {int}
- */
-
- me.length=0;
-
- /**
- * the loaded status of the corresponding image
- * @type {boolean[]}
- */
-
- me.status=[];
-
-
- // actually erase the images
-
- me.splice(0);
-
- },
-
- /**
- * Bind an image to the map and add it to the queue to be loaded; return an ID that
- * can be used to reference the
- *
- * @param {Image|string} image An Image object or a URL to an image
- * @param {string} [id] An id to refer to this image
- * @returns {int} an ID referencing the index of the image object in
- * map_data.images
- */
-
- add: function(image,id) {
- var index,src,me = this;
-
- if (!image) { return; }
-
- if (typeof image === 'string') {
- src = image;
- image = me[src];
- if (typeof image==='object') {
- return me.indexOf(image);
- }
-
- image = $('<img />')
- .addClass('mapster_el')
- .hide();
-
- index=me._add(image[0]);
-
- image
- .bind('load',function(e) {
- me.imageLoaded.call(me,e);
- })
- .bind('error',function(e) {
- me.imageLoadError.call(me,e);
- });
-
- image.attr('src', src);
- } else {
-
- // use attr because we want the actual source, not the resolved path the browser will return directly calling image.src
-
- index=me._add($(image)[0]);
- }
- if (id) {
- if (this[id]) {
- throw(id+" is already used or is not available as an altImage alias.");
- }
- me.ids.push(id);
- me[id]=me[index];
- }
- return index;
- },
-
- /**
- * Bind the images in this object,
- * @param {boolean} retry when true, indicates that the function is calling itself after failure
- * @return {Promise} a promise that resolves when the images have finished loading
- */
-
- bind: function(retry) {
- var me = this,
- promise,
- triesLeft = me.owner.options.configTimeout / 200,
-
- /* A recursive function to continue checking that the images have been
- loaded until a timeout has elapsed */
-
- check=function() {
- var i;
-
- // refresh status of images
-
- i=me.length;
-
- while (i-->0) {
- if (!me.isLoaded(i)) {
- break;
- }
- }
-
- // check to see if every image has already been loaded
-
- if (me.complete()) {
- me.resolve();
- } else {
- // to account for failure of onLoad to fire in rare situations
- if (triesLeft-- > 0) {
- me.imgTimeout=window.setTimeout(function() {
- check.call(me,true);
- }, 50);
- } else {
- me.imageLoadError.call(me);
- }
- }
-
- };
-
- promise = me.deferred=u.defer();
-
- check();
- return promise;
- },
-
- resolve: function() {
- var me=this,
- resolver=me.deferred;
-
- if (resolver) {
- // Make a copy of the resolver before calling & removing it to ensure
- // it is not called twice
- me.deferred=null;
- resolver.resolve();
- }
- },
-
- /**
- * Event handler for image onload
- * @param {object} e jQuery event data
- */
-
- imageLoaded: function(e) {
- var me=this,
- index = me.indexOf(e.target);
-
- if (index>=0) {
-
- me.status[index] = true;
- if ($.inArray(false, me.status) < 0) {
- me.resolve();
- }
- }
- },
-
- /**
- * Event handler for onload error
- * @param {object} e jQuery event data
- */
-
- imageLoadError: function(e) {
- clearTimeout(this.imgTimeout);
- this.triesLeft=0;
- var err = e ? 'The image ' + e.target.src + ' failed to load.' :
- 'The images never seemed to finish loading. You may just need to increase the configTimeout if images could take a long time to load.';
- throw err;
- },
- /**
- * Test if the image at specificed index has finished loading
- * @param {int} index The image index
- * @return {boolean} true if loaded, false if not
- */
-
- isLoaded: function(index) {
- var img,
- me=this,
- status=me.status;
-
- if (status[index]) { return true; }
- img = me[index];
-
- if (typeof img.complete !== 'undefined') {
- status[index]=img.complete;
- } else {
- status[index]=!!u.imgWidth(img);
- }
- // if complete passes, the image is loaded, but may STILL not be available because of stuff like adblock.
- // make sure it is.
-
- return status[index];
- }
- };
- } (jQuery));
-/* mapdata.js
- the MapData object, repesents an instance of a single bound imagemap
-*/
-
-
-(function ($) {
-
- var m = $.mapster,
- u = m.utils;
-
- /**
- * Set default values for MapData object properties
- * @param {MapData} me The MapData object
- */
-
- function initializeDefaults(me) {
- $.extend(me,{
- complete: false, // (bool) when configuration is complete
- map: null, // ($) the image map
- base_canvas: null, // (canvas|var) where selections are rendered
- overlay_canvas: null, // (canvas|var) where highlights are rendered
- commands: [], // {} commands that were run before configuration was completed (b/c images weren't loaded)
- data: [], // MapData[] area groups
- mapAreas: [], // MapArea[] list. AreaData entities contain refs to this array, so options are stored with each.
- _xref: {}, // (int) xref of mapKeys to data[]
- highlightId: -1, // (int) the currently highlighted element.
- currentAreaId: -1,
- _tooltip_events: [], // {} info on events we bound to a tooltip container, so we can properly unbind them
- scaleInfo: null, // {} info about the image size, scaling, defaults
- index: -1, // index of this in map_cache - so we have an ID to use for wraper div
- activeAreaEvent: null
- });
- }
-
- /**
- * Return an array of all image-containing options from an options object;
- * that is, containers that may have an "altImage" property
- *
- * @param {object} obj An options object
- * @return {object[]} An array of objects
- */
- function getOptionImages(obj) {
- return [obj, obj.render_highlight, obj.render_select];
- }
-
- /**
- * Parse all the altImage references, adding them to the library so they can be preloaded
- * and aliased.
- *
- * @param {MapData} me The MapData object on which to operate
- */
- function configureAltImages(me)
- {
- var opts = me.options,
- mi = me.images;
-
- // add alt images
-
- if (m.hasCanvas()) {
- // map altImage library first
-
- $.each(opts.altImages || {}, function(i,e) {
- mi.add(e,i);
- });
-
- // now find everything else
-
- $.each([opts].concat(opts.areas),function(i,e) {
- $.each(getOptionImages(e),function(i2,e2) {
- if (e2 && e2.altImage) {
- e2.altImageId=mi.add(e2.altImage);
- }
- });
- });
- }
-
- // set area_options
- me.area_options = u.updateProps({}, // default options for any MapArea
- m.area_defaults,
- opts);
- }
-
- /**
- * Queue a mouse move action based on current delay settings
- * (helper for mouseover/mouseout handlers)
- *
- * @param {MapData} me The MapData context
- * @param {number} delay The number of milliseconds to delay the action
- * @param {AreaData} area AreaData affected
- * @param {Deferred} deferred A deferred object to return (instead of a new one)
- * @return {Promise} A promise that resolves when the action is completed
- */
- function queueMouseEvent(me,delay,area, deferred) {
-
- deferred = deferred || u.when.defer();
-
- function cbFinal(areaId) {
- if (me.currentAreaId!==areaId && me.highlightId>=0) {
- deferred.resolve();
- }
- }
- if (me.activeAreaEvent) {
- window.clearTimeout(me.activeAreaEvent);
- me.activeAreaEvent=0;
- }
- if (delay<0) {
- return;
- }
-
- if (area.owner.currentAction || delay) {
- me.activeAreaEvent = window.setTimeout((function() {
- return function() {
- queueMouseEvent(me,0,area,deferred);
- };
- }(area)),
- delay || 100);
- } else {
- cbFinal(area.areaId);
- }
- return deferred;
- }
-
- /**
- * Mousedown event. This is captured only to prevent browser from drawing an outline around an
- * area when it's clicked.
- *
- * @param {EventData} e jQuery event data
- */
-
- function mousedown(e) {
- if (!m.hasCanvas()) {
- this.blur();
- }
- e.preventDefault();
- }
-
- /**
- * Mouseover event. Handle highlight rendering and client callback on mouseover
- *
- * @param {MapData} me The MapData context
- * @param {EventData} e jQuery event data
- * @return {[type]} [description]
- */
-
- function mouseover(me,e) {
- var arData = me.getAllDataForArea(this),
- ar=arData.length ? arData[0] : null;
-
- // mouseover events are ignored entirely while resizing, though we do care about mouseout events
- // and must queue the action to keep things clean.
-
- if (!ar || ar.isNotRendered() || ar.owner.currentAction) {
- return;
- }
-
- if (me.currentAreaId === ar.areaId) {
- return;
- }
- if (me.highlightId !== ar.areaId) {
- me.clearEffects();
-
- ar.highlight();
-
- if (me.options.showToolTip) {
- $.each(arData,function(i,e) {
- if (e.effectiveOptions().toolTip) {
- e.showToolTip();
- }
- });
- }
- }
-
- me.currentAreaId = ar.areaId;
-
- if ($.isFunction(me.options.onMouseover)) {
- me.options.onMouseover.call(this,
- {
- e: e,
- options:ar.effectiveOptions(),
- key: ar.key,
- selected: ar.isSelected()
- });
- }
- }
-
- /**
- * Mouseout event.
- *
- * @param {MapData} me The MapData context
- * @param {EventData} e jQuery event data
- * @return {[type]} [description]
- */
-
- function mouseout(me,e) {
- var newArea,
- ar = me.getDataForArea(this),
- opts = me.options;
-
-
- if (me.currentAreaId<0 || !ar) {
- return;
- }
-
- newArea=me.getDataForArea(e.relatedTarget);
-
- if (newArea === ar) {
- return;
- }
-
- me.currentAreaId = -1;
- ar.area=null;
-
- queueMouseEvent(me,opts.mouseoutDelay,ar)
- .then(me.clearEffects);
-
- if ($.isFunction(opts.onMouseout)) {
- opts.onMouseout.call(this,
- {
- e: e,
- options: opts,
- key: ar.key,
- selected: ar.isSelected()
- });
- }
-
- }
-
- /**
- * Clear any active tooltip or highlight
- *
- * @param {MapData} me The MapData context
- * @param {EventData} e jQuery event data
- * @return {[type]} [description]
- */
-
- function clearEffects(me) {
- var opts = me.options;
-
- me.ensureNoHighlight();
-
- if (opts.toolTipClose
- && $.inArray('area-mouseout', opts.toolTipClose) >= 0
- && me.activeToolTip)
- {
- me.clearToolTip();
- }
- }
-
- /**
- * Mouse click event handler
- *
- * @param {MapData} me The MapData context
- * @param {EventData} e jQuery event data
- * @return {[type]} [description]
- */
-
- function click(me,e) {
- var selected, list, list_target, newSelectionState, canChangeState, cbResult,
- that = this,
- ar = me.getDataForArea(this),
- opts = me.options;
-
- function clickArea(ar) {
- var areaOpts,target;
- canChangeState = (ar.isSelectable() &&
- (ar.isDeselectable() || !ar.isSelected()));
-
- if (canChangeState) {
- newSelectionState = !ar.isSelected();
- } else {
- newSelectionState = ar.isSelected();
- }
-
- list_target = m.getBoundList(opts, ar.key);
-
- if ($.isFunction(opts.onClick))
- {
- cbResult= opts.onClick.call(that,
- {
- e: e,
- listTarget: list_target,
- key: ar.key,
- selected: newSelectionState
- });
-
- if (u.isBool(cbResult)) {
- if (!cbResult) {
- return false;
- }
- target = $(ar.area).attr('href');
- if (target!=='#') {
- window.location.href=target;
- return false;
- }
- }
- }
-
- if (canChangeState) {
- selected = ar.toggle();
- }
-
- if (opts.boundList && opts.boundList.length > 0) {
- m.setBoundListProperties(opts, list_target, ar.isSelected());
- }
-
- areaOpts = ar.effectiveOptions();
- if (areaOpts.includeKeys) {
- list = u.split(areaOpts.includeKeys);
- $.each(list, function (i, e) {
- var ar = me.getDataForKey(e.toString());
- if (!ar.options.isMask) {
- clickArea(ar);
- }
- });
- }
- }
-
- mousedown.call(this,e);
-
- if (opts.clickNavigate && ar.href) {
- window.location.href=ar.href;
- return;
- }
-
- if (ar && !ar.owner.currentAction) {
- opts = me.options;
- clickArea(ar);
- }
- }
-
- /**
- * Prototype for a MapData object, representing an ImageMapster bound object
- * @param {Element} image an IMG element
- * @param {object} options ImageMapster binding options
- */
- m.MapData = function (image, options)
- {
- var me = this;
-
- // (Image) main map image
-
- me.image = image;
-
- me.images = new m.MapImages(me);
- me.graphics = new m.Graphics(me);
-
- // save the initial style of the image for unbinding. This is problematic, chrome
- // duplicates styles when assigning, and cssText is apparently not universally supported.
- // Need to do something more robust to make unbinding work universally.
-
- me.imgCssText = image.style.cssText || null;
-
- initializeDefaults(me);
-
- me.configureOptions(options);
-
- // create context-bound event handlers from our private functions
-
- me.mouseover = function(e) { mouseover.call(this,me,e); };
- me.mouseout = function(e) { mouseout.call(this,me,e); };
- me.click = function(e) { click.call(this,me,e); };
- me.clearEffects = function(e) { clearEffects.call(this,me,e); };
- };
-
- m.MapData.prototype = {
- constructor: m.MapData,
-
- /**
- * Set target.options from defaults + options
- * @param {[type]} target The target
- * @param {[type]} options The options to merge
- */
-
- configureOptions: function(options) {
- this.options= u.updateProps({}, m.defaults, options);
- },
-
- /**
- * Ensure all images are loaded
- * @return {Promise} A promise that resolves when the images have finished loading (or fail)
- */
-
- bindImages: function() {
- var me=this,
- mi = me.images;
-
- // reset the images if this is a rebind
-
- if (mi.length>2) {
- mi.splice(2);
- } else if (mi.length===0) {
-
- // add the actual main image
- mi.add(me.image);
- // will create a duplicate of the main image, we need this to get raw size info
- mi.add(me.image.src);
- }
-
- configureAltImages(me);
-
- return me.images.bind();
- },
-
- /**
-
- * Test whether an async action is currently in progress
- * @return {Boolean} true or false indicating state
- */
-
- isActive: function() {
- return !this.complete || this.currentAction;
- },
-
- /**
- * Return an object indicating the various states. This isn't really used by
- * production code.
- *
- * @return {object} An object with properties for various states
- */
-
- state: function () {
- return {
- complete: this.complete,
- resizing: this.currentAction==='resizing',
- zoomed: this.zoomed,
- zoomedArea: this.zoomedArea,
- scaleInfo: this.scaleInfo
- };
- },
-
- /**
- * Get a unique ID for the wrapper of this imagemapster
- * @return {string} A string that is unique to this image
- */
-
- wrapId: function () {
- return 'mapster_wrap_' + this.index;
- },
- _idFromKey: function (key) {
- return typeof key === "string" && this._xref.hasOwnProperty(key) ?
- this._xref[key] : -1;
- },
-
- /**
- * Return a comma-separated string of all selected keys
- * @return {string} CSV of all keys that are currently selected
- */
-
- getSelected: function () {
- var result = '';
- $.each(this.data, function (i,e) {
- if (e.isSelected()) {
- result += (result ? ',' : '') + this.key;
- }
- });
- return result;
- },
-
- /**
- * Get an array of MapAreas associated with a specific AREA based on the keys for that area
- * @param {Element} area An HTML AREA
- * @param {number} atMost A number limiting the number of areas to be returned (typically 1 or 0 for no limit)
- * @return {MapArea[]} Array of MapArea objects
- */
-
- getAllDataForArea:function (area,atMost) {
- var i,ar, result,
- me=this,
- key = $(area).filter('area').attr(me.options.mapKey);
-
- if (key) {
- result=[];
- key = u.split(key);
-
- for (i=0;i<(atMost || key.length);i++) {
- ar = me.data[me._idFromKey(key[i])];
- ar.area=area.length ? area[0]:area;
- // set the actual area moused over/selected
- // TODO: this is a brittle model for capturing which specific area - if this method was not used,
- // ar.area could have old data. fix this.
- result.push(ar);
- }
- }
-
- return result;
- },
- getDataForArea: function(area) {
- var ar=this.getAllDataForArea(area,1);
- return ar ? ar[0] || null : null;
- },
- getDataForKey: function (key) {
- return this.data[this._idFromKey(key)];
- },
-
- /**
- * Get the primary keys associated with an area group.
- * If this is a primary key, it will be returned.
- *
- * @param {string key An area key
- * @return {string} A CSV of area keys
- */
-
- getKeysForGroup: function(key) {
- var ar=this.getDataForKey(key);
-
- return !ar ? '':
- ar.isPrimary ?
- ar.key :
- this.getPrimaryKeysForMapAreas(ar.areas()).join(',');
- },
-
- /**
- * given an array of MapArea object, return an array of its unique primary keys
- * @param {MapArea[]} areas The areas to analyze
- * @return {string[]} An array of unique primary keys
- */
-
- getPrimaryKeysForMapAreas: function(areas)
- {
- var keys=[];
- $.each(areas,function(i,e) {
- if ($.inArray(e.keys[0],keys)<0) {
- keys.push(e.keys[0]);
- }
- });
- return keys;
- },
- getData: function (obj) {
- if (typeof obj === 'string') {
- return this.getDataForKey(obj);
- } else if (obj && obj.mapster || u.isElement(obj)) {
- return this.getDataForArea(obj);
- } else {
- return null;
- }
- },
- // remove highlight if present, raise event
- ensureNoHighlight: function () {
- var ar;
- if (this.highlightId >= 0) {
- this.graphics.clearHighlight();
- ar = this.data[this.highlightId];
- ar.changeState('highlight', false);
- this.setHighlightId(-1);
- }
- },
- setHighlightId: function(id) {
- this.highlightId = id;
- },
-
- /**
- * Clear all active selections on this map
- */
-
- clearSelections: function () {
- $.each(this.data, function (i,e) {
- if (e.selected) {
- e.deselect(true);
- }
- });
- this.removeSelectionFinish();
-
- },
-
- /**
- * Set area options from an array of option data.
- *
- * @param {object[]} areas An array of objects containing area-specific options
- */
-
- setAreaOptions: function (areas) {
- var i, area_options, ar;
- areas = areas || [];
-
- // refer by: map_data.options[map_data.data[x].area_option_id]
-
- for (i = areas.length - 1; i >= 0; i--) {
- area_options = areas[i];
- if (area_options) {
- ar = this.getDataForKey(area_options.key);
- if (ar) {
- u.updateProps(ar.options, area_options);
-
- // TODO: will not deselect areas that were previously selected, so this only works
- // for an initial bind.
-
- if (u.isBool(area_options.selected)) {
- ar.selected = area_options.selected;
- }
- }
- }
- }
- },
- // keys: a comma-separated list
- drawSelections: function (keys) {
- var i, key_arr = u.asArray(keys);
-
- for (i = key_arr.length - 1; i >= 0; i--) {
- this.data[key_arr[i]].drawSelection();
- }
- },
- redrawSelections: function () {
- $.each(this.data, function (i, e) {
- if (e.isSelectedOrStatic()) {
- e.drawSelection();
- }
- });
-
- },
- ///called when images are done loading
- initialize: function () {
- var imgCopy, base_canvas, overlay_canvas, wrap, parentId, css, i,size,
- img,sort_func, sorted_list, scale,
- me = this,
- opts = me.options;
-
- if (me.complete) {
- return;
- }
-
- img = $(me.image);
-
- parentId = img.parent().attr('id');
-
- // create a div wrapper only if there's not already a wrapper, otherwise, own it
-
- if (parentId && parentId.length >= 12 && parentId.substring(0, 12) === "mapster_wrap") {
- wrap = img.parent();
- wrap.attr('id', me.wrapId());
- } else {
- wrap = $('<div id="' + me.wrapId() + '"></div>');
-
- if (opts.wrapClass) {
- if (opts.wrapClass === true) {
- wrap.addClass(img[0].className);
- }
- else {
- wrap.addClass(opts.wrapClass);
- }
- }
- }
- me.wrapper = wrap;
-
- // me.images[1] is the copy of the original image. It should be loaded & at its native size now so we can obtain the true
- // width & height. This is needed to scale the imagemap if not being shown at its native size. It is also needed purely
- // to finish binding in case the original image was not visible. It can be impossible in some browsers to obtain the
- // native size of a hidden image.
-
- me.scaleInfo = scale = u.scaleMap(me.images[0],me.images[1], opts.scaleMap);
-
- me.base_canvas = base_canvas = me.graphics.createVisibleCanvas(me);
- me.overlay_canvas = overlay_canvas = me.graphics.createVisibleCanvas(me);
-
- // Now we got what we needed from the copy -clone from the original image again to make sure any other attributes are copied
- imgCopy = $(me.images[1])
- .addClass('mapster_el '+ me.images[0].className)
- .attr({id:null, usemap: null});
-
- size=u.size(me.images[0]);
-
- if (size.complete) {
- imgCopy.css({
- width: size.width,
- height: size.height
- });
- }
-
- me.buildDataset();
-
- // now that we have processed all the areas, set css for wrapper, scale map if needed
-
- css = {
- display: 'block',
- position: 'relative',
- padding: 0,
- width: scale.width,
- height: scale.height
- };
-
- if (opts.wrapCss) {
- $.extend(css, opts.wrapCss);
- }
- // if we were rebinding with an existing wrapper, the image will aready be in it
- if (img.parent()[0] !== me.wrapper[0]) {
-
- img.before(me.wrapper);
- }
-
- wrap.css(css);
-
- // move all generated images into the wrapper for easy removal later
-
- $(me.images.slice(2)).hide();
- for (i = 1; i < me.images.length; i++) {
- wrap.append(me.images[i]);
- }
-
- //me.images[1].style.cssText = me.image.style.cssText;
-
- wrap.append(base_canvas)
- .append(overlay_canvas)
- .append(img.css(m.canvas_style));
-
- // images[0] is the original image with map, images[1] is the copy/background that is visible
-
- u.setOpacity(me.images[0], 0);
- $(me.images[1]).show();
-
- u.setOpacity(me.images[1],1);
-
- if (opts.isSelectable && opts.onGetList) {
- sorted_list = me.data.slice(0);
- if (opts.sortList) {
- if (opts.sortList === "desc") {
- sort_func = function (a, b) {
- return a === b ? 0 : (a > b ? -1 : 1);
- };
- }
- else {
- sort_func = function (a, b) {
- return a === b ? 0 : (a < b ? -1 : 1);
- };
- }
-
- sorted_list.sort(function (a, b) {
- a = a.value;
- b = b.value;
- return sort_func(a, b);
- });
- }
-
- me.options.boundList = opts.onGetList.call(me.image, sorted_list);
- }
-
- me.complete=true;
- me.processCommandQueue();
-
- if (opts.onConfigured && typeof opts.onConfigured === 'function') {
- opts.onConfigured.call(img, true);
- }
- },
-
- // when rebind is true, the MapArea data will not be rebuilt.
- buildDataset: function(rebind) {
- var sel,areas,j,area_id,$area,area,curKey,mapArea,key,keys,mapAreaId,group_value,dataItem,href,
- me=this,
- opts=me.options,
- default_group;
-
- function addAreaData(key, value) {
- var dataItem = new m.AreaData(me, key, value);
- dataItem.areaId = me._xref[key] = me.data.push(dataItem) - 1;
- return dataItem.areaId;
- }
-
- me._xref = {};
- me.data = [];
- if (!rebind) {
- me.mapAreas=[];
- }
-
- default_group = !opts.mapKey;
- if (default_group) {
- opts.mapKey = 'data-mapster-key';
- }
-
- // the [attribute] selector is broken on old IE with jQuery. hasVml() is a quick and dirty
- // way to test for that
-
- sel = m.hasVml() ? 'area' :
- (default_group ?
- 'area[coords]' :
- 'area[' + opts.mapKey + ']');
-
- areas = $(me.map).find(sel).unbind('.mapster');
-
- for (mapAreaId = 0;mapAreaId<areas.length; mapAreaId++) {
- area_id = 0;
- area = areas[mapAreaId];
- $area = $(area);
-
- // skip areas with no coords - selector broken for older ie
- if (!area.coords) {
- continue;
- }
- // Create a key if none was assigned by the user
-
- if (default_group) {
- curKey=String(mapAreaId);
- $area.attr('data-mapster-key', curKey);
-
-
- } else {
- curKey = area.getAttribute(opts.mapKey);
- }
-
- // conditions for which the area will be bound to mouse events
- // only bind to areas that don't have nohref. ie 6&7 cannot detect the presence of nohref, so we have to also not bind if href is missing.
-
- if (rebind) {
- mapArea = me.mapAreas[$area.data('mapster')-1];
- mapArea.configure(curKey);
- } else {
- mapArea = new m.MapArea(me, area,curKey);
- me.mapAreas.push(mapArea);
- }
-
- keys = mapArea.keys; // converted to an array by mapArea
-
-
- // Iterate through each mapKey assigned to this area
- for (j = keys.length - 1; j >= 0; j--) {
- key = keys[j];
-
- if (opts.mapValue) {
- group_value = $area.attr(opts.mapValue);
- }
- if (default_group) {
- // set an attribute so we can refer to the area by index from the DOM object if no key
- area_id = addAreaData(me.data.length, group_value);
- dataItem = me.data[area_id];
- dataItem.key = key = area_id.toString();
- }
- else {
- area_id = me._xref[key];
- if (area_id >= 0) {
- dataItem = me.data[area_id];
- if (group_value && !me.data[area_id].value) {
- dataItem.value = group_value;
- }
- }
- else {
- area_id = addAreaData(key, group_value);
- dataItem = me.data[area_id];
- dataItem.isPrimary=j===0;
- }
- }
- mapArea.areaDataXref.push(area_id);
- dataItem.areasXref.push(mapAreaId);
- }
-
- href=$area.attr('href');
- if (href && href!=='#' && !dataItem.href)
- {
- dataItem.href=href;
- }
-
- if (!mapArea.nohref) {
- $area.bind('click.mapster', me.click);
-
- if (!m.isTouch) {
- $area.bind('mouseover.mapster', me.mouseover)
- .bind('mouseout.mapster', me.mouseout)
- .bind('mousedown.mapster', me.mousedown);
-
- }
-
- }
-
- // store an ID with each area.
- $area.data("mapster", mapAreaId+1);
- }
-
- // TODO listenToList
- // if (opts.listenToList && opts.nitG) {
- // opts.nitG.bind('click.mapster', event_hooks[map_data.hooks_index].listclick_hook);
- // }
-
- // populate areas from config options
- me.setAreaOptions(opts.areas);
- me.redrawSelections();
-
- },
- processCommandQueue: function() {
-
- var cur,me=this;
- while (!me.currentAction && me.commands.length) {
- cur = me.commands[0];
- me.commands.splice(0,1);
- m.impl[cur.command].apply(cur.that, cur.args);
- }
- },
- clearEvents: function () {
- $(this.map).find('area')
- .unbind('.mapster');
- $(this.images)
- .unbind('.mapster');
- },
- _clearCanvases: function (preserveState) {
- // remove the canvas elements created
- if (!preserveState) {
- $(this.base_canvas).remove();
- }
- $(this.overlay_canvas).remove();
- },
- clearMapData: function (preserveState) {
- var me = this;
- this._clearCanvases(preserveState);
-
- // release refs to DOM elements
- $.each(this.data, function (i, e) {
- e.reset();
- });
- this.data = null;
- if (!preserveState) {
- // get rid of everything except the original image
- this.image.style.cssText = this.imgCssText;
- $(this.wrapper).before(this.image).remove();
- }
-
- me.images.clear();
-
- this.image = null;
- u.ifFunction(this.clearTooltip, this);
- },
-
- // Compelete cleanup process for deslecting items. Called after a batch operation, or by AreaData for single
- // operations not flagged as "partial"
-
- removeSelectionFinish: function () {
- var g = this.graphics;
-
- g.refreshSelections();
- // do not call ensure_no_highlight- we don't really want to unhilight it, just remove the effect
- g.clearHighlight();
- }
- };
-} (jQuery));
-/* areadata.js
- AreaData and MapArea protoypes
-*/
-
-(function ($) {
- var m = $.mapster, u = m.utils;
-
- /**
- * Select this area
- *
- * @param {AreaData} me AreaData context
- * @param {object} options Options for rendering the selection
- */
- function select(options) {
- // need to add the new one first so that the double-opacity effect leaves the current one highlighted for singleSelect
-
- var me=this, o = me.owner;
- if (o.options.singleSelect) {
- o.clearSelections();
- }
-
- // because areas can overlap - we can't depend on the selection state to tell us anything about the inner areas.
- // don't check if it's already selected
- if (!me.isSelected()) {
- if (options) {
-
- // cache the current options, and map the altImageId if an altimage
- // was passed
-
- me.optsCache = $.extend(me.effectiveRenderOptions('select'),
- options,
- {
- altImageId: o.images.add(options.altImage)
- });
- }
-
- me.drawSelection();
-
- me.selected = true;
- me.changeState('select', true);
- }
-
- if (o.options.singleSelect) {
- o.graphics.refreshSelections();
- }
- }
-
- /**
- * Deselect this area, optionally deferring finalization so additional areas can be deselected
- * in a single operation
- *
- * @param {boolean} partial when true, the caller must invoke "finishRemoveSelection" to render
- */
-
- function deselect(partial) {
- var me=this;
- me.selected = false;
- me.changeState('select', false);
-
- // release information about last area options when deselecting.
-
- me.optsCache=null;
- me.owner.graphics.removeSelections(me.areaId);
-
- // Complete selection removal process. This is separated because it's very inefficient to perform the whole
- // process for multiple removals, as the canvas must be totally redrawn at the end of the process.ar.remove
-
- if (!partial) {
- me.owner.removeSelectionFinish();
- }
- }
-
- /**
- * Toggle the selection state of this area
- * @param {object} options Rendering options, if toggling on
- * @return {bool} The new selection state
- */
- function toggle(options) {
- var me=this;
- if (!me.isSelected()) {
- me.select(options);
- }
- else {
- me.deselect();
- }
- return me.isSelected();
- }
-
- /**
- * An AreaData object; represents a conceptual area that can be composed of
- * one or more MapArea objects
- *
- * @param {MapData} owner The MapData object to which this belongs
- * @param {string} key The key for this area
- * @param {string} value The mapValue string for this area
- */
-
- m.AreaData = function (owner, key, value) {
- $.extend(this,{
- owner: owner,
- key: key || '',
- // means this represents the first key in a list of keys (it's the area group that gets highlighted on mouseover)
- isPrimary: true,
- areaId: -1,
- href: '',
- value: value || '',
- options:{},
- // "null" means unchanged. Use "isSelected" method to just test true/false
- selected: null,
- // xref to MapArea objects
- areasXref: [],
- // (temporary storage) - the actual area moused over
- area: null,
- // the last options used to render this. Cache so when re-drawing after a remove, changes in options won't
- // break already selected things.
- optsCache: null
- });
- };
-
- /**
- * The public API for AreaData object
- */
-
- m.AreaData.prototype = {
- constuctor: m.AreaData,
- select: select,
- deselect: deselect,
- toggle: toggle,
- areas: function() {
- var i,result=[];
- for (i=0;i<this.areasXref.length;i++) {
- result.push(this.owner.mapAreas[this.areasXref[i]]);
- }
- return result;
- },
- // return all coordinates for all areas
- coords: function(offset) {
- var coords = [];
- $.each(this.areas(), function (i, el) {
- coords = coords.concat(el.coords(offset));
- });
- return coords;
- },
- reset: function () {
- $.each(this.areas(), function (i, e) {
- e.reset();
- });
- this.areasXref = [];
- this.options = null;
- },
- // Return the effective selected state of an area, incorporating staticState
- isSelectedOrStatic: function () {
-
- var o = this.effectiveOptions();
- return u.isBool(o.staticState) ? o.staticState :
- this.isSelected();
- },
- isSelected: function () {
- return u.isBool(this.selected) ? this.selected :
- u.isBool(this.owner.area_options.selected) ? this.owner.area_options.selected : false;
- },
- isSelectable: function () {
- return u.isBool(this.effectiveOptions().staticState) ? false :
- (u.isBool(this.owner.options.staticState) ? false : u.boolOrDefault(this.effectiveOptions().isSelectable,true));
- },
- isDeselectable: function () {
- return u.isBool(this.effectiveOptions().staticState) ? false :
- (u.isBool(this.owner.options.staticState) ? false : u.boolOrDefault(this.effectiveOptions().isDeselectable,true));
- },
- isNotRendered: function() {
- var area = $(this.area);
- return area.attr('nohref') ||
- !area.attr('href') ||
- this.effectiveOptions().isMask;
-
- },
-
-
- /**
- * Return the overall options effective for this area.
- * This should get the default options, and merge in area-specific options, finally
- * overlaying options passed by parameter
- *
- * @param {[type]} options options which will supercede all other options for this area
- * @return {[type]} the combined options
- */
-
- effectiveOptions: function (options) {
-
- var opts = u.updateProps({},
- this.owner.area_options,
- this.options,
- options || {},
- {
- id: this.areaId
- }
- );
-
- opts.selected = this.isSelected();
-
- return opts;
- },
-
- /**
- * Return the options effective for this area for a "render" or "highlight" mode.
- * This should get the default options, merge in the areas-specific options,
- * and then the mode-specific options.
- * @param {string} mode 'render' or 'highlight'
- * @param {[type]} options options which will supercede all other options for this area
- * @return {[type]} the combined options
- */
-
- effectiveRenderOptions: function (mode, options) {
- var allOpts,opts=this.optsCache;
-
- if (!opts || mode==='highlight') {
- allOpts = this.effectiveOptions(options);
- opts = u.updateProps({},
- allOpts,
- allOpts["render_" + mode]
- );
-
- if (mode!=='highlight') {
- this.optsCache=opts;
- }
- }
- return $.extend({},opts);
- },
-
- // Fire callback on area state change
- changeState: function (state_type, state) {
- if ($.isFunction(this.owner.options.onStateChange)) {
- this.owner.options.onStateChange.call(this.owner.image,
- {
- key: this.key,
- state: state_type,
- selected: state
- }
- );
- }
- },
-
- // highlight this area
-
- highlight: function (options) {
- var o = this.owner;
- if (this.effectiveOptions().highlight) {
- o.graphics.addShapeGroup(this, "highlight",options);
- }
- o.setHighlightId(this.areaId);
- this.changeState('highlight', true);
- },
-
- // select this area. if "callEvent" is true then the state change event will be called. (This method can be used
- // during config operations, in which case no event is indicated)
-
- drawSelection: function () {
-
-
- this.owner.graphics.addShapeGroup(this, "select");
-
- }
-
-
- };
- // represents an HTML area
- m.MapArea = function (owner,areaEl,keys) {
- if (!owner) {
- return;
- }
- var me = this;
- me.owner = owner; // a MapData object
- me.area = areaEl;
- me.areaDataXref=[]; // a list of map_data.data[] id's for each areaData object containing this
- me.originalCoords = [];
- $.each(u.split(areaEl.coords), function (i, el) {
- me.originalCoords.push(parseFloat(el));
- });
- me.length = me.originalCoords.length;
- me.shape = areaEl.shape.toLowerCase();
- me.nohref = areaEl.nohref || !areaEl.href;
- me.configure(keys);
- };
- m.MapArea.prototype= {
- constructor: m.MapArea,
- configure: function(keys) {
- this.keys = u.split(keys);
- },
- reset: function() {
- this.area=null;
- },
- coords: function (offset) {
- return $.map(this.originalCoords,function(e) {
- return offset ? e : e+offset;
- });
- }
- };
-} (jQuery));
-/* areacorners.js
- determine the best place to put a box of dimensions (width,height) given a circle, rect or poly
-*/
-
-(function ($) {
- var u=$.mapster.utils;
-
-
- /**
- * Compute positions that will place a target with dimensions [width,height] outside
- * but near the boundaries of the elements "elements". When an imagemap is passed, the
- *
- * @param {Element|Element[]} elements An element or an array of elements (such as a jQuery object)
- * @param {Element} image The image to which area elements are bound, if this is an image map.
- * @param {Element} container The contianer in which the target must be constrained (or document, if missing)
- * @param {int} width The width of the target object
- * @return {object} a structure with the x and y positions
- */
- u.areaCorners = function (elements, image, container, width, height) {
- var pos,found, minX, minY, maxX, maxY, bestMinX, bestMaxX, bestMinY, bestMaxY, curX, curY, nest, j,
- offsetx=0,
- offsety=0,
- rootx,
- rooty,
- iCoords,radius,angle,el,
- coords=[];
-
- // if a single element was passed, map it to an array
-
- elements = elements.length ?
- elements:
- [elements];
-
- container = container ?
- $(container):
- $(document.body);
-
- // get the relative root of calculation
-
- pos = container.offset();
- rootx = pos.left;
- rooty = pos.top;
-
- // with areas, all we know about is relative to the top-left corner of the image. We need to add an offset compared to
- // the actual container. After this calculation, offsetx/offsety can be added to either the area coords, or the target's
- // absolute position to get the correct top/left boundaries of the container.
-
- if (image) {
- pos = $(image).offset();
- offsetx = pos.left;
- offsety = pos.top;
- }
-
- // map the coordinates of any type of shape to a poly and use the logic. simpler than using three different
- // calculation methods. Circles use a 20 degree increment for this estimation.
-
- for (j=0;j<elements.length;j++)
- {
- el=elements[j];
- if (el.nodeName==='AREA') {
- iCoords = u.split(el.coords,parseInt);
-
- switch(el.shape) {
- case 'circle':
- curX=iCoords[0];
- curY=iCoords[1];
- radius=iCoords[2];
- coords=[];
- for (j=0;j<360;j+=20) {
- angle=j*Math.PI/180;
- coords.push(curX+radius*Math.cos(angle),curY+radius*Math.sin(angle));
- }
- break;
- case 'rect':
- coords.push(iCoords[0],iCoords[1],iCoords[2],iCoords[1],iCoords[2],iCoords[3],iCoords[0],iCoords[3]);
- break;
- default:
- coords=coords.concat(iCoords);
- break;
- }
-
- // map area positions to it's real position in the container
-
- for (j=0;j<coords.length;j+=2)
- {
- coords[j]=parseInt(coords[j],10)+offsetx;
- coords[j+1]=parseInt(coords[j+1],10)+offsety;
- }
- } else {
- el=$(el);
- pos = el.position();
- coords.push(pos.left,pos.top,
- pos.left+el.width(),pos.top,
- pos.left+el.width(),pos.top+el.height(),
- pos.left,pos.top+el.height());
-
- }
- }
-
- minX = minY = bestMinX = bestMinY = 999999;
- maxX = maxY = bestMaxX = bestMaxY = -1;
-
- for (j = coords.length - 2; j >= 0; j -= 2) {
- curX = coords[j];
- curY = coords[j + 1];
-
- if (curX < minX) {
- minX = curX;
- bestMaxY = curY;
- }
- if (curX > maxX) {
- maxX = curX;
- bestMinY = curY;
- }
- if (curY < minY) {
- minY = curY;
- bestMaxX = curX;
- }
- if (curY > maxY) {
- maxY = curY;
- bestMinX = curX;
- }
-
- }
-
- // try to figure out the best place for the tooltip
-
- if (width && height) {
- found=false;
- $.each([[bestMaxX - width, minY - height], [bestMinX, minY - height],
- [minX - width, bestMaxY - height], [minX - width, bestMinY],
- [maxX,bestMaxY - height], [ maxX,bestMinY],
- [bestMaxX - width, maxY], [bestMinX, maxY]
- ],function (i, e) {
- if (!found && (e[0] > rootx && e[1] > rooty)) {
- nest = e;
- found=true;
- return false;
- }
- });
-
- // default to lower-right corner if nothing fit inside the boundaries of the image
-
- if (!found) {
- nest=[maxX,maxY];
- }
- }
- return nest;
- };
-} (jQuery));
-/* scale.js: resize and zoom functionality
- requires areacorners.js, when.js
-*/
-
-
-(function ($) {
- var m = $.mapster, u = m.utils, p = m.MapArea.prototype;
-
- m.utils.getScaleInfo = function (eff, actual) {
- var pct;
- if (!actual) {
- pct = 1;
- actual=eff;
- } else {
- pct = eff.width / actual.width || eff.height / actual.height;
- // make sure a float error doesn't muck us up
- if (pct > 0.98 && pct < 1.02) { pct = 1; }
- }
- return {
- scale: (pct !== 1),
- scalePct: pct,
- realWidth: actual.width,
- realHeight: actual.height,
- width: eff.width,
- height: eff.height,
- ratio: eff.width / eff.height
- };
- };
- // Scale a set of AREAs, return old data as an array of objects
- m.utils.scaleMap = function (image, imageRaw, scale) {
-
- // stunningly, jQuery width can return zero even as width does not, seems to happen only
- // with adBlock or maybe other plugins. These must interfere with onload events somehow.
-
-
- var vis=u.size(image),
- raw=u.size(imageRaw,true);
-
- if (!raw.complete()) {
- throw("Another script, such as an extension, appears to be interfering with image loading. Please let us know about this.");
- }
- if (!vis.complete()) {
- vis=raw;
- }
- return this.getScaleInfo(vis, scale ? raw : null);
- };
-
- /**
- * Resize the image map. Only one of newWidth and newHeight should be passed to preserve scale
- *
- * @param {int} width The new width OR an object containing named parameters matching this function sig
- * @param {int} height The new height
- * @param {int} effectDuration Time in ms for the resize animation, or zero for no animation
- * @param {function} callback A function to invoke when the operation finishes
- * @return {promise} NOT YET IMPLEMENTED
- */
-
- m.MapData.prototype.resize = function (width, height, duration, callback) {
- var p,promises,newsize,els, highlightId, ratio,
- me = this;
-
- // allow omitting duration
- callback = callback || duration;
-
- function sizeCanvas(canvas, w, h) {
- if (m.hasCanvas()) {
- canvas.width = w;
- canvas.height = h;
- } else {
- $(canvas).width(w);
- $(canvas).height(h);
- }
- }
-
- // Finalize resize action, do callback, pass control to command queue
-
- function cleanupAndNotify() {
-
- me.currentAction = '';
-
- if ($.isFunction(callback)) {
- callback();
- }
-
- me.processCommandQueue();
- }
-
- // handle cleanup after the inner elements are resized
-
- function finishResize() {
- sizeCanvas(me.overlay_canvas, width, height);
-
- // restore highlight state if it was highlighted before
- if (highlightId >= 0) {
- var areaData = me.data[highlightId];
- areaData.tempOptions = { fade: false };
- me.getDataForKey(areaData.key).highlight();
- areaData.tempOptions = null;
- }
- sizeCanvas(me.base_canvas, width, height);
- me.redrawSelections();
- cleanupAndNotify();
- }
-
- function resizeMapData() {
- $(me.image).css(newsize);
- // start calculation at the same time as effect
- me.scaleInfo = u.getScaleInfo({
- width: width,
- height: height
- },
- {
- width: me.scaleInfo.realWidth,
- height: me.scaleInfo.realHeight
- });
- $.each(me.data, function (i, e) {
- $.each(e.areas(), function (i, e) {
- e.resize();
- });
- });
- }
-
- if (me.scaleInfo.width === width && me.scaleInfo.height === height) {
- return;
- }
-
- highlightId = me.highlightId;
-
-
- if (!width) {
- ratio = height / me.scaleInfo.realHeight;
- width = Math.round(me.scaleInfo.realWidth * ratio);
- }
- if (!height) {
- ratio = width / me.scaleInfo.realWidth;
- height = Math.round(me.scaleInfo.realHeight * ratio);
- }
-
- newsize = { 'width': String(width) + 'px', 'height': String(height) + 'px' };
- if (!m.hasCanvas()) {
- $(me.base_canvas).children().remove();
- }
-
- // resize all the elements that are part of the map except the image itself (which is not visible)
- // but including the div wrapper
- els = $(me.wrapper).find('.mapster_el').add(me.wrapper);
-
- if (duration) {
- promises = [];
- me.currentAction = 'resizing';
- els.each(function (i, e) {
- p = u.defer();
- promises.push(p);
-
- $(e).animate(newsize, {
- duration: duration,
- complete: p.resolve,
- easing: "linear"
- });
- });
-
- p = u.defer();
- promises.push(p);
-
- // though resizeMapData is not async, it needs to be finished just the same as the animations,
- // so add it to the "to do" list.
-
- u.when.all(promises).then(finishResize);
- resizeMapData();
- p.resolve();
- } else {
- els.css(newsize);
- resizeMapData();
- finishResize();
-
- }
- };
-
-
- m.MapArea = u.subclass(m.MapArea, function () {
- //change the area tag data if needed
- this.base.init();
- if (this.owner.scaleInfo.scale) {
- this.resize();
- }
- });
-
- p.coords = function (percent, coordOffset) {
- var j, newCoords = [],
- pct = percent || this.owner.scaleInfo.scalePct,
- offset = coordOffset || 0;
-
- if (pct === 1 && coordOffset === 0) {
- return this.originalCoords;
- }
-
- for (j = 0; j < this.length; j++) {
- //amount = j % 2 === 0 ? xPct : yPct;
- newCoords.push(Math.round(this.originalCoords[j] * pct) + offset);
- }
- return newCoords;
- };
- p.resize = function () {
- this.area.coords = this.coords().join(',');
- };
-
- p.reset = function () {
- this.area.coords = this.coords(1).join(',');
- };
-
- m.impl.resize = function (width, height, duration, callback) {
- if (!width && !height) {
- return false;
- }
- var x= (new m.Method(this,
- function () {
- this.resize(width, height, duration, callback);
- },
- null,
- {
- name: 'resize',
- args: arguments
- }
- )).go();
- return x;
- };
-
-/*
- m.impl.zoom = function (key, opts) {
- var options = opts || {};
-
- function zoom(areaData) {
- // this will be MapData object returned by Method
-
- var scroll, corners, height, width, ratio,
- diffX, diffY, ratioX, ratioY, offsetX, offsetY, newWidth, newHeight, scrollLeft, scrollTop,
- padding = options.padding || 0,
- scrollBarSize = areaData ? 20 : 0,
- me = this,
- zoomOut = false;
-
- if (areaData) {
- // save original state on first zoom operation
- if (!me.zoomed) {
- me.zoomed = true;
- me.preZoomWidth = me.scaleInfo.width;
- me.preZoomHeight = me.scaleInfo.height;
- me.zoomedArea = areaData;
- if (options.scroll) {
- me.wrapper.css({ overflow: 'auto' });
- }
- }
- corners = $.mapster.utils.areaCorners(areaData.coords(1, 0));
- width = me.wrapper.innerWidth() - scrollBarSize - padding * 2;
- height = me.wrapper.innerHeight() - scrollBarSize - padding * 2;
- diffX = corners.maxX - corners.minX;
- diffY = corners.maxY - corners.minY;
- ratioX = width / diffX;
- ratioY = height / diffY;
- ratio = Math.min(ratioX, ratioY);
- offsetX = (width - diffX * ratio) / 2;
- offsetY = (height - diffY * ratio) / 2;
-
- newWidth = me.scaleInfo.realWidth * ratio;
- newHeight = me.scaleInfo.realHeight * ratio;
- scrollLeft = (corners.minX) * ratio - padding - offsetX;
- scrollTop = (corners.minY) * ratio - padding - offsetY;
- } else {
- if (!me.zoomed) {
- return;
- }
- zoomOut = true;
- newWidth = me.preZoomWidth;
- newHeight = me.preZoomHeight;
- scrollLeft = null;
- scrollTop = null;
- }
-
- this.resize({
- width: newWidth,
- height: newHeight,
- duration: options.duration,
- scroll: scroll,
- scrollLeft: scrollLeft,
- scrollTop: scrollTop,
- // closure so we can be sure values are correct
- callback: (function () {
- var isZoomOut = zoomOut,
- scroll = options.scroll,
- areaD = areaData;
- return function () {
- if (isZoomOut) {
- me.preZoomWidth = null;
- me.preZoomHeight = null;
- me.zoomed = false;
- me.zoomedArea = false;
- if (scroll) {
- me.wrapper.css({ overflow: 'inherit' });
- }
- } else {
- // just to be sure it wasn't canceled & restarted
- me.zoomedArea = areaD;
- }
- };
- } ())
- });
- }
- return (new m.Method(this,
- function (opts) {
- zoom.call(this);
- },
- function () {
- zoom.call(this.owner, this);
- },
- {
- name: 'zoom',
- args: arguments,
- first: true,
- key: key
- }
- )).go();
-
-
- };
- */
-} (jQuery));
-/* tooltip.js - tooltip functionality
- requires areacorners.js
-*/
-
-(function ($) {
-
- var m = $.mapster, u = m.utils;
-
- $.extend(m.defaults, {
- toolTipContainer: '<div style="border: 2px solid black; background: #EEEEEE; width:160px; padding:4px; margin: 4px; -moz-box-shadow: 3px 3px 5px #535353; ' +
- '-webkit-box-shadow: 3px 3px 5px #535353; box-shadow: 3px 3px 5px #535353; -moz-border-radius: 6px 6px 6px 6px; -webkit-border-radius: 6px; ' +
- 'border-radius: 6px 6px 6px 6px; opacity: 0.9;"></dteniv>',
- showToolTip: false,
- toolTipFade: true,
- toolTipClose: ['area-mouseout','image-mouseout'],
- onShowToolTip: null,
- onHideToolTip: null
- });
-
- $.extend(m.area_defaults, {
- toolTip: null,
- toolTipClose: null
- });
-
-
- /**
- * Show a tooltip positioned near this area.
- *
- * @param {string|jquery} html A string of html or a jQuery object containing the tooltip content.
- * @param {string|jquery} [template] The html template in which to wrap the content
- * @param {string|object} [css] CSS to apply to the outermost element of the tooltip
- * @return {jquery} The tooltip that was created
- */
-
- function createToolTip(html, template, css) {
- var tooltip;
-
- // wrap the template in a jQuery object, or clone the template if it's already one.
- // This assumes that anything other than a string is a jQuery object; if it's not jQuery will
- // probably throw an error.
-
- if (template) {
- tooltip = typeof template === 'string' ?
- $(template) :
- $(template).clone();
-
- tooltip.append(html);
- } else {
- tooltip=$(html);
- }
-
- // always set display to block, or the positioning css won't work if the end user happened to
- // use a non-block type element.
-
- tooltip.css($.extend((css || {}),{
- display:"block",
- position:"absolute"
- })).hide();
-
- $('body').append(tooltip);
-
- // we must actually add the tooltip to the DOM and "show" it in order to figure out how much space it
- // consumes, and then reposition it with that knowledge.
- // We also cache the actual opacity setting to restore finally.
-
- tooltip.attr("data-opacity",tooltip.css("opacity"))
- .css("opacity",0);
-
- // doesn't really show it because opacity=0
-
- return tooltip.show();
- }
-
-
- /**
- * Show a tooltip positioned near this area.
- *
- * @param {jquery} tooltip The tooltip
- * @param {object} [options] options for displaying the tooltip.
- * @config {int} [left] The 0-based absolute x position for the tooltip
- * @config {int} [top] The 0-based absolute y position for the tooltip
- * @config {string|object} [css] CSS to apply to the outermost element of the tooltip
- * @config {bool} [fadeDuration] When non-zero, the duration in milliseconds of a fade-in effect for the tooltip.
- */
-
- function showToolTipImpl(tooltip,options)
- {
- var tooltipCss = {
- "left": options.left + "px",
- "top": options.top + "px"
- },
- actalOpacity=tooltip.attr("data-opacity") || 0,
- zindex = tooltip.css("z-index");
-
- if (parseInt(zindex,10)===0
- || zindex === "auto") {
- tooltipCss["z-index"] = 9999;
- }
-
- tooltip.css(tooltipCss)
- .addClass('mapster_tooltip');
-
-
- if (options.fadeDuration && options.fadeDuration>0) {
- u.fader(tooltip[0], 0, actalOpacity, options.fadeDuration);
- } else {
- u.setOpacity(tooltip[0], actalOpacity);
- }
- }
-
- /**
- * Hide and remove active tooltips
- *
- * @param {MapData} this The mapdata object to which the tooltips belong
- */
-
- m.MapData.prototype.clearToolTip = function() {
- if (this.activeToolTip) {
- this.activeToolTip.stop().remove();
- this.activeToolTip = null;
- this.activeToolTipID = null;
- u.ifFunction(this.options.onHideToolTip, this);
- }
- };
-
- /**
- * Configure the binding between a named tooltip closing option, and a mouse event.
- *
- * If a callback is passed, it will be called when the activating event occurs, and the tooltip will
- * only closed if it returns true.
- *
- * @param {MapData} [this] The MapData object to which this tooltip belongs.
- * @param {String} option The name of the tooltip closing option
- * @param {String} event UI event to bind to this option
- * @param {Element} target The DOM element that is the target of the event
- * @param {Function} [beforeClose] Callback when the tooltip is closed
- * @param {Function} [onClose] Callback when the tooltip is closed
- */
- function bindToolTipClose(options, bindOption, event, target, beforeClose, onClose) {
- var event_name = event + '.mapster-tooltip';
-
- if ($.inArray(bindOption, options) >= 0) {
- target.unbind(event_name)
- .bind(event_name, function (e) {
- if (!beforeClose || beforeClose.call(this,e)) {
- target.unbind('.mapster-tooltip');
- if (onClose) {
- onClose.call(this);
- }
- }
- });
-
- return {
- object: target,
- event: event_name
- };
- }
- }
-
- /**
- * Show a tooltip.
- *
- * @param {string|jquery} [tooltip] A string of html or a jQuery object containing the tooltip content.
- *
- * @param {string|jquery} [target] The target of the tooltip, to be used to determine positioning. If null,
- * absolute position values must be passed with left and top.
- *
- * @param {string|jquery} [image] If target is an [area] the image that owns it
- *
- * @param {string|jquery} [container] An element within which the tooltip must be bounded
- *
- *
- *
- * @param {object|string|jQuery} [options] options to apply when creating this tooltip - OR -
- * The markup, or a jquery object, containing the data for the tooltip
- *
- * @config {string} [closeEvents] A string with one or more comma-separated values that determine when the tooltip
- * closes: 'area-click','tooltip-click','image-mouseout' are valid values
- * then no template will be used.
- * @config {int} [offsetx] the horizontal amount to offset the tooltip
- * @config {int} [offsety] the vertical amount to offset the tooltip
- * @config {string|object} [css] CSS to apply to the outermost element of the tooltip
- */
-
- function showToolTip(tooltip,target,image,container,options) {
- var corners,
- ttopts = {};
-
- options = options || {};
-
-
- if (target) {
-
- corners = u.areaCorners(target,image,container,
- tooltip.outerWidth(true),
- tooltip.outerHeight(true));
-
- // Try to upper-left align it first, if that doesn't work, change the parameters
-
- ttopts.left = corners[0];
- ttopts.top = corners[1];
-
- } else {
-
- ttopts.left = options.left;
- ttopts.top = options.top;
- }
-
- ttopts.left += (options.offsetx || 0);
- ttopts.top +=(options.offsety || 0);
-
- ttopts.css= options.css;
- ttopts.fadeDuration = options.fadeDuration;
-
- showToolTipImpl(tooltip,ttopts);
-
- return tooltip;
- }
-
- /**
- * Show a tooltip positioned near this area.
- *
- * @param {string|jquery} [content] A string of html or a jQuery object containing the tooltip content.
-
- * @param {object|string|jQuery} [options] options to apply when creating this tooltip - OR -
- * The markup, or a jquery object, containing the data for the tooltip
- * @config {string|jquery} [container] An element within which the tooltip must be bounded
- * @config {bool} [template] a template to use instead of the default. If this property exists and is null,
- * then no template will be used.
- * @config {string} [closeEvents] A string with one or more comma-separated values that determine when the tooltip
- * closes: 'area-click','tooltip-click','image-mouseout' are valid values
- * then no template will be used.
- * @config {int} [offsetx] the horizontal amount to offset the tooltip
- * @config {int} [offsety] the vertical amount to offset the tooltip
- * @config {string|object} [css] CSS to apply to the outermost element of the tooltip
- */
- m.AreaData.prototype.showToolTip= function(content,options) {
- var tooltip, closeOpts, target, tipClosed, template,
- ttopts = {},
- ad=this,
- md=ad.owner,
- areaOpts = ad.effectiveOptions();
-
- // copy the options object so we can update it
- options = options ? $.extend({},options) : {};
-
- content = content || areaOpts.toolTip;
- closeOpts = options.closeEvents || areaOpts.toolTipClose || md.options.toolTipClose || 'tooltip-click';
-
- template = typeof options.template !== 'undefined' ?
- options.template :
- md.options.toolTipContainer;
-
- options.closeEvents = typeof closeOpts === 'string' ?
- closeOpts = u.split(closeOpts) :
- closeOpts;
-
- options.fadeDuration = options.fadeDuration ||
- (md.options.toolTipFade ?
- (md.options.fadeDuration || areaOpts.fadeDuration) : 0);
-
- target = ad.area ?
- ad.area :
- $.map(ad.areas(),
- function(e) {
- return e.area;
- });
-
- if (md.activeToolTipID===ad.areaId) {
- return;
- }
-
- md.clearToolTip();
-
- md.activeToolTip = tooltip = createToolTip(content,
- template,
- options.css);
-
- md.activeToolTipID = ad.areaId;
-
- tipClosed = function() {
- md.clearToolTip();
- };
-
- bindToolTipClose(closeOpts,'area-click', 'click', $(md.map), null, tipClosed);
- bindToolTipClose(closeOpts,'tooltip-click', 'click', tooltip,null, tipClosed);
- bindToolTipClose(closeOpts,'image-mouseout', 'mouseout', $(md.image), function(e) {
- return (e.relatedTarget && e.relatedTarget.nodeName!=='AREA' && e.relatedTarget!==ad.area);
- }, tipClosed);
-
-
- showToolTip(tooltip,
- target,
- md.image,
- options.container,
- template,
- options);
-
- u.ifFunction(md.options.onShowToolTip, ad.area,
- {
- toolTip: tooltip,
- options: ttopts,
- areaOptions: areaOpts,
- key: ad.key,
- selected: ad.isSelected()
- });
-
- return tooltip;
- };
-
-
- /**
- * Parse an object that could be a string, a jquery object, or an object with a "contents" property
- * containing html or a jQuery object.
- *
- * @param {object|string|jQuery} options The parameter to parse
- * @return {string|jquery} A string or jquery object
- */
- function getHtmlFromOptions(options) {
-
- // see if any html was passed as either the options object itself, or the content property
-
- return (options ?
- ((typeof options === 'string' || options.jquery) ?
- options :
- options.content) :
- null);
- }
-
- /**
- * Activate or remove a tooltip for an area. When this method is called on an area, the
- * key parameter doesn't apply and "options" is the first parameter.
- *
- * When called with no parameters, or "key" is a falsy value, any active tooltip is cleared.
- *
- * When only a key is provided, the default tooltip for the area is used.
- *
- * When html is provided, this is used instead of the default tooltip.
- *
- * When "noTemplate" is true, the default tooltip template will not be used either, meaning only
- * the actual html passed will be used.
- *
- * @param {string|AreaElement} key The area for which to activate a tooltip, or a DOM element.
- *
- * @param {object|string|jquery} [options] options to apply when creating this tooltip - OR -
- * The markup, or a jquery object, containing the data for the tooltip
- * @config {string|jQuery} [content] the inner content of the tooltip; the tooltip text or HTML
- * @config {Element|jQuery} [container] the inner content of the tooltip; the tooltip text or HTML
- * @config {bool} [template] a template to use instead of the default. If this property exists and is null,
- * then no template will be used.
- * @config {int} [offsetx] the horizontal amount to offset the tooltip.
- * @config {int} [offsety] the vertical amount to offset the tooltip.
- * @config {string|object} [css] CSS to apply to the outermost element of the tooltip
- * @config {string|object} [css] CSS to apply to the outermost element of the tooltip
- * @config {bool} [fadeDuration] When non-zero, the duration in milliseconds of a fade-in effect for the tooltip.
- * @return {jQuery} The jQuery object
- */
-
- m.impl.tooltip = function (key,options) {
- return (new m.Method(this,
- function mapData() {
- var tooltip, target, md=this;
- if (!key) {
- md.clearToolTip();
- } else {
- target=$(key);
- if (md.activeToolTipID ===target[0]) {
- return;
- }
- md.clearToolTip();
-
- md.activeToolTip = tooltip = createToolTip(getHtmlFromOptions(options),
- options.template || md.options.toolTipContainer,
- options.css);
- md.activeToolTipID = target[0];
-
- bindToolTipClose(['tooltip-click'],'tooltip-click', 'click', tooltip, null, function() {
- md.clearToolTip();
- });
-
- md.activeToolTip = tooltip = showToolTip(tooltip,
- target,
- md.image,
- options.container,
- options);
- }
- },
- function areaData() {
- if ($.isPlainObject(key) && !options) {
- options = key;
- }
-
- this.showToolTip(getHtmlFromOptions(options),options);
- },
- {
- name: 'tooltip',
- args: arguments,
- key: key
- }
- )).go();
- };
-} (jQuery));
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.migrate-1.1.1.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.migrate-1.1.1.js
deleted file mode 100755
index 3bdc741..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.migrate-1.1.1.js
+++ /dev/null
@@ -1,511 +0,0 @@
-/*!
- * jQuery Migrate - v1.1.1 - 2013-02-16
- * https://github.com/jquery/jquery-migrate
- * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
- */
-(function( jQuery, window, undefined ) {
-// See http://bugs.jquery.com/ticket/13335
-// "use strict";
-
-
-var warnedAbout = {};
-
-// List of warnings already given; public read only
-jQuery.migrateWarnings = [];
-
-// Set to true to prevent console output; migrateWarnings still maintained
-jQuery.migrateMute = true;
-
-// Show a message on the console so devs know we're active
-if ( !jQuery.migrateMute && window.console && console.log ) {
- console.log("JQMIGRATE: Logging is active");
-}
-
-// Set to false to disable traces that appear with warnings
-if ( jQuery.migrateTrace === undefined ) {
- jQuery.migrateTrace = true;
-}
-
-// Forget any warnings we've already given; public
-jQuery.migrateReset = function() {
- warnedAbout = {};
- jQuery.migrateWarnings.length = 0;
-};
-
-function migrateWarn( msg) {
- if ( !warnedAbout[ msg ] ) {
- warnedAbout[ msg ] = true;
- jQuery.migrateWarnings.push( msg );
- if ( window.console && console.warn && !jQuery.migrateMute ) {
- console.warn( "JQMIGRATE: " + msg );
- if ( jQuery.migrateTrace && console.trace ) {
- console.trace();
- }
- }
- }
-}
-
-function migrateWarnProp( obj, prop, value, msg ) {
- if ( Object.defineProperty ) {
- // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
- // allow property to be overwritten in case some other plugin wants it
- try {
- Object.defineProperty( obj, prop, {
- configurable: true,
- enumerable: true,
- get: function() {
- migrateWarn( msg );
- return value;
- },
- set: function( newValue ) {
- migrateWarn( msg );
- value = newValue;
- }
- });
- return;
- } catch( err ) {
- // IE8 is a dope about Object.defineProperty, can't warn there
- }
- }
-
- // Non-ES5 (or broken) browser; just set the property
- jQuery._definePropertyBroken = true;
- obj[ prop ] = value;
-}
-
-if ( document.compatMode === "BackCompat" ) {
- // jQuery has never supported or tested Quirks Mode
- migrateWarn( "jQuery is not compatible with Quirks Mode" );
-}
-
-
-var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
- oldAttr = jQuery.attr,
- valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
- function() { return null; },
- valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
- function() { return undefined; },
- rnoType = /^(?:input|button)$/i,
- rnoAttrNodeType = /^[238]$/,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- ruseDefault = /^(?:checked|selected)$/i;
-
-// jQuery.attrFn
-migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
-
-jQuery.attr = function( elem, name, value, pass ) {
- var lowerName = name.toLowerCase(),
- nType = elem && elem.nodeType;
-
- if ( pass ) {
- // Since pass is used internally, we only warn for new jQuery
- // versions where there isn't a pass arg in the formal params
- if ( oldAttr.length < 4 ) {
- migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
- }
- if ( elem && !rnoAttrNodeType.test( nType ) &&
- (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
- return jQuery( elem )[ name ]( value );
- }
- }
-
- // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
- // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
- if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
- migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
- }
-
- // Restore boolHook for boolean property/attribute synchronization
- if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
- jQuery.attrHooks[ lowerName ] = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" &&
- ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
- };
-
- // Warn only for attributes that can remain distinct from their properties post-1.9
- if ( ruseDefault.test( lowerName ) ) {
- migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
- }
- }
-
- return oldAttr.call( jQuery, elem, name, value );
-};
-
-// attrHooks: value
-jQuery.attrHooks.value = {
- get: function( elem, name ) {
- var nodeName = ( elem.nodeName || "" ).toLowerCase();
- if ( nodeName === "button" ) {
- return valueAttrGet.apply( this, arguments );
- }
- if ( nodeName !== "input" && nodeName !== "option" ) {
- migrateWarn("jQuery.fn.attr('value') no longer gets properties");
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value ) {
- var nodeName = ( elem.nodeName || "" ).toLowerCase();
- if ( nodeName === "button" ) {
- return valueAttrSet.apply( this, arguments );
- }
- if ( nodeName !== "input" && nodeName !== "option" ) {
- migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
-};
-
-
-var matched, browser,
- oldInit = jQuery.fn.init,
- oldParseJSON = jQuery.parseJSON,
- // Note this does NOT include the #9521 XSS fix from 1.7!
- rquickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;
-
-// $(html) "looks like html" rule change
-jQuery.fn.init = function( selector, context, rootjQuery ) {
- var match;
-
- if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
- (match = rquickExpr.exec( selector )) && match[1] ) {
- // This is an HTML string according to the "old" rules; is it still?
- if ( selector.charAt( 0 ) !== "<" ) {
- migrateWarn("$(html) HTML strings must start with '<' character");
- }
- // Now process using loose rules; let pre-1.8 play too
- if ( context && context.context ) {
- // jQuery object as context; parseHTML expects a DOM object
- context = context.context;
- }
- if ( jQuery.parseHTML ) {
- return oldInit.call( this, jQuery.parseHTML( jQuery.trim(selector), context, true ),
- context, rootjQuery );
- }
- }
- return oldInit.apply( this, arguments );
-};
-jQuery.fn.init.prototype = jQuery.fn;
-
-// Let $.parseJSON(falsy_value) return null
-jQuery.parseJSON = function( json ) {
- if ( !json && json !== null ) {
- migrateWarn("jQuery.parseJSON requires a valid JSON string");
- return null;
- }
- return oldParseJSON.apply( this, arguments );
-};
-
-jQuery.uaMatch = function( ua ) {
- ua = ua.toLowerCase();
-
- var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
- /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
- /(msie) ([\w.]+)/.exec( ua ) ||
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
- [];
-
- return {
- browser: match[ 1 ] || "",
- version: match[ 2 ] || "0"
- };
-};
-
-// Don't clobber any existing jQuery.browser in case it's different
-if ( !jQuery.browser ) {
- matched = jQuery.uaMatch( navigator.userAgent );
- browser = {};
-
- if ( matched.browser ) {
- browser[ matched.browser ] = true;
- browser.version = matched.version;
- }
-
- // Chrome is Webkit, but Webkit is also Safari.
- if ( browser.chrome ) {
- browser.webkit = true;
- } else if ( browser.webkit ) {
- browser.safari = true;
- }
-
- jQuery.browser = browser;
-}
-
-// Warn if the code tries to get jQuery.browser
-migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
-
-jQuery.sub = function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- migrateWarn( "jQuery.sub() is deprecated" );
- return jQuerySub;
-};
-
-
-// Ensure that $.ajax gets the new parseJSON defined in core.js
-jQuery.ajaxSetup({
- converters: {
- "text json": jQuery.parseJSON
- }
-});
-
-
-var oldFnData = jQuery.fn.data;
-
-jQuery.fn.data = function( name ) {
- var ret, evt,
- elem = this[0];
-
- // Handles 1.7 which has this behavior and 1.8 which doesn't
- if ( elem && name === "events" && arguments.length === 1 ) {
- ret = jQuery.data( elem, name );
- evt = jQuery._data( elem, name );
- if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
- migrateWarn("Use of jQuery.fn.data('events') is deprecated");
- return evt;
- }
- }
- return oldFnData.apply( this, arguments );
-};
-
-
-var rscriptType = /\/(java|ecma)script/i,
- oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
-
-jQuery.fn.andSelf = function() {
- migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
- return oldSelf.apply( this, arguments );
-};
-
-// Since jQuery.clean is used internally on older versions, we only shim if it's missing
-if ( !jQuery.clean ) {
- jQuery.clean = function( elems, context, fragment, scripts ) {
- // Set context per 1.8 logic
- context = context || document;
- context = !context.nodeType && context[0] || context;
- context = context.ownerDocument || context;
-
- migrateWarn("jQuery.clean() is deprecated");
-
- var i, elem, handleScript, jsTags,
- ret = [];
-
- jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
-
- // Complex logic lifted directly from jQuery 1.8
- if ( fragment ) {
- // Special handling of each script element
- handleScript = function( elem ) {
- // Check if we consider it executable
- if ( !elem.type || rscriptType.test( elem.type ) ) {
- // Detach the script and store it in the scripts array (if provided) or the fragment
- // Return truthy to indicate that it has been handled
- return scripts ?
- scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
- fragment.appendChild( elem );
- }
- };
-
- for ( i = 0; (elem = ret[i]) != null; i++ ) {
- // Check if we're done after handling an executable script
- if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
- // Append to fragment and handle embedded scripts
- fragment.appendChild( elem );
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
- // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
- jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
- // Splice the scripts into ret after their former ancestor and advance our index beyond them
- ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
- i += jsTags.length;
- }
- }
- }
- }
-
- return ret;
- };
-}
-
-var eventAdd = jQuery.event.add,
- eventRemove = jQuery.event.remove,
- eventTrigger = jQuery.event.trigger,
- oldToggle = jQuery.fn.toggle,
- oldLive = jQuery.fn.live,
- oldDie = jQuery.fn.die,
- ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
- rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
- rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
- hoverHack = function( events ) {
- if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
- return events;
- }
- if ( rhoverHack.test( events ) ) {
- migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
- }
- return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
- };
-
-// Event props removed in 1.9, put them back if needed; no practical way to warn them
-if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
- jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
-}
-
-// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
-if ( jQuery.event.dispatch ) {
- migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
-}
-
-// Support for 'hover' pseudo-event and ajax event warnings
-jQuery.event.add = function( elem, types, handler, data, selector ){
- if ( elem !== document && rajaxEvent.test( types ) ) {
- migrateWarn( "AJAX events should be attached to document: " + types );
- }
- eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
-};
-jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
- eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
-};
-
-jQuery.fn.error = function() {
- var args = Array.prototype.slice.call( arguments, 0);
- migrateWarn("jQuery.fn.error() is deprecated");
- args.splice( 0, 0, "error" );
- if ( arguments.length ) {
- return this.bind.apply( this, args );
- }
- // error event should not bubble to window, although it does pre-1.7
- this.triggerHandler.apply( this, args );
- return this;
-};
-
-jQuery.fn.toggle = function( fn, fn2 ) {
-
- // Don't mess with animation or css toggles
- if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
- return oldToggle.apply( this, arguments );
- }
- migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
-
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
-};
-
-jQuery.fn.live = function( types, data, fn ) {
- migrateWarn("jQuery.fn.live() is deprecated");
- if ( oldLive ) {
- return oldLive.apply( this, arguments );
- }
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
-};
-
-jQuery.fn.die = function( types, fn ) {
- migrateWarn("jQuery.fn.die() is deprecated");
- if ( oldDie ) {
- return oldDie.apply( this, arguments );
- }
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
-};
-
-// Turn global events into document-triggered events
-jQuery.event.trigger = function( event, data, elem, onlyHandlers ){
- if ( !elem && !rajaxEvent.test( event ) ) {
- migrateWarn( "Global events are undocumented and deprecated" );
- }
- return eventTrigger.call( this, event, data, elem || document, onlyHandlers );
-};
-jQuery.each( ajaxEvents.split("|"),
- function( _, name ) {
- jQuery.event.special[ name ] = {
- setup: function() {
- var elem = this;
-
- // The document needs no shimming; must be !== for oldIE
- if ( elem !== document ) {
- jQuery.event.add( document, name + "." + jQuery.guid, function() {
- jQuery.event.trigger( name, null, elem, true );
- });
- jQuery._data( this, name, jQuery.guid++ );
- }
- return false;
- },
- teardown: function() {
- if ( this !== document ) {
- jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
- }
- return false;
- }
- };
- }
-);
-
-
-})( jQuery, window );
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.mousewheel-3.0.6.pack.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.mousewheel-3.0.6.pack.js
deleted file mode 100755
index e39a83a..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.mousewheel-3.0.6.pack.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
- * Licensed under the MIT License (LICENSE.txt).
- *
- * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
- * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
- * Thanks to: Seamus Leahy for adding deltaX and deltaY
- *
- * Version: 3.0.6
- *
- * Requires: 1.2.2+
- */
-(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;b.axis!==void 0&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);b.wheelDeltaY!==void 0&&(g=b.wheelDeltaY/120);b.wheelDeltaX!==void 0&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]=
-d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,false);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.outerhtml.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.outerhtml.js
deleted file mode 100755
index f59fbe7..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.outerhtml.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * jQuery outerHTML
- *
- * Copyright (c) 2008 Ca-Phun Ung <caphun at yelotofu dot com>
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * http://yelotofu.com/labs/jquery/snippets/outerhtml/
- *
- * outerHTML is based on the outerHTML work done by Brandon Aaron
- * But adds the ability to replace an element.
- */
-
-(function($) {
- $.fn.outerHTML = function() {
- return $('<div>').append( this.eq(0).clone() ).html();
- };
-})(jQuery);
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.textchange.min.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.textchange.min.js
deleted file mode 100755
index 93f179a..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.textchange.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * jQuery TextChange Plugin
- * http://www.zurb.com/playground/jquery-text-change-custom-event
- *
- * Copyright 2010, ZURB
- * Released under the MIT License
- */
- (function(a){a.event.special.textchange={setup:function(){a(this).data("lastValue",this.contentEditable==="true"?a(this).html():a(this).val());a(this).bind("keyup.textchange",a.event.special.textchange.handler);a(this).bind("cut.textchange paste.textchange input.textchange",a.event.special.textchange.delayedHandler)},teardown:function(){a(this).unbind(".textchange")},handler:function(){a.event.special.textchange.triggerIfChanged(a(this))},delayedHandler:function(){var c=a(this);setTimeout(function(){a.event.special.textchange.triggerIfChanged(c)},
- 25)},triggerIfChanged:function(a){var b=a[0].contentEditable==="true"?a.html():a.val();b!==a.data("lastValue")&&(a.trigger("textchange",[a.data("lastValue")]),a.data("lastValue",b))}};a.event.special.hastext={setup:function(){a(this).bind("textchange",a.event.special.hastext.handler)},teardown:function(){a(this).unbind("textchange",a.event.special.hastext.handler)},handler:function(c,b){b===""&&b!==a(this).val()&&a(this).trigger("hastext")}};a.event.special.notext={setup:function(){a(this).bind("textchange",
- a.event.special.notext.handler)},teardown:function(){a(this).unbind("textchange",a.event.special.notext.handler)},handler:function(c,b){a(this).val()===""&&a(this).val()!==b&&a(this).trigger("notext")}}})(jQuery);
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.throttledresize.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.throttledresize.js
deleted file mode 100755
index 4ba4a86..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/jquery-libs/jquery.throttledresize.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * throttledresize: special jQuery event that happens at a reduced rate compared to "resize"
- *
- * latest version and complete README available on Github:
- * https://github.com/louisremi/jquery-smartresize
- *
- * Copyright 2012 @louis_remi
- * Licensed under the MIT license.
- *
- * This saved you an hour of work?
- * Send me music http://www.amazon.co.uk/wishlist/HNTU0468LQON
- */
-(function($) {
-
-var $event = $.event,
- $special,
- dummy = {_:0},
- frame = 0,
- wasResized, animRunning;
-
-$special = $event.special.throttledresize = {
- setup: function() {
- $( this ).on( "resize", $special.handler );
- },
- teardown: function() {
- $( this ).off( "resize", $special.handler );
- },
- handler: function( event, execAsap ) {
- // Save the context
- var context = this,
- args = arguments;
-
- wasResized = true;
-
- if ( !animRunning ) {
- setInterval(function(){
- frame++;
-
- if ( frame > $special.threshold && wasResized || execAsap ) {
- // set correct event type
- event.type = "throttledresize";
- $event.dispatch.apply( context, args );
- wasResized = false;
- frame = 0;
- }
- if ( frame > 9 ) {
- $(dummy).stop();
- animRunning = false;
- frame = 0;
- }
- }, 30);
- animRunning = true;
- }
- },
- threshold: 0
-};
-
-})(jQuery);
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/masonry.pkgd.min.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/masonry.pkgd.min.js
deleted file mode 100755
index 50ffaed..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/masonry.pkgd.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * Masonry PACKAGED v3.1.4
- * Cascading grid layout library
- * http://masonry.desandro.com
- * MIT License
- * by David DeSandro
- */
-
-(function(t){function e(){}function i(t){function i(e){e.prototype.option||(e.prototype.option=function(e){t.isPlainObject(e)&&(this.options=t.extend(!0,this.options,e))})}function o(e,i){t.fn[e]=function(o){if("string"==typeof o){for(var s=n.call(arguments,1),a=0,h=this.length;h>a;a++){var p=this[a],u=t.data(p,e);if(u)if(t.isFunction(u[o])&&"_"!==o.charAt(0)){var f=u[o].apply(u,s);if(void 0!==f)return f}else r("no such method '"+o+"' for "+e+" instance");else r("cannot call methods on "+e+" prior to initialization; "+"attempted to call '"+o+"'")}return this}return this.each(function(){var n=t.data(this,e);n?(n.option(o),n._init()):(n=new i(this,o),t.data(this,e,n))})}}if(t){var r="undefined"==typeof console?e:function(t){console.error(t)};return t.bridget=function(t,e){i(e),o(t,e)},t.bridget}}var n=Array.prototype.slice;"function"==typeof define&&define.amd?define("jquery-bridget/jquery.bridget",["jquery"],i):i(t.jQuery)})(window),function(t){function e(e){var i=t.event;return i.target=i.target||i.srcElement||e,i}var i=document.documentElement,n=function(){};i.addEventListener?n=function(t,e,i){t.addEventListener(e,i,!1)}:i.attachEvent&&(n=function(t,i,n){t[i+n]=n.handleEvent?function(){var i=e(t);n.handleEvent.call(n,i)}:function(){var i=e(t);n.call(t,i)},t.attachEvent("on"+i,t[i+n])});var o=function(){};i.removeEventListener?o=function(t,e,i){t.removeEventListener(e,i,!1)}:i.detachEvent&&(o=function(t,e,i){t.detachEvent("on"+e,t[e+i]);try{delete t[e+i]}catch(n){t[e+i]=void 0}});var r={bind:n,unbind:o};"function"==typeof define&&define.amd?define("eventie/eventie",r):"object"==typeof exports?module.exports=r:t.eventie=r}(this),function(t){function e(t){"function"==typeof t&&(e.isReady?t():r.push(t))}function i(t){var i="readystatechange"===t.type&&"complete"!==o.readyState;if(!e.isReady&&!i){e.isReady=!0;for(var n=0,s=r.length;s>n;n++){var a=r[n];a()}}}function n(n){return n.bind(o,"DOMContentLoaded",i),n.bind(o,"readystatechange",i),n.bind(t,"load",i),e}var o=t.document,r=[];e.isReady=!1,"function"==typeof define&&define.amd?(e.isReady="function"==typeof requirejs,define("doc-ready/doc-ready",["eventie/eventie"],n)):t.docReady=n(t.eventie)}(this),function(){function t(){}function e(t,e){for(var i=t.length;i--;)if(t[i].listener===e)return i;return-1}function i(t){return function(){return this[t].apply(this,arguments)}}var n=t.prototype,o=this,r=o.EventEmitter;n.getListeners=function(t){var e,i,n=this._getEvents();if(t instanceof RegExp){e={};for(i in n)n.hasOwnProperty(i)&&t.test(i)&&(e[i]=n[i])}else e=n[t]||(n[t]=[]);return e},n.flattenListeners=function(t){var e,i=[];for(e=0;t.length>e;e+=1)i.push(t[e].listener);return i},n.getListenersAsObject=function(t){var e,i=this.getListeners(t);return i instanceof Array&&(e={},e[t]=i),e||i},n.addListener=function(t,i){var n,o=this.getListenersAsObject(t),r="object"==typeof i;for(n in o)o.hasOwnProperty(n)&&-1===e(o[n],i)&&o[n].push(r?i:{listener:i,once:!1});return this},n.on=i("addListener"),n.addOnceListener=function(t,e){return this.addListener(t,{listener:e,once:!0})},n.once=i("addOnceListener"),n.defineEvent=function(t){return this.getListeners(t),this},n.defineEvents=function(t){for(var e=0;t.length>e;e+=1)this.defineEvent(t[e]);return this},n.removeListener=function(t,i){var n,o,r=this.getListenersAsObject(t);for(o in r)r.hasOwnProperty(o)&&(n=e(r[o],i),-1!==n&&r[o].splice(n,1));return this},n.off=i("removeListener"),n.addListeners=function(t,e){return this.manipulateListeners(!1,t,e)},n.removeListeners=function(t,e){return this.manipulateListeners(!0,t,e)},n.manipulateListeners=function(t,e,i){var n,o,r=t?this.removeListener:this.addListener,s=t?this.removeListeners:this.addListeners;if("object"!=typeof e||e instanceof RegExp)for(n=i.length;n--;)r.call(this,e,i[n]);else for(n in e)e.hasOwnProperty(n)&&(o=e[n])&&("function"==typeof o?r.call(this,n,o):s.call(this,n,o));return this},n.removeEvent=function(t){var e,i=typeof t,n=this._getEvents();if("string"===i)delete n[t];else if(t instanceof RegExp)for(e in n)n.hasOwnProperty(e)&&t.test(e)&&delete n[e];else delete this._events;return this},n.removeAllListeners=i("removeEvent"),n.emitEvent=function(t,e){var i,n,o,r,s=this.getListenersAsObject(t);for(o in s)if(s.hasOwnProperty(o))for(n=s[o].length;n--;)i=s[o][n],i.once===!0&&this.removeListener(t,i.listener),r=i.listener.apply(this,e||[]),r===this._getOnceReturnValue()&&this.removeListener(t,i.listener);return this},n.trigger=i("emitEvent"),n.emit=function(t){var e=Array.prototype.slice.call(arguments,1);return this.emitEvent(t,e)},n.setOnceReturnValue=function(t){return this._onceReturnValue=t,this},n._getOnceReturnValue=function(){return this.hasOwnProperty("_onceReturnValue")?this._onceReturnValue:!0},n._getEvents=function(){return this._events||(this._events={})},t.noConflict=function(){return o.EventEmitter=r,t},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return t}):"object"==typeof module&&module.exports?module.exports=t:this.EventEmitter=t}.call(this),function(t){function e(t){if(t){if("string"==typeof n[t])return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e,o=0,r=i.length;r>o;o++)if(e=i[o]+t,"string"==typeof n[e])return e}}var i="Webkit Moz ms Ms O".split(" "),n=document.documentElement.style;"function"==typeof define&&define.amd?define("get-style-property/get-style-property",[],function(){return e}):"object"==typeof exports?module.exports=e:t.getStyleProperty=e}(window),function(t){function e(t){var e=parseFloat(t),i=-1===t.indexOf("%")&&!isNaN(e);return i&&e}function i(){for(var t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},e=0,i=s.length;i>e;e++){var n=s[e];t[n]=0}return t}function n(t){function n(t){if("string"==typeof t&&(t=document.querySelector(t)),t&&"object"==typeof t&&t.nodeType){var n=r(t);if("none"===n.display)return i();var o={};o.width=t.offsetWidth,o.height=t.offsetHeight;for(var u=o.isBorderBox=!(!p||!n[p]||"border-box"!==n[p]),f=0,c=s.length;c>f;f++){var d=s[f],l=n[d];l=a(t,l);var m=parseFloat(l);o[d]=isNaN(m)?0:m}var y=o.paddingLeft+o.paddingRight,g=o.paddingTop+o.paddingBottom,v=o.marginLeft+o.marginRight,b=o.marginTop+o.marginBottom,_=o.borderLeftWidth+o.borderRightWidth,E=o.borderTopWidth+o.borderBottomWidth,L=u&&h,x=e(n.width);x!==!1&&(o.width=x+(L?0:y+_));var z=e(n.height);return z!==!1&&(o.height=z+(L?0:g+E)),o.innerWidth=o.width-(y+_),o.innerHeight=o.height-(g+E),o.outerWidth=o.width+v,o.outerHeight=o.height+b,o}}function a(t,e){if(o||-1===e.indexOf("%"))return e;var i=t.style,n=i.left,r=t.runtimeStyle,s=r&&r.left;return s&&(r.left=t.currentStyle.left),i.left=e,e=i.pixelLeft,i.left=n,s&&(r.left=s),e}var h,p=t("boxSizing");return function(){if(p){var t=document.createElement("div");t.style.width="200px",t.style.padding="1px 2px 3px 4px",t.style.borderStyle="solid",t.style.borderWidth="1px 2px 3px 4px",t.style[p]="border-box";var i=document.body||document.documentElement;i.appendChild(t);var n=r(t);h=200===e(n.width),i.removeChild(t)}}(),n}var o=t.getComputedStyle,r=o?function(t){return o(t,null)}:function(t){return t.currentStyle},s=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];"function"==typeof define&&define.amd?define("get-size/get-size",["get-style-property/get-style-property"],n):"object"==typeof exports?module.exports=n(require("get-style-property")):t.getSize=n(t.getStyleProperty)}(window),function(t,e){function i(t,e){return t[a](e)}function n(t){if(!t.parentNode){var e=document.createDocumentFragment();e.appendChild(t)}}function o(t,e){n(t);for(var i=t.parentNode.querySelectorAll(e),o=0,r=i.length;r>o;o++)if(i[o]===t)return!0;return!1}function r(t,e){return n(t),i(t,e)}var s,a=function(){if(e.matchesSelector)return"matchesSelector";for(var t=["webkit","moz","ms","o"],i=0,n=t.length;n>i;i++){var o=t[i],r=o+"MatchesSelector";if(e[r])return r}}();if(a){var h=document.createElement("div"),p=i(h,"div");s=p?i:r}else s=o;"function"==typeof define&&define.amd?define("matches-selector/matches-selector",[],function(){return s}):window.matchesSelector=s}(this,Element.prototype),function(t){function e(t,e){for(var i in e)t[i]=e[i];return t}function i(t){for(var e in t)return!1;return e=null,!0}function n(t){return t.replace(/([A-Z])/g,function(t){return"-"+t.toLowerCase()})}function o(t,o,r){function a(t,e){t&&(this.element=t,this.layout=e,this.position={x:0,y:0},this._create())}var h=r("transition"),p=r("transform"),u=h&&p,f=!!r("perspective"),c={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"otransitionend",transition:"transitionend"}[h],d=["transform","transition","transitionDuration","transitionProperty"],l=function(){for(var t={},e=0,i=d.length;i>e;e++){var n=d[e],o=r(n);o&&o!==n&&(t[n]=o)}return t}();e(a.prototype,t.prototype),a.prototype._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},a.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},a.prototype.getSize=function(){this.size=o(this.element)},a.prototype.css=function(t){var e=this.element.style;for(var i in t){var n=l[i]||i;e[n]=t[i]}},a.prototype.getPosition=function(){var t=s(this.element),e=this.layout.options,i=e.isOriginLeft,n=e.isOriginTop,o=parseInt(t[i?"left":"right"],10),r=parseInt(t[n?"top":"bottom"],10);o=isNaN(o)?0:o,r=isNaN(r)?0:r;var a=this.layout.size;o-=i?a.paddingLeft:a.paddingRight,r-=n?a.paddingTop:a.paddingBottom,this.position.x=o,this.position.y=r},a.prototype.layoutPosition=function(){var t=this.layout.size,e=this.layout.options,i={};e.isOriginLeft?(i.left=this.position.x+t.paddingLeft+"px",i.right=""):(i.right=this.position.x+t.paddingRight+"px",i.left=""),e.isOriginTop?(i.top=this.position.y+t.paddingTop+"px",i.bottom=""):(i.bottom=this.position.y+t.paddingBottom+"px",i.top=""),this.css(i),this.emitEvent("layout",[this])};var m=f?function(t,e){return"translate3d("+t+"px, "+e+"px, 0)"}:function(t,e){return"translate("+t+"px, "+e+"px)"};a.prototype._transitionTo=function(t,e){this.getPosition();var i=this.position.x,n=this.position.y,o=parseInt(t,10),r=parseInt(e,10),s=o===this.position.x&&r===this.position.y;if(this.setPosition(t,e),s&&!this.isTransitioning)return this.layoutPosition(),void 0;var a=t-i,h=e-n,p={},u=this.layout.options;a=u.isOriginLeft?a:-a,h=u.isOriginTop?h:-h,p.transform=m(a,h),this.transition({to:p,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})},a.prototype.goTo=function(t,e){this.setPosition(t,e),this.layoutPosition()},a.prototype.moveTo=u?a.prototype._transitionTo:a.prototype.goTo,a.prototype.setPosition=function(t,e){this.position.x=parseInt(t,10),this.position.y=parseInt(e,10)},a.prototype._nonTransition=function(t){this.css(t.to),t.isCleaning&&this._removeStyles(t.to);for(var e in t.onTransitionEnd)t.onTransitionEnd[e].call(this)},a.prototype._transition=function(t){if(!parseFloat(this.layout.options.transitionDuration))return this._nonTransition(t),void 0;var e=this._transn;for(var i in t.onTransitionEnd)e.onEnd[i]=t.onTransitionEnd[i];for(i in t.to)e.ingProperties[i]=!0,t.isCleaning&&(e.clean[i]=!0);if(t.from){this.css(t.from);var n=this.element.offsetHeight;n=null}this.enableTransition(t.to),this.css(t.to),this.isTransitioning=!0};var y=p&&n(p)+",opacity";a.prototype.enableTransition=function(){this.isTransitioning||(this.css({transitionProperty:y,transitionDuration:this.layout.options.transitionDuration}),this.element.addEventListener(c,this,!1))},a.prototype.transition=a.prototype[h?"_transition":"_nonTransition"],a.prototype.onwebkitTransitionEnd=function(t){this.ontransitionend(t)},a.prototype.onotransitionend=function(t){this.ontransitionend(t)};var g={"-webkit-transform":"transform","-moz-transform":"transform","-o-transform":"transform"};a.prototype.ontransitionend=function(t){if(t.target===this.element){var e=this._transn,n=g[t.propertyName]||t.propertyName;if(delete e.ingProperties[n],i(e.ingProperties)&&this.disableTransition(),n in e.clean&&(this.element.style[t.propertyName]="",delete e.clean[n]),n in e.onEnd){var o=e.onEnd[n];o.call(this),delete e.onEnd[n]}this.emitEvent("transitionEnd",[this])}},a.prototype.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(c,this,!1),this.isTransitioning=!1},a.prototype._removeStyles=function(t){var e={};for(var i in t)e[i]="";this.css(e)};var v={transitionProperty:"",transitionDuration:""};return a.prototype.removeTransitionStyles=function(){this.css(v)},a.prototype.removeElem=function(){this.element.parentNode.removeChild(this.element),this.emitEvent("remove",[this])},a.prototype.remove=function(){if(!h||!parseFloat(this.layout.options.transitionDuration))return this.removeElem(),void 0;var t=this;this.on("transitionEnd",function(){return t.removeElem(),!0}),this.hide()},a.prototype.reveal=function(){delete this.isHidden,this.css({display:""});var t=this.layout.options;this.transition({from:t.hiddenStyle,to:t.visibleStyle,isCleaning:!0})},a.prototype.hide=function(){this.isHidden=!0,this.css({display:""});var t=this.layout.options;this.transition({from:t.visibleStyle,to:t.hiddenStyle,isCleaning:!0,onTransitionEnd:{opacity:function(){this.isHidden&&this.css({display:"none"})}}})},a.prototype.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},a}var r=document.defaultView,s=r&&r.getComputedStyle?function(t){return r.getComputedStyle(t,null)}:function(t){return t.currentStyle};"function"==typeof define&&define.amd?define("outlayer/item",["eventEmitter/EventEmitter","get-size/get-size","get-style-property/get-style-property"],o):(t.Outlayer={},t.Outlayer.Item=o(t.EventEmitter,t.getSize,t.getStyleProperty))}(window),function(t){function e(t,e){for(var i in e)t[i]=e[i];return t}function i(t){return"[object Array]"===f.call(t)}function n(t){var e=[];if(i(t))e=t;else if(t&&"number"==typeof t.length)for(var n=0,o=t.length;o>n;n++)e.push(t[n]);else e.push(t);return e}function o(t,e){var i=d(e,t);-1!==i&&e.splice(i,1)}function r(t){return t.replace(/(.)([A-Z])/g,function(t,e,i){return e+"-"+i}).toLowerCase()}function s(i,s,f,d,l,m){function y(t,i){if("string"==typeof t&&(t=a.querySelector(t)),!t||!c(t))return h&&h.error("Bad "+this.constructor.namespace+" element: "+t),void 0;this.element=t,this.options=e({},this.options),this.option(i);var n=++v;this.element.outlayerGUID=n,b[n]=this,this._create(),this.options.isInitLayout&&this.layout()}function g(t,i){t.prototype[i]=e({},y.prototype[i])}var v=0,b={};return y.namespace="outlayer",y.Item=m,y.prototype.options={containerStyle:{position:"relative"},isInitLayout:!0,isOriginLeft:!0,isOriginTop:!0,isResizeBound:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}},e(y.prototype,f.prototype),y.prototype.option=function(t){e(this.options,t)},y.prototype._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),e(this.element.style,this.options.containerStyle),this.options.isResizeBound&&this.bindResize()},y.prototype.reloadItems=function(){this.items=this._itemize(this.element.children)},y.prototype._itemize=function(t){for(var e=this._filterFindItemElements(t),i=this.constructor.Item,n=[],o=0,r=e.length;r>o;o++){var s=e[o],a=new i(s,this);n.push(a)}return n},y.prototype._filterFindItemElements=function(t){t=n(t);for(var e=this.options.itemSelector,i=[],o=0,r=t.length;r>o;o++){var s=t[o];if(c(s))if(e){l(s,e)&&i.push(s);for(var a=s.querySelectorAll(e),h=0,p=a.length;p>h;h++)i.push(a[h])}else i.push(s)}return i},y.prototype.getItemElements=function(){for(var t=[],e=0,i=this.items.length;i>e;e++)t.push(this.items[e].element);return t},y.prototype.layout=function(){this._resetLayout(),this._manageStamps();var t=void 0!==this.options.isLayoutInstant?this.options.isLayoutInstant:!this._isLayoutInited;this.layoutItems(this.items,t),this._isLayoutInited=!0},y.prototype._init=y.prototype.layout,y.prototype._resetLayout=function(){this.getSize()},y.prototype.getSize=function(){this.size=d(this.element)},y.prototype._getMeasurement=function(t,e){var i,n=this.options[t];n?("string"==typeof n?i=this.element.querySelector(n):c(n)&&(i=n),this[t]=i?d(i)[e]:n):this[t]=0},y.prototype.layoutItems=function(t,e){t=this._getItemsForLayout(t),this._layoutItems(t,e),this._postLayout()},y.prototype._getItemsForLayout=function(t){for(var e=[],i=0,n=t.length;n>i;i++){var o=t[i];o.isIgnored||e.push(o)}return e},y.prototype._layoutItems=function(t,e){function i(){n.emitEvent("layoutComplete",[n,t])}var n=this;if(!t||!t.length)return i(),void 0;this._itemsOn(t,"layout",i);for(var o=[],r=0,s=t.length;s>r;r++){var a=t[r],h=this._getItemLayoutPosition(a);h.item=a,h.isInstant=e||a.isLayoutInstant,o.push(h)}this._processLayoutQueue(o)},y.prototype._getItemLayoutPosition=function(){return{x:0,y:0}},y.prototype._processLayoutQueue=function(t){for(var e=0,i=t.length;i>e;e++){var n=t[e];this._positionItem(n.item,n.x,n.y,n.isInstant)}},y.prototype._positionItem=function(t,e,i,n){n?t.goTo(e,i):t.moveTo(e,i)},y.prototype._postLayout=function(){var t=this._getContainerSize();t&&(this._setContainerMeasure(t.width,!0),this._setContainerMeasure(t.height,!1))},y.prototype._getContainerSize=u,y.prototype._setContainerMeasure=function(t,e){if(void 0!==t){var i=this.size;i.isBorderBox&&(t+=e?i.paddingLeft+i.paddingRight+i.borderLeftWidth+i.borderRightWidth:i.paddingBottom+i.paddingTop+i.borderTopWidth+i.borderBottomWidth),t=Math.max(t,0),this.element.style[e?"width":"height"]=t+"px"}},y.prototype._itemsOn=function(t,e,i){function n(){return o++,o===r&&i.call(s),!0}for(var o=0,r=t.length,s=this,a=0,h=t.length;h>a;a++){var p=t[a];p.on(e,n)}},y.prototype.ignore=function(t){var e=this.getItem(t);e&&(e.isIgnored=!0)},y.prototype.unignore=function(t){var e=this.getItem(t);e&&delete e.isIgnored},y.prototype.stamp=function(t){if(t=this._find(t)){this.stamps=this.stamps.concat(t);for(var e=0,i=t.length;i>e;e++){var n=t[e];this.ignore(n)}}},y.prototype.unstamp=function(t){if(t=this._find(t))for(var e=0,i=t.length;i>e;e++){var n=t[e];o(n,this.stamps),this.unignore(n)}},y.prototype._find=function(t){return t?("string"==typeof t&&(t=this.element.querySelectorAll(t)),t=n(t)):void 0},y.prototype._manageStamps=function(){if(this.stamps&&this.stamps.length){this._getBoundingRect();for(var t=0,e=this.stamps.length;e>t;t++){var i=this.stamps[t];this._manageStamp(i)}}},y.prototype._getBoundingRect=function(){var t=this.element.getBoundingClientRect(),e=this.size;this._boundingRect={left:t.left+e.paddingLeft+e.borderLeftWidth,top:t.top+e.paddingTop+e.borderTopWidth,right:t.right-(e.paddingRight+e.borderRightWidth),bottom:t.bottom-(e.paddingBottom+e.borderBottomWidth)}},y.prototype._manageStamp=u,y.prototype._getElementOffset=function(t){var e=t.getBoundingClientRect(),i=this._boundingRect,n=d(t),o={left:e.left-i.left-n.marginLeft,top:e.top-i.top-n.marginTop,right:i.right-e.right-n.marginRight,bottom:i.bottom-e.bottom-n.marginBottom};return o},y.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},y.prototype.bindResize=function(){this.isResizeBound||(i.bind(t,"resize",this),this.isResizeBound=!0)},y.prototype.unbindResize=function(){i.unbind(t,"resize",this),this.isResizeBound=!1},y.prototype.onresize=function(){function t(){e.resize(),delete e.resizeTimeout}this.resizeTimeout&&clearTimeout(this.resizeTimeout);var e=this;this.resizeTimeout=setTimeout(t,100)},y.prototype.resize=function(){var t=d(this.element),e=this.size&&t;e&&t.innerWidth===this.size.innerWidth||this.layout()},y.prototype.addItems=function(t){var e=this._itemize(t);return e.length&&(this.items=this.items.concat(e)),e},y.prototype.appended=function(t){var e=this.addItems(t);e.length&&(this.layoutItems(e,!0),this.reveal(e))},y.prototype.prepended=function(t){var e=this._itemize(t);if(e.length){var i=this.items.slice(0);this.items=e.concat(i),this._resetLayout(),this._manageStamps(),this.layoutItems(e,!0),this.reveal(e),this.layoutItems(i)}},y.prototype.reveal=function(t){var e=t&&t.length;if(e)for(var i=0;e>i;i++){var n=t[i];n.reveal()}},y.prototype.hide=function(t){var e=t&&t.length;if(e)for(var i=0;e>i;i++){var n=t[i];n.hide()}},y.prototype.getItem=function(t){for(var e=0,i=this.items.length;i>e;e++){var n=this.items[e];if(n.element===t)return n}},y.prototype.getItems=function(t){if(t&&t.length){for(var e=[],i=0,n=t.length;n>i;i++){var o=t[i],r=this.getItem(o);r&&e.push(r)}return e}},y.prototype.remove=function(t){t=n(t);var e=this.getItems(t);if(e&&e.length){this._itemsOn(e,"remove",function(){this.emitEvent("removeComplete",[this,e])});for(var i=0,r=e.length;r>i;i++){var s=e[i];s.remove(),o(s,this.items)}}},y.prototype.destroy=function(){var t=this.element.style;t.height="",t.position="",t.width="";for(var e=0,i=this.items.length;i>e;e++){var n=this.items[e];n.destroy()}this.unbindResize(),delete this.element.outlayerGUID,p&&p.removeData(this.element,this.constructor.namespace)},y.data=function(t){var e=t&&t.outlayerGUID;return e&&b[e]},y.create=function(t,i){function n(){y.apply(this,arguments)}return Object.create?n.prototype=Object.create(y.prototype):e(n.prototype,y.prototype),n.prototype.constructor=n,g(n,"options"),e(n.prototype.options,i),n.namespace=t,n.data=y.data,n.Item=function(){m.apply(this,arguments)},n.Item.prototype=new m,s(function(){for(var e=r(t),i=a.querySelectorAll(".js-"+e),o="data-"+e+"-options",s=0,u=i.length;u>s;s++){var f,c=i[s],d=c.getAttribute(o);try{f=d&&JSON.parse(d)}catch(l){h&&h.error("Error parsing "+o+" on "+c.nodeName.toLowerCase()+(c.id?"#"+c.id:"")+": "+l);continue}var m=new n(c,f);p&&p.data(c,t,m)}}),p&&p.bridget&&p.bridget(t,n),n},y.Item=m,y}var a=t.document,h=t.console,p=t.jQuery,u=function(){},f=Object.prototype.toString,c="object"==typeof HTMLElement?function(t){return t instanceof HTMLElement}:function(t){return t&&"object"==typeof t&&1===t.nodeType&&"string"==typeof t.nodeName},d=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i;return-1};"function"==typeof define&&define.amd?define("outlayer/outlayer",["eventie/eventie","doc-ready/doc-ready","eventEmitter/EventEmitter","get-size/get-size","matches-selector/matches-selector","./item"],s):t.Outlayer=s(t.eventie,t.docReady,t.EventEmitter,t.getSize,t.matchesSelector,t.Outlayer.Item)}(window),function(t){function e(t,e){var n=t.create("masonry");return n.prototype._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns();var t=this.cols;for(this.colYs=[];t--;)this.colYs.push(0);this.maxY=0},n.prototype.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var t=this.items[0],i=t&&t.element;this.columnWidth=i&&e(i).outerWidth||this.containerWidth}this.columnWidth+=this.gutter,this.cols=Math.floor((this.containerWidth+this.gutter)/this.columnWidth),this.cols=Math.max(this.cols,1)},n.prototype.getContainerWidth=function(){var t=this.options.isFitWidth?this.element.parentNode:this.element,i=e(t);this.containerWidth=i&&i.innerWidth},n.prototype._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth%this.columnWidth,n=e&&1>e?"round":"ceil",o=Math[n](t.size.outerWidth/this.columnWidth);o=Math.min(o,this.cols);for(var r=this._getColGroup(o),s=Math.min.apply(Math,r),a=i(r,s),h={x:this.columnWidth*a,y:s},p=s+t.size.outerHeight,u=this.cols+1-r.length,f=0;u>f;f++)this.colYs[a+f]=p;return h},n.prototype._getColGroup=function(t){if(2>t)return this.colYs;for(var e=[],i=this.cols+1-t,n=0;i>n;n++){var o=this.colYs.slice(n,n+t);e[n]=Math.max.apply(Math,o)}return e},n.prototype._manageStamp=function(t){var i=e(t),n=this._getElementOffset(t),o=this.options.isOriginLeft?n.left:n.right,r=o+i.outerWidth,s=Math.floor(o/this.columnWidth);s=Math.max(0,s);var a=Math.floor(r/this.columnWidth);a-=r%this.columnWidth?0:1,a=Math.min(this.cols-1,a);for(var h=(this.options.isOriginTop?n.top:n.bottom)+i.outerHeight,p=s;a>=p;p++)this.colYs[p]=Math.max(h,this.colYs[p])},n.prototype._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var t={height:this.maxY};return this.options.isFitWidth&&(t.width=this._getContainerFitWidth()),t},n.prototype._getContainerFitWidth=function(){for(var t=0,e=this.cols;--e&&0===this.colYs[e];)t++;return(this.cols-t)*this.columnWidth-this.gutter},n.prototype.resize=function(){var t=this.containerWidth;this.getContainerWidth(),t!==this.containerWidth&&this.layout()},n}var i=Array.prototype.indexOf?function(t,e){return t.indexOf(e)}:function(t,e){for(var i=0,n=t.length;n>i;i++){var o=t[i];if(o===e)return i}return-1};"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size"],e):t.Masonry=e(t.Outlayer,t.getSize)}(window);
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/modernizr-2.6.2.min.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/modernizr-2.6.2.min.js
deleted file mode 100755
index f65d479..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/modernizr-2.6.2.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
- * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
- */
-;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function p(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return r.shivMethods?n(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+l().join().replace(/\w+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(r,b.frag)}function q(a){a||(a=b);var c=m(a);return r.shivCSS&&!f&&!c.hasCSS&&(c.hasCSS=!!k(a,"article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}")),j||p(a,c),a}var c=a.html5||{},d=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,f,g="_html5shiv",h=0,i={},j;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/LICENSE.txt b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/LICENSE.txt
deleted file mode 100755
index d4e2560..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/LICENSE.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-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.
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/changelog.txt b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/changelog.txt
deleted file mode 100755
index 24d28cf..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/changelog.txt
+++ /dev/null
@@ -1,415 +0,0 @@
-OPENSEADRAGON CHANGELOG
-=======================
-
-2.2.1:
-
-* Fixed problems with zoom/pan constraints with certain extreme settings (#965)
-* Fixed an issue causing the browser to crash on iOS (#966)
-
-2.2.0:
-
-* BREAKING CHANGE: Viewport.homeBounds, Viewport.contentSize, Viewport.contentAspectX and
- Viewport.contentAspectY have been removed. (#846)
-* BREAKING CHANGE: The Overlay.getBounds method now takes the viewport as parameter. (#896)
-* DEPRECATION: Overlay.scales, Overlay.bounds and Overlay.position have been deprecated. (#896)
- * Overlay.width !== null should be used to test whether the overlay scales horizontally
- * Overlay.height !== null should be used to test whether the overlay scales vertically
- * The Overlay.getBounds method should be used to get the bounds of the overlay in viewport coordinates
- * Overlay.location replaces Overlay.position
-* DEPRECATION: Viewport.setHomeBounds has been deprecated (#846)
-* DEPRECATION: the Viewport constructor is now ignoring the contentSize option (#846)
-* Tile edge smoothing at high zoom (#764)
-* Fixed issue with reference strip popping up virtual keyboard on mobile devices (#779)
-* Now supporting rotation in the Rect class (#782)
-* Drag outside of iframe now works better, as long as both pages are on the same domain (#790)
-* Coordinate conversion now takes rotation into account (#796)
-* Support tile-less IIIF as per LegacyTileSource (#816)
-* You can now give an empty string to the tabIndex option (#805)
-* Fixed issue with rotation and clicking in the navigator (#807)
-* Broadened the check for mime type in LegacyTileSource URLs to allow query strings (#819)
-* Added globalCompositeOperation option for tiledImage, to allow for different transfer modes (#814)
-* Added Viewer.addSimpleImage method for easily adding non-tiled images (#827)
-* DziTileSource now works properly with DZI files that have no extension (#835)
-* Fixed content clipping with rotation (#463, #567 and #833)
-* Fixed navigator not being rotated when viewport rotation is set in constructor (#840)
-* Fixed: Viewer.setMouseNavEnabled wasn't affecting all of the viewer's trackers (#845)
-* Fixed: with scrollToZoom disabled, the viewer caused page scrolling to slow down (#858)
-* Added Viewer.getOverlayById and Overlay.getBounds functions (#853)
-* Tiled images with 0 opacity no longer load their tiles or do drawing calculations (#859)
-* Fixed issue with edge smoothing with PNG tiles at high zoom (#860)
-* Fixed: Images with transparency were clearing images layered below them (#861)
-* Fixed issue causing HTML pages to jump unwantedly to the reference strip upon loading (#872)
-* Added addOnceHandler method to EventSource (#887)
-* Added TiledImage.fitBounds method (#888)
-* Overlays can now be scaled in a single dimension by providing a point location and either width or height (#896)
-* Added full rotation support to overlays (#729, #193)
-* Viewport.goHome() now takes clipping into account (#910)
-* Improved zoom to point (#923)
-* Optimized sketch canvas clearing and blending for images with opacity or transfer modes (#927)
-* Now taking rotation into account in viewport getBounds and fitBounds methods (#934)
-* Added option to disable navigator auto-fade (#935)
-* Fixed issue with maintaining viewport position with full screen (#940)
-* Fixed an issue with simultaneous touch events (#930)
-* Avoid loading clipped out tiles (#939)
-* Improved precision for subtle moves with fitBounds (#939)
-* Fixed an issue in viewer.addTiledImage with replace:true when viewer has navigator (#948)
-
-2.1.0:
-
-* BREAKING CHANGE: the tile does not hold a reference to its image anymore. Only the tile cache keep a reference to images.
-* BREAKING CHANGE: TileSource.tileSize no longer exists; use TileSource.getTileWidth() and TileSource.getTileHeight() instead.
-* DEPRECATION: let ImageRecord.getRenderedContext create the rendered context instead of using ImageRecord.setRenderedContext
-* DEPRECATION: TileSource.getTileSize() is deprecated. Use TileSource.getTileWidth() and TileSource.getTileHeight() instead.
-* Changed resize behaviour to prevent "snapping" to world bounds when constraints allow more space (#711)
-* Added support for non-square tiles (#673)
- * TileSource.Options objects can now optionally provide tileWidth/tileHeight instead of tileSize for non-square tile support.
- * IIIFTileSources will now respect non-square tiles if available.
-* Added new tile source for simple images: ImageTileSource (#760)
-* Optimized adding large numbers of items to the world with collectionMode (#735)
-* Registers as an AMD module where possible (#719)
-* Added "tile-loaded" event on the viewer allowing to modify a tile before it is marked ready to be drawn (#659)
-* Added "tile-unloaded" event on the viewer allowing to free up memory one has allocated on a tile (#659)
-* Added 'tile-load-failed' event (#725)
-* Added additional coordinates conversion methods to TiledImage (#662)
-* Added `preserveImageSizeOnResize` option (#666)
-* Added collectionColumns as a configuration parameter (#680)
-* Added option in addTiledImage to replace tiledImage at index (#706)
-* Added autoRefigureSizes flag to World for optimizing mass rearrangements (#715)
-* You can now change viewport margins after the viewer is created (#721)
-* Added a patch to help slow down the scroll devices that fire too fast (#754)
-* Fixed flickering tiles with useCanvas=false when no cache is used (#661)
-* 'display: none' no longer gets reset on overlays during draw (#668)
-* Better error reporting for tile load failures (#679)
-* Added XDomainRequest as fallback method for ajax requests if XMLHttpRequest fails (for IE < 10) (#693)
-* Now avoiding using eval when JSON.parse is available (#696)
-* Rotation now works properly on retina display (#708)
-* Fixed issue with tiledImages loading tiles at every level instead of just the best level (#728)
-* Fixed placeholderFillStyle flicker (#727)
-* Fix for Chrome (v45) issue that key is sometimes undefined outside of the for-in loop (#730)
-* World.removeAll now cancels any in-flight image loads; same for Viewer.open and Viewer.close (#734)
-* Fixed overlays position (use rounding instead of flooring and ceiling) (#741)
-* Fixed issue with including overlays in your tileSources array when creating/opening in the viewer (#745)
-* Fixed issue in iOS devices that would cause all touch events to fail after a Multitasking Gesture was triggered (#744)
-* Fixed an issue with TiledImage setPosition/setWidth/setHeight not reliably triggering a redraw (#720)
-* Fixed zooming in with plus key on a Swedish keyboard (#763)
-
-2.0.0:
-
-* True multi-image mode (#450)
- * BREAKING CHANGE: Passing an array for the tileSources option is no longer enough to trigger sequence mode; you have to set the sequenceMode option to true as well
- * BREAKING CHANGE: Navigator no longer sends an open event when its viewer opens
- * BREAKING CHANGE: Viewer.drawers and Viewer.drawersContainer no longer exist
- * BREAKING CHANGE: A Viewer's Drawer and Viewport are now made once per Viewer and reused for every image that Viewer opens (rather than being recreated for every open); this means if you change Viewer options between opens, the behavior is different now.
- * DEPRECATION: use Viewer.addTiledImage instead of Viewer.addLayer
- * addTiledImage supports positioning config properties
- * DEPRECATION: use World.getItemAt instead of Viewer.getLayerAtLevel
- * DEPRECATION: use World.getIndexOfItem instead of Viewer.getLevelOfLayer
- * DEPRECATION: use World.getItemCount instead of Viewer.getLayersCount
- * DEPRECATION: use World.setItemIndex instead of Viewer.setLayerLevel
- * DEPRECATION: use World.removeItem instead of Viewer.removeLayer
- * DEPRECATION: use World.needsDraw instead of Drawer.needsUpdate
- * DEPRECATION: use TileCache.numTilesLoaded instead of Drawer.numTilesLoaded
- * DEPRECATION: use World.resetItems instead of Drawer.reset
- * DEPRECATION: use Drawer.clear and World.draw instead of Drawer.update
- * DEPRECATION: the layersAspectRatioEpsilon option is no longer necessary
- * DEPRECATION: Viewer's add-layer event is now World's add-item event
- * DEPRECATION: Viewer's layer-level-changed event is now World's item-index-change event
- * DEPRECATION: Viewer's remove-layer event is now World's remove-item event
- * DEPRECATION: Viewer's add-layer-failed event is now add-item-failed
- * DEPRECATION: TileSourceCollection has been retired in favor of World
- * DEPRECATION: collectionMode no longer draws outlines or reflections for items
- * Drawer has been split into three classes:
- * TiledImage, tile management and positioning for a single tiled image
- * TileCache, tile caching for all images
- * Drawer, tile drawing for all images
- * New class: World, keeps track of multiple images in the scene
- * Viewer now has world and tileCache properties
- * Rect and Point now have clone functions
- * New Viewport method for managing homeBounds as well as constraints: setHomeBounds
- * Viewport.open supports positioning config properties
- * For multi-image open, drawing isn't started until all tileSources have been opened
- * You can specify a clip area for each image (only works on browsers that support the HTML5 canvas) (#594)
- * Added placeholderFillStyle so image rectangles can be drawn even before their tiles load (#635)
- * Ability to set opacity on individual TiledImages (#644)
-* Margins option to push the home region in from the edges of the Viewer (#505)
-* Rect and Point toString() functions are now consistent: rounding values to nearest hundredth
-* Overlays appear in the DOM immediately on open or addOverlay (#507)
-* imageLoaderLimit now works (#544)
-* Turning off scrollToZoom in gestureSettings now allows scroll events to propagate
-* You can now set a minZoomLevel that's greater than the home zoom level
-* Added union() to OpenSeadragon.Rect
-* Fixed an error in fitBounds if the new and old bounds were extremely close in size
-* Added ajaxWithCredentials option (#543)
-* Added viewport-change event for after the viewport changes but before it's drawn
-* A spring's current value is now updated immediately on reset (#524)
-* Fixed an error in fitBounds that occurred sometimes with immediately = true
-* Added support for HDPI (retina) displays (#583)
-* Corrected IIIF tile source to use canonical syntax (#586)
-* Fixed x/y typo that caused horizontal reference strip to be rendered only relative to height (#595)
-* Fixed Firefox 35 not able to open local files (#588)
-* Fixed an issue with zero size viewers in IE8 (#609)
-* Fixed: Cross Origin policy not working (#613)
-* Optimized tile loading by clearing the queue on a re-draw when imageLoaderLimit is set (#616)
-* Now animating zoom spring exponentially (#631)
-* Added http://editorconfig.org/ config file (#637)
-* Keyboard pan speed is now the same regardless of zoom level (#645)
-
-1.2.1:
-
-* Added preserveOverlays option (#561)
-* Fixed: DZI tilesource was broken on IE8/IE9 (#563)
-* Exposed secondary pointer button (middle, right, etc.) events from MouseTracker and through viewer (#479)
-* MouseTracker - Improved IE 8 compatibility (#562)
-* MouseTracker - Improved IE 9+ compatibility (#564)
-* MouseTracker - Simulated touchenter/touchleave events now bubble to parent element MouseTrackers (#566)
-* MouseTracker - Improved multitouch support in enter/exit event handlers (#566)
-* MouseTracker - orphaned tracked touch pointers removed (fix for #539)
-* MouseTracker - removed touchenter/touchleave event support since the events don't exist on any known platform and have been removed from the W3C specification (#566)
-* Removed Viewer onContainerPress/onContainerRelease handlers (and the associated 'container-release' event ) that were never fired due to the canvas (child) element capturing the DOM events (#566)
-* Added 'canvas-enter', 'canvas-exit', and 'canvas-press' events to Viewer (#566)
-* ButtonGroup - removed obsolete MouseTracker event handlers (#566)
-* MouseTracker - added keydown and keyup handlers (#568)
-* Modifier keys ignored in keyboard navigation handlers (#503)
-* Requesting keyboard focus when viewer is clicked (#537)
-* Arrow key navigation fixed across platforms (#565)
-* Removed textarea element from viewer DOM. Viewer.canvas now handles keyboard navigation (#569)
-* Removed 'position' property from MouseTracker keyDownHandler/keyUpHandler/keyHandler functions (#573)
-* Fixed pointer event model detection for IE 10 and IE 11 (#571)
-* Added setMouseNavEnabled() support to Navigator (#572)
-* MouseTracker now defaults to tracking on (#558)
-* Removed Viewer focusHandler/onCanvasFocus (#577)
-* Added tabIndex option to viewer (#577)
-
-1.2.0:
-
-* New combined IIIF TileSource for 1.0 through 2.0 (#441)
- * BREAKING CHANGE: Removed IIIF1_1TileSource (now that IIIFTileSource supports all versions)
-* Allowed TileSources to have dynamic tileSize via source.getTileSize(level) (#441)
- * DEPRECATION: Use .getTileSize(level) instead of .tileSize
-* Fix for IIPServer-style urls when using DZI (#413)
-* Fix memory leak while destroying the viewer (#421)
-* Added fitBoundsWithConstraints() to the viewport (#423)
-* Fixed MouseTracker cross-browser issues with tracking pointers over and out of the tracked element (pull request #448, fix for #152, #404, #420, and #427)
-* Fixed incorrect flick direction after image is rotated (#452)
-* Debug mode now works with rotate images (#453)
-* Now supporting dzi xml with namespaces (#462)
-* You can now rotate the navigator along with the main viewer (#455)
-* Viewport.setRotation now allows all rotation angles (#466)
-* Pinch rotate is now available (defaults to off) (#468)
-* Added option for home button to fill viewer (#474)
-* Better handling of mid-update image loaded callbacks (#409)
-* Tracked pointers are now cleaned up when Viewer.setMouseNavEnabled(false) is called (#518)
-* Added explicit pointer capture for touch event model touchstart events (#552)
-
-1.1.1:
-
-* Fixed issue with dragging the navigator highlight on Webkit browsers (#395)
-* Improved Viewer Options Support in Gesture Handling (#399)
-
-1.1.0:
-
-* BREAKING CHANGE: the openseadragon-canvas element now has two child divs. This means: (#298)
- * The drawer element is no longer accessible via viewer.canvas.firstChild but via viewer.drawersContainer.firstChild or viewer.drawer.canvas.
- * The overlays elements are no longer accessible via viewer.canvas.childNodes but via viewer.overlaysContainer.childNodes or viewer.currentOverlays[i].element.
-* BREAKING CHANGE: Pseudo full screen mode on IE<11 using activex has been dropped. OpenSeadragon will run in full page if full screen mode is requested.
-* BREAKING CHANGE: MouseTracker touch pinch gestures are no longer converted to scroll events. MouseTracker.pinchHandler should be used instead. (#369)
-* DEPRECATION: overlay functions have been moved from Drawer to Viewer (#331)
-* DEPRECATION: OpenSeadragon.cancelFullScreen has been renamed OpenSeadragon.exitFullScreen (#358)
-* DEPRECATION: The 'isTouchEvent' property passed in MouseTracker events is deprecated and has been replaced with 'pointerType', which is a String value "mouse", "touch", "pen", etc. to support multiple simultaneous pointing devices (#369)
-* DEPRECATION: The 'buttonDownAny' property passed in MouseTracker enter and exit events (enterHandler/exitHandler) is deprecated and has been replaced with 'buttons', which indicates the button(s) currently pressed (#369)
-* DEPRECATION: The 'buttonDownAny' property passed in Viewer's 'container-enter' and 'container-exit' events is deprecated and has been replaced with 'buttons', which indicates the button(s) currently pressed (#369)
-* Added layers support. Multiple images can now been displayed on top of each other with transparency via the Viewer.addLayer method (#298)
-* Improved overlay functions (#331)
-* Fixed: Nav button highlight states aren't quite aligned on Firefox (#303)
-* Added ControlAnchor options for default controls (#304)
-* Enabled basic cross-domain tile loading without tainting canvas (works in Chrome and Firefox) (#308)
-* Added crossOriginPolicy drawer configuration to enable or disable CORS image requests (#364)
-* Disabled CORS by default (#377)
-* Added a ControlAnchor.ABSOLUTE enumeration. Enables absolute positioning of control elements in the viewer (#310)
-* Added a 'navigator-scroll' event to Navigator. Fired when mousewheel events occur in the navigator (#310)
-* Added a navigatorMaintainSizeRatio option. If set to true, the navigator minimap resizes when the viewer element is resized (#310)
-* Added 'ABSOLUTE' as a navigatorPosition option, along with corresponding navigatorTop, navigatorLeft options. Allows the navigator minimap to be placed anywhere in the viewer (#310)
-* Enhanced the navigatorTop, navigatorLeft, navigatorHeight, and navigatorWidth options to allow a number for pixel units or a string for other element units (%, em, etc.) (#310)
-* Additional enhancements for IIIF support (#315)
-* Fixed: Setting degrees in Viewer constructor has no effect (#336)
-* Added pre-draw event for tiles to allow applications to alter the image (#348)
-* Added optional Rotate Left/Right buttons to standard controls (#341)
-* Added optimization for large numbers of overlays: `checkResize = false` option for OpenSeadragon.Overlay (#365)
-* Updated full screen API, adding support for Opera and IE11 and allowing keyboard input in Chrome (#358)
-* Various fixes to bring OpenSeadragon into W3C compliance (#375)
-* Added separate flags for turning off each of the nav buttons (#376)
-* Added support for query parameters in DZI tileSource URL (#378)
-* Enhanced MouseTracker for multi-touch (#369)
- * Added support for tracking multiple touch-points on multiple/simultaneous pointing devices
- * Added support for the W3C Pointer Events event model. Enables touch/multi-touch on IE10+
- * Added a dragEndHandler event callback, called when a drag gesture ends
- * Added a pinchHandler event callback, called as a pinch gesture (2 touch points) is occurring
- * Added real-time velocity (speed and direction) tracking to drag operations. 'speed' and 'direction' values are passed in the dragHandler and dragEndHandler event data
-* Enhanced Viewer for multi-touch (#369)
- * Added pinch zoom with the new MouseTracker pinchHandler. The 'pan' and 'zoom' Viewer events can be used to detect changes resulting in pinch gestures
- * Added a "canvas-pinch" event fired by the pinch event handler
- * Added flick gesture with the new MouseTracker dragEndHandler
- * Added a "canvas-drag-end" event fired by the drag-end event handler
- * Added a GestureSettings class for per-device gesture options. Currently has settings to enable/disable zoom-on-scroll, zoom-on-pinch, zoom-on-click, and flick gesture settings.
- * Added GestureSettings objects for mouse, touch, and pen devices to the Viewer options giving users the ability to customize gesture handling in the viewer
- * Added velocity (speed and direction) properties to the "canvas-drag" event
-* Added double-click gesture detection to MouseTracker with corresponding dblClickHandler event callback (#392)
-* Added zoom on double-click feature to Viewer, with corresponding dblClickToZoom option added to the GestureSettings class (#392)
-* Made it possible to run OpenSeadragon from local filesystem on some browsers (#379)
-
-1.0.0:
-
-NOTE: This version has a number of breaking changes to the API, mostly in event handling. See below.
-
-* BREAKING CHANGE: All EventSource and MouseTracker event handler method signatures changed to 'handlerMethod(event)' where event == { eventSource, userData, ... } (#251) (Also fixes #23, #224, #239)
- * The new eventSource property in the event object replaces the old eventSource parameter that was passed to handler methods.
- * Where the event object duplicated the eventSource value, those properties have been removed. This affects the following events:
- * All Button events - 'button' property removed
- * All Viewer (Viewer, Drawer, Viewport) events - 'viewer' property removed
-* BREAKING CHANGE: Renamed EventHandler to EventSource (#225)
-* BREAKING CHANGE: Event names changed for consistency: changed to lower case, compound names hyphenated, and "on" prefixes removed (#226):
- * Viewer "animationstart" changed to "animation-start"
- * Viewer "animationfinish" changed to "animation-finish"
- * Button "onPress" changed to "press"
- * Button "onRelease" changed to "release"
- * Button "onClick" changed to "click"
- * Button "onEnter" changed to "enter"
- * Button "onExit" changed to "exit"
- * Button "onFocus" changed to "focus"
- * Button "onBlur" changed to "blur"
-* BREAKING CHANGE: Numerous improvements to fullPage/fullScreen (#256):
- * Retains zoom/pan position better when switching into and out of fullPage.
- * Retains scroll position when switching back out.
- * More resilient to styling variations on the page.
- * setFullPage no longer automatically engages fullScreen; there's now a separate setFullScreen.
- * 'fullpage' event is now 'full-page'.
- * The `fullpage` property of the 'full-page' event is now `fullPage`.
- * There is now a 'full-screen' event with a `fullScreen` property (true if it has gone to full screen).
- * There are now 'pre-full-page' and 'pre-full-screen' events that include a `preventDefaultAction` property you can set in your handler to cancel. They also have `fullPage` and `fullScreen` properties respectively, to indicate if they are going into or out of the mode.
-* BREAKING CHANGE: Removed the 'onPageChange' callback from the viewer options. Viewer.goToPage() now raises the 'page' event only (#285)
-* Major documentation improvements (#281)
-* MouseTracker now passes the original event objects to its handler methods (#23)
-* MouseTracker now supports an optional 'moveHandler' method for tracking mousemove events (#215)
-* Added stopHandler to MouseTracker. (#262)
-* Fixed: Element-relative mouse coordinates now correct if the element and/or page is scrolled (using new OpenSeadragon.getElementOffset() method) (#131)
-* Fixed: Pinch zoom event issue, regressive issue from previous event system changes (#244)
-* Added IIIF Image API 1.1 Tile Source (#230)
-* IIIF 1.0 now uses pixel based syntax (#249)
-* Fixed: Touch event issue where no canvas-click events were being raised (#240)
-* Check that zoom reference point is valid before using it in zoomTo and zoomBy (#247)
-* Added a number of easier coordinate conversion methods to viewport (#243)
-* Added the ability to create a viewer and start at a specified page (#252)
-* Fixed image resolve issue with collection mode (#255)
-* DOM events are now passed through as 'event.originalEvent' in viewer and button events where appropriate. (#257) Affects the following events:
- * Viewer: 'canvas-release', 'canvas-click', 'canvas-drag', 'canvas-scroll', 'container-enter', 'container-exit', 'container-release'
- * Button: 'enter', 'exit', 'press', 'release', 'focus', 'blur', 'click'
-* Fixed: IE 10 not reading DZI file correctly in certain circumstances (#218)
-* Added support for the 'wheel' DOM mousewheel event (#261)
-* Fix for non-canvas tile rendering at large size (#264)
-* Drawer now uses an HTML5 canvas element whenever it's available. Can be overridden with the Viewer.useCanvas option (#191)
-* Added a boolean preventDefaultAction property (default false) to the event object passed to MouseTracker handler methods. (#270) Implemented in the following MouseTracker subscribers:
- * Viewer.keyboardCommandArea.innerTracker.focusHandler: preventDefaultAction == true prevents scrolling viewer into view
- * Viewer.keyboardCommandArea.innerTracker.keyHandler: preventDefaultAction == true prevents viewer keyboard navigation
- * Viewer.innerTracker.clickHandler: preventDefaultAction == true prevents viewer zoom on click
- * Viewer.innerTracker.dragHandler: preventDefaultAction == true prevents viewer panning with mouse/touch
- * Viewer.innerTracker.scrollHandler: preventDefaultAction == true prevents viewer zooming on mousewheel/pinch
-* Fixed: IE8 error with custom buttons - "Object doesn't support this action" (#279)
-* Support IIIF servers that don't report tile dimensions (#286)
-* Added an autoResize option. Default is true. When set to false, the viewer takes no action when its container element is resized. (#291)
-* Added a static 'version' property to OpenSeadragon. Useful for plugins that require specific OpenSeadragon versions. (#292)
-
-0.9.131:
-
-* Fixed: canvas-click event shouldn't fire as you drag (#198)
-* Fixed: LegacyTileSource doesn't fail gracefully when no supported file formats are found (#202)
-* Added an optional userData argument to EventHandler.addHandler() which is passed unchanged to the handler method (#203)
-* Fixed AJAX error reporting on IE8 (#208)
-* Added viewportToImageRectangle method, and updated imageToViewportRectangle, imageToViewportCoordinates, and viewportToImageCoordinates to be more flexible with params (#212)
-* Fixed: Viewer is not responsive (css) after returning from full screen (#222)
-
-0.9.130:
-
-* Added partial support for rotation (just 90 degree increments for now). (#185)
-* Hiding and restoring broke the viewer; fixed (#177)
-* You can now provide an onDraw function for overlays to do custom overlay manipulation (#160)
-* Added a destroy function on the viewer to clean up and remove elements (#179)
-* Fixed: navigatorPosition option corrected. (#163)
-* OpenSeadragon.now() returned undefined the first time; fixed
-* onTouchEnd did not call the correct mouse up handler; fixed (#159)
-* Touch events no longer capture mouse (was causing issues on devices that support both) (#168)
-* Clicking on a button control no longer refreshes page (#184)
-* Drawer now works when the page is rtl (#187)
-* Fixed a situation that could throw errors in touch handling (#188)
-
-0.9.129:
-
-* Fixed: navigator image not updating when base zoom image is changed (#147)
-* Fixed tile rendering issue at lower zoom levels with the IIIF TileSource (#55)
-* On IE, ajax errors would cause an exception to be thrown; fixed (#144)
-* Faster and more consistent millisecond getter (#138)
-* Fixed an error when using navPrevNextWrap on single images (#135)
-* Various fixes to our timer handling (#133)
-* Now generating source map for openseadragon.min.js (#51)
-* Fix for calculating overlay width / height (#142)
-* JSHint tidying (#136)
-* Improved Ajax method (#149)
-* Overhauled AJAX error reporting (#151)
-
-0.9.128:
-
-* The navigator is now off by default (#102)
-* Reverted minPixelRatio to 0.5 for better quality (#116)
-* Sometimes tiles wouldn't resolve if you used the blendTime option; fixed. (#95)
-* You can now choose to have previous and next buttons wrap using the config.navPrevNextWrap. (#114)
-* You can now specify an ID for a div to hold the navigator (#46)
-* You can now click in the navigator to go to a new location (#46)
-* Keyboard handling is now done in the viewer rather than navigator (#46)
-* Additional navigator fixes (#46)
-* Drawer events now fire properly (#94)
-* Fixed an error in EventHandler.removeHandler() (#48)
-* Better requestAnimationFrame detection on older Firefox (#103)
-* More efficient navigator loading (#115)
-* Simplified element opacity setting implementation (#123)
-
-0.9.127:
-
-* Fixed a problem with getString when the string property is a sub-property. (#64)
-* Fixed: Tooltips for Navigation Controls not displaying (#63)
-* Cleaned up some diagnostic code that was broken.
-* Added fullpage class to viewer element when in fullpage mode (#61)
-* Reverted to original New BSD license; cleaned up license declarations (#89)
-
-0.9.126:
-
-* DZI JSONp was broken; fixed.
-
-0.9.125:
-
-* Fully deprecated OpenSeadragon.createFromDZI, safely deprecated Viewer.openTileSource and
- Viewer.openDZI to use Viewer.open internally. (#53 & #54).
-* Full page bug fix for when viewer is child of document body (#43).
-* Overlays for DZI bug fix (#45).
-* DziTileSource: avoid changing relative paths (#56).
-* Fix typo in preserveViewport handling (#77).
-* Fix updateMulti timer leak after multiple Viewer.open() calls (#76).
-* Minor documentation fixes.
-
-0.9.124:
-
-* Performance enhancements.
-
-
-0.9.123:
-
-* Real fullscreen support.
-
-
-0.9.122:
-
-* Performance enhancements.
-
-
-0.9.121:
-
-* Touch pan now works on Android.
-* Pinch zoom is better on all devices.
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_grouphover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_grouphover.png
deleted file mode 100755
index 3ca4e1e..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_grouphover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_hover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_hover.png
deleted file mode 100755
index d08eb2d..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_hover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_pressed.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_pressed.png
deleted file mode 100755
index 0ee45b5..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_pressed.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_rest.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_rest.png
deleted file mode 100755
index 3172005..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/fullpage_rest.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_grouphover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_grouphover.png
deleted file mode 100755
index 204e1cc..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_grouphover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_hover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_hover.png
deleted file mode 100755
index ec218a0..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_hover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_pressed.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_pressed.png
deleted file mode 100755
index 4439508..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_pressed.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_rest.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_rest.png
deleted file mode 100755
index 009d1bb..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/home_rest.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_grouphover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_grouphover.png
deleted file mode 100755
index 8d83d8a..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_grouphover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_hover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_hover.png
deleted file mode 100755
index ba24ca9..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_hover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_pressed.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_pressed.png
deleted file mode 100755
index 95f169d..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_pressed.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_rest.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_rest.png
deleted file mode 100755
index 5ead544..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/next_rest.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_grouphover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_grouphover.png
deleted file mode 100755
index 016e639..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_grouphover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_hover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_hover.png
deleted file mode 100755
index d4a5c15..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_hover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_pressed.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_pressed.png
deleted file mode 100755
index f999fe4..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_pressed.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_rest.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_rest.png
deleted file mode 100755
index 9716dac..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/previous_rest.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_grouphover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_grouphover.png
deleted file mode 100755
index 9aec7ac..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_grouphover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_hover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_hover.png
deleted file mode 100755
index ba32c5a..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_hover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_pressed.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_pressed.png
deleted file mode 100755
index b968ebf..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_pressed.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_rest.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_rest.png
deleted file mode 100755
index ebbf081..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateleft_rest.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_grouphover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_grouphover.png
deleted file mode 100755
index 86e8689..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_grouphover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_hover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_hover.png
deleted file mode 100755
index d22a728..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_hover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_pressed.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_pressed.png
deleted file mode 100755
index fc2ead6..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_pressed.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_rest.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_rest.png
deleted file mode 100755
index 0721967..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/rotateright_rest.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_grouphover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_grouphover.png
deleted file mode 100755
index c985d0f..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_grouphover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_hover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_hover.png
deleted file mode 100755
index 3cab721..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_hover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_pressed.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_pressed.png
deleted file mode 100755
index 9c3a751..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_pressed.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_rest.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_rest.png
deleted file mode 100755
index f4219a5..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomin_rest.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_grouphover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_grouphover.png
deleted file mode 100755
index 46d21b3..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_grouphover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_hover.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_hover.png
deleted file mode 100755
index 7b924c2..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_hover.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_pressed.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_pressed.png
deleted file mode 100755
index c028db7..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_pressed.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_rest.png b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_rest.png
deleted file mode 100755
index a13e07d..0000000
Binary files a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/images/zoomout_rest.png and /dev/null differ
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon-svg-overlay.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon-svg-overlay.js
deleted file mode 100755
index afcbad9..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon-svg-overlay.js
+++ /dev/null
@@ -1,99 +0,0 @@
-// OpenSeadragon SVG Overlay plugin 0.0.4
-
-(function() {
-
- if (!window.OpenSeadragon) {
- console.error('[openseadragon-svg-overlay] requires OpenSeadragon');
- return;
- }
-
- var svgNS = 'http://www.w3.org/2000/svg';
-
- // ----------
- OpenSeadragon.Viewer.prototype.svgOverlay = function() {
- if (this._svgOverlayInfo) {
- return this._svgOverlayInfo;
- }
-
- this._svgOverlayInfo = new Overlay(this);
- return this._svgOverlayInfo;
- };
-
- // ----------
- var Overlay = function(viewer) {
- var self = this;
-
- this._viewer = viewer;
- this._containerWidth = 0;
- this._containerHeight = 0;
-
- this._svg = document.createElementNS(svgNS, 'svg');
- this._svg.style.position = 'absolute';
- this._svg.style.left = 0;
- this._svg.style.top = 0;
- this._svg.style.width = '100%';
- this._svg.style.height = '100%';
- this._viewer.canvas.appendChild(this._svg);
-
- this._node = document.createElementNS(svgNS, 'g');
- this._svg.appendChild(this._node);
-
- this._viewer.addHandler('animation', function() {
- self.resize();
- });
-
- this._viewer.addHandler('open', function() {
- self.resize();
- });
-
- this._viewer.addHandler('rotate', function(evt) {
- self.resize();
- });
-
- this._viewer.addHandler('resize', function() {
- self.resize();
- });
-
- this.resize();
- };
-
- // ----------
- Overlay.prototype = {
- // ----------
- node: function() {
- return this._node;
- },
-
- // ----------
- resize: function() {
- if (this._containerWidth !== this._viewer.container.clientWidth) {
- this._containerWidth = this._viewer.container.clientWidth;
- this._svg.setAttribute('width', this._containerWidth);
- }
-
- if (this._containerHeight !== this._viewer.container.clientHeight) {
- this._containerHeight = this._viewer.container.clientHeight;
- this._svg.setAttribute('height', this._containerHeight);
- }
-
- var p = this._viewer.viewport.pixelFromPoint(new OpenSeadragon.Point(0, 0), true);
- var zoom = this._viewer.viewport.getZoom(true);
- var rotation = this._viewer.viewport.getRotation();
- // TODO: Expose an accessor for _containerInnerSize in the OSD API so we don't have to use the private variable.
- var scale = this._viewer.viewport._containerInnerSize.x * zoom;
- this._node.setAttribute('transform',
- 'translate(' + p.x + ',' + p.y + ') scale(' + scale + ') rotate(' + rotation + ')');
- },
-
- // ----------
- onClick: function(node, handler) {
- // TODO: Fast click for mobile browsers
-
- new OpenSeadragon.MouseTracker({
- element: node,
- clickHandler: handler
- }).setTracking(true);
- }
- };
-
-})();
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.js
deleted file mode 100755
index c41075a..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.js
+++ /dev/null
@@ -1,20881 +0,0 @@
-//! openseadragon 2.2.1
-//! Built on 2016-06-21
-//! Git commit: v2.2.1-0-babdefd
-//! 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.
- */
-
-
-/**
- * @namespace OpenSeadragon
- * @version openseadragon 2.2.1
- * @classdesc The root namespace for OpenSeadragon. All utility methods
- * and classes are defined on or below this namespace.
- *
- */
-
-
-// Typedefs
-
- /**
- * All required and optional settings for instantiating a new instance of an OpenSeadragon image viewer.
- *
- * @typedef {Object} Options
- * @memberof OpenSeadragon
- *
- * @property {String} id
- * Id of the element to append the viewer's container element to. If not provided, the 'element' property must be provided.
- * If both the element and id properties are specified, the viewer is appended to the element provided in the element property.
- *
- * @property {Element} element
- * The element to append the viewer's container element to. If not provided, the 'id' property must be provided.
- * If both the element and id properties are specified, the viewer is appended to the element provided in the element property.
- *
- * @property {Array|String|Function|Object} [tileSources=null]
- * Tile source(s) to open initially. This is a complex parameter; see
- * {@link OpenSeadragon.Viewer#open} for details.
- *
- * @property {Number} [tabIndex=0]
- * Tabbing order index to assign to the viewer element. Positive values are selected in increasing order. When tabIndex is 0
- * source order is used. A negative value omits the viewer from the tabbing order.
- *
- * @property {Array} overlays Array of objects defining permanent overlays of
- * the viewer. The overlays added via this option and later removed with
- * {@link OpenSeadragon.Viewer#removeOverlay} will be added back when a new
- * image is opened.
- * To add overlays which can be definitively removed, one must use
- * {@link OpenSeadragon.Viewer#addOverlay}
- * If displaying a sequence of images, the overlays can be associated
- * with a specific page by passing the overlays array to the page's
- * tile source configuration.
- * Expected properties:
- * * x, y, (or px, py for pixel coordinates) to define the location.
- * * width, height in point if using x,y or in pixels if using px,py. If width
- * and height are specified, the overlay size is adjusted when zooming,
- * otherwise the size stays the size of the content (or the size defined by CSS).
- * * className to associate a class to the overlay
- * * id to set the overlay element. If an element with this id already exists,
- * it is reused, otherwise it is created. If not specified, a new element is
- * created.
- * * placement a string to define the relative position to the viewport.
- * Only used if no width and height are specified. Default: 'TOP_LEFT'.
- * See {@link OpenSeadragon.Placement} for possible values.
- *
- * @property {String} [xmlPath=null]
- * <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 {Boolean} [debugMode=false]
- * TODO: provide an in-screen panel providing event detail feedback.
- *
- * @property {String} [debugGridColor='#437AB2']
- *
- * @property {Number} [blendTime=0]
- * Specifies the duration of animation as higher or lower level tiles are
- * replacing the existing tile.
- *
- * @property {Boolean} [alwaysBlend=false]
- * Forces the tile to always blend. By default the tiles skip blending
- * when the blendTime is surpassed and the current animation frame would
- * not complete the blend.
- *
- * @property {Boolean} [autoHideControls=true]
- * If the user stops interacting with the viewport, fade the navigation
- * controls. Useful for presentation since the controls are by default
- * floated on top of the image the user is viewing.
- *
- * @property {Boolean} [immediateRender=false]
- * Render the best closest level first, ignoring the lowering levels which
- * provide the effect of very blurry to sharp. It is recommended to change
- * setting to true for mobile devices.
- *
- * @property {Number} [defaultZoomLevel=0]
- * Zoom level to use when image is first opened or the home button is clicked.
- * If 0, adjusts to fit viewer.
- *
- * @property {Number} [opacity=1]
- * Default opacity of the tiled images (1=opaque, 0=transparent)
- *
- * @property {String} [compositeOperation=null]
- * Valid values are 'source-over', 'source-atop', 'source-in', 'source-out',
- * 'destination-over', 'destination-atop', 'destination-in',
- * 'destination-out', 'lighter', 'copy' or 'xor'
- *
- * @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null]
- * Draws a colored rectangle behind the tile if it is not loaded yet.
- * You can pass a CSS color value like "#FF8800".
- * When passing a function the tiledImage and canvas context are available as argument which is useful when you draw a gradient or pattern.
- *
- * @property {Number} [degrees=0]
- * Initial rotation.
- *
- * @property {Number} [minZoomLevel=null]
- *
- * @property {Number} [maxZoomLevel=null]
- *
- * @property {Boolean} [homeFillsViewer=false]
- * Make the 'home' button fill the viewer and clip the image, instead
- * of fitting the image to the viewer and letterboxing.
- *
- * @property {Boolean} [panHorizontal=true]
- * Allow horizontal pan.
- *
- * @property {Boolean} [panVertical=true]
- * Allow vertical pan.
- *
- * @property {Boolean} [constrainDuringPan=false]
- *
- * @property {Boolean} [wrapHorizontal=false]
- * Set to true to force the image to wrap horizontally within the viewport.
- * Useful for maps or images representing the surface of a sphere or cylinder.
- *
- * @property {Boolean} [wrapVertical=false]
- * Set to true to force the image to wrap vertically within the viewport.
- * Useful for maps or images representing the surface of a sphere or cylinder.
- *
- * @property {Number} [minZoomImageRatio=0.9]
- * The minimum percentage ( expressed as a number between 0 and 1 ) of
- * the viewport height or width at which the zoom out will be constrained.
- * Setting it to 0, for example will allow you to zoom out infinity.
- *
- * @property {Number} [maxZoomPixelRatio=1.1]
- * The maximum ratio to allow a zoom-in to affect the highest level pixel
- * ratio. This can be set to Infinity to allow 'infinite' zooming into the
- * image though it is less effective visually if the HTML5 Canvas is not
- * availble on the viewing device.
- *
- * @property {Number} [smoothTileEdgesMinZoom=1.1]
- * A zoom percentage ( where 1 is 100% ) of the highest resolution level.
- * When zoomed in beyond this value alternative compositing will be used to
- * smooth out the edges between tiles. This will have a performance impact.
- * Can be set to Infinity to turn it off.
- * Note: This setting is ignored on iOS devices due to a known bug (See {@link https://github.com/openseadragon/openseadragon/issues/952})
- *
- * @property {Boolean} [iOSDevice=?]
- * True if running on an iOS device, false otherwise.
- * Used to disable certain features that behave differently on iOS devices.
- *
- * @property {Boolean} [autoResize=true]
- * Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior.
- *
- * @property {Boolean} [preserveImageSizeOnResize=false]
- * Set to true to have the image size preserved when the viewer is resized. This requires autoResize=true (default).
- *
- * @property {Number} [minScrollDeltaTime=50]
- * Number of milliseconds between canvas-scroll events. This value helps normalize the rate of canvas-scroll
- * events between different devices, causing the faster devices to slow down enough to make the zoom control
- * more manageable.
- *
- * @property {Number} [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 ratio is
- * achieved. Setting this to 0 and wrapHorizontal ( or wrapVertical ) to
- * true will provide the effect of an infinitely scrolling viewport.
- *
- * @property {Object} [viewportMargins={}]
- * Pushes the "home" region in from the sides by the specified amounts.
- * Possible subproperties (Numbers, in screen coordinates): left, top, right, bottom.
- *
- * @property {Number} [imageLoaderLimit=0]
- * The maximum number of image requests to make concurrently. By default
- * it is set to 0 allowing the browser to make the maximum number of
- * image requests in parallel as allowed by the browsers policy.
- *
- * @property {Number} [clickTimeThreshold=300]
- * The number of milliseconds within which a pointer down-up event combination
- * will be treated as a click gesture.
- *
- * @property {Number} [clickDistThreshold=5]
- * The maximum distance allowed between a pointer down event and a pointer up event
- * to be treated as a click gesture.
- *
- * @property {Number} [dblClickTimeThreshold=300]
- * The number of milliseconds within which two pointer down-up event combinations
- * will be treated as a double-click gesture.
- *
- * @property {Number} [dblClickDistThreshold=20]
- * The maximum distance allowed between two pointer click events
- * to be treated as a double-click gesture.
- *
- * @property {Number} [springStiffness=6.5]
- *
- * @property {Number} [animationTime=1.2]
- * Specifies the animation duration per each {@link OpenSeadragon.Spring}
- * which occur when the image is dragged or zoomed.
- *
- * @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse]
- * Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings})
- * @property {Boolean} [gestureSettingsMouse.scrollToZoom=true] - Zoom on scroll gesture
- * @property {Boolean} [gestureSettingsMouse.clickToZoom=true] - Zoom on click gesture
- * @property {Boolean} [gestureSettingsMouse.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true
- * then clickToZoom should be set to false to prevent multiple zooms.
- * @property {Boolean} [gestureSettingsMouse.pinchToZoom=false] - Zoom on pinch gesture
- * @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture
- * @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
- * @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
- * @property {Boolean} [gestureSettingsMouse.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.
- *
- * @property {OpenSeadragon.GestureSettings} [gestureSettingsTouch]
- * Settings for gestures generated by a touch pointer device. (See {@link OpenSeadragon.GestureSettings})
- * @property {Boolean} [gestureSettingsTouch.scrollToZoom=false] - Zoom on scroll gesture
- * @property {Boolean} [gestureSettingsTouch.clickToZoom=false] - Zoom on click gesture
- * @property {Boolean} [gestureSettingsTouch.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true
- * then clickToZoom should be set to false to prevent multiple zooms.
- * @property {Boolean} [gestureSettingsTouch.pinchToZoom=true] - Zoom on pinch gesture
- * @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture
- * @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
- * @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
- * @property {Boolean} [gestureSettingsTouch.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.
- *
- * @property {OpenSeadragon.GestureSettings} [gestureSettingsPen]
- * Settings for gestures generated by a pen pointer device. (See {@link OpenSeadragon.GestureSettings})
- * @property {Boolean} [gestureSettingsPen.scrollToZoom=false] - Zoom on scroll gesture
- * @property {Boolean} [gestureSettingsPen.clickToZoom=true] - Zoom on click gesture
- * @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true
- * then clickToZoom should be set to false to prevent multiple zooms.
- * @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture
- * @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture
- * @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
- * @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
- * @property {Boolean} [gestureSettingsPen.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.
- *
- * @property {OpenSeadragon.GestureSettings} [gestureSettingsUnknown]
- * Settings for gestures generated by unknown pointer devices. (See {@link OpenSeadragon.GestureSettings})
- * @property {Boolean} [gestureSettingsUnknown.scrollToZoom=true] - Zoom on scroll gesture
- * @property {Boolean} [gestureSettingsUnknown.clickToZoom=false] - Zoom on click gesture
- * @property {Boolean} [gestureSettingsUnknown.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true
- * then clickToZoom should be set to false to prevent multiple zooms.
- * @property {Boolean} [gestureSettingsUnknown.pinchToZoom=true] - Zoom on pinch gesture
- * @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture
- * @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
- * @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
- * @property {Boolean} [gestureSettingsUnknown.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.
- *
- * @property {Number} [zoomPerClick=2.0]
- * The "zoom distance" per mouse click or touch tap. <em><strong>Note:</strong> Setting this to 1.0 effectively disables the click-to-zoom feature (also see gestureSettings[Mouse|Touch|Pen].clickToZoom/dblClickToZoom).</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 (also see gestureSettings[Mouse|Touch|Pen].scrollToZoom}).</em>
- *
- * @property {Number} [zoomPerSecond=1.0]
- * The number of seconds to animate a single zoom event over.
- *
- * @property {Boolean} [showNavigator=false]
- * Set to true to make the navigator minimap appear.
- *
- * @property {String} [navigatorId=navigator-GENERATED DATE]
- * The ID of a div to hold the navigator minimap.
- * If an ID is specified, the navigatorPosition, navigatorSizeRatio, navigatorMaintainSizeRatio, navigator[Top|Left|Height|Width] and navigatorAutoFade options will be ignored.
- * If an ID is not specified, a div element will be generated and placed on top of the main image.
- *
- * @property {String} [navigatorPosition='TOP_RIGHT']
- * Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', 'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>
- * If 'ABSOLUTE' is specified, then navigator[Top|Left|Height|Width] determines the size and position of the navigator minimap in the viewer, and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>
- * For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT', the navigatorSizeRatio or navigator[Height|Width] values determine the size of the navigator minimap.
- *
- * @property {Number} [navigatorSizeRatio=0.2]
- * Ratio of navigator size to viewer size. Ignored if navigator[Height|Width] are specified.
- *
- * @property {Boolean} [navigatorMaintainSizeRatio=false]
- * If true, the navigator minimap is resized (using navigatorSizeRatio) when the viewer size changes.
- *
- * @property {Number|String} [navigatorTop=null]
- * Specifies the location of the navigator minimap (see navigatorPosition).
- *
- * @property {Number|String} [navigatorLeft=null]
- * Specifies the location of the navigator minimap (see navigatorPosition).
- *
- * @property {Number|String} [navigatorHeight=null]
- * Specifies the size of the navigator minimap (see navigatorPosition).
- * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.
- *
- * @property {Number|String} [navigatorWidth=null]
- * Specifies the size of the navigator minimap (see navigatorPosition).
- * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.
- *
- * @property {Boolean} [navigatorAutoResize=true]
- * Set to false to prevent polling for navigator size changes. Useful for providing custom resize behavior.
- * Setting to false can also improve performance when the navigator is configured to a fixed size.
- *
- * @property {Boolean} [navigatorAutoFade=true]
- * If the user stops interacting with the viewport, fade the navigator minimap.
- * Setting to false will make the navigator minimap always visible.
- *
- * @property {Boolean} [navigatorRotate=true]
- * If true, the navigator will be rotated together with the viewer.
- *
- * @property {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} [showNavigationControl=true]
- * Set to false to prevent the appearance of the default navigation controls.<br>
- * Note that if set to false, the customs buttons set by the options
- * zoomInButton, zoomOutButton etc, are rendered inactive.
- *
- * @property {OpenSeadragon.ControlAnchor} [navigationControlAnchor=TOP_LEFT]
- * Placement of the default navigation controls.
- * To set the placement of the sequence controls, see the
- * sequenceControlAnchor option.
- *
- * @property {Boolean} [showZoomControl=true]
- * If true then + and - buttons to zoom in and out are displayed.<br>
- * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding
- * this setting when set to false.
- *
- * @property {Boolean} [showHomeControl=true]
- * If true then the 'Go home' button is displayed to go back to the original
- * zoom and pan.<br>
- * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding
- * this setting when set to false.
- *
- * @property {Boolean} [showFullPageControl=true]
- * If true then the 'Toggle full page' button is displayed to switch
- * between full page and normal mode.<br>
- * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding
- * this setting when set to false.
- *
- * @property {Boolean} [showRotationControl=false]
- * If true then the rotate left/right controls will be displayed as part of the
- * standard controls. This is also subject to the browser support for rotate
- * (e.g. viewer.drawer.canRotate()).<br>
- * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding
- * this setting when set to false.
- *
- * @property {Boolean} [showSequenceControl=true]
- * If sequenceMode is true, then provide buttons for navigating forward and
- * backward through the images.
- *
- * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT]
- * Placement of the default sequence controls.
- *
- * @property {Boolean} [navPrevNextWrap=false]
- * If true then the 'previous' button will wrap to the last image when
- * viewing the first image and the 'next' button will wrap to the first
- * image when viewing the last image.
- *
- * @property {String} zoomInButton
- * Set the id of the custom 'Zoom in' button to use.
- * This is useful to have a custom button anywhere in the web page.<br>
- * To only change the button images, consider using
- * {@link OpenSeadragon.Options.navImages}
- *
- * @property {String} zoomOutButton
- * Set the id of the custom 'Zoom out' button to use.
- * This is useful to have a custom button anywhere in the web page.<br>
- * To only change the button images, consider using
- * {@link OpenSeadragon.Options.navImages}
- *
- * @property {String} homeButton
- * Set the id of the custom 'Go home' button to use.
- * This is useful to have a custom button anywhere in the web page.<br>
- * To only change the button images, consider using
- * {@link OpenSeadragon.Options.navImages}
- *
- * @property {String} fullPageButton
- * Set the id of the custom 'Toggle full page' button to use.
- * This is useful to have a custom button anywhere in the web page.<br>
- * To only change the button images, consider using
- * {@link OpenSeadragon.Options.navImages}
- *
- * @property {String} rotateLeftButton
- * Set the id of the custom 'Rotate left' button to use.
- * This is useful to have a custom button anywhere in the web page.<br>
- * To only change the button images, consider using
- * {@link OpenSeadragon.Options.navImages}
- *
- * @property {String} rotateRightButton
- * Set the id of the custom 'Rotate right' button to use.
- * This is useful to have a custom button anywhere in the web page.<br>
- * To only change the button images, consider using
- * {@link OpenSeadragon.Options.navImages}
- *
- * @property {String} previousButton
- * Set the id of the custom 'Previous page' button to use.
- * This is useful to have a custom button anywhere in the web page.<br>
- * To only change the button images, consider using
- * {@link OpenSeadragon.Options.navImages}
- *
- * @property {String} nextButton
- * Set the id of the custom 'Next page' button to use.
- * This is useful to have a custom button anywhere in the web page.<br>
- * To only change the button images, consider using
- * {@link OpenSeadragon.Options.navImages}
- *
- * @property {Boolean} [sequenceMode=false]
- * Set to true to have the viewer treat your tilesources as a sequence of images to
- * be opened one at a time rather than all at once.
- *
- * @property {Number} [initialPage=0]
- * If sequenceMode is true, display this page initially.
- *
- * @property {Boolean} [preserveViewport=false]
- * If sequenceMode is true, then normally navigating through each image resets the
- * viewport to 'home' position. If preserveViewport is set to true, then the viewport
- * position is preserved when navigating between images in the sequence.
- *
- * @property {Boolean} [preserveOverlays=false]
- * If sequenceMode is true, then normally navigating through each image
- * resets the overlays.
- * If preserveOverlays is set to true, then the overlays added with {@link OpenSeadragon.Viewer#addOverlay}
- * are preserved when navigating between images in the sequence.
- * Note: setting preserveOverlays overrides any overlays specified in the global
- * "overlays" option for the Viewer. It's also not compatible with specifying
- * per-tileSource overlays via the options, as those overlays will persist
- * even after the tileSource is closed.
- *
- * @property {Boolean} [showReferenceStrip=false]
- * If sequenceMode is true, then display a scrolling strip of image thumbnails for
- * navigating through the images.
- *
- * @property {String} [referenceStripScroll='horizontal']
- *
- * @property {Element} [referenceStripElement=null]
- *
- * @property {Number} [referenceStripHeight=null]
- *
- * @property {Number} [referenceStripWidth=null]
- *
- * @property {String} [referenceStripPosition='BOTTOM_LEFT']
- *
- * @property {Number} [referenceStripSizeRatio=0.2]
- *
- * @property {Boolean} [collectionMode=false]
- * Set to true to have the viewer arrange your TiledImages in a grid or line.
- *
- * @property {Number} [collectionRows=3]
- * If collectionMode is true, specifies how many rows the grid should have. Use 1 to make a line.
- * If collectionLayout is 'vertical', specifies how many columns instead.
- *
- * @property {Number} [collectionColumns=0]
- * If collectionMode is true, specifies how many columns the grid should have. Use 1 to make a line.
- * If collectionLayout is 'vertical', specifies how many rows instead. Ignored if collectionRows is not set to a falsy value.
- *
- * @property {String} [collectionLayout='horizontal']
- * If collectionMode is true, specifies whether to arrange vertically or horizontally.
- *
- * @property {Number} [collectionTileSize=800]
- * If collectionMode is true, specifies the size, in viewport coordinates, for each TiledImage to fit into.
- * The TiledImage will be centered within a square of the specified size.
- *
- * @property {Number} [collectionTileMargin=80]
- * If collectionMode is true, specifies the margin, in viewport coordinates, between each TiledImage.
- *
- * @property {String|Boolean} [crossOriginPolicy=false]
- * Valid values are 'Anonymous', 'use-credentials', and false. If false, canvas requests will
- * not use CORS, and the canvas will be tainted.
- *
- * @property {Boolean} [ajaxWithCredentials=false]
- * Whether to set the withCredentials XHR flag for AJAX requests (when loading tile sources).
- * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.
- *
- */
-
- /**
- * Settings for gestures generated by a pointer device.
- *
- * @typedef {Object} GestureSettings
- * @memberof OpenSeadragon
- *
- * @property {Boolean} scrollToZoom
- * Set to false to disable zooming on scroll gestures.
- *
- * @property {Boolean} clickToZoom
- * Set to false to disable zooming on click gestures.
- *
- * @property {Boolean} dblClickToZoom
- * Set to false to disable zooming on double-click gestures. Note: If set to true
- * then clickToZoom should be set to false to prevent multiple zooms.
- *
- * @property {Boolean} pinchToZoom
- * Set to false to disable zooming on pinch gestures.
- *
- * @property {Boolean} flickEnabled
- * Set to false to disable the kinetic panning effect (flick) at the end of a drag gesture.
- *
- * @property {Number} flickMinSpeed
- * If flickEnabled is true, the minimum speed (in pixels-per-second) required to cause the kinetic panning effect (flick) at the end of a drag gesture.
- *
- * @property {Number} flickMomentum
- * If flickEnabled is true, a constant multiplied by the velocity to determine the distance of the kinetic panning effect (flick) at the end of a drag gesture.
- * A larger value will make the flick feel "lighter", while a smaller value will make the flick feel "heavier".
- * Note: springStiffness and animationTime also affect the "spring" used to stop the flick animation.
- *
- */
-
-/**
- * The names for the image resources used for the image navigation buttons.
- *
- * @typedef {Object} NavImages
- * @memberof OpenSeadragon
- *
- * @property {Object} zoomIn - Images for the zoom-in button.
- * @property {String} zoomIn.REST
- * @property {String} zoomIn.GROUP
- * @property {String} zoomIn.HOVER
- * @property {String} zoomIn.DOWN
- *
- * @property {Object} zoomOut - Images for the zoom-out button.
- * @property {String} zoomOut.REST
- * @property {String} zoomOut.GROUP
- * @property {String} zoomOut.HOVER
- * @property {String} zoomOut.DOWN
- *
- * @property {Object} home - Images for the home button.
- * @property {String} home.REST
- * @property {String} home.GROUP
- * @property {String} home.HOVER
- * @property {String} home.DOWN
- *
- * @property {Object} fullpage - Images for the full-page button.
- * @property {String} fullpage.REST
- * @property {String} fullpage.GROUP
- * @property {String} fullpage.HOVER
- * @property {String} fullpage.DOWN
- *
- * @property {Object} rotateleft - Images for the rotate left button.
- * @property {String} rotateleft.REST
- * @property {String} rotateleft.GROUP
- * @property {String} rotateleft.HOVER
- * @property {String} rotateleft.DOWN
- *
- * @property {Object} rotateright - Images for the rotate right button.
- * @property {String} rotateright.REST
- * @property {String} rotateright.GROUP
- * @property {String} rotateright.HOVER
- * @property {String} rotateright.DOWN
- *
- * @property {Object} 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.
- *
- * @param {OpenSeadragon.Options} options - Viewer options.
- * @returns {OpenSeadragon.Viewer}
- */
-window.OpenSeadragon = window.OpenSeadragon || function( options ){
-
- return new OpenSeadragon.Viewer( options );
-
-};
-
-if (typeof define === 'function' && define.amd) {
- define(function () {
- return (window.OpenSeadragon);
- });
-}
-
-
-(function( $ ){
-
-
- /**
- * The OpenSeadragon version.
- *
- * @member {Object} OpenSeadragon.version
- * @property {String} versionStr - The version number as a string ('major.minor.revision').
- * @property {Number} major - The major version number.
- * @property {Number} minor - The minor version number.
- * @property {Number} revision - The revision number.
- * @since 1.0.0
- */
- $.version = {
- versionStr: '2.2.1',
- major: parseInt('2', 10),
- minor: parseInt('2', 10),
- revision: parseInt('1', 10)
- };
-
-
- /**
- * Taken from jquery 1.6.1
- * [[Class]] -> type pairs
- * @private
- */
- var class2type = {
- '[object Boolean]': 'boolean',
- '[object Number]': 'number',
- '[object String]': 'string',
- '[object Function]': 'function',
- '[object Array]': 'array',
- '[object Date]': 'date',
- '[object RegExp]': 'regexp',
- '[object Object]': 'object'
- },
- // Save a reference to some core methods
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty;
-
- /**
- * Taken from jQuery 1.6.1
- * @function isFunction
- * @memberof OpenSeadragon
- * @see {@link http://www.jquery.com/ jQuery}
- */
- $.isFunction = function( obj ) {
- return $.type(obj) === "function";
- };
-
-
- /**
- * Taken from jQuery 1.6.1
- * @function isArray
- * @memberof OpenSeadragon
- * @see {@link http://www.jquery.com/ jQuery}
- */
- $.isArray = Array.isArray || function( obj ) {
- return $.type(obj) === "array";
- };
-
-
- /**
- * A crude way of determining if an object is a window.
- * Taken from jQuery 1.6.1
- * @function isWindow
- * @memberof OpenSeadragon
- * @see {@link http://www.jquery.com/ jQuery}
- */
- $.isWindow = function( obj ) {
- return obj && typeof obj === "object" && "setInterval" in obj;
- };
-
-
- /**
- * Taken from jQuery 1.6.1
- * @function type
- * @memberof OpenSeadragon
- * @see {@link http://www.jquery.com/ jQuery}
- */
- $.type = function( obj ) {
- return ( obj === null ) || ( obj === undefined ) ?
- String( obj ) :
- class2type[ toString.call(obj) ] || "object";
- };
-
-
- /**
- * Taken from jQuery 1.6.1
- * @function isPlainObject
- * @memberof OpenSeadragon
- * @see {@link http://www.jquery.com/ jQuery}
- */
- $.isPlainObject = function( obj ) {
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || OpenSeadragon.type(obj) !== "object" || obj.nodeType || $.isWindow( obj ) ) {
- return false;
- }
-
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call(obj, "constructor") &&
- !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
-
- var lastKey;
- for (var key in obj ) {
- lastKey = key;
- }
-
- return lastKey === undefined || hasOwn.call( obj, lastKey );
- };
-
-
- /**
- * Taken from jQuery 1.6.1
- * @function isEmptyObject
- * @memberof OpenSeadragon
- * @see {@link http://www.jquery.com/ jQuery}
- */
- $.isEmptyObject = function( obj ) {
- for ( var name in obj ) {
- return false;
- }
- return true;
- };
-
- /**
- * Shim around Object.freeze. Does nothing if Object.freeze is not supported.
- * @param {Object} obj The object to freeze.
- * @return {Object} obj The frozen object.
- */
- $.freezeObject = function(obj) {
- if (Object.freeze) {
- $.freezeObject = Object.freeze;
- } else {
- $.freezeObject = function(obj) {
- return obj;
- };
- }
- return $.freezeObject(obj);
- };
-
- /**
- * True if the browser supports the HTML5 canvas element
- * @member {Boolean} supportsCanvas
- * @memberof OpenSeadragon
- */
- $.supportsCanvas = (function () {
- var canvasElement = document.createElement( 'canvas' );
- return !!( $.isFunction( canvasElement.getContext ) &&
- canvasElement.getContext( '2d' ) );
- }());
-
- /**
- * Test whether the submitted canvas is tainted or not.
- * @argument {Canvas} canvas The canvas to test.
- * @returns {Boolean} True if the canvas is tainted.
- */
- $.isCanvasTainted = function(canvas) {
- var isTainted = false;
- try {
- // We test if the canvas is tainted by retrieving data from it.
- // An exception will be raised if the canvas is tainted.
- var data = canvas.getContext('2d').getImageData(0, 0, 1, 1);
- } catch (e) {
- isTainted = true;
- }
- return isTainted;
- };
-
- /**
- * A ratio comparing the device screen's pixel density to the canvas's backing store pixel density. Defaults to 1 if canvas isn't supported by the browser.
- * @member {Number} pixelDensityRatio
- * @memberof OpenSeadragon
- */
- $.pixelDensityRatio = (function () {
- if ( $.supportsCanvas ) {
- var context = document.createElement('canvas').getContext('2d');
- var devicePixelRatio = window.devicePixelRatio || 1;
- var backingStoreRatio = context.webkitBackingStorePixelRatio ||
- context.mozBackingStorePixelRatio ||
- context.msBackingStorePixelRatio ||
- context.oBackingStorePixelRatio ||
- context.backingStorePixelRatio || 1;
- return devicePixelRatio / backingStoreRatio;
- } else {
- return 1;
- }
- }());
-
-}( 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;
- };
-
- var isIOSDevice = function () {
- if (typeof navigator !== 'object') {
- return false;
- }
- var userAgent = navigator.userAgent;
- if (typeof userAgent !== 'string') {
- return false;
- }
- return userAgent.indexOf('iPhone') !== -1 ||
- userAgent.indexOf('iPad') !== -1 ||
- userAgent.indexOf('iPod') !== -1;
- };
-
- $.extend( $, /** @lends OpenSeadragon */{
- /**
- * The default values for the optional settings documented at {@link OpenSeadragon.Options}.
- * @static
- * @type {Object}
- */
- DEFAULT_SETTINGS: {
- //DATA SOURCE DETAILS
- xmlPath: null,
- tileSources: null,
- tileHost: null,
- initialPage: 0,
- crossOriginPolicy: false,
- ajaxWithCredentials: false,
-
- //PAN AND ZOOM SETTINGS AND CONSTRAINTS
- panHorizontal: true,
- panVertical: true,
- constrainDuringPan: false,
- wrapHorizontal: false,
- wrapVertical: false,
- visibilityRatio: 0.5, //-> how much of the viewer can be negative space
- minPixelRatio: 0.5, //->closer to 0 draws tiles meant for a higher zoom at this zoom
- defaultZoomLevel: 0,
- minZoomLevel: null,
- maxZoomLevel: null,
- homeFillsViewer: false,
-
- //UI RESPONSIVENESS AND FEEL
- clickTimeThreshold: 300,
- clickDistThreshold: 5,
- dblClickTimeThreshold: 300,
- dblClickDistThreshold: 20,
- springStiffness: 6.5,
- animationTime: 1.2,
- gestureSettingsMouse: { scrollToZoom: true, clickToZoom: true, dblClickToZoom: false, pinchToZoom: false, flickEnabled: false, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false },
- gestureSettingsTouch: { scrollToZoom: false, clickToZoom: false, dblClickToZoom: true, pinchToZoom: true, flickEnabled: true, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false },
- gestureSettingsPen: { scrollToZoom: false, clickToZoom: true, dblClickToZoom: false, pinchToZoom: false, flickEnabled: false, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false },
- gestureSettingsUnknown: { scrollToZoom: false, clickToZoom: false, dblClickToZoom: true, pinchToZoom: true, flickEnabled: true, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false },
- zoomPerClick: 2,
- zoomPerScroll: 1.2,
- zoomPerSecond: 1.0,
- blendTime: 0,
- alwaysBlend: false,
- autoHideControls: true,
- immediateRender: false,
- minZoomImageRatio: 0.9, //-> closer to 0 allows zoom out to infinity
- maxZoomPixelRatio: 1.1, //-> higher allows 'over zoom' into pixels
- smoothTileEdgesMinZoom: 1.1, //-> higher than maxZoomPixelRatio disables it
- iOSDevice: isIOSDevice(),
- pixelsPerWheelLine: 40,
- autoResize: true,
- preserveImageSizeOnResize: false, // requires autoResize=true
- minScrollDeltaTime: 50,
-
- //DEFAULT CONTROL SETTINGS
- showSequenceControl: true, //SEQUENCE
- sequenceControlAnchor: null, //SEQUENCE
- preserveViewport: false, //SEQUENCE
- preserveOverlays: false, //SEQUENCE
- navPrevNextWrap: false, //SEQUENCE
- showNavigationControl: true, //ZOOM/HOME/FULL/ROTATION
- navigationControlAnchor: null, //ZOOM/HOME/FULL/ROTATION
- showZoomControl: true, //ZOOM
- showHomeControl: true, //HOME
- showFullPageControl: true, //FULL
- showRotationControl: false, //ROTATION
- 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,
- navigatorAutoFade: true,
- navigatorRotate: true,
-
- // INITIAL ROTATION
- degrees: 0,
-
- // APPEARANCE
- opacity: 1,
- compositeOperation: null,
- placeholderFillStyle: null,
-
- //REFERENCE STRIP SETTINGS
- showReferenceStrip: false,
- referenceStripScroll: 'horizontal',
- referenceStripElement: null,
- referenceStripHeight: null,
- referenceStripWidth: null,
- referenceStripPosition: 'BOTTOM_LEFT',
- referenceStripSizeRatio: 0.2,
-
- //COLLECTION VISUALIZATION SETTINGS
- collectionRows: 3, //or columns depending on layout
- collectionColumns: 0, //columns in horizontal layout, rows in vertical layout
- collectionLayout: 'horizontal', //vertical
- collectionMode: false,
- collectionTileSize: 800,
- collectionTileMargin: 80,
-
- //PERFORMANCE SETTINGS
- imageLoaderLimit: 0,
- maxImageCacheCount: 200,
- timeout: 30000,
- useCanvas: true, // Use canvas element for drawing if available
-
- //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'
- }
- },
-
- //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, "" );
- },
-
- /**
- * Returns the property with the correct vendor prefix appended.
- * @param {String} property the property name
- * @returns {String} the property with the correct prefix or null if not
- * supported.
- */
- getCssPropertyWithVendorPrefix: function(property) {
- var memo = {};
-
- $.getCssPropertyWithVendorPrefix = function(property) {
- if (memo[property] !== undefined) {
- return memo[property];
- }
- var style = document.createElement('div').style;
- var result = null;
- if (style[property] !== undefined) {
- result = property;
- } else {
- var prefixes = ['Webkit', 'Moz', 'MS', 'O',
- 'webkit', 'moz', 'ms', 'o'];
- var suffix = $.capitalizeFirstLetter(property);
- for (var i = 0; i < prefixes.length; i++) {
- var prop = prefixes[i] + suffix;
- if (style[prop] !== undefined) {
- result = prop;
- break;
- }
- }
- }
- memo[property] = result;
- return result;
- };
- return $.getCssPropertyWithVendorPrefix(property);
- },
-
- /**
- * Capitalizes the first letter of a string
- * @param {String} string
- * @returns {String} The string with the first letter capitalized
- */
- capitalizeFirstLetter: function(string) {
- return string.charAt(0).toUpperCase() + string.slice(1);
- },
-
- /**
- * Determines if a point is within the bounding rectangle of the given element (hit-test).
- * @function
- * @param {Element|String} element
- * @param {OpenSeadragon.Point} point
- * @returns {Boolean}
- */
- pointInElement: function( element, point ) {
- element = $.getElement( element );
- var offset = $.getElementOffset( element ),
- size = $.getElementSize( element );
- return point.x >= offset.x && point.x < offset.x + size.x && point.y < offset.y + size.y && point.y >= offset.y;
- },
-
-
- /**
- * Gets the 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 = "";
- }
- }
- },
-
-
- /**
- * Sets the specified element's touch-action style attribute to 'none'.
- * @function
- * @param {Element|String} element
- */
- setElementTouchActionNone: function( element ) {
- element = $.getElement( element );
- if ( typeof element.style.touchAction !== 'undefined' ) {
- element.style.touchAction = 'none';
- } else if ( typeof element.style.msTouchAction !== 'undefined' ) {
- element.style.msTouchAction = 'none';
- }
- },
-
-
- /**
- * Add the specified CSS class to the element if not present.
- * @function
- * @param {Element|String} element
- * @param {String} className
- */
- addClass: function( element, className ) {
- element = $.getElement( element );
-
- if ( ! element.className ) {
- element.className = className;
- } else if ( ( ' ' + element.className + ' ' ).
- indexOf( ' ' + className + ' ' ) === -1 ) {
- element.className += ' ' + className;
- }
- },
-
- /**
- * Find the first index at which an element is found in an array or -1
- * if not present.
- *
- * Code taken and adapted from
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility
- *
- * @function
- * @param {Array} array The array from which to find the element
- * @param {Object} searchElement The element to find
- * @param {Number} [fromIndex=0] Index to start research.
- * @returns {Number} The index of the element in the array.
- */
- indexOf: function( array, searchElement, fromIndex ) {
- if ( Array.prototype.indexOf ) {
- this.indexOf = function( array, searchElement, fromIndex ) {
- return array.indexOf( searchElement, fromIndex );
- };
- } else {
- this.indexOf = function( array, searchElement, fromIndex ) {
- var i,
- pivot = ( fromIndex ) ? fromIndex : 0,
- length;
- if ( !array ) {
- throw new TypeError( );
- }
-
- length = array.length;
- if ( length === 0 || pivot >= length ) {
- return -1;
- }
-
- if ( pivot < 0 ) {
- pivot = length - Math.abs( pivot );
- }
-
- for ( i = pivot; i < length; i++ ) {
- if ( array[i] === searchElement ) {
- return i;
- }
- }
- return -1;
- };
- }
- return this.indexOf( array, searchElement, fromIndex );
- },
-
- /**
- * Remove the specified CSS class from the element.
- * @function
- * @param {Element|String} element
- * @param {String} className
- */
- removeClass: function( element, className ) {
- var oldClasses,
- newClasses = [],
- i;
-
- element = $.getElement( element );
- oldClasses = element.className.split( /\s+/ );
- for ( i = 0; i < oldClasses.length; i++ ) {
- if ( oldClasses[ i ] && oldClasses[ i ] !== className ) {
- newClasses.push( oldClasses[ i ] );
- }
- }
- element.className = newClasses.join(' ');
- },
-
-
- /**
- * 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 );
- };
- } 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 );
- };
- } 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;
- },
-
- /**
- * Retrieves the protocol used by the url. The url can either be absolute
- * or relative.
- * @function
- * @private
- * @param {String} url The url to retrieve the protocol from.
- * @return {String} The protocol (http:, https:, file:, ftp: ...)
- */
- getUrlProtocol: function( url ) {
- var match = url.match(/^([a-z]+:)\/\//i);
- if ( match === null ) {
- // Relative URL, retrive the protocol from window.location
- return window.location.protocol;
- }
- return match[1].toLowerCase();
- },
-
- /**
- * Create an XHR object
- * @private
- * @param {type} [local] If set to true, the XHR will be file: protocol
- * compatible if possible (but may raise a warning in the browser).
- * @returns {XMLHttpRequest}
- */
- createAjaxRequest: function( local ) {
- // IE11 does not support window.ActiveXObject so we just try to
- // create one to see if it is supported.
- // See: http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx
- var supportActiveX;
- try {
- /* global ActiveXObject:true */
- supportActiveX = !!new ActiveXObject( "Microsoft.XMLHTTP" );
- } catch( e ) {
- supportActiveX = false;
- }
-
- if ( supportActiveX ) {
- if ( window.XMLHttpRequest ) {
- $.createAjaxRequest = function( local ) {
- if ( local ) {
- return new ActiveXObject( "Microsoft.XMLHTTP" );
- }
- return new XMLHttpRequest();
- };
- } else {
- $.createAjaxRequest = function() {
- return new ActiveXObject( "Microsoft.XMLHTTP" );
- };
- }
- } else if ( window.XMLHttpRequest ) {
- $.createAjaxRequest = function() {
- return new XMLHttpRequest();
- };
- } else {
- throw new Error( "Browser doesn't support XMLHttpRequest." );
- }
- return $.createAjaxRequest( local );
- },
-
- /**
- * Makes an AJAX request.
- * @param {Object} options
- * @param {String} options.url - the url to request
- * @param {Function} options.success - a function to call on a successful response
- * @param {Function} options.error - a function to call on when an error occurs
- * @param {Boolean} [options.withCredentials=false] - whether to set the XHR's withCredentials
- * @throws {Error}
- */
- makeAjaxRequest: function( url, onSuccess, onError ) {
- var withCredentials;
-
- // Note that our preferred API is that you pass in a single object; the named
- // arguments are for legacy support.
- if( $.isPlainObject( url ) ){
- onSuccess = url.success;
- onError = url.error;
- withCredentials = url.withCredentials;
- url = url.url;
- }
-
- var protocol = $.getUrlProtocol( url );
- var request = $.createAjaxRequest( protocol === "file:" );
-
- if ( !$.isFunction( onSuccess ) ) {
- throw new Error( "makeAjaxRequest requires a success callback" );
- }
-
- request.onreadystatechange = function() {
- // 4 = DONE (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties)
- if ( request.readyState == 4 ) {
- request.onreadystatechange = function(){};
-
- // With protocols other than http/https, the status is 200
- // on Firefox and 0 on other browsers
- if ( request.status === 200 ||
- ( request.status === 0 &&
- protocol !== "http:" &&
- protocol !== "https:" )) {
- onSuccess( request );
- } else {
- $.console.log( "AJAX request returned %d: %s", request.status, url );
-
- if ( $.isFunction( onError ) ) {
- onError( request );
- }
- }
- }
- };
-
- if (withCredentials) {
- request.withCredentials = true;
- }
-
- 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 (window.XDomainRequest) { // IE9 or IE8 might as well try to use XDomainRequest
- var xdr = new XDomainRequest();
- if (xdr) {
- xdr.onload = function (e) {
- if ( $.isFunction( onSuccess ) ) {
- onSuccess({ // Faking an xhr object
- responseText: xdr.responseText,
- status: 200, // XDomainRequest doesn't support status codes, so we just fake one! :/
- statusText: 'OK'
- });
- }
- };
- xdr.onerror = function (e) {
- if ( $.isFunction ( onError ) ) {
- onError({ // Faking an xhr object
- responseText: xdr.responseText,
- status: 444, // 444 No Response
- statusText: 'An error happened. Due to an XDomainRequest deficiency we can not extract any information about this error. Upgrade your browser.'
- });
- }
- };
- try {
- xdr.open('GET', url);
- xdr.send();
- } catch (e2) {
- if ( $.isFunction( onError ) ) {
- onError( request, e );
- }
- }
- }
- } else {
- 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 ) {
- if ( window.DOMParser ) {
-
- $.parseXml = function( string ) {
- var xmlDoc = null,
- parser;
-
- parser = new DOMParser();
- xmlDoc = parser.parseFromString( string, "text/xml" );
- return xmlDoc;
- };
-
- } else if ( window.ActiveXObject ) {
-
- $.parseXml = function( string ) {
- var xmlDoc = null;
-
- xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
- xmlDoc.async = false;
- xmlDoc.loadXML( string );
- return xmlDoc;
- };
-
- } else {
- throw new Error( "Browser doesn't support XML DOM." );
- }
-
- return $.parseXml( string );
- },
-
- /**
- * Parses a JSON string into a Javascript object.
- * @function
- * @param {String} string
- * @returns {Object}
- */
- parseJSON: function(string) {
- if (window.JSON && window.JSON.parse) {
- $.parseJSON = window.JSON.parse;
- } else {
- // Should only be used by IE8 in non standards mode
- $.parseJSON = function(string) {
- /*jshint evil:true*/
- return eval('(' + string + ')');
- };
- }
- return $.parseJSON(string);
- },
-
- /**
- * Reports whether the image format is supported for tiling in this
- * version.
- * @function
- * @param {String} [extension]
- * @returns {Boolean}
- */
- imageFormatSupported: function( extension ) {
- extension = extension ? extension : "";
- 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 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,
- regex;
-
- //console.error( 'appName: ' + navigator.appName );
- //console.error( 'appVersion: ' + navigator.appVersion );
- //console.error( 'userAgent: ' + navigator.userAgent );
-
- switch( navigator.appName ){
- case "Microsoft Internet Explorer":
- if( !!window.attachEvent &&
- !!window.ActiveXObject ) {
-
- $.Browser.vendor = $.BROWSERS.IE;
- $.Browser.version = parseFloat(
- ua.substring(
- ua.indexOf( "MSIE" ) + 5,
- ua.indexOf( ";", ua.indexOf( "MSIE" ) ) )
- );
- }
- break;
- case "Netscape":
- if( !!window.addEventListener ){
- if ( ua.indexOf( "Firefox" ) >= 0 ) {
- $.Browser.vendor = $.BROWSERS.FIREFOX;
- $.Browser.version = parseFloat(
- ua.substring( ua.indexOf( "Firefox" ) + 8 )
- );
- } else if ( ua.indexOf( "Safari" ) >= 0 ) {
- $.Browser.vendor = ua.indexOf( "Chrome" ) >= 0 ?
- $.BROWSERS.CHROME :
- $.BROWSERS.SAFARI;
- $.Browser.version = parseFloat(
- ua.substring(
- ua.substring( 0, ua.indexOf( "Safari" ) ).lastIndexOf( "/" ) + 1,
- ua.indexOf( "Safari" )
- )
- );
- } else {
- regex = new RegExp( "Trident/.*rv:([0-9]{1,}[.0-9]{0,})");
- if ( regex.exec( ua ) !== null ) {
- $.Browser.vendor = $.BROWSERS.IE;
- $.Browser.version = parseFloat( RegExp.$1 );
- }
- }
- }
- break;
- case "Opera":
- $.Browser.vendor = $.BROWSERS.OPERA;
- $.Browser.version = parseFloat( ver );
- break;
- }
-
- // ignore '?' portion of query string
- var query = window.location.search.substring( 1 ),
- parts = query.split('&'),
- part,
- sep,
- i;
-
- for ( i = 0; i < parts.length; i++ ) {
- part = parts[ i ];
- sep = part.indexOf( '=' );
-
- if ( sep > 0 ) {
- 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,
- assert: 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;
- }
- }
-
-}(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.
- */
-
-(function( $ ) {
- /**
- * Determine native full screen support we can get from the browser.
- * @member fullScreenApi
- * @memberof OpenSeadragon
- * @type {object}
- * @property {Boolean} supportsFullScreen Return true if full screen API is supported.
- * @property {Function} isFullScreen Return true if currently in full screen mode.
- * @property {Function} getFullScreenElement Return the element currently in full screen mode.
- * @property {Function} requestFullScreen Make a request to go in full screen mode.
- * @property {Function} exitFullScreen Make a request to exit full screen mode.
- * @property {Function} cancelFullScreen Deprecated, use exitFullScreen instead.
- * @property {String} fullScreenEventName Event fired when the full screen mode change.
- * @property {String} fullScreenErrorEventName Event fired when a request to go
- * in full screen mode failed.
- */
- var fullScreenApi = {
- supportsFullScreen: false,
- isFullScreen: function() { return false; },
- getFullScreenElement: function() { return null; },
- requestFullScreen: function() {},
- exitFullScreen: function() {},
- cancelFullScreen: function() {},
- fullScreenEventName: '',
- fullScreenErrorEventName: ''
- };
-
- // check for native support
- if ( document.exitFullscreen ) {
- // W3C standard
- fullScreenApi.supportsFullScreen = true;
- fullScreenApi.getFullScreenElement = function() {
- return document.fullscreenElement;
- };
- fullScreenApi.requestFullScreen = function( element ) {
- return element.requestFullscreen();
- };
- fullScreenApi.exitFullScreen = function() {
- document.exitFullscreen();
- };
- fullScreenApi.fullScreenEventName = "fullscreenchange";
- fullScreenApi.fullScreenErrorEventName = "fullscreenerror";
- } else if ( document.msExitFullscreen ) {
- // IE 11
- fullScreenApi.supportsFullScreen = true;
- fullScreenApi.getFullScreenElement = function() {
- return document.msFullscreenElement;
- };
- fullScreenApi.requestFullScreen = function( element ) {
- return element.msRequestFullscreen();
- };
- fullScreenApi.exitFullScreen = function() {
- document.msExitFullscreen();
- };
- fullScreenApi.fullScreenEventName = "MSFullscreenChange";
- fullScreenApi.fullScreenErrorEventName = "MSFullscreenError";
- } else if ( document.webkitExitFullscreen ) {
- // Recent webkit
- fullScreenApi.supportsFullScreen = true;
- fullScreenApi.getFullScreenElement = function() {
- return document.webkitFullscreenElement;
- };
- fullScreenApi.requestFullScreen = function( element ) {
- return element.webkitRequestFullscreen();
- };
- fullScreenApi.exitFullScreen = function() {
- document.webkitExitFullscreen();
- };
- fullScreenApi.fullScreenEventName = "webkitfullscreenchange";
- fullScreenApi.fullScreenErrorEventName = "webkitfullscreenerror";
- } else if ( document.webkitCancelFullScreen ) {
- // Old webkit
- fullScreenApi.supportsFullScreen = true;
- fullScreenApi.getFullScreenElement = function() {
- return document.webkitCurrentFullScreenElement;
- };
- fullScreenApi.requestFullScreen = function( element ) {
- return element.webkitRequestFullScreen();
- };
- fullScreenApi.exitFullScreen = function() {
- document.webkitCancelFullScreen();
- };
- fullScreenApi.fullScreenEventName = "webkitfullscreenchange";
- fullScreenApi.fullScreenErrorEventName = "webkitfullscreenerror";
- } else if ( document.mozCancelFullScreen ) {
- // Firefox
- fullScreenApi.supportsFullScreen = true;
- fullScreenApi.getFullScreenElement = function() {
- return document.mozFullScreenElement;
- };
- fullScreenApi.requestFullScreen = function( element ) {
- return element.mozRequestFullScreen();
- };
- fullScreenApi.exitFullScreen = function() {
- document.mozCancelFullScreen();
- };
- fullScreenApi.fullScreenEventName = "mozfullscreenchange";
- fullScreenApi.fullScreenErrorEventName = "mozfullscreenerror";
- }
- fullScreenApi.isFullScreen = function() {
- return fullScreenApi.getFullScreenElement() !== null;
- };
- fullScreenApi.cancelFullScreen = function() {
- $.console.error("cancelFullScreen is deprecated. Use exitFullScreen instead.");
- fullScreenApi.exitFullScreen();
- };
-
- // export api
- $.extend( $, fullScreenApi );
-
-})( OpenSeadragon );
-
-/*
- * OpenSeadragon - EventSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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 = {};
-};
-
-/** @lends OpenSeadragon.EventSource.prototype */
-$.EventSource.prototype = {
-
- /**
- * Add an event handler to be triggered only once (or a given number of times)
- * for a given event.
- * @function
- * @param {String} eventName - Name of event to register.
- * @param {OpenSeadragon.EventHandler} handler - Function to call when event
- * is triggered.
- * @param {Object} [userData=null] - Arbitrary object to be passed unchanged
- * to the handler.
- * @param {Number} [times=1] - The number of times to handle the event
- * before removing it.
- */
- addOnceHandler: function(eventName, handler, userData, times) {
- var self = this;
- times = times || 1;
- var count = 0;
- var onceHandler = function(event) {
- count++;
- if (count === times) {
- self.removeHandler(eventName, onceHandler);
- }
- handler(event);
- };
- this.addHandler(eventName, onceHandler, userData);
- },
-
- /**
- * 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 ( $ ) {
-
- // All MouseTracker instances
- var MOUSETRACKERS = [];
-
- // dictionary from hash to private properties
- var THIS = {};
-
-
- /**
- * @class MouseTracker
- * @classdesc Provides simplified handling of common pointer device (mouse, touch, pen, etc.) gestures
- * and keyboard events on a specified element.
- * @memberof OpenSeadragon
- * @param {Object} options
- * Allows configurable properties to be entirely specified by passing
- * an options object to the constructor. The constructor also supports
- * the original positional arguments 'element', 'clickTimeThreshold',
- * and 'clickDistThreshold' in that order.
- * @param {Element|String} options.element
- * A reference to an element or an element id for which the pointer/key
- * events will be monitored.
- * @param {Boolean} [options.startDisabled=false]
- * If true, event tracking on the element will not start until
- * {@link OpenSeadragon.MouseTracker.setTracking|setTracking} is called.
- * @param {Number} options.clickTimeThreshold
- * The number of milliseconds within which a pointer down-up event combination
- * will be treated as a click gesture.
- * @param {Number} options.clickDistThreshold
- * The maximum distance allowed between a pointer down event and a pointer up event
- * to be treated as a click gesture.
- * @param {Number} options.dblClickTimeThreshold
- * The number of milliseconds within which two pointer down-up event combinations
- * will be treated as a double-click gesture.
- * @param {Number} options.dblClickDistThreshold
- * The maximum distance allowed between two pointer click events
- * to be treated as a click gesture.
- * @param {Number} [options.stopDelay=50]
- * The number of milliseconds without pointer move before the stop
- * event is fired.
- * @param {OpenSeadragon.EventHandler} [options.enterHandler=null]
- * An optional handler for pointer enter.
- * @param {OpenSeadragon.EventHandler} [options.exitHandler=null]
- * An optional handler for pointer exit.
- * @param {OpenSeadragon.EventHandler} [options.pressHandler=null]
- * An optional handler for pointer press.
- * @param {OpenSeadragon.EventHandler} [options.nonPrimaryPressHandler=null]
- * An optional handler for pointer non-primary button press.
- * @param {OpenSeadragon.EventHandler} [options.releaseHandler=null]
- * An optional handler for pointer release.
- * @param {OpenSeadragon.EventHandler} [options.nonPrimaryReleaseHandler=null]
- * An optional handler for pointer non-primary button release.
- * @param {OpenSeadragon.EventHandler} [options.moveHandler=null]
- * An optional handler for pointer move.
- * @param {OpenSeadragon.EventHandler} [options.scrollHandler=null]
- * An optional handler for mouse wheel scroll.
- * @param {OpenSeadragon.EventHandler} [options.clickHandler=null]
- * An optional handler for pointer click.
- * @param {OpenSeadragon.EventHandler} [options.dblClickHandler=null]
- * An optional handler for pointer double-click.
- * @param {OpenSeadragon.EventHandler} [options.dragHandler=null]
- * An optional handler for the drag gesture.
- * @param {OpenSeadragon.EventHandler} [options.dragEndHandler=null]
- * An optional handler for after a drag gesture.
- * @param {OpenSeadragon.EventHandler} [options.pinchHandler=null]
- * An optional handler for the pinch gesture.
- * @param {OpenSeadragon.EventHandler} [options.keyDownHandler=null]
- * An optional handler for keydown.
- * @param {OpenSeadragon.EventHandler} [options.keyUpHandler=null]
- * An optional handler for keyup.
- * @param {OpenSeadragon.EventHandler} [options.keyHandler=null]
- * An optional handler for keypress.
- * @param {OpenSeadragon.EventHandler} [options.focusHandler=null]
- * An optional handler for focus.
- * @param {OpenSeadragon.EventHandler} [options.blurHandler=null]
- * An optional handler for blur.
- * @param {Object} [options.userData=null]
- * Arbitrary object to be passed unchanged to any attached handler methods.
- */
- $.MouseTracker = function ( options ) {
-
- MOUSETRACKERS.push( this );
-
- var args = arguments;
-
- if ( !$.isPlainObject( options ) ) {
- options = {
- element: args[ 0 ],
- clickTimeThreshold: args[ 1 ],
- clickDistThreshold: args[ 2 ]
- };
- }
-
- this.hash = Math.random(); // An unique hash for this tracker.
- /**
- * The element for which pointer events are being monitored.
- * @member {Element} element
- * @memberof OpenSeadragon.MouseTracker#
- */
- this.element = $.getElement( options.element );
- /**
- * The number of milliseconds within which a pointer down-up event combination
- * will be treated as a click gesture.
- * @member {Number} clickTimeThreshold
- * @memberof OpenSeadragon.MouseTracker#
- */
- this.clickTimeThreshold = options.clickTimeThreshold || $.DEFAULT_SETTINGS.clickTimeThreshold;
- /**
- * The maximum distance allowed between a pointer down event and a pointer up event
- * to be treated as a click gesture.
- * @member {Number} clickDistThreshold
- * @memberof OpenSeadragon.MouseTracker#
- */
- this.clickDistThreshold = options.clickDistThreshold || $.DEFAULT_SETTINGS.clickDistThreshold;
- /**
- * The number of milliseconds within which two pointer down-up event combinations
- * will be treated as a double-click gesture.
- * @member {Number} dblClickTimeThreshold
- * @memberof OpenSeadragon.MouseTracker#
- */
- this.dblClickTimeThreshold = options.dblClickTimeThreshold || $.DEFAULT_SETTINGS.dblClickTimeThreshold;
- /**
- * The maximum distance allowed between two pointer click events
- * to be treated as a click gesture.
- * @member {Number} clickDistThreshold
- * @memberof OpenSeadragon.MouseTracker#
- */
- this.dblClickDistThreshold = options.dblClickDistThreshold || $.DEFAULT_SETTINGS.dblClickDistThreshold;
- 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.nonPrimaryPressHandler = options.nonPrimaryPressHandler || null;
- this.releaseHandler = options.releaseHandler || null;
- this.nonPrimaryReleaseHandler = options.nonPrimaryReleaseHandler || null;
- this.moveHandler = options.moveHandler || null;
- this.scrollHandler = options.scrollHandler || null;
- this.clickHandler = options.clickHandler || null;
- this.dblClickHandler = options.dblClickHandler || null;
- this.dragHandler = options.dragHandler || null;
- this.dragEndHandler = options.dragEndHandler || null;
- this.pinchHandler = options.pinchHandler || null;
- this.stopHandler = options.stopHandler || null;
- this.keyDownHandler = options.keyDownHandler || null;
- this.keyUpHandler = options.keyUpHandler || null;
- this.keyHandler = options.keyHandler || null;
- this.focusHandler = options.focusHandler || null;
- this.blurHandler = options.blurHandler || null;
-
- //Store private properties in a scope sealed hash map
- var _this = this;
-
- /**
- * @private
- * @property {Boolean} tracking
- * Are we currently tracking pointer events for this element.
- */
- THIS[ this.hash ] = {
- click: function ( event ) { onClick( _this, event ); },
- dblclick: function ( event ) { onDblClick( _this, event ); },
- keydown: function ( event ) { onKeyDown( _this, event ); },
- keyup: function ( event ) { onKeyUp( _this, event ); },
- keypress: function ( event ) { onKeyPress( _this, event ); },
- focus: function ( event ) { onFocus( _this, event ); },
- blur: function ( event ) { onBlur( _this, event ); },
-
- wheel: function ( event ) { onWheel( _this, event ); },
- mousewheel: function ( event ) { onMouseWheel( _this, event ); },
- DOMMouseScroll: function ( event ) { onMouseWheel( _this, event ); },
- MozMousePixelScroll: function ( event ) { onMouseWheel( _this, event ); },
-
- mouseenter: function ( event ) { onMouseEnter( _this, event ); }, // Used on IE8 only
- mouseleave: function ( event ) { onMouseLeave( _this, event ); }, // Used on IE8 only
- mouseover: function ( event ) { onMouseOver( _this, event ); },
- mouseout: function ( event ) { onMouseOut( _this, event ); },
- mousedown: function ( event ) { onMouseDown( _this, event ); },
- mouseup: function ( event ) { onMouseUp( _this, event ); },
- mouseupcaptured: function ( event ) { onMouseUpCaptured( _this, event ); },
- mousemove: function ( event ) { onMouseMove( _this, event ); },
- mousemovecaptured: function ( event ) { onMouseMoveCaptured( _this, event ); },
-
- touchstart: function ( event ) { onTouchStart( _this, event ); },
- touchend: function ( event ) { onTouchEnd( _this, event ); },
- touchendcaptured: function ( event ) { onTouchEndCaptured( _this, event ); },
- touchmove: function ( event ) { onTouchMove( _this, event ); },
- touchmovecaptured: function ( event ) { onTouchMoveCaptured( _this, event ); },
- touchcancel: function ( event ) { onTouchCancel( _this, event ); },
-
- gesturestart: function ( event ) { onGestureStart( _this, event ); },
- gesturechange: function ( event ) { onGestureChange( _this, event ); },
-
- pointerover: function ( event ) { onPointerOver( _this, event ); },
- MSPointerOver: function ( event ) { onPointerOver( _this, event ); },
- pointerout: function ( event ) { onPointerOut( _this, event ); },
- MSPointerOut: function ( event ) { onPointerOut( _this, event ); },
- pointerdown: function ( event ) { onPointerDown( _this, event ); },
- MSPointerDown: function ( event ) { onPointerDown( _this, event ); },
- pointerup: function ( event ) { onPointerUp( _this, event ); },
- MSPointerUp: function ( event ) { onPointerUp( _this, event ); },
- pointermove: function ( event ) { onPointerMove( _this, event ); },
- MSPointerMove: function ( event ) { onPointerMove( _this, event ); },
- pointercancel: function ( event ) { onPointerCancel( _this, event ); },
- MSPointerCancel: function ( event ) { onPointerCancel( _this, event ); },
- pointerupcaptured: function ( event ) { onPointerUpCaptured( _this, event ); },
- pointermovecaptured: function ( event ) { onPointerMoveCaptured( _this, event ); },
-
- tracking: false,
-
- // Active pointers lists. Array of GesturePointList objects, one for each pointer device type.
- // GesturePointList objects are added each time a pointer is tracked by a new pointer device type (see getActivePointersListByType()).
- // Active pointers are any pointer being tracked for this element which are in the hit-test area
- // of the element (for hover-capable devices) and/or have contact or a button press initiated in the element.
- activePointersLists: [],
-
- // Tracking for double-click gesture
- lastClickPos: null,
- dblClickTimeOut: null,
-
- // Tracking for pinch gesture
- pinchGPoints: [],
- lastPinchDist: 0,
- currentPinchDist: 0,
- lastPinchCenter: null,
- currentPinchCenter: null
- };
-
- if ( !options.startDisabled ) {
- this.setTracking( true );
- }
- };
-
- /** @lends OpenSeadragon.MouseTracker.prototype */
- $.MouseTracker.prototype = {
-
- /**
- * Clean up any events or objects created by the tracker.
- * @function
- */
- destroy: function () {
- var i;
-
- stopTracking( this );
- this.element = null;
-
- for ( i = 0; i < MOUSETRACKERS.length; i++ ) {
- if ( MOUSETRACKERS[ i ] === this ) {
- MOUSETRACKERS.splice( i, 1 );
- break;
- }
- }
-
- THIS[ this.hash ] = null;
- delete THIS[ this.hash ];
- },
-
- /**
- * Are we currently tracking events on this element.
- * @deprecated Just use this.tracking
- * @function
- * @returns {Boolean} Are we currently tracking events on this element.
- */
- isTracking: function () {
- return THIS[ this.hash ].tracking;
- },
-
- /**
- * Enable or disable whether or not we are tracking events on this element.
- * @function
- * @param {Boolean} track True to start tracking, false to stop tracking.
- * @returns {OpenSeadragon.MouseTracker} Chainable.
- */
- setTracking: function ( track ) {
- if ( track ) {
- startTracking( this );
- } else {
- stopTracking( this );
- }
- //chain
- return this;
- },
-
- /**
- * Returns the {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} for the given pointer device type,
- * creating and caching a new {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} if one doesn't already exist for the type.
- * @function
- * @param {String} type - The pointer device type: "mouse", "touch", "pen", etc.
- * @returns {OpenSeadragon.MouseTracker.GesturePointList}
- */
- getActivePointersListByType: function ( type ) {
- var delegate = THIS[ this.hash ],
- i,
- len = delegate.activePointersLists.length,
- list;
-
- for ( i = 0; i < len; i++ ) {
- if ( delegate.activePointersLists[ i ].type === type ) {
- return delegate.activePointersLists[ i ];
- }
- }
-
- list = new $.MouseTracker.GesturePointList( type );
- delegate.activePointersLists.push( list );
- return list;
- },
-
- /**
- * Returns the total number of pointers currently active on the tracked element.
- * @function
- * @returns {Number}
- */
- getActivePointerCount: function () {
- var delegate = THIS[ this.hash ],
- i,
- len = delegate.activePointersLists.length,
- count = 0;
-
- for ( i = 0; i < len; i++ ) {
- count += delegate.activePointersLists[ i ].getLength();
- }
-
- return count;
- },
-
- /**
- * Implement or assign implementation to these handlers during or after
- * calling the constructor.
- * @function
- * @param {Object} event
- * @param {OpenSeadragon.MouseTracker} event.eventSource
- * A reference to the tracker instance.
- * @param {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {Number} event.pointers
- * Number of pointers (all types) active in the tracked element.
- * @param {Boolean} event.insideElementPressed
- * True if the left mouse button is currently being pressed and was
- * initiated inside the tracked element, otherwise false.
- * @param {Boolean} event.buttonDownAny
- * Was the button down anywhere in the screen during the event. <span style="color:red;">Deprecated. Use buttons instead.</span>
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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 {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {Number} event.pointers
- * Number of pointers (all types) active in the tracked element.
- * @param {Boolean} event.insideElementPressed
- * True if the left mouse button is currently being pressed and was
- * initiated inside the tracked element, otherwise false.
- * @param {Boolean} event.buttonDownAny
- * Was the button down anywhere in the screen during the event. <span style="color:red;">Deprecated. Use buttons instead.</span>
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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 {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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 {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.button
- * Button which caused the event.
- * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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.
- */
- nonPrimaryPressHandler: function () { },
-
- /**
- * Implement or assign implementation to these handlers during or after
- * calling the constructor.
- * @function
- * @param {Object} event
- * @param {OpenSeadragon.MouseTracker} event.eventSource
- * A reference to the tracker instance.
- * @param {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {Boolean} event.insideElementPressed
- * True if the left mouse button is currently being pressed and was
- * initiated inside the tracked element, otherwise false.
- * @param {Boolean} event.insideElementReleased
- * True if the cursor inside the tracked element when the button was released.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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 {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.button
- * Button which caused the event.
- * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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.
- */
- nonPrimaryReleaseHandler: function () { },
-
- /**
- * Implement or assign implementation to these handlers during or after
- * calling the constructor.
- * @function
- * @param {Object} event
- * @param {OpenSeadragon.MouseTracker} event.eventSource
- * A reference to the tracker instance.
- * @param {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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 {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.scroll
- * The scroll delta for the event.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead. Touch devices no longer generate scroll event.</span>
- * @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 {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Boolean} event.quick
- * True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for ignoring drag events.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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 {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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.
- */
- dblClickHandler: function () { },
-
- /**
- * Implement or assign implementation to these handlers during or after
- * calling the constructor.
- * @function
- * @param {Object} event
- * @param {OpenSeadragon.MouseTracker} event.eventSource
- * A reference to the tracker instance.
- * @param {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {OpenSeadragon.Point} event.delta
- * The x,y components of the difference between the current position and the last drag event position. Useful for ignoring or weighting the events.
- * @param {Number} event.speed
- * Current computed speed, in pixels per second.
- * @param {Number} event.direction
- * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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 {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.speed
- * Speed at the end of a drag gesture, in pixels per second.
- * @param {Number} event.direction
- * Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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.
- */
- dragEndHandler: function () { },
-
- /**
- * Implement or assign implementation to these handlers during or after
- * calling the constructor.
- * @function
- * @param {Object} event
- * @param {OpenSeadragon.MouseTracker} event.eventSource
- * A reference to the tracker instance.
- * @param {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} event.gesturePoints
- * Gesture points associated with the gesture. Velocity data can be found here.
- * @param {OpenSeadragon.Point} event.lastCenter
- * The previous center point of the two pinch contact points relative to the tracked element.
- * @param {OpenSeadragon.Point} event.center
- * The center point of the two pinch contact points relative to the tracked element.
- * @param {Number} event.lastDistance
- * The previous distance between the two pinch contact points in CSS pixels.
- * @param {Number} event.distance
- * The distance between the two pinch contact points in CSS pixels.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Object} event.originalEvent
- * The original event object.
- * @param {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.
- */
- pinchHandler: function () { },
-
- /**
- * Implement or assign implementation to these handlers during or after
- * calling the constructor.
- * @function
- * @param {Object} event
- * @param {OpenSeadragon.MouseTracker} event.eventSource
- * A reference to the tracker instance.
- * @param {String} event.pointerType
- * "mouse", "touch", "pen", etc.
- * @param {OpenSeadragon.Point} event.position
- * The position of the event relative to the tracked element.
- * @param {Number} event.buttons
- * Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @param {Boolean} event.isTouchEvent
- * True if the original event is a touch event, otherwise false. <span style="color:red;">Deprecated. Use pointerType and/or originalEvent instead.</span>
- * @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.ctrl
- * True if the ctrl key was pressed during this event.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Boolean} event.alt
- * True if the alt key was pressed during this event.
- * @param {Boolean} event.meta
- * True if the meta key was pressed during this event.
- * @param {Object} event.originalEvent
- * The original event object.
- * @param {Boolean} event.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.
- */
- keyDownHandler: function () { },
-
- /**
- * Implement or assign implementation to these handlers during or after
- * calling the constructor.
- * @function
- * @param {Object} event
- * @param {OpenSeadragon.MouseTracker} event.eventSource
- * A reference to the tracker instance.
- * @param {Number} event.keyCode
- * The key code that was pressed.
- * @param {Boolean} event.ctrl
- * True if the ctrl key was pressed during this event.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Boolean} event.alt
- * True if the alt key was pressed during this event.
- * @param {Boolean} event.meta
- * True if the meta key was pressed during this event.
- * @param {Object} event.originalEvent
- * The original event object.
- * @param {Boolean} event.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.
- */
- keyUpHandler: function () { },
-
- /**
- * Implement or assign implementation to these handlers during or after
- * calling the constructor.
- * @function
- * @param {Object} event
- * @param {OpenSeadragon.MouseTracker} event.eventSource
- * A reference to the tracker instance.
- * @param {Number} event.keyCode
- * The key code that was pressed.
- * @param {Boolean} event.ctrl
- * True if the ctrl key was pressed during this event.
- * @param {Boolean} event.shift
- * True if the shift key was pressed during this event.
- * @param {Boolean} event.alt
- * True if the alt key was pressed during this event.
- * @param {Boolean} event.meta
- * True if the meta key was pressed during this event.
- * @param {Object} event.originalEvent
- * The original event object.
- * @param {Boolean} event.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 () { }
- };
-
-
- /**
- * Provides continuous computation of velocity (speed and direction) of active pointers.
- * This is a singleton, used by all MouseTracker instances, as it is unlikely there will ever be more than
- * two active gesture pointers at a time.
- *
- * @private
- * @member gesturePointVelocityTracker
- * @memberof OpenSeadragon.MouseTracker
- */
- $.MouseTracker.gesturePointVelocityTracker = (function () {
- var trackerPoints = [],
- intervalId = 0,
- lastTime = 0;
-
- // Generates a unique identifier for a tracked gesture point
- var _generateGuid = function ( tracker, gPoint ) {
- return tracker.hash.toString() + gPoint.type + gPoint.id.toString();
- };
-
- // Interval timer callback. Computes velocity for all tracked gesture points.
- var _doTracking = function () {
- var i,
- len = trackerPoints.length,
- trackPoint,
- gPoint,
- now = $.now(),
- elapsedTime,
- distance,
- speed;
-
- elapsedTime = now - lastTime;
- lastTime = now;
-
- for ( i = 0; i < len; i++ ) {
- trackPoint = trackerPoints[ i ];
- gPoint = trackPoint.gPoint;
- // Math.atan2 gives us just what we need for a velocity vector, as we can simply
- // use cos()/sin() to extract the x/y velocity components.
- gPoint.direction = Math.atan2( gPoint.currentPos.y - trackPoint.lastPos.y, gPoint.currentPos.x - trackPoint.lastPos.x );
- // speed = distance / elapsed time
- distance = trackPoint.lastPos.distanceTo( gPoint.currentPos );
- trackPoint.lastPos = gPoint.currentPos;
- speed = 1000 * distance / ( elapsedTime + 1 );
- // Simple biased average, favors the most recent speed computation. Smooths out erratic gestures a bit.
- gPoint.speed = 0.75 * speed + 0.25 * gPoint.speed;
- }
- };
-
- // Public. Add a gesture point to be tracked
- var addPoint = function ( tracker, gPoint ) {
- var guid = _generateGuid( tracker, gPoint );
-
- trackerPoints.push(
- {
- guid: guid,
- gPoint: gPoint,
- lastPos: gPoint.currentPos
- } );
-
- // Only fire up the interval timer when there's gesture pointers to track
- if ( trackerPoints.length === 1 ) {
- lastTime = $.now();
- intervalId = window.setInterval( _doTracking, 50 );
- }
- };
-
- // Public. Stop tracking a gesture point
- var removePoint = function ( tracker, gPoint ) {
- var guid = _generateGuid( tracker, gPoint ),
- i,
- len = trackerPoints.length;
- for ( i = 0; i < len; i++ ) {
- if ( trackerPoints[ i ].guid === guid ) {
- trackerPoints.splice( i, 1 );
- // Only run the interval timer if theres gesture pointers to track
- len--;
- if ( len === 0 ) {
- window.clearInterval( intervalId );
- }
- break;
- }
- }
- };
-
- return {
- addPoint: addPoint,
- removePoint: removePoint
- };
- } )();
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Pointer event model and feature detection
-///////////////////////////////////////////////////////////////////////////////
-
- $.MouseTracker.captureElement = document;
-
- /**
- * Detect available mouse wheel event name.
- */
- $.MouseTracker.wheelEventName = ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version > 8 ) ||
- ( 'onwheel' in document.createElement( 'div' ) ) ? 'wheel' : // Modern browsers support 'wheel'
- document.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least 'mousewheel'
- 'DOMMouseScroll'; // Assume old Firefox
-
- /**
- * Detect legacy mouse capture support.
- */
- $.MouseTracker.supportsMouseCapture = (function () {
- var divElement = document.createElement( 'div' );
- return $.isFunction( divElement.setCapture ) && $.isFunction( divElement.releaseCapture );
- }());
-
- /**
- * Detect browser pointer device event model(s) and build appropriate list of events to subscribe to.
- */
- $.MouseTracker.subscribeEvents = [ "click", "dblclick", "keydown", "keyup", "keypress", "focus", "blur", $.MouseTracker.wheelEventName ];
-
- if( $.MouseTracker.wheelEventName == "DOMMouseScroll" ) {
- // Older Firefox
- $.MouseTracker.subscribeEvents.push( "MozMousePixelScroll" );
- }
-
- // Note: window.navigator.pointerEnable is deprecated on IE 11 and not part of W3C spec.
- if ( window.PointerEvent && ( window.navigator.pointerEnabled || $.Browser.vendor !== $.BROWSERS.IE ) ) {
- // IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents)
- $.MouseTracker.havePointerEvents = true;
- $.MouseTracker.subscribeEvents.push( "pointerover", "pointerout", "pointerdown", "pointerup", "pointermove", "pointercancel" );
- $.MouseTracker.unprefixedPointerEvents = true;
- if( navigator.maxTouchPoints ) {
- $.MouseTracker.maxTouchPoints = navigator.maxTouchPoints;
- } else {
- $.MouseTracker.maxTouchPoints = 0;
- }
- $.MouseTracker.haveMouseEnter = false;
- } else if ( window.MSPointerEvent && window.navigator.msPointerEnabled ) {
- // IE10
- $.MouseTracker.havePointerEvents = true;
- $.MouseTracker.subscribeEvents.push( "MSPointerOver", "MSPointerOut", "MSPointerDown", "MSPointerUp", "MSPointerMove", "MSPointerCancel" );
- $.MouseTracker.unprefixedPointerEvents = false;
- if( navigator.msMaxTouchPoints ) {
- $.MouseTracker.maxTouchPoints = navigator.msMaxTouchPoints;
- } else {
- $.MouseTracker.maxTouchPoints = 0;
- }
- $.MouseTracker.haveMouseEnter = false;
- } else {
- // Legacy W3C mouse events
- $.MouseTracker.havePointerEvents = false;
- if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
- $.MouseTracker.subscribeEvents.push( "mouseenter", "mouseleave" );
- $.MouseTracker.haveMouseEnter = true;
- } else {
- $.MouseTracker.subscribeEvents.push( "mouseover", "mouseout" );
- $.MouseTracker.haveMouseEnter = false;
- }
- $.MouseTracker.subscribeEvents.push( "mousedown", "mouseup", "mousemove" );
- if ( 'ontouchstart' in window ) {
- // iOS, Android, and other W3c Touch Event implementations
- // (see http://www.w3.org/TR/touch-events/)
- // (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)
- // (see https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)
- $.MouseTracker.subscribeEvents.push( "touchstart", "touchend", "touchmove", "touchcancel" );
- }
- if ( 'ongesturestart' in window ) {
- // iOS (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)
- // Subscribe to these to prevent default gesture handling
- $.MouseTracker.subscribeEvents.push( "gesturestart", "gesturechange" );
- }
- $.MouseTracker.mousePointerId = "legacy-mouse";
- $.MouseTracker.maxTouchPoints = 10;
- }
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Classes and typedefs
-///////////////////////////////////////////////////////////////////////////////
-
- /**
- * Represents a point of contact on the screen made by a mouse cursor, pen, touch, or other pointer device.
- *
- * @typedef {Object} GesturePoint
- * @memberof OpenSeadragon.MouseTracker
- *
- * @property {Number} id
- * Identifier unique from all other active GesturePoints for a given pointer device.
- * @property {String} type
- * The pointer device type: "mouse", "touch", "pen", etc.
- * @property {Boolean} captured
- * True if events for the gesture point are captured to the tracked element.
- * @property {Boolean} isPrimary
- * True if the gesture point is a master pointer amongst the set of active pointers for each pointer type. True for mouse and primary (first) touch/pen pointers.
- * @property {Boolean} insideElementPressed
- * True if button pressed or contact point initiated inside the screen area of the tracked element.
- * @property {Boolean} insideElement
- * True if pointer or contact point is currently inside the bounds of the tracked element.
- * @property {Number} speed
- * Current computed speed, in pixels per second.
- * @property {Number} direction
- * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.
- * @property {OpenSeadragon.Point} contactPos
- * The initial pointer contact position, relative to the page including any scrolling. Only valid if the pointer has contact (pressed, touch contact, pen contact).
- * @property {Number} contactTime
- * The initial pointer contact time, in milliseconds. Only valid if the pointer has contact (pressed, touch contact, pen contact).
- * @property {OpenSeadragon.Point} lastPos
- * The last pointer position, relative to the page including any scrolling.
- * @property {Number} lastTime
- * The last pointer contact time, in milliseconds.
- * @property {OpenSeadragon.Point} currentPos
- * The current pointer position, relative to the page including any scrolling.
- * @property {Number} currentTime
- * The current pointer contact time, in milliseconds.
- */
-
-
- /**
- * @class GesturePointList
- * @classdesc Provides an abstraction for a set of active {@link OpenSeadragon.MouseTracker.GesturePoint|GesturePoint} objects for a given pointer device type.
- * Active pointers are any pointer being tracked for this element which are in the hit-test area
- * of the element (for hover-capable devices) and/or have contact or a button press initiated in the element.
- * @memberof OpenSeadragon.MouseTracker
- * @param {String} type - The pointer device type: "mouse", "touch", "pen", etc.
- */
- $.MouseTracker.GesturePointList = function ( type ) {
- this._gPoints = [];
- /**
- * The pointer device type: "mouse", "touch", "pen", etc.
- * @member {String} type
- * @memberof OpenSeadragon.MouseTracker.GesturePointList#
- */
- this.type = type;
- /**
- * Current buttons pressed for the device.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @member {Number} buttons
- * @memberof OpenSeadragon.MouseTracker.GesturePointList#
- */
- this.buttons = 0;
- /**
- * Current number of contact points (touch points, mouse down, etc.) for the device.
- * @member {Number} contacts
- * @memberof OpenSeadragon.MouseTracker.GesturePointList#
- */
- this.contacts = 0;
- /**
- * Current number of clicks for the device. Used for multiple click gesture tracking.
- * @member {Number} clicks
- * @memberof OpenSeadragon.MouseTracker.GesturePointList#
- */
- this.clicks = 0;
- /**
- * Current number of captured pointers for the device.
- * @member {Number} captureCount
- * @memberof OpenSeadragon.MouseTracker.GesturePointList#
- */
- this.captureCount = 0;
- };
-
- /** @lends OpenSeadragon.MouseTracker.GesturePointList.prototype */
- $.MouseTracker.GesturePointList.prototype = {
- /**
- * @function
- * @returns {Number} Number of gesture points in the list.
- */
- getLength: function () {
- return this._gPoints.length;
- },
- /**
- * @function
- * @returns {Array.<OpenSeadragon.MouseTracker.GesturePoint>} The list of gesture points in the list as an array (read-only).
- */
- asArray: function () {
- return this._gPoints;
- },
- /**
- * @function
- * @param {OpenSeadragon.MouseTracker.GesturePoint} gesturePoint - A gesture point to add to the list.
- * @returns {Number} Number of gesture points in the list.
- */
- add: function ( gp ) {
- return this._gPoints.push( gp );
- },
- /**
- * @function
- * @param {Number} id - The id of the gesture point to remove from the list.
- * @returns {Number} Number of gesture points in the list.
- */
- removeById: function ( id ) {
- var i,
- len = this._gPoints.length;
- for ( i = 0; i < len; i++ ) {
- if ( this._gPoints[ i ].id === id ) {
- this._gPoints.splice( i, 1 );
- break;
- }
- }
- return this._gPoints.length;
- },
- /**
- * @function
- * @param {Number} index - The index of the gesture point to retrieve from the list.
- * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point at the given index, or null if not found.
- */
- getByIndex: function ( index ) {
- if ( index < this._gPoints.length) {
- return this._gPoints[ index ];
- }
-
- return null;
- },
- /**
- * @function
- * @param {Number} id - The id of the gesture point to retrieve from the list.
- * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point with the given id, or null if not found.
- */
- getById: function ( id ) {
- var i,
- len = this._gPoints.length;
- for ( i = 0; i < len; i++ ) {
- if ( this._gPoints[ i ].id === id ) {
- return this._gPoints[ i ];
- }
- }
- return null;
- },
- /**
- * @function
- * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The primary gesture point in the list, or null if not found.
- */
- getPrimary: function ( id ) {
- var i,
- len = this._gPoints.length;
- for ( i = 0; i < len; i++ ) {
- if ( this._gPoints[ i ].isPrimary ) {
- return this._gPoints[ i ];
- }
- }
- return null;
- }
- };
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Utility functions
-///////////////////////////////////////////////////////////////////////////////
-
- /**
- * Removes all tracked pointers.
- * @private
- * @inner
- */
- function clearTrackedPointers( tracker ) {
- var delegate = THIS[ tracker.hash ],
- i,
- pointerListCount = delegate.activePointersLists.length;
-
- for ( i = 0; i < pointerListCount; i++ ) {
- if ( delegate.activePointersLists[ i ].captureCount > 0 ) {
- $.removeEvent(
- $.MouseTracker.captureElement,
- 'mousemove',
- delegate.mousemovecaptured,
- true
- );
- $.removeEvent(
- $.MouseTracker.captureElement,
- 'mouseup',
- delegate.mouseupcaptured,
- true
- );
- $.removeEvent(
- $.MouseTracker.captureElement,
- $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove',
- delegate.pointermovecaptured,
- true
- );
- $.removeEvent(
- $.MouseTracker.captureElement,
- $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp',
- delegate.pointerupcaptured,
- true
- );
- $.removeEvent(
- $.MouseTracker.captureElement,
- 'touchmove',
- delegate.touchmovecaptured,
- true
- );
- $.removeEvent(
- $.MouseTracker.captureElement,
- 'touchend',
- delegate.touchendcaptured,
- true
- );
-
- delegate.activePointersLists[ i ].captureCount = 0;
- }
- }
-
- for ( i = 0; i < pointerListCount; i++ ) {
- delegate.activePointersLists.pop();
- }
- }
-
- /**
- * Starts tracking pointer events on the tracked element.
- * @private
- * @inner
- */
- function startTracking( tracker ) {
- var delegate = THIS[ tracker.hash ],
- event,
- i;
-
- if ( !delegate.tracking ) {
- for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) {
- event = $.MouseTracker.subscribeEvents[ i ];
- $.addEvent(
- tracker.element,
- event,
- delegate[ event ],
- false
- );
- }
-
- clearTrackedPointers( tracker );
-
- delegate.tracking = true;
- }
- }
-
- /**
- * Stops tracking pointer events on the tracked element.
- * @private
- * @inner
- */
- function stopTracking( tracker ) {
- var delegate = THIS[ tracker.hash ],
- event,
- i;
-
- if ( delegate.tracking ) {
- for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) {
- event = $.MouseTracker.subscribeEvents[ i ];
- $.removeEvent(
- tracker.element,
- event,
- delegate[ event ],
- false
- );
- }
-
- clearTrackedPointers( tracker );
-
- delegate.tracking = false;
- }
- }
-
- /**
- * @private
- * @inner
- */
- function getCaptureEventParams( tracker, pointerType ) {
- var delegate = THIS[ tracker.hash ];
-
- if ( pointerType === 'pointerevent' ) {
- return {
- upName: $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp',
- upHandler: delegate.pointerupcaptured,
- moveName: $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove',
- moveHandler: delegate.pointermovecaptured
- };
- } else if ( pointerType === 'mouse' ) {
- return {
- upName: 'mouseup',
- upHandler: delegate.mouseupcaptured,
- moveName: 'mousemove',
- moveHandler: delegate.mousemovecaptured
- };
- } else if ( pointerType === 'touch' ) {
- return {
- upName: 'touchend',
- upHandler: delegate.touchendcaptured,
- moveName: 'touchmove',
- moveHandler: delegate.touchmovecaptured
- };
- } else {
- throw new Error( "MouseTracker.getCaptureEventParams: Unknown pointer type." );
- }
- }
-
- /**
- * Begin capturing pointer events to the tracked element.
- * @private
- * @inner
- */
- function capturePointer( tracker, pointerType, pointerCount ) {
- var pointsList = tracker.getActivePointersListByType( pointerType ),
- eventParams;
-
- pointsList.captureCount += (pointerCount || 1);
-
- if ( pointsList.captureCount === 1 ) {
- if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
- tracker.element.setCapture( true );
- } else {
- eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType );
- // We emulate mouse capture by hanging listeners on the document object.
- // (Note we listen on the capture phase so the captured handlers will get called first)
- if (isInIframe && canAccessEvents(window.top)) {
- $.addEvent(
- window.top,
- eventParams.upName,
- eventParams.upHandler,
- true
- );
- }
- $.addEvent(
- $.MouseTracker.captureElement,
- eventParams.upName,
- eventParams.upHandler,
- true
- );
- $.addEvent(
- $.MouseTracker.captureElement,
- eventParams.moveName,
- eventParams.moveHandler,
- true
- );
- }
- }
- }
-
-
- /**
- * Stop capturing pointer events to the tracked element.
- * @private
- * @inner
- */
- function releasePointer( tracker, pointerType, pointerCount ) {
- var pointsList = tracker.getActivePointersListByType( pointerType ),
- eventParams;
-
- pointsList.captureCount -= (pointerCount || 1);
-
- if ( pointsList.captureCount === 0 ) {
- if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
- tracker.element.releaseCapture();
- } else {
- eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType );
- // We emulate mouse capture by hanging listeners on the document object.
- // (Note we listen on the capture phase so the captured handlers will get called first)
- if (isInIframe && canAccessEvents(window.top)) {
- $.removeEvent(
- window.top,
- eventParams.upName,
- eventParams.upHandler,
- true
- );
- }
- $.removeEvent(
- $.MouseTracker.captureElement,
- eventParams.moveName,
- eventParams.moveHandler,
- true
- );
- $.removeEvent(
- $.MouseTracker.captureElement,
- eventParams.upName,
- eventParams.upHandler,
- true
- );
- }
- }
- }
-
-
- /**
- * Gets a W3C Pointer Events model compatible pointer type string from a DOM pointer event.
- * IE10 used a long integer value, but the W3C specification (and IE11+) use a string "mouse", "touch", "pen", etc.
- * @private
- * @inner
- */
- function getPointerType( event ) {
- var pointerTypeStr;
- if ( $.MouseTracker.unprefixedPointerEvents ) {
- pointerTypeStr = event.pointerType;
- } else {
- // IE10
- // MSPOINTER_TYPE_TOUCH: 0x00000002
- // MSPOINTER_TYPE_PEN: 0x00000003
- // MSPOINTER_TYPE_MOUSE: 0x00000004
- switch( event.pointerType )
- {
- case 0x00000002:
- pointerTypeStr = 'touch';
- break;
- case 0x00000003:
- pointerTypeStr = 'pen';
- break;
- case 0x00000004:
- pointerTypeStr = 'mouse';
- break;
- default:
- pointerTypeStr = '';
- }
- }
- return pointerTypeStr;
- }
-
-
- /**
- * @private
- * @inner
- */
- function getMouseAbsolute( event ) {
- return $.getMousePosition( event );
- }
-
- /**
- * @private
- * @inner
- */
- function getMouseRelative( event, element ) {
- return getPointRelativeToAbsolute( getMouseAbsolute( event ), element );
- }
-
- /**
- * @private
- * @inner
- */
- function getPointRelativeToAbsolute( point, element ) {
- var offset = $.getElementOffset( element );
- return point.minus( offset );
- }
-
- /**
- * @private
- * @inner
- */
- function getCenterPoint( point1, point2 ) {
- return new $.Point( ( point1.x + point2.x ) / 2, ( point1.y + point2.y ) / 2 );
- }
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Device-specific DOM event handlers
-///////////////////////////////////////////////////////////////////////////////
-
- /**
- * @private
- * @inner
- */
- function onClick( tracker, event ) {
- if ( tracker.clickHandler ) {
- $.cancelEvent( event );
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onDblClick( tracker, event ) {
- if ( tracker.dblClickHandler ) {
- $.cancelEvent( event );
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onKeyDown( tracker, event ) {
- //$.console.log( "keydown %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );
- var propagate;
- if ( tracker.keyDownHandler ) {
- event = $.getEvent( event );
- propagate = tracker.keyDownHandler(
- {
- eventSource: tracker,
- keyCode: event.keyCode ? event.keyCode : event.charCode,
- ctrl: event.ctrlKey,
- shift: event.shiftKey,
- alt: event.altKey,
- meta: event.metaKey,
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( !propagate ) {
- $.cancelEvent( event );
- }
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onKeyUp( tracker, event ) {
- //$.console.log( "keyup %s %s %s %s %s", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );
- var propagate;
- if ( tracker.keyUpHandler ) {
- event = $.getEvent( event );
- propagate = tracker.keyUpHandler(
- {
- eventSource: tracker,
- keyCode: event.keyCode ? event.keyCode : event.charCode,
- ctrl: event.ctrlKey,
- shift: event.shiftKey,
- alt: event.altKey,
- meta: event.metaKey,
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( !propagate ) {
- $.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 ) {
- event = $.getEvent( event );
- propagate = tracker.keyHandler(
- {
- eventSource: tracker,
- keyCode: event.keyCode ? event.keyCode : event.charCode,
- ctrl: event.ctrlKey,
- shift: event.shiftKey,
- alt: event.altKey,
- meta: event.metaKey,
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( !propagate ) {
- $.cancelEvent( event );
- }
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onFocus( tracker, event ) {
- //console.log( "focus %s", event );
- var propagate;
- if ( tracker.focusHandler ) {
- event = $.getEvent( event );
- 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 ) {
- event = $.getEvent( event );
- propagate = tracker.blurHandler(
- {
- eventSource: tracker,
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- }
-
-
- /**
- * Handler for 'wheel' events
- *
- * @private
- * @inner
- */
- function onWheel( tracker, event ) {
- handleWheelEvent( tracker, event, event );
- }
-
-
- /**
- * Handler for 'mousewheel', 'DOMMouseScroll', and 'MozMousePixelScroll' events
- *
- * @private
- * @inner
- */
- function onMouseWheel( tracker, event ) {
- event = $.getEvent( 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 );
- }
-
-
- /**
- * Handles 'wheel' events.
- * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()).
- *
- * @private
- * @inner
- */
- function handleWheelEvent( tracker, event, originalEvent ) {
- var nDelta = 0,
- propagate;
-
- // 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,
- pointerType: 'mouse',
- position: getMouseRelative( event, tracker.element ),
- scroll: nDelta,
- shift: event.shiftKey,
- isTouchEvent: false,
- originalEvent: originalEvent,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( originalEvent );
- }
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function isParentChild( parent, child )
- {
- if ( parent === child ) {
- return false;
- }
- while ( child && child !== parent ) {
- child = child.parentNode;
- }
- return child === parent;
- }
-
-
- /**
- * Only used on IE 8
- *
- * @private
- * @inner
- */
- function onMouseEnter( tracker, event ) {
- event = $.getEvent( event );
-
- handleMouseEnter( tracker, event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onMouseOver( tracker, event ) {
- event = $.getEvent( event );
-
- if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) {
- return;
- }
-
- handleMouseEnter( tracker, event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handleMouseEnter( tracker, event ) {
- var gPoint = {
- id: $.MouseTracker.mousePointerId,
- type: 'mouse',
- isPrimary: true,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- updatePointersEnter( tracker, event, [ gPoint ] );
- }
-
-
- /**
- * Only used on IE 8
- *
- * @private
- * @inner
- */
- function onMouseLeave( tracker, event ) {
- event = $.getEvent( event );
-
- handleMouseExit( tracker, event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onMouseOut( tracker, event ) {
- event = $.getEvent( event );
-
- if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) {
- return;
- }
-
- handleMouseExit( tracker, event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handleMouseExit( tracker, event ) {
- var gPoint = {
- id: $.MouseTracker.mousePointerId,
- type: 'mouse',
- isPrimary: true,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- updatePointersExit( tracker, event, [ gPoint ] );
- }
-
-
- /**
- * Returns a W3C DOM level 3 standard button value given an event.button property:
- * -1 == none, 0 == primary/left, 1 == middle, 2 == secondary/right, 3 == X1/back, 4 == X2/forward, 5 == eraser (pen)
- * @private
- * @inner
- */
- function getStandardizedButton( button ) {
- if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
- // On IE 8, 0 == none, 1 == left, 2 == right, 3 == left and right, 4 == middle, 5 == left and middle, 6 == right and middle, 7 == all three
- // TODO: Support chorded (multiple) button presses on IE 8?
- if ( button === 1 ) {
- return 0;
- } else if ( button === 2 ) {
- return 2;
- } else if ( button === 4 ) {
- return 1;
- } else {
- return -1;
- }
- } else {
- return button;
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onMouseDown( tracker, event ) {
- var gPoint;
-
- event = $.getEvent( event );
-
- gPoint = {
- id: $.MouseTracker.mousePointerId,
- type: 'mouse',
- isPrimary: true,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- if ( updatePointersDown( tracker, event, [ gPoint ], getStandardizedButton( event.button ) ) ) {
- $.stopEvent( event );
- capturePointer( tracker, 'mouse' );
- }
-
- if ( tracker.clickHandler || tracker.dblClickHandler || tracker.pressHandler || tracker.dragHandler || tracker.dragEndHandler ) {
- $.cancelEvent( event );
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onMouseUp( tracker, event ) {
- handleMouseUp( tracker, event );
- }
-
- /**
- * This handler is attached to the window object (on the capture phase) to emulate mouse capture.
- * onMouseUp is still attached to the tracked element, so stop propagation to avoid processing twice.
- *
- * @private
- * @inner
- */
- function onMouseUpCaptured( tracker, event ) {
- handleMouseUp( tracker, event );
- $.stopEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handleMouseUp( tracker, event ) {
- var gPoint;
-
- event = $.getEvent( event );
-
- gPoint = {
- id: $.MouseTracker.mousePointerId,
- type: 'mouse',
- isPrimary: true,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- if ( updatePointersUp( tracker, event, [ gPoint ], getStandardizedButton( event.button ) ) ) {
- releasePointer( tracker, 'mouse' );
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onMouseMove( tracker, event ) {
- handleMouseMove( tracker, event );
- }
-
-
- /**
- * This handler is attached to the window object (on the capture phase) to emulate mouse capture.
- * onMouseMove is still attached to the tracked element, so stop propagation to avoid processing twice.
- *
- * @private
- * @inner
- */
- function onMouseMoveCaptured( tracker, event ) {
- handleMouseMove( tracker, event );
- $.stopEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handleMouseMove( tracker, event ) {
- var gPoint;
-
- event = $.getEvent( event );
-
- gPoint = {
- id: $.MouseTracker.mousePointerId,
- type: 'mouse',
- isPrimary: true,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- updatePointersMove( tracker, event, [ gPoint ] );
- }
-
-
- /**
- * @private
- * @inner
- */
- function abortTouchContacts( tracker, event, pointsList ) {
- var i,
- gPointCount = pointsList.getLength(),
- abortGPoints = [];
-
- for ( i = 0; i < gPointCount; i++ ) {
- abortGPoints.push( pointsList.getByIndex( i ) );
- }
-
- if ( abortGPoints.length > 0 ) {
- // simulate touchend
- updatePointersUp( tracker, event, abortGPoints, 0 ); // 0 means primary button press/release or touch contact
- // release pointer capture
- pointsList.captureCount = 1;
- releasePointer( tracker, 'touch' );
- // simulate touchleave
- updatePointersExit( tracker, event, abortGPoints );
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onTouchStart( tracker, event ) {
- var time,
- i,
- j,
- touchCount = event.changedTouches.length,
- gPoints = [],
- parentGPoints,
- pointsList = tracker.getActivePointersListByType( 'touch' );
-
- time = $.now();
-
- if ( pointsList.getLength() > event.touches.length - touchCount ) {
- $.console.warn('Tracked touch contact count doesn\'t match event.touches.length. Removing all tracked touch pointers.');
- abortTouchContacts( tracker, event, pointsList );
- }
-
- for ( i = 0; i < touchCount; i++ ) {
- gPoints.push( {
- id: event.changedTouches[ i ].identifier,
- type: 'touch',
- // isPrimary not set - let the updatePointers functions determine it
- currentPos: getMouseAbsolute( event.changedTouches[ i ] ),
- currentTime: time
- } );
- }
-
- // simulate touchenter on our tracked element
- updatePointersEnter( tracker, event, gPoints );
-
- // simulate touchenter on our tracked element's tracked ancestor elements
- for ( i = 0; i < MOUSETRACKERS.length; i++ ) {
- if ( MOUSETRACKERS[ i ] !== tracker && MOUSETRACKERS[ i ].isTracking() && isParentChild( MOUSETRACKERS[ i ].element, tracker.element ) ) {
- parentGPoints = [];
- for ( j = 0; j < touchCount; j++ ) {
- parentGPoints.push( {
- id: event.changedTouches[ j ].identifier,
- type: 'touch',
- // isPrimary not set - let the updatePointers functions determine it
- currentPos: getMouseAbsolute( event.changedTouches[ j ] ),
- currentTime: time
- } );
- }
- updatePointersEnter( MOUSETRACKERS[ i ], event, parentGPoints );
- }
- }
-
- if ( updatePointersDown( tracker, event, gPoints, 0 ) ) { // 0 means primary button press/release or touch contact
- $.stopEvent( event );
- capturePointer( tracker, 'touch', touchCount );
- }
-
- $.cancelEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onTouchEnd( tracker, event ) {
- handleTouchEnd( tracker, event );
- }
-
-
- /**
- * This handler is attached to the window object (on the capture phase) to emulate pointer capture.
- * onTouchEnd is still attached to the tracked element, so stop propagation to avoid processing twice.
- *
- * @private
- * @inner
- */
- function onTouchEndCaptured( tracker, event ) {
- handleTouchEnd( tracker, event );
- $.stopEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handleTouchEnd( tracker, event ) {
- var time,
- i,
- j,
- touchCount = event.changedTouches.length,
- gPoints = [],
- parentGPoints;
-
- time = $.now();
-
- for ( i = 0; i < touchCount; i++ ) {
- gPoints.push( {
- id: event.changedTouches[ i ].identifier,
- type: 'touch',
- // isPrimary not set - let the updatePointers functions determine it
- currentPos: getMouseAbsolute( event.changedTouches[ i ] ),
- currentTime: time
- } );
- }
-
- if ( updatePointersUp( tracker, event, gPoints, 0 ) ) {
- releasePointer( tracker, 'touch', touchCount );
- }
-
- // simulate touchleave on our tracked element
- updatePointersExit( tracker, event, gPoints );
-
- // simulate touchleave on our tracked element's tracked ancestor elements
- for ( i = 0; i < MOUSETRACKERS.length; i++ ) {
- if ( MOUSETRACKERS[ i ] !== tracker && MOUSETRACKERS[ i ].isTracking() && isParentChild( MOUSETRACKERS[ i ].element, tracker.element ) ) {
- parentGPoints = [];
- for ( j = 0; j < touchCount; j++ ) {
- parentGPoints.push( {
- id: event.changedTouches[ j ].identifier,
- type: 'touch',
- // isPrimary not set - let the updatePointers functions determine it
- currentPos: getMouseAbsolute( event.changedTouches[ j ] ),
- currentTime: time
- } );
- }
- updatePointersExit( MOUSETRACKERS[ i ], event, parentGPoints );
- }
- }
-
- $.cancelEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onTouchMove( tracker, event ) {
- handleTouchMove( tracker, event );
- }
-
-
- /**
- * This handler is attached to the window object (on the capture phase) to emulate pointer capture.
- * onTouchMove is still attached to the tracked element, so stop propagation to avoid processing twice.
- *
- * @private
- * @inner
- */
- function onTouchMoveCaptured( tracker, event ) {
- handleTouchMove( tracker, event );
- $.stopEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handleTouchMove( tracker, event ) {
- var i,
- touchCount = event.changedTouches.length,
- gPoints = [];
-
- for ( i = 0; i < touchCount; i++ ) {
- gPoints.push( {
- id: event.changedTouches[ i ].identifier,
- type: 'touch',
- // isPrimary not set - let the updatePointers functions determine it
- currentPos: getMouseAbsolute( event.changedTouches[ i ] ),
- currentTime: $.now()
- } );
- }
-
- updatePointersMove( tracker, event, gPoints );
-
- $.cancelEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onTouchCancel( tracker, event ) {
- var i,
- touchCount = event.changedTouches.length,
- gPoints = [],
- pointsList = tracker.getActivePointersListByType( 'touch' );
-
- abortTouchContacts( tracker, event, pointsList );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onGestureStart( tracker, event ) {
- event.stopPropagation();
- event.preventDefault();
- return false;
- }
-
-
- /**
- * @private
- * @inner
- */
- function onGestureChange( tracker, event ) {
- event.stopPropagation();
- event.preventDefault();
- return false;
- }
-
-
- /**
- * @private
- * @inner
- */
- function onPointerOver( tracker, event ) {
- var gPoint;
-
- if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) {
- return;
- }
-
- gPoint = {
- id: event.pointerId,
- type: getPointerType( event ),
- isPrimary: event.isPrimary,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- updatePointersEnter( tracker, event, [ gPoint ] );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onPointerOut( tracker, event ) {
- var gPoint;
-
- if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) {
- return;
- }
-
- gPoint = {
- id: event.pointerId,
- type: getPointerType( event ),
- isPrimary: event.isPrimary,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- updatePointersExit( tracker, event, [ gPoint ] );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onPointerDown( tracker, event ) {
- var gPoint;
-
- gPoint = {
- id: event.pointerId,
- type: getPointerType( event ),
- isPrimary: event.isPrimary,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- if ( updatePointersDown( tracker, event, [ gPoint ], event.button ) ) {
- $.stopEvent( event );
- capturePointer( tracker, gPoint.type );
- }
-
- if ( tracker.clickHandler || tracker.dblClickHandler || tracker.pressHandler || tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {
- $.cancelEvent( event );
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onPointerUp( tracker, event ) {
- handlePointerUp( tracker, event );
- }
-
-
- /**
- * This handler is attached to the window object (on the capture phase) to emulate mouse capture.
- * onPointerUp is still attached to the tracked element, so stop propagation to avoid processing twice.
- *
- * @private
- * @inner
- */
- function onPointerUpCaptured( tracker, event ) {
- var pointsList = tracker.getActivePointersListByType( getPointerType( event ) );
- if ( pointsList.getById( event.pointerId ) ) {
- handlePointerUp( tracker, event );
- }
- $.stopEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handlePointerUp( tracker, event ) {
- var gPoint;
-
- gPoint = {
- id: event.pointerId,
- type: getPointerType( event ),
- isPrimary: event.isPrimary,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- if ( updatePointersUp( tracker, event, [ gPoint ], event.button ) ) {
- releasePointer( tracker, gPoint.type );
- }
- }
-
-
- /**
- * @private
- * @inner
- */
- function onPointerMove( tracker, event ) {
- handlePointerMove( tracker, event );
- }
-
-
- /**
- * This handler is attached to the window object (on the capture phase) to emulate mouse capture.
- * onPointerMove is still attached to the tracked element, so stop propagation to avoid processing twice.
- *
- * @private
- * @inner
- */
- function onPointerMoveCaptured( tracker, event ) {
- var pointsList = tracker.getActivePointersListByType( getPointerType( event ) );
- if ( pointsList.getById( event.pointerId ) ) {
- handlePointerMove( tracker, event );
- }
- $.stopEvent( event );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handlePointerMove( tracker, event ) {
- // Pointer changed coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height)
- var gPoint;
-
- gPoint = {
- id: event.pointerId,
- type: getPointerType( event ),
- isPrimary: event.isPrimary,
- currentPos: getMouseAbsolute( event ),
- currentTime: $.now()
- };
-
- updatePointersMove( tracker, event, [ gPoint ] );
- }
-
-
- /**
- * @private
- * @inner
- */
- function onPointerCancel( tracker, event ) {
- var gPoint;
-
- gPoint = {
- id: event.pointerId,
- type: getPointerType( event )
- };
-
- updatePointersCancel( tracker, event, [ gPoint ] );
- }
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Device-agnostic DOM event handlers
-///////////////////////////////////////////////////////////////////////////////
-
- /**
- * @function
- * @private
- * @inner
- * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList
- * The GesturePointList to track the pointer in.
- * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint
- * Gesture point to track.
- * @returns {Number} Number of gesture points in pointsList.
- */
- function startTrackingPointer( pointsList, gPoint ) {
-
- // If isPrimary is not known for the pointer then set it according to our rules:
- // true if the first pointer in the gesture, otherwise false
- if ( !gPoint.hasOwnProperty( 'isPrimary' ) ) {
- if ( pointsList.getLength() === 0 ) {
- gPoint.isPrimary = true;
- } else {
- gPoint.isPrimary = false;
- }
- }
- gPoint.speed = 0;
- gPoint.direction = 0;
- gPoint.contactPos = gPoint.currentPos;
- gPoint.contactTime = gPoint.currentTime;
- gPoint.lastPos = gPoint.currentPos;
- gPoint.lastTime = gPoint.currentTime;
-
- return pointsList.add( gPoint );
- }
-
-
- /**
- * @function
- * @private
- * @inner
- * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList
- * The GesturePointList to stop tracking the pointer on.
- * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint
- * Gesture point to stop tracking.
- * @returns {Number} Number of gesture points in pointsList.
- */
- function stopTrackingPointer( pointsList, gPoint ) {
- var listLength,
- primaryPoint;
-
- if ( pointsList.getById( gPoint.id ) ) {
- listLength = pointsList.removeById( gPoint.id );
-
- // If isPrimary is not known for the pointer and we just removed the primary pointer from the list then we need to set another pointer as primary
- if ( !gPoint.hasOwnProperty( 'isPrimary' ) ) {
- primaryPoint = pointsList.getPrimary();
- if ( !primaryPoint ) {
- primaryPoint = pointsList.getByIndex( 0 );
- if ( primaryPoint ) {
- primaryPoint.isPrimary = true;
- }
- }
- }
- } else {
- listLength = pointsList.getLength();
- }
-
- return listLength;
- }
-
-
- /**
- * @function
- * @private
- * @inner
- * @param {OpenSeadragon.MouseTracker} tracker
- * A reference to the MouseTracker instance.
- * @param {Object} event
- * A reference to the originating DOM event.
- * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints
- * Gesture points associated with the event.
- */
- function updatePointersEnter( tracker, event, gPoints ) {
- var pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),
- i,
- gPointCount = gPoints.length,
- curGPoint,
- updateGPoint,
- propagate;
-
- for ( i = 0; i < gPointCount; i++ ) {
- curGPoint = gPoints[ i ];
- updateGPoint = pointsList.getById( curGPoint.id );
-
- if ( updateGPoint ) {
- // Already tracking the pointer...update it
- updateGPoint.insideElement = true;
- updateGPoint.lastPos = updateGPoint.currentPos;
- updateGPoint.lastTime = updateGPoint.currentTime;
- updateGPoint.currentPos = curGPoint.currentPos;
- updateGPoint.currentTime = curGPoint.currentTime;
-
- curGPoint = updateGPoint;
- } else {
- // Initialize for tracking and add to the tracking list
- curGPoint.captured = false;
- curGPoint.insideElementPressed = false;
- curGPoint.insideElement = true;
- startTrackingPointer( pointsList, curGPoint );
- }
-
- // Enter
- if ( tracker.enterHandler ) {
- propagate = tracker.enterHandler(
- {
- eventSource: tracker,
- pointerType: curGPoint.type,
- position: getPointRelativeToAbsolute( curGPoint.currentPos, tracker.element ),
- buttons: pointsList.buttons,
- pointers: tracker.getActivePointerCount(),
- insideElementPressed: curGPoint.insideElementPressed,
- buttonDownAny: pointsList.buttons !== 0,
- isTouchEvent: curGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- }
- }
-
-
- /**
- * @function
- * @private
- * @inner
- * @param {OpenSeadragon.MouseTracker} tracker
- * A reference to the MouseTracker instance.
- * @param {Object} event
- * A reference to the originating DOM event.
- * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints
- * Gesture points associated with the event.
- */
- function updatePointersExit( tracker, event, gPoints ) {
- var delegate = THIS[ tracker.hash ],
- pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),
- i,
- gPointCount = gPoints.length,
- curGPoint,
- updateGPoint,
- propagate;
-
- for ( i = 0; i < gPointCount; i++ ) {
- curGPoint = gPoints[ i ];
- updateGPoint = pointsList.getById( curGPoint.id );
-
- if ( updateGPoint ) {
- // Already tracking the pointer. If captured then update it, else stop tracking it
- if ( updateGPoint.captured ) {
- updateGPoint.insideElement = false;
- updateGPoint.lastPos = updateGPoint.currentPos;
- updateGPoint.lastTime = updateGPoint.currentTime;
- updateGPoint.currentPos = curGPoint.currentPos;
- updateGPoint.currentTime = curGPoint.currentTime;
- } else {
- stopTrackingPointer( pointsList, updateGPoint );
- }
-
- curGPoint = updateGPoint;
- }
-
- // Exit
- if ( tracker.exitHandler ) {
- propagate = tracker.exitHandler(
- {
- eventSource: tracker,
- pointerType: curGPoint.type,
- position: getPointRelativeToAbsolute( curGPoint.currentPos, tracker.element ),
- buttons: pointsList.buttons,
- pointers: tracker.getActivePointerCount(),
- insideElementPressed: updateGPoint ? updateGPoint.insideElementPressed : false,
- buttonDownAny: pointsList.buttons !== 0,
- isTouchEvent: curGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
-
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- }
- }
-
-
- /**
- * @function
- * @private
- * @inner
- * @param {OpenSeadragon.MouseTracker} tracker
- * A reference to the MouseTracker instance.
- * @param {Object} event
- * A reference to the originating DOM event.
- * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints
- * Gesture points associated with the event.
- * @param {Number} buttonChanged
- * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.
- * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model,
- * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events.
- *
- * @returns {Boolean} True if pointers should be captured to the tracked element, otherwise false.
- */
- function updatePointersDown( tracker, event, gPoints, buttonChanged ) {
- var delegate = THIS[ tracker.hash ],
- propagate,
- pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),
- i,
- gPointCount = gPoints.length,
- curGPoint,
- updateGPoint;
-
- if ( typeof event.buttons !== 'undefined' ) {
- pointsList.buttons = event.buttons;
- } else {
- if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
- if ( buttonChanged === 0 ) {
- // Primary
- pointsList.buttons += 1;
- } else if ( buttonChanged === 1 ) {
- // Aux
- pointsList.buttons += 4;
- } else if ( buttonChanged === 2 ) {
- // Secondary
- pointsList.buttons += 2;
- } else if ( buttonChanged === 3 ) {
- // X1 (Back)
- pointsList.buttons += 8;
- } else if ( buttonChanged === 4 ) {
- // X2 (Forward)
- pointsList.buttons += 16;
- } else if ( buttonChanged === 5 ) {
- // Pen Eraser
- pointsList.buttons += 32;
- }
- } else {
- if ( buttonChanged === 0 ) {
- // Primary
- pointsList.buttons |= 1;
- } else if ( buttonChanged === 1 ) {
- // Aux
- pointsList.buttons |= 4;
- } else if ( buttonChanged === 2 ) {
- // Secondary
- pointsList.buttons |= 2;
- } else if ( buttonChanged === 3 ) {
- // X1 (Back)
- pointsList.buttons |= 8;
- } else if ( buttonChanged === 4 ) {
- // X2 (Forward)
- pointsList.buttons |= 16;
- } else if ( buttonChanged === 5 ) {
- // Pen Eraser
- pointsList.buttons |= 32;
- }
- }
- }
-
- // Only capture and track primary button, pen, and touch contacts
- if ( buttonChanged !== 0 ) {
- // Aux Press
- if ( tracker.nonPrimaryPressHandler ) {
- propagate = tracker.nonPrimaryPressHandler(
- {
- eventSource: tracker,
- pointerType: gPoints[ 0 ].type,
- position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ),
- button: buttonChanged,
- buttons: pointsList.buttons,
- isTouchEvent: gPoints[ 0 ].type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
-
- return false;
- }
-
- for ( i = 0; i < gPointCount; i++ ) {
- curGPoint = gPoints[ i ];
- updateGPoint = pointsList.getById( curGPoint.id );
-
- if ( updateGPoint ) {
- // Already tracking the pointer...update it
- updateGPoint.captured = true;
- updateGPoint.insideElementPressed = true;
- updateGPoint.insideElement = true;
- updateGPoint.contactPos = curGPoint.currentPos;
- updateGPoint.contactTime = curGPoint.currentTime;
- updateGPoint.lastPos = updateGPoint.currentPos;
- updateGPoint.lastTime = updateGPoint.currentTime;
- updateGPoint.currentPos = curGPoint.currentPos;
- updateGPoint.currentTime = curGPoint.currentTime;
-
- curGPoint = updateGPoint;
- } else {
- // Initialize for tracking and add to the tracking list (no pointerover or pointermove event occurred before this)
- curGPoint.captured = true;
- curGPoint.insideElementPressed = true;
- curGPoint.insideElement = true;
- startTrackingPointer( pointsList, curGPoint );
- }
-
- pointsList.contacts++;
- //$.console.log('contacts++ ', pointsList.contacts);
-
- if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {
- $.MouseTracker.gesturePointVelocityTracker.addPoint( tracker, curGPoint );
- }
-
- if ( pointsList.contacts === 1 ) {
- // Press
- if ( tracker.pressHandler ) {
- propagate = tracker.pressHandler(
- {
- eventSource: tracker,
- pointerType: curGPoint.type,
- position: getPointRelativeToAbsolute( curGPoint.contactPos, tracker.element ),
- buttons: pointsList.buttons,
- isTouchEvent: curGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- } else if ( pointsList.contacts === 2 ) {
- if ( tracker.pinchHandler && curGPoint.type === 'touch' ) {
- // Initialize for pinch
- delegate.pinchGPoints = pointsList.asArray();
- delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );
- delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );
- }
- }
- }
-
- return true;
- }
-
-
- /**
- * @function
- * @private
- * @inner
- * @param {OpenSeadragon.MouseTracker} tracker
- * A reference to the MouseTracker instance.
- * @param {Object} event
- * A reference to the originating DOM event.
- * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints
- * Gesture points associated with the event.
- * @param {Number} buttonChanged
- * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.
- * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model,
- * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events.
- *
- * @returns {Boolean} True if pointer capture should be released from the tracked element, otherwise false.
- */
- function updatePointersUp( tracker, event, gPoints, buttonChanged ) {
- var delegate = THIS[ tracker.hash ],
- pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),
- propagate,
- insideElementReleased,
- releasePoint,
- releaseTime,
- i,
- gPointCount = gPoints.length,
- curGPoint,
- updateGPoint,
- releaseCapture = false,
- wasCaptured = false,
- quick;
-
- if ( typeof event.buttons !== 'undefined' ) {
- pointsList.buttons = event.buttons;
- } else {
- if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
- if ( buttonChanged === 0 ) {
- // Primary
- pointsList.buttons -= 1;
- } else if ( buttonChanged === 1 ) {
- // Aux
- pointsList.buttons -= 4;
- } else if ( buttonChanged === 2 ) {
- // Secondary
- pointsList.buttons -= 2;
- } else if ( buttonChanged === 3 ) {
- // X1 (Back)
- pointsList.buttons -= 8;
- } else if ( buttonChanged === 4 ) {
- // X2 (Forward)
- pointsList.buttons -= 16;
- } else if ( buttonChanged === 5 ) {
- // Pen Eraser
- pointsList.buttons -= 32;
- }
- } else {
- if ( buttonChanged === 0 ) {
- // Primary
- pointsList.buttons ^= ~1;
- } else if ( buttonChanged === 1 ) {
- // Aux
- pointsList.buttons ^= ~4;
- } else if ( buttonChanged === 2 ) {
- // Secondary
- pointsList.buttons ^= ~2;
- } else if ( buttonChanged === 3 ) {
- // X1 (Back)
- pointsList.buttons ^= ~8;
- } else if ( buttonChanged === 4 ) {
- // X2 (Forward)
- pointsList.buttons ^= ~16;
- } else if ( buttonChanged === 5 ) {
- // Pen Eraser
- pointsList.buttons ^= ~32;
- }
- }
- }
-
- // Only capture and track primary button, pen, and touch contacts
- if ( buttonChanged !== 0 ) {
- // Aux Release
- if ( tracker.nonPrimaryReleaseHandler ) {
- propagate = tracker.nonPrimaryReleaseHandler(
- {
- eventSource: tracker,
- pointerType: gPoints[ 0 ].type,
- position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ),
- button: buttonChanged,
- buttons: pointsList.buttons,
- isTouchEvent: gPoints[ 0 ].type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
-
- return false;
- }
-
- for ( i = 0; i < gPointCount; i++ ) {
- curGPoint = gPoints[ i ];
- updateGPoint = pointsList.getById( curGPoint.id );
-
- if ( updateGPoint ) {
- // Update the pointer, stop tracking it if not still in this element
- if ( updateGPoint.captured ) {
- updateGPoint.captured = false;
- releaseCapture = true;
- wasCaptured = true;
- }
- updateGPoint.lastPos = updateGPoint.currentPos;
- updateGPoint.lastTime = updateGPoint.currentTime;
- updateGPoint.currentPos = curGPoint.currentPos;
- updateGPoint.currentTime = curGPoint.currentTime;
- if ( !updateGPoint.insideElement ) {
- stopTrackingPointer( pointsList, updateGPoint );
- }
-
- releasePoint = updateGPoint.currentPos;
- releaseTime = updateGPoint.currentTime;
-
- if ( wasCaptured ) {
- // Pointer was activated in our element but could have been removed in any element since events are captured to our element
-
- pointsList.contacts--;
- //$.console.log('contacts-- ', pointsList.contacts);
-
- if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {
- $.MouseTracker.gesturePointVelocityTracker.removePoint( tracker, updateGPoint );
- }
-
- if ( pointsList.contacts === 0 ) {
-
- // Release (pressed in our element)
- if ( tracker.releaseHandler ) {
- propagate = tracker.releaseHandler(
- {
- eventSource: tracker,
- pointerType: updateGPoint.type,
- position: getPointRelativeToAbsolute( releasePoint, tracker.element ),
- buttons: pointsList.buttons,
- insideElementPressed: updateGPoint.insideElementPressed,
- insideElementReleased: updateGPoint.insideElement,
- isTouchEvent: updateGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
-
- // Drag End
- if ( tracker.dragEndHandler && !updateGPoint.currentPos.equals( updateGPoint.contactPos ) ) {
- propagate = tracker.dragEndHandler(
- {
- eventSource: tracker,
- pointerType: updateGPoint.type,
- position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),
- speed: updateGPoint.speed,
- direction: updateGPoint.direction,
- shift: event.shiftKey,
- isTouchEvent: updateGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
-
- // Click / Double-Click
- if ( ( tracker.clickHandler || tracker.dblClickHandler ) && updateGPoint.insideElement ) {
- quick = releaseTime - updateGPoint.contactTime <= tracker.clickTimeThreshold &&
- updateGPoint.contactPos.distanceTo( releasePoint ) <= tracker.clickDistThreshold;
-
- // Click
- if ( tracker.clickHandler ) {
- propagate = tracker.clickHandler(
- {
- eventSource: tracker,
- pointerType: updateGPoint.type,
- position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),
- quick: quick,
- shift: event.shiftKey,
- isTouchEvent: updateGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
-
- // Double-Click
- if ( tracker.dblClickHandler && quick ) {
- pointsList.clicks++;
- if ( pointsList.clicks === 1 ) {
- delegate.lastClickPos = releasePoint;
- /*jshint loopfunc:true*/
- delegate.dblClickTimeOut = setTimeout( function() {
- pointsList.clicks = 0;
- }, tracker.dblClickTimeThreshold );
- /*jshint loopfunc:false*/
- } else if ( pointsList.clicks === 2 ) {
- clearTimeout( delegate.dblClickTimeOut );
- pointsList.clicks = 0;
- if ( delegate.lastClickPos.distanceTo( releasePoint ) <= tracker.dblClickDistThreshold ) {
- propagate = tracker.dblClickHandler(
- {
- eventSource: tracker,
- pointerType: updateGPoint.type,
- position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),
- shift: event.shiftKey,
- isTouchEvent: updateGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- delegate.lastClickPos = null;
- }
- }
- }
- } else if ( pointsList.contacts === 2 ) {
- if ( tracker.pinchHandler && updateGPoint.type === 'touch' ) {
- // Reset for pinch
- delegate.pinchGPoints = pointsList.asArray();
- delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );
- delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );
- }
- }
- } else {
- // Pointer was activated in another element but removed in our element
-
- // Release (pressed in another element)
- if ( tracker.releaseHandler ) {
- propagate = tracker.releaseHandler(
- {
- eventSource: tracker,
- pointerType: updateGPoint.type,
- position: getPointRelativeToAbsolute( releasePoint, tracker.element ),
- buttons: pointsList.buttons,
- insideElementPressed: updateGPoint.insideElementPressed,
- insideElementReleased: updateGPoint.insideElement,
- isTouchEvent: updateGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- }
- }
- }
-
- return releaseCapture;
- }
-
-
- /**
- * Call when pointer(s) change coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height)
- *
- * @function
- * @private
- * @inner
- * @param {OpenSeadragon.MouseTracker} tracker
- * A reference to the MouseTracker instance.
- * @param {Object} event
- * A reference to the originating DOM event.
- * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints
- * Gesture points associated with the event.
- */
- function updatePointersMove( tracker, event, gPoints ) {
- var delegate = THIS[ tracker.hash ],
- pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),
- i,
- gPointCount = gPoints.length,
- curGPoint,
- updateGPoint,
- gPointArray,
- delta,
- propagate;
-
- if ( typeof event.buttons !== 'undefined' ) {
- pointsList.buttons = event.buttons;
- }
-
- for ( i = 0; i < gPointCount; i++ ) {
- curGPoint = gPoints[ i ];
- updateGPoint = pointsList.getById( curGPoint.id );
-
- if ( updateGPoint ) {
- // Already tracking the pointer...update it
- if ( curGPoint.hasOwnProperty( 'isPrimary' ) ) {
- updateGPoint.isPrimary = curGPoint.isPrimary;
- }
- updateGPoint.lastPos = updateGPoint.currentPos;
- updateGPoint.lastTime = updateGPoint.currentTime;
- updateGPoint.currentPos = curGPoint.currentPos;
- updateGPoint.currentTime = curGPoint.currentTime;
- } else {
- // Initialize for tracking and add to the tracking list (no pointerover or pointerdown event occurred before this)
- curGPoint.captured = false;
- curGPoint.insideElementPressed = false;
- curGPoint.insideElement = true;
- startTrackingPointer( pointsList, curGPoint );
- }
- }
-
- // Stop (mouse only)
- if ( tracker.stopHandler && gPoints[ 0 ].type === 'mouse' ) {
- clearTimeout( tracker.stopTimeOut );
- tracker.stopTimeOut = setTimeout( function() {
- handlePointerStop( tracker, event, gPoints[ 0 ].type );
- }, tracker.stopDelay );
- }
-
- if ( pointsList.contacts === 0 ) {
- // Move (no contacts: hovering mouse or other hover-capable device)
- if ( tracker.moveHandler ) {
- propagate = tracker.moveHandler(
- {
- eventSource: tracker,
- pointerType: gPoints[ 0 ].type,
- position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ),
- buttons: pointsList.buttons,
- isTouchEvent: gPoints[ 0 ].type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- } else if ( pointsList.contacts === 1 ) {
- // Move (1 contact)
- if ( tracker.moveHandler ) {
- updateGPoint = pointsList.asArray()[ 0 ];
- propagate = tracker.moveHandler(
- {
- eventSource: tracker,
- pointerType: updateGPoint.type,
- position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),
- buttons: pointsList.buttons,
- isTouchEvent: updateGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
-
- // Drag
- if ( tracker.dragHandler ) {
- updateGPoint = pointsList.asArray()[ 0 ];
- delta = updateGPoint.currentPos.minus( updateGPoint.lastPos );
- propagate = tracker.dragHandler(
- {
- eventSource: tracker,
- pointerType: updateGPoint.type,
- position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),
- buttons: pointsList.buttons,
- delta: delta,
- speed: updateGPoint.speed,
- direction: updateGPoint.direction,
- shift: event.shiftKey,
- isTouchEvent: updateGPoint.type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- } else if ( pointsList.contacts === 2 ) {
- // Move (2 contacts, use center)
- if ( tracker.moveHandler ) {
- gPointArray = pointsList.asArray();
- propagate = tracker.moveHandler(
- {
- eventSource: tracker,
- pointerType: gPointArray[ 0 ].type,
- position: getPointRelativeToAbsolute( getCenterPoint( gPointArray[ 0 ].currentPos, gPointArray[ 1 ].currentPos ), tracker.element ),
- buttons: pointsList.buttons,
- isTouchEvent: gPointArray[ 0 ].type === 'touch',
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
-
- // Pinch
- if ( tracker.pinchHandler && gPoints[ 0 ].type === 'touch' ) {
- delta = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );
- if ( delta != delegate.currentPinchDist ) {
- delegate.lastPinchDist = delegate.currentPinchDist;
- delegate.currentPinchDist = delta;
- delegate.lastPinchCenter = delegate.currentPinchCenter;
- delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );
- propagate = tracker.pinchHandler(
- {
- eventSource: tracker,
- pointerType: 'touch',
- gesturePoints: delegate.pinchGPoints,
- lastCenter: getPointRelativeToAbsolute( delegate.lastPinchCenter, tracker.element ),
- center: getPointRelativeToAbsolute( delegate.currentPinchCenter, tracker.element ),
- lastDistance: delegate.lastPinchDist,
- distance: delegate.currentPinchDist,
- shift: event.shiftKey,
- originalEvent: event,
- preventDefaultAction: false,
- userData: tracker.userData
- }
- );
- if ( propagate === false ) {
- $.cancelEvent( event );
- }
- }
- }
- }
- }
-
-
- /**
- * @function
- * @private
- * @inner
- * @param {OpenSeadragon.MouseTracker} tracker
- * A reference to the MouseTracker instance.
- * @param {Object} event
- * A reference to the originating DOM event.
- * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints
- * Gesture points associated with the event.
- */
- function updatePointersCancel( tracker, event, gPoints ) {
- updatePointersUp( tracker, event, gPoints, 0 );
- updatePointersExit( tracker, event, gPoints );
- }
-
-
- /**
- * @private
- * @inner
- */
- function handlePointerStop( tracker, originalMoveEvent, pointerType ) {
- if ( tracker.stopHandler ) {
- tracker.stopHandler( {
- eventSource: tracker,
- pointerType: pointerType,
- position: getMouseRelative( originalMoveEvent, tracker.element ),
- buttons: tracker.getActivePointersListByType( pointerType ).buttons,
- isTouchEvent: pointerType === 'touch',
- originalEvent: originalMoveEvent,
- preventDefaultAction: false,
- userData: tracker.userData
- } );
- }
- }
-
- // True if inside an iframe, otherwise false.
- // @member {Boolean} isInIframe
- // @private
- // @inner
- var isInIframe = (function() {
- try {
- return window.self !== window.top;
- } catch (e) {
- return true;
- }
- })();
-
- // @function
- // @private
- // @inner
- // @returns {Boolean} True if the target has access rights to events, otherwise false.
- function canAccessEvents (target) {
- try {
- return target.addEventListener && target.removeEventListener;
- } catch (e) {
- return false;
- }
- }
-
-} ( 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( "div" );
- this.wrapper.style.display = "inline-block";
- if ( this.anchor == $.ControlAnchor.NONE ) {
- // IE6 fix
- this.wrapper.style.width = this.wrapper.style.height = "100%";
- }
- }
- this.wrapper.appendChild( this.element );
-
- if (options.attachToViewer ) {
- if ( this.anchor == $.ControlAnchor.TOP_RIGHT ||
- this.anchor == $.ControlAnchor.BOTTOM_RIGHT ) {
- this.container.insertBefore(
- this.wrapper,
- this.container.firstChild
- );
- } else {
- this.container.appendChild( this.wrapper );
- }
- } else {
- parent.appendChild( this.wrapper );
- }
-};
-
-/** @lends OpenSeadragon.Control.prototype */
-$.Control.prototype = {
-
- /**
- * Removes the control from the container.
- * @function
- */
- destroy: function() {
- this.wrapper.removeChild( this.element );
- 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( 'div' ),
- controls: []
- }, options );
-
- // Disable the form's submit; otherwise button clicks and return keys
- // can trigger it.
- this.container.onsubmit = function() {
- return false;
- };
-
- if( this.element ){
- this.element = $.getElement( this.element );
- this.element.appendChild( this.container );
- this.element.style.position = 'relative';
- this.container.style.width = '100%';
- this.container.style.height = '100%';
- }
-
- for( i = 0; i < layouts.length; i++ ){
- layout = layouts[ i ];
- this.controls[ layout ] = $.makeNeutralElement( "div" );
- this.controls[ layout ].style.position = 'absolute';
- if ( layout.match( 'left' ) ){
- this.controls[ layout ].style.left = '0px';
- }
- if ( layout.match( 'right' ) ){
- this.controls[ layout ].style.right = '0px';
- }
- if ( layout.match( 'top' ) ){
- this.controls[ layout ].style.top = '0px';
- }
- if ( layout.match( 'bottom' ) ){
- this.controls[ layout ].style.bottom = '0px';
- }
- }
-
- this.container.appendChild( this.controls.topleft );
- this.container.appendChild( this.controls.topright );
- this.container.appendChild( this.controls.bottomright );
- this.container.appendChild( this.controls.bottomleft );
- };
-
- /** @lends OpenSeadragon.ControlDock.prototype */
- $.ControlDock.prototype = {
-
- /**
- * @function
- */
- addControl: function ( element, controlOptions ) {
- element = $.getElement( element );
- var div = null;
-
- if ( getControlIndex( this, element ) >= 0 ) {
- return; // they're trying to add a duplicate control
- }
-
- switch ( controlOptions.anchor ) {
- case $.ControlAnchor.TOP_RIGHT:
- div = this.controls.topright;
- element.style.position = "relative";
- element.style.paddingRight = "0px";
- element.style.paddingTop = "0px";
- break;
- case $.ControlAnchor.BOTTOM_RIGHT:
- div = this.controls.bottomright;
- element.style.position = "relative";
- element.style.paddingRight = "0px";
- element.style.paddingBottom = "0px";
- break;
- case $.ControlAnchor.BOTTOM_LEFT:
- div = this.controls.bottomleft;
- element.style.position = "relative";
- element.style.paddingLeft = "0px";
- element.style.paddingBottom = "0px";
- break;
- case $.ControlAnchor.TOP_LEFT:
- div = this.controls.topleft;
- element.style.position = "relative";
- element.style.paddingLeft = "0px";
- element.style.paddingTop = "0px";
- break;
- case $.ControlAnchor.ABSOLUTE:
- div = this.container;
- element.style.margin = "0px";
- element.style.padding = "0px";
- break;
- default:
- case $.ControlAnchor.NONE:
- div = this.container;
- element.style.margin = "0px";
- element.style.padding = "0px";
- break;
- }
-
- this.controls.push(
- new $.Control( element, controlOptions, div )
- );
- element.style.display = "inline-block";
- },
-
-
- /**
- * @function
- * @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 - Placement
- *
- * Copyright (C) 2010-2016 OpenSeadragon contributors
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * - Neither the name of CodePlex Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-(function($) {
-
- /**
- * An enumeration of positions to anchor an element.
- * @member Placement
- * @memberOf OpenSeadragon
- * @static
- * @readonly
- * @property {OpenSeadragon.Placement} CENTER
- * @property {OpenSeadragon.Placement} TOP_LEFT
- * @property {OpenSeadragon.Placement} TOP
- * @property {OpenSeadragon.Placement} TOP_RIGHT
- * @property {OpenSeadragon.Placement} RIGHT
- * @property {OpenSeadragon.Placement} BOTTOM_RIGHT
- * @property {OpenSeadragon.Placement} BOTTOM
- * @property {OpenSeadragon.Placement} BOTTOM_LEFT
- * @property {OpenSeadragon.Placement} LEFT
- */
- $.Placement = $.freezeObject({
- CENTER: 0,
- TOP_LEFT: 1,
- TOP: 2,
- TOP_RIGHT: 3,
- RIGHT: 4,
- BOTTOM_RIGHT: 5,
- BOTTOM: 6,
- BOTTOM_LEFT: 7,
- LEFT: 8,
- properties: {
- 0: {
- isLeft: false,
- isHorizontallyCentered: true,
- isRight: false,
- isTop: false,
- isVerticallyCentered: true,
- isBottom: false
- },
- 1: {
- isLeft: true,
- isHorizontallyCentered: false,
- isRight: false,
- isTop: true,
- isVerticallyCentered: false,
- isBottom: false
- },
- 2: {
- isLeft: false,
- isHorizontallyCentered: true,
- isRight: false,
- isTop: true,
- isVerticallyCentered: false,
- isBottom: false
- },
- 3: {
- isLeft: false,
- isHorizontallyCentered: false,
- isRight: true,
- isTop: true,
- isVerticallyCentered: false,
- isBottom: false
- },
- 4: {
- isLeft: false,
- isHorizontallyCentered: false,
- isRight: true,
- isTop: false,
- isVerticallyCentered: true,
- isBottom: false
- },
- 5: {
- isLeft: false,
- isHorizontallyCentered: false,
- isRight: true,
- isTop: false,
- isVerticallyCentered: false,
- isBottom: true
- },
- 6: {
- isLeft: false,
- isHorizontallyCentered: true,
- isRight: false,
- isTop: false,
- isVerticallyCentered: false,
- isBottom: true
- },
- 7: {
- isLeft: true,
- isHorizontallyCentered: false,
- isRight: false,
- isTop: false,
- isVerticallyCentered: false,
- isBottom: true
- },
- 8: {
- isLeft: true,
- isHorizontallyCentered: false,
- isRight: false,
- isTop: false,
- isVerticallyCentered: true,
- isBottom: false
- }
- }
- });
-
-}(OpenSeadragon));
-
-/*
- * OpenSeadragon - Viewer
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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 = {};
-var nextHash = 1;
-
-/**
- *
- * The main point of entry into creating a zoomable image on the page.<br>
- * <br>
- * We have provided an idiomatic javascript constructor which takes
- * a single object, but still support the legacy positional arguments.<br>
- * <br>
- * 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.<br>
- * <br>
- * To create a viewer, you can use either of this methods:<br>
- * <ul>
- * <li><code>var viewer = new OpenSeadragon.Viewer(options);</code></li>
- * <li><code>var viewer = OpenSeadragon(options);</code></li>
- * </ul>
- * @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
- };
- }
-
- //options.config and the general config argument are deprecated
- //in favor of the more direct specification of optional settings
- //being pass directly on the options object
- if ( options.config ){
- $.extend( true, options, options.config );
- delete options.config;
- }
-
- //Public properties
- //Allow the options object to override global defaults
- $.extend( true, this, {
-
- //internal state and dom identifiers
- id: options.id,
- hash: options.hash || nextHash++,
-
- //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;div&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;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,
-
- // Overlays list. An overlay allows to add html on top of the viewer.
- overlays: [],
- // Container inside the canvas where overlays are drawn.
- overlaysContainer: null,
-
- //private state properties
- previousBody: [],
-
- //This was originally initialized in the constructor and so could never
- //have anything in it. now it can because we allow it to be specified
- //in the options and is only empty by default if not specified. Also
- //this array was returned from get_controls which I find confusing
- //since this object has a controls property which is treated in other
- //functions like clearControls. I'm removing the accessors.
- customControls: [],
-
- //These are originally not part options but declared as members
- //in initialize. It's still considered idiomatic to put them here
- source: null,
- /**
- * Handles rendering of tiles in the viewer. Created for each TileSource opened.
- * @member {OpenSeadragon.Drawer} drawer
- * @memberof OpenSeadragon.Viewer#
- */
- drawer: null,
- world: null,
- /**
- * Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened.
- * @member {OpenSeadragon.Viewport} viewport
- * @memberof OpenSeadragon.Viewer#
- */
- viewport: null,
- /**
- * @member {OpenSeadragon.Navigator} navigator
- * @memberof OpenSeadragon.Viewer#
- */
- navigator: null,
-
- //A collection viewport is a separate viewport used to provide
- //simultaneous rendering of sets of tiles
- collectionViewport: null,
- collectionDrawer: null,
-
- //UI image resources
- //TODO: rename navImages to uiImages
- navImages: null,
-
- //interface button controls
- 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,
- "fullPage": false,
- "onfullscreenchange": null
- };
-
- this._sequenceIndex = 0;
- this._firstOpen = true;
- this._updateRequestId = null;
- this._loadQueue = [];
- this.currentOverlays = [];
-
- this._lastScrollTime = $.now(); // variable used to help normalize the scroll event speed of different devices
-
- //Inherit some behaviors and properties
- $.EventSource.call( this );
-
- this.addHandler( 'open-failed', function ( event ) {
- var msg = $.getString( "Errors.OpenFailed", event.eventSource, event.message);
- _this._showMessage( msg );
- });
-
- $.ControlDock.call( this, options );
-
- //Deal with tile sources
- if ( this.xmlPath ){
- //Deprecated option. Now it is preferred to use the tileSources option
- this.tileSources = [ this.xmlPath ];
- }
-
- this.element = this.element || document.getElementById( this.id );
- this.canvas = $.makeNeutralElement( "div" );
-
- this.canvas.className = "openseadragon-canvas";
- (function( style ){
- style.width = "100%";
- style.height = "100%";
- style.overflow = "hidden";
- style.position = "absolute";
- style.top = "0px";
- style.left = "0px";
- }(this.canvas.style));
- $.setElementTouchActionNone( this.canvas );
- if (options.tabIndex !== "") {
- this.canvas.tabIndex = (options.tabIndex === undefined ? 0 : options.tabIndex);
- }
-
- //the container is created through applying the ControlDock constructor above
- this.container.className = "openseadragon-container";
- (function( style ){
- style.width = "100%";
- style.height = "100%";
- style.position = "relative";
- style.overflow = "hidden";
- style.left = "0px";
- style.top = "0px";
- style.textAlign = "left"; // needed to protect against
- }( this.container.style ));
-
- this.container.insertBefore( this.canvas, this.container.firstChild );
- this.element.appendChild( this.container );
-
- //Used for toggling between fullscreen and default container size
- //TODO: these can be closure private and shared across Viewer
- // instances.
- this.bodyWidth = document.body.style.width;
- this.bodyHeight = document.body.style.height;
- this.bodyOverflow = document.body.style.overflow;
- this.docOverflow = document.documentElement.style.overflow;
-
- this.innerTracker = new $.MouseTracker({
- element: this.canvas,
- startDisabled: this.mouseNavEnabled ? false : true,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- dblClickTimeThreshold: this.dblClickTimeThreshold,
- dblClickDistThreshold: this.dblClickDistThreshold,
- keyDownHandler: $.delegate( this, onCanvasKeyDown ),
- keyHandler: $.delegate( this, onCanvasKeyPress ),
- clickHandler: $.delegate( this, onCanvasClick ),
- dblClickHandler: $.delegate( this, onCanvasDblClick ),
- dragHandler: $.delegate( this, onCanvasDrag ),
- dragEndHandler: $.delegate( this, onCanvasDragEnd ),
- enterHandler: $.delegate( this, onCanvasEnter ),
- exitHandler: $.delegate( this, onCanvasExit ),
- pressHandler: $.delegate( this, onCanvasPress ),
- releaseHandler: $.delegate( this, onCanvasRelease ),
- nonPrimaryPressHandler: $.delegate( this, onCanvasNonPrimaryPress ),
- nonPrimaryReleaseHandler: $.delegate( this, onCanvasNonPrimaryRelease ),
- scrollHandler: $.delegate( this, onCanvasScroll ),
- pinchHandler: $.delegate( this, onCanvasPinch )
- });
-
- this.outerTracker = new $.MouseTracker({
- element: this.container,
- startDisabled: this.mouseNavEnabled ? false : true,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- dblClickTimeThreshold: this.dblClickTimeThreshold,
- dblClickDistThreshold: this.dblClickDistThreshold,
- enterHandler: $.delegate( this, onContainerEnter ),
- exitHandler: $.delegate( this, onContainerExit )
- });
-
- if( this.toolbar ){
- this.toolbar = new $.ControlDock({ element: this.toolbar });
- }
-
- this.bindStandardControls();
-
- THIS[ this.hash ].prevContainerSize = _getSafeElemSize( this.container );
-
- // Create the world
- this.world = new $.World({
- viewer: this
- });
-
- this.world.addHandler('add-item', function(event) {
- // For backwards compatibility, we maintain the source property
- _this.source = _this.world.getItemAt(0).source;
-
- THIS[ _this.hash ].forceRedraw = true;
-
- if (!_this._updateRequestId) {
- _this._updateRequestId = scheduleUpdate( _this, updateMulti );
- }
- });
-
- this.world.addHandler('remove-item', function(event) {
- // For backwards compatibility, we maintain the source property
- if (_this.world.getItemCount()) {
- _this.source = _this.world.getItemAt(0).source;
- } else {
- _this.source = null;
- }
-
- THIS[ _this.hash ].forceRedraw = true;
- });
-
- this.world.addHandler('metrics-change', function(event) {
- if (_this.viewport) {
- _this.viewport._setContentBounds(_this.world.getHomeBounds(), _this.world.getContentFactor());
- }
- });
-
- this.world.addHandler('item-index-change', function(event) {
- // For backwards compatibility, we maintain the source property
- _this.source = _this.world.getItemAt(0).source;
- });
-
- // Create the viewport
- this.viewport = new $.Viewport({
- containerSize: THIS[ this.hash ].prevContainerSize,
- springStiffness: this.springStiffness,
- animationTime: this.animationTime,
- minZoomImageRatio: this.minZoomImageRatio,
- maxZoomPixelRatio: this.maxZoomPixelRatio,
- visibilityRatio: this.visibilityRatio,
- wrapHorizontal: this.wrapHorizontal,
- wrapVertical: this.wrapVertical,
- defaultZoomLevel: this.defaultZoomLevel,
- minZoomLevel: this.minZoomLevel,
- maxZoomLevel: this.maxZoomLevel,
- viewer: this,
- degrees: this.degrees,
- navigatorRotate: this.navigatorRotate,
- homeFillsViewer: this.homeFillsViewer,
- margins: this.viewportMargins
- });
-
- this.viewport._setContentBounds(this.world.getHomeBounds(), this.world.getContentFactor());
-
- // Create the image loader
- this.imageLoader = new $.ImageLoader({
- jobLimit: this.imageLoaderLimit
- });
-
- // Create the tile cache
- this.tileCache = new $.TileCache({
- maxImageCacheCount: this.maxImageCacheCount
- });
-
- // Create the drawer
- this.drawer = new $.Drawer({
- viewer: this,
- viewport: this.viewport,
- element: this.canvas,
- debugGridColor: this.debugGridColor
- });
-
- // Overlay container
- this.overlaysContainer = $.makeNeutralElement( "div" );
- this.canvas.appendChild( this.overlaysContainer );
-
- // Now that we have a drawer, see if it supports rotate. If not we need to remove the rotate buttons
- if (!this.drawer.canRotate()) {
- // Disable/remove the rotate left/right buttons since they aren't supported
- if (this.rotateLeft) {
- i = this.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.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,
- autoFade: this.navigatorAutoFade,
- prefixUrl: this.prefixUrl,
- viewer: this,
- navigatorRotate: this.navigatorRotate,
- crossOriginPolicy: this.crossOriginPolicy
- });
- }
-
- // Sequence mode
- if (this.sequenceMode) {
- this.bindSequenceControls();
- }
-
- // Open initial tilesources
- if (this.tileSources) {
- this.open( this.tileSources );
- }
-
- // Add custom controls
- for ( i = 0; i < this.customControls.length; i++ ) {
- this.addControl(
- this.customControls[ i ].id,
- {anchor: this.customControls[ i ].anchor}
- );
- }
-
- // Initial fade out
- $.requestAnimationFrame( function(){
- beginControlsAutoHide( _this );
- } );
-};
-
-$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{
-
-
- /**
- * @function
- * @return {Boolean}
- */
- isOpen: function () {
- return !!this.world.getItemCount();
- },
-
- // deprecated
- openDzi: function ( dzi ) {
- $.console.error( "[Viewer.openDzi] this function is deprecated; use Viewer.open() instead." );
- return this.open( dzi );
- },
-
- // deprecated
- openTileSource: function ( tileSource ) {
- $.console.error( "[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead." );
- return this.open( tileSource );
- },
-
- /**
- * Open tiled images into the viewer, closing any others.
- * @function
- * @param {Array|String|Object|Function} tileSources - This can be a TiledImage
- * specifier, a TileSource specifier, or an array of either. A TiledImage specifier
- * is the same as the options parameter for {@link OpenSeadragon.Viewer#addTiledImage},
- * except for the index property; images are added in sequence.
- * A TileSource specifier is anything you could pass as the tileSource property
- * of the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}.
- * @return {OpenSeadragon.Viewer} Chainable.
- * @fires OpenSeadragon.Viewer.event:open
- * @fires OpenSeadragon.Viewer.event:open-failed
- */
- open: function (tileSources) {
- var _this = this;
-
- this.close();
-
- if (!tileSources) {
- return;
- }
-
- if (this.sequenceMode && $.isArray(tileSources)) {
- if (this.referenceStrip) {
- this.referenceStrip.destroy();
- this.referenceStrip = null;
- }
-
- this.tileSources = tileSources;
- this._sequenceIndex = Math.max(0, Math.min(this.tileSources.length - 1, this.initialPage));
- if (this.tileSources.length) {
- this.open(this.tileSources[this._sequenceIndex]);
-
- if ( this.showReferenceStrip ){
- this.referenceStrip = new $.ReferenceStrip({
- id: this.referenceStripElement,
- position: this.referenceStripPosition,
- sizeRatio: this.referenceStripSizeRatio,
- scroll: this.referenceStripScroll,
- height: this.referenceStripHeight,
- width: this.referenceStripWidth,
- tileSources: this.tileSources,
- prefixUrl: this.prefixUrl,
- viewer: this
- });
- }
- }
-
- this._updateSequenceButtons( this._sequenceIndex );
- return;
- }
-
- if (!$.isArray(tileSources)) {
- tileSources = [tileSources];
- }
-
- if (!tileSources.length) {
- return;
- }
-
- this._opening = true;
-
- var expected = tileSources.length;
- var successes = 0;
- var failures = 0;
- var failEvent;
-
- var checkCompletion = function() {
- if (successes + failures === expected) {
- if (successes) {
- if (_this._firstOpen || !_this.preserveViewport) {
- _this.viewport.goHome( true );
- _this.viewport.update();
- }
-
- _this._firstOpen = false;
-
- var source = tileSources[0];
- if (source.tileSource) {
- source = source.tileSource;
- }
-
- // Global overlays
- if( _this.overlays && !_this.preserveOverlays ){
- for ( var i = 0; i < _this.overlays.length; i++ ) {
- _this.currentOverlays[ i ] = getOverlayObject( _this, _this.overlays[ i ] );
- }
- }
-
- _this._drawOverlays();
- _this._opening = false;
-
- /**
- * Raised when the viewer has opened and loaded one or more TileSources.
- *
- * @event open
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {OpenSeadragon.TileSource} source - The tile source that was opened.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- // TODO: what if there are multiple sources?
- _this.raiseEvent( 'open', { source: source } );
- } else {
- _this._opening = false;
-
- /**
- * Raised when an error occurs loading a TileSource.
- *
- * @event open-failed
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {String} message - Information about what failed.
- * @property {String} source - The tile source that failed.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- _this.raiseEvent( 'open-failed', failEvent );
- }
- }
- };
-
- var doOne = function(options) {
- if (!$.isPlainObject(options) || !options.tileSource) {
- options = {
- tileSource: options
- };
- }
-
- if (options.index !== undefined) {
- $.console.error('[Viewer.open] setting indexes here is not supported; use addTiledImage instead');
- delete options.index;
- }
-
- if (options.collectionImmediately === undefined) {
- options.collectionImmediately = true;
- }
-
- var originalSuccess = options.success;
- options.success = function(event) {
- successes++;
-
- // TODO: now that options has other things besides tileSource, the overlays
- // should probably be at the options level, not the tileSource level.
- if (options.tileSource.overlays) {
- for (var i = 0; i < options.tileSource.overlays.length; i++) {
- _this.addOverlay(options.tileSource.overlays[i]);
- }
- }
-
- if (originalSuccess) {
- originalSuccess(event);
- }
-
- checkCompletion();
- };
-
- var originalError = options.error;
- options.error = function(event) {
- failures++;
-
- if (!failEvent) {
- failEvent = event;
- }
-
- if (originalError) {
- originalError(event);
- }
-
- checkCompletion();
- };
-
- _this.addTiledImage(options);
- };
-
- // TileSources
- for (var i = 0; i < tileSources.length; i++) {
- doOne(tileSources[i]);
- }
-
- return this;
- },
-
-
- /**
- * @function
- * @return {OpenSeadragon.Viewer} Chainable.
- * @fires OpenSeadragon.Viewer.event:close
- */
- close: function ( ) {
- if ( !THIS[ this.hash ] ) {
- //this viewer has already been destroyed: returning immediately
- return this;
- }
-
- this._opening = false;
-
- if ( this.navigator ) {
- this.navigator.close();
- }
-
- if( ! this.preserveOverlays) {
- this.clearOverlays();
- this.overlaysContainer.innerHTML = "";
- }
-
- THIS[ this.hash ].animating = false;
- this.world.removeAll();
- this.imageLoader.clear();
-
- /**
- * Raised when the viewer is closed (see {@link OpenSeadragon.Viewer#close}).
- *
- * @event close
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'close' );
-
- return this;
- },
-
-
- /**
- * Function to destroy the viewer and clean up everything created by OpenSeadragon.
- *
- * Example:
- * var viewer = OpenSeadragon({
- * [...]
- * });
- *
- * //when you are done with the viewer:
- * viewer.destroy();
- * viewer = null; //important
- *
- * @function
- */
- destroy: function( ) {
- if ( !THIS[ this.hash ] ) {
- //this viewer has already been destroyed: returning immediately
- return;
- }
-
- this.close();
-
- this.clearOverlays();
- this.overlaysContainer.innerHTML = "";
-
- //TODO: implement this...
- //this.unbindSequenceControls()
- //this.unbindStandardControls()
-
- if (this.referenceStrip) {
- this.referenceStrip.destroy();
- this.referenceStrip = null;
- }
-
- if ( this._updateRequestId !== null ) {
- $.cancelAnimationFrame( this._updateRequestId );
- this._updateRequestId = null;
- }
-
- if ( this.drawer ) {
- this.drawer.destroy();
- }
-
- 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.innerTracker){
- this.innerTracker.destroy();
- }
- if (this.outerTracker){
- this.outerTracker.destroy();
- }
-
- THIS[ this.hash ] = null;
- delete THIS[ this.hash ];
-
- // clear all our references to dom objects
- this.canvas = null;
- this.container = null;
-
- // 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 );
- this.outerTracker.setTracking( enabled );
- /**
- * Raised when mouse/touch navigation is enabled or disabled (see {@link OpenSeadragon.Viewer#setMouseNavEnabled}).
- *
- * @event mouse-enabled
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {Boolean} enabled
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'mouse-enabled', { enabled: enabled } );
- return this;
- },
-
-
- /**
- * @function
- * @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.docWidth = docStyle.width;
- bodyStyle.width = "100%";
- docStyle.width = "100%";
-
- this.bodyHeight = bodyStyle.height;
- this.docHeight = docStyle.height;
- bodyStyle.height = "100%";
- docStyle.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;
- docStyle.width = this.docWidth;
-
- bodyStyle.height = this.bodyHeight;
- docStyle.height = this.docHeight;
-
- 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}).
- * Note: the pre-full-screen event is not raised when the user is exiting
- * full-screen mode by pressing the Esc key. In that case, consider using
- * the full-screen, pre-full-page or full-page events.
- *
- * @event pre-full-screen
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {Boolean} fullScreen - True if entering full-screen mode, false if exiting full-screen mode.
- * @property {Boolean} preventDefaultAction - Set to true to prevent full-screen mode change. Default: false.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'pre-full-screen', fullScreeEventArgs );
- if ( fullScreeEventArgs.preventDefaultAction ) {
- return this;
- }
-
- if ( fullScreen ) {
-
- this.setFullPage( true );
- // If the full page mode is not actually entered, we need to prevent
- // the full screen mode.
- if ( !this.isFullPage() ) {
- return this;
- }
-
- this.fullPageStyleWidth = this.element.style.width;
- this.fullPageStyleHeight = this.element.style.height;
- this.element.style.width = '100%';
- this.element.style.height = '100%';
-
- var onFullScreenChange = function() {
- var isFullScreen = $.isFullScreen();
- if ( !isFullScreen ) {
- $.removeEvent( document, $.fullScreenEventName, onFullScreenChange );
- $.removeEvent( document, $.fullScreenErrorEventName, onFullScreenChange );
-
- _this.setFullPage( false );
- if ( _this.isFullPage() ) {
- _this.element.style.width = _this.fullPageStyleWidth;
- _this.element.style.height = _this.fullPageStyleHeight;
- }
- }
- if ( _this.navigator && _this.viewport ) {
- _this.navigator.update( _this.viewport );
- }
- /**
- * Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).
- *
- * @event full-screen
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {Boolean} fullScreen - True if changed to full-screen mode, false if exited full-screen mode.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- _this.raiseEvent( 'full-screen', { fullScreen: isFullScreen } );
- };
- $.addEvent( document, $.fullScreenEventName, onFullScreenChange );
- $.addEvent( document, $.fullScreenErrorEventName, onFullScreenChange );
-
- $.requestFullScreen( document.body );
-
- } else {
- $.exitFullScreen();
- }
- return this;
- },
-
- /**
- * @function
- * @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;
- },
-
- /**
- * Add a tiled image to the viewer.
- * options.tileSource can be anything that {@link OpenSeadragon.Viewer#open}
- * supports except arrays of images.
- * Note that you can specify options.width or options.height, but not both.
- * The other dimension will be calculated according to the item's aspect ratio.
- * If collectionMode is on (see {@link OpenSeadragon.Options}), the new image is
- * automatically arranged with the others.
- * @function
- * @param {Object} options
- * @param {String|Object|Function} options.tileSource - The TileSource specifier.
- * A String implies a url used to determine the tileSource implementation
- * based on the file extension of url. JSONP is implied by *.js,
- * otherwise the url is retrieved as text and the resulting text is
- * introspected to determine if its json, xml, or text and parsed.
- * An Object implies an inline configuration which has a single
- * property sufficient for being able to determine tileSource
- * implementation. If the object has a property which is a function
- * named 'getTileUrl', it is treated as a custom TileSource.
- * @param {Number} [options.index] The index of the item. Added on top of
- * all other items if not specified.
- * @param {Boolean} [options.replace=false] If true, the item at options.index will be
- * removed and the new item is added in its place. options.tileSource will be
- * interpreted and fetched if necessary before the old item is removed to avoid leaving
- * a gap in the world.
- * @param {Number} [options.x=0] The X position for the image in viewport coordinates.
- * @param {Number} [options.y=0] The Y position for the image in viewport coordinates.
- * @param {Number} [options.width=1] The width for the image in viewport coordinates.
- * @param {Number} [options.height] The height for the image in viewport coordinates.
- * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates
- * to fit the image into. If specified, x, y, width and height get ignored.
- * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]
- * How to anchor the image in the bounds if options.fitBounds is set.
- * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to
- * (portions of the image outside of this area will not be visible). Only works on
- * browsers that support the HTML5 canvas.
- * @param {Number} [options.opacity] Opacity the tiled image should be drawn at by default.
- * @param {String} [options.compositeOperation] How the image is composited onto other images.
- * @param {Function} [options.success] A function that gets called when the image is
- * successfully added. It's passed the event object which contains a single property:
- * "item", the resulting TiledImage.
- * @param {Function} [options.error] A function that gets called if the image is
- * unable to be added. It's passed the error event object, which contains "message"
- * and "source" properties.
- * @param {Boolean} [options.collectionImmediately=false] If collectionMode is on,
- * specifies whether to snap to the new arrangement immediately or to animate to it.
- * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.
- * @fires OpenSeadragon.World.event:add-item
- * @fires OpenSeadragon.Viewer.event:add-item-failed
- */
- addTiledImage: function( options ) {
- $.console.assert(options, "[Viewer.addTiledImage] options is required");
- $.console.assert(options.tileSource, "[Viewer.addTiledImage] options.tileSource is required");
- $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()),
- "[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world");
-
- var _this = this;
-
- if (options.replace) {
- options.replaceItem = _this.world.getItemAt(options.index);
- }
-
- this._hideMessage();
-
- if (options.placeholderFillStyle === undefined) {
- options.placeholderFillStyle = this.placeholderFillStyle;
- }
- if (options.opacity === undefined) {
- options.opacity = this.opacity;
- }
- if (options.compositeOperation === undefined) {
- options.compositeOperation = this.compositeOperation;
- }
-
- var myQueueItem = {
- options: options
- };
-
- function raiseAddItemFailed( event ) {
- for (var i = 0; i < _this._loadQueue.length; i++) {
- if (_this._loadQueue[i] === myQueueItem) {
- _this._loadQueue.splice(i, 1);
- break;
- }
- }
-
- if (_this._loadQueue.length === 0) {
- refreshWorld(myQueueItem);
- }
-
- /**
- * Raised when an error occurs while adding a item.
- * @event add-item-failed
- * @memberOf OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {String} message
- * @property {String} source
- * @property {Object} options The options passed to the addTiledImage method.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- _this.raiseEvent( 'add-item-failed', event );
-
- if (options.error) {
- options.error(event);
- }
- }
-
- function refreshWorld(theItem) {
- if (_this.collectionMode) {
- _this.world.arrange({
- immediately: theItem.options.collectionImmediately,
- rows: _this.collectionRows,
- columns: _this.collectionColumns,
- layout: _this.collectionLayout,
- tileSize: _this.collectionTileSize,
- tileMargin: _this.collectionTileMargin
- });
- _this.world.setAutoRefigureSizes(true);
- }
- }
-
- if ($.isArray(options.tileSource)) {
- setTimeout(function() {
- raiseAddItemFailed({
- message: "[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.",
- source: options.tileSource,
- options: options
- });
- });
- return;
- }
-
- this._loadQueue.push(myQueueItem);
-
- getTileSourceImplementation( this, options.tileSource, function( tileSource ) {
-
- myQueueItem.tileSource = tileSource;
-
- // add everybody at the front of the queue that's ready to go
- var queueItem, tiledImage, optionsClone;
- while (_this._loadQueue.length) {
- queueItem = _this._loadQueue[0];
- if (!queueItem.tileSource) {
- break;
- }
-
- _this._loadQueue.splice(0, 1);
-
- if (queueItem.options.replace) {
- var newIndex = _this.world.getIndexOfItem(queueItem.options.replaceItem);
- if (newIndex != -1) {
- queueItem.options.index = newIndex;
- }
- _this.world.removeItem(queueItem.options.replaceItem);
- }
-
- tiledImage = new $.TiledImage({
- viewer: _this,
- source: queueItem.tileSource,
- viewport: _this.viewport,
- drawer: _this.drawer,
- tileCache: _this.tileCache,
- imageLoader: _this.imageLoader,
- x: queueItem.options.x,
- y: queueItem.options.y,
- width: queueItem.options.width,
- height: queueItem.options.height,
- fitBounds: queueItem.options.fitBounds,
- fitBoundsPlacement: queueItem.options.fitBoundsPlacement,
- clip: queueItem.options.clip,
- placeholderFillStyle: queueItem.options.placeholderFillStyle,
- opacity: queueItem.options.opacity,
- compositeOperation: queueItem.options.compositeOperation,
- springStiffness: _this.springStiffness,
- animationTime: _this.animationTime,
- minZoomImageRatio: _this.minZoomImageRatio,
- wrapHorizontal: _this.wrapHorizontal,
- wrapVertical: _this.wrapVertical,
- immediateRender: _this.immediateRender,
- blendTime: _this.blendTime,
- alwaysBlend: _this.alwaysBlend,
- minPixelRatio: _this.minPixelRatio,
- smoothTileEdgesMinZoom: _this.smoothTileEdgesMinZoom,
- iOSDevice: _this.iOSDevice,
- crossOriginPolicy: _this.crossOriginPolicy,
- debugMode: _this.debugMode
- });
-
- if (_this.collectionMode) {
- _this.world.setAutoRefigureSizes(false);
- }
- _this.world.addItem( tiledImage, {
- index: queueItem.options.index
- });
-
- if (_this._loadQueue.length === 0) {
- //this restores the autoRefigureSizes flag to true.
- refreshWorld(queueItem);
- }
-
- if (_this.world.getItemCount() === 1 && !_this.preserveViewport) {
- _this.viewport.goHome(true);
- }
-
- if (_this.navigator) {
- optionsClone = $.extend({}, queueItem.options, {
- replace: false, // navigator already removed the layer, nothing to replace
- originalTiledImage: tiledImage,
- tileSource: queueItem.tileSource
- });
-
- _this.navigator.addTiledImage(optionsClone);
- }
-
- if (queueItem.options.success) {
- queueItem.options.success({
- item: tiledImage
- });
- }
- }
- }, function( event ) {
- event.options = options;
- raiseAddItemFailed(event);
- } );
- },
-
- /**
- * Add a simple image to the viewer.
- * The options are the same as the ones in {@link OpenSeadragon.Viewer#addTiledImage}
- * except for options.tileSource which is replaced by options.url.
- * @function
- * @param {Object} options - See {@link OpenSeadragon.Viewer#addTiledImage}
- * for all the options
- * @param {String} options.url - The URL of the image to add.
- * @fires OpenSeadragon.World.event:add-item
- * @fires OpenSeadragon.Viewer.event:add-item-failed
- */
- addSimpleImage: function(options) {
- $.console.assert(options, "[Viewer.addSimpleImage] options is required");
- $.console.assert(options.url, "[Viewer.addSimpleImage] options.url is required");
-
- var opts = $.extend({}, options, {
- tileSource: {
- type: 'image',
- url: options.url
- }
- });
- delete opts.url;
- this.addTiledImage(opts);
- },
-
- // deprecated
- addLayer: function( options ) {
- var _this = this;
-
- $.console.error( "[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead." );
-
- var optionsClone = $.extend({}, options, {
- success: function(event) {
- _this.raiseEvent("add-layer", {
- options: options,
- drawer: event.item
- });
- },
- error: function(event) {
- _this.raiseEvent("add-layer-failed", event);
- }
- });
-
- this.addTiledImage(optionsClone);
- return this;
- },
-
- // deprecated
- getLayerAtLevel: function( level ) {
- $.console.error( "[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead." );
- return this.world.getItemAt(level);
- },
-
- // deprecated
- getLevelOfLayer: function( drawer ) {
- $.console.error( "[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead." );
- return this.world.getIndexOfItem(drawer);
- },
-
- // deprecated
- getLayersCount: function() {
- $.console.error( "[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead." );
- return this.world.getItemCount();
- },
-
- // deprecated
- setLayerLevel: function( drawer, level ) {
- $.console.error( "[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead." );
- return this.world.setItemIndex(drawer, level);
- },
-
- // deprecated
- removeLayer: function( drawer ) {
- $.console.error( "[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead." );
- return this.world.removeItem(drawer);
- },
-
- /**
- * Force the viewer to redraw its contents.
- * @returns {OpenSeadragon.Viewer} Chainable.
- */
- forceRedraw: function() {
- THIS[ this.hash ].forceRedraw = true;
- return this;
- },
-
- /**
- * @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 ){
-
- if( this.previousButton || this.nextButton ){
- //if we are binding to custom buttons then layout and
- //grouping is the responsibility of the page author
- useGroup = false;
- }
-
- this.previousButton = new $.Button({
- element: this.previousButton ? $.getElement( this.previousButton ) : null,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- tooltip: $.getString( "Tooltips.PreviousPage" ),
- srcRest: resolveUrl( this.prefixUrl, navImages.previous.REST ),
- srcGroup: resolveUrl( this.prefixUrl, navImages.previous.GROUP ),
- srcHover: resolveUrl( this.prefixUrl, navImages.previous.HOVER ),
- srcDown: resolveUrl( this.prefixUrl, navImages.previous.DOWN ),
- onRelease: onPreviousHandler,
- onFocus: onFocusHandler,
- onBlur: onBlurHandler
- });
-
- this.nextButton = new $.Button({
- element: this.nextButton ? $.getElement( this.nextButton ) : null,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- tooltip: $.getString( "Tooltips.NextPage" ),
- srcRest: resolveUrl( this.prefixUrl, navImages.next.REST ),
- srcGroup: resolveUrl( this.prefixUrl, navImages.next.GROUP ),
- srcHover: resolveUrl( this.prefixUrl, navImages.next.HOVER ),
- srcDown: resolveUrl( this.prefixUrl, navImages.next.DOWN ),
- onRelease: onNextHandler,
- onFocus: onFocusHandler,
- onBlur: onBlurHandler
- });
-
- if( !this.navPrevNextWrap ){
- this.previousButton.disable();
- }
-
- if (!this.tileSources || !this.tileSources.length) {
- this.nextButton.disable();
- }
-
- if( useGroup ){
- this.paging = new $.ButtonGroup({
- buttons: [
- this.previousButton,
- this.nextButton
- ],
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold
- });
-
- this.pagingControl = this.paging.element;
-
- if( this.toolbar ){
- this.toolbar.addControl(
- this.pagingControl,
- {anchor: $.ControlAnchor.BOTTOM_RIGHT}
- );
- }else{
- this.addControl(
- this.pagingControl,
- {anchor: this.sequenceControlAnchor || $.ControlAnchor.TOP_LEFT}
- );
- }
- }
- }
- return this;
- },
-
-
- /**
- * @function
- * @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 ||
- this.rotateLeftButton || this.rotateRightButton ) {
- //if we are binding to custom buttons then layout and
- //grouping is the responsibility of the page author
- useGroup = false;
- }
-
- if ( this.showZoomControl ) {
- buttons.push( this.zoomInButton = new $.Button({
- element: this.zoomInButton ? $.getElement( this.zoomInButton ) : null,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- tooltip: $.getString( "Tooltips.ZoomIn" ),
- srcRest: resolveUrl( this.prefixUrl, navImages.zoomIn.REST ),
- srcGroup: resolveUrl( this.prefixUrl, navImages.zoomIn.GROUP ),
- srcHover: resolveUrl( this.prefixUrl, navImages.zoomIn.HOVER ),
- srcDown: resolveUrl( this.prefixUrl, navImages.zoomIn.DOWN ),
- onPress: beginZoomingInHandler,
- onRelease: endZoomingHandler,
- onClick: doSingleZoomInHandler,
- onEnter: beginZoomingInHandler,
- onExit: endZoomingHandler,
- onFocus: onFocusHandler,
- onBlur: onBlurHandler
- }));
-
- buttons.push( this.zoomOutButton = new $.Button({
- element: this.zoomOutButton ? $.getElement( this.zoomOutButton ) : null,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- tooltip: $.getString( "Tooltips.ZoomOut" ),
- srcRest: resolveUrl( this.prefixUrl, navImages.zoomOut.REST ),
- srcGroup: resolveUrl( this.prefixUrl, navImages.zoomOut.GROUP ),
- srcHover: resolveUrl( this.prefixUrl, navImages.zoomOut.HOVER ),
- srcDown: resolveUrl( this.prefixUrl, navImages.zoomOut.DOWN ),
- onPress: beginZoomingOutHandler,
- onRelease: endZoomingHandler,
- onClick: doSingleZoomOutHandler,
- onEnter: beginZoomingOutHandler,
- onExit: endZoomingHandler,
- onFocus: onFocusHandler,
- onBlur: onBlurHandler
- }));
- }
-
- if ( this.showHomeControl ) {
- buttons.push( this.homeButton = new $.Button({
- element: this.homeButton ? $.getElement( this.homeButton ) : null,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- tooltip: $.getString( "Tooltips.Home" ),
- srcRest: resolveUrl( this.prefixUrl, navImages.home.REST ),
- srcGroup: resolveUrl( this.prefixUrl, navImages.home.GROUP ),
- srcHover: resolveUrl( this.prefixUrl, navImages.home.HOVER ),
- srcDown: resolveUrl( this.prefixUrl, navImages.home.DOWN ),
- onRelease: onHomeHandler,
- onFocus: onFocusHandler,
- onBlur: onBlurHandler
- }));
- }
-
- if ( this.showFullPageControl ) {
- buttons.push( this.fullPageButton = new $.Button({
- element: this.fullPageButton ? $.getElement( this.fullPageButton ) : null,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- tooltip: $.getString( "Tooltips.FullPage" ),
- srcRest: resolveUrl( this.prefixUrl, navImages.fullpage.REST ),
- srcGroup: resolveUrl( this.prefixUrl, navImages.fullpage.GROUP ),
- srcHover: resolveUrl( this.prefixUrl, navImages.fullpage.HOVER ),
- srcDown: resolveUrl( this.prefixUrl, navImages.fullpage.DOWN ),
- onRelease: onFullScreenHandler,
- onFocus: onFocusHandler,
- onBlur: onBlurHandler
- }));
- }
-
- if ( this.showRotationControl ) {
- buttons.push( this.rotateLeftButton = new $.Button({
- element: this.rotateLeftButton ? $.getElement( this.rotateLeftButton ) : null,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- tooltip: $.getString( "Tooltips.RotateLeft" ),
- srcRest: resolveUrl( this.prefixUrl, navImages.rotateleft.REST ),
- srcGroup: resolveUrl( this.prefixUrl, navImages.rotateleft.GROUP ),
- srcHover: resolveUrl( this.prefixUrl, navImages.rotateleft.HOVER ),
- srcDown: resolveUrl( this.prefixUrl, navImages.rotateleft.DOWN ),
- onRelease: onRotateLeftHandler,
- onFocus: onFocusHandler,
- onBlur: onBlurHandler
- }));
-
- buttons.push( this.rotateRightButton = new $.Button({
- element: this.rotateRightButton ? $.getElement( this.rotateRightButton ) : null,
- clickTimeThreshold: this.clickTimeThreshold,
- clickDistThreshold: this.clickDistThreshold,
- tooltip: $.getString( "Tooltips.RotateRight" ),
- srcRest: resolveUrl( this.prefixUrl, navImages.rotateright.REST ),
- srcGroup: resolveUrl( this.prefixUrl, navImages.rotateright.GROUP ),
- srcHover: resolveUrl( this.prefixUrl, navImages.rotateright.HOVER ),
- srcDown: resolveUrl( this.prefixUrl, navImages.rotateright.DOWN ),
- onRelease: onRotateRightHandler,
- onFocus: onFocusHandler,
- onBlur: onBlurHandler
- }));
-
- }
-
- if ( 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._sequenceIndex;
- },
-
- /**
- * @function
- * @return {OpenSeadragon.Viewer} Chainable.
- * @fires OpenSeadragon.Viewer.event:page
- */
- goToPage: function( page ){
- if( this.tileSources && 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._sequenceIndex = page;
-
- this._updateSequenceButtons( page );
-
- this.open( this.tileSources[ page ] );
-
- if( this.referenceStrip ){
- this.referenceStrip.setFocus( page );
- }
- }
-
- return this;
- },
-
- /**
- * Adds an html element as an overlay to the current viewport. Useful for
- * highlighting words or areas of interest on an image or other zoomable
- * interface. The overlays added via this method are removed when the viewport
- * is closed which include when changing page.
- * @method
- * @param {Element|String|Object} element - A reference to an element or an id for
- * the element which will be overlayed. Or an Object specifying the configuration for the overlay.
- * If using an object, see {@link OpenSeadragon.Overlay} for a list of
- * all available options.
- * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
- * rectangle which will be overlayed. This is a viewport relative location.
- * @param {OpenSeadragon.Placement} 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.
- * @return {OpenSeadragon.Viewer} Chainable.
- * @fires OpenSeadragon.Viewer.event:add-overlay
- */
- addOverlay: function( element, location, placement, onDraw ) {
- var options;
- if( $.isPlainObject( element ) ){
- options = element;
- } else {
- options = {
- element: element,
- location: location,
- placement: placement,
- onDraw: onDraw
- };
- }
-
- element = $.getElement( options.element );
-
- if ( getOverlayIndex( this.currentOverlays, element ) >= 0 ) {
- // they're trying to add a duplicate overlay
- return this;
- }
-
- var overlay = getOverlayObject( this, options);
- this.currentOverlays.push(overlay);
- overlay.drawHTML( this.overlaysContainer, this.viewport );
-
- /**
- * Raised when an overlay is added to the viewer (see {@link OpenSeadragon.Viewer#addOverlay}).
- *
- * @event add-overlay
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {Element} element - The overlay element.
- * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location
- * @property {OpenSeadragon.Placement} placement
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'add-overlay', {
- element: element,
- location: options.location,
- placement: options.placement
- });
- return this;
- },
-
- /**
- * Updates the overlay represented by the reference to the element or
- * element id moving it to the new location, relative to the new placement.
- * @method
- * @param {Element|String} element - A reference to an element or an id for
- * the element which is overlayed.
- * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
- * rectangle which will be overlayed. This is a viewport relative location.
- * @param {OpenSeadragon.Placement} placement - The position of the
- * viewport which the location coordinates will be treated as relative
- * to.
- * @return {OpenSeadragon.Viewer} Chainable.
- * @fires OpenSeadragon.Viewer.event:update-overlay
- */
- updateOverlay: function( element, location, placement ) {
- var i;
-
- element = $.getElement( element );
- i = getOverlayIndex( this.currentOverlays, element );
-
- if ( i >= 0 ) {
- this.currentOverlays[ i ].update( location, placement );
- THIS[ this.hash ].forceRedraw = true;
- /**
- * Raised when an overlay's location or placement changes
- * (see {@link OpenSeadragon.Viewer#updateOverlay}).
- *
- * @event update-overlay
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the
- * Viewer which raised the event.
- * @property {Element} element
- * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location
- * @property {OpenSeadragon.Placement} placement
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'update-overlay', {
- element: element,
- location: location,
- placement: placement
- });
- }
- return this;
- },
-
- /**
- * Removes an overlay identified by the reference element or element id
- * and schedules an update.
- * @method
- * @param {Element|String} element - A reference to the element or an
- * element id which represent the ovelay content to be removed.
- * @return {OpenSeadragon.Viewer} Chainable.
- * @fires OpenSeadragon.Viewer.event:remove-overlay
- */
- removeOverlay: function( element ) {
- var i;
-
- element = $.getElement( element );
- i = getOverlayIndex( this.currentOverlays, element );
-
- if ( i >= 0 ) {
- this.currentOverlays[ i ].destroy();
- this.currentOverlays.splice( i, 1 );
- THIS[ this.hash ].forceRedraw = true;
- /**
- * Raised when an overlay is removed from the viewer
- * (see {@link OpenSeadragon.Viewer#removeOverlay}).
- *
- * @event remove-overlay
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the
- * Viewer which raised the event.
- * @property {Element} element - The overlay element.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'remove-overlay', {
- element: element
- });
- }
- return this;
- },
-
- /**
- * Removes all currently configured Overlays from this Viewer and schedules
- * an update.
- * @method
- * @return {OpenSeadragon.Viewer} Chainable.
- * @fires OpenSeadragon.Viewer.event:clear-overlay
- */
- clearOverlays: function() {
- while ( this.currentOverlays.length > 0 ) {
- this.currentOverlays.pop().destroy();
- }
- THIS[ this.hash ].forceRedraw = true;
- /**
- * Raised when all overlays are removed from the viewer (see {@link OpenSeadragon.Drawer#clearOverlays}).
- *
- * @event clear-overlay
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'clear-overlay', {} );
- return this;
- },
-
- /**
- * Finds an overlay identified by the reference element or element id
- * and returns it as an object, return null if not found.
- * @method
- * @param {Element|String} element - A reference to the element or an
- * element id which represents the overlay content.
- * @return {OpenSeadragon.Overlay} the matching overlay or null if none found.
- */
- getOverlayById: function( element ) {
- var i;
-
- element = $.getElement( element );
- i = getOverlayIndex( this.currentOverlays, element );
-
- if (i>=0) {
- return this.currentOverlays[i];
- } else {
- return null;
- }
- },
-
- /**
- * Updates the sequence buttons.
- * @function OpenSeadragon.Viewer.prototype._updateSequenceButtons
- * @private
- * @param {Number} Sequence Value
- */
- _updateSequenceButtons: function( page ) {
-
- if ( this.nextButton ) {
- if(!this.tileSources || this.tileSources.length - 1 === page) {
- //Disable next button
- if ( !this.navPrevNextWrap ) {
- this.nextButton.disable();
- }
- } else {
- this.nextButton.enable();
- }
- }
- if ( this.previousButton ) {
- if ( page > 0 ) {
- //Enable previous button
- this.previousButton.enable();
- } else {
- if ( !this.navPrevNextWrap ) {
- this.previousButton.disable();
- }
- }
- }
- },
-
- /**
- * Display a message in the viewport
- * @function OpenSeadragon.Viewer.prototype._showMessage
- * @private
- * @param {String} text message
- */
- _showMessage: function ( message ) {
- this._hideMessage();
-
- var div = $.makeNeutralElement( "div" );
- div.appendChild( document.createTextNode( message ) );
-
- this.messageDiv = $.makeCenteredNode( div );
-
- $.addClass(this.messageDiv, "openseadragon-message");
-
- this.container.appendChild( this.messageDiv );
- },
-
- /**
- * Hide any currently displayed viewport message
- * @function OpenSeadragon.Viewer.prototype._hideMessage
- * @private
- */
- _hideMessage: function () {
- var div = this.messageDiv;
- if (div) {
- div.parentNode.removeChild(div);
- delete this.messageDiv;
- }
- },
-
- /**
- * Gets this viewer's gesture settings for the given pointer device type.
- * @method
- * @param {String} type - The pointer device type to get the gesture settings for ("mouse", "touch", "pen", etc.).
- * @return {OpenSeadragon.GestureSettings}
- */
- gestureSettingsByDeviceType: function ( type ) {
- switch ( type ) {
- case 'mouse':
- return this.gestureSettingsMouse;
- case 'touch':
- return this.gestureSettingsTouch;
- case 'pen':
- return this.gestureSettingsPen;
- default:
- return this.gestureSettingsUnknown;
- }
- },
-
- // private
- _drawOverlays: function() {
- var i,
- length = this.currentOverlays.length;
- for ( i = 0; i < length; i++ ) {
- this.currentOverlays[ i ].drawHTML( this.overlaysContainer, this.viewport );
- }
- },
-
- /**
- * Cancel the "in flight" images.
- */
- _cancelPendingImages: function() {
- this._loadQueue = [];
- }
-});
-
-
-/**
- * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y,
- * which was causing some calling operations to return NaN.
- * @returns {Point}
- * @private
- */
-function _getSafeElemSize (oElement) {
- oElement = $.getElement( oElement );
-
- return new $.Point(
- (oElement.clientWidth === 0 ? 1 : oElement.clientWidth),
- (oElement.clientHeight === 0 ? 1 : oElement.clientHeight)
- );
-}
-
-/**
- * @function
- * @private
- */
-function getTileSourceImplementation( viewer, tileSource, successCallback,
- failCallback ) {
- var _this = viewer;
-
- //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*[\{\[].*/ ) ) {
- tileSource = $.parseJSON(tileSource);
- }
- }
-
- function waitUntilReady(tileSource, originalTileSource) {
- if (tileSource.ready) {
- successCallback(tileSource);
- } else {
- tileSource.addHandler('ready', function () {
- successCallback(tileSource);
- });
- tileSource.addHandler('open-failed', function (event) {
- failCallback({
- message: event.message,
- source: originalTileSource
- });
- });
- }
- }
-
- setTimeout( function() {
- if ( $.type( tileSource ) == 'string' ) {
- //If its still a string it means it must be a url at this point
- tileSource = new $.TileSource({
- url: tileSource,
- crossOriginPolicy: viewer.crossOriginPolicy,
- ajaxWithCredentials: viewer.ajaxWithCredentials,
- useCanvas: viewer.useCanvas,
- success: function( event ) {
- successCallback( event.tileSource );
- }
- });
- tileSource.addHandler( 'open-failed', function( event ) {
- failCallback( event );
- } );
-
- } else if ($.isPlainObject(tileSource) || tileSource.nodeType) {
- if (!tileSource.crossOriginPolicy && viewer.crossOriginPolicy) {
- tileSource.crossOriginPolicy = viewer.crossOriginPolicy;
- }
- if (tileSource.ajaxWithCredentials === undefined) {
- tileSource.ajaxWithCredentials = viewer.ajaxWithCredentials;
- }
- if (tileSource.useCanvas === undefined) {
- tileSource.useCanvas = viewer.useCanvas;
- }
-
- if ( $.isFunction( tileSource.getTileUrl ) ) {
- //Custom tile source
- var customTileSource = new $.TileSource( tileSource );
- customTileSource.getTileUrl = tileSource.getTileUrl;
- successCallback( customTileSource );
- } else {
- //inline configuration
- var $TileSource = $.TileSource.determineType( _this, tileSource );
- if ( !$TileSource ) {
- failCallback( {
- message: "Unable to load TileSource",
- source: tileSource
- });
- return;
- }
- var options = $TileSource.prototype.configure.apply( _this, [ tileSource ] );
- waitUntilReady(new $TileSource(options), tileSource);
- }
- } else {
- //can assume it's already a tile source implementation
- waitUntilReady(tileSource, tileSource);
- }
- });
-}
-
-function getOverlayObject( viewer, overlay ) {
- if ( overlay instanceof $.Overlay ) {
- return overlay;
- }
-
- var element = null;
- if ( overlay.element ) {
- element = $.getElement( overlay.element );
- } else {
- var id = overlay.id ?
- overlay.id :
- "openseadragon-overlay-" + Math.floor( Math.random() * 10000000 );
-
- element = $.getElement( overlay.id );
- if ( !element ) {
- element = document.createElement( "a" );
- element.href = "#/overlay/" + id;
- }
- element.id = id;
- $.addClass( element, overlay.className ?
- overlay.className :
- "openseadragon-overlay"
- );
- }
-
- var location = overlay.location;
- var width = overlay.width;
- var height = overlay.height;
- if (!location) {
- var x = overlay.x;
- var y = overlay.y;
- if (overlay.px !== undefined) {
- var rect = viewer.viewport.imageToViewportRectangle(new $.Rect(
- overlay.px,
- overlay.py,
- width || 0,
- height || 0));
- x = rect.x;
- y = rect.y;
- width = width !== undefined ? rect.width : undefined;
- height = height !== undefined ? rect.height : undefined;
- }
- location = new $.Point(x, y);
- }
-
- var placement = overlay.placement;
- if (placement && $.type(placement) === "string") {
- placement = $.Placement[overlay.placement.toUpperCase()];
- }
-
- return new $.Overlay({
- element: element,
- location: location,
- placement: placement,
- onDraw: overlay.onDraw,
- checkResize: overlay.checkResize,
- width: width,
- height: height,
- rotationMode: overlay.rotationMode
- });
-}
-
-/**
- * @private
- * @inner
- * Determines the index of the given overlay in the given overlays array.
- */
-function getOverlayIndex( overlays, element ) {
- var i;
- for ( i = overlays.length - 1; i >= 0; i-- ) {
- if ( overlays[ i ].element === element ) {
- return i;
- }
- }
-
- return -1;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Schedulers provide the general engine for animation
-///////////////////////////////////////////////////////////////////////////////
-function scheduleUpdate( viewer, updateFunc ){
- return $.requestAnimationFrame( function(){
- updateFunc( viewer );
- } );
-}
-
-
-//provides a sequence in the fade animation
-function scheduleControlsFade( viewer ) {
- $.requestAnimationFrame( function(){
- updateControlsFade( viewer );
- });
-}
-
-
-//initiates an animation to hide the controls
-function beginControlsAutoHide( viewer ) {
- if ( !viewer.autoHideControls ) {
- return;
- }
- viewer.controlsShouldFade = true;
- viewer.controlsFadeBeginTime =
- $.now() +
- viewer.controlsFadeDelay;
-
- window.setTimeout( function(){
- scheduleControlsFade( viewer );
- }, viewer.controlsFadeDelay );
-}
-
-
-//determines if fade animation is done or continues the animation
-function updateControlsFade( viewer ) {
- var currentTime,
- deltaTime,
- opacity,
- i;
- if ( viewer.controlsShouldFade ) {
- currentTime = $.now();
- deltaTime = currentTime - viewer.controlsFadeBeginTime;
- opacity = 1.0 - deltaTime / viewer.controlsFadeLength;
-
- opacity = Math.min( 1.0, opacity );
- opacity = Math.max( 0.0, opacity );
-
- for ( i = viewer.controls.length - 1; i >= 0; i--) {
- if (viewer.controls[ i ].autoFade) {
- viewer.controls[ i ].setOpacity( opacity );
- }
- }
-
- if ( opacity > 0 ) {
- // fade again
- scheduleControlsFade( viewer );
- }
- }
-}
-
-
-//stop the fade animation on the controls and show them
-function abortControlsAutoHide( viewer ) {
- var i;
- viewer.controlsShouldFade = false;
- for ( i = viewer.controls.length - 1; i >= 0; i-- ) {
- viewer.controls[ i ].setOpacity( 1.0 );
- }
-}
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Default view event handlers.
-///////////////////////////////////////////////////////////////////////////////
-function onFocus(){
- abortControlsAutoHide( this );
-}
-
-function onBlur(){
- beginControlsAutoHide( this );
-
-}
-
-function onCanvasKeyDown( event ) {
- if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {
- switch( event.keyCode ){
- case 38://up arrow
- if ( event.shift ) {
- this.viewport.zoomBy(1.1);
- } else {
- this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40)));
- }
- this.viewport.applyConstraints();
- return false;
- case 40://down arrow
- if ( event.shift ) {
- this.viewport.zoomBy(0.9);
- } else {
- this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40)));
- }
- this.viewport.applyConstraints();
- return false;
- case 37://left arrow
- this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));
- this.viewport.applyConstraints();
- return false;
- case 39://right arrow
- this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));
- this.viewport.applyConstraints();
- return false;
- default:
- //console.log( 'navigator keycode %s', event.keyCode );
- return true;
- }
- } else {
- return true;
- }
-}
-
-function onCanvasKeyPress( event ) {
- if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {
- switch( event.keyCode ){
- case 43://=|+
- 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
- if ( event.shift ) {
- this.viewport.zoomBy(1.1);
- } else {
- this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40)));
- }
- this.viewport.applyConstraints();
- return false;
- case 115://s
- case 83://S
- if ( event.shift ) {
- this.viewport.zoomBy(0.9);
- } else {
- this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40)));
- }
- this.viewport.applyConstraints();
- return false;
- case 97://a
- this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));
- this.viewport.applyConstraints();
- return false;
- case 100://d
- this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));
- this.viewport.applyConstraints();
- return false;
- default:
- //console.log( 'navigator keycode %s', event.keyCode );
- return true;
- }
- } else {
- return true;
- }
-}
-
-function onCanvasClick( event ) {
- var gestureSettings;
-
- var haveKeyboardFocus = document.activeElement == this.canvas;
-
- // If we don't have keyboard focus, request it.
- if ( !haveKeyboardFocus ) {
- this.canvas.focus();
- }
-
- if ( !event.preventDefaultAction && this.viewport && event.quick ) {
- gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
- if ( gestureSettings.clickToZoom ) {
- this.viewport.zoomBy(
- event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,
- 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 clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.
- * @property {Boolean} shift - True if the shift key was pressed during this event.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-click', {
- tracker: event.eventSource,
- position: event.position,
- quick: event.quick,
- shift: event.shift,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasDblClick( event ) {
- var gestureSettings;
-
- if ( !event.preventDefaultAction && this.viewport ) {
- gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
- if ( gestureSettings.dblClickToZoom ) {
- this.viewport.zoomBy(
- event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,
- this.viewport.pointFromPixel( event.position, true )
- );
- this.viewport.applyConstraints();
- }
- }
- /**
- * Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-double-click
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {Boolean} shift - True if the shift key was pressed during this event.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-double-click', {
- tracker: event.eventSource,
- position: event.position,
- shift: event.shift,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasDrag( event ) {
- var gestureSettings;
-
- if ( !event.preventDefaultAction && this.viewport ) {
- gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
- if( !this.panHorizontal ){
- event.delta.x = 0;
- }
- if( !this.panVertical ){
- event.delta.y = 0;
- }
- this.viewport.panBy( this.viewport.deltaPointsFromPixels( event.delta.negate() ), gestureSettings.flickEnabled );
- 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 {Number} speed - Current computed speed, in pixels per second.
- * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.
- * @property {Boolean} shift - True if the shift key was pressed during this event.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-drag', {
- tracker: event.eventSource,
- position: event.position,
- delta: event.delta,
- speed: event.speed,
- direction: event.direction,
- shift: event.shift,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasDragEnd( event ) {
- if (!event.preventDefaultAction && this.viewport) {
- var gestureSettings = this.gestureSettingsByDeviceType(event.pointerType);
- if (gestureSettings.flickEnabled &&
- event.speed >= gestureSettings.flickMinSpeed) {
- var amplitudeX = 0;
- if (this.panHorizontal) {
- amplitudeX = gestureSettings.flickMomentum * event.speed *
- Math.cos(event.direction);
- }
- var amplitudeY = 0;
- if (this.panVertical) {
- amplitudeY = gestureSettings.flickMomentum * event.speed *
- Math.sin(event.direction);
- }
- var center = this.viewport.pixelFromPoint(
- this.viewport.getCenter(true));
- var target = this.viewport.pointFromPixel(
- new $.Point(center.x - amplitudeX, center.y - amplitudeY));
- this.viewport.panTo(target, false);
- }
- this.viewport.applyConstraints();
- }
- /**
- * Raised when a mouse or touch drag operation ends on the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-drag-end
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {Number} speed - Speed at the end of a drag gesture, in pixels per second.
- * @property {Number} direction - Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.
- * @property {Boolean} shift - True if the shift key was pressed during this event.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent('canvas-drag-end', {
- tracker: event.eventSource,
- position: event.position,
- speed: event.speed,
- direction: event.direction,
- shift: event.shift,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasEnter( event ) {
- /**
- * Raised when a pointer enters the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-enter
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {String} pointerType - "mouse", "touch", "pen", etc.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @property {Number} pointers - Number of pointers (all types) active in the tracked element.
- * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.
- * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. <span style="color:red;">Deprecated. Use buttons instead.</span>
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-enter', {
- tracker: event.eventSource,
- pointerType: event.pointerType,
- position: event.position,
- buttons: event.buttons,
- pointers: event.pointers,
- insideElementPressed: event.insideElementPressed,
- buttonDownAny: event.buttonDownAny,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasExit( event ) {
- /**
- * Raised when a pointer leaves the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-exit
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {String} pointerType - "mouse", "touch", "pen", etc.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @property {Number} pointers - Number of pointers (all types) active in the tracked element.
- * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.
- * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. <span style="color:red;">Deprecated. Use buttons instead.</span>
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-exit', {
- tracker: event.eventSource,
- pointerType: event.pointerType,
- position: event.position,
- buttons: event.buttons,
- pointers: event.pointers,
- insideElementPressed: event.insideElementPressed,
- buttonDownAny: event.buttonDownAny,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasPress( event ) {
- /**
- * Raised when the primary mouse button is pressed or touch starts on the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-press
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {String} pointerType - "mouse", "touch", "pen", etc.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.
- * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-press', {
- tracker: event.eventSource,
- pointerType: event.pointerType,
- position: event.position,
- insideElementPressed: event.insideElementPressed,
- insideElementReleased: event.insideElementReleased,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasRelease( event ) {
- /**
- * Raised when the primary mouse button is released or touch ends on the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-release
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {String} pointerType - "mouse", "touch", "pen", etc.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.
- * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-release', {
- tracker: event.eventSource,
- pointerType: event.pointerType,
- position: event.position,
- insideElementPressed: event.insideElementPressed,
- insideElementReleased: event.insideElementReleased,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasNonPrimaryPress( event ) {
- /**
- * Raised when any non-primary pointer button is pressed on the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-nonprimary-press
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {String} pointerType - "mouse", "touch", "pen", etc.
- * @property {Number} button - Button which caused the event.
- * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.
- * @property {Number} buttons - Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-nonprimary-press', {
- tracker: event.eventSource,
- position: event.position,
- pointerType: event.pointerType,
- button: event.button,
- buttons: event.buttons,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasNonPrimaryRelease( event ) {
- /**
- * Raised when any non-primary pointer button is released on the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-nonprimary-release
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {String} pointerType - "mouse", "touch", "pen", etc.
- * @property {Number} button - Button which caused the event.
- * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.
- * @property {Number} buttons - Current buttons pressed.
- * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'canvas-nonprimary-release', {
- tracker: event.eventSource,
- position: event.position,
- pointerType: event.pointerType,
- button: event.button,
- buttons: event.buttons,
- originalEvent: event.originalEvent
- });
-}
-
-function onCanvasPinch( event ) {
- var gestureSettings,
- centerPt,
- lastCenterPt,
- panByPt;
-
- if ( !event.preventDefaultAction && this.viewport ) {
- gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
- if ( gestureSettings.pinchToZoom ) {
- centerPt = this.viewport.pointFromPixel( event.center, true );
- lastCenterPt = this.viewport.pointFromPixel( event.lastCenter, true );
- panByPt = lastCenterPt.minus( centerPt );
- if( !this.panHorizontal ) {
- panByPt.x = 0;
- }
- if( !this.panVertical ) {
- panByPt.y = 0;
- }
- this.viewport.zoomBy( event.distance / event.lastDistance, centerPt, true );
- this.viewport.panBy( panByPt, true );
- this.viewport.applyConstraints();
- }
- if ( gestureSettings.pinchRotate ) {
- // Pinch rotate
- var angle1 = Math.atan2(event.gesturePoints[0].currentPos.y - event.gesturePoints[1].currentPos.y,
- event.gesturePoints[0].currentPos.x - event.gesturePoints[1].currentPos.x);
- var angle2 = Math.atan2(event.gesturePoints[0].lastPos.y - event.gesturePoints[1].lastPos.y,
- event.gesturePoints[0].lastPos.x - event.gesturePoints[1].lastPos.x);
- this.viewport.setRotation(this.viewport.getRotation() + ((angle1 - angle2) * (180 / Math.PI)));
- }
- }
- /**
- * Raised when a pinch event occurs on the {@link OpenSeadragon.Viewer#canvas} element.
- *
- * @event canvas-pinch
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gesturePoints - Gesture points associated with the gesture. Velocity data can be found here.
- * @property {OpenSeadragon.Point} lastCenter - The previous center point of the two pinch contact points relative to the tracked element.
- * @property {OpenSeadragon.Point} center - The center point of the two pinch contact points relative to the tracked element.
- * @property {Number} lastDistance - The previous distance between the two pinch contact points in CSS pixels.
- * @property {Number} distance - The distance between the two pinch contact points in CSS pixels.
- * @property {Boolean} shift - True if the shift key was pressed during this event.
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent('canvas-pinch', {
- tracker: event.eventSource,
- gesturePoints: event.gesturePoints,
- lastCenter: event.lastCenter,
- center: event.center,
- lastDistance: event.lastDistance,
- distance: event.distance,
- shift: event.shift,
- originalEvent: event.originalEvent
- });
- //cancels event
- return false;
-}
-
-function onCanvasScroll( event ) {
- var gestureSettings,
- factor,
- thisScrollTime,
- deltaScrollTime;
-
- /* Certain scroll devices fire the scroll event way too fast so we are injecting a simple adjustment to keep things
- * partially normalized. If we have already fired an event within the last 'minScrollDelta' milliseconds we skip
- * this one and wait for the next event. */
- thisScrollTime = $.now();
- deltaScrollTime = thisScrollTime - this._lastScrollTime;
- if (deltaScrollTime > this.minScrollDeltaTime) {
- this._lastScrollTime = thisScrollTime;
-
- if ( !event.preventDefaultAction && this.viewport ) {
- gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
- if ( gestureSettings.scrollToZoom ) {
- 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).
- *
- * @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
- });
- if (gestureSettings && gestureSettings.scrollToZoom) {
- //cancels event
- return false;
- }
- }
- else {
- gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
- if (gestureSettings && gestureSettings.scrollToZoom) {
- return false; // We are swallowing this event
- }
- }
-}
-
-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 {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @property {Number} pointers - Number of pointers (all types) active in the tracked element.
- * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.
- * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. <span style="color:red;">Deprecated. Use buttons instead.</span>
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'container-enter', {
- tracker: event.eventSource,
- position: event.position,
- buttons: event.buttons,
- pointers: event.pointers,
- insideElementPressed: event.insideElementPressed,
- buttonDownAny: event.buttonDownAny,
- originalEvent: event.originalEvent
- });
-}
-
-function onContainerExit( event ) {
- if ( event.pointers < 1 ) {
- THIS[ this.hash ].mouseInside = false;
- if ( !THIS[ this.hash ].animating ) {
- beginControlsAutoHide( this );
- }
- }
- /**
- * Raised when the cursor leaves the {@link OpenSeadragon.Viewer#container} element.
- *
- * @event container-exit
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
- * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
- * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.
- * @property {Number} pointers - Number of pointers (all types) active in the tracked element.
- * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.
- * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. <span style="color:red;">Deprecated. Use buttons instead.</span>
- * @property {Object} originalEvent - The original DOM event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'container-exit', {
- tracker: event.eventSource,
- position: event.position,
- buttons: event.buttons,
- pointers: event.pointers,
- insideElementPressed: event.insideElementPressed,
- buttonDownAny: event.buttonDownAny,
- originalEvent: event.originalEvent
- });
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Page update routines ( aka Views - for future reference )
-///////////////////////////////////////////////////////////////////////////////
-
-function updateMulti( viewer ) {
- updateOnce( viewer );
-
- // Request the next frame, unless we've been closed
- if ( viewer.isOpen() ) {
- viewer._updateRequestId = scheduleUpdate( viewer, updateMulti );
- } else {
- viewer._updateRequestId = false;
- }
-}
-
-function updateOnce( viewer ) {
-
- //viewer.profiler.beginUpdate();
-
- if (viewer._opening) {
- return;
- }
-
- if (viewer.autoResize) {
- var containerSize = _getSafeElemSize(viewer.container);
- var prevContainerSize = THIS[viewer.hash].prevContainerSize;
- if (!containerSize.equals(prevContainerSize)) {
- var viewport = viewer.viewport;
- if (viewer.preserveImageSizeOnResize) {
- var resizeRatio = prevContainerSize.x / containerSize.x;
- var zoom = viewport.getZoom() * resizeRatio;
- var center = viewport.getCenter();
- viewport.resize(containerSize, false);
- viewport.zoomTo(zoom, null, true);
- viewport.panTo(center, true);
- } else {
- // maintain image position
- var oldBounds = viewport.getBounds();
- viewport.resize(containerSize, true);
- viewport.fitBoundsWithConstraints(oldBounds, true);
- }
- THIS[viewer.hash].prevContainerSize = containerSize;
- THIS[viewer.hash].forceRedraw = true;
- }
- }
-
- var viewportChange = viewer.viewport.update();
- var animated = viewer.world.update() || viewportChange;
-
- if (viewportChange) {
- /**
- * Raised when any spring animation update occurs (zoom, pan, etc.),
- * before the viewer has drawn the new location.
- *
- * @event viewport-change
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- viewer.raiseEvent('viewport-change');
- }
-
- if( viewer.referenceStrip ){
- animated = viewer.referenceStrip.update( viewer.viewport ) || animated;
- }
-
- 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 || THIS[ viewer.hash ].forceRedraw || viewer.world.needsDraw() ) {
- drawWorld( viewer );
- viewer._drawOverlays();
- if( viewer.navigator ){
- viewer.navigator.update( viewer.viewport );
- }
-
- THIS[ viewer.hash ].forceRedraw = false;
-
- if (animated) {
- /**
- * Raised when any spring animation update occurs (zoom, pan, etc.),
- * after the viewer has drawn the new location.
- *
- * @event animation
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- viewer.raiseEvent( "animation" );
- }
- }
-
- if ( 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();
-}
-
-function drawWorld( viewer ) {
- viewer.imageLoader.clear();
- viewer.drawer.clear();
- viewer.world.draw();
-
- /**
- * <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.
- */
- viewer.raiseEvent( 'update-viewport', {} );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Navigation Controls
-///////////////////////////////////////////////////////////////////////////////
-function resolveUrl( prefix, url ) {
- return prefix ? prefix + url : url;
-}
-
-
-
-function beginZoomingIn() {
- THIS[ this.hash ].lastZoomTime = $.now();
- THIS[ this.hash ].zoomFactor = this.zoomPerSecond;
- THIS[ this.hash ].zooming = true;
- scheduleZoom( this );
-}
-
-
-function beginZoomingOut() {
- THIS[ this.hash ].lastZoomTime = $.now();
- THIS[ this.hash ].zoomFactor = 1.0 / this.zoomPerSecond;
- THIS[ this.hash ].zooming = true;
- scheduleZoom( this );
-}
-
-
-function endZooming() {
- THIS[ this.hash ].zooming = false;
-}
-
-
-function scheduleZoom( viewer ) {
- $.requestAnimationFrame( $.delegate( viewer, doZoom ) );
-}
-
-
-function doZoom() {
- var currentTime,
- deltaTime,
- adjustedFactor;
-
- if ( THIS[ this.hash ].zooming && this.viewport) {
- currentTime = $.now();
- deltaTime = currentTime - THIS[ this.hash ].lastZoomTime;
- adjustedFactor = Math.pow( THIS[ this.hash ].zoomFactor, deltaTime / 1000 );
-
- this.viewport.zoomBy( adjustedFactor );
- this.viewport.applyConstraints();
- THIS[ this.hash ].lastZoomTime = currentTime;
- scheduleZoom( this );
- }
-}
-
-
-function doSingleZoomIn() {
- if ( this.viewport ) {
- THIS[ this.hash ].zooming = false;
- this.viewport.zoomBy(
- this.zoomPerClick / 1.0
- );
- this.viewport.applyConstraints();
- }
-}
-
-
-function doSingleZoomOut() {
- if ( this.viewport ) {
- THIS[ this.hash ].zooming = false;
- this.viewport.zoomBy(
- 1.0 / this.zoomPerClick
- );
- this.viewport.applyConstraints();
- }
-}
-
-
-function lightUp() {
- 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._sequenceIndex - 1;
- if(this.navPrevNextWrap && previous < 0){
- previous += this.tileSources.length;
- }
- this.goToPage( previous );
-}
-
-
-function onNext(){
- var next = this._sequenceIndex + 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,
- _this = this,
- viewerSize,
- navigatorSize;
-
- //We may need to create a new element and id if they did not
- //provide the id for the existing element
- if( !options.id ){
- options.id = 'navigator-' + $.now();
- this.element = $.makeNeutralElement( "div" );
- options.controlOptions = {
- anchor: $.ControlAnchor.TOP_RIGHT,
- attachToViewer: true,
- autoFade: options.autoFade
- };
-
- if( options.position ){
- if( 'BOTTOM_RIGHT' == options.position ){
- options.controlOptions.anchor = $.ControlAnchor.BOTTOM_RIGHT;
- } else if( 'BOTTOM_LEFT' == options.position ){
- options.controlOptions.anchor = $.ControlAnchor.BOTTOM_LEFT;
- } else if( 'TOP_RIGHT' == options.position ){
- options.controlOptions.anchor = $.ControlAnchor.TOP_RIGHT;
- } else if( 'TOP_LEFT' == options.position ){
- options.controlOptions.anchor = $.ControlAnchor.TOP_LEFT;
- } else if( 'ABSOLUTE' == options.position ){
- options.controlOptions.anchor = $.ControlAnchor.ABSOLUTE;
- options.controlOptions.top = options.top;
- options.controlOptions.left = options.left;
- options.controlOptions.height = options.height;
- options.controlOptions.width = options.width;
- }
- }
-
- } 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,
- tabIndex: -1, // No keyboard navigation, omit from tab order
- //These need to be overridden to prevent recursion since
- //the navigator is a viewer and a viewer has a navigator
- showNavigator: false,
- mouseNavEnabled: false,
- showNavigationControl: false,
- showSequenceControl: false,
- immediateRender: true,
- blendTime: 0,
- animationTime: 0,
- autoResize: options.autoResize,
- // prevent resizing the navigator from adding unwanted space around the image
- minZoomImageRatio: 1.0
- });
-
- options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;
-
- $.setElementTouchActionNone( this.element );
-
- this.borderWidth = 2;
- //At some browser magnification levels the display regions lines up correctly, but at some there appears to
- //be a one pixel gap.
- this.fudge = new $.Point(1, 1);
- this.totalBorderWidths = new $.Point(this.borderWidth*2, this.borderWidth*2).minus(this.fudge);
-
-
- if ( options.controlOptions.anchor != $.ControlAnchor.NONE ) {
- (function( style, borderWidth ){
- style.margin = '0px';
- style.border = borderWidth + 'px solid #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.displayRegionContainer = $.makeNeutralElement("div");
- this.displayRegionContainer.id = this.element.id + '-displayregioncontainer';
- this.displayRegionContainer.className = "displayregioncontainer";
- this.displayRegionContainer.style.width = "100%";
- this.displayRegionContainer.style.height = "100%";
-
- viewer.addControl(
- this.element,
- options.controlOptions
- );
-
- this._resizeWithViewer = options.controlOptions.anchor != $.ControlAnchor.ABSOLUTE &&
- options.controlOptions.anchor != $.ControlAnchor.NONE;
-
- if ( this._resizeWithViewer ) {
- 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 = Math.round( viewerSize.y * options.sizeRatio ) + 'px';
- this.element.style.width = Math.round( viewerSize.x * options.sizeRatio ) + 'px';
- this.oldViewerSize = viewerSize;
- }
- navigatorSize = $.getElementSize( this.element );
- this.elementArea = navigatorSize.x * navigatorSize.y;
- }
-
- this.oldContainerSize = new $.Point( 0, 0 );
-
- $.Viewer.apply( this, [ options ] );
-
- this.displayRegionContainer.appendChild(this.displayRegion);
- this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer);
-
- function rotate(degrees) {
- _setTransformRotate(_this.displayRegionContainer, degrees);
- _setTransformRotate(_this.displayRegion, -degrees);
- _this.viewport.setRotation(degrees);
- }
- if (options.navigatorRotate) {
- var degrees = options.viewer.viewport ?
- options.viewer.viewport.getRotation() :
- options.viewer.degrees || 0;
- rotate(degrees);
- options.viewer.addHandler("rotate", function (args) {
- rotate(args.degrees);
- });
- }
-
- // Remove the base class' (Viewer's) innerTracker and replace it with our own
- this.innerTracker.destroy();
- this.innerTracker = new $.MouseTracker({
- element: this.element,
- dragHandler: $.delegate( this, onCanvasDrag ),
- clickHandler: $.delegate( this, onCanvasClick ),
- releaseHandler: $.delegate( this, onCanvasRelease ),
- scrollHandler: $.delegate( this, onCanvasScroll )
- });
-
- this.addHandler("reset-size", function() {
- if (_this.viewport) {
- _this.viewport.goHome(true);
- }
- });
-
- viewer.world.addHandler("item-index-change", function(event) {
- var item = _this.world.getItemAt(event.previousIndex);
- _this.world.setItemIndex(item, event.newIndex);
- });
-
- viewer.world.addHandler("remove-item", function(event) {
- var theirItem = event.item;
- var myItem = _this._getMatchingItem(theirItem);
- if (myItem) {
- _this.world.removeItem(myItem);
- }
- });
-
- this.update(viewer.viewport);
-};
-
-$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{
-
- /**
- * Used to notify the navigator when its size has changed.
- * Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable.
- * @function
- */
- updateSize: function () {
- if ( this.viewport ) {
- var containerSize = new $.Point(
- (this.container.clientWidth === 0 ? 1 : this.container.clientWidth),
- (this.container.clientHeight === 0 ? 1 : this.container.clientHeight)
- );
-
- if ( !containerSize.equals( this.oldContainerSize ) ) {
- this.viewport.resize( containerSize, true );
- this.viewport.goHome(true);
- this.oldContainerSize = containerSize;
- this.drawer.clear();
- this.world.draw();
- }
- }
- },
-
- /**
- * Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs.
- * @function
- * @param {OpenSeadragon.Viewport} The viewport this navigator is tracking.
- */
- update: function( viewport ) {
-
- var viewerSize,
- newWidth,
- newHeight,
- bounds,
- topleft,
- bottomright;
-
- viewerSize = $.getElementSize( this.viewer.element );
- if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) {
- this.oldViewerSize = viewerSize;
-
- if ( this.maintainSizeRatio || !this.elementArea) {
- newWidth = viewerSize.x * this.sizeRatio;
- newHeight = viewerSize.y * this.sizeRatio;
- } else {
- newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y));
- newHeight = this.elementArea / newWidth;
- }
-
- this.element.style.width = Math.round( newWidth ) + 'px';
- this.element.style.height = Math.round( newHeight ) + 'px';
-
- if (!this.elementArea) {
- this.elementArea = newWidth * newHeight;
- }
-
- this.updateSize();
- }
-
- if (viewport && this.viewport) {
- bounds = viewport.getBoundsNoRotate(true);
- topleft = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false);
- bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false)
- .minus( this.totalBorderWidths );
-
- //update style for navigator-box
- var style = this.displayRegion.style;
- style.display = this.world.getItemCount() ? 'block' : 'none';
-
- style.top = Math.round( topleft.y ) + 'px';
- style.left = Math.round( 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.round( Math.max( width, 0 ) ) + 'px';
- style.height = Math.round( Math.max( height, 0 ) ) + 'px';
- }
-
- },
-
- // overrides Viewer.addTiledImage
- addTiledImage: function(options) {
- var _this = this;
-
- var original = options.originalTiledImage;
- delete options.original;
-
- var optionsClone = $.extend({}, options, {
- success: function(event) {
- var myItem = event.item;
- myItem._originalForNavigator = original;
- _this._matchBounds(myItem, original, true);
-
- original.addHandler('bounds-change', function() {
- _this._matchBounds(myItem, original);
- });
- }
- });
-
- return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]);
- },
-
- // private
- _getMatchingItem: function(theirItem) {
- var count = this.world.getItemCount();
- var item;
- for (var i = 0; i < count; i++) {
- item = this.world.getItemAt(i);
- if (item._originalForNavigator === theirItem) {
- return item;
- }
- }
-
- return null;
- },
-
- // private
- _matchBounds: function(myItem, theirItem, immediately) {
- var bounds = theirItem.getBounds();
- myItem.setPosition(bounds.getTopLeft(), immediately);
- myItem.setWidth(bounds.width, immediately);
- }
-});
-
-/**
- * @private
- * @inner
- * @function
- */
-function onCanvasClick( event ) {
- if ( event.quick && this.viewer.viewport ) {
- this.viewer.viewport.panTo(this.viewport.pointFromPixel(event.position));
- this.viewer.viewport.applyConstraints();
- }
-}
-
-/**
- * @private
- * @inner
- * @function
- */
-function onCanvasDrag( event ) {
- if ( this.viewer.viewport ) {
- 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;
-}
-
-/**
- * @function
- * @private
- * @param {Object} element
- * @param {Number} degrees
- */
-function _setTransformRotate (element, degrees) {
- element.style.webkitTransform = "rotate(" + degrees + "deg)";
- element.style.mozTransform = "rotate(" + degrees + "deg)";
- element.style.msTransform = "rotate(" + degrees + "deg)";
- element.style.oTransform = "rotate(" + degrees + "deg)";
- element.style.transform = "rotate(" + degrees + "deg)";
-}
-
-}( 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;
-};
-
-/** @lends OpenSeadragon.Point.prototype */
-$.Point.prototype = {
- /**
- * @function
- * @returns {OpenSeadragon.Point} a duplicate of this Point
- */
- clone: function() {
- return new $.Point(this.x, this.y);
- },
-
- /**
- * Add another Point to this point and return a new Point.
- * @function
- * @param {OpenSeadragon.Point} point The point to add vector components.
- * @returns {OpenSeadragon.Point} A new point representing the sum of the
- * vector components
- */
- plus: function( point ) {
- return new $.Point(
- this.x + point.x,
- this.y + point.y
- );
- },
-
- /**
- * Substract another Point to this point and return a new Point.
- * @function
- * @param {OpenSeadragon.Point} point The point to substract vector components.
- * @returns {OpenSeadragon.Point} A new point representing the substraction of the
- * vector components
- */
- minus: function( point ) {
- return new $.Point(
- this.x - point.x,
- this.y - point.y
- );
- },
-
- /**
- * Multiply this point by a factor and return a new Point.
- * @function
- * @param {Number} factor The factor to multiply vector components.
- * @returns {OpenSeadragon.Point} A new point representing the multiplication
- * of the vector components by the factor
- */
- times: function( factor ) {
- return new $.Point(
- this.x * factor,
- this.y * factor
- );
- },
-
- /**
- * Divide this point by a factor and return a new Point.
- * @function
- * @param {Number} factor The factor to divide vector components.
- * @returns {OpenSeadragon.Point} A new point representing the division of the
- * vector components by the factor
- */
- divide: function( factor ) {
- return new $.Point(
- this.x / factor,
- this.y / factor
- );
- },
-
- /**
- * Compute the opposite of this point and return a new Point.
- * @function
- * @returns {OpenSeadragon.Point} A new point representing the opposite of the
- * vector components
- */
- negate: function() {
- return new $.Point( -this.x, -this.y );
- },
-
- /**
- * Compute the distance between this point and another point.
- * @function
- * @param {OpenSeadragon.Point} point The point to compute the distance with.
- * @returns {Number} The distance between the 2 points
- */
- distanceTo: function( point ) {
- return Math.sqrt(
- Math.pow( this.x - point.x, 2 ) +
- Math.pow( this.y - point.y, 2 )
- );
- },
-
- /**
- * Apply a function to each coordinate of this point and return a new point.
- * @function
- * @param {function} func The function to apply to each coordinate.
- * @returns {OpenSeadragon.Point} A new point with the coordinates computed
- * by the specified function
- */
- apply: function( func ) {
- return new $.Point( func( this.x ), func( this.y ) );
- },
-
- /**
- * Check if this point is equal to another one.
- * @function
- * @param {OpenSeadragon.Point} point The point to compare this point with.
- * @returns {Boolean} true if they are equal, false otherwise.
- */
- equals: function( point ) {
- return (
- point instanceof $.Point
- ) && (
- this.x === point.x
- ) && (
- this.y === point.y
- );
- },
-
- /**
- * Rotates the point around the specified pivot
- * From http://stackoverflow.com/questions/4465931/rotate-rectangle-around-a-point
- * @function
- * @param {Number} degress to rotate around the pivot.
- * @param {OpenSeadragon.Point} [pivot=(0,0)] Point around which to rotate.
- * Defaults to the origin.
- * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot
- */
- rotate: function (degrees, pivot) {
- pivot = pivot || new $.Point(0, 0);
- var cos;
- var sin;
- // Avoid float computations when possible
- if (degrees % 90 === 0) {
- var d = degrees % 360;
- if (d < 0) {
- d += 360;
- }
- switch (d) {
- case 0:
- cos = 1;
- sin = 0;
- break;
- case 90:
- cos = 0;
- sin = 1;
- break;
- case 180:
- cos = -1;
- sin = 0;
- break;
- case 270:
- cos = 0;
- sin = -1;
- break;
- }
- } else {
- var angle = degrees * Math.PI / 180.0;
- cos = Math.cos(angle);
- sin = Math.sin(angle);
- }
- var x = cos * (this.x - pivot.x) - sin * (this.y - pivot.y) + pivot.x;
- var y = sin * (this.x - pivot.x) + cos * (this.y - pivot.y) + pivot.y;
- return new $.Point(x, y);
- },
-
- /**
- * Convert this point to a string in the format (x,y) where x and y are
- * rounded to the nearest integer.
- * @function
- * @returns {String} A string representation of this point.
- */
- toString: function() {
- return "(" + (Math.round(this.x * 100) / 100) + "," + (Math.round(this.y * 100) / 100) + ")";
- }
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - TileSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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 layers in an image pyramid. It has only a single key
- * interface that must be implemented to complete its key functionality:
- * 'getTileUrl'. It also has several optional interfaces that can be
- * implemented if a new TileSource wishes to support configuration via a simple
- * object or array ('configure') and if the tile source supports or requires
- * configuration via retrieval of a document on the network ala AJAX or JSONP,
- * ('getImageInfo').
- * <br/>
- * By default the image pyramid is split into N layers where the image's longest
- * side in M (in pixels), where N is the smallest integer which satisfies
- * <strong>2^(N+1) >= M</strong>.
- *
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.EventSource
- * @param {Object} options
- * You can either specify a URL, or literally define the TileSource (by specifying
- * width, height, tileSize, tileOverlap, minLevel, and maxLevel). For the former,
- * the extending class is expected to implement 'getImageInfo' and 'configure'.
- * For the latter, the construction is assumed to occur through
- * the extending classes implementation of 'configure'.
- * @param {String} [options.url]
- * The URL for the data necessary for this TileSource.
- * @param {Function} [options.success]
- * A function to be called upon successful creation.
- * @param {Boolean} [options.ajaxWithCredentials]
- * If this TileSource needs to make an AJAX call, this specifies whether to set
- * the XHR's withCredentials (for accessing secure data).
- * @param {Number} [options.width]
- * Width of the source image at max resolution in pixels.
- * @param {Number} [options.height]
- * Height of the source image at max resolution in pixels.
- * @param {Number} [options.tileSize]
- * The size of the tiles to assumed to make up each pyramid layer in pixels.
- * Tile size determines the point at which the image pyramid must be
- * divided into a matrix of smaller images.
- * Use options.tileWidth and options.tileHeight to support non-square tiles.
- * @param {Number} [options.tileWidth]
- * The width of the tiles to assumed to make up each pyramid layer in pixels.
- * @param {Number} [options.tileHeight]
- * The height of the tiles to assumed to make up each pyramid layer in pixels.
- * @param {Number} [options.tileOverlap]
- * The number of pixels each tile is expected to overlap touching tiles.
- * @param {Number} [options.minLevel]
- * The minimum level to attempt to load.
- * @param {Number} [options.maxLevel]
- * The maximum level to attempt to load.
- */
-$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) {
- var _this = this;
-
- var args = arguments,
- options,
- i;
-
- if( $.isPlainObject( width ) ){
- options = width;
- }else{
- options = {
- width: args[0],
- height: args[1],
- tileSize: args[2],
- tileOverlap: args[3],
- minLevel: args[4],
- maxLevel: args[5]
- };
- }
-
- //Tile sources supply some events, namely 'ready' when they must be configured
- //by asynchronously fetching their configuration data.
- $.EventSource.call( this );
-
- //we allow options to override anything we 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 );
-
- if (!this.success) {
- //Any functions that are passed as arguments are bound to the ready callback
- for ( i = 0; i < arguments.length; i++ ) {
- if ( $.isFunction( arguments[ i ] ) ) {
- this.success = arguments[ i ];
- //only one callback per constructor
- break;
- }
- }
- }
-
- if (this.success) {
- this.addHandler( 'ready', function ( event ) {
- _this.success( event );
- } );
- }
-
- /**
- * Ratio of width to height
- * @member {Number} aspectRatio
- * @memberof OpenSeadragon.TileSource#
- */
- /**
- * Vector storing x and y dimensions ( width and height respectively ).
- * @member {OpenSeadragon.Point} dimensions
- * @memberof OpenSeadragon.TileSource#
- */
- /**
- * The overlap in pixels each tile shares with its adjacent neighbors.
- * @member {Number} tileOverlap
- * @memberof OpenSeadragon.TileSource#
- */
- /**
- * The minimum pyramid level this tile source supports or should attempt to load.
- * @member {Number} minLevel
- * @memberof OpenSeadragon.TileSource#
- */
- /**
- * The maximum pyramid level this tile source supports or should attempt to load.
- * @member {Number} maxLevel
- * @memberof OpenSeadragon.TileSource#
- */
- /**
- *
- * @member {Boolean} ready
- * @memberof OpenSeadragon.TileSource#
- */
-
- if( 'string' == $.type( arguments[ 0 ] ) ){
- this.url = arguments[0];
- }
-
- if (this.url) {
- //in case the getImageInfo method is overriden and/or implies an
- //async mechanism set some safe defaults first
- this.aspectRatio = 1;
- this.dimensions = new $.Point( 10, 10 );
- this._tileWidth = 0;
- this._tileHeight = 0;
- this.tileOverlap = 0;
- this.minLevel = 0;
- this.maxLevel = 0;
- this.ready = false;
- //configuration via url implies the extending class
- //implements and 'configure'
- this.getImageInfo( this.url );
-
- } else {
-
- //explicit configuration via positional args in constructor
- //or the more idiomatic 'options' object
- this.ready = true;
- this.aspectRatio = ( options.width && options.height ) ?
- ( options.width / options.height ) : 1;
- this.dimensions = new $.Point( options.width, options.height );
-
- if ( this.tileSize ){
- this._tileWidth = this._tileHeight = this.tileSize;
- delete this.tileSize;
- } else {
- if( this.tileWidth ){
- // We were passed tileWidth in options, but we want to rename it
- // with a leading underscore to make clear that it is not safe to directly modify it
- this._tileWidth = this.tileWidth;
- delete this.tileWidth;
- } else {
- this._tileWidth = 0;
- }
-
- if( this.tileHeight ){
- // See note above about renaming this.tileWidth
- this._tileHeight = this.tileHeight;
- delete this.tileHeight;
- } else {
- this._tileHeight = 0;
- }
- }
-
- this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0;
- this.minLevel = options.minLevel ? options.minLevel : 0;
- this.maxLevel = ( undefined !== options.maxLevel && null !== options.maxLevel ) ?
- options.maxLevel : (
- ( options.width && options.height ) ? Math.ceil(
- Math.log( Math.max( options.width, options.height ) ) /
- Math.log( 2 )
- ) : 0
- );
- if( this.success && $.isFunction( this.success ) ){
- this.success( this );
- }
- }
-
-
-};
-
-/** @lends OpenSeadragon.TileSource.prototype */
-$.TileSource.prototype = {
-
- getTileSize: function( level ) {
- $.console.error(
- "[TileSource.getTileSize] is deprecated." +
- "Use TileSource.getTileWidth() and TileSource.getTileHeight() instead"
- );
- return this._tileWidth;
- },
-
- /**
- * Return the tileWidth for a given level.
- * Subclasses should override this if tileWidth can be different at different levels
- * such as in IIIFTileSource. Code should use this function rather than reading
- * from ._tileWidth directly.
- * @function
- * @param {Number} level
- */
- getTileWidth: function( level ) {
- if (!this._tileWidth) {
- return this.getTileSize(level);
- }
- return this._tileWidth;
- },
-
- /**
- * Return the tileHeight for a given level.
- * Subclasses should override this if tileHeight can be different at different levels
- * such as in IIIFTileSource. Code should use this function rather than reading
- * from ._tileHeight directly.
- * @function
- * @param {Number} level
- */
- getTileHeight: function( level ) {
- if (!this._tileHeight) {
- return this.getTileSize(level);
- }
- return this._tileHeight;
- },
-
- /**
- * @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.getTileWidth(level) ),
- y = Math.ceil( scale * this.dimensions.y / this.getTileHeight(level) );
-
- return new $.Point( x, y );
- },
-
- /**
- * @function
- * @param {Number} level
- */
- getPixelRatio: function( level ) {
- var imageSizeScaled = this.dimensions.times( this.getLevelScale( level ) ),
- rx = 1.0 / imageSizeScaled.x,
- ry = 1.0 / imageSizeScaled.y;
-
- return new $.Point(rx, ry);
- },
-
-
- /**
- * @function
- * @param {Number} level
- */
- getClosestLevel: function( rect ) {
- var i,
- tilesPerSide,
- tiles;
-
- for( i = this.minLevel; i < this.maxLevel; i++ ){
- tiles = this.getNumTiles( i );
- tilesPerSide = new $.Point(
- Math.floor( rect.x / this.getTileWidth(i) ),
- Math.floor( rect.y / this.getTileHeight(i) )
- );
-
- if( tiles.x + 1 >= tilesPerSide.x && tiles.y + 1 >= tilesPerSide.y ){
- 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.getTileWidth(level) ),
- ty = Math.floor( pixel.y / this.getTileHeight(level) );
-
- 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 ) ),
- tileWidth = this.getTileWidth(level),
- tileHeight = this.getTileHeight(level),
- px = ( x === 0 ) ? 0 : tileWidth * x - this.tileOverlap,
- py = ( y === 0 ) ? 0 : tileHeight * y - this.tileOverlap,
- sx = tileWidth + ( x === 0 ? 1 : 2 ) * this.tileOverlap,
- sy = tileHeight + ( y === 0 ? 1 : 2 ) * this.tileOverlap,
- scale = 1.0 / dimensionsScaled.x;
-
- sx = Math.min( sx, dimensionsScaled.x - px );
- sy = Math.min( sy, dimensionsScaled.y - py );
-
- 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 ]);
- if (options.ajaxWithCredentials === undefined) {
- options.ajaxWithCredentials = _this.ajaxWithCredentials;
- }
-
- readySource = new $TileSource( options );
- _this.ready = true;
- /**
- * Raised when a TileSource is opened and initialized.
- *
- * @event ready
- * @memberof OpenSeadragon.TileSource
- * @type {object}
- * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.
- * @property {Object} tileSource
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- _this.raiseEvent( 'ready', { tileSource: readySource } );
- };
-
- if( url.match(/\.js$/) ){
- //TODO: Its not very flexible to require tile sources to end jsonp
- // request for info with a url that ends with '.js' but for
- // now it's the only way I see to distinguish uniformly.
- callbackName = url.split( '/' ).pop().replace('.js','');
- $.jsonp({
- url: url,
- async: false,
- callbackName: callbackName,
- callback: callback
- });
- } else {
- // request info via xhr asynchronously.
- $.makeAjaxRequest( {
- url: url,
- withCredentials: this.ajaxWithCredentials,
- success: function( xhr ) {
- var data = processResponse( xhr );
- callback( data );
- },
- error: function ( xhr, exc ) {
- var msg;
-
- /*
- IE < 10 will block XHR requests to different origins. Any property access on the request
- object will raise an exception which we'll attempt to handle by formatting the original
- exception rather than the second one raised when we try to access xhr.status
- */
- try {
- msg = "HTTP " + xhr.status + " attempting to load TileSource";
- } 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 specified by the given x, y, and level components.
- * This method is not implemented by this class other than to throw an Error
- * announcing you have to implement it. Because of the variety of tile
- * server technologies, and various specifications for building image
- * pyramids, this method is here to allow easy integration.
- * @function
- * @param {Number} level
- * @param {Number} x
- * @param {Number} y
- * @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*[\{\[].*/) ){
- data = $.parseJSON(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) {
- if ("Image" == data.documentElement.localName || "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/')
- ///([^\/]+?)(\.(dzi|xml|js))?\/?(\?.*)?$/, '$1_files/'); // ROGERMOD - Fix for IIP Image Server URLs
-
- if (url.search(/\.(dzi|xml|js)\?/) != -1) {
- options.queryParams = url.match(/\?.*/);
- }else{
- options.queryParams = '';
- }
- }
-
- return options;
- },
-
-
- /**
- * @function
- * @param {Number} level
- * @param {Number} x
- * @param {Number} y
- */
- getTileUrl: function( level, x, y ) {
- return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat, this.queryParams ].join( '' );
- },
-
-
- /**
- * @function
- * @param {Number} level
- * @param {Number} x
- * @param {Number} y
- */
- tileExists: function( level, x, y ) {
- var rects = this._levelRects[ level ],
- rect,
- scale,
- xMin,
- yMin,
- xMax,
- yMax,
- i;
-
- if ( !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.localName || root.tagName,
- ns = xmlDoc.documentElement.namespaceURI,
- configuration = null,
- displayRects = [],
- dispRectNodes,
- dispRectNode,
- rectNode,
- sizeNode,
- i;
-
- if ( rootName == "Image" ) {
-
- try {
- sizeNode = root.getElementsByTagName("Size" )[ 0 ];
- if (sizeNode === undefined) {
- sizeNode = root.getElementsByTagNameNS(ns, "Size" )[ 0 ];
- }
-
- configuration = {
- Image: {
- xmlns: "http://schemas.microsoft.com/deepzoom/2008",
- Url: root.getAttribute( "Url" ),
- Format: root.getAttribute( "Format" ),
- DisplayRect: null,
- Overlap: parseInt( root.getAttribute( "Overlap" ), 10 ),
- TileSize: parseInt( root.getAttribute( "TileSize" ), 10 ),
- Size: {
- Height: parseInt( sizeNode.getAttribute( "Height" ), 10 ),
- Width: parseInt( sizeNode.getAttribute( "Width" ), 10 )
- }
- }
- };
-
- if ( !$.imageFormatSupported( configuration.Image.Format ) ) {
- throw new Error(
- $.getString( "Errors.ImageFormat", configuration.Image.Format.toUpperCase() )
- );
- }
-
- dispRectNodes = root.getElementsByTagName("DisplayRect" );
- if (dispRectNodes === undefined) {
- dispRectNodes = root.getElementsByTagNameNS(ns, "DisplayRect" )[ 0 ];
- }
-
- for ( i = 0; i < dispRectNodes.length; i++ ) {
- dispRectNode = dispRectNodes[ i ];
- rectNode = dispRectNode.getElementsByTagName("Rect" )[ 0 ];
- if (rectNode === undefined) {
- rectNode = dispRectNode.getElementsByTagNameNS(ns, "Rect" )[ 0 ];
- }
-
- displayRects.push({
- Rect: {
- X: parseInt( rectNode.getAttribute( "X" ), 10 ),
- Y: parseInt( rectNode.getAttribute( "Y" ), 10 ),
- Width: parseInt( rectNode.getAttribute( "Width" ), 10 ),
- Height: parseInt( rectNode.getAttribute( "Height" ), 10 ),
- MinLevel: parseInt( dispRectNode.getAttribute( "MinLevel" ), 10 ),
- MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ), 10 )
- }
- });
- }
-
- if( displayRects.length ){
- configuration.Image.DisplayRect = displayRects;
- }
-
- return configureFromObject( tileSource, configuration );
-
- } catch ( e ) {
- throw (e instanceof Error) ?
- e :
- new Error( $.getString("Errors.Dzi") );
- }
- } else if ( rootName == "Collection" ) {
- throw new Error( $.getString( "Errors.Dzc" ) );
- } else if ( rootName == "Error" ) {
- var messageNode = root.getElementsByTagName("Message")[0];
- var message = messageNode.firstChild.nodeValue;
- throw new Error(message);
- }
-
- throw new Error( $.getString( "Errors.Dzi" ) );
-}
-
-/**
- * @private
- * @inner
- * @function
- */
-function configureFromObject( tileSource, configuration ){
- var imageData = configuration.Image,
- tilesUrl = imageData.Url,
- fileFormat = imageData.Format,
- sizeData = imageData.Size,
- dispRectData = imageData.DisplayRect || [],
- width = parseInt( sizeData.Width, 10 ),
- height = parseInt( sizeData.Height, 10 ),
- tileSize = parseInt( imageData.TileSize, 10 ),
- tileOverlap = parseInt( imageData.Overlap, 10 ),
- displayRects = [],
- rectData,
- i;
-
- //TODO: need to figure out out to better handle image format compatibility
- // which actually includes additional file formats like xml and pdf
- // and plain text for various tilesource implementations to avoid low
- // level errors.
- //
- // For now, just don't perform the check.
- //
- /*if ( !imageFormatSupported( fileFormat ) ) {
- throw new Error(
- $.getString( "Errors.ImageFormat", fileFormat.toUpperCase() )
- );
- }*/
-
- for ( i = 0; i < dispRectData.length; i++ ) {
- rectData = dispRectData[ i ].Rect;
-
- displayRects.push( new $.DisplayRect(
- parseInt( rectData.X, 10 ),
- parseInt( rectData.Y, 10 ),
- parseInt( rectData.Width, 10 ),
- parseInt( rectData.Height, 10 ),
- parseInt( rectData.MinLevel, 10 ),
- parseInt( rectData.MaxLevel, 10 )
- ));
- }
-
- return $.extend(true, {
- width: width, /* width *required */
- height: height, /* height *required */
- tileSize: tileSize, /* tileSize *required */
- tileOverlap: tileOverlap, /* tileOverlap *required */
- minLevel: null, /* minLevel */
- maxLevel: null, /* maxLevel */
- tilesUrl: tilesUrl, /* tilesUrl */
- fileFormat: fileFormat, /* fileFormat */
- displayRects: displayRects /* displayRects */
- }, configuration );
-
-}
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - IIIFTileSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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 IIIFTileSource
- * @classdesc A client implementation of the International Image Interoperability Framework
- * Format: Image API 1.0 - 2.1
- *
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.TileSource
- * @see http://iiif.io/api/image/
- */
-$.IIIFTileSource = function( options ){
-
-
- $.extend( true, this, options );
-
- if ( !( this.height && this.width && this['@id'] ) ) {
- throw new Error( 'IIIF required parameters not provided.' );
- }
-
- options.tileSizePerScaleFactor = {};
-
- // N.B. 2.0 renamed scale_factors to scaleFactors
- if ( this.tile_width && this.tile_height ) {
- options.tileWidth = this.tile_width;
- options.tileHeight = this.tile_height;
- } else if ( this.tile_width ) {
- options.tileSize = this.tile_width;
- } else if ( this.tile_height ) {
- options.tileSize = this.tile_height;
- } else if ( this.tiles ) {
- // Version 2.0 forwards
- if ( this.tiles.length == 1 ) {
- options.tileWidth = this.tiles[0].width;
- // Use height if provided, otherwise assume square tiles and use width.
- options.tileHeight = this.tiles[0].height || this.tiles[0].width;
- this.scale_factors = this.tiles[0].scaleFactors;
- } else {
- // Multiple tile sizes at different levels
- this.scale_factors = [];
- for (var t = 0; t < this.tiles.length; t++ ) {
- for (var sf = 0; sf < this.tiles[t].scaleFactors.length; sf++) {
- var scaleFactor = this.tiles[t].scaleFactors[sf];
- this.scale_factors.push(scaleFactor);
- options.tileSizePerScaleFactor[scaleFactor] = {
- width: this.tiles[t].width,
- height: this.tiles[t].height || this.tiles[t].width
- };
- }
- }
- }
- } else if ( canBeTiled(options.profile) ) {
- // use the largest of tileOptions that is smaller than the short dimension
- var shortDim = Math.min( this.height, this.width ),
- tileOptions = [256,512,1024],
- smallerTiles = [];
-
- for ( var c = 0; c < tileOptions.length; c++ ) {
- if ( tileOptions[c] <= shortDim ) {
- smallerTiles.push( tileOptions[c] );
- }
- }
-
- if ( smallerTiles.length > 0 ) {
- options.tileSize = Math.max.apply( null, smallerTiles );
- } else {
- // If we're smaller than 256, just use the short side.
- options.tileSize = shortDim;
- }
- } else if (this.sizes && this.sizes.length > 0) {
- // This info.json can't be tiled, but we can still construct a legacy pyramid from the sizes array.
- // In this mode, IIIFTileSource will call functions from the abstract baseTileSource or the
- // LegacyTileSource instead of performing IIIF tiling.
- this.emulateLegacyImagePyramid = true;
-
- options.levels = constructLevels( this );
- // use the largest available size to define tiles
- $.extend( true, options, {
- width: options.levels[ options.levels.length - 1 ].width,
- height: options.levels[ options.levels.length - 1 ].height,
- tileSize: Math.max( options.height, options.width ),
- tileOverlap: 0,
- minLevel: 0,
- maxLevel: options.levels.length - 1
- });
- this.levels = options.levels;
- } else {
- $.console.error("Nothing in the info.json to construct image pyramids from");
- }
-
- if (!options.maxLevel && !this.emulateLegacyImagePyramid) {
- if (!this.scale_factors) {
- options.maxLevel = Number(Math.ceil(Math.log(Math.max(this.width, this.height), 2)));
- } else {
- options.maxLevel = Math.floor(Math.pow(Math.max.apply(null, this.scale_factors), 0.5));
- }
- }
-
- $.TileSource.apply( this, [ options ] );
-};
-
-$.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.IIIFTileSource.prototype */{
- /**
- * Determine if the data and/or url imply the image service is supported by
- * this tile source.
- * @function
- * @param {Object|Array} data
- * @param {String} optional - url
- */
-
- supports: function( data, url ) {
- // Version 2.0 and forwards
- if (data.protocol && data.protocol == 'http://iiif.io/api/image') {
- return true;
- // Version 1.1
- } else if ( data['@context'] && (
- data['@context'] == "http://library.stanford.edu/iiif/image-api/1.1/context.json" ||
- data['@context'] == "http://iiif.io/api/image/1/context.json") ) {
- // N.B. the iiif.io context is wrong, but where the representation lives so likely to be used
- return true;
-
- // Version 1.0
- } else if ( data.profile &&
- data.profile.indexOf("http://library.stanford.edu/iiif/image-api/compliance.html") === 0) {
- return true;
- } else if ( data.identifier && data.width && data.height ) {
- return true;
- } else if ( data.documentElement &&
- "info" == data.documentElement.tagName &&
- "http://library.stanford.edu/iiif/image-api/ns/" ==
- data.documentElement.namespaceURI) {
- return true;
-
- // Not IIIF
- } else {
- return false;
- }
- },
-
- /**
- *
- * @function
- * @param {Object} data - the raw configuration
- * @example <caption>IIIF 1.1 Info Looks like this</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, url ){
- // Try to deduce our version and fake it upwards if needed
- if ( !$.isPlainObject(data) ) {
- var options = configureFromXml10( data );
- options['@context'] = "http://iiif.io/api/image/1.0/context.json";
- options['@id'] = url.replace('/info.xml', '');
- return options;
- } else if ( !data['@context'] ) {
- data['@context'] = 'http://iiif.io/api/image/1.0/context.json';
- data['@id'] = url.replace('/info.json', '');
- return data;
- } else {
- return data;
- }
- },
-
- /**
- * Return the tileWidth for the given level.
- * @function
- * @param {Number} level
- */
- getTileWidth: function( level ) {
-
- if(this.emulateLegacyImagePyramid) {
- return $.TileSource.prototype.getTileWidth.call(this, level);
- }
-
- var scaleFactor = Math.pow(2, this.maxLevel - level);
-
- if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {
- return this.tileSizePerScaleFactor[scaleFactor].width;
- }
- return this._tileWidth;
- },
-
- /**
- * Return the tileHeight for the given level.
- * @function
- * @param {Number} level
- */
- getTileHeight: function( level ) {
-
- if(this.emulateLegacyImagePyramid) {
- return $.TileSource.prototype.getTileHeight.call(this, level);
- }
-
- var scaleFactor = Math.pow(2, this.maxLevel - level);
-
- if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {
- return this.tileSizePerScaleFactor[scaleFactor].height;
- }
- return this._tileHeight;
- },
-
- /**
- * @function
- * @param {Number} level
- */
- getLevelScale: function ( level ) {
-
- if(this.emulateLegacyImagePyramid) {
- var levelScale = NaN;
- if (this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel) {
- levelScale =
- this.levels[level].width /
- this.levels[this.maxLevel].width;
- }
- return levelScale;
- }
-
- return $.TileSource.prototype.getLevelScale.call(this, level);
- },
-
- /**
- * @function
- * @param {Number} level
- */
- getNumTiles: function( level ) {
-
- if(this.emulateLegacyImagePyramid) {
- var scale = this.getLevelScale(level);
- if (scale) {
- return new $.Point(1, 1);
- } else {
- return new $.Point(0, 0);
- }
- }
-
- return $.TileSource.prototype.getNumTiles.call(this, level);
- },
-
-
- /**
- * @function
- * @param {Number} level
- * @param {OpenSeadragon.Point} point
- */
- getTileAtPoint: function( level, point ) {
-
- if(this.emulateLegacyImagePyramid) {
- return new $.Point(0, 0);
- }
-
- return $.TileSource.prototype.getTileAtPoint.call(this, level, point);
- },
-
-
- /**
- * Responsible for retrieving the url which will return an image for the
- * region specified by the given x, y, and level components.
- * @function
- * @param {Number} level - z index
- * @param {Number} x
- * @param {Number} y
- * @throws {Error}
- */
- getTileUrl: function( level, x, y ){
-
- if(this.emulateLegacyImagePyramid) {
- var url = null;
- if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {
- url = this.levels[ level ].url;
- }
- return url;
- }
-
- //# constants
- var IIIF_ROTATION = '0',
- //## get the scale (level as a decimal)
- scale = Math.pow( 0.5, this.maxLevel - level ),
-
- //# image dimensions at this level
- levelWidth = Math.ceil( this.width * scale ),
- levelHeight = Math.ceil( this.height * scale ),
-
- //## iiif region
- tileWidth,
- tileHeight,
- iiifTileSizeWidth,
- iiifTileSizeHeight,
- iiifRegion,
- iiifTileX,
- iiifTileY,
- iiifTileW,
- iiifTileH,
- iiifSize,
- iiifQuality,
- uri;
-
- tileWidth = this.getTileWidth(level);
- tileHeight = this.getTileHeight(level);
- iiifTileSizeWidth = Math.ceil( tileWidth / scale );
- iiifTileSizeHeight = Math.ceil( tileHeight / scale );
-
- if ( this['@context'].indexOf('/1.0/context.json') > -1 ||
- this['@context'].indexOf('/1.1/context.json') > -1 ||
- this['@context'].indexOf('/1/context.json') > -1 ) {
- iiifQuality = "native.jpg";
- } else {
- iiifQuality = "default.jpg";
- }
-
- if ( levelWidth < tileWidth && levelHeight < tileHeight ){
- 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, iiifQuality ].join( '/' );
-
- return uri;
- }
-
- });
-
- /**
- * Determine whether arbitrary tile requests can be made against a service with the given profile
- * @function
- * @param {object} profile - IIIF profile object
- * @throws {Error}
- */
- function canBeTiled (profile ) {
- var level0Profiles = [
- "http://library.stanford.edu/iiif/image-api/compliance.html#level0",
- "http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0",
- "http://iiif.io/api/image/2/level0.json"
- ];
- var isLevel0 = (level0Profiles.indexOf(profile[0]) != -1);
- return !isLevel0 || (profile.indexOf("sizeByW") != -1);
- }
-
- /**
- * Build the legacy pyramid URLs (one tile per level)
- * @function
- * @param {object} options - infoJson
- * @throws {Error}
- */
- function constructLevels(options) {
- var levels = [];
- for(var i=0; i<options.sizes.length; i++) {
- levels.push({
- url: options['@id'] + '/full/' + options.sizes[i].width + ',/0/default.jpg',
- width: options.sizes[i].width,
- height: options.sizes[i].height
- });
- }
- return levels.sort(function(a,b){return a.width - b.width;});
- }
-
-
- function configureFromXml10(xmlDoc) {
- //parse the xml
- if ( !xmlDoc || !xmlDoc.documentElement ) {
- throw new Error( $.getString( "Errors.Xml" ) );
- }
-
- var root = xmlDoc.documentElement,
- rootName = root.tagName,
- configuration = null;
-
- if ( rootName == "info" ) {
- try {
- configuration = {};
- parseXML10( root, configuration );
- return configuration;
-
- } catch ( e ) {
- throw (e instanceof Error) ?
- e :
- new Error( $.getString("Errors.IIIF") );
- }
- }
- throw new Error( $.getString( "Errors.IIIF" ) );
- }
-
- function parseXML10( node, configuration, property ) {
- var i,
- value;
- if ( node.nodeType == 3 && property ) {//text node
- value = node.nodeValue.trim();
- if( value.match(/^\d*$/)){
- value = Number( value );
- }
- if( !configuration[ property ] ){
- configuration[ property ] = value;
- }else{
- if( !$.isArray( configuration[ property ] ) ){
- configuration[ property ] = [ configuration[ property ] ];
- }
- configuration[ property ].push( value );
- }
- } else if( node.nodeType == 1 ){
- for( i = 0; i < node.childNodes.length; i++ ){
- parseXML10( node.childNodes[ i ], configuration, node.nodeName );
- }
- }
- }
-
-
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - OsmTileSource
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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 - ImageTileSource
- *
- * 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 ImageTileSource
- * @classdesc The ImageTileSource allows a simple image to be loaded
- * into an OpenSeadragon Viewer.
- * There are 2 ways to open an ImageTileSource:
- * 1. viewer.open({type: 'image', url: fooUrl});
- * 2. viewer.open(new OpenSeadragon.ImageTileSource({url: fooUrl}));
- *
- * With the first syntax, the crossOriginPolicy, ajaxWithCredentials and
- * useCanvas options are inherited from the viewer if they are not
- * specified directly in the options object.
- *
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.TileSource
- * @param {Object} options Options object.
- * @param {String} options.url URL of the image
- * @param {Boolean} [options.buildPyramid=true] If set to true (default), a
- * pyramid will be built internally to provide a better downsampling.
- * @param {String|Boolean} [options.crossOriginPolicy=false] Valid values are
- * 'Anonymous', 'use-credentials', and false. If false, image requests will
- * not use CORS preventing internal pyramid building for images from other
- * domains.
- * @param {String|Boolean} [options.ajaxWithCredentials=false] Whether to set
- * the withCredentials XHR flag for AJAX requests (when loading tile sources).
- * @param {Boolean} [options.useCanvas=true] Set to false to prevent any use
- * of the canvas API.
- */
- $.ImageTileSource = function (options) {
-
- options = $.extend({
- buildPyramid: true,
- crossOriginPolicy: false,
- ajaxWithCredentials: false,
- useCanvas: true
- }, options);
- $.TileSource.apply(this, [options]);
-
- };
-
- $.extend($.ImageTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ImageTileSource.prototype */{
- /**
- * Determine if the data and/or url imply the image service is supported by
- * this tile source.
- * @function
- * @param {Object|Array} data
- * @param {String} optional - url
- */
- supports: function (data, url) {
- return data.type && data.type === "image";
- },
- /**
- *
- * @function
- * @param {Object} options - the options
- * @param {String} dataUrl - the url the image was retreived from, if any.
- * @return {Object} options - A dictionary of keyword arguments sufficient
- * to configure this tile sources constructor.
- */
- configure: function (options, dataUrl) {
- return options;
- },
- /**
- * Responsible for retrieving, and caching the
- * image metadata pertinent to this TileSources implementation.
- * @function
- * @param {String} url
- * @throws {Error}
- */
- getImageInfo: function (url) {
- var image = this._image = new Image();
- var _this = this;
-
- if (this.crossOriginPolicy) {
- image.crossOrigin = this.crossOriginPolicy;
- }
- if (this.ajaxWithCredentials) {
- image.useCredentials = this.ajaxWithCredentials;
- }
-
- $.addEvent(image, 'load', function () {
- _this.width = image.naturalWidth;
- _this.height = image.naturalHeight;
- _this.aspectRatio = _this.width / _this.height;
- _this.dimensions = new $.Point(_this.width, _this.height);
- _this._tileWidth = _this.width;
- _this._tileHeight = _this.height;
- _this.tileOverlap = 0;
- _this.minLevel = 0;
- _this.levels = _this._buildLevels();
- _this.maxLevel = _this.levels.length - 1;
-
- _this.ready = true;
-
- // Note: this event is documented elsewhere, in TileSource
- _this.raiseEvent('ready', {tileSource: _this});
- });
-
- $.addEvent(image, 'error', function () {
- // Note: this event is documented elsewhere, in TileSource
- _this.raiseEvent('open-failed', {
- message: "Error loading image at " + url,
- source: url
- });
- });
-
- image.src = url;
- },
- /**
- * @function
- * @param {Number} level
- */
- getLevelScale: function (level) {
- var levelScale = NaN;
- if (level >= this.minLevel && level <= this.maxLevel) {
- levelScale =
- this.levels[level].width /
- this.levels[this.maxLevel].width;
- }
- return levelScale;
- },
- /**
- * @function
- * @param {Number} level
- */
- getNumTiles: function (level) {
- var scale = this.getLevelScale(level);
- if (scale) {
- return new $.Point(1, 1);
- } else {
- return new $.Point(0, 0);
- }
- },
- /**
- * @function
- * @param {Number} level
- * @param {OpenSeadragon.Point} point
- */
- getTileAtPoint: function (level, point) {
- return new $.Point(0, 0);
- },
- /**
- * Retrieves a tile url
- * @function
- * @param {Number} level Level of the tile
- * @param {Number} x x coordinate of the tile
- * @param {Number} y y coordinate of the tile
- */
- getTileUrl: function (level, x, y) {
- var url = null;
- if (level >= this.minLevel && level <= this.maxLevel) {
- url = this.levels[level].url;
- }
- return url;
- },
- /**
- * Retrieves a tile context 2D
- * @function
- * @param {Number} level Level of the tile
- * @param {Number} x x coordinate of the tile
- * @param {Number} y y coordinate of the tile
- */
- getContext2D: function (level, x, y) {
- var context = null;
- if (level >= this.minLevel && level <= this.maxLevel) {
- context = this.levels[level].context2D;
- }
- return context;
- },
-
- // private
- //
- // Builds the differents levels of the pyramid if possible
- // (i.e. if canvas API enabled and no canvas tainting issue).
- _buildLevels: function () {
- var levels = [{
- url: this._image.src,
- width: this._image.naturalWidth,
- height: this._image.naturalHeight
- }];
-
- if (!this.buildPyramid || !$.supportsCanvas || !this.useCanvas) {
- // We don't need the image anymore. Allows it to be GC.
- delete this._image;
- return levels;
- }
-
- var currentWidth = this._image.naturalWidth;
- var currentHeight = this._image.naturalHeight;
-
- var bigCanvas = document.createElement("canvas");
- var bigContext = bigCanvas.getContext("2d");
-
- bigCanvas.width = currentWidth;
- bigCanvas.height = currentHeight;
- bigContext.drawImage(this._image, 0, 0, currentWidth, currentHeight);
- // We cache the context of the highest level because the browser
- // is a lot faster at downsampling something it already has
- // downsampled before.
- levels[0].context2D = bigContext;
- // We don't need the image anymore. Allows it to be GC.
- delete this._image;
-
- if ($.isCanvasTainted(bigCanvas)) {
- // If the canvas is tainted, we can't compute the pyramid.
- return levels;
- }
-
- // We build smaller levels until either width or height becomes
- // 1 pixel wide.
- while (currentWidth >= 2 && currentHeight >= 2) {
- currentWidth = Math.floor(currentWidth / 2);
- currentHeight = Math.floor(currentHeight / 2);
- var smallCanvas = document.createElement("canvas");
- var smallContext = smallCanvas.getContext("2d");
- smallCanvas.width = currentWidth;
- smallCanvas.height = currentHeight;
- smallContext.drawImage(bigCanvas, 0, 0, currentWidth, currentHeight);
-
- levels.splice(0, 0, {
- context2D: smallContext,
- width: currentWidth,
- height: currentHeight
- });
-
- bigCanvas = smallCanvas;
- bigContext = smallContext;
- }
- return levels;
- }
- });
-
-}(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( $ ){
-
-// deprecated
-$.TileSourceCollection = function( tileSize, tileSources, rows, layout ) {
- $.console.error('TileSourceCollection is deprecated; use World instead');
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Button
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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( "div" );
-
- //if the user has specified the element to bind the control to explicitly
- //then do not add the default control images
- if ( !options.element ) {
- this.imgRest = $.makeTransparentImage( this.srcRest );
- this.imgGroup = $.makeTransparentImage( this.srcGroup );
- this.imgHover = $.makeTransparentImage( this.srcHover );
- this.imgDown = $.makeTransparentImage( this.srcDown );
-
- this.imgRest.alt =
- this.imgGroup.alt =
- this.imgHover.alt =
- this.imgDown.alt =
- this.tooltip;
-
- this.element.style.position = "relative";
- $.setElementTouchActionNone( this.element );
-
- this.imgGroup.style.position =
- this.imgHover.style.position =
- this.imgDown.style.position =
- "absolute";
-
- this.imgGroup.style.top =
- this.imgHover.style.top =
- this.imgDown.style.top =
- "0px";
-
- this.imgGroup.style.left =
- this.imgHover.style.left =
- this.imgDown.style.left =
- "0px";
-
- this.imgHover.style.visibility =
- this.imgDown.style.visibility =
- "hidden";
-
- if ( $.Browser.vendor == $.BROWSERS.FIREFOX && $.Browser.version < 3 ){
- this.imgGroup.style.top =
- this.imgHover.style.top =
- this.imgDown.style.top =
- "";
- }
-
- this.element.appendChild( this.imgRest );
- this.element.appendChild( this.imgGroup );
- this.element.appendChild( this.imgHover );
- this.element.appendChild( this.imgDown );
- }
-
-
- this.addHandler( "press", this.onPress );
- this.addHandler( "release", this.onRelease );
- this.addHandler( "click", this.onClick );
- this.addHandler( "enter", this.onEnter );
- this.addHandler( "exit", this.onExit );
- this.addHandler( "focus", this.onFocus );
- this.addHandler( "blur", this.onBlur );
-
- /**
- * The button's current state.
- * @member {OpenSeadragon.ButtonState} currentState
- * @memberof OpenSeadragon.Button#
- */
- this.currentState = $.ButtonState.GROUP;
-
- // When the button last began to fade.
- this.fadeBeginTime = null;
- // Whether this button should fade after user stops interacting with the viewport.
- this.shouldFade = false;
-
- this.element.style.display = "inline-block";
- this.element.style.position = "relative";
- this.element.title = this.tooltip;
-
- /**
- * Tracks mouse/touch/key events on the button.
- * @member {OpenSeadragon.MouseTracker} tracker
- * @memberof OpenSeadragon.Button#
- */
- this.tracker = new $.MouseTracker({
-
- 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;
- }
-
- });
-
- 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( "div" );
-
- // 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 );
- }
- }
-
- $.setElementTouchActionNone( this.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();
- }
- }
- },
- });
-};
-
-/** @lends OpenSeadragon.ButtonGroup.prototype */
-$.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 is described by it top left coordinates (x, y), width,
- * height and degrees of rotation around (x, y).
- * Note that the coordinate system used is the one commonly used with images:
- * x increases when going to the right
- * y increases when going to the bottom
- * degrees increases clockwise with 0 being the horizontal
- *
- * The constructor normalizes the rectangle to always have 0 <= degrees < 90
- *
- * @memberof OpenSeadragon
- * @param {Number} [x=0] The vector component 'x'.
- * @param {Number} [y=0] The vector component 'y'.
- * @param {Number} [width=0] The vector component 'width'.
- * @param {Number} [height=0] The vector component 'height'.
- * @param {Number} [degrees=0] Rotation of the rectangle around (x,y) in degrees.
- */
-$.Rect = function(x, y, width, height, degrees) {
- /**
- * The vector component 'x'.
- * @member {Number} x
- * @memberof OpenSeadragon.Rect#
- */
- this.x = typeof(x) === "number" ? x : 0;
- /**
- * The vector component 'y'.
- * @member {Number} y
- * @memberof OpenSeadragon.Rect#
- */
- this.y = typeof(y) === "number" ? y : 0;
- /**
- * The vector component 'width'.
- * @member {Number} width
- * @memberof OpenSeadragon.Rect#
- */
- this.width = typeof(width) === "number" ? width : 0;
- /**
- * The vector component 'height'.
- * @member {Number} height
- * @memberof OpenSeadragon.Rect#
- */
- this.height = typeof(height) === "number" ? height : 0;
-
- this.degrees = typeof(degrees) === "number" ? degrees : 0;
-
- // Normalizes the rectangle.
- this.degrees = this.degrees % 360;
- if (this.degrees < 0) {
- this.degrees += 360;
- }
- var newTopLeft, newWidth;
- if (this.degrees >= 270) {
- newTopLeft = this.getTopRight();
- this.x = newTopLeft.x;
- this.y = newTopLeft.y;
- newWidth = this.height;
- this.height = this.width;
- this.width = newWidth;
- this.degrees -= 270;
- } else if (this.degrees >= 180) {
- newTopLeft = this.getBottomRight();
- this.x = newTopLeft.x;
- this.y = newTopLeft.y;
- this.degrees -= 180;
- } else if (this.degrees >= 90) {
- newTopLeft = this.getBottomLeft();
- this.x = newTopLeft.x;
- this.y = newTopLeft.y;
- newWidth = this.height;
- this.height = this.width;
- this.width = newWidth;
- this.degrees -= 90;
- }
-};
-
-/**
- * Builds a rectangle having the 3 specified points as summits.
- * @static
- * @memberof OpenSeadragon.Rect
- * @param {OpenSeadragon.Point} topLeft
- * @param {OpenSeadragon.Point} topRight
- * @param {OpenSeadragon.Point} bottomLeft
- * @returns {OpenSeadragon.Rect}
- */
-$.Rect.fromSummits = function(topLeft, topRight, bottomLeft) {
- var width = topLeft.distanceTo(topRight);
- var height = topLeft.distanceTo(bottomLeft);
- var diff = topRight.minus(topLeft);
- var radians = Math.atan(diff.y / diff.x);
- if (diff.x < 0) {
- radians += Math.PI;
- } else if (diff.y < 0) {
- radians += 2 * Math.PI;
- }
- return new $.Rect(
- topLeft.x,
- topLeft.y,
- width,
- height,
- radians / Math.PI * 180);
-};
-
-/** @lends OpenSeadragon.Rect.prototype */
-$.Rect.prototype = {
- /**
- * @function
- * @returns {OpenSeadragon.Rect} a duplicate of this Rect
- */
- clone: function() {
- return new $.Rect(
- this.x,
- this.y,
- this.width,
- this.height,
- this.degrees);
- },
-
- /**
- * The aspect ratio is simply the ratio of width to height.
- * @function
- * @returns {Number} The ratio of width to height.
- */
- getAspectRatio: function() {
- return this.width / this.height;
- },
-
- /**
- * Provides the coordinates of the upper-left corner of the rectangle as a
- * point.
- * @function
- * @returns {OpenSeadragon.Point} The coordinate of the upper-left corner of
- * the rectangle.
- */
- getTopLeft: function() {
- return new $.Point(
- this.x,
- this.y
- );
- },
-
- /**
- * Provides the coordinates of the bottom-right corner of the rectangle as a
- * point.
- * @function
- * @returns {OpenSeadragon.Point} The coordinate of the bottom-right corner of
- * the rectangle.
- */
- getBottomRight: function() {
- return new $.Point(this.x + this.width, this.y + this.height)
- .rotate(this.degrees, this.getTopLeft());
- },
-
- /**
- * Provides the coordinates of the top-right corner of the rectangle as a
- * point.
- * @function
- * @returns {OpenSeadragon.Point} The coordinate of the top-right corner of
- * the rectangle.
- */
- getTopRight: function() {
- return new $.Point(this.x + this.width, this.y)
- .rotate(this.degrees, this.getTopLeft());
- },
-
- /**
- * Provides the coordinates of the bottom-left corner of the rectangle as a
- * point.
- * @function
- * @returns {OpenSeadragon.Point} The coordinate of the bottom-left corner of
- * the rectangle.
- */
- getBottomLeft: function() {
- return new $.Point(this.x, this.y + this.height)
- .rotate(this.degrees, this.getTopLeft());
- },
-
- /**
- * Computes the center of the rectangle.
- * @function
- * @returns {OpenSeadragon.Point} The center of the rectangle as represented
- * as represented by a 2-dimensional vector (x,y)
- */
- getCenter: function() {
- return new $.Point(
- this.x + this.width / 2.0,
- this.y + this.height / 2.0
- ).rotate(this.degrees, this.getTopLeft());
- },
-
- /**
- * Returns the width and height component as a vector OpenSeadragon.Point
- * @function
- * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the
- * 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 &&
- this.degrees === other.degrees;
- },
-
- /**
- * Multiply all dimensions (except degrees) in this Rect by a factor and
- * return a new Rect.
- * @function
- * @param {Number} factor The factor to multiply vector components.
- * @returns {OpenSeadragon.Rect} A new rect representing the multiplication
- * of the vector components by the factor
- */
- times: function(factor) {
- return new $.Rect(
- this.x * factor,
- this.y * factor,
- this.width * factor,
- this.height * factor,
- this.degrees);
- },
-
- /**
- * Translate/move this Rect by a vector and return new Rect.
- * @function
- * @param {OpenSeadragon.Point} delta The translation vector.
- * @returns {OpenSeadragon.Rect} A new rect with altered position
- */
- translate: function(delta) {
- return new $.Rect(
- this.x + delta.x,
- this.y + delta.y,
- this.width,
- this.height,
- this.degrees);
- },
-
- /**
- * Returns the smallest rectangle that will contain this and the given
- * rectangle bounding boxes.
- * @param {OpenSeadragon.Rect} rect
- * @return {OpenSeadragon.Rect} The new rectangle.
- */
- union: function(rect) {
- var thisBoundingBox = this.getBoundingBox();
- var otherBoundingBox = rect.getBoundingBox();
-
- var left = Math.min(thisBoundingBox.x, otherBoundingBox.x);
- var top = Math.min(thisBoundingBox.y, otherBoundingBox.y);
- var right = Math.max(
- thisBoundingBox.x + thisBoundingBox.width,
- otherBoundingBox.x + otherBoundingBox.width);
- var bottom = Math.max(
- thisBoundingBox.y + thisBoundingBox.height,
- otherBoundingBox.y + otherBoundingBox.height);
-
- return new $.Rect(
- left,
- top,
- right - left,
- bottom - top);
- },
-
- /**
- * Returns the bounding box of the intersection of this rectangle with the
- * given rectangle.
- * @param {OpenSeadragon.Rect} rect
- * @return {OpenSeadragon.Rect} the bounding box of the intersection
- * or null if the rectangles don't intersect.
- */
- intersection: function(rect) {
- // Simplified version of Weiler Atherton clipping algorithm
- // https://en.wikipedia.org/wiki/Weiler%E2%80%93Atherton_clipping_algorithm
- // Because we just want the bounding box of the intersection,
- // we can just compute the bounding box of:
- // 1. all the summits of this which are inside rect
- // 2. all the summits of rect which are inside this
- // 3. all the intersections of rect and this
- var EPSILON = 0.0000000001;
-
- var intersectionPoints = [];
-
- var thisTopLeft = this.getTopLeft();
- if (rect.containsPoint(thisTopLeft, EPSILON)) {
- intersectionPoints.push(thisTopLeft);
- }
- var thisTopRight = this.getTopRight();
- if (rect.containsPoint(thisTopRight, EPSILON)) {
- intersectionPoints.push(thisTopRight);
- }
- var thisBottomLeft = this.getBottomLeft();
- if (rect.containsPoint(thisBottomLeft, EPSILON)) {
- intersectionPoints.push(thisBottomLeft);
- }
- var thisBottomRight = this.getBottomRight();
- if (rect.containsPoint(thisBottomRight, EPSILON)) {
- intersectionPoints.push(thisBottomRight);
- }
-
- var rectTopLeft = rect.getTopLeft();
- if (this.containsPoint(rectTopLeft, EPSILON)) {
- intersectionPoints.push(rectTopLeft);
- }
- var rectTopRight = rect.getTopRight();
- if (this.containsPoint(rectTopRight, EPSILON)) {
- intersectionPoints.push(rectTopRight);
- }
- var rectBottomLeft = rect.getBottomLeft();
- if (this.containsPoint(rectBottomLeft, EPSILON)) {
- intersectionPoints.push(rectBottomLeft);
- }
- var rectBottomRight = rect.getBottomRight();
- if (this.containsPoint(rectBottomRight, EPSILON)) {
- intersectionPoints.push(rectBottomRight);
- }
-
- var thisSegments = this._getSegments();
- var rectSegments = rect._getSegments();
- for (var i = 0; i < thisSegments.length; i++) {
- var thisSegment = thisSegments[i];
- for (var j = 0; j < rectSegments.length; j++) {
- var rectSegment = rectSegments[j];
- var intersect = getIntersection(thisSegment[0], thisSegment[1],
- rectSegment[0], rectSegment[1]);
- if (intersect) {
- intersectionPoints.push(intersect);
- }
- }
- }
-
- // Get intersection point of segments [a,b] and [c,d]
- function getIntersection(a, b, c, d) {
- // http://stackoverflow.com/a/1968345/1440403
- var abVector = b.minus(a);
- var cdVector = d.minus(c);
-
- var denom = -cdVector.x * abVector.y + abVector.x * cdVector.y;
- if (denom === 0) {
- return null;
- }
-
- var s = (abVector.x * (a.y - c.y) - abVector.y * (a.x - c.x)) / denom;
- var t = (cdVector.x * (a.y - c.y) - cdVector.y * (a.x - c.x)) / denom;
-
- if (-EPSILON <= s && s <= 1 - EPSILON &&
- -EPSILON <= t && t <= 1 - EPSILON) {
- return new $.Point(a.x + t * abVector.x, a.y + t * abVector.y);
- }
- return null;
- }
-
- if (intersectionPoints.length === 0) {
- return null;
- }
-
- var minX = intersectionPoints[0].x;
- var maxX = intersectionPoints[0].x;
- var minY = intersectionPoints[0].y;
- var maxY = intersectionPoints[0].y;
- for (var k = 1; k < intersectionPoints.length; k++) {
- var point = intersectionPoints[k];
- if (point.x < minX) {
- minX = point.x;
- }
- if (point.x > maxX) {
- maxX = point.x;
- }
- if (point.y < minY) {
- minY = point.y;
- }
- if (point.y > maxY) {
- maxY = point.y;
- }
- }
- return new $.Rect(minX, minY, maxX - minX, maxY - minY);
- },
-
- // private
- _getSegments: function() {
- var topLeft = this.getTopLeft();
- var topRight = this.getTopRight();
- var bottomLeft = this.getBottomLeft();
- var bottomRight = this.getBottomRight();
- return [[topLeft, topRight],
- [topRight, bottomRight],
- [bottomRight, bottomLeft],
- [bottomLeft, topLeft]];
- },
-
- /**
- * Rotates a rectangle around a point.
- * @function
- * @param {Number} degrees The angle in degrees to rotate.
- * @param {OpenSeadragon.Point} [pivot] The point about which to rotate.
- * Defaults to the center of the rectangle.
- * @return {OpenSeadragon.Rect}
- */
- rotate: function(degrees, pivot) {
- degrees = degrees % 360;
- if (degrees === 0) {
- return this.clone();
- }
- if (degrees < 0) {
- degrees += 360;
- }
-
- pivot = pivot || this.getCenter();
- var newTopLeft = this.getTopLeft().rotate(degrees, pivot);
- var newTopRight = this.getTopRight().rotate(degrees, pivot);
-
- var diff = newTopRight.minus(newTopLeft);
- var radians = Math.atan(diff.y / diff.x);
- if (diff.x < 0) {
- radians += Math.PI;
- } else if (diff.y < 0) {
- radians += 2 * Math.PI;
- }
- return new $.Rect(
- newTopLeft.x,
- newTopLeft.y,
- this.width,
- this.height,
- radians / Math.PI * 180);
- },
-
- /**
- * Retrieves the smallest horizontal (degrees=0) rectangle which contains
- * this rectangle.
- * @returns {OpenSeadragon.Rect}
- */
- getBoundingBox: function() {
- if (this.degrees === 0) {
- return this.clone();
- }
- var topLeft = this.getTopLeft();
- var topRight = this.getTopRight();
- var bottomLeft = this.getBottomLeft();
- var bottomRight = this.getBottomRight();
- var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
- var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);
- var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
- var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);
- return new $.Rect(
- minX,
- minY,
- maxX - minX,
- maxY - minY);
- },
-
- /**
- * Retrieves the smallest horizontal (degrees=0) rectangle which contains
- * this rectangle and has integers x, y, width and height
- * @returns {OpenSeadragon.Rect}
- */
- getIntegerBoundingBox: function() {
- var boundingBox = this.getBoundingBox();
- var x = Math.floor(boundingBox.x);
- var y = Math.floor(boundingBox.y);
- var width = Math.ceil(boundingBox.width + boundingBox.x - x);
- var height = Math.ceil(boundingBox.height + boundingBox.y - y);
- return new $.Rect(x, y, width, height);
- },
-
- /**
- * Determines whether a point is inside this rectangle (edge included).
- * @function
- * @param {OpenSeadragon.Point} point
- * @param {Number} [epsilon=0] the margin of error allowed
- * @returns {Boolean} true if the point is inside this rectangle, false
- * otherwise.
- */
- containsPoint: function(point, epsilon) {
- epsilon = epsilon || 0;
-
- // See http://stackoverflow.com/a/2752754/1440403 for explanation
- var topLeft = this.getTopLeft();
- var topRight = this.getTopRight();
- var bottomLeft = this.getBottomLeft();
- var topDiff = topRight.minus(topLeft);
- var leftDiff = bottomLeft.minus(topLeft);
-
- return ((point.x - topLeft.x) * topDiff.x +
- (point.y - topLeft.y) * topDiff.y >= -epsilon) &&
-
- ((point.x - topRight.x) * topDiff.x +
- (point.y - topRight.y) * topDiff.y <= epsilon) &&
-
- ((point.x - topLeft.x) * leftDiff.x +
- (point.y - topLeft.y) * leftDiff.y >= -epsilon) &&
-
- ((point.x - bottomLeft.x) * leftDiff.x +
- (point.y - bottomLeft.y) * leftDiff.y <= epsilon);
- },
-
- /**
- * Provides a string representation of the rectangle which is useful for
- * debugging.
- * @function
- * @returns {String} A string representation of the rectangle.
- */
- toString: function() {
- return "[" +
- (Math.round(this.x * 100) / 100) + ", " +
- (Math.round(this.y * 100) / 100) + ", " +
- (Math.round(this.width * 100) / 100) + "x" +
- (Math.round(this.height * 100) / 100) + ", " +
- (Math.round(this.degrees * 100) / 100) + "deg" +
- "]";
- }
-};
-
-
-}(OpenSeadragon));
-
-/*
- * OpenSeadragon - ReferenceStrip
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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';
-
- $.setElementTouchActionNone( this.element );
-
- $.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 ),
- keyDownHandler: $.delegate( this, onKeyDown ),
- keyHandler: $.delegate( this, onKeyPress )
- } );
-
- //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';
- $.setElementTouchActionNone( element );
-
- 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 );
- }
- }
- } );
-
- this.element.appendChild( element );
-
- element.activePanel = false;
-
- this.panels.push( element );
-
- }
- loadPanels( this, this.scroll == 'vertical' ? viewerSize.y : viewerSize.x, 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;
- onStripEnter.call( this, { eventSource: this.innerTracker } );
- }
- },
-
- /**
- * @function
- */
- update: function () {
- if ( THIS[this.id].animating ) {
- $.console.log( 'image reference strip update' );
- return true;
- }
- return false;
- },
-
- // Overrides Viewer.destroy
- destroy: function() {
- if (this.element) {
- this.element.parentNode.removeChild(this.element);
- }
- }
-
-} );
-
-
-
-
-/**
- * @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( "div" );
- 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';
-
- // TODO: What is this for? Future keyboard navigation support?
- miniViewer.displayRegion.innerTracker = new $.MouseTracker( {
- element: miniViewer.displayRegion,
- startDisabled: true
- } );
-
- element.getElementsByTagName( 'div' )[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 onKeyDown( event ) {
- //console.log( event.keyCode );
-
- if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {
- switch ( event.keyCode ) {
- case 38: //up arrow
- onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );
- return false;
- case 40: //down arrow
- onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );
- return false;
- case 37: //left arrow
- onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );
- return false;
- 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;
- }
- } else {
- return true;
- }
-}
-
-
-/**
- * @private
- * @inner
- * @function
- */
-function onKeyPress( event ) {
- //console.log( event.keyCode );
-
- if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {
- 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
- onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );
- return false;
- case 115: //s
- case 83: //S
- onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );
- return false;
- case 97: //a
- onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );
- return false;
- case 100: //d
- onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );
- return false;
- default:
- //console.log( 'navigator keycode %s', event.keyCode );
- return true;
- }
- } else {
- 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.springStiffness - Spring stiffness. Must be greater than zero.
- * The closer to zero, the closer to linear animation.
- * @param {Number} options.animationTime - Animation duration per spring, in seconds.
- * Must be zero or greater.
- * @param {Number} [options.initial=0] - Initial value of spring.
- * @param {Boolean} [options.exponential=false] - Whether this spring represents
- * an exponential scale (such as zoom) and should be animated accordingly. Note that
- * exponential springs must have non-zero values.
- */
-$.Spring = function( options ) {
- var args = arguments;
-
- if( typeof( options ) != 'object' ){
- //allows backward compatible use of ( initialValue, config ) as
- //constructor parameters
- options = {
- initial: args.length && typeof ( args[ 0 ] ) == "number" ?
- args[ 0 ] :
- undefined,
- /**
- * Spring stiffness.
- * @member {Number} springStiffness
- * @memberof OpenSeadragon.Spring#
- */
- springStiffness: args.length > 1 ?
- args[ 1 ].springStiffness :
- 5.0,
- /**
- * Animation duration per spring.
- * @member {Number} animationTime
- * @memberof OpenSeadragon.Spring#
- */
- animationTime: args.length > 1 ?
- args[ 1 ].animationTime :
- 1.5
- };
- }
-
- $.console.assert(typeof options.springStiffness === "number" && options.springStiffness !== 0,
- "[OpenSeadragon.Spring] options.springStiffness must be a non-zero number");
-
- $.console.assert(typeof options.animationTime === "number" && options.animationTime >= 0,
- "[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0");
-
- if (options.exponential) {
- this._exponential = true;
- delete options.exponential;
- }
-
- $.extend( true, this, options);
-
- /**
- * @member {Object} current
- * @memberof OpenSeadragon.Spring#
- * @property {Number} value
- * @property {Number} time
- */
- this.current = {
- value: typeof ( this.initial ) == "number" ?
- this.initial :
- (this._exponential ? 0 : 1),
- time: $.now() // always work in milliseconds
- };
-
- $.console.assert(!this._exponential || this.current.value !== 0,
- "[OpenSeadragon.Spring] value must be non-zero for exponential springs");
-
- /**
- * @member {Object} start
- * @memberof OpenSeadragon.Spring#
- * @property {Number} value
- * @property {Number} time
- */
- this.start = {
- value: this.current.value,
- time: this.current.time
- };
-
- /**
- * @member {Object} target
- * @memberof OpenSeadragon.Spring#
- * @property {Number} value
- * @property {Number} time
- */
- this.target = {
- value: this.current.value,
- time: this.current.time
- };
-
- if (this._exponential) {
- this.start._logValue = Math.log(this.start.value);
- this.target._logValue = Math.log(this.target.value);
- this.current._logValue = Math.log(this.current.value);
- }
-};
-
-/** @lends OpenSeadragon.Spring.prototype */
-$.Spring.prototype = {
-
- /**
- * @function
- * @param {Number} target
- */
- resetTo: function( target ) {
- $.console.assert(!this._exponential || target !== 0,
- "[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs");
-
- this.start.value = this.target.value = this.current.value = target;
- this.start.time = this.target.time = this.current.time = $.now();
-
- if (this._exponential) {
- this.start._logValue = Math.log(this.start.value);
- this.target._logValue = Math.log(this.target.value);
- this.current._logValue = Math.log(this.current.value);
- }
- },
-
- /**
- * @function
- * @param {Number} target
- */
- springTo: function( target ) {
- $.console.assert(!this._exponential || target !== 0,
- "[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs");
-
- this.start.value = this.current.value;
- this.start.time = this.current.time;
- this.target.value = target;
- this.target.time = this.start.time + 1000 * this.animationTime;
-
- if (this._exponential) {
- this.start._logValue = Math.log(this.start.value);
- this.target._logValue = Math.log(this.target.value);
- }
- },
-
- /**
- * @function
- * @param {Number} delta
- */
- shiftBy: function( delta ) {
- this.start.value += delta;
- this.target.value += delta;
-
- if (this._exponential) {
- $.console.assert(this.target.value !== 0 && this.start.value !== 0,
- "[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs");
-
- this.start._logValue = Math.log(this.start.value);
- this.target._logValue = Math.log(this.target.value);
- }
- },
-
- setExponential: function(value) {
- this._exponential = value;
-
- if (this._exponential) {
- $.console.assert(this.current.value !== 0 && this.target.value !== 0 && this.start.value !== 0,
- "[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs");
-
- this.start._logValue = Math.log(this.start.value);
- this.target._logValue = Math.log(this.target.value);
- this.current._logValue = Math.log(this.current.value);
- }
- },
-
- /**
- * @function
- */
- update: function() {
- this.current.time = $.now();
-
- var startValue, targetValue;
- if (this._exponential) {
- startValue = this.start._logValue;
- targetValue = this.target._logValue;
- } else {
- startValue = this.start.value;
- targetValue = this.target.value;
- }
-
- var currentValue = (this.current.time >= this.target.time) ?
- targetValue :
- startValue +
- ( targetValue - startValue ) *
- transform(
- this.springStiffness,
- ( this.current.time - this.start.time ) /
- ( this.target.time - this.start.time )
- );
-
- if (this._exponential) {
- this.current.value = Math.exp(currentValue);
- } else {
- this.current.value = currentValue;
- }
- },
-
- /**
- * Returns whether the spring is at the target value
- * @function
- * @returns {Boolean} True if at target value, false otherwise
- */
- isAtTargetValue: function() {
- return this.current.value === this.target.value;
- }
-};
-
-/**
- * @private
- */
-function transform( stiffness, x ) {
- return ( 1.0 - Math.exp( stiffness * -x ) ) /
- ( 1.0 - Math.exp( -stiffness ) );
-}
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - ImageLoader
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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( $ ){
-
-// private class
-function ImageJob ( options ) {
-
- $.extend( true, this, {
- timeout: $.DEFAULT_SETTINGS.timeout,
- jobId: null
- }, options );
-
- /**
- * Image object which will contain downloaded image.
- * @member {Image} image
- * @memberof OpenSeadragon.ImageJob#
- */
- this.image = null;
-}
-
-ImageJob.prototype = {
- errorMsg: null,
- start: function(){
- var _this = this;
-
- this.image = new Image();
-
- if ( this.crossOriginPolicy !== false ) {
- this.image.crossOrigin = this.crossOriginPolicy;
- }
-
- this.image.onload = function(){
- _this.finish( true );
- };
- this.image.onabort = this.image.onerror = function(){
- _this.errorMsg = "Image load aborted";
- _this.finish( false );
- };
-
- this.jobId = window.setTimeout( function(){
- _this.errorMsg = "Image load exceeded timeout";
- _this.finish( false );
- }, this.timeout);
-
- this.image.src = this.src;
- },
-
- finish: function( successful ) {
- this.image.onload = this.image.onerror = this.image.onabort = null;
- if (!successful) {
- this.image = null;
- }
-
- if ( this.jobId ) {
- window.clearTimeout( this.jobId );
- }
-
- this.callback( this );
- }
-
-};
-
-/**
- * @class ImageLoader
- * @memberof OpenSeadragon
- * @classdesc Handles downloading of a set of images using asynchronous queue pattern.
- * You generally won't have to interact with the ImageLoader directly.
- * @param {Object} options - Options for this ImageLoader.
- * @param {Number} [options.jobLimit] - The number of concurrent image requests. See imageLoaderLimit in {@link OpenSeadragon.Options} for details.
- */
-$.ImageLoader = function( options ) {
-
- $.extend( true, this, {
- jobLimit: $.DEFAULT_SETTINGS.imageLoaderLimit,
- jobQueue: [],
- jobsInProgress: 0
- }, options );
-
-};
-
-/** @lends OpenSeadragon.ImageLoader.prototype */
-$.ImageLoader.prototype = {
-
- /**
- * Add an unloaded image to the loader queue.
- * @method
- * @param {String} src - URL of image to download.
- * @param {String} crossOriginPolicy - CORS policy to use for downloads
- * @param {Function} callback - Called once image has been downloaded.
- */
- addJob: function( options ) {
- var _this = this,
- complete = function( job ) {
- completeJob( _this, job, options.callback );
- },
- jobOptions = {
- src: options.src,
- crossOriginPolicy: options.crossOriginPolicy,
- callback: complete,
- abort: options.abort
- },
- newJob = new ImageJob( jobOptions );
-
- if ( !this.jobLimit || this.jobsInProgress < this.jobLimit ) {
- newJob.start();
- this.jobsInProgress++;
- }
- else {
- this.jobQueue.push( newJob );
- }
- },
-
- /**
- * Clear any unstarted image loading jobs from the queue.
- * @method
- */
- clear: function() {
- for( var i = 0; i < this.jobQueue.length; i++ ) {
- var job = this.jobQueue[i];
- if ( typeof job.abort === "function" ) {
- job.abort();
- }
- }
-
- this.jobQueue = [];
- }
-};
-
-/**
- * Cleans up ImageJob once completed.
- * @method
- * @private
- * @param loader - ImageLoader used to start job.
- * @param job - The ImageJob that has completed.
- * @param callback - Called once cleanup is finished.
- */
-function completeJob( loader, job, callback ) {
- var nextJob;
-
- loader.jobsInProgress--;
-
- if ( (!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.jobQueue.length > 0) {
- nextJob = loader.jobQueue.shift();
- nextJob.start();
- loader.jobsInProgress++;
- }
-
- callback( job.image, job.errorMsg );
-}
-
-}( 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( $ ){
-
-/**
- * @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.
- * @param {CanvasRenderingContext2D} context2D The context2D of this tile if it
- * is provided directly by the tile source.
- */
-$.Tile = function(level, x, y, bounds, exists, url, context2D) {
- /**
- * The zoom level this tile belongs to.
- * @member {Number} level
- * @memberof OpenSeadragon.Tile#
- */
- this.level = level;
- /**
- * The vector component 'x'.
- * @member {Number} x
- * @memberof OpenSeadragon.Tile#
- */
- this.x = x;
- /**
- * The vector component 'y'.
- * @member {Number} y
- * @memberof OpenSeadragon.Tile#
- */
- this.y = y;
- /**
- * Where this tile fits, in normalized coordinates
- * @member {OpenSeadragon.Rect} bounds
- * @memberof OpenSeadragon.Tile#
- */
- this.bounds = bounds;
- /**
- * 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;
- /**
- * The context2D of this tile if it is provided directly by the tile source.
- * @member {CanvasRenderingContext2D} context2D
- * @memberOf OpenSeadragon.Tile#
- */
- this.context2D = context2D;
- /**
- * 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;
-};
-
-/** @lends OpenSeadragon.Tile.prototype */
-$.Tile.prototype = {
-
- /**
- * Provides a string representation of this tiles level and (x,y)
- * components.
- * @function
- * @returns {String}
- */
- toString: function() {
- return this.level + "/" + this.x + "_" + this.y;
- },
-
- // private
- _hasTransparencyChannel: function() {
- return !!this.context2D || this.url.match('.png');
- },
-
- /**
- * Renders the tile in an html container.
- * @function
- * @param {Element} container
- */
- drawHTML: function( container ) {
- if (!this.cacheImageRecord) {
- $.console.warn(
- '[Tile.drawHTML] attempting to draw tile %s when it\'s not cached',
- this.toString());
- return;
- }
-
- if ( !this.loaded ) {
- $.console.warn(
- "Attempting to draw tile %s when it's not yet loaded.",
- this.toString()
- );
- return;
- }
-
- //EXPERIMENTAL - trying to figure out how to scale the container
- // content during animation of the container size.
-
- if ( !this.element ) {
- this.element = $.makeNeutralElement( "div" );
- this.imgElement = this.cacheImageRecord.getImage().cloneNode();
- this.imgElement.style.msInterpolationMode = "nearest-neighbor";
- this.imgElement.style.width = "100%";
- this.imgElement.style.height = "100%";
-
- this.style = this.element.style;
- this.style.position = "absolute";
- }
- 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} drawingHandler - Method for firing the drawing event.
- * drawingHandler({context, tile, rendered})
- * where <code>rendered</code> is the context with the pre-drawn image.
- * @param {Number} [scale=1] - Apply a scale to position and size
- * @param {OpenSeadragon.Point} [translate] - A translation vector
- */
- drawCanvas: function( context, drawingHandler, scale, translate ) {
-
- var position = this.position.times($.pixelDensityRatio),
- size = this.size.times($.pixelDensityRatio),
- rendered;
-
- if (!this.context2D && !this.cacheImageRecord) {
- $.console.warn(
- '[Tile.drawCanvas] attempting to draw tile %s when it\'s not cached',
- this.toString());
- return;
- }
-
- rendered = this.context2D || this.cacheImageRecord.getRenderedContext();
-
- if ( !this.loaded || !rendered ){
- $.console.warn(
- "Attempting to draw tile %s when it's not yet loaded.",
- this.toString()
- );
-
- return;
- }
-
- context.save();
-
- context.globalAlpha = this.opacity;
-
- if (typeof scale === 'number' && scale !== 1) {
- // draw tile at a different scale
- position = position.times(scale);
- size = size.times(scale);
- }
-
- if (translate instanceof $.Point) {
- // shift tile position slightly
- position = position.plus(translate);
- }
-
- //if we are supposed to be rendering fully opaque rectangle,
- //ie its done fading or fading is turned off, and if we are drawing
- //an image with an alpha channel, then the only way
- //to avoid seeing the tile underneath is to clear the rectangle
- if (context.globalAlpha === 1 && this._hasTransparencyChannel()) {
- //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
- );
- }
-
- // This gives the application a chance to make image manipulation
- // changes as we are rendering the image
- drawingHandler({context: context, tile: this, rendered: rendered});
-
- context.drawImage(
- rendered.canvas,
- 0,
- 0,
- rendered.canvas.width,
- rendered.canvas.height,
- position.x,
- position.y,
- size.x,
- size.y
- );
-
- context.restore();
- },
-
- /**
- * Get the ratio between current and original size.
- * @function
- * @return {Float}
- */
- getScaleForEdgeSmoothing: function() {
- var context;
- if (this.cacheImageRecord) {
- context = this.cacheImageRecord.getRenderedContext();
- } else if (this.context2D) {
- context = this.context2D;
- } else {
- $.console.warn(
- '[Tile.drawCanvas] attempting to get tile scale %s when tile\'s not cached',
- this.toString());
- return 1;
- }
- return context.canvas.width / (this.size.x * $.pixelDensityRatio);
- },
-
- /**
- * Get a translation vector that when applied to the tile position produces integer coordinates.
- * Needed to avoid swimming and twitching.
- * @function
- * @param {Number} [scale=1] - Scale to be applied to position.
- * @return {OpenSeadragon.Point}
- */
- getTranslationForEdgeSmoothing: function(scale, canvasSize, sketchCanvasSize) {
- // The translation vector must have positive values, otherwise the image goes a bit off
- // the sketch canvas to the top and left and we must use negative coordinates to repaint it
- // to the main canvas. In that case, some browsers throw:
- // INDEX_SIZE_ERR: DOM Exception 1: Index or size was negative, or greater than the allowed value.
- var x = Math.max(1, Math.ceil((sketchCanvasSize.x - canvasSize.x) / 2));
- var y = Math.max(1, Math.ceil((sketchCanvasSize.y - canvasSize.y) / 2));
- return new $.Point(x, y).minus(
- this.position
- .times($.pixelDensityRatio)
- .times(scale || 1)
- .apply(function(x) {
- return x % 1;
- })
- );
- },
-
- /**
- * Removes tile from its container.
- * @function
- */
- unload: function() {
- if ( this.imgElement && this.imgElement.parentNode ) {
- this.imgElement.parentNode.removeChild( this.imgElement );
- }
- if ( this.element && this.element.parentNode ) {
- this.element.parentNode.removeChild( this.element );
- }
-
- this.element = null;
- this.imgElement = null;
- this.loaded = false;
- this.loading = false;
- }
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Overlay
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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.
- * It is identical to OpenSeadragon.Placement but is kept for backward
- * compatibility.
- * @member OverlayPlacement
- * @memberof OpenSeadragon
- * @static
- * @readonly
- * @type {Object}
- * @property {Number} CENTER
- * @property {Number} TOP_LEFT
- * @property {Number} TOP
- * @property {Number} TOP_RIGHT
- * @property {Number} RIGHT
- * @property {Number} BOTTOM_RIGHT
- * @property {Number} BOTTOM
- * @property {Number} BOTTOM_LEFT
- * @property {Number} LEFT
- */
- $.OverlayPlacement = $.Placement;
-
- /**
- * An enumeration of possible ways to handle overlays rotation
- * @member OverlayRotationMode
- * @memberOf OpenSeadragon
- * @static
- * @readonly
- * @property {Number} NO_ROTATION The overlay ignore the viewport rotation.
- * @property {Number} EXACT The overlay use CSS 3 transforms to rotate with
- * the viewport. If the overlay contains text, it will get rotated as well.
- * @property {Number} BOUNDING_BOX The overlay adjusts for rotation by
- * taking the size of the bounding box of the rotated bounds.
- * Only valid for overlays with Rect location and scalable in both directions.
- */
- $.OverlayRotationMode = $.freezeObject({
- NO_ROTATION: 1,
- EXACT: 2,
- BOUNDING_BOX: 3
- });
-
- /**
- * @class Overlay
- * @classdesc Provides a way to float an HTML element on top of the viewer element.
- *
- * @memberof OpenSeadragon
- * @param {Object} options
- * @param {Element} options.element
- * @param {OpenSeadragon.Point|OpenSeadragon.Rect} options.location - The
- * location of the overlay on the image. If a {@link OpenSeadragon.Point}
- * is specified, the overlay will be located at this location with respect
- * to the placement option. If a {@link OpenSeadragon.Rect} is specified,
- * the overlay will be placed at this location with the corresponding width
- * and height and placement TOP_LEFT.
- * @param {OpenSeadragon.Placement} [options.placement=OpenSeadragon.Placement.TOP_LEFT]
- * Defines what part of the overlay should be at the specified options.location
- * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw]
- * @param {Boolean} [options.checkResize=true] Set to false to avoid to
- * check the size of the overlay everytime it is drawn in the directions
- * which are not scaled. It will improve performances but will cause a
- * misalignment if the overlay size changes.
- * @param {Number} [options.width] The width of the overlay in viewport
- * coordinates. If specified, the width of the overlay will be adjusted when
- * the zoom changes.
- * @param {Number} [options.height] The height of the overlay in viewport
- * coordinates. If specified, the height of the overlay will be adjusted when
- * the zoom changes.
- * @param {Boolean} [options.rotationMode=OpenSeadragon.OverlayRotationMode.EXACT]
- * How to handle the rotation of the viewport.
- */
- $.Overlay = function(element, location, placement) {
-
- /**
- * onDraw callback signature used by {@link OpenSeadragon.Overlay}.
- *
- * @callback OnDrawCallback
- * @memberof OpenSeadragon.Overlay
- * @param {OpenSeadragon.Point} position
- * @param {OpenSeadragon.Point} size
- * @param {Element} element
- */
-
- var options;
- if ($.isPlainObject(element)) {
- options = element;
- } else {
- options = {
- element: element,
- location: location,
- placement: placement
- };
- }
-
- this.element = options.element;
- this.style = options.element.style;
- this._init(options);
- };
-
- /** @lends OpenSeadragon.Overlay.prototype */
- $.Overlay.prototype = {
-
- // private
- _init: function(options) {
- this.location = options.location;
- this.placement = options.placement === undefined ?
- $.Placement.TOP_LEFT : options.placement;
- this.onDraw = options.onDraw;
- this.checkResize = options.checkResize === undefined ?
- true : options.checkResize;
-
- // When this.width is not null, the overlay get scaled horizontally
- this.width = options.width === undefined ? null : options.width;
-
- // When this.height is not null, the overlay get scaled vertically
- this.height = options.height === undefined ? null : options.height;
-
- this.rotationMode = options.rotationMode || $.OverlayRotationMode.EXACT;
-
- // Having a rect as location is a syntactic sugar
- if (this.location instanceof $.Rect) {
- this.width = this.location.width;
- this.height = this.location.height;
- this.location = this.location.getTopLeft();
- this.placement = $.Placement.TOP_LEFT;
- }
-
- // Deprecated properties kept for backward compatibility.
- this.scales = this.width !== null && this.height !== null;
- this.bounds = new $.Rect(
- this.location.x, this.location.y, this.width, this.height);
- this.position = this.location;
- },
-
- /**
- * Internal function to adjust the position of an overlay
- * depending on it size and placement.
- * @function
- * @param {OpenSeadragon.Point} position
- * @param {OpenSeadragon.Point} size
- */
- adjust: function(position, size) {
- var properties = $.Placement.properties[this.placement];
- if (!properties) {
- return;
- }
- if (properties.isHorizontallyCentered) {
- position.x -= size.x / 2;
- } else if (properties.isRight) {
- position.x -= size.x;
- }
- if (properties.isVerticallyCentered) {
- position.y -= size.y / 2;
- } else if (properties.isBottom) {
- position.y -= size.y;
- }
- },
-
- /**
- * @function
- */
- destroy: function() {
- var element = this.element;
- var style = this.style;
-
- if (element.parentNode) {
- element.parentNode.removeChild(element);
- //this should allow us to preserve overlays when required between
- //pages
- if (element.prevElementParent) {
- style.display = 'none';
- //element.prevElementParent.insertBefore(
- // element,
- // element.prevNextSibling
- //);
- document.body.appendChild(element);
- }
- }
-
- // clear the onDraw callback
- this.onDraw = null;
-
- style.top = "";
- style.left = "";
- style.position = "";
-
- if (this.width !== null) {
- style.width = "";
- }
- if (this.height !== null) {
- style.height = "";
- }
- var transformOriginProp = $.getCssPropertyWithVendorPrefix(
- 'transformOrigin');
- var transformProp = $.getCssPropertyWithVendorPrefix(
- 'transform');
- if (transformOriginProp && transformProp) {
- style[transformOriginProp] = "";
- style[transformProp] = "";
- }
- },
-
- /**
- * @function
- * @param {Element} container
- */
- drawHTML: function(container, viewport) {
- var element = this.element;
- if (element.parentNode !== container) {
- //save the source parent for later if we need it
- element.prevElementParent = element.parentNode;
- element.prevNextSibling = element.nextSibling;
- container.appendChild(element);
-
- // this.size is used by overlays which don't get scaled in at
- // least one direction when this.checkResize is set to false.
- this.size = $.getElementSize(element);
- }
-
- var positionAndSize = this._getOverlayPositionAndSize(viewport);
-
- var position = positionAndSize.position;
- var size = this.size = positionAndSize.size;
- var rotate = positionAndSize.rotate;
-
- // call the onDraw callback if it exists to allow one to overwrite
- // the drawing/positioning/sizing of the overlay
- if (this.onDraw) {
- this.onDraw(position, size, this.element);
- } else {
- var style = this.style;
- style.left = position.x + "px";
- style.top = position.y + "px";
- if (this.width !== null) {
- style.width = size.x + "px";
- }
- if (this.height !== null) {
- style.height = size.y + "px";
- }
- var transformOriginProp = $.getCssPropertyWithVendorPrefix(
- 'transformOrigin');
- var transformProp = $.getCssPropertyWithVendorPrefix(
- 'transform');
- if (transformOriginProp && transformProp) {
- if (rotate) {
- style[transformOriginProp] = this._getTransformOrigin();
- style[transformProp] = "rotate(" + rotate + "deg)";
- } else {
- style[transformOriginProp] = "";
- style[transformProp] = "";
- }
- }
- style.position = "absolute";
-
- if (style.display !== 'none') {
- style.display = 'block';
- }
- }
- },
-
- // private
- _getOverlayPositionAndSize: function(viewport) {
- var position = viewport.pixelFromPoint(this.location, true);
- var size = this._getSizeInPixels(viewport);
- this.adjust(position, size);
-
- var rotate = 0;
- if (viewport.degrees &&
- this.rotationMode !== $.OverlayRotationMode.NO_ROTATION) {
- // BOUNDING_BOX is only valid if both directions get scaled.
- // Get replaced by EXACT otherwise.
- if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX &&
- this.width !== null && this.height !== null) {
- var rect = new $.Rect(position.x, position.y, size.x, size.y);
- var boundingBox = this._getBoundingBox(rect, viewport.degrees);
- position = boundingBox.getTopLeft();
- size = boundingBox.getSize();
- } else {
- rotate = viewport.degrees;
- }
- }
-
- return {
- position: position,
- size: size,
- rotate: rotate
- };
- },
-
- // private
- _getSizeInPixels: function(viewport) {
- var width = this.size.x;
- var height = this.size.y;
- if (this.width !== null || this.height !== null) {
- var scaledSize = viewport.deltaPixelsFromPointsNoRotate(
- new $.Point(this.width || 0, this.height || 0), true);
- if (this.width !== null) {
- width = scaledSize.x;
- }
- if (this.height !== null) {
- height = scaledSize.y;
- }
- }
- if (this.checkResize &&
- (this.width === null || this.height === null)) {
- var eltSize = this.size = $.getElementSize(this.element);
- if (this.width === null) {
- width = eltSize.x;
- }
- if (this.height === null) {
- height = eltSize.y;
- }
- }
- return new $.Point(width, height);
- },
-
- // private
- _getBoundingBox: function(rect, degrees) {
- var refPoint = this._getPlacementPoint(rect);
- return rect.rotate(degrees, refPoint).getBoundingBox();
- },
-
- // private
- _getPlacementPoint: function(rect) {
- var result = new $.Point(rect.x, rect.y);
- var properties = $.Placement.properties[this.placement];
- if (properties) {
- if (properties.isHorizontallyCentered) {
- result.x += rect.width / 2;
- } else if (properties.isRight) {
- result.x += rect.width;
- }
- if (properties.isVerticallyCentered) {
- result.y += rect.height / 2;
- } else if (properties.isBottom) {
- result.y += rect.height;
- }
- }
- return result;
- },
-
- // private
- _getTransformOrigin: function() {
- var result = "";
- var properties = $.Placement.properties[this.placement];
- if (!properties) {
- return result;
- }
- if (properties.isLeft) {
- result = "left";
- } else if (properties.isRight) {
- result = "right";
- }
- if (properties.isTop) {
- result += " top";
- } else if (properties.isBottom) {
- result += " bottom";
- }
- return result;
- },
-
- /**
- * Changes the overlay settings.
- * @function
- * @param {OpenSeadragon.Point|OpenSeadragon.Rect|Object} location
- * If an object is specified, the options are the same than the constructor
- * except for the element which can not be changed.
- * @param {OpenSeadragon.Placement} position
- */
- update: function(location, placement) {
- var options = $.isPlainObject(location) ? location : {
- location: location,
- placement: placement
- };
- this._init({
- location: options.location || this.location,
- placement: options.placement !== undefined ?
- options.placement : this.placement,
- onDraw: options.onDraw || this.onDraw,
- checkResize: options.checkResize || this.checkResize,
- width: options.width !== undefined ? options.width : this.width,
- height: options.height !== undefined ? options.height : this.height,
- rotationMode: options.rotationMode || this.rotationMode
- });
- },
-
- /**
- * Returns the current bounds of the overlay in viewport coordinates
- * @function
- * @param {OpenSeadragon.Viewport} viewport the viewport
- * @returns {OpenSeadragon.Rect} overlay bounds
- */
- getBounds: function(viewport) {
- $.console.assert(viewport,
- 'A viewport must now be passed to Overlay.getBounds.');
- var width = this.width;
- var height = this.height;
- if (width === null || height === null) {
- var size = viewport.deltaPointsFromPixelsNoRotate(this.size, true);
- if (width === null) {
- width = size.x;
- }
- if (height === null) {
- height = size.y;
- }
- }
- var location = this.location.clone();
- this.adjust(location, new $.Point(width, height));
- return this._adjustBoundsForRotation(
- viewport, new $.Rect(location.x, location.y, width, height));
- },
-
- // private
- _adjustBoundsForRotation: function(viewport, bounds) {
- if (!viewport ||
- viewport.degrees === 0 ||
- this.rotationMode === $.OverlayRotationMode.EXACT) {
- return bounds;
- }
- if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX) {
- // If overlay not fully scalable, BOUNDING_BOX falls back to EXACT
- if (this.width === null || this.height === null) {
- return bounds;
- }
- // It is easier to just compute the position and size and
- // convert to viewport coordinates.
- var positionAndSize = this._getOverlayPositionAndSize(viewport);
- return viewport.viewerElementToViewportRectangle(new $.Rect(
- positionAndSize.position.x,
- positionAndSize.position.y,
- positionAndSize.size.x,
- positionAndSize.size.y));
- }
-
- // NO_ROTATION case
- return bounds.rotate(-viewport.degrees,
- this._getPlacementPoint(bounds));
- }
- };
-
-}(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( $ ){
-
-/**
- * @class Drawer
- * @memberof OpenSeadragon
- * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.
- * @param {Object} options - Options for this Drawer.
- * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this Drawer.
- * @param {OpenSeadragon.Viewport} options.viewport - Reference to Viewer viewport.
- * @param {Element} options.element - Parent element.
- * @param {Number} [options.debugGridColor] - See debugGridColor in {@link OpenSeadragon.Options} for details.
- */
-$.Drawer = function( options ) {
-
- $.console.assert( options.viewer, "[Drawer] options.viewer is required" );
-
- //backward compatibility for positional args while prefering more
- //idiomatic javascript options object as the only argument
- var args = arguments;
-
- if( !$.isPlainObject( options ) ){
- options = {
- source: args[ 0 ], // Reference to Viewer tile source.
- viewport: args[ 1 ], // Reference to Viewer viewport.
- element: args[ 2 ] // Parent element.
- };
- }
-
- $.console.assert( options.viewport, "[Drawer] options.viewport is required" );
- $.console.assert( options.element, "[Drawer] options.element is required" );
-
- if ( options.source ) {
- $.console.error( "[Drawer] options.source is no longer accepted; use TiledImage instead" );
- }
-
- this.viewer = options.viewer;
- this.viewport = options.viewport;
- this.debugGridColor = options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;
- if (options.opacity) {
- $.console.error( "[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead" );
- }
-
- this.useCanvas = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true );
- /**
- * The parent element of this Drawer instance, passed in when the Drawer was created.
- * The parent of {@link OpenSeadragon.Drawer#canvas}.
- * @member {Element} container
- * @memberof OpenSeadragon.Drawer#
- */
- this.container = $.getElement( options.element );
- /**
- * A &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;
-
- /**
- * Sketch canvas used to temporarily draw tiles which cannot be drawn directly
- * to the main canvas due to opacity. Lazily initialized.
- */
- this.sketchCanvas = null;
- this.sketchContext = null;
-
- /**
- * @member {Element} element
- * @memberof OpenSeadragon.Drawer#
- * @deprecated Alias for {@link OpenSeadragon.Drawer#container}.
- */
- this.element = this.container;
-
- // We force our container to ltr because our drawing math doesn't work in rtl.
- // This issue only affects our canvas renderer, but we do it always for consistency.
- // Note that this means overlays you want to be rtl need to be explicitly set to rtl.
- this.container.dir = 'ltr';
-
- // check canvas available width and height, set canvas width and height such that the canvas backing store is set to the proper pixel density
- if (this.useCanvas) {
- var viewportSize = this._calculateCanvasSize();
- this.canvas.width = viewportSize.x;
- this.canvas.height = viewportSize.y;
- }
-
- this.canvas.style.width = "100%";
- this.canvas.style.height = "100%";
- this.canvas.style.position = "absolute";
- $.setElementOpacity( this.canvas, this.opacity, true );
-
- // explicit left-align
- this.container.style.textAlign = "left";
- this.container.appendChild( this.canvas );
-};
-
-/** @lends OpenSeadragon.Drawer.prototype */
-$.Drawer.prototype = {
- // deprecated
- addOverlay: function( element, location, placement, onDraw ) {
- $.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead.");
- this.viewer.addOverlay( element, location, placement, onDraw );
- return this;
- },
-
- // deprecated
- updateOverlay: function( element, location, placement ) {
- $.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.");
- this.viewer.updateOverlay( element, location, placement );
- return this;
- },
-
- // deprecated
- removeOverlay: function( element ) {
- $.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.");
- this.viewer.removeOverlay( element );
- return this;
- },
-
- // deprecated
- clearOverlays: function() {
- $.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.");
- this.viewer.clearOverlays();
- return this;
- },
-
- /**
- * Set the opacity of the drawer.
- * @param {Number} opacity
- * @return {OpenSeadragon.Drawer} Chainable.
- */
- setOpacity: function( opacity ) {
- $.console.error("drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.");
- var world = this.viewer.world;
- for (var i = 0; i < world.getItemCount(); i++) {
- world.getItemAt( i ).setOpacity( opacity );
- }
- return this;
- },
-
- /**
- * Get the opacity of the drawer.
- * @returns {Number}
- */
- getOpacity: function() {
- $.console.error("drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead.");
- var world = this.viewer.world;
- var maxOpacity = 0;
- for (var i = 0; i < world.getItemCount(); i++) {
- var opacity = world.getItemAt( i ).getOpacity();
- if ( opacity > maxOpacity ) {
- maxOpacity = opacity;
- }
- }
- return maxOpacity;
- },
-
- // deprecated
- needsUpdate: function() {
- $.console.error( "[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead." );
- return this.viewer.world.needsDraw();
- },
-
- // deprecated
- numTilesLoaded: function() {
- $.console.error( "[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead." );
- return this.viewer.tileCache.numTilesLoaded();
- },
-
- // deprecated
- reset: function() {
- $.console.error( "[Drawer.reset] this function is deprecated. Use World.resetItems instead." );
- this.viewer.world.resetItems();
- return this;
- },
-
- // deprecated
- update: function() {
- $.console.error( "[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead." );
- this.clear();
- this.viewer.world.draw();
- return this;
- },
-
- /**
- * @return {Boolean} True if rotation is supported.
- */
- canRotate: function() {
- return this.useCanvas;
- },
-
- /**
- * Destroy the drawer (unload current loaded tiles)
- */
- destroy: function() {
- //force unloading of current canvas (1x1 will be gc later, trick not necessarily needed)
- this.canvas.width = 1;
- this.canvas.height = 1;
- this.sketchCanvas = null;
- this.sketchContext = null;
- },
-
- /**
- * Clears the Drawer so it's ready to draw another frame.
- */
- clear: function() {
- this.canvas.innerHTML = "";
- if ( this.useCanvas ) {
- var viewportSize = this._calculateCanvasSize();
- if( this.canvas.width != viewportSize.x ||
- this.canvas.height != viewportSize.y ) {
- this.canvas.width = viewportSize.x;
- this.canvas.height = viewportSize.y;
- if ( this.sketchCanvas !== null ) {
- var sketchCanvasSize = this._calculateSketchCanvasSize();
- this.sketchCanvas.width = sketchCanvasSize.x;
- this.sketchCanvas.height = sketchCanvasSize.y;
- }
- }
- this._clear();
- }
- },
-
- _clear: function (useSketch, bounds) {
- if (!this.useCanvas) {
- return;
- }
- var context = this._getContext(useSketch);
- if (bounds) {
- context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height);
- } else {
- var canvas = context.canvas;
- context.clearRect(0, 0, canvas.width, canvas.height);
- }
- },
-
- /**
- * Scale from OpenSeadragon viewer rectangle to drawer rectangle
- * (ignoring rotation)
- * @param {OpenSeadragon.Rect} rectangle - The rectangle in viewport coordinate system.
- * @return {OpenSeadragon.Rect} Rectangle in drawer coordinate system.
- */
- viewportToDrawerRectangle: function(rectangle) {
- var topLeft = this.viewport.pixelFromPointNoRotate(rectangle.getTopLeft(), true);
- var size = this.viewport.deltaPixelsFromPointsNoRotate(rectangle.getSize(), true);
-
- return new $.Rect(
- topLeft.x * $.pixelDensityRatio,
- topLeft.y * $.pixelDensityRatio,
- size.x * $.pixelDensityRatio,
- size.y * $.pixelDensityRatio
- );
- },
-
- /**
- * Draws the given tile.
- * @param {OpenSeadragon.Tile} tile - The tile to draw.
- * @param {Function} drawingHandler - Method for firing the drawing event if using canvas.
- * drawingHandler({context, tile, rendered})
- * @param {Boolean} useSketch - Whether to use the sketch canvas or not.
- * where <code>rendered</code> is the context with the pre-drawn image.
- * @param {Float} [scale=1] - Apply a scale to tile position and size. Defaults to 1.
- * @param {OpenSeadragon.Point} [translate] A translation vector to offset tile position
- */
- drawTile: function(tile, drawingHandler, useSketch, scale, translate) {
- $.console.assert(tile, '[Drawer.drawTile] tile is required');
- $.console.assert(drawingHandler, '[Drawer.drawTile] drawingHandler is required');
-
- if (this.useCanvas) {
- var context = this._getContext(useSketch);
- scale = scale || 1;
- tile.drawCanvas(context, drawingHandler, scale, translate);
- } else {
- tile.drawHTML( this.canvas );
- }
- },
-
- _getContext: function( useSketch ) {
- var context = this.context;
- if ( useSketch ) {
- if (this.sketchCanvas === null) {
- this.sketchCanvas = document.createElement( "canvas" );
- var sketchCanvasSize = this._calculateSketchCanvasSize();
- this.sketchCanvas.width = sketchCanvasSize.x;
- this.sketchCanvas.height = sketchCanvasSize.y;
- this.sketchContext = this.sketchCanvas.getContext( "2d" );
-
- // If the viewport is not currently rotated, the sketchCanvas
- // will have the same size as the main canvas. However, if
- // the viewport get rotated later on, we will need to resize it.
- if (this.viewport.getRotation() === 0) {
- var self = this;
- this.viewer.addHandler('rotate', function resizeSketchCanvas() {
- self.viewer.removeHandler('rotate', resizeSketchCanvas);
- var sketchCanvasSize = self._calculateSketchCanvasSize();
- self.sketchCanvas.width = sketchCanvasSize.x;
- self.sketchCanvas.height = sketchCanvasSize.y;
- });
- }
- }
- context = this.sketchContext;
- }
- return context;
- },
-
- // private
- saveContext: function( useSketch ) {
- if (!this.useCanvas) {
- return;
- }
-
- this._getContext( useSketch ).save();
- },
-
- // private
- restoreContext: function( useSketch ) {
- if (!this.useCanvas) {
- return;
- }
-
- this._getContext( useSketch ).restore();
- },
-
- // private
- setClip: function(rect, useSketch) {
- if (!this.useCanvas) {
- return;
- }
-
- var context = this._getContext( useSketch );
- context.beginPath();
- context.rect(rect.x, rect.y, rect.width, rect.height);
- context.clip();
- },
-
- // private
- drawRectangle: function(rect, fillStyle, useSketch) {
- if (!this.useCanvas) {
- return;
- }
-
- var context = this._getContext( useSketch );
- context.save();
- context.fillStyle = fillStyle;
- context.fillRect(rect.x, rect.y, rect.width, rect.height);
- context.restore();
- },
-
- /**
- * Blends the sketch canvas in the main canvas.
- * @param {Object} options The options
- * @param {Float} options.opacity The opacity of the blending.
- * @param {Float} [options.scale=1] The scale at which tiles were drawn on
- * the sketch. Default is 1.
- * Use scale to draw at a lower scale and then enlarge onto the main canvas.
- * @param {OpenSeadragon.Point} [options.translate] A translation vector
- * that was used to draw the tiles
- * @param {String} [options.compositeOperation] - How the image is
- * composited onto other images; see compositeOperation in
- * {@link OpenSeadragon.Options} for possible values.
- * @param {OpenSeadragon.Rect} [options.bounds] The part of the sketch
- * canvas to blend in the main canvas. If specified, options.scale and
- * options.translate get ignored.
- */
- blendSketch: function(opacity, scale, translate, compositeOperation) {
- var options = opacity;
- if (!$.isPlainObject(options)) {
- options = {
- opacity: opacity,
- scale: scale,
- translate: translate,
- compositeOperation: compositeOperation
- };
- }
- if (!this.useCanvas || !this.sketchCanvas) {
- return;
- }
- opacity = options.opacity;
- compositeOperation = options.compositeOperation;
- var bounds = options.bounds;
-
- this.context.save();
- this.context.globalAlpha = opacity;
- if (compositeOperation) {
- this.context.globalCompositeOperation = compositeOperation;
- }
- if (bounds) {
- this.context.drawImage(
- this.sketchCanvas,
- bounds.x,
- bounds.y,
- bounds.width,
- bounds.height,
- bounds.x,
- bounds.y,
- bounds.width,
- bounds.height
- );
- } else {
- scale = options.scale || 1;
- translate = options.translate;
- var position = translate instanceof $.Point ?
- translate : new $.Point(0, 0);
-
- var widthExt = 0;
- var heightExt = 0;
- if (translate) {
- var widthDiff = this.sketchCanvas.width - this.canvas.width;
- var heightDiff = this.sketchCanvas.height - this.canvas.height;
- widthExt = Math.round(widthDiff / 2);
- heightExt = Math.round(heightDiff / 2);
- }
- this.context.drawImage(
- this.sketchCanvas,
- position.x - widthExt * scale,
- position.y - heightExt * scale,
- (this.canvas.width + 2 * widthExt) * scale,
- (this.canvas.height + 2 * heightExt) * scale,
- -widthExt,
- -heightExt,
- this.canvas.width + 2 * widthExt,
- this.canvas.height + 2 * heightExt
- );
- }
- this.context.restore();
- },
-
- // private
- drawDebugInfo: function( tile, count, i ){
- if ( !this.useCanvas ) {
- return;
- }
-
- var context = this.context;
- context.save();
- context.lineWidth = 2 * $.pixelDensityRatio;
- context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial';
- context.strokeStyle = this.debugGridColor;
- context.fillStyle = this.debugGridColor;
-
- if ( this.viewport.degrees !== 0 ) {
- this._offsetForRotation(this.viewport.degrees);
- }
-
- context.strokeRect(
- tile.position.x * $.pixelDensityRatio,
- tile.position.y * $.pixelDensityRatio,
- tile.size.x * $.pixelDensityRatio,
- tile.size.y * $.pixelDensityRatio
- );
-
- var tileCenterX = (tile.position.x + (tile.size.x / 2)) * $.pixelDensityRatio;
- var tileCenterY = (tile.position.y + (tile.size.y / 2)) * $.pixelDensityRatio;
-
- // Rotate the text the right way around.
- context.translate( tileCenterX, tileCenterY );
- context.rotate( Math.PI / 180 * -this.viewport.degrees );
- context.translate( -tileCenterX, -tileCenterY );
-
- if( tile.x === 0 && tile.y === 0 ){
- context.fillText(
- "Zoom: " + this.viewport.getZoom(),
- tile.position.x * $.pixelDensityRatio,
- (tile.position.y - 30) * $.pixelDensityRatio
- );
- context.fillText(
- "Pan: " + this.viewport.getBounds().toString(),
- tile.position.x * $.pixelDensityRatio,
- (tile.position.y - 20) * $.pixelDensityRatio
- );
- }
- context.fillText(
- "Level: " + tile.level,
- (tile.position.x + 10) * $.pixelDensityRatio,
- (tile.position.y + 20) * $.pixelDensityRatio
- );
- context.fillText(
- "Column: " + tile.x,
- (tile.position.x + 10) * $.pixelDensityRatio,
- (tile.position.y + 30) * $.pixelDensityRatio
- );
- context.fillText(
- "Row: " + tile.y,
- (tile.position.x + 10) * $.pixelDensityRatio,
- (tile.position.y + 40) * $.pixelDensityRatio
- );
- context.fillText(
- "Order: " + i + " of " + count,
- (tile.position.x + 10) * $.pixelDensityRatio,
- (tile.position.y + 50) * $.pixelDensityRatio
- );
- context.fillText(
- "Size: " + tile.size.toString(),
- (tile.position.x + 10) * $.pixelDensityRatio,
- (tile.position.y + 60) * $.pixelDensityRatio
- );
- context.fillText(
- "Position: " + tile.position.toString(),
- (tile.position.x + 10) * $.pixelDensityRatio,
- (tile.position.y + 70) * $.pixelDensityRatio
- );
-
- if ( this.viewport.degrees !== 0 ) {
- this._restoreRotationChanges();
- }
- context.restore();
- },
-
- // private
- debugRect: function(rect) {
- if ( this.useCanvas ) {
- var context = this.context;
- context.save();
- context.lineWidth = 2 * $.pixelDensityRatio;
- context.strokeStyle = this.debugGridColor;
- context.fillStyle = this.debugGridColor;
-
- context.strokeRect(
- rect.x * $.pixelDensityRatio,
- rect.y * $.pixelDensityRatio,
- rect.width * $.pixelDensityRatio,
- rect.height * $.pixelDensityRatio
- );
-
- context.restore();
- }
- },
-
- /**
- * Get the canvas size
- * @param {Boolean} sketch If set to true return the size of the sketch canvas
- * @returns {OpenSeadragon.Point} The size of the canvas
- */
- getCanvasSize: function(sketch) {
- var canvas = this._getContext(sketch).canvas;
- return new $.Point(canvas.width, canvas.height);
- },
-
- // private
- _offsetForRotation: function(degrees, useSketch) {
- var cx = this.canvas.width / 2;
- var cy = this.canvas.height / 2;
-
- var context = this._getContext(useSketch);
- context.save();
-
- context.translate(cx, cy);
- context.rotate(Math.PI / 180 * degrees);
- context.translate(-cx, -cy);
- },
-
- // private
- _restoreRotationChanges: function(useSketch) {
- var context = this._getContext(useSketch);
- context.restore();
- },
-
- // private
- _calculateCanvasSize: function() {
- var pixelDensityRatio = $.pixelDensityRatio;
- var viewportSize = this.viewport.getContainerSize();
- return {
- x: viewportSize.x * pixelDensityRatio,
- y: viewportSize.y * pixelDensityRatio
- };
- },
-
- // private
- _calculateSketchCanvasSize: function() {
- var canvasSize = this._calculateCanvasSize();
- if (this.viewport.getRotation() === 0) {
- return canvasSize;
- }
- // If the viewport is rotated, we need a larger sketch canvas in order
- // to support edge smoothing.
- var sketchCanvasSize = Math.ceil(Math.sqrt(
- canvasSize.x * canvasSize.x +
- canvasSize.y * canvasSize.y));
- return {
- x: sketchCanvasSize,
- y: sketchCanvasSize
- };
- }
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - Viewport
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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
- * @memberof OpenSeadragon
- * @classdesc Handles coordinate-related functionality (zoom, pan, rotation, etc.)
- * for an {@link OpenSeadragon.Viewer}.
- * @param {Object} options - Options for this Viewport.
- * @param {Object} [options.margins] - See viewportMargins in {@link OpenSeadragon.Options}.
- * @param {Number} [options.springStiffness] - See springStiffness in {@link OpenSeadragon.Options}.
- * @param {Number} [options.animationTime] - See animationTime in {@link OpenSeadragon.Options}.
- * @param {Number} [options.minZoomImageRatio] - See minZoomImageRatio in {@link OpenSeadragon.Options}.
- * @param {Number} [options.maxZoomPixelRatio] - See maxZoomPixelRatio in {@link OpenSeadragon.Options}.
- * @param {Number} [options.visibilityRatio] - See visibilityRatio in {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.wrapHorizontal] - See wrapHorizontal in {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.wrapVertical] - See wrapVertical in {@link OpenSeadragon.Options}.
- * @param {Number} [options.defaultZoomLevel] - See defaultZoomLevel in {@link OpenSeadragon.Options}.
- * @param {Number} [options.minZoomLevel] - See minZoomLevel in {@link OpenSeadragon.Options}.
- * @param {Number} [options.maxZoomLevel] - See maxZoomLevel in {@link OpenSeadragon.Options}.
- * @param {Number} [options.degrees] - See degrees in {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.homeFillsViewer] - See homeFillsViewer in {@link OpenSeadragon.Options}.
- */
-$.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;
- }
-
- this._margins = $.extend({
- left: 0,
- top: 0,
- right: 0,
- bottom: 0
- }, options.margins || {});
-
- delete options.margins;
-
- $.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,
- homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer
-
- }, options );
-
- this._updateContainerInnerSize();
-
- this.centerSpringX = new $.Spring({
- initial: 0,
- springStiffness: this.springStiffness,
- animationTime: this.animationTime
- });
- this.centerSpringY = new $.Spring({
- initial: 0,
- springStiffness: this.springStiffness,
- animationTime: this.animationTime
- });
- this.zoomSpring = new $.Spring({
- exponential: true,
- initial: 1,
- springStiffness: this.springStiffness,
- animationTime: this.animationTime
- });
-
- this._oldCenterX = this.centerSpringX.current.value;
- this._oldCenterY = this.centerSpringY.current.value;
- this._oldZoom = this.zoomSpring.current.value;
-
- this._setContentBounds(new $.Rect(0, 0, 1, 1), 1);
-
- this.goHome(true);
- this.update();
-};
-
-/** @lends OpenSeadragon.Viewport.prototype */
-$.Viewport.prototype = {
- /**
- * Updates the viewport's home bounds and constraints for the given content size.
- * @function
- * @param {OpenSeadragon.Point} contentSize - size of the content in content units
- * @return {OpenSeadragon.Viewport} Chainable.
- * @fires OpenSeadragon.Viewer.event:reset-size
- */
- resetContentSize: function(contentSize) {
- $.console.assert(contentSize, "[Viewport.resetContentSize] contentSize is required");
- $.console.assert(contentSize instanceof $.Point, "[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point");
- $.console.assert(contentSize.x > 0, "[Viewport.resetContentSize] contentSize.x must be greater than 0");
- $.console.assert(contentSize.y > 0, "[Viewport.resetContentSize] contentSize.y must be greater than 0");
-
- this._setContentBounds(new $.Rect(0, 0, 1, contentSize.y / contentSize.x), contentSize.x);
- return this;
- },
-
- // deprecated
- setHomeBounds: function(bounds, contentFactor) {
- $.console.error("[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually.");
- this._setContentBounds(bounds, contentFactor);
- },
-
- // Set the viewport's content bounds
- // @param {OpenSeadragon.Rect} bounds - the new bounds in viewport coordinates
- // without rotation
- // @param {Number} contentFactor - how many content units per viewport unit
- // @fires OpenSeadragon.Viewer.event:reset-size
- // @private
- _setContentBounds: function(bounds, contentFactor) {
- $.console.assert(bounds, "[Viewport._setContentBounds] bounds is required");
- $.console.assert(bounds instanceof $.Rect, "[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect");
- $.console.assert(bounds.width > 0, "[Viewport._setContentBounds] bounds.width must be greater than 0");
- $.console.assert(bounds.height > 0, "[Viewport._setContentBounds] bounds.height must be greater than 0");
-
- this._contentBoundsNoRotate = bounds.clone();
- this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times(
- contentFactor);
-
- this._contentBounds = bounds.rotate(this.degrees).getBoundingBox();
- this._contentSize = this._contentBounds.getSize().times(contentFactor);
- this._contentAspectRatio = this._contentSize.x / this._contentSize.y;
-
- if (this.viewer) {
- /**
- * Raised when the viewer's content size or home bounds are reset
- * (see {@link OpenSeadragon.Viewport#resetContentSize}).
- *
- * @event reset-size
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {OpenSeadragon.Point} contentSize
- * @property {OpenSeadragon.Rect} contentBounds - Content bounds.
- * @property {OpenSeadragon.Rect} homeBounds - Content bounds.
- * Deprecated use contentBounds instead.
- * @property {Number} contentFactor
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.viewer.raiseEvent('reset-size', {
- contentSize: this._contentSizeNoRotate.clone(),
- contentFactor: contentFactor,
- homeBounds: this._contentBoundsNoRotate.clone(),
- contentBounds: this._contentBounds.clone()
- });
- }
- },
-
- /**
- * Returns the home zoom in "viewport zoom" value.
- * @function
- * @returns {Number} The home zoom in "viewport zoom".
- */
- getHomeZoom: function() {
- if (this.defaultZoomLevel) {
- return this.defaultZoomLevel;
- }
-
- var aspectFactor = this._contentAspectRatio / this.getAspectRatio();
- var output;
- if (this.homeFillsViewer) { // fill the viewer and clip the image
- output = aspectFactor >= 1 ? aspectFactor : 1;
- } else {
- output = aspectFactor >= 1 ? 1 : aspectFactor;
- }
-
- return output / this._contentBounds.width;
- },
-
- /**
- * Returns the home bounds in viewport coordinates.
- * @function
- * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.
- */
- getHomeBounds: function() {
- return this.getHomeBoundsNoRotate().rotate(-this.getRotation());
- },
-
- /**
- * Returns the home bounds in viewport coordinates.
- * This method ignores the viewport rotation. Use
- * {@link OpenSeadragon.Viewport#getHomeBounds} to take it into account.
- * @function
- * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.
- */
- getHomeBoundsNoRotate: function() {
- var center = this._contentBounds.getCenter();
- var width = 1.0 / this.getHomeZoom();
- var height = width / this.getAspectRatio();
-
- return new $.Rect(
- center.x - (width / 2.0),
- center.y - (height / 2.0),
- width,
- height
- );
- },
-
- /**
- * @function
- * @param {Boolean} immediately
- * @fires OpenSeadragon.Viewer.event:home
- */
- goHome: function(immediately) {
- if (this.viewer) {
- /**
- * Raised when the "home" operation occurs (see {@link OpenSeadragon.Viewport#goHome}).
- *
- * @event home
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
- * @property {Boolean} immediately
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.viewer.raiseEvent('home', {
- immediately: immediately
- });
- }
- return this.fitBounds(this.getHomeBounds(), immediately);
- },
-
- /**
- * @function
- */
- getMinZoom: function() {
- var homeZoom = this.getHomeZoom(),
- zoom = this.minZoomLevel ?
- this.minZoomLevel :
- this.minZoomImageRatio * homeZoom;
-
- return zoom;
- },
-
- /**
- * @function
- */
- getMaxZoom: function() {
- var zoom = this.maxZoomLevel;
- if (!zoom) {
- zoom = this._contentSize.x * this.maxZoomPixelRatio / this._containerInnerSize.x;
- zoom /= this._contentBounds.width;
- }
-
- return Math.max( zoom, this.getHomeZoom() );
- },
-
- /**
- * @function
- */
- getAspectRatio: function() {
- return this._containerInnerSize.x / this._containerInnerSize.y;
- },
-
- /**
- * @function
- * @returns {OpenSeadragon.Point} The size of the container, in screen coordinates.
- */
- getContainerSize: function() {
- return new $.Point(
- this.containerSize.x,
- this.containerSize.y
- );
- },
-
- /**
- * The margins push the "home" region in from the sides by the specified amounts.
- * @function
- * @returns {Object} Properties (Numbers, in screen coordinates): left, top, right, bottom.
- */
- getMargins: function() {
- return $.extend({}, this._margins); // Make a copy so we are not returning our original
- },
-
- /**
- * The margins push the "home" region in from the sides by the specified amounts.
- * @function
- * @param {Object} margins - Properties (Numbers, in screen coordinates): left, top, right, bottom.
- */
- setMargins: function(margins) {
- $.console.assert($.type(margins) === 'object', '[Viewport.setMargins] margins must be an object');
-
- this._margins = $.extend({
- left: 0,
- top: 0,
- right: 0,
- bottom: 0
- }, margins);
-
- this._updateContainerInnerSize();
- if (this.viewer) {
- this.viewer.forceRedraw();
- }
- },
-
- /**
- * Returns the bounds of the visible area in viewport coordinates.
- * @function
- * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
- * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.
- */
- getBounds: function(current) {
- return this.getBoundsNoRotate(current).rotate(-this.getRotation());
- },
-
- /**
- * Returns the bounds of the visible area in viewport coordinates.
- * This method ignores the viewport rotation. Use
- * {@link OpenSeadragon.Viewport#getBounds} to take it into account.
- * @function
- * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
- * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.
- */
- getBoundsNoRotate: function(current) {
- var center = this.getCenter(current);
- var width = 1.0 / this.getZoom(current);
- var height = width / this.getAspectRatio();
-
- return new $.Rect(
- center.x - (width / 2.0),
- center.y - (height / 2.0),
- width,
- height
- );
- },
-
- /**
- * @function
- * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
- * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,
- * including the space taken by margins, in viewport coordinates.
- */
- getBoundsWithMargins: function(current) {
- return this.getBoundsNoRotateWithMargins(current).rotate(
- -this.getRotation(), this.getCenter(current));
- },
-
- /**
- * @function
- * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
- * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,
- * including the space taken by margins, in viewport coordinates.
- */
- getBoundsNoRotateWithMargins: function(current) {
- var bounds = this.getBoundsNoRotate(current);
- var factor = this._containerInnerSize.x * this.getZoom(current);
- bounds.x -= this._margins.left / factor;
- bounds.y -= this._margins.top / factor;
- bounds.width += (this._margins.left + this._margins.right) / factor;
- bounds.height += (this._margins.top + this._margins.bottom) / factor;
- return bounds;
- },
-
- /**
- * @function
- * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
- */
- getCenter: function( current ) {
- var centerCurrent = new $.Point(
- this.centerSpringX.current.value,
- this.centerSpringY.current.value
- ),
- centerTarget = new $.Point(
- this.centerSpringX.target.value,
- this.centerSpringY.target.value
- ),
- oldZoomPixel,
- zoom,
- width,
- height,
- bounds,
- newZoomPixel,
- deltaZoomPixels,
- deltaZoomPoints;
-
- if ( current ) {
- return centerCurrent;
- } else if ( !this.zoomPoint ) {
- return centerTarget;
- }
-
- oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);
-
- zoom = this.getZoom();
- width = 1.0 / zoom;
- height = width / this.getAspectRatio();
- bounds = new $.Rect(
- centerCurrent.x - width / 2.0,
- centerCurrent.y - height / 2.0,
- width,
- height
- );
-
- newZoomPixel = this._pixelFromPoint(this.zoomPoint, bounds);
- deltaZoomPixels = newZoomPixel.minus( oldZoomPixel );
- deltaZoomPoints = deltaZoomPixels.divide( this._containerInnerSize.x * zoom );
-
- return centerTarget.plus( deltaZoomPoints );
- },
-
- /**
- * @function
- * @param {Boolean} current - Pass true for the current location; defaults to false (target location).
- */
- getZoom: function( current ) {
- if ( current ) {
- return this.zoomSpring.current.value;
- } else {
- return this.zoomSpring.target.value;
- }
- },
-
- // private
- _applyZoomConstraints: function(zoom) {
- return Math.max(
- Math.min(zoom, this.getMaxZoom()),
- this.getMinZoom());
- },
-
- /**
- * @function
- * @private
- * @param {OpenSeadragon.Rect} bounds
- * @param {Boolean} immediately
- * @return {OpenSeadragon.Rect} constrained bounds.
- */
- _applyBoundaryConstraints: function(bounds, immediately) {
- var newBounds = new $.Rect(
- bounds.x,
- bounds.y,
- bounds.width,
- bounds.height);
-
- if (this.wrapHorizontal) {
- //do nothing
- } else {
- var horizontalThreshold = this.visibilityRatio * newBounds.width;
- var boundsRight = newBounds.x + newBounds.width;
- var contentRight = this._contentBoundsNoRotate.x + this._contentBoundsNoRotate.width;
- var leftDx = this._contentBoundsNoRotate.x - boundsRight + horizontalThreshold;
- var rightDx = contentRight - newBounds.x - horizontalThreshold;
-
- if (horizontalThreshold > this._contentBoundsNoRotate.width) {
- newBounds.x += (leftDx + rightDx) / 2;
- } else if (rightDx < 0) {
- newBounds.x += rightDx;
- } else if (leftDx > 0) {
- newBounds.x += leftDx;
- }
- }
-
- if (this.wrapVertical) {
- //do nothing
- } else {
- var verticalThreshold = this.visibilityRatio * newBounds.height;
- var boundsBottom = newBounds.y + newBounds.height;
- var contentBottom = this._contentBoundsNoRotate.y + this._contentBoundsNoRotate.height;
- var topDy = this._contentBoundsNoRotate.y - boundsBottom + verticalThreshold;
- var bottomDy = contentBottom - newBounds.y - verticalThreshold;
-
- if (verticalThreshold > this._contentBoundsNoRotate.height) {
- newBounds.y += (topDy + bottomDy) / 2;
- } else if (bottomDy < 0) {
- newBounds.y += bottomDy;
- } else if (topDy > 0) {
- newBounds.y += topDy;
- }
- }
-
- 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 newBounds;
- },
-
- /**
- * Enforces the minZoom, maxZoom and visibilityRatio constraints by
- * zooming and panning to the closest acceptable zoom and location.
- * @function
- * @param {Boolean} [immediately=false]
- * @return {OpenSeadragon.Viewport} Chainable.
- * @fires OpenSeadragon.Viewer.event:constrain
- */
- applyConstraints: function(immediately) {
- var actualZoom = this.getZoom();
- var constrainedZoom = this._applyZoomConstraints(actualZoom);
-
- if (actualZoom !== constrainedZoom) {
- this.zoomTo(constrainedZoom, this.zoomPoint, immediately);
- }
-
- var bounds = this.getBoundsNoRotate();
- var constrainedBounds = this._applyBoundaryConstraints(
- bounds, immediately);
-
- if (bounds.x !== constrainedBounds.x ||
- bounds.y !== constrainedBounds.y ||
- immediately) {
- this.fitBounds(
- constrainedBounds.rotate(-this.getRotation()),
- immediately);
- }
- return this;
- },
-
- /**
- * Equivalent to {@link OpenSeadragon.Viewport#applyConstraints}
- * @function
- * @param {Boolean} [immediately=false]
- * @return {OpenSeadragon.Viewport} Chainable.
- * @fires OpenSeadragon.Viewer.event:constrain
- */
- ensureVisible: function(immediately) {
- return this.applyConstraints(immediately);
- },
-
- /**
- * @function
- * @private
- * @param {OpenSeadragon.Rect} bounds
- * @param {Object} options (immediately=false, constraints=false)
- * @return {OpenSeadragon.Viewport} Chainable.
- */
- _fitBounds: function(bounds, options) {
- options = options || {};
- var immediately = options.immediately || false;
- var constraints = options.constraints || false;
-
- var aspect = this.getAspectRatio();
- var center = bounds.getCenter();
-
- // Compute width and height of bounding box.
- var newBounds = new $.Rect(
- bounds.x,
- bounds.y,
- bounds.width,
- bounds.height,
- bounds.degrees + this.getRotation())
- .getBoundingBox();
-
- if (newBounds.getAspectRatio() >= aspect) {
- newBounds.height = newBounds.width / aspect;
- } else {
- newBounds.width = newBounds.height * aspect;
- }
-
- // Compute x and y from width, height and center position
- newBounds.x = center.x - newBounds.width / 2;
- newBounds.y = center.y - newBounds.height / 2;
- var newZoom = 1.0 / newBounds.width;
-
- if (constraints) {
- var newBoundsAspectRatio = newBounds.getAspectRatio();
- var newConstrainedZoom = this._applyZoomConstraints(newZoom);
-
- if (newZoom !== newConstrainedZoom) {
- newZoom = newConstrainedZoom;
- newBounds.width = 1.0 / newZoom;
- newBounds.x = center.x - newBounds.width / 2;
- newBounds.height = newBounds.width / newBoundsAspectRatio;
- newBounds.y = center.y - newBounds.height / 2;
- }
-
- newBounds = this._applyBoundaryConstraints(newBounds, immediately);
- center = newBounds.getCenter();
- }
-
- if (immediately) {
- this.panTo(center, true);
- return this.zoomTo(newZoom, null, true);
- }
-
- this.panTo(this.getCenter(true), true);
- this.zoomTo(this.getZoom(true), null, true);
-
- var oldBounds = this.getBounds();
- var oldZoom = this.getZoom();
-
- if (oldZoom === 0 || Math.abs(newZoom / oldZoom - 1) < 0.00000001) {
- this.zoomTo(newZoom, true);
- return this.panTo(center, immediately);
- }
-
- newBounds = newBounds.rotate(-this.getRotation());
- var referencePoint = newBounds.getTopLeft().times(newZoom)
- .minus(oldBounds.getTopLeft().times(oldZoom))
- .divide(newZoom - oldZoom);
-
- return this.zoomTo(newZoom, referencePoint, immediately);
- },
-
- /**
- * Makes the viewport zoom and pan so that the specified bounds take
- * as much space as possible in the viewport.
- * Note: this method ignores the constraints (minZoom, maxZoom and
- * visibilityRatio).
- * Use {@link OpenSeadragon.Viewport#fitBoundsWithConstraints} to enforce
- * them.
- * @function
- * @param {OpenSeadragon.Rect} bounds
- * @param {Boolean} [immediately=false]
- * @return {OpenSeadragon.Viewport} Chainable.
- */
- fitBounds: function(bounds, immediately) {
- return this._fitBounds(bounds, {
- immediately: immediately,
- constraints: false
- });
- },
-
- /**
- * Makes the viewport zoom and pan so that the specified bounds take
- * as much space as possible in the viewport while enforcing the constraints
- * (minZoom, maxZoom and visibilityRatio).
- * Note: because this method enforces the constraints, part of the
- * provided bounds may end up outside of the viewport.
- * Use {@link OpenSeadragon.Viewport#fitBounds} to ignore them.
- * @function
- * @param {OpenSeadragon.Rect} bounds
- * @param {Boolean} [immediately=false]
- * @return {OpenSeadragon.Viewport} Chainable.
- */
- fitBoundsWithConstraints: function(bounds, immediately) {
- return this._fitBounds(bounds, {
- immediately: immediately,
- constraints: true
- });
- },
-
- /**
- * Zooms so the image just fills the viewer vertically.
- * @param {Boolean} immediately
- * @return {OpenSeadragon.Viewport} Chainable.
- */
- fitVertically: function(immediately) {
- var box = new $.Rect(
- this._contentBounds.x + (this._contentBounds.width / 2),
- this._contentBounds.y,
- 0,
- this._contentBounds.height);
- return this.fitBounds(box, immediately);
- },
-
- /**
- * Zooms so the image just fills the viewer horizontally.
- * @param {Boolean} immediately
- * @return {OpenSeadragon.Viewport} Chainable.
- */
- fitHorizontally: function(immediately) {
- var box = new $.Rect(
- this._contentBounds.x,
- this._contentBounds.y + (this._contentBounds.height / 2),
- this._contentBounds.width,
- 0);
- return this.fitBounds(box, immediately);
- },
-
-
- /**
- * @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
- );
- 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) {
- return this.zoomTo(
- this.zoomSpring.target.value * factor, refPoint, immediately);
- },
-
- /**
- * Zooms to the specified zoom level
- * @function
- * @param {Number} zoom The zoom level to zoom to.
- * @param {OpenSeadragon.Point} [refPoint] The point which will stay at
- * the same screen location. Defaults to the viewport center.
- * @param {Boolean} [immediately=false]
- * @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;
- },
-
- /**
- * Rotates this viewport to the angle specified.
- * @function
- * @return {OpenSeadragon.Viewport} Chainable.
- */
- setRotation: function(degrees) {
- if (!this.viewer || !this.viewer.drawer.canRotate()) {
- return this;
- }
-
- degrees = degrees % 360;
- if (degrees < 0) {
- degrees += 360;
- }
- this.degrees = degrees;
- this._setContentBounds(
- this.viewer.world.getHomeBounds(),
- this.viewer.world.getContentFactor());
- this.viewer.forceRedraw();
-
- /**
- * Raised when rotation has been changed.
- *
- * @event rotate
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {Number} degrees - The number of degrees the rotation was set to.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.viewer.raiseEvent('rotate', {"degrees": degrees});
- 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.getBoundsNoRotate(),
- newBounds = oldBounds,
- widthDeltaFactor;
-
- this.containerSize.x = newContainerSize.x;
- this.containerSize.y = newContainerSize.y;
-
- this._updateContainerInnerSize();
-
- if ( maintain ) {
- // TODO: widthDeltaFactor will always be 1; probably not what's intended
- widthDeltaFactor = newContainerSize.x / this.containerSize.x;
- newBounds.width = oldBounds.width * widthDeltaFactor;
- newBounds.height = newBounds.width / this.getAspectRatio();
- }
-
- if( this.viewer ){
- /**
- * Raised when 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 );
- },
-
- // private
- _updateContainerInnerSize: function() {
- this._containerInnerSize = new $.Point(
- Math.max(1, this.containerSize.x - (this._margins.left + this._margins.right)),
- Math.max(1, this.containerSize.y - (this._margins.top + this._margins.bottom))
- );
- },
-
- /**
- * Update the zoom and center (X and Y) springs.
- * @function
- * @returns {Boolean} True if any change has been made, false otherwise.
- */
- update: function() {
-
- if (this.zoomPoint) {
- var oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);
- this.zoomSpring.update();
- var newZoomPixel = this.pixelFromPoint(this.zoomPoint, true);
-
- var deltaZoomPixels = newZoomPixel.minus(oldZoomPixel);
- var deltaZoomPoints = this.deltaPointsFromPixels(
- deltaZoomPixels, true);
-
- this.centerSpringX.shiftBy(deltaZoomPoints.x);
- this.centerSpringY.shiftBy(deltaZoomPoints.y);
-
- if (this.zoomSpring.isAtTargetValue()) {
- this.zoomPoint = null;
- }
- } else {
- this.zoomSpring.update();
- }
-
- this.centerSpringX.update();
- this.centerSpringY.update();
-
- var changed = this.centerSpringX.current.value !== this._oldCenterX ||
- this.centerSpringY.current.value !== this._oldCenterY ||
- this.zoomSpring.current.value !== this._oldZoom;
-
- this._oldCenterX = this.centerSpringX.current.value;
- this._oldCenterY = this.centerSpringY.current.value;
- this._oldZoom = this.zoomSpring.current.value;
-
- return changed;
- },
-
- /**
- * Convert a delta (translation vector) from viewport coordinates to pixels
- * coordinates. This method does not take rotation into account.
- * Consider using deltaPixelsFromPoints if you need to account for rotation.
- * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.
- * @param {Boolean} [current=false] - Pass true for the current location;
- * defaults to false (target location).
- * @returns {OpenSeadragon.Point}
- */
- deltaPixelsFromPointsNoRotate: function(deltaPoints, current) {
- return deltaPoints.times(
- this._containerInnerSize.x * this.getZoom(current)
- );
- },
-
- /**
- * Convert a delta (translation vector) from viewport coordinates to pixels
- * coordinates.
- * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.
- * @param {Boolean} [current=false] - Pass true for the current location;
- * defaults to false (target location).
- * @returns {OpenSeadragon.Point}
- */
- deltaPixelsFromPoints: function(deltaPoints, current) {
- return this.deltaPixelsFromPointsNoRotate(
- deltaPoints.rotate(this.getRotation()),
- current);
- },
-
- /**
- * Convert a delta (translation vector) from pixels coordinates to viewport
- * coordinates. This method does not take rotation into account.
- * Consider using deltaPointsFromPixels if you need to account for rotation.
- * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.
- * @param {Boolean} [current=false] - Pass true for the current location;
- * defaults to false (target location).
- * @returns {OpenSeadragon.Point}
- */
- deltaPointsFromPixelsNoRotate: function(deltaPixels, current) {
- return deltaPixels.divide(
- this._containerInnerSize.x * this.getZoom(current)
- );
- },
-
- /**
- * Convert a delta (translation vector) from pixels coordinates to viewport
- * coordinates.
- * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.
- * @param {Boolean} [current=false] - Pass true for the current location;
- * defaults to false (target location).
- * @returns {OpenSeadragon.Point}
- */
- deltaPointsFromPixels: function(deltaPixels, current) {
- return this.deltaPointsFromPixelsNoRotate(deltaPixels, current)
- .rotate(-this.getRotation());
- },
-
- /**
- * Convert viewport coordinates to pixels coordinates.
- * This method does not take rotation into account.
- * Consider using pixelFromPoint if you need to account for rotation.
- * @param {OpenSeadragon.Point} point the viewport coordinates
- * @param {Boolean} [current=false] - Pass true for the current location;
- * defaults to false (target location).
- * @returns {OpenSeadragon.Point}
- */
- pixelFromPointNoRotate: function(point, current) {
- return this._pixelFromPointNoRotate(
- point, this.getBoundsNoRotate(current));
- },
-
- /**
- * Convert viewport coordinates to pixel coordinates.
- * @param {OpenSeadragon.Point} point the viewport coordinates
- * @param {Boolean} [current=false] - Pass true for the current location;
- * defaults to false (target location).
- * @returns {OpenSeadragon.Point}
- */
- pixelFromPoint: function(point, current) {
- return this._pixelFromPoint(point, this.getBoundsNoRotate(current));
- },
-
- // private
- _pixelFromPointNoRotate: function(point, bounds) {
- return point.minus(
- bounds.getTopLeft()
- ).times(
- this._containerInnerSize.x / bounds.width
- ).plus(
- new $.Point(this._margins.left, this._margins.top)
- );
- },
-
- // private
- _pixelFromPoint: function(point, bounds) {
- return this._pixelFromPointNoRotate(
- point.rotate(this.getRotation(), this.getCenter(true)),
- bounds);
- },
-
- /**
- * Convert pixel coordinates to viewport coordinates.
- * This method does not take rotation into account.
- * Consider using pointFromPixel if you need to account for rotation.
- * @param {OpenSeadragon.Point} pixel Pixel coordinates
- * @param {Boolean} [current=false] - Pass true for the current location;
- * defaults to false (target location).
- * @returns {OpenSeadragon.Point}
- */
- pointFromPixelNoRotate: function(pixel, current) {
- var bounds = this.getBoundsNoRotate(current);
- return pixel.minus(
- new $.Point(this._margins.left, this._margins.top)
- ).divide(
- this._containerInnerSize.x / bounds.width
- ).plus(
- bounds.getTopLeft()
- );
- },
-
- /**
- * Convert pixel coordinates to viewport coordinates.
- * @param {OpenSeadragon.Point} pixel Pixel coordinates
- * @param {Boolean} [current=false] - Pass true for the current location;
- * defaults to false (target location).
- * @returns {OpenSeadragon.Point}
- */
- pointFromPixel: function(pixel, current) {
- return this.pointFromPixelNoRotate(pixel, current).rotate(
- -this.getRotation(),
- this.getCenter(true)
- );
- },
-
- // private
- _viewportToImageDelta: function( viewerX, viewerY ) {
- var scale = this._contentBoundsNoRotate.width;
- return new $.Point(
- viewerX * this._contentSizeNoRotate.x / scale,
- viewerY * this._contentSizeNoRotate.x / scale);
- },
-
- /**
- * Translates from OpenSeadragon viewer coordinate system to image coordinate system.
- * This method can be called either by passing X,Y coordinates or an
- * OpenSeadragon.Point
- * Note: not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.
- * @function
- * @param {(OpenSeadragon.Point|Number)} viewerX either a point or the X
- * coordinate in viewport coordinate system.
- * @param {Number} [viewerY] Y coordinate in viewport coordinate system.
- * @return {OpenSeadragon.Point} a point representing the coordinates in the image.
- */
- viewportToImageCoordinates: function(viewerX, viewerY) {
- if (viewerX instanceof $.Point) {
- //they passed a point instead of individual components
- return this.viewportToImageCoordinates(viewerX.x, viewerX.y);
- }
-
- if (this.viewer) {
- var count = this.viewer.world.getItemCount();
- if (count > 1) {
- $.console.error('[Viewport.viewportToImageCoordinates] is not accurate ' +
- 'with multi-image; use TiledImage.viewportToImageCoordinates instead.');
- } else if (count === 1) {
- // It is better to use TiledImage.viewportToImageCoordinates
- // because this._contentBoundsNoRotate can not be relied on
- // with clipping.
- var item = this.viewer.world.getItemAt(0);
- return item.viewportToImageCoordinates(viewerX, viewerY, true);
- }
- }
-
- return this._viewportToImageDelta(
- viewerX - this._contentBoundsNoRotate.x,
- viewerY - this._contentBoundsNoRotate.y);
- },
-
- // private
- _imageToViewportDelta: function( imageX, imageY ) {
- var scale = this._contentBoundsNoRotate.width;
- return new $.Point(
- imageX / this._contentSizeNoRotate.x * scale,
- imageY / this._contentSizeNoRotate.x * scale);
- },
-
- /**
- * Translates from image coordinate system to OpenSeadragon viewer coordinate system
- * This method can be called either by passing X,Y coordinates or an
- * OpenSeadragon.Point
- * Note: not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.
- * @function
- * @param {(OpenSeadragon.Point | Number)} imageX the point or the
- * X coordinate in image coordinate system.
- * @param {Number} [imageY] Y coordinate in image coordinate system.
- * @return {OpenSeadragon.Point} a point representing the coordinates in the viewport.
- */
- imageToViewportCoordinates: function(imageX, imageY) {
- if (imageX instanceof $.Point) {
- //they passed a point instead of individual components
- return this.imageToViewportCoordinates(imageX.x, imageX.y);
- }
-
- if (this.viewer) {
- var count = this.viewer.world.getItemCount();
- if (count > 1) {
- $.console.error('[Viewport.imageToViewportCoordinates] is not accurate ' +
- 'with multi-image; use TiledImage.imageToViewportCoordinates instead.');
- } else if (count === 1) {
- // It is better to use TiledImage.viewportToImageCoordinates
- // because this._contentBoundsNoRotate can not be relied on
- // with clipping.
- var item = this.viewer.world.getItemAt(0);
- return item.imageToViewportCoordinates(imageX, imageY, true);
- }
- }
-
- var point = this._imageToViewportDelta(imageX, imageY);
- point.x += this._contentBoundsNoRotate.x;
- point.y += this._contentBoundsNoRotate.y;
- return point;
- },
-
- /**
- * Translates from a rectangle which describes a portion of the image in
- * pixel coordinates to OpenSeadragon viewport rectangle coordinates.
- * This method can be called either by passing X,Y,width,height or an
- * OpenSeadragon.Rect
- * Note: not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.
- * @function
- * @param {(OpenSeadragon.Rect | Number)} imageX the rectangle or the X
- * coordinate of the top left corner of the rectangle in image coordinate system.
- * @param {Number} [imageY] the Y coordinate of the top left corner of the rectangle
- * in image coordinate system.
- * @param {Number} [pixelWidth] the width in pixel of the rectangle.
- * @param {Number} [pixelHeight] the height in pixel of the rectangle.
- */
- imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight) {
- var rect = imageX;
- if (!(rect instanceof $.Rect)) {
- //they passed individual components instead of a rectangle
- rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);
- }
-
- if (this.viewer) {
- var count = this.viewer.world.getItemCount();
- if (count > 1) {
- $.console.error('[Viewport.imageToViewportRectangle] is not accurate ' +
- 'with multi-image; use TiledImage.imageToViewportRectangle instead.');
- } else if (count === 1) {
- // It is better to use TiledImage.imageToViewportRectangle
- // because this._contentBoundsNoRotate can not be relied on
- // with clipping.
- var item = this.viewer.world.getItemAt(0);
- return item.imageToViewportRectangle(
- imageX, imageY, pixelWidth, pixelHeight, true);
- }
- }
-
- var coordA = this.imageToViewportCoordinates(rect.x, rect.y);
- var coordB = this._imageToViewportDelta(rect.width, rect.height);
- return new $.Rect(
- coordA.x,
- coordA.y,
- coordB.x,
- coordB.y,
- rect.degrees
- );
- },
-
- /**
- * Translates from a rectangle which describes a portion of
- * the viewport in point coordinates to image rectangle coordinates.
- * This method can be called either by passing X,Y,width,height or an
- * OpenSeadragon.Rect
- * Note: not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.
- * @function
- * @param {(OpenSeadragon.Rect | Number)} viewerX either a rectangle or
- * the X coordinate of the top left corner of the rectangle in viewport
- * coordinate system.
- * @param {Number} [viewerY] the Y coordinate of the top left corner of the rectangle
- * in viewport coordinate system.
- * @param {Number} [pointWidth] the width of the rectangle in viewport coordinate system.
- * @param {Number} [pointHeight] the height of the rectangle in viewport coordinate system.
- */
- viewportToImageRectangle: function(viewerX, viewerY, pointWidth, pointHeight) {
- var rect = viewerX;
- if (!(rect instanceof $.Rect)) {
- //they passed individual components instead of a rectangle
- rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);
- }
-
- if (this.viewer) {
- var count = this.viewer.world.getItemCount();
- if (count > 1) {
- $.console.error('[Viewport.viewportToImageRectangle] is not accurate ' +
- 'with multi-image; use TiledImage.viewportToImageRectangle instead.');
- } else if (count === 1) {
- // It is better to use TiledImage.viewportToImageCoordinates
- // because this._contentBoundsNoRotate can not be relied on
- // with clipping.
- var item = this.viewer.world.getItemAt(0);
- return item.viewportToImageRectangle(
- viewerX, viewerY, pointWidth, pointHeight, true);
- }
- }
-
- var coordA = this.viewportToImageCoordinates(rect.x, rect.y);
- var coordB = this._viewportToImageDelta(rect.width, rect.height);
- return new $.Rect(
- coordA.x,
- coordA.y,
- coordB.x,
- coordB.y,
- rect.degrees
- );
- },
-
- /**
- * Convert pixel coordinates relative to the viewer element to image
- * coordinates.
- * Note: not accurate with multi-image.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- viewerElementToImageCoordinates: function( pixel ) {
- var point = this.pointFromPixel( pixel, true );
- return this.viewportToImageCoordinates( point );
- },
-
- /**
- * Convert pixel coordinates relative to the image to
- * viewer element coordinates.
- * Note: not accurate with multi-image.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- imageToViewerElementCoordinates: function( pixel ) {
- var point = this.imageToViewportCoordinates( pixel );
- return this.pixelFromPoint( point, true );
- },
-
- /**
- * Convert pixel coordinates relative to the window to image coordinates.
- * Note: not accurate with multi-image.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- windowToImageCoordinates: function(pixel) {
- $.console.assert(this.viewer,
- "[Viewport.windowToImageCoordinates] the viewport must have a viewer.");
- var viewerCoordinates = pixel.minus(
- $.getElementPosition(this.viewer.element));
- return this.viewerElementToImageCoordinates(viewerCoordinates);
- },
-
- /**
- * Convert image coordinates to pixel coordinates relative to the window.
- * Note: not accurate with multi-image.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- imageToWindowCoordinates: function(pixel) {
- $.console.assert(this.viewer,
- "[Viewport.imageToWindowCoordinates] the viewport must have a viewer.");
- var viewerCoordinates = this.imageToViewerElementCoordinates(pixel);
- return viewerCoordinates.plus(
- $.getElementPosition(this.viewer.element));
- },
-
- /**
- * Convert pixel coordinates relative to the viewer element to viewport
- * coordinates.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- viewerElementToViewportCoordinates: function( pixel ) {
- return this.pointFromPixel( pixel, true );
- },
-
- /**
- * Convert viewport coordinates to pixel coordinates relative to the
- * viewer element.
- * @param {OpenSeadragon.Point} point
- * @returns {OpenSeadragon.Point}
- */
- viewportToViewerElementCoordinates: function( point ) {
- return this.pixelFromPoint( point, true );
- },
-
- /**
- * Convert a rectangle in pixel coordinates relative to the viewer element
- * to viewport coordinates.
- * @param {OpenSeadragon.Rect} rectangle the rectangle to convert
- * @returns {OpenSeadragon.Rect} the converted rectangle
- */
- viewerElementToViewportRectangle: function(rectangle) {
- return $.Rect.fromSummits(
- this.pointFromPixel(rectangle.getTopLeft(), true),
- this.pointFromPixel(rectangle.getTopRight(), true),
- this.pointFromPixel(rectangle.getBottomLeft(), true)
- );
- },
-
- /**
- * Convert a rectangle in viewport coordinates to pixel coordinates relative
- * to the viewer element.
- * @param {OpenSeadragon.Rect} rectangle the rectangle to convert
- * @returns {OpenSeadragon.Rect} the converted rectangle
- */
- viewportToViewerElementRectangle: function(rectangle) {
- return $.Rect.fromSummits(
- this.pixelFromPoint(rectangle.getTopLeft(), true),
- this.pixelFromPoint(rectangle.getTopRight(), true),
- this.pixelFromPoint(rectangle.getBottomLeft(), true)
- );
- },
-
- /**
- * Convert pixel coordinates relative to the window to viewport coordinates.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- windowToViewportCoordinates: function(pixel) {
- $.console.assert(this.viewer,
- "[Viewport.windowToViewportCoordinates] the viewport must have a viewer.");
- var viewerCoordinates = pixel.minus(
- $.getElementPosition(this.viewer.element));
- return this.viewerElementToViewportCoordinates(viewerCoordinates);
- },
-
- /**
- * Convert viewport coordinates to pixel coordinates relative to the window.
- * @param {OpenSeadragon.Point} point
- * @returns {OpenSeadragon.Point}
- */
- viewportToWindowCoordinates: function(point) {
- $.console.assert(this.viewer,
- "[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.");
- var viewerCoordinates = this.viewportToViewerElementCoordinates(point);
- return viewerCoordinates.plus(
- $.getElementPosition(this.viewer.element));
- },
-
- /**
- * Convert a viewport zoom to an image zoom.
- * Image zoom: ratio of the original image size to displayed image size.
- * 1 means original image size, 0.5 half size...
- * Viewport zoom: ratio of the displayed image's width to viewport's width.
- * 1 means identical width, 2 means image's width is twice the viewport's width...
- * Note: not accurate with multi-image.
- * @function
- * @param {Number} viewportZoom The viewport zoom
- * target zoom.
- * @returns {Number} imageZoom The image zoom
- */
- viewportToImageZoom: function(viewportZoom) {
- if (this.viewer) {
- var count = this.viewer.world.getItemCount();
- if (count > 1) {
- $.console.error('[Viewport.viewportToImageZoom] is not ' +
- 'accurate with multi-image.');
- } else if (count === 1) {
- // It is better to use TiledImage.viewportToImageZoom
- // because this._contentBoundsNoRotate can not be relied on
- // with clipping.
- var item = this.viewer.world.getItemAt(0);
- return item.viewportToImageZoom(viewportZoom);
- }
- }
-
- var imageWidth = this._contentSizeNoRotate.x;
- var containerWidth = this._containerInnerSize.x;
- var scale = this._contentBoundsNoRotate.width;
- var viewportToImageZoomRatio = (containerWidth / imageWidth) * scale;
- return viewportZoom * viewportToImageZoomRatio;
- },
-
- /**
- * Convert an image zoom to a viewport zoom.
- * Image zoom: ratio of the original image size to displayed image size.
- * 1 means original image size, 0.5 half size...
- * Viewport zoom: ratio of the displayed image's width to viewport's width.
- * 1 means identical width, 2 means image's width is twice the viewport's width...
- * Note: not accurate with multi-image.
- * @function
- * @param {Number} imageZoom The image zoom
- * target zoom.
- * @returns {Number} viewportZoom The viewport zoom
- */
- imageToViewportZoom: function(imageZoom) {
- if (this.viewer) {
- var count = this.viewer.world.getItemCount();
- if (count > 1) {
- $.console.error('[Viewport.imageToViewportZoom] is not accurate ' +
- 'with multi-image.');
- } else if (count === 1) {
- // It is better to use TiledImage.imageToViewportZoom
- // because this._contentBoundsNoRotate can not be relied on
- // with clipping.
- var item = this.viewer.world.getItemAt(0);
- return item.imageToViewportZoom(imageZoom);
- }
- }
-
- var imageWidth = this._contentSizeNoRotate.x;
- var containerWidth = this._containerInnerSize.x;
- var scale = this._contentBoundsNoRotate.width;
- var viewportToImageZoomRatio = (imageWidth / containerWidth) / scale;
- return imageZoom * viewportToImageZoomRatio;
- }
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - TiledImage
- *
- * 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( $ ){
-
-/**
- * You shouldn't have to create a TiledImage directly; use {@link OpenSeadragon.Viewer#open}
- * or {@link OpenSeadragon.Viewer#addTiledImage} instead.
- * @class TiledImage
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.EventSource
- * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.
- * A new instance is created for each TileSource opened.
- * @param {Object} options - Configuration for this TiledImage.
- * @param {OpenSeadragon.TileSource} options.source - The TileSource that defines this TiledImage.
- * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this TiledImage.
- * @param {OpenSeadragon.TileCache} options.tileCache - The TileCache for this TiledImage to use.
- * @param {OpenSeadragon.Drawer} options.drawer - The Drawer for this TiledImage to draw onto.
- * @param {OpenSeadragon.ImageLoader} options.imageLoader - The ImageLoader for this TiledImage to use.
- * @param {Number} [options.x=0] - Left position, in viewport coordinates.
- * @param {Number} [options.y=0] - Top position, in viewport coordinates.
- * @param {Number} [options.width=1] - Width, in viewport coordinates.
- * @param {Number} [options.height] - Height, in viewport coordinates.
- * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates
- * to fit the image into. If specified, x, y, width and height get ignored.
- * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]
- * How to anchor the image in the bounds if options.fitBounds is set.
- * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to
- * (portions of the image outside of this area will not be visible). Only works on
- * browsers that support the HTML5 canvas.
- * @param {Number} [options.springStiffness] - See {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.animationTime] - See {@link OpenSeadragon.Options}.
- * @param {Number} [options.minZoomImageRatio] - See {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.wrapHorizontal] - See {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.wrapVertical] - See {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.immediateRender] - See {@link OpenSeadragon.Options}.
- * @param {Number} [options.blendTime] - See {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.alwaysBlend] - See {@link OpenSeadragon.Options}.
- * @param {Number} [options.minPixelRatio] - See {@link OpenSeadragon.Options}.
- * @param {Number} [options.smoothTileEdgesMinZoom] - See {@link OpenSeadragon.Options}.
- * @param {Boolean} [options.iOSDevice] - See {@link OpenSeadragon.Options}.
- * @param {Number} [options.opacity=1] - Opacity the tiled image should be drawn at.
- * @param {String} [options.compositeOperation] - How the image is composited onto other images; see compositeOperation in {@link OpenSeadragon.Options} for possible values.
- * @param {Boolean} [options.debugMode] - See {@link OpenSeadragon.Options}.
- * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.
- * @param {String|Boolean} [options.crossOriginPolicy] - See {@link OpenSeadragon.Options}.
- */
-$.TiledImage = function( options ) {
- var _this = this;
-
- $.console.assert( options.tileCache, "[TiledImage] options.tileCache is required" );
- $.console.assert( options.drawer, "[TiledImage] options.drawer is required" );
- $.console.assert( options.viewer, "[TiledImage] options.viewer is required" );
- $.console.assert( options.imageLoader, "[TiledImage] options.imageLoader is required" );
- $.console.assert( options.source, "[TiledImage] options.source is required" );
- $.console.assert(!options.clip || options.clip instanceof $.Rect,
- "[TiledImage] options.clip must be an OpenSeadragon.Rect if present");
-
- $.EventSource.call( this );
-
- this._tileCache = options.tileCache;
- delete options.tileCache;
-
- this._drawer = options.drawer;
- delete options.drawer;
-
- this._imageLoader = options.imageLoader;
- delete options.imageLoader;
-
- if (options.clip instanceof $.Rect) {
- this._clip = options.clip.clone();
- }
-
- delete options.clip;
-
- var x = options.x || 0;
- delete options.x;
- var y = options.y || 0;
- delete options.y;
-
- // Ratio of zoomable image height to width.
- this.normHeight = options.source.dimensions.y / options.source.dimensions.x;
- this.contentAspectX = options.source.dimensions.x / options.source.dimensions.y;
-
- var scale = 1;
- if ( options.width ) {
- scale = options.width;
- delete options.width;
-
- if ( options.height ) {
- $.console.error( "specifying both width and height to a tiledImage is not supported" );
- delete options.height;
- }
- } else if ( options.height ) {
- scale = options.height / this.normHeight;
- delete options.height;
- }
-
- var fitBounds = options.fitBounds;
- delete options.fitBounds;
- var fitBoundsPlacement = options.fitBoundsPlacement || OpenSeadragon.Placement.CENTER;
- delete options.fitBoundsPlacement;
-
- $.extend( true, this, {
-
- //internal state properties
- viewer: null,
- tilesMatrix: {}, // A '3d' dictionary [level][x][y] --> Tile.
- coverage: {}, // A '3d' dictionary [level][x][y] --> Boolean.
- lastDrawn: [], // An unordered list of Tiles drawn last frame.
- lastResetTime: 0, // Last time for which the tiledImage was reset.
- _midDraw: false, // Is the tiledImage currently updating the viewport?
- _needsDraw: true, // Does the tiledImage need to update the viewport again?
- _hasOpaqueTile: false, // Do we have even one fully opaque tile?
- //configurable settings
- springStiffness: $.DEFAULT_SETTINGS.springStiffness,
- animationTime: $.DEFAULT_SETTINGS.animationTime,
- minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio,
- wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal,
- wrapVertical: $.DEFAULT_SETTINGS.wrapVertical,
- immediateRender: $.DEFAULT_SETTINGS.immediateRender,
- blendTime: $.DEFAULT_SETTINGS.blendTime,
- alwaysBlend: $.DEFAULT_SETTINGS.alwaysBlend,
- minPixelRatio: $.DEFAULT_SETTINGS.minPixelRatio,
- smoothTileEdgesMinZoom: $.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,
- iOSDevice: $.DEFAULT_SETTINGS.iOSDevice,
- debugMode: $.DEFAULT_SETTINGS.debugMode,
- crossOriginPolicy: $.DEFAULT_SETTINGS.crossOriginPolicy,
- placeholderFillStyle: $.DEFAULT_SETTINGS.placeholderFillStyle,
- opacity: $.DEFAULT_SETTINGS.opacity,
- compositeOperation: $.DEFAULT_SETTINGS.compositeOperation
-
- }, options );
-
- this._xSpring = new $.Spring({
- initial: x,
- springStiffness: this.springStiffness,
- animationTime: this.animationTime
- });
-
- this._ySpring = new $.Spring({
- initial: y,
- springStiffness: this.springStiffness,
- animationTime: this.animationTime
- });
-
- this._scaleSpring = new $.Spring({
- initial: scale,
- springStiffness: this.springStiffness,
- animationTime: this.animationTime
- });
-
- this._updateForScale();
-
- if (fitBounds) {
- this.fitBounds(fitBounds, fitBoundsPlacement, true);
- }
-
- // We need a callback to give image manipulation a chance to happen
- this._drawingHandler = function(args) {
- /**
- * This event is fired just before the tile is drawn giving the application a chance to alter the image.
- *
- * NOTE: This event is only fired when the drawer is using a &lt;canvas&gt;.
- *
- * @event tile-drawing
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
- * @property {OpenSeadragon.Tile} tile - The Tile being drawn.
- * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.
- * @property {OpenSeadragon.Tile} context - The HTML canvas context being drawn into.
- * @property {OpenSeadragon.Tile} rendered - The HTML canvas context containing the tile imagery.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- _this.viewer.raiseEvent('tile-drawing', $.extend({
- tiledImage: _this
- }, args));
- };
-};
-
-$.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.TiledImage.prototype */{
- /**
- * @returns {Boolean} Whether the TiledImage needs to be drawn.
- */
- needsDraw: function() {
- return this._needsDraw;
- },
-
- /**
- * Clears all tiles and triggers an update on the next call to
- * {@link OpenSeadragon.TiledImage#update}.
- */
- reset: function() {
- this._tileCache.clearTilesFor(this);
- this.lastResetTime = $.now();
- this._needsDraw = true;
- },
-
- /**
- * Updates the TiledImage's bounds, animating if needed.
- * @returns {Boolean} Whether the TiledImage animated.
- */
- update: function() {
- var oldX = this._xSpring.current.value;
- var oldY = this._ySpring.current.value;
- var oldScale = this._scaleSpring.current.value;
-
- this._xSpring.update();
- this._ySpring.update();
- this._scaleSpring.update();
-
- if (this._xSpring.current.value !== oldX || this._ySpring.current.value !== oldY ||
- this._scaleSpring.current.value !== oldScale) {
- this._updateForScale();
- this._needsDraw = true;
- return true;
- }
-
- return false;
- },
-
- /**
- * Draws the TiledImage to its Drawer.
- */
- draw: function() {
- if (this.opacity !== 0) {
- this._midDraw = true;
- updateViewport(this);
- this._midDraw = false;
- }
- },
-
- /**
- * Destroy the TiledImage (unload current loaded tiles).
- */
- destroy: function() {
- this.reset();
- },
-
- /**
- * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.
- * @param {Boolean} [current=false] - Pass true for the current location; false for target location.
- */
- getBounds: function(current) {
- if (current) {
- return new $.Rect( this._xSpring.current.value, this._ySpring.current.value,
- this._worldWidthCurrent, this._worldHeightCurrent );
- }
-
- return new $.Rect( this._xSpring.target.value, this._ySpring.target.value,
- this._worldWidthTarget, this._worldHeightTarget );
- },
-
- // deprecated
- getWorldBounds: function() {
- $.console.error('[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead');
- return this.getBounds();
- },
-
- /**
- * Get the bounds of the displayed part of the tiled image.
- * @param {Boolean} [current=false] Pass true for the current location,
- * false for the target location.
- * @returns {$.Rect} The clipped bounds in viewport coordinates.
- */
- getClippedBounds: function(current) {
- var bounds = this.getBounds(current);
- if (this._clip) {
- var ratio = this._worldWidthCurrent / this.source.dimensions.x;
- var clip = this._clip.times(ratio);
- bounds = new $.Rect(
- bounds.x + clip.x,
- bounds.y + clip.y,
- clip.width,
- clip.height);
- }
- return bounds;
- },
-
- /**
- * @returns {OpenSeadragon.Point} This TiledImage's content size, in original pixels.
- */
- getContentSize: function() {
- return new $.Point(this.source.dimensions.x, this.source.dimensions.y);
- },
-
- // private
- _viewportToImageDelta: function( viewerX, viewerY, current ) {
- var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);
- return new $.Point(viewerX * (this.source.dimensions.x / scale),
- viewerY * ((this.source.dimensions.y * this.contentAspectX) / scale));
- },
-
- /**
- * Translates from OpenSeadragon viewer coordinate system to image coordinate system.
- * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.
- * @param {Number|OpenSeadragon.Point} viewerX - The X coordinate or point in viewport coordinate system.
- * @param {Number} [viewerY] - The Y coordinate in viewport coordinate system.
- * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.
- * @return {OpenSeadragon.Point} A point representing the coordinates in the image.
- */
- viewportToImageCoordinates: function( viewerX, viewerY, current ) {
- if (viewerX instanceof $.Point) {
- //they passed a point instead of individual components
- current = viewerY;
- viewerY = viewerX.y;
- viewerX = viewerX.x;
- }
-
- if (current) {
- return this._viewportToImageDelta(viewerX - this._xSpring.current.value,
- viewerY - this._ySpring.current.value);
- }
-
- return this._viewportToImageDelta(viewerX - this._xSpring.target.value,
- viewerY - this._ySpring.target.value);
- },
-
- // private
- _imageToViewportDelta: function( imageX, imageY, current ) {
- var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);
- return new $.Point((imageX / this.source.dimensions.x) * scale,
- (imageY / this.source.dimensions.y / this.contentAspectX) * scale);
- },
-
- /**
- * Translates from image coordinate system to OpenSeadragon viewer coordinate system
- * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.
- * @param {Number|OpenSeadragon.Point} imageX - The X coordinate or point in image coordinate system.
- * @param {Number} [imageY] - The Y coordinate in image coordinate system.
- * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.
- * @return {OpenSeadragon.Point} A point representing the coordinates in the viewport.
- */
- imageToViewportCoordinates: function( imageX, imageY, current ) {
- if (imageX instanceof $.Point) {
- //they passed a point instead of individual components
- current = imageY;
- imageY = imageX.y;
- imageX = imageX.x;
- }
-
- var point = this._imageToViewportDelta(imageX, imageY);
- if (current) {
- point.x += this._xSpring.current.value;
- point.y += this._ySpring.current.value;
- } else {
- point.x += this._xSpring.target.value;
- point.y += this._ySpring.target.value;
- }
-
- return point;
- },
-
- /**
- * Translates from a rectangle which describes a portion of the image in
- * pixel coordinates to OpenSeadragon viewport rectangle coordinates.
- * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.
- * @param {Number|OpenSeadragon.Rect} imageX - The left coordinate or rectangle in image coordinate system.
- * @param {Number} [imageY] - The top coordinate in image coordinate system.
- * @param {Number} [pixelWidth] - The width in pixel of the rectangle.
- * @param {Number} [pixelHeight] - The height in pixel of the rectangle.
- * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.
- * @return {OpenSeadragon.Rect} A rect representing the coordinates in the viewport.
- */
- imageToViewportRectangle: function( imageX, imageY, pixelWidth, pixelHeight, current ) {
- var rect = imageX;
- if (rect instanceof $.Rect) {
- //they passed a rect instead of individual components
- current = imageY;
- } else {
- rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);
- }
-
- var coordA = this.imageToViewportCoordinates(rect.getTopLeft(), current);
- var coordB = this._imageToViewportDelta(rect.width, rect.height, current);
-
- return new $.Rect(
- coordA.x,
- coordA.y,
- coordB.x,
- coordB.y,
- rect.degrees
- );
- },
-
- /**
- * Translates from a rectangle which describes a portion of
- * the viewport in point coordinates to image rectangle coordinates.
- * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.
- * @param {Number|OpenSeadragon.Rect} viewerX - The left coordinate or rectangle in viewport coordinate system.
- * @param {Number} [viewerY] - The top coordinate in viewport coordinate system.
- * @param {Number} [pointWidth] - The width in viewport coordinate system.
- * @param {Number} [pointHeight] - The height in viewport coordinate system.
- * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.
- * @return {OpenSeadragon.Rect} A rect representing the coordinates in the image.
- */
- viewportToImageRectangle: function( viewerX, viewerY, pointWidth, pointHeight, current ) {
- var rect = viewerX;
- if (viewerX instanceof $.Rect) {
- //they passed a rect instead of individual components
- current = viewerY;
- } else {
- rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);
- }
-
- var coordA = this.viewportToImageCoordinates(rect.getTopLeft(), current);
- var coordB = this._viewportToImageDelta(rect.width, rect.height, current);
-
- return new $.Rect(
- coordA.x,
- coordA.y,
- coordB.x,
- coordB.y,
- rect.degrees
- );
- },
-
- /**
- * Convert pixel coordinates relative to the viewer element to image
- * coordinates.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- viewerElementToImageCoordinates: function( pixel ) {
- var point = this.viewport.pointFromPixel( pixel, true );
- return this.viewportToImageCoordinates( point );
- },
-
- /**
- * Convert pixel coordinates relative to the image to
- * viewer element coordinates.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- imageToViewerElementCoordinates: function( pixel ) {
- var point = this.imageToViewportCoordinates( pixel );
- return this.viewport.pixelFromPoint( point, true );
- },
-
- /**
- * Convert pixel coordinates relative to the window to image coordinates.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- windowToImageCoordinates: function( pixel ) {
- var viewerCoordinates = pixel.minus(
- OpenSeadragon.getElementPosition( this.viewer.element ));
- return this.viewerElementToImageCoordinates( viewerCoordinates );
- },
-
- /**
- * Convert image coordinates to pixel coordinates relative to the window.
- * @param {OpenSeadragon.Point} pixel
- * @returns {OpenSeadragon.Point}
- */
- imageToWindowCoordinates: function( pixel ) {
- var viewerCoordinates = this.imageToViewerElementCoordinates( pixel );
- return viewerCoordinates.plus(
- OpenSeadragon.getElementPosition( this.viewer.element ));
- },
-
- /**
- * Convert a viewport zoom to an image zoom.
- * Image zoom: ratio of the original image size to displayed image size.
- * 1 means original image size, 0.5 half size...
- * Viewport zoom: ratio of the displayed image's width to viewport's width.
- * 1 means identical width, 2 means image's width is twice the viewport's width...
- * @function
- * @param {Number} viewportZoom The viewport zoom
- * @returns {Number} imageZoom The image zoom
- */
- viewportToImageZoom: function( viewportZoom ) {
- var ratio = this._scaleSpring.current.value *
- this.viewport._containerInnerSize.x / this.source.dimensions.x;
- return ratio * viewportZoom ;
- },
-
- /**
- * Convert an image zoom to a viewport zoom.
- * Image zoom: ratio of the original image size to displayed image size.
- * 1 means original image size, 0.5 half size...
- * Viewport zoom: ratio of the displayed image's width to viewport's width.
- * 1 means identical width, 2 means image's width is twice the viewport's width...
- * Note: not accurate with multi-image.
- * @function
- * @param {Number} imageZoom The image zoom
- * @returns {Number} viewportZoom The viewport zoom
- */
- imageToViewportZoom: function( imageZoom ) {
- var ratio = this._scaleSpring.current.value *
- this.viewport._containerInnerSize.x / this.source.dimensions.x;
- return imageZoom / ratio;
- },
-
- /**
- * Sets the TiledImage's position in the world.
- * @param {OpenSeadragon.Point} position - The new position, in viewport coordinates.
- * @param {Boolean} [immediately=false] - Whether to animate to the new position or snap immediately.
- * @fires OpenSeadragon.TiledImage.event:bounds-change
- */
- setPosition: function(position, immediately) {
- var sameTarget = (this._xSpring.target.value === position.x &&
- this._ySpring.target.value === position.y);
-
- if (immediately) {
- if (sameTarget && this._xSpring.current.value === position.x &&
- this._ySpring.current.value === position.y) {
- return;
- }
-
- this._xSpring.resetTo(position.x);
- this._ySpring.resetTo(position.y);
- this._needsDraw = true;
- } else {
- if (sameTarget) {
- return;
- }
-
- this._xSpring.springTo(position.x);
- this._ySpring.springTo(position.y);
- this._needsDraw = true;
- }
-
- if (!sameTarget) {
- this._raiseBoundsChange();
- }
- },
-
- /**
- * Sets the TiledImage's width in the world, adjusting the height to match based on aspect ratio.
- * @param {Number} width - The new width, in viewport coordinates.
- * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.
- * @fires OpenSeadragon.TiledImage.event:bounds-change
- */
- setWidth: function(width, immediately) {
- this._setScale(width, immediately);
- },
-
- /**
- * Sets the TiledImage's height in the world, adjusting the width to match based on aspect ratio.
- * @param {Number} height - The new height, in viewport coordinates.
- * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.
- * @fires OpenSeadragon.TiledImage.event:bounds-change
- */
- setHeight: function(height, immediately) {
- this._setScale(height / this.normHeight, immediately);
- },
-
- /**
- * Positions and scales the TiledImage to fit in the specified bounds.
- * Note: this method fires OpenSeadragon.TiledImage.event:bounds-change
- * twice
- * @param {OpenSeadragon.Rect} bounds The bounds to fit the image into.
- * @param {OpenSeadragon.Placement} [anchor=OpenSeadragon.Placement.CENTER]
- * How to anchor the image in the bounds.
- * @param {Boolean} [immediately=false] Whether to animate to the new size
- * or snap immediately.
- * @fires OpenSeadragon.TiledImage.event:bounds-change
- */
- fitBounds: function(bounds, anchor, immediately) {
- anchor = anchor || $.Placement.CENTER;
- var anchorProperties = $.Placement.properties[anchor];
- var aspectRatio = this.contentAspectX;
- var xOffset = 0;
- var yOffset = 0;
- var displayedWidthRatio = 1;
- var displayedHeightRatio = 1;
- if (this._clip) {
- aspectRatio = this._clip.getAspectRatio();
- displayedWidthRatio = this._clip.width / this.source.dimensions.x;
- displayedHeightRatio = this._clip.height / this.source.dimensions.y;
- if (bounds.getAspectRatio() > aspectRatio) {
- xOffset = this._clip.x / this._clip.height * bounds.height;
- yOffset = this._clip.y / this._clip.height * bounds.height;
- } else {
- xOffset = this._clip.x / this._clip.width * bounds.width;
- yOffset = this._clip.y / this._clip.width * bounds.width;
- }
- }
-
- if (bounds.getAspectRatio() > aspectRatio) {
- // We will have margins on the X axis
- var height = bounds.height / displayedHeightRatio;
- var marginLeft = 0;
- if (anchorProperties.isHorizontallyCentered) {
- marginLeft = (bounds.width - bounds.height * aspectRatio) / 2;
- } else if (anchorProperties.isRight) {
- marginLeft = bounds.width - bounds.height * aspectRatio;
- }
- this.setPosition(
- new $.Point(bounds.x - xOffset + marginLeft, bounds.y - yOffset),
- immediately);
- this.setHeight(height, immediately);
- } else {
- // We will have margins on the Y axis
- var width = bounds.width / displayedWidthRatio;
- var marginTop = 0;
- if (anchorProperties.isVerticallyCentered) {
- marginTop = (bounds.height - bounds.width / aspectRatio) / 2;
- } else if (anchorProperties.isBottom) {
- marginTop = bounds.height - bounds.width / aspectRatio;
- }
- this.setPosition(
- new $.Point(bounds.x - xOffset, bounds.y - yOffset + marginTop),
- immediately);
- this.setWidth(width, immediately);
- }
- },
-
- /**
- * @returns {OpenSeadragon.Rect|null} The TiledImage's current clip rectangle,
- * in image pixels, or null if none.
- */
- getClip: function() {
- if (this._clip) {
- return this._clip.clone();
- }
-
- return null;
- },
-
- /**
- * @param {OpenSeadragon.Rect|null} newClip - An area, in image pixels, to clip to
- * (portions of the image outside of this area will not be visible). Only works on
- * browsers that support the HTML5 canvas.
- */
- setClip: function(newClip) {
- $.console.assert(!newClip || newClip instanceof $.Rect,
- "[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null");
-
- if (newClip instanceof $.Rect) {
- this._clip = newClip.clone();
- } else {
- this._clip = null;
- }
-
- this._needsDraw = true;
- },
-
- /**
- * @returns {Number} The TiledImage's current opacity.
- */
- getOpacity: function() {
- return this.opacity;
- },
-
- /**
- * @param {Number} opacity Opacity the tiled image should be drawn at.
- */
- setOpacity: function(opacity) {
- this.opacity = opacity;
- this._needsDraw = true;
- },
-
- /**
- * @returns {String} The TiledImage's current compositeOperation.
- */
- getCompositeOperation: function() {
- return this.compositeOperation;
- },
-
- /**
- * @param {String} compositeOperation the tiled image should be drawn with this globalCompositeOperation.
- */
- setCompositeOperation: function(compositeOperation) {
- this.compositeOperation = compositeOperation;
- this._needsDraw = true;
- },
-
- // private
- _setScale: function(scale, immediately) {
- var sameTarget = (this._scaleSpring.target.value === scale);
- if (immediately) {
- if (sameTarget && this._scaleSpring.current.value === scale) {
- return;
- }
-
- this._scaleSpring.resetTo(scale);
- this._updateForScale();
- this._needsDraw = true;
- } else {
- if (sameTarget) {
- return;
- }
-
- this._scaleSpring.springTo(scale);
- this._updateForScale();
- this._needsDraw = true;
- }
-
- if (!sameTarget) {
- this._raiseBoundsChange();
- }
- },
-
- // private
- _updateForScale: function() {
- this._worldWidthTarget = this._scaleSpring.target.value;
- this._worldHeightTarget = this.normHeight * this._scaleSpring.target.value;
- this._worldWidthCurrent = this._scaleSpring.current.value;
- this._worldHeightCurrent = this.normHeight * this._scaleSpring.current.value;
- },
-
- // private
- _raiseBoundsChange: function() {
- /**
- * Raised when the TiledImage's bounds are changed.
- * Note that this event is triggered only when the animation target is changed;
- * not for every frame of animation.
- * @event bounds-change
- * @memberOf OpenSeadragon.TiledImage
- * @type {object}
- * @property {OpenSeadragon.World} eventSource - A reference to the TiledImage which raised the event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent('bounds-change');
- },
-
- // private
- _isBottomItem: function() {
- return this.viewer.world.getItemAt(0) === this;
- }
-});
-
-/**
- * @private
- * @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( tiledImage ) {
-
- tiledImage._needsDraw = false;
-
- var tile,
- level,
- best = null,
- haveDrawn = false,
- currentTime = $.now(),
- viewportBounds = tiledImage.viewport.getBoundsWithMargins( true ),
- zeroRatioC = tiledImage.viewport.deltaPixelsFromPointsNoRotate(
- tiledImage.source.getPixelRatio( 0 ),
- true
- ).x * tiledImage._scaleSpring.current.value,
- lowestLevel = Math.max(
- tiledImage.source.minLevel,
- Math.floor(
- Math.log( tiledImage.minZoomImageRatio ) /
- Math.log( 2 )
- )
- ),
- highestLevel = Math.min(
- Math.abs(tiledImage.source.maxLevel),
- Math.abs(Math.floor(
- Math.log( zeroRatioC / tiledImage.minPixelRatio ) /
- Math.log( 2 )
- ))
- ),
- renderPixelRatioC,
- renderPixelRatioT,
- zeroRatioT,
- optimalRatio,
- levelOpacity,
- levelVisibility;
-
- // Reset tile's internal drawn state
- while (tiledImage.lastDrawn.length > 0) {
- tile = tiledImage.lastDrawn.pop();
- tile.beingDrawn = false;
- }
-
- if (!tiledImage.wrapHorizontal && !tiledImage.wrapVertical) {
- var tiledImageBounds = tiledImage.getClippedBounds(true);
- var intersection = viewportBounds.intersection(tiledImageBounds);
- if (intersection === null) {
- return;
- }
- viewportBounds = intersection;
- }
- viewportBounds = viewportBounds.getBoundingBox();
- viewportBounds.x -= tiledImage._xSpring.current.value;
- viewportBounds.y -= tiledImage._ySpring.current.value;
-
- var viewportTL = viewportBounds.getTopLeft();
- var viewportBR = viewportBounds.getBottomRight();
-
- //Don't draw if completely outside of the viewport
- if ( !tiledImage.wrapHorizontal && (viewportBR.x < 0 || viewportTL.x > tiledImage._worldWidthCurrent ) ) {
- return;
- }
-
- if ( !tiledImage.wrapVertical && ( viewportBR.y < 0 || viewportTL.y > tiledImage._worldHeightCurrent ) ) {
- return;
- }
-
- // Calculate viewport rect / bounds
- if ( !tiledImage.wrapHorizontal ) {
- viewportTL.x = Math.max( viewportTL.x, 0 );
- viewportBR.x = Math.min( viewportBR.x, tiledImage._worldWidthCurrent );
- }
-
- if ( !tiledImage.wrapVertical ) {
- viewportTL.y = Math.max( viewportTL.y, 0 );
- viewportBR.y = Math.min( viewportBR.y, tiledImage._worldHeightCurrent );
- }
-
- // Calculations for the interval of levels to draw
- // (above in initial var statement)
- // can return invalid intervals; fix that here if necessary
- lowestLevel = Math.min( lowestLevel, highestLevel );
-
- // Update any level that will be drawn
- 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 = tiledImage.viewport.deltaPixelsFromPointsNoRotate(
- tiledImage.source.getPixelRatio( level ),
- true
- ).x * tiledImage._scaleSpring.current.value;
-
- if ( ( !haveDrawn && renderPixelRatioC >= tiledImage.minPixelRatio ) ||
- ( level == lowestLevel ) ) {
- drawLevel = true;
- haveDrawn = true;
- } else if ( !haveDrawn ) {
- continue;
- }
-
- //Perform calculations for draw if we haven't drawn this
- renderPixelRatioT = tiledImage.viewport.deltaPixelsFromPointsNoRotate(
- tiledImage.source.getPixelRatio( level ),
- false
- ).x * tiledImage._scaleSpring.current.value;
-
- zeroRatioT = tiledImage.viewport.deltaPixelsFromPointsNoRotate(
- tiledImage.source.getPixelRatio(
- Math.max(
- tiledImage.source.getClosestLevel( tiledImage.viewport.containerSize ) - 1,
- 0
- )
- ),
- false
- ).x * tiledImage._scaleSpring.current.value;
-
- optimalRatio = tiledImage.immediateRender ?
- 1 :
- zeroRatioT;
-
- levelOpacity = Math.min( 1, ( renderPixelRatioC - 0.5 ) / 0.5 );
-
- levelVisibility = optimalRatio / Math.abs(
- optimalRatio - renderPixelRatioT
- );
-
- // Update the level and keep track of 'best' tile to load
- best = updateLevel(
- tiledImage,
- haveDrawn,
- drawLevel,
- level,
- levelOpacity,
- levelVisibility,
- viewportTL,
- viewportBR,
- currentTime,
- best
- );
-
- // Stop the loop if lower-res tiles would all be covered by
- // already drawn tiles
- if ( providesCoverage( tiledImage.coverage, level ) ) {
- break;
- }
- }
-
- // Perform the actual drawing
- drawTiles( tiledImage, tiledImage.lastDrawn );
-
- // Load the new 'best' tile
- if (best && !best.context2D) {
- loadTile( tiledImage, best, currentTime );
- }
-
-}
-
-
-function updateLevel( tiledImage, haveDrawn, drawLevel, level, levelOpacity, levelVisibility, viewportTL, viewportBR, currentTime, best ){
-
- var x, y,
- tileTL,
- tileBR,
- numberOfTiles,
- viewportCenter = tiledImage.viewport.pixelFromPoint( tiledImage.viewport.getCenter() );
-
-
- if( tiledImage.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 {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.
- * @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.
- */
- tiledImage.viewer.raiseEvent( 'update-level', {
- tiledImage: tiledImage,
- 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 = tiledImage.source.getTileAtPoint( level, viewportTL.divide( tiledImage._scaleSpring.current.value ));
- tileBR = tiledImage.source.getTileAtPoint( level, viewportBR.divide( tiledImage._scaleSpring.current.value ));
- numberOfTiles = tiledImage.source.getNumTiles( level );
-
- resetCoverage( tiledImage.coverage, level );
-
- if ( !tiledImage.wrapHorizontal ) {
- tileBR.x = Math.min( tileBR.x, numberOfTiles.x - 1 );
- }
- if ( !tiledImage.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(
- tiledImage,
- drawLevel,
- haveDrawn,
- x, y,
- level,
- levelOpacity,
- levelVisibility,
- viewportCenter,
- numberOfTiles,
- currentTime,
- best
- );
-
- }
- }
-
- return best;
-}
-
-function updateTile( tiledImage, drawLevel, haveDrawn, x, y, level, levelOpacity, levelVisibility, viewportCenter, numberOfTiles, currentTime, best){
-
- var tile = getTile(
- x, y,
- level,
- tiledImage.source,
- tiledImage.tilesMatrix,
- currentTime,
- numberOfTiles,
- tiledImage._worldWidthCurrent,
- tiledImage._worldHeightCurrent
- ),
- drawTile = drawLevel;
-
- if( tiledImage.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.TiledImage} tiledImage - Which TiledImage is being drawn.
- * @property {OpenSeadragon.Tile} tile
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- tiledImage.viewer.raiseEvent( 'update-tile', {
- tiledImage: tiledImage,
- tile: tile
- });
- }
-
- setCoverage( tiledImage.coverage, level, x, y, false );
-
- if ( !tile.exists ) {
- return best;
- }
-
- if ( haveDrawn && !drawTile ) {
- if ( isCovered( tiledImage.coverage, level, x, y ) ) {
- setCoverage( tiledImage.coverage, level, x, y, true );
- } else {
- drawTile = true;
- }
- }
-
- if ( !drawTile ) {
- return best;
- }
-
- positionTile(
- tile,
- tiledImage.source.tileOverlap,
- tiledImage.viewport,
- viewportCenter,
- levelVisibility,
- tiledImage
- );
-
- if (!tile.loaded) {
- if (tile.context2D) {
- setTileLoaded(tiledImage, tile);
- } else {
- var imageRecord = tiledImage._tileCache.getImageRecord(tile.url);
- if (imageRecord) {
- var image = imageRecord.getImage();
- setTileLoaded(tiledImage, tile, image);
- }
- }
- }
-
- if ( tile.loaded ) {
- var needsDraw = blendTile(
- tiledImage,
- tile,
- x, y,
- level,
- levelOpacity,
- currentTime
- );
-
- if ( needsDraw ) {
- tiledImage._needsDraw = 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, worldWidth, worldHeight ) {
- var xMod,
- yMod,
- bounds,
- exists,
- url,
- context2D,
- 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 );
- context2D = tileSource.getContext2D ?
- tileSource.getContext2D(level, xMod, yMod) : undefined;
-
- bounds.x += ( x - xMod ) / numTiles.x;
- bounds.y += (worldHeight / worldWidth) * (( y - yMod ) / numTiles.y);
-
- tilesMatrix[ level ][ x ][ y ] = new $.Tile(
- level,
- x,
- y,
- bounds,
- exists,
- url,
- context2D
- );
- }
-
- tile = tilesMatrix[ level ][ x ][ y ];
- tile.lastTouchTime = time;
-
- return tile;
-}
-
-function loadTile( tiledImage, tile, time ) {
- tile.loading = true;
- tiledImage._imageLoader.addJob({
- src: tile.url,
- crossOriginPolicy: tiledImage.crossOriginPolicy,
- callback: function( image, errorMsg ){
- onTileLoad( tiledImage, tile, time, image, errorMsg );
- },
- abort: function() {
- tile.loading = false;
- }
- });
-}
-
-function onTileLoad( tiledImage, tile, time, image, errorMsg ) {
- if ( !image ) {
- $.console.log( "Tile %s failed to load: %s - error: %s", tile, tile.url, errorMsg );
- /**
- * Triggered when a tile fails to load.
- *
- * @event tile-load-failed
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.Tile} tile - The tile that failed to load.
- * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image the tile belongs to.
- * @property {number} time - The time in milliseconds when the tile load began.
- * @property {string} message - The error message.
- */
- tiledImage.viewer.raiseEvent("tile-load-failed", {tile: tile, tiledImage: tiledImage, time: time, message: errorMsg});
- tile.loading = false;
- tile.exists = false;
- return;
- }
-
- if ( time < tiledImage.lastResetTime ) {
- $.console.log( "Ignoring tile %s loaded before reset: %s", tile, tile.url );
- tile.loading = false;
- return;
- }
-
- var finish = function() {
- var cutoff = Math.ceil( Math.log(
- tiledImage.source.getTileWidth(tile.level) ) / Math.log( 2 ) );
- setTileLoaded(tiledImage, tile, image, cutoff);
- };
-
- // Check if we're mid-update; this can happen on IE8 because image load events for
- // cached images happen immediately there
- if ( !tiledImage._midDraw ) {
- finish();
- } else {
- // Wait until after the update, in case caching unloads any tiles
- window.setTimeout( finish, 1);
- }
-}
-
-function setTileLoaded(tiledImage, tile, image, cutoff) {
- var increment = 0;
-
- function getCompletionCallback() {
- increment++;
- return completionCallback;
- }
-
- function completionCallback() {
- increment--;
- if (increment === 0) {
- tile.loading = false;
- tile.loaded = true;
- if (!tile.context2D) {
- tiledImage._tileCache.cacheTile({
- image: image,
- tile: tile,
- cutoff: cutoff,
- tiledImage: tiledImage
- });
- }
- tiledImage._needsDraw = true;
- }
- }
-
- /**
- * Triggered when a tile has just been loaded in memory. That means that the
- * image has been downloaded and can be modified before being drawn to the canvas.
- *
- * @event tile-loaded
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {Image} image - The image of the tile.
- * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the loaded tile.
- * @property {OpenSeadragon.Tile} tile - The tile which has been loaded.
- * @property {function} getCompletionCallback - A function giving a callback to call
- * when the asynchronous processing of the image is done. The image will be
- * marked as entirely loaded when the callback has been called once for each
- * call to getCompletionCallback.
- */
- tiledImage.viewer.raiseEvent("tile-loaded", {
- tile: tile,
- tiledImage: tiledImage,
- image: image,
- getCompletionCallback: getCompletionCallback
- });
- // In case the completion callback is never called, we at least force it once.
- getCompletionCallback()();
-}
-
-function positionTile( tile, overlap, viewport, viewportCenter, levelVisibility, tiledImage ){
- var boundsTL = tile.bounds.getTopLeft();
-
- boundsTL.x *= tiledImage._scaleSpring.current.value;
- boundsTL.y *= tiledImage._scaleSpring.current.value;
- boundsTL.x += tiledImage._xSpring.current.value;
- boundsTL.y += tiledImage._ySpring.current.value;
-
- var boundsSize = tile.bounds.getSize();
-
- boundsSize.x *= tiledImage._scaleSpring.current.value;
- boundsSize.y *= tiledImage._scaleSpring.current.value;
-
- var positionC = viewport.pixelFromPointNoRotate(boundsTL, true),
- positionT = viewport.pixelFromPointNoRotate(boundsTL, false),
- sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true),
- sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false),
- tileCenter = positionT.plus( sizeT.divide( 2 ) ),
- 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( tiledImage, tile, x, y, level, levelOpacity, currentTime ){
- var blendTimeMillis = 1000 * tiledImage.blendTime,
- deltaTime,
- opacity;
-
- if ( !tile.blendStart ) {
- tile.blendStart = currentTime;
- }
-
- deltaTime = currentTime - tile.blendStart;
- opacity = blendTimeMillis ? Math.min( 1, deltaTime / ( blendTimeMillis ) ) : 1;
-
- if ( tiledImage.alwaysBlend ) {
- opacity *= levelOpacity;
- }
-
- tile.opacity = opacity;
-
- tiledImage.lastDrawn.push( tile );
-
- if ( opacity == 1 ) {
- setCoverage( tiledImage.coverage, level, x, y, true );
- tiledImage._hasOpaqueTile = true;
- } else if ( deltaTime < blendTimeMillis ) {
- return true;
- }
-
- return false;
-}
-
-/**
- * @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 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 drawTiles( tiledImage, lastDrawn ) {
- if (lastDrawn.length === 0) {
- return;
- }
- var tile = lastDrawn[0];
-
- var useSketch = tiledImage.opacity < 1 ||
- (tiledImage.compositeOperation &&
- tiledImage.compositeOperation !== 'source-over') ||
- (!tiledImage._isBottomItem() && tile._hasTransparencyChannel());
-
- var sketchScale;
- var sketchTranslate;
-
- var zoom = tiledImage.viewport.getZoom(true);
- var imageZoom = tiledImage.viewportToImageZoom(zoom);
- if (imageZoom > tiledImage.smoothTileEdgesMinZoom && !tiledImage.iOSDevice) {
- // When zoomed in a lot (>100%) the tile edges are visible.
- // So we have to composite them at ~100% and scale them up together.
- // Note: Disabled on iOS devices per default as it causes a native crash
- useSketch = true;
- sketchScale = tile.getScaleForEdgeSmoothing();
- sketchTranslate = tile.getTranslationForEdgeSmoothing(sketchScale,
- tiledImage._drawer.getCanvasSize(false),
- tiledImage._drawer.getCanvasSize(true));
- }
-
- var bounds;
- if (useSketch) {
- if (!sketchScale) {
- // Except when edge smoothing, we only clean the part of the
- // sketch canvas we are going to use for performance reasons.
- bounds = tiledImage.viewport.viewportToViewerElementRectangle(
- tiledImage.getClippedBounds(true))
- .getIntegerBoundingBox()
- .times($.pixelDensityRatio);
- }
- tiledImage._drawer._clear(true, bounds);
- }
-
- // When scaling, we must rotate only when blending the sketch canvas to avoid
- // interpolation
- if (tiledImage.viewport.degrees !== 0 && !sketchScale) {
- tiledImage._drawer._offsetForRotation(tiledImage.viewport.degrees, useSketch);
- }
-
- var usedClip = false;
- if ( tiledImage._clip ) {
- tiledImage._drawer.saveContext(useSketch);
-
- var box = tiledImage.imageToViewportRectangle(tiledImage._clip, true);
- var clipRect = tiledImage._drawer.viewportToDrawerRectangle(box);
- if (sketchScale) {
- clipRect = clipRect.times(sketchScale);
- }
- if (sketchTranslate) {
- clipRect = clipRect.translate(sketchTranslate);
- }
- tiledImage._drawer.setClip(clipRect, useSketch);
-
- usedClip = true;
- }
-
- if ( tiledImage.placeholderFillStyle && tiledImage._hasOpaqueTile === false ) {
- var placeholderRect = tiledImage._drawer.viewportToDrawerRectangle(tiledImage.getBounds(true));
- if (sketchScale) {
- placeholderRect = placeholderRect.times(sketchScale);
- }
- if (sketchTranslate) {
- placeholderRect = placeholderRect.translate(sketchTranslate);
- }
-
- var fillStyle = null;
- if ( typeof tiledImage.placeholderFillStyle === "function" ) {
- fillStyle = tiledImage.placeholderFillStyle(tiledImage, tiledImage._drawer.context);
- }
- else {
- fillStyle = tiledImage.placeholderFillStyle;
- }
-
- tiledImage._drawer.drawRectangle(placeholderRect, fillStyle, useSketch);
- }
-
- for (var i = lastDrawn.length - 1; i >= 0; i--) {
- tile = lastDrawn[ i ];
- tiledImage._drawer.drawTile( tile, tiledImage._drawingHandler, useSketch, sketchScale, sketchTranslate );
- tile.beingDrawn = true;
-
- if( tiledImage.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.TiledImage} tiledImage - Which TiledImage is being drawn.
- * @property {OpenSeadragon.Tile} tile
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- tiledImage.viewer.raiseEvent( 'tile-drawn', {
- tiledImage: tiledImage,
- tile: tile
- });
- }
- }
-
- if ( usedClip ) {
- tiledImage._drawer.restoreContext( useSketch );
- }
-
- if (tiledImage.viewport.degrees !== 0 && !sketchScale) {
- tiledImage._drawer._restoreRotationChanges(useSketch);
- }
-
- if (useSketch) {
- var offsetForRotation = tiledImage.viewport.degrees !== 0 && sketchScale;
- if (offsetForRotation) {
- tiledImage._drawer._offsetForRotation(tiledImage.viewport.degrees, false);
- }
- tiledImage._drawer.blendSketch({
- opacity: tiledImage.opacity,
- scale: sketchScale,
- translate: sketchTranslate,
- compositeOperation: tiledImage.compositeOperation,
- bounds: bounds
- });
- if (offsetForRotation) {
- tiledImage._drawer._restoreRotationChanges(false);
- }
- }
- drawDebugInfo( tiledImage, lastDrawn );
-}
-
-function drawDebugInfo( tiledImage, lastDrawn ) {
- if( tiledImage.debugMode ) {
- for ( var i = lastDrawn.length - 1; i >= 0; i-- ) {
- var tile = lastDrawn[ i ];
- try {
- tiledImage._drawer.drawDebugInfo( tile, lastDrawn.length, i );
- } catch(e) {
- $.console.error(e);
- }
- }
- }
-}
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - TileCache
- *
- * 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( $ ){
-
-// private class
-var TileRecord = function( options ) {
- $.console.assert( options, "[TileCache.cacheTile] options is required" );
- $.console.assert( options.tile, "[TileCache.cacheTile] options.tile is required" );
- $.console.assert( options.tiledImage, "[TileCache.cacheTile] options.tiledImage is required" );
- this.tile = options.tile;
- this.tiledImage = options.tiledImage;
-};
-
-// private class
-var ImageRecord = function(options) {
- $.console.assert( options, "[ImageRecord] options is required" );
- $.console.assert( options.image, "[ImageRecord] options.image is required" );
- this._image = options.image;
- this._tiles = [];
-};
-
-ImageRecord.prototype = {
- destroy: function() {
- this._image = null;
- this._renderedContext = null;
- this._tiles = null;
- },
-
- getImage: function() {
- return this._image;
- },
-
- getRenderedContext: function() {
- if (!this._renderedContext) {
- var canvas = document.createElement( 'canvas' );
- canvas.width = this._image.width;
- canvas.height = this._image.height;
- this._renderedContext = canvas.getContext('2d');
- this._renderedContext.drawImage( this._image, 0, 0 );
- //since we are caching the prerendered image on a canvas
- //allow the image to not be held in memory
- this._image = null;
- }
- return this._renderedContext;
- },
-
- setRenderedContext: function(renderedContext) {
- $.console.error("ImageRecord.setRenderedContext is deprecated. " +
- "The rendered context should be created by the ImageRecord " +
- "itself when calling ImageRecord.getRenderedContext.");
- this._renderedContext = renderedContext;
- },
-
- addTile: function(tile) {
- $.console.assert(tile, '[ImageRecord.addTile] tile is required');
- this._tiles.push(tile);
- },
-
- removeTile: function(tile) {
- for (var i = 0; i < this._tiles.length; i++) {
- if (this._tiles[i] === tile) {
- this._tiles.splice(i, 1);
- return;
- }
- }
-
- $.console.warn('[ImageRecord.removeTile] trying to remove unknown tile', tile);
- },
-
- getTileCount: function() {
- return this._tiles.length;
- }
-};
-
-/**
- * @class TileCache
- * @memberof OpenSeadragon
- * @classdesc Stores all the tiles displayed in a {@link OpenSeadragon.Viewer}.
- * You generally won't have to interact with the TileCache directly.
- * @param {Object} options - Configuration for this TileCache.
- * @param {Number} [options.maxImageCacheCount] - See maxImageCacheCount in
- * {@link OpenSeadragon.Options} for details.
- */
-$.TileCache = function( options ) {
- options = options || {};
-
- this._maxImageCacheCount = options.maxImageCacheCount || $.DEFAULT_SETTINGS.maxImageCacheCount;
- this._tilesLoaded = [];
- this._imagesLoaded = [];
- this._imagesLoadedCount = 0;
-};
-
-/** @lends OpenSeadragon.TileCache.prototype */
-$.TileCache.prototype = {
- /**
- * @returns {Number} The total number of tiles that have been loaded by
- * this TileCache.
- */
- numTilesLoaded: function() {
- return this._tilesLoaded.length;
- },
-
- /**
- * Caches the specified tile, removing an old tile if necessary to stay under the
- * maxImageCacheCount specified on construction. Note that if multiple tiles reference
- * the same image, there may be more tiles than maxImageCacheCount; the goal is to keep
- * the number of images below that number. Note, as well, that even the number of images
- * may temporarily surpass that number, but should eventually come back down to the max specified.
- * @param {Object} options - Tile info.
- * @param {OpenSeadragon.Tile} options.tile - The tile to cache.
- * @param {Image} options.image - The image of the tile to cache.
- * @param {OpenSeadragon.TiledImage} options.tiledImage - The TiledImage that owns that tile.
- * @param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this
- * function will release an old tile. The cutoff option specifies a tile level at or below which
- * tiles will not be released.
- */
- cacheTile: function( options ) {
- $.console.assert( options, "[TileCache.cacheTile] options is required" );
- $.console.assert( options.tile, "[TileCache.cacheTile] options.tile is required" );
- $.console.assert( options.tile.url, "[TileCache.cacheTile] options.tile.url is required" );
- $.console.assert( options.tiledImage, "[TileCache.cacheTile] options.tiledImage is required" );
-
- var cutoff = options.cutoff || 0;
- var insertionIndex = this._tilesLoaded.length;
-
- var imageRecord = this._imagesLoaded[options.tile.url];
- if (!imageRecord) {
- $.console.assert( options.image, "[TileCache.cacheTile] options.image is required to create an ImageRecord" );
- imageRecord = this._imagesLoaded[options.tile.url] = new ImageRecord({
- image: options.image
- });
-
- this._imagesLoadedCount++;
- }
-
- imageRecord.addTile(options.tile);
- options.tile.cacheImageRecord = imageRecord;
-
- // Note that just because we're unloading a tile doesn't necessarily mean
- // we're unloading an image. With repeated calls it should sort itself out, though.
- if ( this._imagesLoadedCount > this._maxImageCacheCount ) {
- var worstTile = null;
- var worstTileIndex = -1;
- var worstTileRecord = null;
- var prevTile, worstTime, worstLevel, prevTime, prevLevel, prevTileRecord;
-
- for ( var i = this._tilesLoaded.length - 1; i >= 0; i-- ) {
- prevTileRecord = this._tilesLoaded[ i ];
- prevTile = prevTileRecord.tile;
-
- if ( prevTile.level <= cutoff || prevTile.beingDrawn ) {
- continue;
- } else if ( !worstTile ) {
- worstTile = prevTile;
- worstTileIndex = i;
- worstTileRecord = prevTileRecord;
- continue;
- }
-
- prevTime = prevTile.lastTouchTime;
- worstTime = worstTile.lastTouchTime;
- prevLevel = prevTile.level;
- worstLevel = worstTile.level;
-
- if ( prevTime < worstTime ||
- ( prevTime == worstTime && prevLevel > worstLevel ) ) {
- worstTile = prevTile;
- worstTileIndex = i;
- worstTileRecord = prevTileRecord;
- }
- }
-
- if ( worstTile && worstTileIndex >= 0 ) {
- this._unloadTile(worstTileRecord);
- insertionIndex = worstTileIndex;
- }
- }
-
- this._tilesLoaded[ insertionIndex ] = new TileRecord({
- tile: options.tile,
- tiledImage: options.tiledImage
- });
- },
-
- /**
- * Clears all tiles associated with the specified tiledImage.
- * @param {OpenSeadragon.TiledImage} tiledImage
- */
- clearTilesFor: function( tiledImage ) {
- $.console.assert(tiledImage, '[TileCache.clearTilesFor] tiledImage is required');
- var tileRecord;
- for ( var i = 0; i < this._tilesLoaded.length; ++i ) {
- tileRecord = this._tilesLoaded[ i ];
- if ( tileRecord.tiledImage === tiledImage ) {
- this._unloadTile(tileRecord);
- this._tilesLoaded.splice( i, 1 );
- i--;
- }
- }
- },
-
- // private
- getImageRecord: function(url) {
- $.console.assert(url, '[TileCache.getImageRecord] url is required');
- return this._imagesLoaded[url];
- },
-
- // private
- _unloadTile: function(tileRecord) {
- $.console.assert(tileRecord, '[TileCache._unloadTile] tileRecord is required');
- var tile = tileRecord.tile;
- var tiledImage = tileRecord.tiledImage;
-
- tile.unload();
- tile.cacheImageRecord = null;
-
- var imageRecord = this._imagesLoaded[tile.url];
- imageRecord.removeTile(tile);
- if (!imageRecord.getTileCount()) {
- imageRecord.destroy();
- delete this._imagesLoaded[tile.url];
- this._imagesLoadedCount--;
- }
-
- /**
- * Triggered when a tile has just been unloaded from memory.
- *
- * @event tile-unloaded
- * @memberof OpenSeadragon.Viewer
- * @type {object}
- * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the unloaded tile.
- * @property {OpenSeadragon.Tile} tile - The tile which has been unloaded.
- */
- tiledImage.viewer.raiseEvent("tile-unloaded", {
- tile: tile,
- tiledImage: tiledImage
- });
- }
-};
-
-}( OpenSeadragon ));
-
-/*
- * OpenSeadragon - World
- *
- * Copyright (C) 2009 CodePlex Foundation
- * Copyright (C) 2010-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 World
- * @memberof OpenSeadragon
- * @extends OpenSeadragon.EventSource
- * @classdesc Keeps track of all of the tiled images in the scene.
- * @param {Object} options - World options.
- * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this World.
- **/
-$.World = function( options ) {
- var _this = this;
-
- $.console.assert( options.viewer, "[World] options.viewer is required" );
-
- $.EventSource.call( this );
-
- this.viewer = options.viewer;
- this._items = [];
- this._needsDraw = false;
- this._autoRefigureSizes = true;
- this._needsSizesFigured = false;
- this._delegatedFigureSizes = function(event) {
- if (_this._autoRefigureSizes) {
- _this._figureSizes();
- } else {
- _this._needsSizesFigured = true;
- }
- };
-
- this._figureSizes();
-};
-
-$.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.World.prototype */{
- /**
- * Add the specified item.
- * @param {OpenSeadragon.TiledImage} item - The item to add.
- * @param {Number} [options.index] - Index for the item. If not specified, goes at the top.
- * @fires OpenSeadragon.World.event:add-item
- * @fires OpenSeadragon.World.event:metrics-change
- */
- addItem: function( item, options ) {
- $.console.assert(item, "[World.addItem] item is required");
- $.console.assert(item instanceof $.TiledImage, "[World.addItem] only TiledImages supported at this time");
-
- options = options || {};
- if (options.index !== undefined) {
- var index = Math.max(0, Math.min(this._items.length, options.index));
- this._items.splice(index, 0, item);
- } else {
- this._items.push( item );
- }
-
- if (this._autoRefigureSizes) {
- this._figureSizes();
- } else {
- this._needsSizesFigured = true;
- }
-
- this._needsDraw = true;
-
- item.addHandler('bounds-change', this._delegatedFigureSizes);
-
- /**
- * Raised when an item is added to the World.
- * @event add-item
- * @memberOf OpenSeadragon.World
- * @type {object}
- * @property {OpenSeadragon.Viewer} eventSource - A reference to the World which raised the event.
- * @property {OpenSeadragon.TiledImage} item - The item that has been added.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'add-item', {
- item: item
- } );
- },
-
- /**
- * Get the item at the specified index.
- * @param {Number} index - The item's index.
- * @returns {OpenSeadragon.TiledImage} The item at the specified index.
- */
- getItemAt: function( index ) {
- $.console.assert(index !== undefined, "[World.getItemAt] index is required");
- return this._items[ index ];
- },
-
- /**
- * Get the index of the given item or -1 if not present.
- * @param {OpenSeadragon.TiledImage} item - The item.
- * @returns {Number} The index of the item or -1 if not present.
- */
- getIndexOfItem: function( item ) {
- $.console.assert(item, "[World.getIndexOfItem] item is required");
- return $.indexOf( this._items, item );
- },
-
- /**
- * @returns {Number} The number of items used.
- */
- getItemCount: function() {
- return this._items.length;
- },
-
- /**
- * Change the index of a item so that it appears over or under others.
- * @param {OpenSeadragon.TiledImage} item - The item to move.
- * @param {Number} index - The new index.
- * @fires OpenSeadragon.World.event:item-index-change
- */
- setItemIndex: function( item, index ) {
- $.console.assert(item, "[World.setItemIndex] item is required");
- $.console.assert(index !== undefined, "[World.setItemIndex] index is required");
-
- var oldIndex = this.getIndexOfItem( item );
-
- if ( index >= this._items.length ) {
- throw new Error( "Index bigger than number of layers." );
- }
-
- if ( index === oldIndex || oldIndex === -1 ) {
- return;
- }
-
- this._items.splice( oldIndex, 1 );
- this._items.splice( index, 0, item );
- this._needsDraw = true;
-
- /**
- * Raised when the order of the indexes has been changed.
- * @event item-index-change
- * @memberOf OpenSeadragon.World
- * @type {object}
- * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.
- * @property {OpenSeadragon.TiledImage} item - The item whose index has
- * been changed
- * @property {Number} previousIndex - The previous index of the item
- * @property {Number} newIndex - The new index of the item
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'item-index-change', {
- item: item,
- previousIndex: oldIndex,
- newIndex: index
- } );
- },
-
- /**
- * Remove an item.
- * @param {OpenSeadragon.TiledImage} item - The item to remove.
- * @fires OpenSeadragon.World.event:remove-item
- * @fires OpenSeadragon.World.event:metrics-change
- */
- removeItem: function( item ) {
- $.console.assert(item, "[World.removeItem] item is required");
-
- var index = $.indexOf(this._items, item );
- if ( index === -1 ) {
- return;
- }
-
- item.removeHandler('bounds-change', this._delegatedFigureSizes);
- item.destroy();
- this._items.splice( index, 1 );
- this._figureSizes();
- this._needsDraw = true;
- this._raiseRemoveItem(item);
- },
-
- /**
- * Remove all items.
- * @fires OpenSeadragon.World.event:remove-item
- * @fires OpenSeadragon.World.event:metrics-change
- */
- removeAll: function() {
- // We need to make sure any pending images are canceled so the world items don't get messed up
- this.viewer._cancelPendingImages();
- var item;
- for (var i = 0; i < this._items.length; i++) {
- item = this._items[i];
- item.removeHandler('bounds-change', this._delegatedFigureSizes);
- item.destroy();
- }
-
- var removedItems = this._items;
- this._items = [];
- this._figureSizes();
- this._needsDraw = true;
-
- for (i = 0; i < removedItems.length; i++) {
- item = removedItems[i];
- this._raiseRemoveItem(item);
- }
- },
-
- /**
- * Clears all tiles and triggers updates for all items.
- */
- resetItems: function() {
- for ( var i = 0; i < this._items.length; i++ ) {
- this._items[i].reset();
- }
- },
-
- /**
- * Updates (i.e. animates bounds of) all items.
- */
- update: function() {
- var animated = false;
- for ( var i = 0; i < this._items.length; i++ ) {
- animated = this._items[i].update() || animated;
- }
-
- return animated;
- },
-
- /**
- * Draws all items.
- */
- draw: function() {
- for ( var i = 0; i < this._items.length; i++ ) {
- this._items[i].draw();
- }
-
- this._needsDraw = false;
- },
-
- /**
- * @returns {Boolean} true if any items need updating.
- */
- needsDraw: function() {
- for ( var i = 0; i < this._items.length; i++ ) {
- if ( this._items[i].needsDraw() ) {
- return true;
- }
- }
- return this._needsDraw;
- },
-
- /**
- * @returns {OpenSeadragon.Rect} The smallest rectangle that encloses all items, in viewport coordinates.
- */
- getHomeBounds: function() {
- return this._homeBounds.clone();
- },
-
- /**
- * To facilitate zoom constraints, we keep track of the pixel density of the
- * densest item in the World (i.e. the item whose content size to viewport size
- * ratio is the highest) and save it as this "content factor".
- * @returns {Number} the number of content units per viewport unit.
- */
- getContentFactor: function() {
- return this._contentFactor;
- },
-
- /**
- * As a performance optimization, setting this flag to false allows the bounds-change event handler
- * on tiledImages to skip calculations on the world bounds. If a lot of images are going to be positioned in
- * rapid succession, this is a good idea. When finished, setAutoRefigureSizes should be called with true
- * or the system may behave oddly.
- * @param {Boolean} [value] The value to which to set the flag.
- */
- setAutoRefigureSizes: function(value) {
- this._autoRefigureSizes = value;
- if (value & this._needsSizesFigured) {
- this._figureSizes();
- this._needsSizesFigured = false;
- }
- },
-
- /**
- * Arranges all of the TiledImages with the specified settings.
- * @param {Object} options - Specifies how to arrange.
- * @param {Boolean} [options.immediately=false] - Whether to animate to the new arrangement.
- * @param {String} [options.layout] - See collectionLayout in {@link OpenSeadragon.Options}.
- * @param {Number} [options.rows] - See collectionRows in {@link OpenSeadragon.Options}.
- * @param {Number} [options.columns] - See collectionColumns in {@link OpenSeadragon.Options}.
- * @param {Number} [options.tileSize] - See collectionTileSize in {@link OpenSeadragon.Options}.
- * @param {Number} [options.tileMargin] - See collectionTileMargin in {@link OpenSeadragon.Options}.
- * @fires OpenSeadragon.World.event:metrics-change
- */
- arrange: function(options) {
- options = options || {};
- var immediately = options.immediately || false;
- var layout = options.layout || $.DEFAULT_SETTINGS.collectionLayout;
- var rows = options.rows || $.DEFAULT_SETTINGS.collectionRows;
- var columns = options.columns || $.DEFAULT_SETTINGS.collectionColumns;
- var tileSize = options.tileSize || $.DEFAULT_SETTINGS.collectionTileSize;
- var tileMargin = options.tileMargin || $.DEFAULT_SETTINGS.collectionTileMargin;
- var increment = tileSize + tileMargin;
- var wrap;
- if (!options.rows && columns) {
- wrap = columns;
- } else {
- wrap = Math.ceil(this._items.length / rows);
- }
- var x = 0;
- var y = 0;
- var item, box, width, height, position;
-
- this.setAutoRefigureSizes(false);
- for (var i = 0; i < this._items.length; i++) {
- if (i && (i % wrap) === 0) {
- if (layout === 'horizontal') {
- y += increment;
- x = 0;
- } else {
- x += increment;
- y = 0;
- }
- }
-
- item = this._items[i];
- box = item.getBounds();
- if (box.width > box.height) {
- width = tileSize;
- } else {
- width = tileSize * (box.width / box.height);
- }
-
- height = width * (box.height / box.width);
- position = new $.Point(x + ((tileSize - width) / 2),
- y + ((tileSize - height) / 2));
-
- item.setPosition(position, immediately);
- item.setWidth(width, immediately);
-
- if (layout === 'horizontal') {
- x += increment;
- } else {
- y += increment;
- }
- }
- this.setAutoRefigureSizes(true);
- },
-
- // private
- _figureSizes: function() {
- var oldHomeBounds = this._homeBounds ? this._homeBounds.clone() : null;
- var oldContentSize = this._contentSize ? this._contentSize.clone() : null;
- var oldContentFactor = this._contentFactor || 0;
-
- if (!this._items.length) {
- this._homeBounds = new $.Rect(0, 0, 1, 1);
- this._contentSize = new $.Point(1, 1);
- this._contentFactor = 1;
- } else {
- var item = this._items[0];
- var bounds = item.getBounds();
- this._contentFactor = item.getContentSize().x / bounds.width;
- var clippedBounds = item.getClippedBounds();
- var left = clippedBounds.x;
- var top = clippedBounds.y;
- var right = clippedBounds.x + clippedBounds.width;
- var bottom = clippedBounds.y + clippedBounds.height;
- for (var i = 1; i < this._items.length; i++) {
- item = this._items[i];
- bounds = item.getBounds();
- this._contentFactor = Math.max(this._contentFactor,
- item.getContentSize().x / bounds.width);
- clippedBounds = item.getClippedBounds();
- left = Math.min(left, clippedBounds.x);
- top = Math.min(top, clippedBounds.y);
- right = Math.max(right, clippedBounds.x + clippedBounds.width);
- bottom = Math.max(bottom, clippedBounds.y + clippedBounds.height);
- }
-
- this._homeBounds = new $.Rect(left, top, right - left, bottom - top);
- this._contentSize = new $.Point(
- this._homeBounds.width * this._contentFactor,
- this._homeBounds.height * this._contentFactor);
- }
-
- if (this._contentFactor !== oldContentFactor ||
- !this._homeBounds.equals(oldHomeBounds) ||
- !this._contentSize.equals(oldContentSize)) {
- /**
- * Raised when the home bounds or content factor change.
- * @event metrics-change
- * @memberOf OpenSeadragon.World
- * @type {object}
- * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent('metrics-change', {});
- }
- },
-
- // private
- _raiseRemoveItem: function(item) {
- /**
- * Raised when an item is removed.
- * @event remove-item
- * @memberOf OpenSeadragon.World
- * @type {object}
- * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.
- * @property {OpenSeadragon.TiledImage} item - The item's underlying item.
- * @property {?Object} userData - Arbitrary subscriber-defined object.
- */
- this.raiseEvent( 'remove-item', { item: item } );
- }
-});
-
-}( OpenSeadragon ));
-
-//# sourceMappingURL=openseadragon.js.map
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.js.map b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.js.map
deleted file mode 100755
index 3c34149..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/openseadragon.js","../../src/fullscreen.js","../../src/eventsource.js","../../src/mousetracker.js","../../src/control.js","../../src/controldock.js","../../src/placement.js","../../src/viewer.js","../../src/navigator.js","../../src/strings.js","../../src/point.js","../../src/tilesource.js","../../src/dzitilesource.js","../../src/iiiftilesource.js","../../src/osmtilesource.js","../../src/tmstilesource.js","../../src/legacytilesource.js","../../src/imagetilesource.js","../../src/tilesourcecollection.js","../../src/button.js","../../src/buttongroup.js","../../src/rectangle.js","../../src/referencestrip.js","../../src/displayrectangle.js","../../src/spring.js","../../src/imageloader.js","../../src/tile.js","../../src/overlay.js","../../src/drawer.js","../../src/viewport.js","../../src/tiledimage.js","../../src/tilecache.js","../../src/world.js"],"names":[],"mappings":"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","file":"openseadragon.js","sourcesContent":["/*\n * OpenSeadragon\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Portions of this source file taken from jQuery:\n *\n * Copyright 2011 John Resig\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/*\n * Portions of this source file taken from mattsnider.com:\n *\n * Copyright (c) 2006-2013 Matt Snider\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included\n * in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT\n * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR\n * THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n\n/**\n * @namespace OpenSeadragon\n * @version openseadragon 2.2.1\n * @classdesc The root namespace for OpenSeadragon. All utility methods\n * and classes are defined on or below this namespace.\n *\n */\n\n\n// Typedefs\n\n /**\n * All required and optional settings for instantiating a new instance of an OpenSeadragon image viewer.\n *\n * @typedef {Object} Options\n * @memberof OpenSeadragon\n *\n * @property {String} id\n * Id of the element to append the viewer's container element to. If not provided, the 'element' property must be provided.\n * If both the element and id properties are specified, the viewer is appended to the element provided in the element property.\n *\n * @property {Element} element\n * The element to append the viewer's container element to. If not provided, the 'id' property must be provided.\n * If both the element and id properties are specified, the viewer is appended to the element provided in the element property.\n *\n * @property {Array|String|Function|Object} [tileSources=null]\n * Tile source(s) to open initially. This is a complex parameter; see\n * {@link OpenSeadragon.Viewer#open} for details.\n *\n * @property {Number} [tabIndex=0]\n * Tabbing order index to assign to the viewer element. Positive values are selected in increasing order. When tabIndex is 0\n * source order is used. A negative value omits the viewer from the tabbing order.\n *\n * @property {Array} overlays Array of objects defining permanent overlays of\n * the viewer. The overlays added via this option and later removed with\n * {@link OpenSeadragon.Viewer#removeOverlay} will be added back when a new\n * image is opened.\n * To add overlays which can be definitively removed, one must use\n * {@link OpenSeadragon.Viewer#addOverlay}\n * If displaying a sequence of images, the overlays can be associated\n * with a specific page by passing the overlays array to the page's\n * tile source configuration.\n * Expected properties:\n * * x, y, (or px, py for pixel coordinates) to define the location.\n * * width, height in point if using x,y or in pixels if using px,py. If width\n * and height are specified, the overlay size is adjusted when zooming,\n * otherwise the size stays the size of the content (or the size defined by CSS).\n * * className to associate a class to the overlay\n * * id to set the overlay element. If an element with this id already exists,\n * it is reused, otherwise it is created. If not specified, a new element is\n * created.\n * * placement a string to define the relative position to the viewport.\n * Only used if no width and height are specified. Default: 'TOP_LEFT'.\n * See {@link OpenSeadragon.Placement} for possible values.\n *\n * @property {String} [xmlPath=null]\n * <strong>DEPRECATED</strong>. A relative path to load a DZI file from the server.\n * Prefer the newer Options.tileSources.\n *\n * @property {String} [prefixUrl='/images/']\n * Prepends the prefixUrl to navImages paths, which is very useful\n * since the default paths are rarely useful for production\n * environments.\n *\n * @property {OpenSeadragon.NavImages} [navImages]\n * An object with a property for each button or other built-in navigation\n * control, eg the current 'zoomIn', 'zoomOut', 'home', and 'fullpage'.\n * Each of those in turn provides an image path for each state of the button\n * or navigation control, eg 'REST', 'GROUP', 'HOVER', 'PRESS'. Finally the\n * image paths, by default assume there is a folder on the servers root path\n * called '/images', eg '/images/zoomin_rest.png'. If you need to adjust\n * these paths, prefer setting the option.prefixUrl rather than overriding\n * every image path directly through this setting.\n *\n * @property {Boolean} [debugMode=false]\n * TODO: provide an in-screen panel providing event detail feedback.\n *\n * @property {String} [debugGridColor='#437AB2']\n *\n * @property {Number} [blendTime=0]\n * Specifies the duration of animation as higher or lower level tiles are\n * replacing the existing tile.\n *\n * @property {Boolean} [alwaysBlend=false]\n * Forces the tile to always blend. By default the tiles skip blending\n * when the blendTime is surpassed and the current animation frame would\n * not complete the blend.\n *\n * @property {Boolean} [autoHideControls=true]\n * If the user stops interacting with the viewport, fade the navigation\n * controls. Useful for presentation since the controls are by default\n * floated on top of the image the user is viewing.\n *\n * @property {Boolean} [immediateRender=false]\n * Render the best closest level first, ignoring the lowering levels which\n * provide the effect of very blurry to sharp. It is recommended to change\n * setting to true for mobile devices.\n *\n * @property {Number} [defaultZoomLevel=0]\n * Zoom level to use when image is first opened or the home button is clicked.\n * If 0, adjusts to fit viewer.\n *\n * @property {Number} [opacity=1]\n * Default opacity of the tiled images (1=opaque, 0=transparent)\n *\n * @property {String} [compositeOperation=null]\n * Valid values are 'source-over', 'source-atop', 'source-in', 'source-out',\n * 'destination-over', 'destination-atop', 'destination-in',\n * 'destination-out', 'lighter', 'copy' or 'xor'\n *\n * @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null]\n * Draws a colored rectangle behind the tile if it is not loaded yet.\n * You can pass a CSS color value like \"#FF8800\".\n * When passing a function the tiledImage and canvas context are available as argument which is useful when you draw a gradient or pattern.\n *\n * @property {Number} [degrees=0]\n * Initial rotation.\n *\n * @property {Number} [minZoomLevel=null]\n *\n * @property {Number} [maxZoomLevel=null]\n *\n * @property {Boolean} [homeFillsViewer=false]\n * Make the 'home' button fill the viewer and clip the image, instead\n * of fitting the image to the viewer and letterboxing.\n *\n * @property {Boolean} [panHorizontal=true]\n * Allow horizontal pan.\n *\n * @property {Boolean} [panVertical=true]\n * Allow vertical pan.\n *\n * @property {Boolean} [constrainDuringPan=false]\n *\n * @property {Boolean} [wrapHorizontal=false]\n * Set to true to force the image to wrap horizontally within the viewport.\n * Useful for maps or images representing the surface of a sphere or cylinder.\n *\n * @property {Boolean} [wrapVertical=false]\n * Set to true to force the image to wrap vertically within the viewport.\n * Useful for maps or images representing the surface of a sphere or cylinder.\n *\n * @property {Number} [minZoomImageRatio=0.9]\n * The minimum percentage ( expressed as a number between 0 and 1 ) of\n * the viewport height or width at which the zoom out will be constrained.\n * Setting it to 0, for example will allow you to zoom out infinity.\n *\n * @property {Number} [maxZoomPixelRatio=1.1]\n * The maximum ratio to allow a zoom-in to affect the highest level pixel\n * ratio. This can be set to Infinity to allow 'infinite' zooming into the\n * image though it is less effective visually if the HTML5 Canvas is not\n * availble on the viewing device.\n *\n * @property {Number} [smoothTileEdgesMinZoom=1.1]\n * A zoom percentage ( where 1 is 100% ) of the highest resolution level.\n * When zoomed in beyond this value alternative compositing will be used to\n * smooth out the edges between tiles. This will have a performance impact.\n * Can be set to Infinity to turn it off.\n * Note: This setting is ignored on iOS devices due to a known bug (See {@link https://github.com/openseadragon/openseadragon/issues/952})\n *\n * @property {Boolean} [iOSDevice=?]\n * True if running on an iOS device, false otherwise.\n * Used to disable certain features that behave differently on iOS devices.\n *\n * @property {Boolean} [autoResize=true]\n * Set to false to prevent polling for viewer size changes. Useful for providing custom resize behavior.\n *\n * @property {Boolean} [preserveImageSizeOnResize=false]\n * Set to true to have the image size preserved when the viewer is resized. This requires autoResize=true (default).\n *\n * @property {Number} [minScrollDeltaTime=50]\n * Number of milliseconds between canvas-scroll events. This value helps normalize the rate of canvas-scroll\n * events between different devices, causing the faster devices to slow down enough to make the zoom control\n * more manageable.\n *\n * @property {Number} [pixelsPerWheelLine=40]\n * For pixel-resolution scrolling devices, the number of pixels equal to one scroll line.\n *\n * @property {Number} [visibilityRatio=0.5]\n * The percentage ( as a number from 0 to 1 ) of the source image which\n * must be kept within the viewport. If the image is dragged beyond that\n * limit, it will 'bounce' back until the minimum visibility ratio is\n * achieved. Setting this to 0 and wrapHorizontal ( or wrapVertical ) to\n * true will provide the effect of an infinitely scrolling viewport.\n *\n * @property {Object} [viewportMargins={}]\n * Pushes the \"home\" region in from the sides by the specified amounts.\n * Possible subproperties (Numbers, in screen coordinates): left, top, right, bottom.\n *\n * @property {Number} [imageLoaderLimit=0]\n * The maximum number of image requests to make concurrently. By default\n * it is set to 0 allowing the browser to make the maximum number of\n * image requests in parallel as allowed by the browsers policy.\n *\n * @property {Number} [clickTimeThreshold=300]\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n *\n * @property {Number} [clickDistThreshold=5]\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n *\n * @property {Number} [dblClickTimeThreshold=300]\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n *\n * @property {Number} [dblClickDistThreshold=20]\n * The maximum distance allowed between two pointer click events\n * to be treated as a double-click gesture.\n *\n * @property {Number} [springStiffness=6.5]\n *\n * @property {Number} [animationTime=1.2]\n * Specifies the animation duration per each {@link OpenSeadragon.Spring}\n * which occur when the image is dragged or zoomed.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse]\n * Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsMouse.scrollToZoom=true] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsMouse.clickToZoom=true] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsMouse.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsMouse.pinchToZoom=false] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture\n * @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsMouse.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsTouch]\n * Settings for gestures generated by a touch pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsTouch.scrollToZoom=false] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsTouch.clickToZoom=false] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsTouch.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsTouch.pinchToZoom=true] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture\n * @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsTouch.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsPen]\n * Settings for gestures generated by a pen pointer device. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsPen.scrollToZoom=false] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsPen.clickToZoom=true] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture\n * @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsPen.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {OpenSeadragon.GestureSettings} [gestureSettingsUnknown]\n * Settings for gestures generated by unknown pointer devices. (See {@link OpenSeadragon.GestureSettings})\n * @property {Boolean} [gestureSettingsUnknown.scrollToZoom=true] - Zoom on scroll gesture\n * @property {Boolean} [gestureSettingsUnknown.clickToZoom=false] - Zoom on click gesture\n * @property {Boolean} [gestureSettingsUnknown.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n * @property {Boolean} [gestureSettingsUnknown.pinchToZoom=true] - Zoom on pinch gesture\n * @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture\n * @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)\n * @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture\n * @property {Boolean} [gestureSettingsUnknown.pinchRotate=false] - If pinchRotate is true, the user will have the ability to rotate the image using their fingers.\n *\n * @property {Number} [zoomPerClick=2.0]\n * The \"zoom distance\" per mouse click or touch tap. <em><strong>Note:</strong> Setting this to 1.0 effectively disables the click-to-zoom feature (also see gestureSettings[Mouse|Touch|Pen].clickToZoom/dblClickToZoom).</em>\n *\n * @property {Number} [zoomPerScroll=1.2]\n * 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 (also see gestureSettings[Mouse|Touch|Pen].scrollToZoom}).</em>\n *\n * @property {Number} [zoomPerSecond=1.0]\n * The number of seconds to animate a single zoom event over.\n *\n * @property {Boolean} [showNavigator=false]\n * Set to true to make the navigator minimap appear.\n *\n * @property {String} [navigatorId=navigator-GENERATED DATE]\n * The ID of a div to hold the navigator minimap.\n * If an ID is specified, the navigatorPosition, navigatorSizeRatio, navigatorMaintainSizeRatio, navigator[Top|Left|Height|Width] and navigatorAutoFade options will be ignored.\n * If an ID is not specified, a div element will be generated and placed on top of the main image.\n *\n * @property {String} [navigatorPosition='TOP_RIGHT']\n * Valid values are 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', 'BOTTOM_RIGHT', or 'ABSOLUTE'.<br>\n * If 'ABSOLUTE' is specified, then navigator[Top|Left|Height|Width] determines the size and position of the navigator minimap in the viewer, and navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.<br>\n * For 'TOP_LEFT', 'TOP_RIGHT', 'BOTTOM_LEFT', and 'BOTTOM_RIGHT', the navigatorSizeRatio or navigator[Height|Width] values determine the size of the navigator minimap.\n *\n * @property {Number} [navigatorSizeRatio=0.2]\n * Ratio of navigator size to viewer size. Ignored if navigator[Height|Width] are specified.\n *\n * @property {Boolean} [navigatorMaintainSizeRatio=false]\n * If true, the navigator minimap is resized (using navigatorSizeRatio) when the viewer size changes.\n *\n * @property {Number|String} [navigatorTop=null]\n * Specifies the location of the navigator minimap (see navigatorPosition).\n *\n * @property {Number|String} [navigatorLeft=null]\n * Specifies the location of the navigator minimap (see navigatorPosition).\n *\n * @property {Number|String} [navigatorHeight=null]\n * Specifies the size of the navigator minimap (see navigatorPosition).\n * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.\n *\n * @property {Number|String} [navigatorWidth=null]\n * Specifies the size of the navigator minimap (see navigatorPosition).\n * If specified, navigatorSizeRatio and navigatorMaintainSizeRatio are ignored.\n *\n * @property {Boolean} [navigatorAutoResize=true]\n * Set to false to prevent polling for navigator size changes. Useful for providing custom resize behavior.\n * Setting to false can also improve performance when the navigator is configured to a fixed size.\n *\n * @property {Boolean} [navigatorAutoFade=true]\n * If the user stops interacting with the viewport, fade the navigator minimap.\n * Setting to false will make the navigator minimap always visible.\n *\n * @property {Boolean} [navigatorRotate=true]\n * If true, the navigator will be rotated together with the viewer.\n *\n * @property {Number} [controlsFadeDelay=2000]\n * The number of milliseconds to wait once the user has stopped interacting\n * with the interface before begining to fade the controls. Assumes\n * showNavigationControl and autoHideControls are both true.\n *\n * @property {Number} [controlsFadeLength=1500]\n * The number of milliseconds to animate the controls fading out.\n *\n * @property {Number} [maxImageCacheCount=200]\n * The max number of images we should keep in memory (per drawer).\n *\n * @property {Number} [timeout=30000]\n *\n * @property {Boolean} [useCanvas=true]\n * Set to false to not use an HTML canvas element for image rendering even if canvas is supported.\n *\n * @property {Number} [minPixelRatio=0.5]\n * The higher the minPixelRatio, the lower the quality of the image that\n * is considered sufficient to stop rendering a given zoom level. For\n * example, if you are targeting mobile devices with less bandwith you may\n * try setting this to 1.5 or higher.\n *\n * @property {Boolean} [mouseNavEnabled=true]\n * Is the user able to interact with the image via mouse or touch. Default\n * interactions include draging the image in a plane, and zooming in toward\n * and away from the image.\n *\n * @property {Boolean} [showNavigationControl=true]\n * Set to false to prevent the appearance of the default navigation controls.<br>\n * Note that if set to false, the customs buttons set by the options\n * zoomInButton, zoomOutButton etc, are rendered inactive.\n *\n * @property {OpenSeadragon.ControlAnchor} [navigationControlAnchor=TOP_LEFT]\n * Placement of the default navigation controls.\n * To set the placement of the sequence controls, see the\n * sequenceControlAnchor option.\n *\n * @property {Boolean} [showZoomControl=true]\n * If true then + and - buttons to zoom in and out are displayed.<br>\n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showHomeControl=true]\n * If true then the 'Go home' button is displayed to go back to the original\n * zoom and pan.<br>\n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showFullPageControl=true]\n * If true then the 'Toggle full page' button is displayed to switch\n * between full page and normal mode.<br>\n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showRotationControl=false]\n * If true then the rotate left/right controls will be displayed as part of the\n * standard controls. This is also subject to the browser support for rotate\n * (e.g. viewer.drawer.canRotate()).<br>\n * Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding\n * this setting when set to false.\n *\n * @property {Boolean} [showSequenceControl=true]\n * If sequenceMode is true, then provide buttons for navigating forward and\n * backward through the images.\n *\n * @property {OpenSeadragon.ControlAnchor} [sequenceControlAnchor=TOP_LEFT]\n * Placement of the default sequence controls.\n *\n * @property {Boolean} [navPrevNextWrap=false]\n * If true then the 'previous' button will wrap to the last image when\n * viewing the first image and the 'next' button will wrap to the first\n * image when viewing the last image.\n *\n * @property {String} zoomInButton\n * Set the id of the custom 'Zoom in' button to use.\n * This is useful to have a custom button anywhere in the web page.<br>\n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} zoomOutButton\n * Set the id of the custom 'Zoom out' button to use.\n * This is useful to have a custom button anywhere in the web page.<br>\n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} homeButton\n * Set the id of the custom 'Go home' button to use.\n * This is useful to have a custom button anywhere in the web page.<br>\n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} fullPageButton\n * Set the id of the custom 'Toggle full page' button to use.\n * This is useful to have a custom button anywhere in the web page.<br>\n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} rotateLeftButton\n * Set the id of the custom 'Rotate left' button to use.\n * This is useful to have a custom button anywhere in the web page.<br>\n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} rotateRightButton\n * Set the id of the custom 'Rotate right' button to use.\n * This is useful to have a custom button anywhere in the web page.<br>\n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} previousButton\n * Set the id of the custom 'Previous page' button to use.\n * This is useful to have a custom button anywhere in the web page.<br>\n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {String} nextButton\n * Set the id of the custom 'Next page' button to use.\n * This is useful to have a custom button anywhere in the web page.<br>\n * To only change the button images, consider using\n * {@link OpenSeadragon.Options.navImages}\n *\n * @property {Boolean} [sequenceMode=false]\n * Set to true to have the viewer treat your tilesources as a sequence of images to\n * be opened one at a time rather than all at once.\n *\n * @property {Number} [initialPage=0]\n * If sequenceMode is true, display this page initially.\n *\n * @property {Boolean} [preserveViewport=false]\n * If sequenceMode is true, then normally navigating through each image resets the\n * viewport to 'home' position. If preserveViewport is set to true, then the viewport\n * position is preserved when navigating between images in the sequence.\n *\n * @property {Boolean} [preserveOverlays=false]\n * If sequenceMode is true, then normally navigating through each image\n * resets the overlays.\n * If preserveOverlays is set to true, then the overlays added with {@link OpenSeadragon.Viewer#addOverlay}\n * are preserved when navigating between images in the sequence.\n * Note: setting preserveOverlays overrides any overlays specified in the global\n * \"overlays\" option for the Viewer. It's also not compatible with specifying\n * per-tileSource overlays via the options, as those overlays will persist\n * even after the tileSource is closed.\n *\n * @property {Boolean} [showReferenceStrip=false]\n * If sequenceMode is true, then display a scrolling strip of image thumbnails for\n * navigating through the images.\n *\n * @property {String} [referenceStripScroll='horizontal']\n *\n * @property {Element} [referenceStripElement=null]\n *\n * @property {Number} [referenceStripHeight=null]\n *\n * @property {Number} [referenceStripWidth=null]\n *\n * @property {String} [referenceStripPosition='BOTTOM_LEFT']\n *\n * @property {Number} [referenceStripSizeRatio=0.2]\n *\n * @property {Boolean} [collectionMode=false]\n * Set to true to have the viewer arrange your TiledImages in a grid or line.\n *\n * @property {Number} [collectionRows=3]\n * If collectionMode is true, specifies how many rows the grid should have. Use 1 to make a line.\n * If collectionLayout is 'vertical', specifies how many columns instead.\n *\n * @property {Number} [collectionColumns=0]\n * If collectionMode is true, specifies how many columns the grid should have. Use 1 to make a line.\n * If collectionLayout is 'vertical', specifies how many rows instead. Ignored if collectionRows is not set to a falsy value.\n *\n * @property {String} [collectionLayout='horizontal']\n * If collectionMode is true, specifies whether to arrange vertically or horizontally.\n *\n * @property {Number} [collectionTileSize=800]\n * If collectionMode is true, specifies the size, in viewport coordinates, for each TiledImage to fit into.\n * The TiledImage will be centered within a square of the specified size.\n *\n * @property {Number} [collectionTileMargin=80]\n * If collectionMode is true, specifies the margin, in viewport coordinates, between each TiledImage.\n *\n * @property {String|Boolean} [crossOriginPolicy=false]\n * Valid values are 'Anonymous', 'use-credentials', and false. If false, canvas requests will\n * not use CORS, and the canvas will be tainted.\n *\n * @property {Boolean} [ajaxWithCredentials=false]\n * Whether to set the withCredentials XHR flag for AJAX requests (when loading tile sources).\n * Note that this can be overridden at the {@link OpenSeadragon.TileSource} level.\n *\n */\n\n /**\n * Settings for gestures generated by a pointer device.\n *\n * @typedef {Object} GestureSettings\n * @memberof OpenSeadragon\n *\n * @property {Boolean} scrollToZoom\n * Set to false to disable zooming on scroll gestures.\n *\n * @property {Boolean} clickToZoom\n * Set to false to disable zooming on click gestures.\n *\n * @property {Boolean} dblClickToZoom\n * Set to false to disable zooming on double-click gestures. Note: If set to true\n * then clickToZoom should be set to false to prevent multiple zooms.\n *\n * @property {Boolean} pinchToZoom\n * Set to false to disable zooming on pinch gestures.\n *\n * @property {Boolean} flickEnabled\n * Set to false to disable the kinetic panning effect (flick) at the end of a drag gesture.\n *\n * @property {Number} flickMinSpeed\n * If flickEnabled is true, the minimum speed (in pixels-per-second) required to cause the kinetic panning effect (flick) at the end of a drag gesture.\n *\n * @property {Number} flickMomentum\n * If flickEnabled is true, a constant multiplied by the velocity to determine the distance of the kinetic panning effect (flick) at the end of a drag gesture.\n * A larger value will make the flick feel \"lighter\", while a smaller value will make the flick feel \"heavier\".\n * Note: springStiffness and animationTime also affect the \"spring\" used to stop the flick animation.\n *\n */\n\n/**\n * The names for the image resources used for the image navigation buttons.\n *\n * @typedef {Object} NavImages\n * @memberof OpenSeadragon\n *\n * @property {Object} zoomIn - Images for the zoom-in button.\n * @property {String} zoomIn.REST\n * @property {String} zoomIn.GROUP\n * @property {String} zoomIn.HOVER\n * @property {String} zoomIn.DOWN\n *\n * @property {Object} zoomOut - Images for the zoom-out button.\n * @property {String} zoomOut.REST\n * @property {String} zoomOut.GROUP\n * @property {String} zoomOut.HOVER\n * @property {String} zoomOut.DOWN\n *\n * @property {Object} home - Images for the home button.\n * @property {String} home.REST\n * @property {String} home.GROUP\n * @property {String} home.HOVER\n * @property {String} home.DOWN\n *\n * @property {Object} fullpage - Images for the full-page button.\n * @property {String} fullpage.REST\n * @property {String} fullpage.GROUP\n * @property {String} fullpage.HOVER\n * @property {String} fullpage.DOWN\n *\n * @property {Object} rotateleft - Images for the rotate left button.\n * @property {String} rotateleft.REST\n * @property {String} rotateleft.GROUP\n * @property {String} rotateleft.HOVER\n * @property {String} rotateleft.DOWN\n *\n * @property {Object} rotateright - Images for the rotate right button.\n * @property {String} rotateright.REST\n * @property {String} rotateright.GROUP\n * @property {String} rotateright.HOVER\n * @property {String} rotateright.DOWN\n *\n * @property {Object} previous - Images for the previous button.\n * @property {String} previous.REST\n * @property {String} previous.GROUP\n * @property {String} previous.HOVER\n * @property {String} previous.DOWN\n *\n * @property {Object} next - Images for the next button.\n * @property {String} next.REST\n * @property {String} next.GROUP\n * @property {String} next.HOVER\n * @property {String} next.DOWN\n *\n */\n\n\n /**\n * This function serves as a single point of instantiation for an {@link OpenSeadragon.Viewer}, including all\n * combinations of out-of-the-box configurable features.\n *\n * @param {OpenSeadragon.Options} options - Viewer options.\n * @returns {OpenSeadragon.Viewer}\n */\nwindow.OpenSeadragon = window.OpenSeadragon || function( options ){\n\n return new OpenSeadragon.Viewer( options );\n\n};\n\nif (typeof define === 'function' && define.amd) {\n define(function () {\n return (window.OpenSeadragon);\n });\n}\n\n\n(function( $ ){\n\n\n /**\n * The OpenSeadragon version.\n *\n * @member {Object} OpenSeadragon.version\n * @property {String} versionStr - The version number as a string ('major.minor.revision').\n * @property {Number} major - The major version number.\n * @property {Number} minor - The minor version number.\n * @property {Number} revision - The revision number.\n * @since 1.0.0\n */\n $.version = {\n versionStr: '2.2.1',\n major: parseInt('2', 10),\n minor: parseInt('2', 10),\n revision: parseInt('1', 10)\n };\n\n\n /**\n * Taken from jquery 1.6.1\n * [[Class]] -> type pairs\n * @private\n */\n var class2type = {\n '[object Boolean]': 'boolean',\n '[object Number]': 'number',\n '[object String]': 'string',\n '[object Function]': 'function',\n '[object Array]': 'array',\n '[object Date]': 'date',\n '[object RegExp]': 'regexp',\n '[object Object]': 'object'\n },\n // Save a reference to some core methods\n toString = Object.prototype.toString,\n hasOwn = Object.prototype.hasOwnProperty;\n\n /**\n * Taken from jQuery 1.6.1\n * @function isFunction\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isFunction = function( obj ) {\n return $.type(obj) === \"function\";\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function isArray\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isArray = Array.isArray || function( obj ) {\n return $.type(obj) === \"array\";\n };\n\n\n /**\n * A crude way of determining if an object is a window.\n * Taken from jQuery 1.6.1\n * @function isWindow\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isWindow = function( obj ) {\n return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function type\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.type = function( obj ) {\n return ( obj === null ) || ( obj === undefined ) ?\n String( obj ) :\n class2type[ toString.call(obj) ] || \"object\";\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function isPlainObject\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isPlainObject = function( obj ) {\n // Must be an Object.\n // Because of IE, we also have to check the presence of the constructor property.\n // Make sure that DOM nodes and window objects don't pass through, as well\n if ( !obj || OpenSeadragon.type(obj) !== \"object\" || obj.nodeType || $.isWindow( obj ) ) {\n return false;\n }\n\n // Not own constructor property must be Object\n if ( obj.constructor &&\n !hasOwn.call(obj, \"constructor\") &&\n !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n return false;\n }\n\n // Own properties are enumerated firstly, so to speed up,\n // if last one is own, then all properties are own.\n\n var lastKey;\n for (var key in obj ) {\n lastKey = key;\n }\n\n return lastKey === undefined || hasOwn.call( obj, lastKey );\n };\n\n\n /**\n * Taken from jQuery 1.6.1\n * @function isEmptyObject\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.isEmptyObject = function( obj ) {\n for ( var name in obj ) {\n return false;\n }\n return true;\n };\n\n /**\n * Shim around Object.freeze. Does nothing if Object.freeze is not supported.\n * @param {Object} obj The object to freeze.\n * @return {Object} obj The frozen object.\n */\n $.freezeObject = function(obj) {\n if (Object.freeze) {\n $.freezeObject = Object.freeze;\n } else {\n $.freezeObject = function(obj) {\n return obj;\n };\n }\n return $.freezeObject(obj);\n };\n\n /**\n * True if the browser supports the HTML5 canvas element\n * @member {Boolean} supportsCanvas\n * @memberof OpenSeadragon\n */\n $.supportsCanvas = (function () {\n var canvasElement = document.createElement( 'canvas' );\n return !!( $.isFunction( canvasElement.getContext ) &&\n canvasElement.getContext( '2d' ) );\n }());\n\n /**\n * Test whether the submitted canvas is tainted or not.\n * @argument {Canvas} canvas The canvas to test.\n * @returns {Boolean} True if the canvas is tainted.\n */\n $.isCanvasTainted = function(canvas) {\n var isTainted = false;\n try {\n // We test if the canvas is tainted by retrieving data from it.\n // An exception will be raised if the canvas is tainted.\n var data = canvas.getContext('2d').getImageData(0, 0, 1, 1);\n } catch (e) {\n isTainted = true;\n }\n return isTainted;\n };\n\n /**\n * A ratio comparing the device screen's pixel density to the canvas's backing store pixel density. Defaults to 1 if canvas isn't supported by the browser.\n * @member {Number} pixelDensityRatio\n * @memberof OpenSeadragon\n */\n $.pixelDensityRatio = (function () {\n if ( $.supportsCanvas ) {\n var context = document.createElement('canvas').getContext('2d');\n var devicePixelRatio = window.devicePixelRatio || 1;\n var backingStoreRatio = context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n return devicePixelRatio / backingStoreRatio;\n } else {\n return 1;\n }\n }());\n\n}( OpenSeadragon ));\n\n/**\n * This closure defines all static methods available to the OpenSeadragon\n * namespace. Many, if not most, are taked directly from jQuery for use\n * to simplify and reduce common programming patterns. More static methods\n * from jQuery may eventually make their way into this though we are\n * attempting to avoid an explicit dependency on jQuery only because\n * OpenSeadragon is a broadly useful code base and would be made less broad\n * by requiring jQuery fully.\n *\n * Some static methods have also been refactored from the original OpenSeadragon\n * project.\n */\n(function( $ ){\n\n /**\n * Taken from jQuery 1.6.1\n * @function extend\n * @memberof OpenSeadragon\n * @see {@link http://www.jquery.com/ jQuery}\n */\n $.extend = function() {\n var options,\n name,\n src,\n copy,\n copyIsArray,\n clone,\n target = arguments[ 0 ] || {},\n length = arguments.length,\n deep = false,\n i = 1;\n\n // Handle a deep copy situation\n if ( typeof target === \"boolean\" ) {\n deep = target;\n target = arguments[ 1 ] || {};\n // skip the boolean and the target\n i = 2;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if ( typeof target !== \"object\" && !OpenSeadragon.isFunction( target ) ) {\n target = {};\n }\n\n // extend jQuery itself if only one argument is passed\n if ( length === i ) {\n target = this;\n --i;\n }\n\n for ( ; i < length; i++ ) {\n // Only deal with non-null/undefined values\n options = arguments[ i ];\n if ( options !== null || options !== undefined ) {\n // Extend the base object\n for ( name in options ) {\n src = target[ name ];\n copy = options[ name ];\n\n // Prevent never-ending loop\n if ( target === copy ) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if ( deep && copy && ( OpenSeadragon.isPlainObject( copy ) || ( copyIsArray = OpenSeadragon.isArray( copy ) ) ) ) {\n if ( copyIsArray ) {\n copyIsArray = false;\n clone = src && OpenSeadragon.isArray( src ) ? src : [];\n\n } else {\n clone = src && OpenSeadragon.isPlainObject( src ) ? src : {};\n }\n\n // Never move original objects, clone them\n target[ name ] = OpenSeadragon.extend( deep, clone, copy );\n\n // Don't bring in undefined values\n } else if ( copy !== undefined ) {\n target[ name ] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n\n var isIOSDevice = function () {\n if (typeof navigator !== 'object') {\n return false;\n }\n var userAgent = navigator.userAgent;\n if (typeof userAgent !== 'string') {\n return false;\n }\n return userAgent.indexOf('iPhone') !== -1 ||\n userAgent.indexOf('iPad') !== -1 ||\n userAgent.indexOf('iPod') !== -1;\n };\n\n $.extend( $, /** @lends OpenSeadragon */{\n /**\n * The default values for the optional settings documented at {@link OpenSeadragon.Options}.\n * @static\n * @type {Object}\n */\n DEFAULT_SETTINGS: {\n //DATA SOURCE DETAILS\n xmlPath: null,\n tileSources: null,\n tileHost: null,\n initialPage: 0,\n crossOriginPolicy: false,\n ajaxWithCredentials: false,\n\n //PAN AND ZOOM SETTINGS AND CONSTRAINTS\n panHorizontal: true,\n panVertical: true,\n constrainDuringPan: false,\n wrapHorizontal: false,\n wrapVertical: false,\n visibilityRatio: 0.5, //-> how much of the viewer can be negative space\n minPixelRatio: 0.5, //->closer to 0 draws tiles meant for a higher zoom at this zoom\n defaultZoomLevel: 0,\n minZoomLevel: null,\n maxZoomLevel: null,\n homeFillsViewer: false,\n\n //UI RESPONSIVENESS AND FEEL\n clickTimeThreshold: 300,\n clickDistThreshold: 5,\n dblClickTimeThreshold: 300,\n dblClickDistThreshold: 20,\n springStiffness: 6.5,\n animationTime: 1.2,\n gestureSettingsMouse: { scrollToZoom: true, clickToZoom: true, dblClickToZoom: false, pinchToZoom: false, flickEnabled: false, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false },\n gestureSettingsTouch: { scrollToZoom: false, clickToZoom: false, dblClickToZoom: true, pinchToZoom: true, flickEnabled: true, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false },\n gestureSettingsPen: { scrollToZoom: false, clickToZoom: true, dblClickToZoom: false, pinchToZoom: false, flickEnabled: false, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false },\n gestureSettingsUnknown: { scrollToZoom: false, clickToZoom: false, dblClickToZoom: true, pinchToZoom: true, flickEnabled: true, flickMinSpeed: 120, flickMomentum: 0.25, pinchRotate: false },\n zoomPerClick: 2,\n zoomPerScroll: 1.2,\n zoomPerSecond: 1.0,\n blendTime: 0,\n alwaysBlend: false,\n autoHideControls: true,\n immediateRender: false,\n minZoomImageRatio: 0.9, //-> closer to 0 allows zoom out to infinity\n maxZoomPixelRatio: 1.1, //-> higher allows 'over zoom' into pixels\n smoothTileEdgesMinZoom: 1.1, //-> higher than maxZoomPixelRatio disables it\n iOSDevice: isIOSDevice(),\n pixelsPerWheelLine: 40,\n autoResize: true,\n preserveImageSizeOnResize: false, // requires autoResize=true\n minScrollDeltaTime: 50,\n\n //DEFAULT CONTROL SETTINGS\n showSequenceControl: true, //SEQUENCE\n sequenceControlAnchor: null, //SEQUENCE\n preserveViewport: false, //SEQUENCE\n preserveOverlays: false, //SEQUENCE\n navPrevNextWrap: false, //SEQUENCE\n showNavigationControl: true, //ZOOM/HOME/FULL/ROTATION\n navigationControlAnchor: null, //ZOOM/HOME/FULL/ROTATION\n showZoomControl: true, //ZOOM\n showHomeControl: true, //HOME\n showFullPageControl: true, //FULL\n showRotationControl: false, //ROTATION\n controlsFadeDelay: 2000, //ZOOM/HOME/FULL/SEQUENCE\n controlsFadeLength: 1500, //ZOOM/HOME/FULL/SEQUENCE\n mouseNavEnabled: true, //GENERAL MOUSE INTERACTIVITY\n\n //VIEWPORT NAVIGATOR SETTINGS\n showNavigator: false,\n navigatorId: null,\n navigatorPosition: null,\n navigatorSizeRatio: 0.2,\n navigatorMaintainSizeRatio: false,\n navigatorTop: null,\n navigatorLeft: null,\n navigatorHeight: null,\n navigatorWidth: null,\n navigatorAutoResize: true,\n navigatorAutoFade: true,\n navigatorRotate: true,\n\n // INITIAL ROTATION\n degrees: 0,\n\n // APPEARANCE\n opacity: 1,\n compositeOperation: null,\n placeholderFillStyle: null,\n\n //REFERENCE STRIP SETTINGS\n showReferenceStrip: false,\n referenceStripScroll: 'horizontal',\n referenceStripElement: null,\n referenceStripHeight: null,\n referenceStripWidth: null,\n referenceStripPosition: 'BOTTOM_LEFT',\n referenceStripSizeRatio: 0.2,\n\n //COLLECTION VISUALIZATION SETTINGS\n collectionRows: 3, //or columns depending on layout\n collectionColumns: 0, //columns in horizontal layout, rows in vertical layout\n collectionLayout: 'horizontal', //vertical\n collectionMode: false,\n collectionTileSize: 800,\n collectionTileMargin: 80,\n\n //PERFORMANCE SETTINGS\n imageLoaderLimit: 0,\n maxImageCacheCount: 200,\n timeout: 30000,\n useCanvas: true, // Use canvas element for drawing if available\n\n //INTERFACE RESOURCE SETTINGS\n prefixUrl: \"/images/\",\n navImages: {\n zoomIn: {\n REST: 'zoomin_rest.png',\n GROUP: 'zoomin_grouphover.png',\n HOVER: 'zoomin_hover.png',\n DOWN: 'zoomin_pressed.png'\n },\n zoomOut: {\n REST: 'zoomout_rest.png',\n GROUP: 'zoomout_grouphover.png',\n HOVER: 'zoomout_hover.png',\n DOWN: 'zoomout_pressed.png'\n },\n home: {\n REST: 'home_rest.png',\n GROUP: 'home_grouphover.png',\n HOVER: 'home_hover.png',\n DOWN: 'home_pressed.png'\n },\n fullpage: {\n REST: 'fullpage_rest.png',\n GROUP: 'fullpage_grouphover.png',\n HOVER: 'fullpage_hover.png',\n DOWN: 'fullpage_pressed.png'\n },\n rotateleft: {\n REST: 'rotateleft_rest.png',\n GROUP: 'rotateleft_grouphover.png',\n HOVER: 'rotateleft_hover.png',\n DOWN: 'rotateleft_pressed.png'\n },\n rotateright: {\n REST: 'rotateright_rest.png',\n GROUP: 'rotateright_grouphover.png',\n HOVER: 'rotateright_hover.png',\n DOWN: 'rotateright_pressed.png'\n },\n previous: {\n REST: 'previous_rest.png',\n GROUP: 'previous_grouphover.png',\n HOVER: 'previous_hover.png',\n DOWN: 'previous_pressed.png'\n },\n next: {\n REST: 'next_rest.png',\n GROUP: 'next_grouphover.png',\n HOVER: 'next_hover.png',\n DOWN: 'next_pressed.png'\n }\n },\n\n //DEVELOPER SETTINGS\n debugMode: false,\n debugGridColor: '#437AB2'\n },\n\n\n /**\n * TODO: get rid of this. I can't see how it's required at all. Looks\n * like an early legacy code artifact.\n * @static\n * @ignore\n */\n SIGNAL: \"----seadragon----\",\n\n\n /**\n * Returns a function which invokes the method as if it were a method belonging to the object.\n * @function\n * @param {Object} object\n * @param {Function} method\n * @returns {Function}\n */\n delegate: function( object, method ) {\n return function(){\n var args = arguments;\n if ( args === undefined ){\n args = [];\n }\n return method.apply( object, args );\n };\n },\n\n\n /**\n * An enumeration of Browser vendors.\n * @static\n * @type {Object}\n * @property {Number} UNKNOWN\n * @property {Number} IE\n * @property {Number} FIREFOX\n * @property {Number} SAFARI\n * @property {Number} CHROME\n * @property {Number} OPERA\n */\n BROWSERS: {\n UNKNOWN: 0,\n IE: 1,\n FIREFOX: 2,\n SAFARI: 3,\n CHROME: 4,\n OPERA: 5\n },\n\n\n /**\n * Returns a DOM Element for the given id or element.\n * @function\n * @param {String|Element} element Accepts an id or element.\n * @returns {Element} The element with the given id, null, or the element itself.\n */\n getElement: function( element ) {\n if ( typeof ( element ) == \"string\" ) {\n element = document.getElementById( element );\n }\n return element;\n },\n\n\n /**\n * Determines the position of the upper-left corner of the element.\n * @function\n * @param {Element|String} element - the elemenet we want the position for.\n * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element.\n */\n getElementPosition: function( element ) {\n var result = new $.Point(),\n isFixed,\n offsetParent;\n\n element = $.getElement( element );\n isFixed = $.getElementStyle( element ).position == \"fixed\";\n offsetParent = getOffsetParent( element, isFixed );\n\n while ( offsetParent ) {\n\n result.x += element.offsetLeft;\n result.y += element.offsetTop;\n\n if ( isFixed ) {\n result = result.plus( $.getPageScroll() );\n }\n\n element = offsetParent;\n isFixed = $.getElementStyle( element ).position == \"fixed\";\n offsetParent = getOffsetParent( element, isFixed );\n }\n\n return result;\n },\n\n\n /**\n * Determines the position of the upper-left corner of the element adjusted for current page and/or element scroll.\n * @function\n * @param {Element|String} element - the element we want the position for.\n * @returns {OpenSeadragon.Point} - the position of the upper left corner of the element adjusted for current page and/or element scroll.\n */\n getElementOffset: function( element ) {\n element = $.getElement( element );\n\n var doc = element && element.ownerDocument,\n docElement,\n win,\n boundingRect = { top: 0, left: 0 };\n\n if ( !doc ) {\n return new $.Point();\n }\n\n docElement = doc.documentElement;\n\n if ( typeof element.getBoundingClientRect !== typeof undefined ) {\n boundingRect = element.getBoundingClientRect();\n }\n\n win = ( doc == doc.window ) ?\n doc :\n ( doc.nodeType === 9 ) ?\n doc.defaultView || doc.parentWindow :\n false;\n\n return new $.Point(\n boundingRect.left + ( win.pageXOffset || docElement.scrollLeft ) - ( docElement.clientLeft || 0 ),\n boundingRect.top + ( win.pageYOffset || docElement.scrollTop ) - ( docElement.clientTop || 0 )\n );\n },\n\n\n /**\n * Determines the height and width of the given element.\n * @function\n * @param {Element|String} element\n * @returns {OpenSeadragon.Point}\n */\n getElementSize: function( element ) {\n element = $.getElement( element );\n\n return new $.Point(\n element.clientWidth,\n element.clientHeight\n );\n },\n\n\n /**\n * Returns the CSSStyle object for the given element.\n * @function\n * @param {Element|String} element\n * @returns {CSSStyle}\n */\n getElementStyle:\n document.documentElement.currentStyle ?\n function( element ) {\n element = $.getElement( element );\n return element.currentStyle;\n } :\n function( element ) {\n element = $.getElement( element );\n return window.getComputedStyle( element, \"\" );\n },\n\n /**\n * Returns the property with the correct vendor prefix appended.\n * @param {String} property the property name\n * @returns {String} the property with the correct prefix or null if not\n * supported.\n */\n getCssPropertyWithVendorPrefix: function(property) {\n var memo = {};\n\n $.getCssPropertyWithVendorPrefix = function(property) {\n if (memo[property] !== undefined) {\n return memo[property];\n }\n var style = document.createElement('div').style;\n var result = null;\n if (style[property] !== undefined) {\n result = property;\n } else {\n var prefixes = ['Webkit', 'Moz', 'MS', 'O',\n 'webkit', 'moz', 'ms', 'o'];\n var suffix = $.capitalizeFirstLetter(property);\n for (var i = 0; i < prefixes.length; i++) {\n var prop = prefixes[i] + suffix;\n if (style[prop] !== undefined) {\n result = prop;\n break;\n }\n }\n }\n memo[property] = result;\n return result;\n };\n return $.getCssPropertyWithVendorPrefix(property);\n },\n\n /**\n * Capitalizes the first letter of a string\n * @param {String} string\n * @returns {String} The string with the first letter capitalized\n */\n capitalizeFirstLetter: function(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n },\n\n /**\n * Determines if a point is within the bounding rectangle of the given element (hit-test).\n * @function\n * @param {Element|String} element\n * @param {OpenSeadragon.Point} point\n * @returns {Boolean}\n */\n pointInElement: function( element, point ) {\n element = $.getElement( element );\n var offset = $.getElementOffset( element ),\n size = $.getElementSize( element );\n return point.x >= offset.x && point.x < offset.x + size.x && point.y < offset.y + size.y && point.y >= offset.y;\n },\n\n\n /**\n * Gets the latest event, really only useful internally since its\n * specific to IE behavior.\n * @function\n * @param {Event} [event]\n * @returns {Event}\n * @deprecated For internal use only\n * @private\n */\n getEvent: function( event ) {\n if( event ){\n $.getEvent = function( event ) {\n return event;\n };\n } else {\n $.getEvent = function() {\n return window.event;\n };\n }\n return $.getEvent( event );\n },\n\n\n /**\n * Gets the position of the mouse on the screen for a given event.\n * @function\n * @param {Event} [event]\n * @returns {OpenSeadragon.Point}\n */\n getMousePosition: function( event ) {\n\n if ( typeof( event.pageX ) == \"number\" ) {\n $.getMousePosition = function( event ){\n var result = new $.Point();\n\n event = $.getEvent( event );\n result.x = event.pageX;\n result.y = event.pageY;\n\n return result;\n };\n } else if ( typeof( event.clientX ) == \"number\" ) {\n $.getMousePosition = function( event ){\n var result = new $.Point();\n\n event = $.getEvent( event );\n result.x =\n event.clientX +\n document.body.scrollLeft +\n document.documentElement.scrollLeft;\n result.y =\n event.clientY +\n document.body.scrollTop +\n document.documentElement.scrollTop;\n\n return result;\n };\n } else {\n throw new Error(\n \"Unknown event mouse position, no known technique.\"\n );\n }\n\n return $.getMousePosition( event );\n },\n\n\n /**\n * Determines the page's current scroll position.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n getPageScroll: function() {\n var docElement = document.documentElement || {},\n body = document.body || {};\n\n if ( typeof( window.pageXOffset ) == \"number\" ) {\n $.getPageScroll = function(){\n return new $.Point(\n window.pageXOffset,\n window.pageYOffset\n );\n };\n } else if ( body.scrollLeft || body.scrollTop ) {\n $.getPageScroll = function(){\n return new $.Point(\n document.body.scrollLeft,\n document.body.scrollTop\n );\n };\n } else if ( docElement.scrollLeft || docElement.scrollTop ) {\n $.getPageScroll = function(){\n return new $.Point(\n document.documentElement.scrollLeft,\n document.documentElement.scrollTop\n );\n };\n } else {\n // We can't reassign the function yet, as there was no scroll.\n return new $.Point(0,0);\n }\n\n return $.getPageScroll();\n },\n\n /**\n * Set the page scroll position.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n setPageScroll: function( scroll ) {\n if ( typeof ( window.scrollTo ) !== \"undefined\" ) {\n $.setPageScroll = function( scroll ) {\n window.scrollTo( scroll.x, scroll.y );\n };\n } else {\n var originalScroll = $.getPageScroll();\n if ( originalScroll.x === scroll.x &&\n originalScroll.y === scroll.y ) {\n // We are already correctly positioned and there\n // is no way to detect the correct method.\n return;\n }\n\n document.body.scrollLeft = scroll.x;\n document.body.scrollTop = scroll.y;\n var currentScroll = $.getPageScroll();\n if ( currentScroll.x !== originalScroll.x &&\n currentScroll.y !== originalScroll.y ) {\n $.setPageScroll = function( scroll ) {\n document.body.scrollLeft = scroll.x;\n document.body.scrollTop = scroll.y;\n };\n return;\n }\n\n document.documentElement.scrollLeft = scroll.x;\n document.documentElement.scrollTop = scroll.y;\n currentScroll = $.getPageScroll();\n if ( currentScroll.x !== originalScroll.x &&\n currentScroll.y !== originalScroll.y ) {\n $.setPageScroll = function( scroll ) {\n document.documentElement.scrollLeft = scroll.x;\n document.documentElement.scrollTop = scroll.y;\n };\n return;\n }\n\n // We can't find anything working, so we do nothing.\n $.setPageScroll = function( scroll ) {\n };\n }\n\n return $.setPageScroll( scroll );\n },\n\n /**\n * Determines the size of the browsers window.\n * @function\n * @returns {OpenSeadragon.Point}\n */\n getWindowSize: function() {\n var docElement = document.documentElement || {},\n body = document.body || {};\n\n if ( typeof( window.innerWidth ) == 'number' ) {\n $.getWindowSize = function(){\n return new $.Point(\n window.innerWidth,\n window.innerHeight\n );\n };\n } else if ( docElement.clientWidth || docElement.clientHeight ) {\n $.getWindowSize = function(){\n return new $.Point(\n document.documentElement.clientWidth,\n document.documentElement.clientHeight\n );\n };\n } else if ( body.clientWidth || body.clientHeight ) {\n $.getWindowSize = function(){\n return new $.Point(\n document.body.clientWidth,\n document.body.clientHeight\n );\n };\n } else {\n throw new Error(\"Unknown window size, no known technique.\");\n }\n\n return $.getWindowSize();\n },\n\n\n /**\n * Wraps the given element in a nest of divs so that the element can\n * be easily centered using CSS tables\n * @function\n * @param {Element|String} element\n * @returns {Element} outermost wrapper element\n */\n makeCenteredNode: function( element ) {\n // Convert a possible ID to an actual HTMLElement\n element = $.getElement( element );\n\n /*\n CSS tables require you to have a display:table/row/cell hierarchy so we need to create\n three nested wrapper divs:\n */\n\n var wrappers = [\n $.makeNeutralElement( 'div' ),\n $.makeNeutralElement( 'div' ),\n $.makeNeutralElement( 'div' )\n ];\n\n // It feels like we should be able to pass style dicts to makeNeutralElement:\n $.extend(wrappers[0].style, {\n display: \"table\",\n height: \"100%\",\n width: \"100%\"\n });\n\n $.extend(wrappers[1].style, {\n display: \"table-row\"\n });\n\n $.extend(wrappers[2].style, {\n display: \"table-cell\",\n verticalAlign: \"middle\",\n textAlign: \"center\"\n });\n\n wrappers[0].appendChild(wrappers[1]);\n wrappers[1].appendChild(wrappers[2]);\n wrappers[2].appendChild(element);\n\n return wrappers[0];\n },\n\n\n /**\n * Creates an easily positionable element of the given type that therefor\n * serves as an excellent container element.\n * @function\n * @param {String} tagName\n * @returns {Element}\n */\n makeNeutralElement: function( tagName ) {\n var element = document.createElement( tagName ),\n style = element.style;\n\n style.background = \"transparent none\";\n style.border = \"none\";\n style.margin = \"0px\";\n style.padding = \"0px\";\n style.position = \"static\";\n\n return element;\n },\n\n\n /**\n * Returns the current milliseconds, using Date.now() if available\n * @function\n */\n now: function( ) {\n if (Date.now) {\n $.now = Date.now;\n } else {\n $.now = function() { return new Date().getTime(); };\n }\n\n return $.now();\n },\n\n\n /**\n * Ensures an image is loaded correctly to support alpha transparency.\n * Generally only IE has issues doing this correctly for formats like\n * png.\n * @function\n * @param {String} src\n * @returns {Element}\n */\n makeTransparentImage: function( src ) {\n\n $.makeTransparentImage = function( src ){\n var img = $.makeNeutralElement( \"img\" );\n\n img.src = src;\n\n return img;\n };\n\n if ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 7 ) {\n\n $.makeTransparentImage = function( src ){\n var img = $.makeNeutralElement( \"img\" ),\n element = null;\n\n element = $.makeNeutralElement(\"span\");\n element.style.display = \"inline-block\";\n\n img.onload = function() {\n element.style.width = element.style.width || img.width + \"px\";\n element.style.height = element.style.height || img.height + \"px\";\n\n img.onload = null;\n img = null; // to prevent memory leaks in IE\n };\n\n img.src = src;\n element.style.filter =\n \"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='\" +\n src +\n \"', sizingMethod='scale')\";\n\n return element;\n };\n\n }\n\n return $.makeTransparentImage( src );\n },\n\n\n /**\n * Sets the opacity of the specified element.\n * @function\n * @param {Element|String} element\n * @param {Number} opacity\n * @param {Boolean} [usesAlpha]\n */\n setElementOpacity: function( element, opacity, usesAlpha ) {\n\n var ieOpacity,\n ieFilter;\n\n element = $.getElement( element );\n\n if ( usesAlpha && !$.Browser.alpha ) {\n opacity = Math.round( opacity );\n }\n\n if ( $.Browser.opacity ) {\n element.style.opacity = opacity < 1 ? opacity : \"\";\n } else {\n if ( opacity < 1 ) {\n ieOpacity = Math.round( 100 * opacity );\n ieFilter = \"alpha(opacity=\" + ieOpacity + \")\";\n element.style.filter = ieFilter;\n } else {\n element.style.filter = \"\";\n }\n }\n },\n\n\n /**\n * Sets the specified element's touch-action style attribute to 'none'.\n * @function\n * @param {Element|String} element\n */\n setElementTouchActionNone: function( element ) {\n element = $.getElement( element );\n if ( typeof element.style.touchAction !== 'undefined' ) {\n element.style.touchAction = 'none';\n } else if ( typeof element.style.msTouchAction !== 'undefined' ) {\n element.style.msTouchAction = 'none';\n }\n },\n\n\n /**\n * Add the specified CSS class to the element if not present.\n * @function\n * @param {Element|String} element\n * @param {String} className\n */\n addClass: function( element, className ) {\n element = $.getElement( element );\n\n if ( ! element.className ) {\n element.className = className;\n } else if ( ( ' ' + element.className + ' ' ).\n indexOf( ' ' + className + ' ' ) === -1 ) {\n element.className += ' ' + className;\n }\n },\n\n /**\n * Find the first index at which an element is found in an array or -1\n * if not present.\n *\n * Code taken and adapted from\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Compatibility\n *\n * @function\n * @param {Array} array The array from which to find the element\n * @param {Object} searchElement The element to find\n * @param {Number} [fromIndex=0] Index to start research.\n * @returns {Number} The index of the element in the array.\n */\n indexOf: function( array, searchElement, fromIndex ) {\n if ( Array.prototype.indexOf ) {\n this.indexOf = function( array, searchElement, fromIndex ) {\n return array.indexOf( searchElement, fromIndex );\n };\n } else {\n this.indexOf = function( array, searchElement, fromIndex ) {\n var i,\n pivot = ( fromIndex ) ? fromIndex : 0,\n length;\n if ( !array ) {\n throw new TypeError( );\n }\n\n length = array.length;\n if ( length === 0 || pivot >= length ) {\n return -1;\n }\n\n if ( pivot < 0 ) {\n pivot = length - Math.abs( pivot );\n }\n\n for ( i = pivot; i < length; i++ ) {\n if ( array[i] === searchElement ) {\n return i;\n }\n }\n return -1;\n };\n }\n return this.indexOf( array, searchElement, fromIndex );\n },\n\n /**\n * Remove the specified CSS class from the element.\n * @function\n * @param {Element|String} element\n * @param {String} className\n */\n removeClass: function( element, className ) {\n var oldClasses,\n newClasses = [],\n i;\n\n element = $.getElement( element );\n oldClasses = element.className.split( /\\s+/ );\n for ( i = 0; i < oldClasses.length; i++ ) {\n if ( oldClasses[ i ] && oldClasses[ i ] !== className ) {\n newClasses.push( oldClasses[ i ] );\n }\n }\n element.className = newClasses.join(' ');\n },\n\n\n /**\n * Adds an event listener for the given element, eventName and handler.\n * @function\n * @param {Element|String} element\n * @param {String} eventName\n * @param {Function} handler\n * @param {Boolean} [useCapture]\n */\n addEvent: (function () {\n if ( window.addEventListener ) {\n return function ( element, eventName, handler, useCapture ) {\n element = $.getElement( element );\n element.addEventListener( eventName, handler, useCapture );\n };\n } else if ( window.attachEvent ) {\n return function ( element, eventName, handler, useCapture ) {\n element = $.getElement( element );\n element.attachEvent( 'on' + eventName, handler );\n };\n } else {\n throw new Error( \"No known event model.\" );\n }\n }()),\n\n\n /**\n * Remove a given event listener for the given element, event type and\n * handler.\n * @function\n * @param {Element|String} element\n * @param {String} eventName\n * @param {Function} handler\n * @param {Boolean} [useCapture]\n */\n removeEvent: (function () {\n if ( window.removeEventListener ) {\n return function ( element, eventName, handler, useCapture ) {\n element = $.getElement( element );\n element.removeEventListener( eventName, handler, useCapture );\n };\n } else if ( window.detachEvent ) {\n return function( element, eventName, handler, useCapture ) {\n element = $.getElement( element );\n element.detachEvent( 'on' + eventName, handler );\n };\n } else {\n throw new Error( \"No known event model.\" );\n }\n }()),\n\n\n /**\n * Cancels the default browser behavior had the event propagated all\n * the way up the DOM to the window object.\n * @function\n * @param {Event} [event]\n */\n cancelEvent: function( event ) {\n event = $.getEvent( event );\n\n if ( event.preventDefault ) {\n $.cancelEvent = function( event ){\n // W3C for preventing default\n event.preventDefault();\n };\n } else {\n $.cancelEvent = function( event ){\n event = $.getEvent( event );\n // legacy for preventing default\n event.cancel = true;\n // IE for preventing default\n event.returnValue = false;\n };\n }\n $.cancelEvent( event );\n },\n\n\n /**\n * Stops the propagation of the event up the DOM.\n * @function\n * @param {Event} [event]\n */\n stopEvent: function( event ) {\n event = $.getEvent( event );\n\n if ( event.stopPropagation ) {\n // W3C for stopping propagation\n $.stopEvent = function( event ){\n event.stopPropagation();\n };\n } else {\n // IE for stopping propagation\n $.stopEvent = function( event ){\n event = $.getEvent( event );\n event.cancelBubble = true;\n };\n\n }\n\n $.stopEvent( event );\n },\n\n\n /**\n * Similar to OpenSeadragon.delegate, but it does not immediately call\n * the method on the object, returning a function which can be called\n * repeatedly to delegate the method. It also allows additonal arguments\n * to be passed during construction which will be added during each\n * invocation, and each invocation can add additional arguments as well.\n *\n * @function\n * @param {Object} object\n * @param {Function} method\n * @param [args] any additional arguments are passed as arguments to the\n * created callback\n * @returns {Function}\n */\n createCallback: function( object, method ) {\n //TODO: This pattern is painful to use and debug. It's much cleaner\n // to use pinning plus anonymous functions. Get rid of this\n // pattern!\n var initialArgs = [],\n i;\n for ( i = 2; i < arguments.length; i++ ) {\n initialArgs.push( arguments[ i ] );\n }\n\n return function() {\n var args = initialArgs.concat( [] ),\n i;\n for ( i = 0; i < arguments.length; i++ ) {\n args.push( arguments[ i ] );\n }\n\n return method.apply( object, args );\n };\n },\n\n\n /**\n * Retreives the value of a url parameter from the window.location string.\n * @function\n * @param {String} key\n * @returns {String} The value of the url parameter or null if no param matches.\n */\n getUrlParameter: function( key ) {\n var value = URLPARAMS[ key ];\n return value ? value : null;\n },\n\n /**\n * Retrieves the protocol used by the url. The url can either be absolute\n * or relative.\n * @function\n * @private\n * @param {String} url The url to retrieve the protocol from.\n * @return {String} The protocol (http:, https:, file:, ftp: ...)\n */\n getUrlProtocol: function( url ) {\n var match = url.match(/^([a-z]+:)\\/\\//i);\n if ( match === null ) {\n // Relative URL, retrive the protocol from window.location\n return window.location.protocol;\n }\n return match[1].toLowerCase();\n },\n\n /**\n * Create an XHR object\n * @private\n * @param {type} [local] If set to true, the XHR will be file: protocol\n * compatible if possible (but may raise a warning in the browser).\n * @returns {XMLHttpRequest}\n */\n createAjaxRequest: function( local ) {\n // IE11 does not support window.ActiveXObject so we just try to\n // create one to see if it is supported.\n // See: http://msdn.microsoft.com/en-us/library/ie/dn423948%28v=vs.85%29.aspx\n var supportActiveX;\n try {\n /* global ActiveXObject:true */\n supportActiveX = !!new ActiveXObject( \"Microsoft.XMLHTTP\" );\n } catch( e ) {\n supportActiveX = false;\n }\n\n if ( supportActiveX ) {\n if ( window.XMLHttpRequest ) {\n $.createAjaxRequest = function( local ) {\n if ( local ) {\n return new ActiveXObject( \"Microsoft.XMLHTTP\" );\n }\n return new XMLHttpRequest();\n };\n } else {\n $.createAjaxRequest = function() {\n return new ActiveXObject( \"Microsoft.XMLHTTP\" );\n };\n }\n } else if ( window.XMLHttpRequest ) {\n $.createAjaxRequest = function() {\n return new XMLHttpRequest();\n };\n } else {\n throw new Error( \"Browser doesn't support XMLHttpRequest.\" );\n }\n return $.createAjaxRequest( local );\n },\n\n /**\n * Makes an AJAX request.\n * @param {Object} options\n * @param {String} options.url - the url to request\n * @param {Function} options.success - a function to call on a successful response\n * @param {Function} options.error - a function to call on when an error occurs\n * @param {Boolean} [options.withCredentials=false] - whether to set the XHR's withCredentials\n * @throws {Error}\n */\n makeAjaxRequest: function( url, onSuccess, onError ) {\n var withCredentials;\n\n // Note that our preferred API is that you pass in a single object; the named\n // arguments are for legacy support.\n if( $.isPlainObject( url ) ){\n onSuccess = url.success;\n onError = url.error;\n withCredentials = url.withCredentials;\n url = url.url;\n }\n\n var protocol = $.getUrlProtocol( url );\n var request = $.createAjaxRequest( protocol === \"file:\" );\n\n if ( !$.isFunction( onSuccess ) ) {\n throw new Error( \"makeAjaxRequest requires a success callback\" );\n }\n\n request.onreadystatechange = function() {\n // 4 = DONE (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#Properties)\n if ( request.readyState == 4 ) {\n request.onreadystatechange = function(){};\n\n // With protocols other than http/https, the status is 200\n // on Firefox and 0 on other browsers\n if ( request.status === 200 ||\n ( request.status === 0 &&\n protocol !== \"http:\" &&\n protocol !== \"https:\" )) {\n onSuccess( request );\n } else {\n $.console.log( \"AJAX request returned %d: %s\", request.status, url );\n\n if ( $.isFunction( onError ) ) {\n onError( request );\n }\n }\n }\n };\n\n if (withCredentials) {\n request.withCredentials = true;\n }\n\n try {\n request.open( \"GET\", url, true );\n request.send( null );\n } catch (e) {\n var msg = e.message;\n\n /*\n IE < 10 does not support CORS and an XHR request to a different origin will fail as soon\n as send() is called. This is particularly easy to miss during development and appear in\n production if you use a CDN or domain sharding and the security policy is likely to break\n exception handlers since any attempt to access a property of the request object will\n raise an access denied TypeError inside the catch block.\n\n To be friendlier, we'll check for this specific error and add a documentation pointer\n to point developers in the right direction. We test the exception number because IE's\n error messages are localized.\n */\n var oldIE = $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 10;\n if ( oldIE && typeof( e.number ) != \"undefined\" && e.number == -2147024891 ) {\n msg += \"\\nSee http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx#xdomain\";\n }\n\n $.console.log( \"%s while making AJAX request: %s\", e.name, msg );\n\n request.onreadystatechange = function(){};\n\n if (window.XDomainRequest) { // IE9 or IE8 might as well try to use XDomainRequest\n var xdr = new XDomainRequest();\n if (xdr) {\n xdr.onload = function (e) {\n if ( $.isFunction( onSuccess ) ) {\n onSuccess({ // Faking an xhr object\n responseText: xdr.responseText,\n status: 200, // XDomainRequest doesn't support status codes, so we just fake one! :/\n statusText: 'OK'\n });\n }\n };\n xdr.onerror = function (e) {\n if ( $.isFunction ( onError ) ) {\n onError({ // Faking an xhr object\n responseText: xdr.responseText,\n status: 444, // 444 No Response\n statusText: 'An error happened. Due to an XDomainRequest deficiency we can not extract any information about this error. Upgrade your browser.'\n });\n }\n };\n try {\n xdr.open('GET', url);\n xdr.send();\n } catch (e2) {\n if ( $.isFunction( onError ) ) {\n onError( request, e );\n }\n }\n }\n } else {\n if ( $.isFunction( onError ) ) {\n onError( request, e );\n }\n }\n }\n },\n\n /**\n * Taken from jQuery 1.6.1\n * @function\n * @param {Object} options\n * @param {String} options.url\n * @param {Function} options.callback\n * @param {String} [options.param='callback'] The name of the url parameter\n * to request the jsonp provider with.\n * @param {String} [options.callbackName=] The name of the callback to\n * request the jsonp provider with.\n */\n jsonp: function( options ){\n var script,\n url = options.url,\n head = document.head ||\n document.getElementsByTagName( \"head\" )[ 0 ] ||\n document.documentElement,\n jsonpCallback = options.callbackName || 'openseadragon' + $.now(),\n previous = window[ jsonpCallback ],\n replace = \"$1\" + jsonpCallback + \"$2\",\n callbackParam = options.param || 'callback',\n callback = options.callback;\n\n url = url.replace( /(\\=)\\?(&|$)|\\?\\?/i, replace );\n // Add callback manually\n url += (/\\?/.test( url ) ? \"&\" : \"?\") + callbackParam + \"=\" + jsonpCallback;\n\n // Install callback\n window[ jsonpCallback ] = function( response ) {\n if ( !previous ){\n try{\n delete window[ jsonpCallback ];\n }catch(e){\n //swallow\n }\n } else {\n window[ jsonpCallback ] = previous;\n }\n if( callback && $.isFunction( callback ) ){\n callback( response );\n }\n };\n\n script = document.createElement( \"script\" );\n\n //TODO: having an issue with async info requests\n if( undefined !== options.async || false !== options.async ){\n script.async = \"async\";\n }\n\n if ( options.scriptCharset ) {\n script.charset = options.scriptCharset;\n }\n\n script.src = url;\n\n // Attach handlers for all browsers\n script.onload = script.onreadystatechange = function( _, isAbort ) {\n\n if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n\n // Remove the script\n if ( head && script.parentNode ) {\n head.removeChild( script );\n }\n\n // Dereference the script\n script = undefined;\n }\n };\n // Use insertBefore instead of appendChild to circumvent an IE6 bug.\n // This arises when a base node is used (#2709 and #4378).\n head.insertBefore( script, head.firstChild );\n\n },\n\n\n /**\n * Fully deprecated. Will throw an error.\n * @function\n * @deprecated use {@link OpenSeadragon.Viewer#open}\n */\n createFromDZI: function() {\n throw \"OpenSeadragon.createFromDZI is deprecated, use Viewer.open.\";\n },\n\n /**\n * Parses an XML string into a DOM Document.\n * @function\n * @param {String} string\n * @returns {Document}\n */\n parseXml: function( string ) {\n if ( window.DOMParser ) {\n\n $.parseXml = function( string ) {\n var xmlDoc = null,\n parser;\n\n parser = new DOMParser();\n xmlDoc = parser.parseFromString( string, \"text/xml\" );\n return xmlDoc;\n };\n\n } else if ( window.ActiveXObject ) {\n\n $.parseXml = function( string ) {\n var xmlDoc = null;\n\n xmlDoc = new ActiveXObject( \"Microsoft.XMLDOM\" );\n xmlDoc.async = false;\n xmlDoc.loadXML( string );\n return xmlDoc;\n };\n\n } else {\n throw new Error( \"Browser doesn't support XML DOM.\" );\n }\n\n return $.parseXml( string );\n },\n\n /**\n * Parses a JSON string into a Javascript object.\n * @function\n * @param {String} string\n * @returns {Object}\n */\n parseJSON: function(string) {\n if (window.JSON && window.JSON.parse) {\n $.parseJSON = window.JSON.parse;\n } else {\n // Should only be used by IE8 in non standards mode\n $.parseJSON = function(string) {\n /*jshint evil:true*/\n return eval('(' + string + ')');\n };\n }\n return $.parseJSON(string);\n },\n\n /**\n * Reports whether the image format is supported for tiling in this\n * version.\n * @function\n * @param {String} [extension]\n * @returns {Boolean}\n */\n imageFormatSupported: function( extension ) {\n extension = extension ? extension : \"\";\n return !!FILEFORMATS[ extension.toLowerCase() ];\n }\n\n });\n\n\n /**\n * The current browser vendor, version, and related information regarding detected features.\n * @member {Object} Browser\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {OpenSeadragon.BROWSERS} vendor - One of the {@link OpenSeadragon.BROWSERS} enumeration values.\n * @property {Number} version\n * @property {Boolean} alpha - Does the browser support image alpha transparency.\n */\n $.Browser = {\n vendor: $.BROWSERS.UNKNOWN,\n version: 0,\n alpha: true\n };\n\n\n var FILEFORMATS = {\n \"bmp\": false,\n \"jpeg\": true,\n \"jpg\": true,\n \"png\": true,\n \"tif\": false,\n \"wdp\": false\n },\n URLPARAMS = {};\n\n (function() {\n //A small auto-executing routine to determine the browser vendor,\n //version and supporting feature sets.\n var app = navigator.appName,\n ver = navigator.appVersion,\n ua = navigator.userAgent,\n regex;\n\n //console.error( 'appName: ' + navigator.appName );\n //console.error( 'appVersion: ' + navigator.appVersion );\n //console.error( 'userAgent: ' + navigator.userAgent );\n\n switch( navigator.appName ){\n case \"Microsoft Internet Explorer\":\n if( !!window.attachEvent &&\n !!window.ActiveXObject ) {\n\n $.Browser.vendor = $.BROWSERS.IE;\n $.Browser.version = parseFloat(\n ua.substring(\n ua.indexOf( \"MSIE\" ) + 5,\n ua.indexOf( \";\", ua.indexOf( \"MSIE\" ) ) )\n );\n }\n break;\n case \"Netscape\":\n if( !!window.addEventListener ){\n if ( ua.indexOf( \"Firefox\" ) >= 0 ) {\n $.Browser.vendor = $.BROWSERS.FIREFOX;\n $.Browser.version = parseFloat(\n ua.substring( ua.indexOf( \"Firefox\" ) + 8 )\n );\n } else if ( ua.indexOf( \"Safari\" ) >= 0 ) {\n $.Browser.vendor = ua.indexOf( \"Chrome\" ) >= 0 ?\n $.BROWSERS.CHROME :\n $.BROWSERS.SAFARI;\n $.Browser.version = parseFloat(\n ua.substring(\n ua.substring( 0, ua.indexOf( \"Safari\" ) ).lastIndexOf( \"/\" ) + 1,\n ua.indexOf( \"Safari\" )\n )\n );\n } else {\n regex = new RegExp( \"Trident/.*rv:([0-9]{1,}[.0-9]{0,})\");\n if ( regex.exec( ua ) !== null ) {\n $.Browser.vendor = $.BROWSERS.IE;\n $.Browser.version = parseFloat( RegExp.$1 );\n }\n }\n }\n break;\n case \"Opera\":\n $.Browser.vendor = $.BROWSERS.OPERA;\n $.Browser.version = parseFloat( ver );\n break;\n }\n\n // ignore '?' portion of query string\n var query = window.location.search.substring( 1 ),\n parts = query.split('&'),\n part,\n sep,\n i;\n\n for ( i = 0; i < parts.length; i++ ) {\n part = parts[ i ];\n sep = part.indexOf( '=' );\n\n if ( sep > 0 ) {\n URLPARAMS[ part.substring( 0, sep ) ] =\n decodeURIComponent( part.substring( sep + 1 ) );\n }\n }\n\n //determine if this browser supports image alpha transparency\n $.Browser.alpha = !(\n (\n $.Browser.vendor == $.BROWSERS.IE &&\n $.Browser.version < 9\n ) || (\n $.Browser.vendor == $.BROWSERS.CHROME &&\n $.Browser.version < 2\n )\n );\n\n //determine if this browser supports element.style.opacity\n $.Browser.opacity = !(\n $.Browser.vendor == $.BROWSERS.IE &&\n $.Browser.version < 9\n );\n\n })();\n\n\n //TODO: $.console is often used inside a try/catch block which generally\n // prevents allowings errors to occur with detection until a debugger\n // is attached. Although I've been guilty of the same anti-pattern\n // I eventually was convinced that errors should naturally propogate in\n // all but the most special cases.\n /**\n * A convenient alias for console when available, and a simple null\n * function when console is unavailable.\n * @static\n * @private\n */\n var nullfunction = function( msg ){\n //document.location.hash = msg;\n };\n\n $.console = window.console || {\n log: nullfunction,\n debug: nullfunction,\n info: nullfunction,\n warn: nullfunction,\n error: nullfunction,\n assert: nullfunction\n };\n\n\n // Adding support for HTML5's requestAnimationFrame as suggested by acdha.\n // Implementation taken from matt synder's post here:\n // http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation/\n (function( w ) {\n\n // most browsers have an implementation\n var requestAnimationFrame = w.requestAnimationFrame ||\n w.mozRequestAnimationFrame ||\n w.webkitRequestAnimationFrame ||\n w.msRequestAnimationFrame;\n\n var cancelAnimationFrame = w.cancelAnimationFrame ||\n w.mozCancelAnimationFrame ||\n w.webkitCancelAnimationFrame ||\n w.msCancelAnimationFrame;\n\n // polyfill, when necessary\n if ( requestAnimationFrame && cancelAnimationFrame ) {\n // We can't assign these window methods directly to $ because they\n // expect their \"this\" to be \"window\", so we call them in wrappers.\n $.requestAnimationFrame = function(){\n return requestAnimationFrame.apply( w, arguments );\n };\n $.cancelAnimationFrame = function(){\n return cancelAnimationFrame.apply( w, arguments );\n };\n } else {\n var aAnimQueue = [],\n processing = [],\n iRequestId = 0,\n iIntervalId;\n\n // create a mock requestAnimationFrame function\n $.requestAnimationFrame = function( callback ) {\n aAnimQueue.push( [ ++iRequestId, callback ] );\n\n if ( !iIntervalId ) {\n iIntervalId = setInterval( function() {\n if ( aAnimQueue.length ) {\n var time = $.now();\n // Process all of the currently outstanding frame\n // requests, but none that get added during the\n // processing.\n // Swap the arrays so we don't have to create a new\n // array every frame.\n var temp = processing;\n processing = aAnimQueue;\n aAnimQueue = temp;\n while ( processing.length ) {\n processing.shift()[ 1 ]( time );\n }\n } else {\n // don't continue the interval, if unnecessary\n clearInterval( iIntervalId );\n iIntervalId = undefined;\n }\n }, 1000 / 50); // estimating support for 50 frames per second\n }\n\n return iRequestId;\n };\n\n // create a mock cancelAnimationFrame function\n $.cancelAnimationFrame = function( requestId ) {\n // find the request ID and remove it\n var i, j;\n for ( i = 0, j = aAnimQueue.length; i < j; i += 1 ) {\n if ( aAnimQueue[ i ][ 0 ] === requestId ) {\n aAnimQueue.splice( i, 1 );\n return;\n }\n }\n\n // If it's not in the queue, it may be in the set we're currently\n // processing (if cancelAnimationFrame is called from within a\n // requestAnimationFrame callback).\n for ( i = 0, j = processing.length; i < j; i += 1 ) {\n if ( processing[ i ][ 0 ] === requestId ) {\n processing.splice( i, 1 );\n return;\n }\n }\n };\n }\n })( window );\n\n /**\n * @private\n * @inner\n * @function\n * @param {Element} element\n * @param {Boolean} [isFixed]\n * @returns {Element}\n */\n function getOffsetParent( element, isFixed ) {\n if ( isFixed && element != document.body ) {\n return document.body;\n } else {\n return element.offsetParent;\n }\n }\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - full-screen support functions\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ) {\n /**\n * Determine native full screen support we can get from the browser.\n * @member fullScreenApi\n * @memberof OpenSeadragon\n * @type {object}\n * @property {Boolean} supportsFullScreen Return true if full screen API is supported.\n * @property {Function} isFullScreen Return true if currently in full screen mode.\n * @property {Function} getFullScreenElement Return the element currently in full screen mode.\n * @property {Function} requestFullScreen Make a request to go in full screen mode.\n * @property {Function} exitFullScreen Make a request to exit full screen mode.\n * @property {Function} cancelFullScreen Deprecated, use exitFullScreen instead.\n * @property {String} fullScreenEventName Event fired when the full screen mode change.\n * @property {String} fullScreenErrorEventName Event fired when a request to go\n * in full screen mode failed.\n */\n var fullScreenApi = {\n supportsFullScreen: false,\n isFullScreen: function() { return false; },\n getFullScreenElement: function() { return null; },\n requestFullScreen: function() {},\n exitFullScreen: function() {},\n cancelFullScreen: function() {},\n fullScreenEventName: '',\n fullScreenErrorEventName: ''\n };\n\n // check for native support\n if ( document.exitFullscreen ) {\n // W3C standard\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.fullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.requestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.exitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"fullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"fullscreenerror\";\n } else if ( document.msExitFullscreen ) {\n // IE 11\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.msFullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.msRequestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.msExitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"MSFullscreenChange\";\n fullScreenApi.fullScreenErrorEventName = \"MSFullscreenError\";\n } else if ( document.webkitExitFullscreen ) {\n // Recent webkit\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.webkitFullscreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.webkitRequestFullscreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.webkitExitFullscreen();\n };\n fullScreenApi.fullScreenEventName = \"webkitfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"webkitfullscreenerror\";\n } else if ( document.webkitCancelFullScreen ) {\n // Old webkit\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.webkitCurrentFullScreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.webkitRequestFullScreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.webkitCancelFullScreen();\n };\n fullScreenApi.fullScreenEventName = \"webkitfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"webkitfullscreenerror\";\n } else if ( document.mozCancelFullScreen ) {\n // Firefox\n fullScreenApi.supportsFullScreen = true;\n fullScreenApi.getFullScreenElement = function() {\n return document.mozFullScreenElement;\n };\n fullScreenApi.requestFullScreen = function( element ) {\n return element.mozRequestFullScreen();\n };\n fullScreenApi.exitFullScreen = function() {\n document.mozCancelFullScreen();\n };\n fullScreenApi.fullScreenEventName = \"mozfullscreenchange\";\n fullScreenApi.fullScreenErrorEventName = \"mozfullscreenerror\";\n }\n fullScreenApi.isFullScreen = function() {\n return fullScreenApi.getFullScreenElement() !== null;\n };\n fullScreenApi.cancelFullScreen = function() {\n $.console.error(\"cancelFullScreen is deprecated. Use exitFullScreen instead.\");\n fullScreenApi.exitFullScreen();\n };\n\n // export api\n $.extend( $, fullScreenApi );\n\n})( OpenSeadragon );\n","/*\n * OpenSeadragon - EventSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($){\n\n/**\n * Event handler method signature used by all OpenSeadragon events.\n *\n * @callback EventHandler\n * @memberof OpenSeadragon\n * @param {Object} event - See individual events for event-specific properties.\n */\n\n\n/**\n * @class EventSource\n * @classdesc For use by classes which want to support custom, non-browser events.\n *\n * @memberof OpenSeadragon\n */\n$.EventSource = function() {\n this.events = {};\n};\n\n/** @lends OpenSeadragon.EventSource.prototype */\n$.EventSource.prototype = {\n\n /**\n * Add an event handler to be triggered only once (or a given number of times)\n * for a given event.\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {OpenSeadragon.EventHandler} handler - Function to call when event\n * is triggered.\n * @param {Object} [userData=null] - Arbitrary object to be passed unchanged\n * to the handler.\n * @param {Number} [times=1] - The number of times to handle the event\n * before removing it.\n */\n addOnceHandler: function(eventName, handler, userData, times) {\n var self = this;\n times = times || 1;\n var count = 0;\n var onceHandler = function(event) {\n count++;\n if (count === times) {\n self.removeHandler(eventName, onceHandler);\n }\n handler(event);\n };\n this.addHandler(eventName, onceHandler, userData);\n },\n\n /**\n * Add an event handler for a given event.\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {OpenSeadragon.EventHandler} handler - Function to call when event is triggered.\n * @param {Object} [userData=null] - Arbitrary object to be passed unchanged to the handler.\n */\n addHandler: function ( eventName, handler, userData ) {\n var events = this.events[ eventName ];\n if ( !events ) {\n this.events[ eventName ] = events = [];\n }\n if ( handler && $.isFunction( handler ) ) {\n events[ events.length ] = { handler: handler, userData: userData || null };\n }\n },\n\n /**\n * Remove a specific event handler for a given event.\n * @function\n * @param {String} eventName - Name of event for which the handler is to be removed.\n * @param {OpenSeadragon.EventHandler} handler - Function to be removed.\n */\n removeHandler: function ( eventName, handler ) {\n var events = this.events[ eventName ],\n handlers = [],\n i;\n if ( !events ) {\n return;\n }\n if ( $.isArray( events ) ) {\n for ( i = 0; i < events.length; i++ ) {\n if ( events[i].handler !== handler ) {\n handlers.push( events[ i ] );\n }\n }\n this.events[ eventName ] = handlers;\n }\n },\n\n\n /**\n * Remove all event handlers for a given event type. If no type is given all\n * event handlers for every event type are removed.\n * @function\n * @param {String} eventName - Name of event for which all handlers are to be removed.\n */\n removeAllHandlers: function( eventName ) {\n if ( eventName ){\n this.events[ eventName ] = [];\n } else{\n for ( var eventType in this.events ) {\n this.events[ eventType ] = [];\n }\n }\n },\n\n /**\n * Get a function which iterates the list of all handlers registered for a given event, calling the handler for each.\n * @function\n * @param {String} eventName - Name of event to get handlers for.\n */\n getHandler: function ( eventName ) {\n var events = this.events[ eventName ];\n if ( !events || !events.length ) {\n return null;\n }\n events = events.length === 1 ?\n [ events[ 0 ] ] :\n Array.apply( null, events );\n return function ( source, args ) {\n var i,\n length = events.length;\n for ( i = 0; i < length; i++ ) {\n if ( events[ i ] ) {\n args.eventSource = source;\n args.userData = events[ i ].userData;\n events[ i ].handler( args );\n }\n }\n };\n },\n\n /**\n * Trigger an event, optionally passing additional information.\n * @function\n * @param {String} eventName - Name of event to register.\n * @param {Object} eventArgs - Event-specific data.\n */\n raiseEvent: function( eventName, eventArgs ) {\n //uncomment if you want to get a log of all events\n //$.console.log( eventName );\n var handler = this.getHandler( eventName );\n\n if ( handler ) {\n if ( !eventArgs ) {\n eventArgs = {};\n }\n\n handler( this, eventArgs );\n }\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - MouseTracker\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ( $ ) {\n\n // All MouseTracker instances\n var MOUSETRACKERS = [];\n\n // dictionary from hash to private properties\n var THIS = {};\n\n\n /**\n * @class MouseTracker\n * @classdesc Provides simplified handling of common pointer device (mouse, touch, pen, etc.) gestures\n * and keyboard events on a specified element.\n * @memberof OpenSeadragon\n * @param {Object} options\n * Allows configurable properties to be entirely specified by passing\n * an options object to the constructor. The constructor also supports\n * the original positional arguments 'element', 'clickTimeThreshold',\n * and 'clickDistThreshold' in that order.\n * @param {Element|String} options.element\n * A reference to an element or an element id for which the pointer/key\n * events will be monitored.\n * @param {Boolean} [options.startDisabled=false]\n * If true, event tracking on the element will not start until\n * {@link OpenSeadragon.MouseTracker.setTracking|setTracking} is called.\n * @param {Number} options.clickTimeThreshold\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n * @param {Number} options.clickDistThreshold\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n * @param {Number} options.dblClickTimeThreshold\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n * @param {Number} options.dblClickDistThreshold\n * The maximum distance allowed between two pointer click events\n * to be treated as a click gesture.\n * @param {Number} [options.stopDelay=50]\n * The number of milliseconds without pointer move before the stop\n * event is fired.\n * @param {OpenSeadragon.EventHandler} [options.enterHandler=null]\n * An optional handler for pointer enter.\n * @param {OpenSeadragon.EventHandler} [options.exitHandler=null]\n * An optional handler for pointer exit.\n * @param {OpenSeadragon.EventHandler} [options.pressHandler=null]\n * An optional handler for pointer press.\n * @param {OpenSeadragon.EventHandler} [options.nonPrimaryPressHandler=null]\n * An optional handler for pointer non-primary button press.\n * @param {OpenSeadragon.EventHandler} [options.releaseHandler=null]\n * An optional handler for pointer release.\n * @param {OpenSeadragon.EventHandler} [options.nonPrimaryReleaseHandler=null]\n * An optional handler for pointer non-primary button release.\n * @param {OpenSeadragon.EventHandler} [options.moveHandler=null]\n * An optional handler for pointer move.\n * @param {OpenSeadragon.EventHandler} [options.scrollHandler=null]\n * An optional handler for mouse wheel scroll.\n * @param {OpenSeadragon.EventHandler} [options.clickHandler=null]\n * An optional handler for pointer click.\n * @param {OpenSeadragon.EventHandler} [options.dblClickHandler=null]\n * An optional handler for pointer double-click.\n * @param {OpenSeadragon.EventHandler} [options.dragHandler=null]\n * An optional handler for the drag gesture.\n * @param {OpenSeadragon.EventHandler} [options.dragEndHandler=null]\n * An optional handler for after a drag gesture.\n * @param {OpenSeadragon.EventHandler} [options.pinchHandler=null]\n * An optional handler for the pinch gesture.\n * @param {OpenSeadragon.EventHandler} [options.keyDownHandler=null]\n * An optional handler for keydown.\n * @param {OpenSeadragon.EventHandler} [options.keyUpHandler=null]\n * An optional handler for keyup.\n * @param {OpenSeadragon.EventHandler} [options.keyHandler=null]\n * An optional handler for keypress.\n * @param {OpenSeadragon.EventHandler} [options.focusHandler=null]\n * An optional handler for focus.\n * @param {OpenSeadragon.EventHandler} [options.blurHandler=null]\n * An optional handler for blur.\n * @param {Object} [options.userData=null]\n * Arbitrary object to be passed unchanged to any attached handler methods.\n */\n $.MouseTracker = function ( options ) {\n\n MOUSETRACKERS.push( this );\n\n var args = arguments;\n\n if ( !$.isPlainObject( options ) ) {\n options = {\n element: args[ 0 ],\n clickTimeThreshold: args[ 1 ],\n clickDistThreshold: args[ 2 ]\n };\n }\n\n this.hash = Math.random(); // An unique hash for this tracker.\n /**\n * The element for which pointer events are being monitored.\n * @member {Element} element\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.element = $.getElement( options.element );\n /**\n * The number of milliseconds within which a pointer down-up event combination\n * will be treated as a click gesture.\n * @member {Number} clickTimeThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.clickTimeThreshold = options.clickTimeThreshold || $.DEFAULT_SETTINGS.clickTimeThreshold;\n /**\n * The maximum distance allowed between a pointer down event and a pointer up event\n * to be treated as a click gesture.\n * @member {Number} clickDistThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.clickDistThreshold = options.clickDistThreshold || $.DEFAULT_SETTINGS.clickDistThreshold;\n /**\n * The number of milliseconds within which two pointer down-up event combinations\n * will be treated as a double-click gesture.\n * @member {Number} dblClickTimeThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.dblClickTimeThreshold = options.dblClickTimeThreshold || $.DEFAULT_SETTINGS.dblClickTimeThreshold;\n /**\n * The maximum distance allowed between two pointer click events\n * to be treated as a click gesture.\n * @member {Number} clickDistThreshold\n * @memberof OpenSeadragon.MouseTracker#\n */\n this.dblClickDistThreshold = options.dblClickDistThreshold || $.DEFAULT_SETTINGS.dblClickDistThreshold;\n this.userData = options.userData || null;\n this.stopDelay = options.stopDelay || 50;\n\n this.enterHandler = options.enterHandler || null;\n this.exitHandler = options.exitHandler || null;\n this.pressHandler = options.pressHandler || null;\n this.nonPrimaryPressHandler = options.nonPrimaryPressHandler || null;\n this.releaseHandler = options.releaseHandler || null;\n this.nonPrimaryReleaseHandler = options.nonPrimaryReleaseHandler || null;\n this.moveHandler = options.moveHandler || null;\n this.scrollHandler = options.scrollHandler || null;\n this.clickHandler = options.clickHandler || null;\n this.dblClickHandler = options.dblClickHandler || null;\n this.dragHandler = options.dragHandler || null;\n this.dragEndHandler = options.dragEndHandler || null;\n this.pinchHandler = options.pinchHandler || null;\n this.stopHandler = options.stopHandler || null;\n this.keyDownHandler = options.keyDownHandler || null;\n this.keyUpHandler = options.keyUpHandler || null;\n this.keyHandler = options.keyHandler || null;\n this.focusHandler = options.focusHandler || null;\n this.blurHandler = options.blurHandler || null;\n\n //Store private properties in a scope sealed hash map\n var _this = this;\n\n /**\n * @private\n * @property {Boolean} tracking\n * Are we currently tracking pointer events for this element.\n */\n THIS[ this.hash ] = {\n click: function ( event ) { onClick( _this, event ); },\n dblclick: function ( event ) { onDblClick( _this, event ); },\n keydown: function ( event ) { onKeyDown( _this, event ); },\n keyup: function ( event ) { onKeyUp( _this, event ); },\n keypress: function ( event ) { onKeyPress( _this, event ); },\n focus: function ( event ) { onFocus( _this, event ); },\n blur: function ( event ) { onBlur( _this, event ); },\n\n wheel: function ( event ) { onWheel( _this, event ); },\n mousewheel: function ( event ) { onMouseWheel( _this, event ); },\n DOMMouseScroll: function ( event ) { onMouseWheel( _this, event ); },\n MozMousePixelScroll: function ( event ) { onMouseWheel( _this, event ); },\n\n mouseenter: function ( event ) { onMouseEnter( _this, event ); }, // Used on IE8 only\n mouseleave: function ( event ) { onMouseLeave( _this, event ); }, // Used on IE8 only\n mouseover: function ( event ) { onMouseOver( _this, event ); },\n mouseout: function ( event ) { onMouseOut( _this, event ); },\n mousedown: function ( event ) { onMouseDown( _this, event ); },\n mouseup: function ( event ) { onMouseUp( _this, event ); },\n mouseupcaptured: function ( event ) { onMouseUpCaptured( _this, event ); },\n mousemove: function ( event ) { onMouseMove( _this, event ); },\n mousemovecaptured: function ( event ) { onMouseMoveCaptured( _this, event ); },\n\n touchstart: function ( event ) { onTouchStart( _this, event ); },\n touchend: function ( event ) { onTouchEnd( _this, event ); },\n touchendcaptured: function ( event ) { onTouchEndCaptured( _this, event ); },\n touchmove: function ( event ) { onTouchMove( _this, event ); },\n touchmovecaptured: function ( event ) { onTouchMoveCaptured( _this, event ); },\n touchcancel: function ( event ) { onTouchCancel( _this, event ); },\n\n gesturestart: function ( event ) { onGestureStart( _this, event ); },\n gesturechange: function ( event ) { onGestureChange( _this, event ); },\n\n pointerover: function ( event ) { onPointerOver( _this, event ); },\n MSPointerOver: function ( event ) { onPointerOver( _this, event ); },\n pointerout: function ( event ) { onPointerOut( _this, event ); },\n MSPointerOut: function ( event ) { onPointerOut( _this, event ); },\n pointerdown: function ( event ) { onPointerDown( _this, event ); },\n MSPointerDown: function ( event ) { onPointerDown( _this, event ); },\n pointerup: function ( event ) { onPointerUp( _this, event ); },\n MSPointerUp: function ( event ) { onPointerUp( _this, event ); },\n pointermove: function ( event ) { onPointerMove( _this, event ); },\n MSPointerMove: function ( event ) { onPointerMove( _this, event ); },\n pointercancel: function ( event ) { onPointerCancel( _this, event ); },\n MSPointerCancel: function ( event ) { onPointerCancel( _this, event ); },\n pointerupcaptured: function ( event ) { onPointerUpCaptured( _this, event ); },\n pointermovecaptured: function ( event ) { onPointerMoveCaptured( _this, event ); },\n\n tracking: false,\n\n // Active pointers lists. Array of GesturePointList objects, one for each pointer device type.\n // GesturePointList objects are added each time a pointer is tracked by a new pointer device type (see getActivePointersListByType()).\n // Active pointers are any pointer being tracked for this element which are in the hit-test area\n // of the element (for hover-capable devices) and/or have contact or a button press initiated in the element.\n activePointersLists: [],\n\n // Tracking for double-click gesture\n lastClickPos: null,\n dblClickTimeOut: null,\n\n // Tracking for pinch gesture\n pinchGPoints: [],\n lastPinchDist: 0,\n currentPinchDist: 0,\n lastPinchCenter: null,\n currentPinchCenter: null\n };\n\n if ( !options.startDisabled ) {\n this.setTracking( true );\n }\n };\n\n /** @lends OpenSeadragon.MouseTracker.prototype */\n $.MouseTracker.prototype = {\n\n /**\n * Clean up any events or objects created by the tracker.\n * @function\n */\n destroy: function () {\n var i;\n\n stopTracking( this );\n this.element = null;\n\n for ( i = 0; i < MOUSETRACKERS.length; i++ ) {\n if ( MOUSETRACKERS[ i ] === this ) {\n MOUSETRACKERS.splice( i, 1 );\n break;\n }\n }\n\n THIS[ this.hash ] = null;\n delete THIS[ this.hash ];\n },\n\n /**\n * Are we currently tracking events on this element.\n * @deprecated Just use this.tracking\n * @function\n * @returns {Boolean} Are we currently tracking events on this element.\n */\n isTracking: function () {\n return THIS[ this.hash ].tracking;\n },\n\n /**\n * Enable or disable whether or not we are tracking events on this element.\n * @function\n * @param {Boolean} track True to start tracking, false to stop tracking.\n * @returns {OpenSeadragon.MouseTracker} Chainable.\n */\n setTracking: function ( track ) {\n if ( track ) {\n startTracking( this );\n } else {\n stopTracking( this );\n }\n //chain\n return this;\n },\n\n /**\n * Returns the {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} for the given pointer device type,\n * creating and caching a new {@link OpenSeadragon.MouseTracker.GesturePointList|GesturePointList} if one doesn't already exist for the type.\n * @function\n * @param {String} type - The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @returns {OpenSeadragon.MouseTracker.GesturePointList}\n */\n getActivePointersListByType: function ( type ) {\n var delegate = THIS[ this.hash ],\n i,\n len = delegate.activePointersLists.length,\n list;\n\n for ( i = 0; i < len; i++ ) {\n if ( delegate.activePointersLists[ i ].type === type ) {\n return delegate.activePointersLists[ i ];\n }\n }\n\n list = new $.MouseTracker.GesturePointList( type );\n delegate.activePointersLists.push( list );\n return list;\n },\n\n /**\n * Returns the total number of pointers currently active on the tracked element.\n * @function\n * @returns {Number}\n */\n getActivePointerCount: function () {\n var delegate = THIS[ this.hash ],\n i,\n len = delegate.activePointersLists.length,\n count = 0;\n\n for ( i = 0; i < len; i++ ) {\n count += delegate.activePointersLists[ i ].getLength();\n }\n\n return count;\n },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. <span style=\"color:red;\">Deprecated. Use buttons instead.</span>\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n enterHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Number} event.pointers\n * Number of pointers (all types) active in the tracked element.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.buttonDownAny\n * Was the button down anywhere in the screen during the event. <span style=\"color:red;\">Deprecated. Use buttons instead.</span>\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n exitHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n pressHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.button\n * Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n nonPrimaryPressHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.insideElementPressed\n * True if the left mouse button is currently being pressed and was\n * initiated inside the tracked element, otherwise false.\n * @param {Boolean} event.insideElementReleased\n * True if the cursor inside the tracked element when the button was released.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n releaseHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.button\n * Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n nonPrimaryReleaseHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n moveHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.scroll\n * The scroll delta for the event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead. Touch devices no longer generate scroll event.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n scrollHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Boolean} event.quick\n * True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for ignoring drag events.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n clickHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dblClickHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {OpenSeadragon.Point} event.delta\n * The x,y components of the difference between the current position and the last drag event position. Useful for ignoring or weighting the events.\n * @param {Number} event.speed\n * Current computed speed, in pixels per second.\n * @param {Number} event.direction\n * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dragHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.speed\n * Speed at the end of a drag gesture, in pixels per second.\n * @param {Number} event.direction\n * Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n dragEndHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} event.gesturePoints\n * Gesture points associated with the gesture. Velocity data can be found here.\n * @param {OpenSeadragon.Point} event.lastCenter\n * The previous center point of the two pinch contact points relative to the tracked element.\n * @param {OpenSeadragon.Point} event.center\n * The center point of the two pinch contact points relative to the tracked element.\n * @param {Number} event.lastDistance\n * The previous distance between the two pinch contact points in CSS pixels.\n * @param {Number} event.distance\n * The distance between the two pinch contact points in CSS pixels.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n pinchHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {String} event.pointerType\n * \"mouse\", \"touch\", \"pen\", etc.\n * @param {OpenSeadragon.Point} event.position\n * The position of the event relative to the tracked element.\n * @param {Number} event.buttons\n * Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @param {Boolean} event.isTouchEvent\n * True if the original event is a touch event, otherwise false. <span style=\"color:red;\">Deprecated. Use pointerType and/or originalEvent instead.</span>\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n stopHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyDownHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyUpHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Number} event.keyCode\n * The key code that was pressed.\n * @param {Boolean} event.ctrl\n * True if the ctrl key was pressed during this event.\n * @param {Boolean} event.shift\n * True if the shift key was pressed during this event.\n * @param {Boolean} event.alt\n * True if the alt key was pressed during this event.\n * @param {Boolean} event.meta\n * True if the meta key was pressed during this event.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n keyHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n focusHandler: function () { },\n\n /**\n * Implement or assign implementation to these handlers during or after\n * calling the constructor.\n * @function\n * @param {Object} event\n * @param {OpenSeadragon.MouseTracker} event.eventSource\n * A reference to the tracker instance.\n * @param {Object} event.originalEvent\n * The original event object.\n * @param {Boolean} event.preventDefaultAction\n * Set to true to prevent the tracker subscriber from performing its default action (subscriber implementation dependent). Default: false.\n * @param {Object} event.userData\n * Arbitrary user-defined object.\n */\n blurHandler: function () { }\n };\n\n\n /**\n * Provides continuous computation of velocity (speed and direction) of active pointers.\n * This is a singleton, used by all MouseTracker instances, as it is unlikely there will ever be more than\n * two active gesture pointers at a time.\n *\n * @private\n * @member gesturePointVelocityTracker\n * @memberof OpenSeadragon.MouseTracker\n */\n $.MouseTracker.gesturePointVelocityTracker = (function () {\n var trackerPoints = [],\n intervalId = 0,\n lastTime = 0;\n\n // Generates a unique identifier for a tracked gesture point\n var _generateGuid = function ( tracker, gPoint ) {\n return tracker.hash.toString() + gPoint.type + gPoint.id.toString();\n };\n\n // Interval timer callback. Computes velocity for all tracked gesture points.\n var _doTracking = function () {\n var i,\n len = trackerPoints.length,\n trackPoint,\n gPoint,\n now = $.now(),\n elapsedTime,\n distance,\n speed;\n\n elapsedTime = now - lastTime;\n lastTime = now;\n\n for ( i = 0; i < len; i++ ) {\n trackPoint = trackerPoints[ i ];\n gPoint = trackPoint.gPoint;\n // Math.atan2 gives us just what we need for a velocity vector, as we can simply\n // use cos()/sin() to extract the x/y velocity components.\n gPoint.direction = Math.atan2( gPoint.currentPos.y - trackPoint.lastPos.y, gPoint.currentPos.x - trackPoint.lastPos.x );\n // speed = distance / elapsed time\n distance = trackPoint.lastPos.distanceTo( gPoint.currentPos );\n trackPoint.lastPos = gPoint.currentPos;\n speed = 1000 * distance / ( elapsedTime + 1 );\n // Simple biased average, favors the most recent speed computation. Smooths out erratic gestures a bit.\n gPoint.speed = 0.75 * speed + 0.25 * gPoint.speed;\n }\n };\n\n // Public. Add a gesture point to be tracked\n var addPoint = function ( tracker, gPoint ) {\n var guid = _generateGuid( tracker, gPoint );\n\n trackerPoints.push(\n {\n guid: guid,\n gPoint: gPoint,\n lastPos: gPoint.currentPos\n } );\n\n // Only fire up the interval timer when there's gesture pointers to track\n if ( trackerPoints.length === 1 ) {\n lastTime = $.now();\n intervalId = window.setInterval( _doTracking, 50 );\n }\n };\n\n // Public. Stop tracking a gesture point\n var removePoint = function ( tracker, gPoint ) {\n var guid = _generateGuid( tracker, gPoint ),\n i,\n len = trackerPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( trackerPoints[ i ].guid === guid ) {\n trackerPoints.splice( i, 1 );\n // Only run the interval timer if theres gesture pointers to track\n len--;\n if ( len === 0 ) {\n window.clearInterval( intervalId );\n }\n break;\n }\n }\n };\n\n return {\n addPoint: addPoint,\n removePoint: removePoint\n };\n } )();\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Pointer event model and feature detection\n///////////////////////////////////////////////////////////////////////////////\n\n $.MouseTracker.captureElement = document;\n\n /**\n * Detect available mouse wheel event name.\n */\n $.MouseTracker.wheelEventName = ( $.Browser.vendor == $.BROWSERS.IE && $.Browser.version > 8 ) ||\n ( 'onwheel' in document.createElement( 'div' ) ) ? 'wheel' : // Modern browsers support 'wheel'\n document.onmousewheel !== undefined ? 'mousewheel' : // Webkit and IE support at least 'mousewheel'\n 'DOMMouseScroll'; // Assume old Firefox\n\n /**\n * Detect legacy mouse capture support.\n */\n $.MouseTracker.supportsMouseCapture = (function () {\n var divElement = document.createElement( 'div' );\n return $.isFunction( divElement.setCapture ) && $.isFunction( divElement.releaseCapture );\n }());\n\n /**\n * Detect browser pointer device event model(s) and build appropriate list of events to subscribe to.\n */\n $.MouseTracker.subscribeEvents = [ \"click\", \"dblclick\", \"keydown\", \"keyup\", \"keypress\", \"focus\", \"blur\", $.MouseTracker.wheelEventName ];\n\n if( $.MouseTracker.wheelEventName == \"DOMMouseScroll\" ) {\n // Older Firefox\n $.MouseTracker.subscribeEvents.push( \"MozMousePixelScroll\" );\n }\n\n // Note: window.navigator.pointerEnable is deprecated on IE 11 and not part of W3C spec.\n if ( window.PointerEvent && ( window.navigator.pointerEnabled || $.Browser.vendor !== $.BROWSERS.IE ) ) {\n // IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents)\n $.MouseTracker.havePointerEvents = true;\n $.MouseTracker.subscribeEvents.push( \"pointerover\", \"pointerout\", \"pointerdown\", \"pointerup\", \"pointermove\", \"pointercancel\" );\n $.MouseTracker.unprefixedPointerEvents = true;\n if( navigator.maxTouchPoints ) {\n $.MouseTracker.maxTouchPoints = navigator.maxTouchPoints;\n } else {\n $.MouseTracker.maxTouchPoints = 0;\n }\n $.MouseTracker.haveMouseEnter = false;\n } else if ( window.MSPointerEvent && window.navigator.msPointerEnabled ) {\n // IE10\n $.MouseTracker.havePointerEvents = true;\n $.MouseTracker.subscribeEvents.push( \"MSPointerOver\", \"MSPointerOut\", \"MSPointerDown\", \"MSPointerUp\", \"MSPointerMove\", \"MSPointerCancel\" );\n $.MouseTracker.unprefixedPointerEvents = false;\n if( navigator.msMaxTouchPoints ) {\n $.MouseTracker.maxTouchPoints = navigator.msMaxTouchPoints;\n } else {\n $.MouseTracker.maxTouchPoints = 0;\n }\n $.MouseTracker.haveMouseEnter = false;\n } else {\n // Legacy W3C mouse events\n $.MouseTracker.havePointerEvents = false;\n if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {\n $.MouseTracker.subscribeEvents.push( \"mouseenter\", \"mouseleave\" );\n $.MouseTracker.haveMouseEnter = true;\n } else {\n $.MouseTracker.subscribeEvents.push( \"mouseover\", \"mouseout\" );\n $.MouseTracker.haveMouseEnter = false;\n }\n $.MouseTracker.subscribeEvents.push( \"mousedown\", \"mouseup\", \"mousemove\" );\n if ( 'ontouchstart' in window ) {\n // iOS, Android, and other W3c Touch Event implementations\n // (see http://www.w3.org/TR/touch-events/)\n // (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n // (see https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n $.MouseTracker.subscribeEvents.push( \"touchstart\", \"touchend\", \"touchmove\", \"touchcancel\" );\n }\n if ( 'ongesturestart' in window ) {\n // iOS (see https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)\n // Subscribe to these to prevent default gesture handling\n $.MouseTracker.subscribeEvents.push( \"gesturestart\", \"gesturechange\" );\n }\n $.MouseTracker.mousePointerId = \"legacy-mouse\";\n $.MouseTracker.maxTouchPoints = 10;\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Classes and typedefs\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * Represents a point of contact on the screen made by a mouse cursor, pen, touch, or other pointer device.\n *\n * @typedef {Object} GesturePoint\n * @memberof OpenSeadragon.MouseTracker\n *\n * @property {Number} id\n * Identifier unique from all other active GesturePoints for a given pointer device.\n * @property {String} type\n * The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @property {Boolean} captured\n * True if events for the gesture point are captured to the tracked element.\n * @property {Boolean} isPrimary\n * True if the gesture point is a master pointer amongst the set of active pointers for each pointer type. True for mouse and primary (first) touch/pen pointers.\n * @property {Boolean} insideElementPressed\n * True if button pressed or contact point initiated inside the screen area of the tracked element.\n * @property {Boolean} insideElement\n * True if pointer or contact point is currently inside the bounds of the tracked element.\n * @property {Number} speed\n * Current computed speed, in pixels per second.\n * @property {Number} direction\n * Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {OpenSeadragon.Point} contactPos\n * The initial pointer contact position, relative to the page including any scrolling. Only valid if the pointer has contact (pressed, touch contact, pen contact).\n * @property {Number} contactTime\n * The initial pointer contact time, in milliseconds. Only valid if the pointer has contact (pressed, touch contact, pen contact).\n * @property {OpenSeadragon.Point} lastPos\n * The last pointer position, relative to the page including any scrolling.\n * @property {Number} lastTime\n * The last pointer contact time, in milliseconds.\n * @property {OpenSeadragon.Point} currentPos\n * The current pointer position, relative to the page including any scrolling.\n * @property {Number} currentTime\n * The current pointer contact time, in milliseconds.\n */\n\n\n /**\n * @class GesturePointList\n * @classdesc Provides an abstraction for a set of active {@link OpenSeadragon.MouseTracker.GesturePoint|GesturePoint} objects for a given pointer device type.\n * Active pointers are any pointer being tracked for this element which are in the hit-test area\n * of the element (for hover-capable devices) and/or have contact or a button press initiated in the element.\n * @memberof OpenSeadragon.MouseTracker\n * @param {String} type - The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n */\n $.MouseTracker.GesturePointList = function ( type ) {\n this._gPoints = [];\n /**\n * The pointer device type: \"mouse\", \"touch\", \"pen\", etc.\n * @member {String} type\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.type = type;\n /**\n * Current buttons pressed for the device.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @member {Number} buttons\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.buttons = 0;\n /**\n * Current number of contact points (touch points, mouse down, etc.) for the device.\n * @member {Number} contacts\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.contacts = 0;\n /**\n * Current number of clicks for the device. Used for multiple click gesture tracking.\n * @member {Number} clicks\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.clicks = 0;\n /**\n * Current number of captured pointers for the device.\n * @member {Number} captureCount\n * @memberof OpenSeadragon.MouseTracker.GesturePointList#\n */\n this.captureCount = 0;\n };\n\n /** @lends OpenSeadragon.MouseTracker.GesturePointList.prototype */\n $.MouseTracker.GesturePointList.prototype = {\n /**\n * @function\n * @returns {Number} Number of gesture points in the list.\n */\n getLength: function () {\n return this._gPoints.length;\n },\n /**\n * @function\n * @returns {Array.<OpenSeadragon.MouseTracker.GesturePoint>} The list of gesture points in the list as an array (read-only).\n */\n asArray: function () {\n return this._gPoints;\n },\n /**\n * @function\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gesturePoint - A gesture point to add to the list.\n * @returns {Number} Number of gesture points in the list.\n */\n add: function ( gp ) {\n return this._gPoints.push( gp );\n },\n /**\n * @function\n * @param {Number} id - The id of the gesture point to remove from the list.\n * @returns {Number} Number of gesture points in the list.\n */\n removeById: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].id === id ) {\n this._gPoints.splice( i, 1 );\n break;\n }\n }\n return this._gPoints.length;\n },\n /**\n * @function\n * @param {Number} index - The index of the gesture point to retrieve from the list.\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point at the given index, or null if not found.\n */\n getByIndex: function ( index ) {\n if ( index < this._gPoints.length) {\n return this._gPoints[ index ];\n }\n\n return null;\n },\n /**\n * @function\n * @param {Number} id - The id of the gesture point to retrieve from the list.\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The gesture point with the given id, or null if not found.\n */\n getById: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].id === id ) {\n return this._gPoints[ i ];\n }\n }\n return null;\n },\n /**\n * @function\n * @returns {OpenSeadragon.MouseTracker.GesturePoint|null} The primary gesture point in the list, or null if not found.\n */\n getPrimary: function ( id ) {\n var i,\n len = this._gPoints.length;\n for ( i = 0; i < len; i++ ) {\n if ( this._gPoints[ i ].isPrimary ) {\n return this._gPoints[ i ];\n }\n }\n return null;\n }\n };\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Utility functions\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * Removes all tracked pointers.\n * @private\n * @inner\n */\n function clearTrackedPointers( tracker ) {\n var delegate = THIS[ tracker.hash ],\n i,\n pointerListCount = delegate.activePointersLists.length;\n\n for ( i = 0; i < pointerListCount; i++ ) {\n if ( delegate.activePointersLists[ i ].captureCount > 0 ) {\n $.removeEvent(\n $.MouseTracker.captureElement,\n 'mousemove',\n delegate.mousemovecaptured,\n true\n );\n $.removeEvent(\n $.MouseTracker.captureElement,\n 'mouseup',\n delegate.mouseupcaptured,\n true\n );\n $.removeEvent(\n $.MouseTracker.captureElement,\n $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove',\n delegate.pointermovecaptured,\n true\n );\n $.removeEvent(\n $.MouseTracker.captureElement,\n $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp',\n delegate.pointerupcaptured,\n true\n );\n $.removeEvent(\n $.MouseTracker.captureElement,\n 'touchmove',\n delegate.touchmovecaptured,\n true\n );\n $.removeEvent(\n $.MouseTracker.captureElement,\n 'touchend',\n delegate.touchendcaptured,\n true\n );\n\n delegate.activePointersLists[ i ].captureCount = 0;\n }\n }\n\n for ( i = 0; i < pointerListCount; i++ ) {\n delegate.activePointersLists.pop();\n }\n }\n\n /**\n * Starts tracking pointer events on the tracked element.\n * @private\n * @inner\n */\n function startTracking( tracker ) {\n var delegate = THIS[ tracker.hash ],\n event,\n i;\n\n if ( !delegate.tracking ) {\n for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) {\n event = $.MouseTracker.subscribeEvents[ i ];\n $.addEvent(\n tracker.element,\n event,\n delegate[ event ],\n false\n );\n }\n\n clearTrackedPointers( tracker );\n\n delegate.tracking = true;\n }\n }\n\n /**\n * Stops tracking pointer events on the tracked element.\n * @private\n * @inner\n */\n function stopTracking( tracker ) {\n var delegate = THIS[ tracker.hash ],\n event,\n i;\n\n if ( delegate.tracking ) {\n for ( i = 0; i < $.MouseTracker.subscribeEvents.length; i++ ) {\n event = $.MouseTracker.subscribeEvents[ i ];\n $.removeEvent(\n tracker.element,\n event,\n delegate[ event ],\n false\n );\n }\n\n clearTrackedPointers( tracker );\n\n delegate.tracking = false;\n }\n }\n\n /**\n * @private\n * @inner\n */\n function getCaptureEventParams( tracker, pointerType ) {\n var delegate = THIS[ tracker.hash ];\n\n if ( pointerType === 'pointerevent' ) {\n return {\n upName: $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp',\n upHandler: delegate.pointerupcaptured,\n moveName: $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove',\n moveHandler: delegate.pointermovecaptured\n };\n } else if ( pointerType === 'mouse' ) {\n return {\n upName: 'mouseup',\n upHandler: delegate.mouseupcaptured,\n moveName: 'mousemove',\n moveHandler: delegate.mousemovecaptured\n };\n } else if ( pointerType === 'touch' ) {\n return {\n upName: 'touchend',\n upHandler: delegate.touchendcaptured,\n moveName: 'touchmove',\n moveHandler: delegate.touchmovecaptured\n };\n } else {\n throw new Error( \"MouseTracker.getCaptureEventParams: Unknown pointer type.\" );\n }\n }\n\n /**\n * Begin capturing pointer events to the tracked element.\n * @private\n * @inner\n */\n function capturePointer( tracker, pointerType, pointerCount ) {\n var pointsList = tracker.getActivePointersListByType( pointerType ),\n eventParams;\n\n pointsList.captureCount += (pointerCount || 1);\n\n if ( pointsList.captureCount === 1 ) {\n if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {\n tracker.element.setCapture( true );\n } else {\n eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType );\n // We emulate mouse capture by hanging listeners on the document object.\n // (Note we listen on the capture phase so the captured handlers will get called first)\n if (isInIframe && canAccessEvents(window.top)) {\n $.addEvent(\n window.top,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n $.addEvent(\n $.MouseTracker.captureElement,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n $.addEvent(\n $.MouseTracker.captureElement,\n eventParams.moveName,\n eventParams.moveHandler,\n true\n );\n }\n }\n }\n\n\n /**\n * Stop capturing pointer events to the tracked element.\n * @private\n * @inner\n */\n function releasePointer( tracker, pointerType, pointerCount ) {\n var pointsList = tracker.getActivePointersListByType( pointerType ),\n eventParams;\n\n pointsList.captureCount -= (pointerCount || 1);\n\n if ( pointsList.captureCount === 0 ) {\n if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {\n tracker.element.releaseCapture();\n } else {\n eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType );\n // We emulate mouse capture by hanging listeners on the document object.\n // (Note we listen on the capture phase so the captured handlers will get called first)\n if (isInIframe && canAccessEvents(window.top)) {\n $.removeEvent(\n window.top,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n $.removeEvent(\n $.MouseTracker.captureElement,\n eventParams.moveName,\n eventParams.moveHandler,\n true\n );\n $.removeEvent(\n $.MouseTracker.captureElement,\n eventParams.upName,\n eventParams.upHandler,\n true\n );\n }\n }\n }\n\n\n /**\n * Gets a W3C Pointer Events model compatible pointer type string from a DOM pointer event.\n * IE10 used a long integer value, but the W3C specification (and IE11+) use a string \"mouse\", \"touch\", \"pen\", etc.\n * @private\n * @inner\n */\n function getPointerType( event ) {\n var pointerTypeStr;\n if ( $.MouseTracker.unprefixedPointerEvents ) {\n pointerTypeStr = event.pointerType;\n } else {\n // IE10\n // MSPOINTER_TYPE_TOUCH: 0x00000002\n // MSPOINTER_TYPE_PEN: 0x00000003\n // MSPOINTER_TYPE_MOUSE: 0x00000004\n switch( event.pointerType )\n {\n case 0x00000002:\n pointerTypeStr = 'touch';\n break;\n case 0x00000003:\n pointerTypeStr = 'pen';\n break;\n case 0x00000004:\n pointerTypeStr = 'mouse';\n break;\n default:\n pointerTypeStr = '';\n }\n }\n return pointerTypeStr;\n }\n\n\n /**\n * @private\n * @inner\n */\n function getMouseAbsolute( event ) {\n return $.getMousePosition( event );\n }\n\n /**\n * @private\n * @inner\n */\n function getMouseRelative( event, element ) {\n return getPointRelativeToAbsolute( getMouseAbsolute( event ), element );\n }\n\n /**\n * @private\n * @inner\n */\n function getPointRelativeToAbsolute( point, element ) {\n var offset = $.getElementOffset( element );\n return point.minus( offset );\n }\n\n /**\n * @private\n * @inner\n */\n function getCenterPoint( point1, point2 ) {\n return new $.Point( ( point1.x + point2.x ) / 2, ( point1.y + point2.y ) / 2 );\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Device-specific DOM event handlers\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * @private\n * @inner\n */\n function onClick( tracker, event ) {\n if ( tracker.clickHandler ) {\n $.cancelEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onDblClick( tracker, event ) {\n if ( tracker.dblClickHandler ) {\n $.cancelEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyDown( tracker, event ) {\n //$.console.log( \"keydown %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n var propagate;\n if ( tracker.keyDownHandler ) {\n event = $.getEvent( event );\n propagate = tracker.keyDownHandler(\n {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( !propagate ) {\n $.cancelEvent( event );\n }\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyUp( tracker, event ) {\n //$.console.log( \"keyup %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n var propagate;\n if ( tracker.keyUpHandler ) {\n event = $.getEvent( event );\n propagate = tracker.keyUpHandler(\n {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( !propagate ) {\n $.cancelEvent( event );\n }\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onKeyPress( tracker, event ) {\n //$.console.log( \"keypress %s %s %s %s %s\", event.keyCode, event.charCode, event.ctrlKey, event.shiftKey, event.altKey );\n var propagate;\n if ( tracker.keyHandler ) {\n event = $.getEvent( event );\n propagate = tracker.keyHandler(\n {\n eventSource: tracker,\n keyCode: event.keyCode ? event.keyCode : event.charCode,\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n meta: event.metaKey,\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( !propagate ) {\n $.cancelEvent( event );\n }\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onFocus( tracker, event ) {\n //console.log( \"focus %s\", event );\n var propagate;\n if ( tracker.focusHandler ) {\n event = $.getEvent( event );\n propagate = tracker.focusHandler(\n {\n eventSource: tracker,\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onBlur( tracker, event ) {\n //console.log( \"blur %s\", event );\n var propagate;\n if ( tracker.blurHandler ) {\n event = $.getEvent( event );\n propagate = tracker.blurHandler(\n {\n eventSource: tracker,\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n }\n\n\n /**\n * Handler for 'wheel' events\n *\n * @private\n * @inner\n */\n function onWheel( tracker, event ) {\n handleWheelEvent( tracker, event, event );\n }\n\n\n /**\n * Handler for 'mousewheel', 'DOMMouseScroll', and 'MozMousePixelScroll' events\n *\n * @private\n * @inner\n */\n function onMouseWheel( tracker, event ) {\n event = $.getEvent( event );\n\n // Simulate a 'wheel' event\n var simulatedEvent = {\n target: event.target || event.srcElement,\n type: \"wheel\",\n shiftKey: event.shiftKey || false,\n clientX: event.clientX,\n clientY: event.clientY,\n pageX: event.pageX ? event.pageX : event.clientX,\n pageY: event.pageY ? event.pageY : event.clientY,\n deltaMode: event.type == \"MozMousePixelScroll\" ? 0 : 1, // 0=pixel, 1=line, 2=page\n deltaX: 0,\n deltaZ: 0\n };\n\n // Calculate deltaY\n if ( $.MouseTracker.wheelEventName == \"mousewheel\" ) {\n simulatedEvent.deltaY = - 1 / $.DEFAULT_SETTINGS.pixelsPerWheelLine * event.wheelDelta;\n } else {\n simulatedEvent.deltaY = event.detail;\n }\n\n handleWheelEvent( tracker, simulatedEvent, event );\n }\n\n\n /**\n * Handles 'wheel' events.\n * The event may be simulated by the legacy mouse wheel event handler (onMouseWheel()).\n *\n * @private\n * @inner\n */\n function handleWheelEvent( tracker, event, originalEvent ) {\n var nDelta = 0,\n propagate;\n\n // The nDelta variable is gated to provide smooth z-index scrolling\n // since the mouse wheel allows for substantial deltas meant for rapid\n // y-index scrolling.\n // event.deltaMode: 0=pixel, 1=line, 2=page\n // TODO: Deltas in pixel mode should be accumulated then a scroll value computed after $.DEFAULT_SETTINGS.pixelsPerWheelLine threshold reached\n nDelta = event.deltaY < 0 ? 1 : -1;\n\n if ( tracker.scrollHandler ) {\n propagate = tracker.scrollHandler(\n {\n eventSource: tracker,\n pointerType: 'mouse',\n position: getMouseRelative( event, tracker.element ),\n scroll: nDelta,\n shift: event.shiftKey,\n isTouchEvent: false,\n originalEvent: originalEvent,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( originalEvent );\n }\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function isParentChild( parent, child )\n {\n if ( parent === child ) {\n return false;\n }\n while ( child && child !== parent ) {\n child = child.parentNode;\n }\n return child === parent;\n }\n\n\n /**\n * Only used on IE 8\n *\n * @private\n * @inner\n */\n function onMouseEnter( tracker, event ) {\n event = $.getEvent( event );\n\n handleMouseEnter( tracker, event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onMouseOver( tracker, event ) {\n event = $.getEvent( event );\n\n if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) {\n return;\n }\n\n handleMouseEnter( tracker, event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handleMouseEnter( tracker, event ) {\n var gPoint = {\n id: $.MouseTracker.mousePointerId,\n type: 'mouse',\n isPrimary: true,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n updatePointersEnter( tracker, event, [ gPoint ] );\n }\n\n\n /**\n * Only used on IE 8\n *\n * @private\n * @inner\n */\n function onMouseLeave( tracker, event ) {\n event = $.getEvent( event );\n\n handleMouseExit( tracker, event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onMouseOut( tracker, event ) {\n event = $.getEvent( event );\n\n if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) {\n return;\n }\n\n handleMouseExit( tracker, event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handleMouseExit( tracker, event ) {\n var gPoint = {\n id: $.MouseTracker.mousePointerId,\n type: 'mouse',\n isPrimary: true,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n updatePointersExit( tracker, event, [ gPoint ] );\n }\n\n\n /**\n * Returns a W3C DOM level 3 standard button value given an event.button property:\n * -1 == none, 0 == primary/left, 1 == middle, 2 == secondary/right, 3 == X1/back, 4 == X2/forward, 5 == eraser (pen)\n * @private\n * @inner\n */\n function getStandardizedButton( button ) {\n if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {\n // On IE 8, 0 == none, 1 == left, 2 == right, 3 == left and right, 4 == middle, 5 == left and middle, 6 == right and middle, 7 == all three\n // TODO: Support chorded (multiple) button presses on IE 8?\n if ( button === 1 ) {\n return 0;\n } else if ( button === 2 ) {\n return 2;\n } else if ( button === 4 ) {\n return 1;\n } else {\n return -1;\n }\n } else {\n return button;\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onMouseDown( tracker, event ) {\n var gPoint;\n\n event = $.getEvent( event );\n\n gPoint = {\n id: $.MouseTracker.mousePointerId,\n type: 'mouse',\n isPrimary: true,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n if ( updatePointersDown( tracker, event, [ gPoint ], getStandardizedButton( event.button ) ) ) {\n $.stopEvent( event );\n capturePointer( tracker, 'mouse' );\n }\n\n if ( tracker.clickHandler || tracker.dblClickHandler || tracker.pressHandler || tracker.dragHandler || tracker.dragEndHandler ) {\n $.cancelEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onMouseUp( tracker, event ) {\n handleMouseUp( tracker, event );\n }\n\n /**\n * This handler is attached to the window object (on the capture phase) to emulate mouse capture.\n * onMouseUp is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onMouseUpCaptured( tracker, event ) {\n handleMouseUp( tracker, event );\n $.stopEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handleMouseUp( tracker, event ) {\n var gPoint;\n\n event = $.getEvent( event );\n\n gPoint = {\n id: $.MouseTracker.mousePointerId,\n type: 'mouse',\n isPrimary: true,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n if ( updatePointersUp( tracker, event, [ gPoint ], getStandardizedButton( event.button ) ) ) {\n releasePointer( tracker, 'mouse' );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onMouseMove( tracker, event ) {\n handleMouseMove( tracker, event );\n }\n\n\n /**\n * This handler is attached to the window object (on the capture phase) to emulate mouse capture.\n * onMouseMove is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onMouseMoveCaptured( tracker, event ) {\n handleMouseMove( tracker, event );\n $.stopEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handleMouseMove( tracker, event ) {\n var gPoint;\n\n event = $.getEvent( event );\n\n gPoint = {\n id: $.MouseTracker.mousePointerId,\n type: 'mouse',\n isPrimary: true,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n updatePointersMove( tracker, event, [ gPoint ] );\n }\n\n\n /**\n * @private\n * @inner\n */\n function abortTouchContacts( tracker, event, pointsList ) {\n var i,\n gPointCount = pointsList.getLength(),\n abortGPoints = [];\n\n for ( i = 0; i < gPointCount; i++ ) {\n abortGPoints.push( pointsList.getByIndex( i ) );\n }\n\n if ( abortGPoints.length > 0 ) {\n // simulate touchend\n updatePointersUp( tracker, event, abortGPoints, 0 ); // 0 means primary button press/release or touch contact\n // release pointer capture\n pointsList.captureCount = 1;\n releasePointer( tracker, 'touch' );\n // simulate touchleave\n updatePointersExit( tracker, event, abortGPoints );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchStart( tracker, event ) {\n var time,\n i,\n j,\n touchCount = event.changedTouches.length,\n gPoints = [],\n parentGPoints,\n pointsList = tracker.getActivePointersListByType( 'touch' );\n\n time = $.now();\n\n if ( pointsList.getLength() > event.touches.length - touchCount ) {\n $.console.warn('Tracked touch contact count doesn\\'t match event.touches.length. Removing all tracked touch pointers.');\n abortTouchContacts( tracker, event, pointsList );\n }\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoints.push( {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n // isPrimary not set - let the updatePointers functions determine it\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: time\n } );\n }\n\n // simulate touchenter on our tracked element\n updatePointersEnter( tracker, event, gPoints );\n\n // simulate touchenter on our tracked element's tracked ancestor elements\n for ( i = 0; i < MOUSETRACKERS.length; i++ ) {\n if ( MOUSETRACKERS[ i ] !== tracker && MOUSETRACKERS[ i ].isTracking() && isParentChild( MOUSETRACKERS[ i ].element, tracker.element ) ) {\n parentGPoints = [];\n for ( j = 0; j < touchCount; j++ ) {\n parentGPoints.push( {\n id: event.changedTouches[ j ].identifier,\n type: 'touch',\n // isPrimary not set - let the updatePointers functions determine it\n currentPos: getMouseAbsolute( event.changedTouches[ j ] ),\n currentTime: time\n } );\n }\n updatePointersEnter( MOUSETRACKERS[ i ], event, parentGPoints );\n }\n }\n\n if ( updatePointersDown( tracker, event, gPoints, 0 ) ) { // 0 means primary button press/release or touch contact\n $.stopEvent( event );\n capturePointer( tracker, 'touch', touchCount );\n }\n\n $.cancelEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchEnd( tracker, event ) {\n handleTouchEnd( tracker, event );\n }\n\n\n /**\n * This handler is attached to the window object (on the capture phase) to emulate pointer capture.\n * onTouchEnd is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onTouchEndCaptured( tracker, event ) {\n handleTouchEnd( tracker, event );\n $.stopEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handleTouchEnd( tracker, event ) {\n var time,\n i,\n j,\n touchCount = event.changedTouches.length,\n gPoints = [],\n parentGPoints;\n\n time = $.now();\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoints.push( {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n // isPrimary not set - let the updatePointers functions determine it\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: time\n } );\n }\n\n if ( updatePointersUp( tracker, event, gPoints, 0 ) ) {\n releasePointer( tracker, 'touch', touchCount );\n }\n\n // simulate touchleave on our tracked element\n updatePointersExit( tracker, event, gPoints );\n\n // simulate touchleave on our tracked element's tracked ancestor elements\n for ( i = 0; i < MOUSETRACKERS.length; i++ ) {\n if ( MOUSETRACKERS[ i ] !== tracker && MOUSETRACKERS[ i ].isTracking() && isParentChild( MOUSETRACKERS[ i ].element, tracker.element ) ) {\n parentGPoints = [];\n for ( j = 0; j < touchCount; j++ ) {\n parentGPoints.push( {\n id: event.changedTouches[ j ].identifier,\n type: 'touch',\n // isPrimary not set - let the updatePointers functions determine it\n currentPos: getMouseAbsolute( event.changedTouches[ j ] ),\n currentTime: time\n } );\n }\n updatePointersExit( MOUSETRACKERS[ i ], event, parentGPoints );\n }\n }\n\n $.cancelEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchMove( tracker, event ) {\n handleTouchMove( tracker, event );\n }\n\n\n /**\n * This handler is attached to the window object (on the capture phase) to emulate pointer capture.\n * onTouchMove is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onTouchMoveCaptured( tracker, event ) {\n handleTouchMove( tracker, event );\n $.stopEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handleTouchMove( tracker, event ) {\n var i,\n touchCount = event.changedTouches.length,\n gPoints = [];\n\n for ( i = 0; i < touchCount; i++ ) {\n gPoints.push( {\n id: event.changedTouches[ i ].identifier,\n type: 'touch',\n // isPrimary not set - let the updatePointers functions determine it\n currentPos: getMouseAbsolute( event.changedTouches[ i ] ),\n currentTime: $.now()\n } );\n }\n\n updatePointersMove( tracker, event, gPoints );\n\n $.cancelEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onTouchCancel( tracker, event ) {\n var i,\n touchCount = event.changedTouches.length,\n gPoints = [],\n pointsList = tracker.getActivePointersListByType( 'touch' );\n \n abortTouchContacts( tracker, event, pointsList );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onGestureStart( tracker, event ) {\n event.stopPropagation();\n event.preventDefault();\n return false;\n }\n\n\n /**\n * @private\n * @inner\n */\n function onGestureChange( tracker, event ) {\n event.stopPropagation();\n event.preventDefault();\n return false;\n }\n\n\n /**\n * @private\n * @inner\n */\n function onPointerOver( tracker, event ) {\n var gPoint;\n\n if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) {\n return;\n }\n\n gPoint = {\n id: event.pointerId,\n type: getPointerType( event ),\n isPrimary: event.isPrimary,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n updatePointersEnter( tracker, event, [ gPoint ] );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onPointerOut( tracker, event ) {\n var gPoint;\n\n if ( event.currentTarget === event.relatedTarget || isParentChild( event.currentTarget, event.relatedTarget ) ) {\n return;\n }\n\n gPoint = {\n id: event.pointerId,\n type: getPointerType( event ),\n isPrimary: event.isPrimary,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n updatePointersExit( tracker, event, [ gPoint ] );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onPointerDown( tracker, event ) {\n var gPoint;\n\n gPoint = {\n id: event.pointerId,\n type: getPointerType( event ),\n isPrimary: event.isPrimary,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n if ( updatePointersDown( tracker, event, [ gPoint ], event.button ) ) {\n $.stopEvent( event );\n capturePointer( tracker, gPoint.type );\n }\n\n if ( tracker.clickHandler || tracker.dblClickHandler || tracker.pressHandler || tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {\n $.cancelEvent( event );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onPointerUp( tracker, event ) {\n handlePointerUp( tracker, event );\n }\n\n\n /**\n * This handler is attached to the window object (on the capture phase) to emulate mouse capture.\n * onPointerUp is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onPointerUpCaptured( tracker, event ) {\n var pointsList = tracker.getActivePointersListByType( getPointerType( event ) );\n if ( pointsList.getById( event.pointerId ) ) {\n handlePointerUp( tracker, event );\n }\n $.stopEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handlePointerUp( tracker, event ) {\n var gPoint;\n\n gPoint = {\n id: event.pointerId,\n type: getPointerType( event ),\n isPrimary: event.isPrimary,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n if ( updatePointersUp( tracker, event, [ gPoint ], event.button ) ) {\n releasePointer( tracker, gPoint.type );\n }\n }\n\n\n /**\n * @private\n * @inner\n */\n function onPointerMove( tracker, event ) {\n handlePointerMove( tracker, event );\n }\n\n\n /**\n * This handler is attached to the window object (on the capture phase) to emulate mouse capture.\n * onPointerMove is still attached to the tracked element, so stop propagation to avoid processing twice.\n *\n * @private\n * @inner\n */\n function onPointerMoveCaptured( tracker, event ) {\n var pointsList = tracker.getActivePointersListByType( getPointerType( event ) );\n if ( pointsList.getById( event.pointerId ) ) {\n handlePointerMove( tracker, event );\n }\n $.stopEvent( event );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handlePointerMove( tracker, event ) {\n // Pointer changed coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height)\n var gPoint;\n\n gPoint = {\n id: event.pointerId,\n type: getPointerType( event ),\n isPrimary: event.isPrimary,\n currentPos: getMouseAbsolute( event ),\n currentTime: $.now()\n };\n\n updatePointersMove( tracker, event, [ gPoint ] );\n }\n\n\n /**\n * @private\n * @inner\n */\n function onPointerCancel( tracker, event ) {\n var gPoint;\n\n gPoint = {\n id: event.pointerId,\n type: getPointerType( event )\n };\n\n updatePointersCancel( tracker, event, [ gPoint ] );\n }\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Device-agnostic DOM event handlers\n///////////////////////////////////////////////////////////////////////////////\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList\n * The GesturePointList to track the pointer in.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point to track.\n * @returns {Number} Number of gesture points in pointsList.\n */\n function startTrackingPointer( pointsList, gPoint ) {\n\n // If isPrimary is not known for the pointer then set it according to our rules:\n // true if the first pointer in the gesture, otherwise false\n if ( !gPoint.hasOwnProperty( 'isPrimary' ) ) {\n if ( pointsList.getLength() === 0 ) {\n gPoint.isPrimary = true;\n } else {\n gPoint.isPrimary = false;\n }\n }\n gPoint.speed = 0;\n gPoint.direction = 0;\n gPoint.contactPos = gPoint.currentPos;\n gPoint.contactTime = gPoint.currentTime;\n gPoint.lastPos = gPoint.currentPos;\n gPoint.lastTime = gPoint.currentTime;\n\n return pointsList.add( gPoint );\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker.GesturePointList} pointsList\n * The GesturePointList to stop tracking the pointer on.\n * @param {OpenSeadragon.MouseTracker.GesturePoint} gPoint\n * Gesture point to stop tracking.\n * @returns {Number} Number of gesture points in pointsList.\n */\n function stopTrackingPointer( pointsList, gPoint ) {\n var listLength,\n primaryPoint;\n\n if ( pointsList.getById( gPoint.id ) ) {\n listLength = pointsList.removeById( gPoint.id );\n\n // If isPrimary is not known for the pointer and we just removed the primary pointer from the list then we need to set another pointer as primary\n if ( !gPoint.hasOwnProperty( 'isPrimary' ) ) {\n primaryPoint = pointsList.getPrimary();\n if ( !primaryPoint ) {\n primaryPoint = pointsList.getByIndex( 0 );\n if ( primaryPoint ) {\n primaryPoint.isPrimary = true;\n }\n }\n }\n } else {\n listLength = pointsList.getLength();\n }\n\n return listLength;\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {Object} event\n * A reference to the originating DOM event.\n * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints\n * Gesture points associated with the event.\n */\n function updatePointersEnter( tracker, event, gPoints ) {\n var pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),\n i,\n gPointCount = gPoints.length,\n curGPoint,\n updateGPoint,\n propagate;\n\n for ( i = 0; i < gPointCount; i++ ) {\n curGPoint = gPoints[ i ];\n updateGPoint = pointsList.getById( curGPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n updateGPoint.insideElement = true;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = curGPoint.currentPos;\n updateGPoint.currentTime = curGPoint.currentTime;\n\n curGPoint = updateGPoint;\n } else {\n // Initialize for tracking and add to the tracking list\n curGPoint.captured = false;\n curGPoint.insideElementPressed = false;\n curGPoint.insideElement = true;\n startTrackingPointer( pointsList, curGPoint );\n }\n\n // Enter\n if ( tracker.enterHandler ) {\n propagate = tracker.enterHandler(\n {\n eventSource: tracker,\n pointerType: curGPoint.type,\n position: getPointRelativeToAbsolute( curGPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: curGPoint.insideElementPressed,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: curGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {Object} event\n * A reference to the originating DOM event.\n * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints\n * Gesture points associated with the event.\n */\n function updatePointersExit( tracker, event, gPoints ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),\n i,\n gPointCount = gPoints.length,\n curGPoint,\n updateGPoint,\n propagate;\n\n for ( i = 0; i < gPointCount; i++ ) {\n curGPoint = gPoints[ i ];\n updateGPoint = pointsList.getById( curGPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer. If captured then update it, else stop tracking it\n if ( updateGPoint.captured ) {\n updateGPoint.insideElement = false;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = curGPoint.currentPos;\n updateGPoint.currentTime = curGPoint.currentTime;\n } else {\n stopTrackingPointer( pointsList, updateGPoint );\n }\n\n curGPoint = updateGPoint;\n }\n\n // Exit\n if ( tracker.exitHandler ) {\n propagate = tracker.exitHandler(\n {\n eventSource: tracker,\n pointerType: curGPoint.type,\n position: getPointRelativeToAbsolute( curGPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n pointers: tracker.getActivePointerCount(),\n insideElementPressed: updateGPoint ? updateGPoint.insideElementPressed : false,\n buttonDownAny: pointsList.buttons !== 0,\n isTouchEvent: curGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {Object} event\n * A reference to the originating DOM event.\n * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints\n * Gesture points associated with the event.\n * @param {Number} buttonChanged\n * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model,\n * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events.\n *\n * @returns {Boolean} True if pointers should be captured to the tracked element, otherwise false.\n */\n function updatePointersDown( tracker, event, gPoints, buttonChanged ) {\n var delegate = THIS[ tracker.hash ],\n propagate,\n pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),\n i,\n gPointCount = gPoints.length,\n curGPoint,\n updateGPoint;\n\n if ( typeof event.buttons !== 'undefined' ) {\n pointsList.buttons = event.buttons;\n } else {\n if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {\n if ( buttonChanged === 0 ) {\n // Primary\n pointsList.buttons += 1;\n } else if ( buttonChanged === 1 ) {\n // Aux\n pointsList.buttons += 4;\n } else if ( buttonChanged === 2 ) {\n // Secondary\n pointsList.buttons += 2;\n } else if ( buttonChanged === 3 ) {\n // X1 (Back)\n pointsList.buttons += 8;\n } else if ( buttonChanged === 4 ) {\n // X2 (Forward)\n pointsList.buttons += 16;\n } else if ( buttonChanged === 5 ) {\n // Pen Eraser\n pointsList.buttons += 32;\n }\n } else {\n if ( buttonChanged === 0 ) {\n // Primary\n pointsList.buttons |= 1;\n } else if ( buttonChanged === 1 ) {\n // Aux\n pointsList.buttons |= 4;\n } else if ( buttonChanged === 2 ) {\n // Secondary\n pointsList.buttons |= 2;\n } else if ( buttonChanged === 3 ) {\n // X1 (Back)\n pointsList.buttons |= 8;\n } else if ( buttonChanged === 4 ) {\n // X2 (Forward)\n pointsList.buttons |= 16;\n } else if ( buttonChanged === 5 ) {\n // Pen Eraser\n pointsList.buttons |= 32;\n }\n }\n }\n\n // Only capture and track primary button, pen, and touch contacts\n if ( buttonChanged !== 0 ) {\n // Aux Press\n if ( tracker.nonPrimaryPressHandler ) {\n propagate = tracker.nonPrimaryPressHandler(\n {\n eventSource: tracker,\n pointerType: gPoints[ 0 ].type,\n position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ),\n button: buttonChanged,\n buttons: pointsList.buttons,\n isTouchEvent: gPoints[ 0 ].type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n\n return false;\n }\n\n for ( i = 0; i < gPointCount; i++ ) {\n curGPoint = gPoints[ i ];\n updateGPoint = pointsList.getById( curGPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n updateGPoint.captured = true;\n updateGPoint.insideElementPressed = true;\n updateGPoint.insideElement = true;\n updateGPoint.contactPos = curGPoint.currentPos;\n updateGPoint.contactTime = curGPoint.currentTime;\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = curGPoint.currentPos;\n updateGPoint.currentTime = curGPoint.currentTime;\n\n curGPoint = updateGPoint;\n } else {\n // Initialize for tracking and add to the tracking list (no pointerover or pointermove event occurred before this)\n curGPoint.captured = true;\n curGPoint.insideElementPressed = true;\n curGPoint.insideElement = true;\n startTrackingPointer( pointsList, curGPoint );\n }\n\n pointsList.contacts++;\n //$.console.log('contacts++ ', pointsList.contacts);\n\n if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {\n $.MouseTracker.gesturePointVelocityTracker.addPoint( tracker, curGPoint );\n }\n\n if ( pointsList.contacts === 1 ) {\n // Press\n if ( tracker.pressHandler ) {\n propagate = tracker.pressHandler(\n {\n eventSource: tracker,\n pointerType: curGPoint.type,\n position: getPointRelativeToAbsolute( curGPoint.contactPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: curGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n } else if ( pointsList.contacts === 2 ) {\n if ( tracker.pinchHandler && curGPoint.type === 'touch' ) {\n // Initialize for pinch\n delegate.pinchGPoints = pointsList.asArray();\n delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n }\n }\n }\n\n return true;\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {Object} event\n * A reference to the originating DOM event.\n * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints\n * Gesture points associated with the event.\n * @param {Number} buttonChanged\n * The button involved in the event: -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * Note on chorded button presses (a button pressed when another button is already pressed): In the W3C Pointer Events model,\n * only one pointerdown/pointerup event combo is fired. Chorded button state changes instead fire pointermove events.\n *\n * @returns {Boolean} True if pointer capture should be released from the tracked element, otherwise false.\n */\n function updatePointersUp( tracker, event, gPoints, buttonChanged ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),\n propagate,\n insideElementReleased,\n releasePoint,\n releaseTime,\n i,\n gPointCount = gPoints.length,\n curGPoint,\n updateGPoint,\n releaseCapture = false,\n wasCaptured = false,\n quick;\n\n if ( typeof event.buttons !== 'undefined' ) {\n pointsList.buttons = event.buttons;\n } else {\n if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {\n if ( buttonChanged === 0 ) {\n // Primary\n pointsList.buttons -= 1;\n } else if ( buttonChanged === 1 ) {\n // Aux\n pointsList.buttons -= 4;\n } else if ( buttonChanged === 2 ) {\n // Secondary\n pointsList.buttons -= 2;\n } else if ( buttonChanged === 3 ) {\n // X1 (Back)\n pointsList.buttons -= 8;\n } else if ( buttonChanged === 4 ) {\n // X2 (Forward)\n pointsList.buttons -= 16;\n } else if ( buttonChanged === 5 ) {\n // Pen Eraser\n pointsList.buttons -= 32;\n }\n } else {\n if ( buttonChanged === 0 ) {\n // Primary\n pointsList.buttons ^= ~1;\n } else if ( buttonChanged === 1 ) {\n // Aux\n pointsList.buttons ^= ~4;\n } else if ( buttonChanged === 2 ) {\n // Secondary\n pointsList.buttons ^= ~2;\n } else if ( buttonChanged === 3 ) {\n // X1 (Back)\n pointsList.buttons ^= ~8;\n } else if ( buttonChanged === 4 ) {\n // X2 (Forward)\n pointsList.buttons ^= ~16;\n } else if ( buttonChanged === 5 ) {\n // Pen Eraser\n pointsList.buttons ^= ~32;\n }\n }\n }\n\n // Only capture and track primary button, pen, and touch contacts\n if ( buttonChanged !== 0 ) {\n // Aux Release\n if ( tracker.nonPrimaryReleaseHandler ) {\n propagate = tracker.nonPrimaryReleaseHandler(\n {\n eventSource: tracker,\n pointerType: gPoints[ 0 ].type,\n position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ),\n button: buttonChanged,\n buttons: pointsList.buttons,\n isTouchEvent: gPoints[ 0 ].type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n\n return false;\n }\n\n for ( i = 0; i < gPointCount; i++ ) {\n curGPoint = gPoints[ i ];\n updateGPoint = pointsList.getById( curGPoint.id );\n\n if ( updateGPoint ) {\n // Update the pointer, stop tracking it if not still in this element\n if ( updateGPoint.captured ) {\n updateGPoint.captured = false;\n releaseCapture = true;\n wasCaptured = true;\n }\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = curGPoint.currentPos;\n updateGPoint.currentTime = curGPoint.currentTime;\n if ( !updateGPoint.insideElement ) {\n stopTrackingPointer( pointsList, updateGPoint );\n }\n\n releasePoint = updateGPoint.currentPos;\n releaseTime = updateGPoint.currentTime;\n\n if ( wasCaptured ) {\n // Pointer was activated in our element but could have been removed in any element since events are captured to our element\n\n pointsList.contacts--;\n //$.console.log('contacts-- ', pointsList.contacts);\n\n if ( tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {\n $.MouseTracker.gesturePointVelocityTracker.removePoint( tracker, updateGPoint );\n }\n\n if ( pointsList.contacts === 0 ) {\n\n // Release (pressed in our element)\n if ( tracker.releaseHandler ) {\n propagate = tracker.releaseHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( releasePoint, tracker.element ),\n buttons: pointsList.buttons,\n insideElementPressed: updateGPoint.insideElementPressed,\n insideElementReleased: updateGPoint.insideElement,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n\n // Drag End\n if ( tracker.dragEndHandler && !updateGPoint.currentPos.equals( updateGPoint.contactPos ) ) {\n propagate = tracker.dragEndHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n speed: updateGPoint.speed,\n direction: updateGPoint.direction,\n shift: event.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n\n // Click / Double-Click\n if ( ( tracker.clickHandler || tracker.dblClickHandler ) && updateGPoint.insideElement ) {\n quick = releaseTime - updateGPoint.contactTime <= tracker.clickTimeThreshold &&\n updateGPoint.contactPos.distanceTo( releasePoint ) <= tracker.clickDistThreshold;\n\n // Click\n if ( tracker.clickHandler ) {\n propagate = tracker.clickHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n quick: quick,\n shift: event.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n\n // Double-Click\n if ( tracker.dblClickHandler && quick ) {\n pointsList.clicks++;\n if ( pointsList.clicks === 1 ) {\n delegate.lastClickPos = releasePoint;\n /*jshint loopfunc:true*/\n delegate.dblClickTimeOut = setTimeout( function() {\n pointsList.clicks = 0;\n }, tracker.dblClickTimeThreshold );\n /*jshint loopfunc:false*/\n } else if ( pointsList.clicks === 2 ) {\n clearTimeout( delegate.dblClickTimeOut );\n pointsList.clicks = 0;\n if ( delegate.lastClickPos.distanceTo( releasePoint ) <= tracker.dblClickDistThreshold ) {\n propagate = tracker.dblClickHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n shift: event.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n delegate.lastClickPos = null;\n }\n }\n }\n } else if ( pointsList.contacts === 2 ) {\n if ( tracker.pinchHandler && updateGPoint.type === 'touch' ) {\n // Reset for pinch\n delegate.pinchGPoints = pointsList.asArray();\n delegate.lastPinchDist = delegate.currentPinchDist = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n delegate.lastPinchCenter = delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n }\n }\n } else {\n // Pointer was activated in another element but removed in our element\n\n // Release (pressed in another element)\n if ( tracker.releaseHandler ) {\n propagate = tracker.releaseHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( releasePoint, tracker.element ),\n buttons: pointsList.buttons,\n insideElementPressed: updateGPoint.insideElementPressed,\n insideElementReleased: updateGPoint.insideElement,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n }\n }\n }\n\n return releaseCapture;\n }\n\n\n /**\n * Call when pointer(s) change coordinates, button state, pressure, tilt, or contact geometry (e.g. width and height)\n *\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {Object} event\n * A reference to the originating DOM event.\n * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints\n * Gesture points associated with the event.\n */\n function updatePointersMove( tracker, event, gPoints ) {\n var delegate = THIS[ tracker.hash ],\n pointsList = tracker.getActivePointersListByType( gPoints[ 0 ].type ),\n i,\n gPointCount = gPoints.length,\n curGPoint,\n updateGPoint,\n gPointArray,\n delta,\n propagate;\n\n if ( typeof event.buttons !== 'undefined' ) {\n pointsList.buttons = event.buttons;\n }\n\n for ( i = 0; i < gPointCount; i++ ) {\n curGPoint = gPoints[ i ];\n updateGPoint = pointsList.getById( curGPoint.id );\n\n if ( updateGPoint ) {\n // Already tracking the pointer...update it\n if ( curGPoint.hasOwnProperty( 'isPrimary' ) ) {\n updateGPoint.isPrimary = curGPoint.isPrimary;\n }\n updateGPoint.lastPos = updateGPoint.currentPos;\n updateGPoint.lastTime = updateGPoint.currentTime;\n updateGPoint.currentPos = curGPoint.currentPos;\n updateGPoint.currentTime = curGPoint.currentTime;\n } else {\n // Initialize for tracking and add to the tracking list (no pointerover or pointerdown event occurred before this)\n curGPoint.captured = false;\n curGPoint.insideElementPressed = false;\n curGPoint.insideElement = true;\n startTrackingPointer( pointsList, curGPoint );\n }\n }\n\n // Stop (mouse only)\n if ( tracker.stopHandler && gPoints[ 0 ].type === 'mouse' ) {\n clearTimeout( tracker.stopTimeOut );\n tracker.stopTimeOut = setTimeout( function() {\n handlePointerStop( tracker, event, gPoints[ 0 ].type );\n }, tracker.stopDelay );\n }\n\n if ( pointsList.contacts === 0 ) {\n // Move (no contacts: hovering mouse or other hover-capable device)\n if ( tracker.moveHandler ) {\n propagate = tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: gPoints[ 0 ].type,\n position: getPointRelativeToAbsolute( gPoints[ 0 ].currentPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: gPoints[ 0 ].type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n } else if ( pointsList.contacts === 1 ) {\n // Move (1 contact)\n if ( tracker.moveHandler ) {\n updateGPoint = pointsList.asArray()[ 0 ];\n propagate = tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n\n // Drag\n if ( tracker.dragHandler ) {\n updateGPoint = pointsList.asArray()[ 0 ];\n delta = updateGPoint.currentPos.minus( updateGPoint.lastPos );\n propagate = tracker.dragHandler(\n {\n eventSource: tracker,\n pointerType: updateGPoint.type,\n position: getPointRelativeToAbsolute( updateGPoint.currentPos, tracker.element ),\n buttons: pointsList.buttons,\n delta: delta,\n speed: updateGPoint.speed,\n direction: updateGPoint.direction,\n shift: event.shiftKey,\n isTouchEvent: updateGPoint.type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n } else if ( pointsList.contacts === 2 ) {\n // Move (2 contacts, use center)\n if ( tracker.moveHandler ) {\n gPointArray = pointsList.asArray();\n propagate = tracker.moveHandler(\n {\n eventSource: tracker,\n pointerType: gPointArray[ 0 ].type,\n position: getPointRelativeToAbsolute( getCenterPoint( gPointArray[ 0 ].currentPos, gPointArray[ 1 ].currentPos ), tracker.element ),\n buttons: pointsList.buttons,\n isTouchEvent: gPointArray[ 0 ].type === 'touch',\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n\n // Pinch\n if ( tracker.pinchHandler && gPoints[ 0 ].type === 'touch' ) {\n delta = delegate.pinchGPoints[ 0 ].currentPos.distanceTo( delegate.pinchGPoints[ 1 ].currentPos );\n if ( delta != delegate.currentPinchDist ) {\n delegate.lastPinchDist = delegate.currentPinchDist;\n delegate.currentPinchDist = delta;\n delegate.lastPinchCenter = delegate.currentPinchCenter;\n delegate.currentPinchCenter = getCenterPoint( delegate.pinchGPoints[ 0 ].currentPos, delegate.pinchGPoints[ 1 ].currentPos );\n propagate = tracker.pinchHandler(\n {\n eventSource: tracker,\n pointerType: 'touch',\n gesturePoints: delegate.pinchGPoints,\n lastCenter: getPointRelativeToAbsolute( delegate.lastPinchCenter, tracker.element ),\n center: getPointRelativeToAbsolute( delegate.currentPinchCenter, tracker.element ),\n lastDistance: delegate.lastPinchDist,\n distance: delegate.currentPinchDist,\n shift: event.shiftKey,\n originalEvent: event,\n preventDefaultAction: false,\n userData: tracker.userData\n }\n );\n if ( propagate === false ) {\n $.cancelEvent( event );\n }\n }\n }\n }\n }\n\n\n /**\n * @function\n * @private\n * @inner\n * @param {OpenSeadragon.MouseTracker} tracker\n * A reference to the MouseTracker instance.\n * @param {Object} event\n * A reference to the originating DOM event.\n * @param {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gPoints\n * Gesture points associated with the event.\n */\n function updatePointersCancel( tracker, event, gPoints ) {\n updatePointersUp( tracker, event, gPoints, 0 );\n updatePointersExit( tracker, event, gPoints );\n }\n\n\n /**\n * @private\n * @inner\n */\n function handlePointerStop( tracker, originalMoveEvent, pointerType ) {\n if ( tracker.stopHandler ) {\n tracker.stopHandler( {\n eventSource: tracker,\n pointerType: pointerType,\n position: getMouseRelative( originalMoveEvent, tracker.element ),\n buttons: tracker.getActivePointersListByType( pointerType ).buttons,\n isTouchEvent: pointerType === 'touch',\n originalEvent: originalMoveEvent,\n preventDefaultAction: false,\n userData: tracker.userData\n } );\n }\n }\n \n // True if inside an iframe, otherwise false.\n // @member {Boolean} isInIframe\n // @private\n // @inner\n var isInIframe = (function() {\n try {\n return window.self !== window.top;\n } catch (e) {\n return true;\n }\n })();\n \n // @function\n // @private\n // @inner\n // @returns {Boolean} True if the target has access rights to events, otherwise false.\n function canAccessEvents (target) {\n try {\n return target.addEventListener && target.removeEventListener;\n } catch (e) {\n return false;\n }\n }\n\n} ( OpenSeadragon ) );\n","/*\n * OpenSeadragon - Control\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * An enumeration of supported locations where controls can be anchored.\n * The anchoring is always relative to the container.\n * @member ControlAnchor\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {Number} NONE\n * @property {Number} TOP_LEFT\n * @property {Number} TOP_RIGHT\n * @property {Number} BOTTOM_LEFT\n * @property {Number} BOTTOM_RIGHT\n * @property {Number} ABSOLUTE\n */\n$.ControlAnchor = {\n NONE: 0,\n TOP_LEFT: 1,\n TOP_RIGHT: 2,\n BOTTOM_RIGHT: 3,\n BOTTOM_LEFT: 4,\n ABSOLUTE: 5\n};\n\n/**\n * @class Control\n * @classdesc A Control represents any interface element which is meant to allow the user\n * to interact with the zoomable interface. Any control can be anchored to any\n * element.\n *\n * @memberof OpenSeadragon\n * @param {Element} element - the control element to be anchored in the container.\n * @param {Object } options - All required and optional settings for configuring a control element.\n * @param {OpenSeadragon.ControlAnchor} [options.anchor=OpenSeadragon.ControlAnchor.NONE] - the position of the control\n * relative to the container.\n * @param {Boolean} [options.attachToViewer=true] - Whether the control should be added directly to the viewer, or\n * directly to the container\n * @param {Boolean} [options.autoFade=true] - Whether the control should have the autofade behavior\n * @param {Element} container - the element to control will be anchored too.\n */\n$.Control = function ( element, options, container ) {\n var parent = element.parentNode;\n if (typeof options === 'number')\n {\n $.console.error(\"Passing an anchor directly into the OpenSeadragon.Control constructor is deprecated; \" +\n \"please use an options object instead. \" +\n \"Support for this deprecated variant is scheduled for removal in December 2013\");\n options = {anchor: options};\n }\n options.attachToViewer = (typeof options.attachToViewer === 'undefined') ? true : options.attachToViewer;\n /**\n * True if the control should have autofade behavior.\n * @member {Boolean} autoFade\n * @memberof OpenSeadragon.Control#\n */\n this.autoFade = (typeof options.autoFade === 'undefined') ? true : options.autoFade;\n /**\n * The element providing the user interface with some type of control (e.g. a zoom-in button).\n * @member {Element} element\n * @memberof OpenSeadragon.Control#\n */\n this.element = element;\n /**\n * The position of the Control relative to its container.\n * @member {OpenSeadragon.ControlAnchor} anchor\n * @memberof OpenSeadragon.Control#\n */\n this.anchor = options.anchor;\n /**\n * The Control's containing element.\n * @member {Element} container\n * @memberof OpenSeadragon.Control#\n */\n this.container = container;\n /**\n * A neutral element surrounding the control element.\n * @member {Element} wrapper\n * @memberof OpenSeadragon.Control#\n */\n if ( this.anchor == $.ControlAnchor.ABSOLUTE ) {\n this.wrapper = $.makeNeutralElement( \"div\" );\n this.wrapper.style.position = \"absolute\";\n this.wrapper.style.top = typeof ( options.top ) == \"number\" ? ( options.top + 'px' ) : options.top;\n this.wrapper.style.left = typeof ( options.left ) == \"number\" ? (options.left + 'px' ) : options.left;\n this.wrapper.style.height = typeof ( options.height ) == \"number\" ? ( options.height + 'px' ) : options.height;\n this.wrapper.style.width = typeof ( options.width ) == \"number\" ? ( options.width + 'px' ) : options.width;\n this.wrapper.style.margin = \"0px\";\n this.wrapper.style.padding = \"0px\";\n\n this.element.style.position = \"relative\";\n this.element.style.top = \"0px\";\n this.element.style.left = \"0px\";\n this.element.style.height = \"100%\";\n this.element.style.width = \"100%\";\n } else {\n this.wrapper = $.makeNeutralElement( \"div\" );\n this.wrapper.style.display = \"inline-block\";\n if ( this.anchor == $.ControlAnchor.NONE ) {\n // IE6 fix\n this.wrapper.style.width = this.wrapper.style.height = \"100%\";\n }\n }\n this.wrapper.appendChild( this.element );\n\n if (options.attachToViewer ) {\n if ( this.anchor == $.ControlAnchor.TOP_RIGHT ||\n this.anchor == $.ControlAnchor.BOTTOM_RIGHT ) {\n this.container.insertBefore(\n this.wrapper,\n this.container.firstChild\n );\n } else {\n this.container.appendChild( this.wrapper );\n }\n } else {\n parent.appendChild( this.wrapper );\n }\n};\n\n/** @lends OpenSeadragon.Control.prototype */\n$.Control.prototype = {\n\n /**\n * Removes the control from the container.\n * @function\n */\n destroy: function() {\n this.wrapper.removeChild( this.element );\n this.container.removeChild( this.wrapper );\n },\n\n /**\n * Determines if the control is currently visible.\n * @function\n * @return {Boolean} true if currenly visible, false otherwise.\n */\n isVisible: function() {\n return this.wrapper.style.display != \"none\";\n },\n\n /**\n * Toggles the visibility of the control.\n * @function\n * @param {Boolean} visible - true to make visible, false to hide.\n */\n setVisible: function( visible ) {\n this.wrapper.style.display = visible ?\n ( this.anchor == $.ControlAnchor.ABSOLUTE ? 'block' : 'inline-block' ) :\n \"none\";\n },\n\n /**\n * Sets the opacity level for the control.\n * @function\n * @param {Number} opactiy - a value between 1 and 0 inclusively.\n */\n setOpacity: function( opacity ) {\n if ( this.element[ $.SIGNAL ] && $.Browser.vendor == $.BROWSERS.IE ) {\n $.setElementOpacity( this.element, opacity, true );\n } else {\n $.setElementOpacity( this.wrapper, opacity, true );\n }\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ControlDock\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n /**\n * @class ControlDock\n * @classdesc Provides a container element (a &lt;form&gt; element) with support for the layout of control elements.\n *\n * @memberof OpenSeadragon\n */\n $.ControlDock = function( options ){\n var layouts = [ 'topleft', 'topright', 'bottomright', 'bottomleft'],\n layout,\n i;\n\n $.extend( true, this, {\n id: 'controldock-'+$.now()+'-'+Math.floor(Math.random()*1000000),\n container: $.makeNeutralElement( 'div' ),\n controls: []\n }, options );\n\n // Disable the form's submit; otherwise button clicks and return keys\n // can trigger it.\n this.container.onsubmit = function() {\n return false;\n };\n\n if( this.element ){\n this.element = $.getElement( this.element );\n this.element.appendChild( this.container );\n this.element.style.position = 'relative';\n this.container.style.width = '100%';\n this.container.style.height = '100%';\n }\n\n for( i = 0; i < layouts.length; i++ ){\n layout = layouts[ i ];\n this.controls[ layout ] = $.makeNeutralElement( \"div\" );\n this.controls[ layout ].style.position = 'absolute';\n if ( layout.match( 'left' ) ){\n this.controls[ layout ].style.left = '0px';\n }\n if ( layout.match( 'right' ) ){\n this.controls[ layout ].style.right = '0px';\n }\n if ( layout.match( 'top' ) ){\n this.controls[ layout ].style.top = '0px';\n }\n if ( layout.match( 'bottom' ) ){\n this.controls[ layout ].style.bottom = '0px';\n }\n }\n\n this.container.appendChild( this.controls.topleft );\n this.container.appendChild( this.controls.topright );\n this.container.appendChild( this.controls.bottomright );\n this.container.appendChild( this.controls.bottomleft );\n };\n\n /** @lends OpenSeadragon.ControlDock.prototype */\n $.ControlDock.prototype = {\n\n /**\n * @function\n */\n addControl: function ( element, controlOptions ) {\n element = $.getElement( element );\n var div = null;\n\n if ( getControlIndex( this, element ) >= 0 ) {\n return; // they're trying to add a duplicate control\n }\n\n switch ( controlOptions.anchor ) {\n case $.ControlAnchor.TOP_RIGHT:\n div = this.controls.topright;\n element.style.position = \"relative\";\n element.style.paddingRight = \"0px\";\n element.style.paddingTop = \"0px\";\n break;\n case $.ControlAnchor.BOTTOM_RIGHT:\n div = this.controls.bottomright;\n element.style.position = \"relative\";\n element.style.paddingRight = \"0px\";\n element.style.paddingBottom = \"0px\";\n break;\n case $.ControlAnchor.BOTTOM_LEFT:\n div = this.controls.bottomleft;\n element.style.position = \"relative\";\n element.style.paddingLeft = \"0px\";\n element.style.paddingBottom = \"0px\";\n break;\n case $.ControlAnchor.TOP_LEFT:\n div = this.controls.topleft;\n element.style.position = \"relative\";\n element.style.paddingLeft = \"0px\";\n element.style.paddingTop = \"0px\";\n break;\n case $.ControlAnchor.ABSOLUTE:\n div = this.container;\n element.style.margin = \"0px\";\n element.style.padding = \"0px\";\n break;\n default:\n case $.ControlAnchor.NONE:\n div = this.container;\n element.style.margin = \"0px\";\n element.style.padding = \"0px\";\n break;\n }\n\n this.controls.push(\n new $.Control( element, controlOptions, div )\n );\n element.style.display = \"inline-block\";\n },\n\n\n /**\n * @function\n * @return {OpenSeadragon.ControlDock} Chainable.\n */\n removeControl: function ( element ) {\n element = $.getElement( element );\n var i = getControlIndex( this, element );\n\n if ( i >= 0 ) {\n this.controls[ i ].destroy();\n this.controls.splice( i, 1 );\n }\n\n return this;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.ControlDock} Chainable.\n */\n clearControls: function () {\n while ( this.controls.length > 0 ) {\n this.controls.pop().destroy();\n }\n\n return this;\n },\n\n\n /**\n * @function\n * @return {Boolean}\n */\n areControlsEnabled: function () {\n var i;\n\n for ( i = this.controls.length - 1; i >= 0; i-- ) {\n if ( this.controls[ i ].isVisible() ) {\n return true;\n }\n }\n\n return false;\n },\n\n\n /**\n * @function\n * @return {OpenSeadragon.ControlDock} Chainable.\n */\n setControlsEnabled: function( enabled ) {\n var i;\n\n for ( i = this.controls.length - 1; i >= 0; i-- ) {\n this.controls[ i ].setVisible( enabled );\n }\n\n return this;\n }\n\n };\n\n\n ///////////////////////////////////////////////////////////////////////////////\n // Utility methods\n ///////////////////////////////////////////////////////////////////////////////\n function getControlIndex( dock, element ) {\n var controls = dock.controls,\n i;\n\n for ( i = controls.length - 1; i >= 0; i-- ) {\n if ( controls[ i ].element == element ) {\n return i;\n }\n }\n\n return -1;\n }\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Placement\n *\n * Copyright (C) 2010-2016 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n /**\n * An enumeration of positions to anchor an element.\n * @member Placement\n * @memberOf OpenSeadragon\n * @static\n * @readonly\n * @property {OpenSeadragon.Placement} CENTER\n * @property {OpenSeadragon.Placement} TOP_LEFT\n * @property {OpenSeadragon.Placement} TOP\n * @property {OpenSeadragon.Placement} TOP_RIGHT\n * @property {OpenSeadragon.Placement} RIGHT\n * @property {OpenSeadragon.Placement} BOTTOM_RIGHT\n * @property {OpenSeadragon.Placement} BOTTOM\n * @property {OpenSeadragon.Placement} BOTTOM_LEFT\n * @property {OpenSeadragon.Placement} LEFT\n */\n $.Placement = $.freezeObject({\n CENTER: 0,\n TOP_LEFT: 1,\n TOP: 2,\n TOP_RIGHT: 3,\n RIGHT: 4,\n BOTTOM_RIGHT: 5,\n BOTTOM: 6,\n BOTTOM_LEFT: 7,\n LEFT: 8,\n properties: {\n 0: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n },\n 1: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 2: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 3: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: true,\n isVerticallyCentered: false,\n isBottom: false\n },\n 4: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n },\n 5: {\n isLeft: false,\n isHorizontallyCentered: false,\n isRight: true,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 6: {\n isLeft: false,\n isHorizontallyCentered: true,\n isRight: false,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 7: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: false,\n isVerticallyCentered: false,\n isBottom: true\n },\n 8: {\n isLeft: true,\n isHorizontallyCentered: false,\n isRight: false,\n isTop: false,\n isVerticallyCentered: true,\n isBottom: false\n }\n }\n });\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Viewer\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// dictionary from hash to private properties\nvar THIS = {};\nvar nextHash = 1;\n\n/**\n *\n * The main point of entry into creating a zoomable image on the page.<br>\n * <br>\n * We have provided an idiomatic javascript constructor which takes\n * a single object, but still support the legacy positional arguments.<br>\n * <br>\n * The options below are given in order that they appeared in the constructor\n * as arguments and we translate a positional call into an idiomatic call.<br>\n * <br>\n * To create a viewer, you can use either of this methods:<br>\n * <ul>\n * <li><code>var viewer = new OpenSeadragon.Viewer(options);</code></li>\n * <li><code>var viewer = OpenSeadragon(options);</code></li>\n * </ul>\n * @class Viewer\n * @classdesc The main OpenSeadragon viewer class.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @extends OpenSeadragon.ControlDock\n * @param {OpenSeadragon.Options} options - Viewer options.\n *\n **/\n$.Viewer = function( options ) {\n\n var args = arguments,\n _this = this,\n i;\n\n\n //backward compatibility for positional args while prefering more\n //idiomatic javascript options object as the only argument\n if( !$.isPlainObject( options ) ){\n options = {\n id: args[ 0 ],\n xmlPath: args.length > 1 ? args[ 1 ] : undefined,\n prefixUrl: args.length > 2 ? args[ 2 ] : undefined,\n controls: args.length > 3 ? args[ 3 ] : undefined,\n overlays: args.length > 4 ? args[ 4 ] : undefined\n };\n }\n\n //options.config and the general config argument are deprecated\n //in favor of the more direct specification of optional settings\n //being pass directly on the options object\n if ( options.config ){\n $.extend( true, options, options.config );\n delete options.config;\n }\n\n //Public properties\n //Allow the options object to override global defaults\n $.extend( true, this, {\n\n //internal state and dom identifiers\n id: options.id,\n hash: options.hash || nextHash++,\n\n //dom nodes\n /**\n * The parent element of this Viewer instance, passed in when the Viewer was created.\n * @member {Element} element\n * @memberof OpenSeadragon.Viewer#\n */\n element: null,\n /**\n * A &lt;div&gt; element (provided by {@link OpenSeadragon.ControlDock}), the base element of this Viewer instance.<br><br>\n * Child element of {@link OpenSeadragon.Viewer#element}.\n * @member {Element} container\n * @memberof OpenSeadragon.Viewer#\n */\n container: null,\n /**\n * A &lt;div&gt; element, the element where user-input events are handled for panning and zooming.<br><br>\n * Child element of {@link OpenSeadragon.Viewer#container},\n * positioned on top of {@link OpenSeadragon.Viewer#keyboardCommandArea}.<br><br>\n * The parent of {@link OpenSeadragon.Drawer#canvas} instances.\n * @member {Element} canvas\n * @memberof OpenSeadragon.Viewer#\n */\n canvas: null,\n\n // Overlays list. An overlay allows to add html on top of the viewer.\n overlays: [],\n // Container inside the canvas where overlays are drawn.\n overlaysContainer: null,\n\n //private state properties\n previousBody: [],\n\n //This was originally initialized in the constructor and so could never\n //have anything in it. now it can because we allow it to be specified\n //in the options and is only empty by default if not specified. Also\n //this array was returned from get_controls which I find confusing\n //since this object has a controls property which is treated in other\n //functions like clearControls. I'm removing the accessors.\n customControls: [],\n\n //These are originally not part options but declared as members\n //in initialize. It's still considered idiomatic to put them here\n source: null,\n /**\n * Handles rendering of tiles in the viewer. Created for each TileSource opened.\n * @member {OpenSeadragon.Drawer} drawer\n * @memberof OpenSeadragon.Viewer#\n */\n drawer: null,\n world: null,\n /**\n * Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened.\n * @member {OpenSeadragon.Viewport} viewport\n * @memberof OpenSeadragon.Viewer#\n */\n viewport: null,\n /**\n * @member {OpenSeadragon.Navigator} navigator\n * @memberof OpenSeadragon.Viewer#\n */\n navigator: null,\n\n //A collection viewport is a separate viewport used to provide\n //simultaneous rendering of sets of tiles\n collectionViewport: null,\n collectionDrawer: null,\n\n //UI image resources\n //TODO: rename navImages to uiImages\n navImages: null,\n\n //interface button controls\n buttons: null,\n\n //TODO: this is defunct so safely remove it\n profiler: null\n\n }, $.DEFAULT_SETTINGS, options );\n\n if ( typeof( this.hash) === \"undefined\" ) {\n throw new Error(\"A hash must be defined, either by specifying options.id or options.hash.\");\n }\n if ( typeof( THIS[ this.hash ] ) !== \"undefined\" ) {\n // We don't want to throw an error here, as the user might have discarded\n // the previous viewer with the same hash and now want to recreate it.\n $.console.warn(\"Hash \" + this.hash + \" has already been used.\");\n }\n\n //Private state properties\n THIS[ this.hash ] = {\n \"fsBoundsDelta\": new $.Point( 1, 1 ),\n \"prevContainerSize\": null,\n \"animating\": false,\n \"forceRedraw\": false,\n \"mouseInside\": false,\n \"group\": null,\n // whether we should be continuously zooming\n \"zooming\": false,\n // how much we should be continuously zooming by\n \"zoomFactor\": null,\n \"lastZoomTime\": null,\n \"fullPage\": false,\n \"onfullscreenchange\": null\n };\n\n this._sequenceIndex = 0;\n this._firstOpen = true;\n this._updateRequestId = null;\n this._loadQueue = [];\n this.currentOverlays = [];\n\n this._lastScrollTime = $.now(); // variable used to help normalize the scroll event speed of different devices\n\n //Inherit some behaviors and properties\n $.EventSource.call( this );\n\n this.addHandler( 'open-failed', function ( event ) {\n var msg = $.getString( \"Errors.OpenFailed\", event.eventSource, event.message);\n _this._showMessage( msg );\n });\n\n $.ControlDock.call( this, options );\n\n //Deal with tile sources\n if ( this.xmlPath ){\n //Deprecated option. Now it is preferred to use the tileSources option\n this.tileSources = [ this.xmlPath ];\n }\n\n this.element = this.element || document.getElementById( this.id );\n this.canvas = $.makeNeutralElement( \"div\" );\n\n this.canvas.className = \"openseadragon-canvas\";\n (function( style ){\n style.width = \"100%\";\n style.height = \"100%\";\n style.overflow = \"hidden\";\n style.position = \"absolute\";\n style.top = \"0px\";\n style.left = \"0px\";\n }(this.canvas.style));\n $.setElementTouchActionNone( this.canvas );\n if (options.tabIndex !== \"\") {\n this.canvas.tabIndex = (options.tabIndex === undefined ? 0 : options.tabIndex);\n }\n\n //the container is created through applying the ControlDock constructor above\n this.container.className = \"openseadragon-container\";\n (function( style ){\n style.width = \"100%\";\n style.height = \"100%\";\n style.position = \"relative\";\n style.overflow = \"hidden\";\n style.left = \"0px\";\n style.top = \"0px\";\n style.textAlign = \"left\"; // needed to protect against\n }( this.container.style ));\n\n this.container.insertBefore( this.canvas, this.container.firstChild );\n this.element.appendChild( this.container );\n\n //Used for toggling between fullscreen and default container size\n //TODO: these can be closure private and shared across Viewer\n // instances.\n this.bodyWidth = document.body.style.width;\n this.bodyHeight = document.body.style.height;\n this.bodyOverflow = document.body.style.overflow;\n this.docOverflow = document.documentElement.style.overflow;\n\n this.innerTracker = new $.MouseTracker({\n element: this.canvas,\n startDisabled: this.mouseNavEnabled ? false : true,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n dblClickTimeThreshold: this.dblClickTimeThreshold,\n dblClickDistThreshold: this.dblClickDistThreshold,\n keyDownHandler: $.delegate( this, onCanvasKeyDown ),\n keyHandler: $.delegate( this, onCanvasKeyPress ),\n clickHandler: $.delegate( this, onCanvasClick ),\n dblClickHandler: $.delegate( this, onCanvasDblClick ),\n dragHandler: $.delegate( this, onCanvasDrag ),\n dragEndHandler: $.delegate( this, onCanvasDragEnd ),\n enterHandler: $.delegate( this, onCanvasEnter ),\n exitHandler: $.delegate( this, onCanvasExit ),\n pressHandler: $.delegate( this, onCanvasPress ),\n releaseHandler: $.delegate( this, onCanvasRelease ),\n nonPrimaryPressHandler: $.delegate( this, onCanvasNonPrimaryPress ),\n nonPrimaryReleaseHandler: $.delegate( this, onCanvasNonPrimaryRelease ),\n scrollHandler: $.delegate( this, onCanvasScroll ),\n pinchHandler: $.delegate( this, onCanvasPinch )\n });\n\n this.outerTracker = new $.MouseTracker({\n element: this.container,\n startDisabled: this.mouseNavEnabled ? false : true,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n dblClickTimeThreshold: this.dblClickTimeThreshold,\n dblClickDistThreshold: this.dblClickDistThreshold,\n enterHandler: $.delegate( this, onContainerEnter ),\n exitHandler: $.delegate( this, onContainerExit )\n });\n\n if( this.toolbar ){\n this.toolbar = new $.ControlDock({ element: this.toolbar });\n }\n\n this.bindStandardControls();\n\n THIS[ this.hash ].prevContainerSize = _getSafeElemSize( this.container );\n\n // Create the world\n this.world = new $.World({\n viewer: this\n });\n\n this.world.addHandler('add-item', function(event) {\n // For backwards compatibility, we maintain the source property\n _this.source = _this.world.getItemAt(0).source;\n\n THIS[ _this.hash ].forceRedraw = true;\n\n if (!_this._updateRequestId) {\n _this._updateRequestId = scheduleUpdate( _this, updateMulti );\n }\n });\n\n this.world.addHandler('remove-item', function(event) {\n // For backwards compatibility, we maintain the source property\n if (_this.world.getItemCount()) {\n _this.source = _this.world.getItemAt(0).source;\n } else {\n _this.source = null;\n }\n\n THIS[ _this.hash ].forceRedraw = true;\n });\n\n this.world.addHandler('metrics-change', function(event) {\n if (_this.viewport) {\n _this.viewport._setContentBounds(_this.world.getHomeBounds(), _this.world.getContentFactor());\n }\n });\n\n this.world.addHandler('item-index-change', function(event) {\n // For backwards compatibility, we maintain the source property\n _this.source = _this.world.getItemAt(0).source;\n });\n\n // Create the viewport\n this.viewport = new $.Viewport({\n containerSize: THIS[ this.hash ].prevContainerSize,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime,\n minZoomImageRatio: this.minZoomImageRatio,\n maxZoomPixelRatio: this.maxZoomPixelRatio,\n visibilityRatio: this.visibilityRatio,\n wrapHorizontal: this.wrapHorizontal,\n wrapVertical: this.wrapVertical,\n defaultZoomLevel: this.defaultZoomLevel,\n minZoomLevel: this.minZoomLevel,\n maxZoomLevel: this.maxZoomLevel,\n viewer: this,\n degrees: this.degrees,\n navigatorRotate: this.navigatorRotate,\n homeFillsViewer: this.homeFillsViewer,\n margins: this.viewportMargins\n });\n\n this.viewport._setContentBounds(this.world.getHomeBounds(), this.world.getContentFactor());\n\n // Create the image loader\n this.imageLoader = new $.ImageLoader({\n jobLimit: this.imageLoaderLimit\n });\n\n // Create the tile cache\n this.tileCache = new $.TileCache({\n maxImageCacheCount: this.maxImageCacheCount\n });\n\n // Create the drawer\n this.drawer = new $.Drawer({\n viewer: this,\n viewport: this.viewport,\n element: this.canvas,\n debugGridColor: this.debugGridColor\n });\n\n // Overlay container\n this.overlaysContainer = $.makeNeutralElement( \"div\" );\n this.canvas.appendChild( this.overlaysContainer );\n\n // Now that we have a drawer, see if it supports rotate. If not we need to remove the rotate buttons\n if (!this.drawer.canRotate()) {\n // Disable/remove the rotate left/right buttons since they aren't supported\n if (this.rotateLeft) {\n i = this.buttons.buttons.indexOf(this.rotateLeft);\n this.buttons.buttons.splice(i, 1);\n this.buttons.element.removeChild(this.rotateLeft.element);\n }\n if (this.rotateRight) {\n i = this.buttons.buttons.indexOf(this.rotateRight);\n this.buttons.buttons.splice(i, 1);\n this.buttons.element.removeChild(this.rotateRight.element);\n }\n }\n\n //Instantiate a navigator if configured\n if ( this.showNavigator){\n this.navigator = new $.Navigator({\n id: this.navigatorId,\n position: this.navigatorPosition,\n sizeRatio: this.navigatorSizeRatio,\n maintainSizeRatio: this.navigatorMaintainSizeRatio,\n top: this.navigatorTop,\n left: this.navigatorLeft,\n width: this.navigatorWidth,\n height: this.navigatorHeight,\n autoResize: this.navigatorAutoResize,\n autoFade: this.navigatorAutoFade,\n prefixUrl: this.prefixUrl,\n viewer: this,\n navigatorRotate: this.navigatorRotate,\n crossOriginPolicy: this.crossOriginPolicy\n });\n }\n\n // Sequence mode\n if (this.sequenceMode) {\n this.bindSequenceControls();\n }\n\n // Open initial tilesources\n if (this.tileSources) {\n this.open( this.tileSources );\n }\n\n // Add custom controls\n for ( i = 0; i < this.customControls.length; i++ ) {\n this.addControl(\n this.customControls[ i ].id,\n {anchor: this.customControls[ i ].anchor}\n );\n }\n\n // Initial fade out\n $.requestAnimationFrame( function(){\n beginControlsAutoHide( _this );\n } );\n};\n\n$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{\n\n\n /**\n * @function\n * @return {Boolean}\n */\n isOpen: function () {\n return !!this.world.getItemCount();\n },\n\n // deprecated\n openDzi: function ( dzi ) {\n $.console.error( \"[Viewer.openDzi] this function is deprecated; use Viewer.open() instead.\" );\n return this.open( dzi );\n },\n\n // deprecated\n openTileSource: function ( tileSource ) {\n $.console.error( \"[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead.\" );\n return this.open( tileSource );\n },\n\n /**\n * Open tiled images into the viewer, closing any others.\n * @function\n * @param {Array|String|Object|Function} tileSources - This can be a TiledImage\n * specifier, a TileSource specifier, or an array of either. A TiledImage specifier\n * is the same as the options parameter for {@link OpenSeadragon.Viewer#addTiledImage},\n * except for the index property; images are added in sequence.\n * A TileSource specifier is anything you could pass as the tileSource property\n * of the options parameter for {@link OpenSeadragon.Viewer#addTiledImage}.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:open\n * @fires OpenSeadragon.Viewer.event:open-failed\n */\n open: function (tileSources) {\n var _this = this;\n\n this.close();\n\n if (!tileSources) {\n return;\n }\n\n if (this.sequenceMode && $.isArray(tileSources)) {\n if (this.referenceStrip) {\n this.referenceStrip.destroy();\n this.referenceStrip = null;\n }\n\n this.tileSources = tileSources;\n this._sequenceIndex = Math.max(0, Math.min(this.tileSources.length - 1, this.initialPage));\n if (this.tileSources.length) {\n this.open(this.tileSources[this._sequenceIndex]);\n\n if ( this.showReferenceStrip ){\n this.referenceStrip = new $.ReferenceStrip({\n id: this.referenceStripElement,\n position: this.referenceStripPosition,\n sizeRatio: this.referenceStripSizeRatio,\n scroll: this.referenceStripScroll,\n height: this.referenceStripHeight,\n width: this.referenceStripWidth,\n tileSources: this.tileSources,\n prefixUrl: this.prefixUrl,\n viewer: this\n });\n }\n }\n\n this._updateSequenceButtons( this._sequenceIndex );\n return;\n }\n\n if (!$.isArray(tileSources)) {\n tileSources = [tileSources];\n }\n\n if (!tileSources.length) {\n return;\n }\n\n this._opening = true;\n\n var expected = tileSources.length;\n var successes = 0;\n var failures = 0;\n var failEvent;\n\n var checkCompletion = function() {\n if (successes + failures === expected) {\n if (successes) {\n if (_this._firstOpen || !_this.preserveViewport) {\n _this.viewport.goHome( true );\n _this.viewport.update();\n }\n\n _this._firstOpen = false;\n\n var source = tileSources[0];\n if (source.tileSource) {\n source = source.tileSource;\n }\n\n // Global overlays\n if( _this.overlays && !_this.preserveOverlays ){\n for ( var i = 0; i < _this.overlays.length; i++ ) {\n _this.currentOverlays[ i ] = getOverlayObject( _this, _this.overlays[ i ] );\n }\n }\n\n _this._drawOverlays();\n _this._opening = false;\n\n /**\n * Raised when the viewer has opened and loaded one or more TileSources.\n *\n * @event open\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TileSource} source - The tile source that was opened.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n // TODO: what if there are multiple sources?\n _this.raiseEvent( 'open', { source: source } );\n } else {\n _this._opening = false;\n\n /**\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {String} message - Information about what failed.\n * @property {String} source - The tile source that failed.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', failEvent );\n }\n }\n };\n\n var doOne = function(options) {\n if (!$.isPlainObject(options) || !options.tileSource) {\n options = {\n tileSource: options\n };\n }\n\n if (options.index !== undefined) {\n $.console.error('[Viewer.open] setting indexes here is not supported; use addTiledImage instead');\n delete options.index;\n }\n\n if (options.collectionImmediately === undefined) {\n options.collectionImmediately = true;\n }\n\n var originalSuccess = options.success;\n options.success = function(event) {\n successes++;\n\n // TODO: now that options has other things besides tileSource, the overlays\n // should probably be at the options level, not the tileSource level.\n if (options.tileSource.overlays) {\n for (var i = 0; i < options.tileSource.overlays.length; i++) {\n _this.addOverlay(options.tileSource.overlays[i]);\n }\n }\n\n if (originalSuccess) {\n originalSuccess(event);\n }\n\n checkCompletion();\n };\n\n var originalError = options.error;\n options.error = function(event) {\n failures++;\n\n if (!failEvent) {\n failEvent = event;\n }\n\n if (originalError) {\n originalError(event);\n }\n\n checkCompletion();\n };\n\n _this.addTiledImage(options);\n };\n\n // TileSources\n for (var i = 0; i < tileSources.length; i++) {\n doOne(tileSources[i]);\n }\n\n return this;\n },\n\n\n /**\n * @function\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:close\n */\n close: function ( ) {\n if ( !THIS[ this.hash ] ) {\n //this viewer has already been destroyed: returning immediately\n return this;\n }\n\n this._opening = false;\n\n if ( this.navigator ) {\n this.navigator.close();\n }\n\n if( ! this.preserveOverlays) {\n this.clearOverlays();\n this.overlaysContainer.innerHTML = \"\";\n }\n\n THIS[ this.hash ].animating = false;\n this.world.removeAll();\n this.imageLoader.clear();\n\n /**\n * Raised when the viewer is closed (see {@link OpenSeadragon.Viewer#close}).\n *\n * @event close\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'close' );\n\n return this;\n },\n\n\n /**\n * Function to destroy the viewer and clean up everything created by OpenSeadragon.\n *\n * Example:\n * var viewer = OpenSeadragon({\n * [...]\n * });\n *\n * //when you are done with the viewer:\n * viewer.destroy();\n * viewer = null; //important\n *\n * @function\n */\n destroy: function( ) {\n if ( !THIS[ this.hash ] ) {\n //this viewer has already been destroyed: returning immediately\n return;\n }\n\n this.close();\n\n this.clearOverlays();\n this.overlaysContainer.innerHTML = \"\";\n\n //TODO: implement this...\n //this.unbindSequenceControls()\n //this.unbindStandardControls()\n\n if (this.referenceStrip) {\n this.referenceStrip.destroy();\n this.referenceStrip = null;\n }\n\n if ( this._updateRequestId !== null ) {\n $.cancelAnimationFrame( this._updateRequestId );\n this._updateRequestId = null;\n }\n\n if ( this.drawer ) {\n this.drawer.destroy();\n }\n\n this.removeAllHandlers();\n\n // Go through top element (passed to us) and remove all children\n // Use removeChild to make sure it handles SVG or any non-html\n // also it performs better - http://jsperf.com/innerhtml-vs-removechild/15\n if (this.element){\n while (this.element.firstChild) {\n this.element.removeChild(this.element.firstChild);\n }\n }\n\n // destroy the mouse trackers\n if (this.innerTracker){\n this.innerTracker.destroy();\n }\n if (this.outerTracker){\n this.outerTracker.destroy();\n }\n\n THIS[ this.hash ] = null;\n delete THIS[ this.hash ];\n\n // clear all our references to dom objects\n this.canvas = null;\n this.container = null;\n\n // clear our reference to the main element - they will need to pass it in again, creating a new viewer\n this.element = null;\n },\n\n /**\n * @function\n * @return {Boolean}\n */\n isMouseNavEnabled: function () {\n return this.innerTracker.isTracking();\n },\n\n /**\n * @function\n * @param {Boolean} enabled - true to enable, false to disable\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:mouse-enabled\n */\n setMouseNavEnabled: function( enabled ){\n this.innerTracker.setTracking( enabled );\n this.outerTracker.setTracking( enabled );\n /**\n * Raised when mouse/touch navigation is enabled or disabled (see {@link OpenSeadragon.Viewer#setMouseNavEnabled}).\n *\n * @event mouse-enabled\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} enabled\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'mouse-enabled', { enabled: enabled } );\n return this;\n },\n\n\n /**\n * @function\n * @return {Boolean}\n */\n areControlsEnabled: function () {\n var enabled = this.controls.length,\n i;\n for( i = 0; i < this.controls.length; i++ ){\n enabled = enabled && this.controls[ i ].isVisibile();\n }\n return enabled;\n },\n\n\n /**\n * Shows or hides the controls (e.g. the default navigation buttons).\n *\n * @function\n * @param {Boolean} true to show, false to hide.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:controls-enabled\n */\n setControlsEnabled: function( enabled ) {\n if( enabled ){\n abortControlsAutoHide( this );\n } else {\n beginControlsAutoHide( this );\n }\n /**\n * Raised when the navigation controls are shown or hidden (see {@link OpenSeadragon.Viewer#setControlsEnabled}).\n *\n * @event controls-enabled\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} enabled\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'controls-enabled', { enabled: enabled } );\n return this;\n },\n\n /**\n * @function\n * @return {Boolean}\n */\n isFullPage: function () {\n return THIS[ this.hash ].fullPage;\n },\n\n\n /**\n * Toggle full page mode.\n * @function\n * @param {Boolean} fullPage\n * If true, enter full page mode. If false, exit full page mode.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:pre-full-page\n * @fires OpenSeadragon.Viewer.event:full-page\n */\n setFullPage: function( fullPage ) {\n\n var body = document.body,\n bodyStyle = body.style,\n docStyle = document.documentElement.style,\n _this = this,\n hash,\n nodes,\n i;\n\n //dont bother modifying the DOM if we are already in full page mode.\n if ( fullPage == this.isFullPage() ) {\n return this;\n }\n\n var fullPageEventArgs = {\n fullPage: fullPage,\n preventDefaultAction: false\n };\n /**\n * Raised when the viewer is about to change to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}).\n *\n * @event pre-full-page\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullPage - True if entering full-page mode, false if exiting full-page mode.\n * @property {Boolean} preventDefaultAction - Set to true to prevent full-page mode change. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'pre-full-page', fullPageEventArgs );\n if ( fullPageEventArgs.preventDefaultAction ) {\n return this;\n }\n\n if ( fullPage ) {\n\n this.elementSize = $.getElementSize( this.element );\n this.pageScroll = $.getPageScroll();\n\n this.elementMargin = this.element.style.margin;\n this.element.style.margin = \"0\";\n this.elementPadding = this.element.style.padding;\n this.element.style.padding = \"0\";\n\n this.bodyMargin = bodyStyle.margin;\n this.docMargin = docStyle.margin;\n bodyStyle.margin = \"0\";\n docStyle.margin = \"0\";\n\n this.bodyPadding = bodyStyle.padding;\n this.docPadding = docStyle.padding;\n bodyStyle.padding = \"0\";\n docStyle.padding = \"0\";\n\n this.bodyWidth = bodyStyle.width;\n this.docWidth = docStyle.width;\n bodyStyle.width = \"100%\";\n docStyle.width = \"100%\";\n\n this.bodyHeight = bodyStyle.height;\n this.docHeight = docStyle.height;\n bodyStyle.height = \"100%\";\n docStyle.height = \"100%\";\n\n //when entering full screen on the ipad it wasnt sufficient to leave\n //the body intact as only only the top half of the screen would\n //respond to touch events on the canvas, while the bottom half treated\n //them as touch events on the document body. Thus we remove and store\n //the bodies elements and replace them when we leave full screen.\n this.previousBody = [];\n THIS[ this.hash ].prevElementParent = this.element.parentNode;\n THIS[ this.hash ].prevNextSibling = this.element.nextSibling;\n THIS[ this.hash ].prevElementWidth = this.element.style.width;\n THIS[ this.hash ].prevElementHeight = this.element.style.height;\n nodes = body.childNodes.length;\n for ( i = 0; i < nodes; i++ ) {\n this.previousBody.push( body.childNodes[ 0 ] );\n body.removeChild( body.childNodes[ 0 ] );\n }\n\n //If we've got a toolbar, we need to enable the user to use css to\n //preserve it in fullpage mode\n if ( this.toolbar && this.toolbar.element ) {\n //save a reference to the parent so we can put it back\n //in the long run we need a better strategy\n this.toolbar.parentNode = this.toolbar.element.parentNode;\n this.toolbar.nextSibling = this.toolbar.element.nextSibling;\n body.appendChild( this.toolbar.element );\n\n //Make sure the user has some ability to style the toolbar based\n //on the mode\n $.addClass( this.toolbar.element, 'fullpage' );\n }\n\n $.addClass( this.element, 'fullpage' );\n body.appendChild( this.element );\n\n this.element.style.height = $.getWindowSize().y + 'px';\n this.element.style.width = $.getWindowSize().x + 'px';\n\n if ( this.toolbar && this.toolbar.element ) {\n this.element.style.height = (\n $.getElementSize( this.element ).y - $.getElementSize( this.toolbar.element ).y\n ) + 'px';\n }\n\n THIS[ this.hash ].fullPage = true;\n\n // mouse will be inside container now\n $.delegate( this, onContainerEnter )( {} );\n\n } else {\n\n this.element.style.margin = this.elementMargin;\n this.element.style.padding = this.elementPadding;\n\n bodyStyle.margin = this.bodyMargin;\n docStyle.margin = this.docMargin;\n\n bodyStyle.padding = this.bodyPadding;\n docStyle.padding = this.docPadding;\n\n bodyStyle.width = this.bodyWidth;\n docStyle.width = this.docWidth;\n\n bodyStyle.height = this.bodyHeight;\n docStyle.height = this.docHeight;\n\n body.removeChild( this.element );\n nodes = this.previousBody.length;\n for ( i = 0; i < nodes; i++ ) {\n body.appendChild( this.previousBody.shift() );\n }\n\n $.removeClass( this.element, 'fullpage' );\n THIS[ this.hash ].prevElementParent.insertBefore(\n this.element,\n THIS[ this.hash ].prevNextSibling\n );\n\n //If we've got a toolbar, we need to enable the user to use css to\n //reset it to its original state\n if ( this.toolbar && this.toolbar.element ) {\n body.removeChild( this.toolbar.element );\n\n //Make sure the user has some ability to style the toolbar based\n //on the mode\n $.removeClass( this.toolbar.element, 'fullpage' );\n\n this.toolbar.parentNode.insertBefore(\n this.toolbar.element,\n this.toolbar.nextSibling\n );\n delete this.toolbar.parentNode;\n delete this.toolbar.nextSibling;\n }\n\n this.element.style.width = THIS[ this.hash ].prevElementWidth;\n this.element.style.height = THIS[ this.hash ].prevElementHeight;\n\n // After exiting fullPage or fullScreen, it can take some time\n // before the browser can actually set the scroll.\n var restoreScrollCounter = 0;\n var restoreScroll = function() {\n $.setPageScroll( _this.pageScroll );\n var pageScroll = $.getPageScroll();\n restoreScrollCounter++;\n if ( restoreScrollCounter < 10 &&\n pageScroll.x !== _this.pageScroll.x ||\n pageScroll.y !== _this.pageScroll.y ) {\n $.requestAnimationFrame( restoreScroll );\n }\n };\n $.requestAnimationFrame( restoreScroll );\n\n THIS[ this.hash ].fullPage = false;\n\n // mouse will likely be outside now\n $.delegate( this, onContainerExit )( { } );\n\n }\n\n if ( this.navigator && this.viewport ) {\n this.navigator.update( this.viewport );\n }\n\n /**\n * Raised when the viewer has changed to/from full-page mode (see {@link OpenSeadragon.Viewer#setFullPage}).\n *\n * @event full-page\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullPage - True if changed to full-page mode, false if exited full-page mode.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'full-page', { fullPage: fullPage } );\n\n return this;\n },\n\n /**\n * Toggle full screen mode if supported. Toggle full page mode otherwise.\n * @function\n * @param {Boolean} fullScreen\n * If true, enter full screen mode. If false, exit full screen mode.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:pre-full-screen\n * @fires OpenSeadragon.Viewer.event:full-screen\n */\n setFullScreen: function( fullScreen ) {\n var _this = this;\n\n if ( !$.supportsFullScreen ) {\n return this.setFullPage( fullScreen );\n }\n\n if ( $.isFullScreen() === fullScreen ) {\n return this;\n }\n\n var fullScreeEventArgs = {\n fullScreen: fullScreen,\n preventDefaultAction: false\n };\n /**\n * Raised when the viewer is about to change to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).\n * Note: the pre-full-screen event is not raised when the user is exiting\n * full-screen mode by pressing the Esc key. In that case, consider using\n * the full-screen, pre-full-page or full-page events.\n *\n * @event pre-full-screen\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullScreen - True if entering full-screen mode, false if exiting full-screen mode.\n * @property {Boolean} preventDefaultAction - Set to true to prevent full-screen mode change. Default: false.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'pre-full-screen', fullScreeEventArgs );\n if ( fullScreeEventArgs.preventDefaultAction ) {\n return this;\n }\n\n if ( fullScreen ) {\n\n this.setFullPage( true );\n // If the full page mode is not actually entered, we need to prevent\n // the full screen mode.\n if ( !this.isFullPage() ) {\n return this;\n }\n\n this.fullPageStyleWidth = this.element.style.width;\n this.fullPageStyleHeight = this.element.style.height;\n this.element.style.width = '100%';\n this.element.style.height = '100%';\n\n var onFullScreenChange = function() {\n var isFullScreen = $.isFullScreen();\n if ( !isFullScreen ) {\n $.removeEvent( document, $.fullScreenEventName, onFullScreenChange );\n $.removeEvent( document, $.fullScreenErrorEventName, onFullScreenChange );\n\n _this.setFullPage( false );\n if ( _this.isFullPage() ) {\n _this.element.style.width = _this.fullPageStyleWidth;\n _this.element.style.height = _this.fullPageStyleHeight;\n }\n }\n if ( _this.navigator && _this.viewport ) {\n _this.navigator.update( _this.viewport );\n }\n /**\n * Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).\n *\n * @event full-screen\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} fullScreen - True if changed to full-screen mode, false if exited full-screen mode.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'full-screen', { fullScreen: isFullScreen } );\n };\n $.addEvent( document, $.fullScreenEventName, onFullScreenChange );\n $.addEvent( document, $.fullScreenErrorEventName, onFullScreenChange );\n\n $.requestFullScreen( document.body );\n\n } else {\n $.exitFullScreen();\n }\n return this;\n },\n\n /**\n * @function\n * @return {Boolean}\n */\n isVisible: function () {\n return this.container.style.visibility != \"hidden\";\n },\n\n\n /**\n * @function\n * @param {Boolean} visible\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:visible\n */\n setVisible: function( visible ){\n this.container.style.visibility = visible ? \"\" : \"hidden\";\n /**\n * Raised when the viewer is shown or hidden (see {@link OpenSeadragon.Viewer#setVisible}).\n *\n * @event visible\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Boolean} visible\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'visible', { visible: visible } );\n return this;\n },\n\n /**\n * Add a tiled image to the viewer.\n * options.tileSource can be anything that {@link OpenSeadragon.Viewer#open}\n * supports except arrays of images.\n * Note that you can specify options.width or options.height, but not both.\n * The other dimension will be calculated according to the item's aspect ratio.\n * If collectionMode is on (see {@link OpenSeadragon.Options}), the new image is\n * automatically arranged with the others.\n * @function\n * @param {Object} options\n * @param {String|Object|Function} options.tileSource - The TileSource specifier.\n * A String implies a url used to determine the tileSource implementation\n * based on the file extension of url. JSONP is implied by *.js,\n * otherwise the url is retrieved as text and the resulting text is\n * introspected to determine if its json, xml, or text and parsed.\n * An Object implies an inline configuration which has a single\n * property sufficient for being able to determine tileSource\n * implementation. If the object has a property which is a function\n * named 'getTileUrl', it is treated as a custom TileSource.\n * @param {Number} [options.index] The index of the item. Added on top of\n * all other items if not specified.\n * @param {Boolean} [options.replace=false] If true, the item at options.index will be\n * removed and the new item is added in its place. options.tileSource will be\n * interpreted and fetched if necessary before the old item is removed to avoid leaving\n * a gap in the world.\n * @param {Number} [options.x=0] The X position for the image in viewport coordinates.\n * @param {Number} [options.y=0] The Y position for the image in viewport coordinates.\n * @param {Number} [options.width=1] The width for the image in viewport coordinates.\n * @param {Number} [options.height] The height for the image in viewport coordinates.\n * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates\n * to fit the image into. If specified, x, y, width and height get ignored.\n * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds if options.fitBounds is set.\n * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @param {Number} [options.opacity] Opacity the tiled image should be drawn at by default.\n * @param {String} [options.compositeOperation] How the image is composited onto other images.\n * @param {Function} [options.success] A function that gets called when the image is\n * successfully added. It's passed the event object which contains a single property:\n * \"item\", the resulting TiledImage.\n * @param {Function} [options.error] A function that gets called if the image is\n * unable to be added. It's passed the error event object, which contains \"message\"\n * and \"source\" properties.\n * @param {Boolean} [options.collectionImmediately=false] If collectionMode is on,\n * specifies whether to snap to the new arrangement immediately or to animate to it.\n * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.Viewer.event:add-item-failed\n */\n addTiledImage: function( options ) {\n $.console.assert(options, \"[Viewer.addTiledImage] options is required\");\n $.console.assert(options.tileSource, \"[Viewer.addTiledImage] options.tileSource is required\");\n $.console.assert(!options.replace || (options.index > -1 && options.index < this.world.getItemCount()),\n \"[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world\");\n\n var _this = this;\n\n if (options.replace) {\n options.replaceItem = _this.world.getItemAt(options.index);\n }\n\n this._hideMessage();\n\n if (options.placeholderFillStyle === undefined) {\n options.placeholderFillStyle = this.placeholderFillStyle;\n }\n if (options.opacity === undefined) {\n options.opacity = this.opacity;\n }\n if (options.compositeOperation === undefined) {\n options.compositeOperation = this.compositeOperation;\n }\n\n var myQueueItem = {\n options: options\n };\n\n function raiseAddItemFailed( event ) {\n for (var i = 0; i < _this._loadQueue.length; i++) {\n if (_this._loadQueue[i] === myQueueItem) {\n _this._loadQueue.splice(i, 1);\n break;\n }\n }\n\n if (_this._loadQueue.length === 0) {\n refreshWorld(myQueueItem);\n }\n\n /**\n * Raised when an error occurs while adding a item.\n * @event add-item-failed\n * @memberOf OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {Object} options The options passed to the addTiledImage method.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'add-item-failed', event );\n\n if (options.error) {\n options.error(event);\n }\n }\n\n function refreshWorld(theItem) {\n if (_this.collectionMode) {\n _this.world.arrange({\n immediately: theItem.options.collectionImmediately,\n rows: _this.collectionRows,\n columns: _this.collectionColumns,\n layout: _this.collectionLayout,\n tileSize: _this.collectionTileSize,\n tileMargin: _this.collectionTileMargin\n });\n _this.world.setAutoRefigureSizes(true);\n }\n }\n\n if ($.isArray(options.tileSource)) {\n setTimeout(function() {\n raiseAddItemFailed({\n message: \"[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.\",\n source: options.tileSource,\n options: options\n });\n });\n return;\n }\n\n this._loadQueue.push(myQueueItem);\n\n getTileSourceImplementation( this, options.tileSource, function( tileSource ) {\n\n myQueueItem.tileSource = tileSource;\n\n // add everybody at the front of the queue that's ready to go\n var queueItem, tiledImage, optionsClone;\n while (_this._loadQueue.length) {\n queueItem = _this._loadQueue[0];\n if (!queueItem.tileSource) {\n break;\n }\n\n _this._loadQueue.splice(0, 1);\n\n if (queueItem.options.replace) {\n var newIndex = _this.world.getIndexOfItem(queueItem.options.replaceItem);\n if (newIndex != -1) {\n queueItem.options.index = newIndex;\n }\n _this.world.removeItem(queueItem.options.replaceItem);\n }\n\n tiledImage = new $.TiledImage({\n viewer: _this,\n source: queueItem.tileSource,\n viewport: _this.viewport,\n drawer: _this.drawer,\n tileCache: _this.tileCache,\n imageLoader: _this.imageLoader,\n x: queueItem.options.x,\n y: queueItem.options.y,\n width: queueItem.options.width,\n height: queueItem.options.height,\n fitBounds: queueItem.options.fitBounds,\n fitBoundsPlacement: queueItem.options.fitBoundsPlacement,\n clip: queueItem.options.clip,\n placeholderFillStyle: queueItem.options.placeholderFillStyle,\n opacity: queueItem.options.opacity,\n compositeOperation: queueItem.options.compositeOperation,\n springStiffness: _this.springStiffness,\n animationTime: _this.animationTime,\n minZoomImageRatio: _this.minZoomImageRatio,\n wrapHorizontal: _this.wrapHorizontal,\n wrapVertical: _this.wrapVertical,\n immediateRender: _this.immediateRender,\n blendTime: _this.blendTime,\n alwaysBlend: _this.alwaysBlend,\n minPixelRatio: _this.minPixelRatio,\n smoothTileEdgesMinZoom: _this.smoothTileEdgesMinZoom,\n iOSDevice: _this.iOSDevice,\n crossOriginPolicy: _this.crossOriginPolicy,\n debugMode: _this.debugMode\n });\n\n if (_this.collectionMode) {\n _this.world.setAutoRefigureSizes(false);\n }\n _this.world.addItem( tiledImage, {\n index: queueItem.options.index\n });\n\n if (_this._loadQueue.length === 0) {\n //this restores the autoRefigureSizes flag to true.\n refreshWorld(queueItem);\n }\n\n if (_this.world.getItemCount() === 1 && !_this.preserveViewport) {\n _this.viewport.goHome(true);\n }\n\n if (_this.navigator) {\n optionsClone = $.extend({}, queueItem.options, {\n replace: false, // navigator already removed the layer, nothing to replace\n originalTiledImage: tiledImage,\n tileSource: queueItem.tileSource\n });\n\n _this.navigator.addTiledImage(optionsClone);\n }\n\n if (queueItem.options.success) {\n queueItem.options.success({\n item: tiledImage\n });\n }\n }\n }, function( event ) {\n event.options = options;\n raiseAddItemFailed(event);\n } );\n },\n\n /**\n * Add a simple image to the viewer.\n * The options are the same as the ones in {@link OpenSeadragon.Viewer#addTiledImage}\n * except for options.tileSource which is replaced by options.url.\n * @function\n * @param {Object} options - See {@link OpenSeadragon.Viewer#addTiledImage}\n * for all the options\n * @param {String} options.url - The URL of the image to add.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.Viewer.event:add-item-failed\n */\n addSimpleImage: function(options) {\n $.console.assert(options, \"[Viewer.addSimpleImage] options is required\");\n $.console.assert(options.url, \"[Viewer.addSimpleImage] options.url is required\");\n\n var opts = $.extend({}, options, {\n tileSource: {\n type: 'image',\n url: options.url\n }\n });\n delete opts.url;\n this.addTiledImage(opts);\n },\n\n // deprecated\n addLayer: function( options ) {\n var _this = this;\n\n $.console.error( \"[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead.\" );\n\n var optionsClone = $.extend({}, options, {\n success: function(event) {\n _this.raiseEvent(\"add-layer\", {\n options: options,\n drawer: event.item\n });\n },\n error: function(event) {\n _this.raiseEvent(\"add-layer-failed\", event);\n }\n });\n\n this.addTiledImage(optionsClone);\n return this;\n },\n\n // deprecated\n getLayerAtLevel: function( level ) {\n $.console.error( \"[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead.\" );\n return this.world.getItemAt(level);\n },\n\n // deprecated\n getLevelOfLayer: function( drawer ) {\n $.console.error( \"[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead.\" );\n return this.world.getIndexOfItem(drawer);\n },\n\n // deprecated\n getLayersCount: function() {\n $.console.error( \"[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead.\" );\n return this.world.getItemCount();\n },\n\n // deprecated\n setLayerLevel: function( drawer, level ) {\n $.console.error( \"[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead.\" );\n return this.world.setItemIndex(drawer, level);\n },\n\n // deprecated\n removeLayer: function( drawer ) {\n $.console.error( \"[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead.\" );\n return this.world.removeItem(drawer);\n },\n\n /**\n * Force the viewer to redraw its contents.\n * @returns {OpenSeadragon.Viewer} Chainable.\n */\n forceRedraw: function() {\n THIS[ this.hash ].forceRedraw = true;\n return this;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.Viewer} Chainable.\n */\n bindSequenceControls: function(){\n\n //////////////////////////////////////////////////////////////////////////\n // Image Sequence Controls\n //////////////////////////////////////////////////////////////////////////\n var onFocusHandler = $.delegate( this, onFocus ),\n onBlurHandler = $.delegate( this, onBlur ),\n onNextHandler = $.delegate( this, onNext ),\n onPreviousHandler = $.delegate( this, onPrevious ),\n navImages = this.navImages,\n useGroup = true ;\n\n if( this.showSequenceControl ){\n\n if( this.previousButton || this.nextButton ){\n //if we are binding to custom buttons then layout and\n //grouping is the responsibility of the page author\n useGroup = false;\n }\n\n this.previousButton = new $.Button({\n element: this.previousButton ? $.getElement( this.previousButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.PreviousPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.previous.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.previous.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.previous.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.previous.DOWN ),\n onRelease: onPreviousHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n });\n\n this.nextButton = new $.Button({\n element: this.nextButton ? $.getElement( this.nextButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.NextPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.next.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.next.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.next.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.next.DOWN ),\n onRelease: onNextHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n });\n\n if( !this.navPrevNextWrap ){\n this.previousButton.disable();\n }\n\n if (!this.tileSources || !this.tileSources.length) {\n this.nextButton.disable();\n }\n\n if( useGroup ){\n this.paging = new $.ButtonGroup({\n buttons: [\n this.previousButton,\n this.nextButton\n ],\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold\n });\n\n this.pagingControl = this.paging.element;\n\n if( this.toolbar ){\n this.toolbar.addControl(\n this.pagingControl,\n {anchor: $.ControlAnchor.BOTTOM_RIGHT}\n );\n }else{\n this.addControl(\n this.pagingControl,\n {anchor: this.sequenceControlAnchor || $.ControlAnchor.TOP_LEFT}\n );\n }\n }\n }\n return this;\n },\n\n\n /**\n * @function\n * @return {OpenSeadragon.Viewer} Chainable.\n */\n bindStandardControls: function(){\n //////////////////////////////////////////////////////////////////////////\n // Navigation Controls\n //////////////////////////////////////////////////////////////////////////\n var beginZoomingInHandler = $.delegate( this, beginZoomingIn ),\n endZoomingHandler = $.delegate( this, endZooming ),\n doSingleZoomInHandler = $.delegate( this, doSingleZoomIn ),\n beginZoomingOutHandler = $.delegate( this, beginZoomingOut ),\n doSingleZoomOutHandler = $.delegate( this, doSingleZoomOut ),\n onHomeHandler = $.delegate( this, onHome ),\n onFullScreenHandler = $.delegate( this, onFullScreen ),\n onRotateLeftHandler = $.delegate( this, onRotateLeft ),\n onRotateRightHandler = $.delegate( this, onRotateRight ),\n onFocusHandler = $.delegate( this, onFocus ),\n onBlurHandler = $.delegate( this, onBlur ),\n navImages = this.navImages,\n buttons = [],\n useGroup = true ;\n\n\n if ( this.showNavigationControl ) {\n\n if( this.zoomInButton || this.zoomOutButton ||\n this.homeButton || this.fullPageButton ||\n this.rotateLeftButton || this.rotateRightButton ) {\n //if we are binding to custom buttons then layout and\n //grouping is the responsibility of the page author\n useGroup = false;\n }\n\n if ( this.showZoomControl ) {\n buttons.push( this.zoomInButton = new $.Button({\n element: this.zoomInButton ? $.getElement( this.zoomInButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.ZoomIn\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.zoomIn.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.zoomIn.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.zoomIn.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.zoomIn.DOWN ),\n onPress: beginZoomingInHandler,\n onRelease: endZoomingHandler,\n onClick: doSingleZoomInHandler,\n onEnter: beginZoomingInHandler,\n onExit: endZoomingHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n\n buttons.push( this.zoomOutButton = new $.Button({\n element: this.zoomOutButton ? $.getElement( this.zoomOutButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.ZoomOut\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.zoomOut.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.zoomOut.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.zoomOut.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.zoomOut.DOWN ),\n onPress: beginZoomingOutHandler,\n onRelease: endZoomingHandler,\n onClick: doSingleZoomOutHandler,\n onEnter: beginZoomingOutHandler,\n onExit: endZoomingHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showHomeControl ) {\n buttons.push( this.homeButton = new $.Button({\n element: this.homeButton ? $.getElement( this.homeButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.Home\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.home.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.home.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.home.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.home.DOWN ),\n onRelease: onHomeHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showFullPageControl ) {\n buttons.push( this.fullPageButton = new $.Button({\n element: this.fullPageButton ? $.getElement( this.fullPageButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.FullPage\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.fullpage.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.fullpage.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.fullpage.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.fullpage.DOWN ),\n onRelease: onFullScreenHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n }\n\n if ( this.showRotationControl ) {\n buttons.push( this.rotateLeftButton = new $.Button({\n element: this.rotateLeftButton ? $.getElement( this.rotateLeftButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.RotateLeft\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.rotateleft.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.rotateleft.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.rotateleft.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.rotateleft.DOWN ),\n onRelease: onRotateLeftHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n\n buttons.push( this.rotateRightButton = new $.Button({\n element: this.rotateRightButton ? $.getElement( this.rotateRightButton ) : null,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n tooltip: $.getString( \"Tooltips.RotateRight\" ),\n srcRest: resolveUrl( this.prefixUrl, navImages.rotateright.REST ),\n srcGroup: resolveUrl( this.prefixUrl, navImages.rotateright.GROUP ),\n srcHover: resolveUrl( this.prefixUrl, navImages.rotateright.HOVER ),\n srcDown: resolveUrl( this.prefixUrl, navImages.rotateright.DOWN ),\n onRelease: onRotateRightHandler,\n onFocus: onFocusHandler,\n onBlur: onBlurHandler\n }));\n\n }\n\n if ( useGroup ) {\n this.buttons = new $.ButtonGroup({\n buttons: buttons,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold\n });\n\n this.navControl = this.buttons.element;\n this.addHandler( 'open', $.delegate( this, lightUp ) );\n\n if( this.toolbar ){\n this.toolbar.addControl(\n this.navControl,\n {anchor: $.ControlAnchor.TOP_LEFT}\n );\n } else {\n this.addControl(\n this.navControl,\n {anchor: this.navigationControlAnchor || $.ControlAnchor.TOP_LEFT}\n );\n }\n }\n\n }\n return this;\n },\n\n /**\n * Gets the active page of a sequence\n * @function\n * @return {Number}\n */\n currentPage: function() {\n return this._sequenceIndex;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:page\n */\n goToPage: function( page ){\n if( this.tileSources && page >= 0 && page < this.tileSources.length ){\n /**\n * Raised when the page is changed on a viewer configured with multiple image sources (see {@link OpenSeadragon.Viewer#goToPage}).\n *\n * @event page\n * @memberof OpenSeadragon.Viewer\n * @type {Object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Number} page - The page index.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'page', { page: page } );\n\n this._sequenceIndex = page;\n\n this._updateSequenceButtons( page );\n\n this.open( this.tileSources[ page ] );\n\n if( this.referenceStrip ){\n this.referenceStrip.setFocus( page );\n }\n }\n\n return this;\n },\n\n /**\n * Adds an html element as an overlay to the current viewport. Useful for\n * highlighting words or areas of interest on an image or other zoomable\n * interface. The overlays added via this method are removed when the viewport\n * is closed which include when changing page.\n * @method\n * @param {Element|String|Object} element - A reference to an element or an id for\n * the element which will be overlayed. Or an Object specifying the configuration for the overlay.\n * If using an object, see {@link OpenSeadragon.Overlay} for a list of\n * all available options.\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or\n * rectangle which will be overlayed. This is a viewport relative location.\n * @param {OpenSeadragon.Placement} placement - The position of the\n * viewport which the location coordinates will be treated as relative\n * to.\n * @param {function} onDraw - If supplied the callback is called when the overlay\n * needs to be drawn. It it the responsibility of the callback to do any drawing/positioning.\n * It is passed position, size and element.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:add-overlay\n */\n addOverlay: function( element, location, placement, onDraw ) {\n var options;\n if( $.isPlainObject( element ) ){\n options = element;\n } else {\n options = {\n element: element,\n location: location,\n placement: placement,\n onDraw: onDraw\n };\n }\n\n element = $.getElement( options.element );\n\n if ( getOverlayIndex( this.currentOverlays, element ) >= 0 ) {\n // they're trying to add a duplicate overlay\n return this;\n }\n\n var overlay = getOverlayObject( this, options);\n this.currentOverlays.push(overlay);\n overlay.drawHTML( this.overlaysContainer, this.viewport );\n\n /**\n * Raised when an overlay is added to the viewer (see {@link OpenSeadragon.Viewer#addOverlay}).\n *\n * @event add-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Element} element - The overlay element.\n * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location\n * @property {OpenSeadragon.Placement} placement\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'add-overlay', {\n element: element,\n location: options.location,\n placement: options.placement\n });\n return this;\n },\n\n /**\n * Updates the overlay represented by the reference to the element or\n * element id moving it to the new location, relative to the new placement.\n * @method\n * @param {Element|String} element - A reference to an element or an id for\n * the element which is overlayed.\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or\n * rectangle which will be overlayed. This is a viewport relative location.\n * @param {OpenSeadragon.Placement} placement - The position of the\n * viewport which the location coordinates will be treated as relative\n * to.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:update-overlay\n */\n updateOverlay: function( element, location, placement ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if ( i >= 0 ) {\n this.currentOverlays[ i ].update( location, placement );\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when an overlay's location or placement changes\n * (see {@link OpenSeadragon.Viewer#updateOverlay}).\n *\n * @event update-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the\n * Viewer which raised the event.\n * @property {Element} element\n * @property {OpenSeadragon.Point|OpenSeadragon.Rect} location\n * @property {OpenSeadragon.Placement} placement\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'update-overlay', {\n element: element,\n location: location,\n placement: placement\n });\n }\n return this;\n },\n\n /**\n * Removes an overlay identified by the reference element or element id\n * and schedules an update.\n * @method\n * @param {Element|String} element - A reference to the element or an\n * element id which represent the ovelay content to be removed.\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:remove-overlay\n */\n removeOverlay: function( element ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if ( i >= 0 ) {\n this.currentOverlays[ i ].destroy();\n this.currentOverlays.splice( i, 1 );\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when an overlay is removed from the viewer\n * (see {@link OpenSeadragon.Viewer#removeOverlay}).\n *\n * @event remove-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the\n * Viewer which raised the event.\n * @property {Element} element - The overlay element.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'remove-overlay', {\n element: element\n });\n }\n return this;\n },\n\n /**\n * Removes all currently configured Overlays from this Viewer and schedules\n * an update.\n * @method\n * @return {OpenSeadragon.Viewer} Chainable.\n * @fires OpenSeadragon.Viewer.event:clear-overlay\n */\n clearOverlays: function() {\n while ( this.currentOverlays.length > 0 ) {\n this.currentOverlays.pop().destroy();\n }\n THIS[ this.hash ].forceRedraw = true;\n /**\n * Raised when all overlays are removed from the viewer (see {@link OpenSeadragon.Drawer#clearOverlays}).\n *\n * @event clear-overlay\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'clear-overlay', {} );\n return this;\n },\n\n /**\n * Finds an overlay identified by the reference element or element id\n * and returns it as an object, return null if not found.\n * @method\n * @param {Element|String} element - A reference to the element or an\n * element id which represents the overlay content.\n * @return {OpenSeadragon.Overlay} the matching overlay or null if none found.\n */\n getOverlayById: function( element ) {\n var i;\n\n element = $.getElement( element );\n i = getOverlayIndex( this.currentOverlays, element );\n\n if (i>=0) {\n return this.currentOverlays[i];\n } else {\n return null;\n }\n },\n\n /**\n * Updates the sequence buttons.\n * @function OpenSeadragon.Viewer.prototype._updateSequenceButtons\n * @private\n * @param {Number} Sequence Value\n */\n _updateSequenceButtons: function( page ) {\n\n if ( this.nextButton ) {\n if(!this.tileSources || this.tileSources.length - 1 === page) {\n //Disable next button\n if ( !this.navPrevNextWrap ) {\n this.nextButton.disable();\n }\n } else {\n this.nextButton.enable();\n }\n }\n if ( this.previousButton ) {\n if ( page > 0 ) {\n //Enable previous button\n this.previousButton.enable();\n } else {\n if ( !this.navPrevNextWrap ) {\n this.previousButton.disable();\n }\n }\n }\n },\n\n /**\n * Display a message in the viewport\n * @function OpenSeadragon.Viewer.prototype._showMessage\n * @private\n * @param {String} text message\n */\n _showMessage: function ( message ) {\n this._hideMessage();\n\n var div = $.makeNeutralElement( \"div\" );\n div.appendChild( document.createTextNode( message ) );\n\n this.messageDiv = $.makeCenteredNode( div );\n\n $.addClass(this.messageDiv, \"openseadragon-message\");\n\n this.container.appendChild( this.messageDiv );\n },\n\n /**\n * Hide any currently displayed viewport message\n * @function OpenSeadragon.Viewer.prototype._hideMessage\n * @private\n */\n _hideMessage: function () {\n var div = this.messageDiv;\n if (div) {\n div.parentNode.removeChild(div);\n delete this.messageDiv;\n }\n },\n\n /**\n * Gets this viewer's gesture settings for the given pointer device type.\n * @method\n * @param {String} type - The pointer device type to get the gesture settings for (\"mouse\", \"touch\", \"pen\", etc.).\n * @return {OpenSeadragon.GestureSettings}\n */\n gestureSettingsByDeviceType: function ( type ) {\n switch ( type ) {\n case 'mouse':\n return this.gestureSettingsMouse;\n case 'touch':\n return this.gestureSettingsTouch;\n case 'pen':\n return this.gestureSettingsPen;\n default:\n return this.gestureSettingsUnknown;\n }\n },\n\n // private\n _drawOverlays: function() {\n var i,\n length = this.currentOverlays.length;\n for ( i = 0; i < length; i++ ) {\n this.currentOverlays[ i ].drawHTML( this.overlaysContainer, this.viewport );\n }\n },\n\n /**\n * Cancel the \"in flight\" images.\n */\n _cancelPendingImages: function() {\n this._loadQueue = [];\n }\n});\n\n\n/**\n * _getSafeElemSize is like getElementSize(), but refuses to return 0 for x or y,\n * which was causing some calling operations to return NaN.\n * @returns {Point}\n * @private\n */\nfunction _getSafeElemSize (oElement) {\n oElement = $.getElement( oElement );\n\n return new $.Point(\n (oElement.clientWidth === 0 ? 1 : oElement.clientWidth),\n (oElement.clientHeight === 0 ? 1 : oElement.clientHeight)\n );\n}\n\n/**\n * @function\n * @private\n */\nfunction getTileSourceImplementation( viewer, tileSource, successCallback,\n failCallback ) {\n var _this = viewer;\n\n //allow plain xml strings or json strings to be parsed here\n if ( $.type( tileSource ) == 'string' ) {\n if ( tileSource.match( /\\s*<.*/ ) ) {\n tileSource = $.parseXml( tileSource );\n } else if ( tileSource.match( /\\s*[\\{\\[].*/ ) ) {\n tileSource = $.parseJSON(tileSource);\n }\n }\n\n function waitUntilReady(tileSource, originalTileSource) {\n if (tileSource.ready) {\n successCallback(tileSource);\n } else {\n tileSource.addHandler('ready', function () {\n successCallback(tileSource);\n });\n tileSource.addHandler('open-failed', function (event) {\n failCallback({\n message: event.message,\n source: originalTileSource\n });\n });\n }\n }\n\n setTimeout( function() {\n if ( $.type( tileSource ) == 'string' ) {\n //If its still a string it means it must be a url at this point\n tileSource = new $.TileSource({\n url: tileSource,\n crossOriginPolicy: viewer.crossOriginPolicy,\n ajaxWithCredentials: viewer.ajaxWithCredentials,\n useCanvas: viewer.useCanvas,\n success: function( event ) {\n successCallback( event.tileSource );\n }\n });\n tileSource.addHandler( 'open-failed', function( event ) {\n failCallback( event );\n } );\n\n } else if ($.isPlainObject(tileSource) || tileSource.nodeType) {\n if (!tileSource.crossOriginPolicy && viewer.crossOriginPolicy) {\n tileSource.crossOriginPolicy = viewer.crossOriginPolicy;\n }\n if (tileSource.ajaxWithCredentials === undefined) {\n tileSource.ajaxWithCredentials = viewer.ajaxWithCredentials;\n }\n if (tileSource.useCanvas === undefined) {\n tileSource.useCanvas = viewer.useCanvas;\n }\n\n if ( $.isFunction( tileSource.getTileUrl ) ) {\n //Custom tile source\n var customTileSource = new $.TileSource( tileSource );\n customTileSource.getTileUrl = tileSource.getTileUrl;\n successCallback( customTileSource );\n } else {\n //inline configuration\n var $TileSource = $.TileSource.determineType( _this, tileSource );\n if ( !$TileSource ) {\n failCallback( {\n message: \"Unable to load TileSource\",\n source: tileSource\n });\n return;\n }\n var options = $TileSource.prototype.configure.apply( _this, [ tileSource ] );\n waitUntilReady(new $TileSource(options), tileSource);\n }\n } else {\n //can assume it's already a tile source implementation\n waitUntilReady(tileSource, tileSource);\n }\n });\n}\n\nfunction getOverlayObject( viewer, overlay ) {\n if ( overlay instanceof $.Overlay ) {\n return overlay;\n }\n\n var element = null;\n if ( overlay.element ) {\n element = $.getElement( overlay.element );\n } else {\n var id = overlay.id ?\n overlay.id :\n \"openseadragon-overlay-\" + Math.floor( Math.random() * 10000000 );\n\n element = $.getElement( overlay.id );\n if ( !element ) {\n element = document.createElement( \"a\" );\n element.href = \"#/overlay/\" + id;\n }\n element.id = id;\n $.addClass( element, overlay.className ?\n overlay.className :\n \"openseadragon-overlay\"\n );\n }\n\n var location = overlay.location;\n var width = overlay.width;\n var height = overlay.height;\n if (!location) {\n var x = overlay.x;\n var y = overlay.y;\n if (overlay.px !== undefined) {\n var rect = viewer.viewport.imageToViewportRectangle(new $.Rect(\n overlay.px,\n overlay.py,\n width || 0,\n height || 0));\n x = rect.x;\n y = rect.y;\n width = width !== undefined ? rect.width : undefined;\n height = height !== undefined ? rect.height : undefined;\n }\n location = new $.Point(x, y);\n }\n\n var placement = overlay.placement;\n if (placement && $.type(placement) === \"string\") {\n placement = $.Placement[overlay.placement.toUpperCase()];\n }\n\n return new $.Overlay({\n element: element,\n location: location,\n placement: placement,\n onDraw: overlay.onDraw,\n checkResize: overlay.checkResize,\n width: width,\n height: height,\n rotationMode: overlay.rotationMode\n });\n}\n\n/**\n * @private\n * @inner\n * Determines the index of the given overlay in the given overlays array.\n */\nfunction getOverlayIndex( overlays, element ) {\n var i;\n for ( i = overlays.length - 1; i >= 0; i-- ) {\n if ( overlays[ i ].element === element ) {\n return i;\n }\n }\n\n return -1;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// Schedulers provide the general engine for animation\n///////////////////////////////////////////////////////////////////////////////\nfunction scheduleUpdate( viewer, updateFunc ){\n return $.requestAnimationFrame( function(){\n updateFunc( viewer );\n } );\n}\n\n\n//provides a sequence in the fade animation\nfunction scheduleControlsFade( viewer ) {\n $.requestAnimationFrame( function(){\n updateControlsFade( viewer );\n });\n}\n\n\n//initiates an animation to hide the controls\nfunction beginControlsAutoHide( viewer ) {\n if ( !viewer.autoHideControls ) {\n return;\n }\n viewer.controlsShouldFade = true;\n viewer.controlsFadeBeginTime =\n $.now() +\n viewer.controlsFadeDelay;\n\n window.setTimeout( function(){\n scheduleControlsFade( viewer );\n }, viewer.controlsFadeDelay );\n}\n\n\n//determines if fade animation is done or continues the animation\nfunction updateControlsFade( viewer ) {\n var currentTime,\n deltaTime,\n opacity,\n i;\n if ( viewer.controlsShouldFade ) {\n currentTime = $.now();\n deltaTime = currentTime - viewer.controlsFadeBeginTime;\n opacity = 1.0 - deltaTime / viewer.controlsFadeLength;\n\n opacity = Math.min( 1.0, opacity );\n opacity = Math.max( 0.0, opacity );\n\n for ( i = viewer.controls.length - 1; i >= 0; i--) {\n if (viewer.controls[ i ].autoFade) {\n viewer.controls[ i ].setOpacity( opacity );\n }\n }\n\n if ( opacity > 0 ) {\n // fade again\n scheduleControlsFade( viewer );\n }\n }\n}\n\n\n//stop the fade animation on the controls and show them\nfunction abortControlsAutoHide( viewer ) {\n var i;\n viewer.controlsShouldFade = false;\n for ( i = viewer.controls.length - 1; i >= 0; i-- ) {\n viewer.controls[ i ].setOpacity( 1.0 );\n }\n}\n\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Default view event handlers.\n///////////////////////////////////////////////////////////////////////////////\nfunction onFocus(){\n abortControlsAutoHide( this );\n}\n\nfunction onBlur(){\n beginControlsAutoHide( this );\n\n}\n\nfunction onCanvasKeyDown( event ) {\n if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n switch( event.keyCode ){\n case 38://up arrow\n if ( event.shift ) {\n this.viewport.zoomBy(1.1);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40)));\n }\n this.viewport.applyConstraints();\n return false;\n case 40://down arrow\n if ( event.shift ) {\n this.viewport.zoomBy(0.9);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40)));\n }\n this.viewport.applyConstraints();\n return false;\n case 37://left arrow\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));\n this.viewport.applyConstraints();\n return false;\n case 39://right arrow\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));\n this.viewport.applyConstraints();\n return false;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n return true;\n }\n } else {\n return true;\n }\n}\n\nfunction onCanvasKeyPress( event ) {\n if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n switch( event.keyCode ){\n case 43://=|+\n case 61://=|+\n this.viewport.zoomBy(1.1);\n this.viewport.applyConstraints();\n return false;\n case 45://-|_\n this.viewport.zoomBy(0.9);\n this.viewport.applyConstraints();\n return false;\n case 48://0|)\n this.viewport.goHome();\n this.viewport.applyConstraints();\n return false;\n case 119://w\n case 87://W\n if ( event.shift ) {\n this.viewport.zoomBy(1.1);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40)));\n }\n this.viewport.applyConstraints();\n return false;\n case 115://s\n case 83://S\n if ( event.shift ) {\n this.viewport.zoomBy(0.9);\n } else {\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40)));\n }\n this.viewport.applyConstraints();\n return false;\n case 97://a\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));\n this.viewport.applyConstraints();\n return false;\n case 100://d\n this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));\n this.viewport.applyConstraints();\n return false;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n return true;\n }\n } else {\n return true;\n }\n}\n\nfunction onCanvasClick( event ) {\n var gestureSettings;\n\n var haveKeyboardFocus = document.activeElement == this.canvas;\n\n // If we don't have keyboard focus, request it.\n if ( !haveKeyboardFocus ) {\n this.canvas.focus();\n }\n\n if ( !event.preventDefaultAction && this.viewport && event.quick ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.clickToZoom ) {\n this.viewport.zoomBy(\n event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,\n this.viewport.pointFromPixel( event.position, true )\n );\n this.viewport.applyConstraints();\n }\n }\n /**\n * Raised when a mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-click\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-click', {\n tracker: event.eventSource,\n position: event.position,\n quick: event.quick,\n shift: event.shift,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasDblClick( event ) {\n var gestureSettings;\n\n if ( !event.preventDefaultAction && this.viewport ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.dblClickToZoom ) {\n this.viewport.zoomBy(\n event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,\n this.viewport.pointFromPixel( event.position, true )\n );\n this.viewport.applyConstraints();\n }\n }\n /**\n * Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-double-click\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-double-click', {\n tracker: event.eventSource,\n position: event.position,\n shift: event.shift,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasDrag( event ) {\n var gestureSettings;\n\n if ( !event.preventDefaultAction && this.viewport ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if( !this.panHorizontal ){\n event.delta.x = 0;\n }\n if( !this.panVertical ){\n event.delta.y = 0;\n }\n this.viewport.panBy( this.viewport.deltaPointsFromPixels( event.delta.negate() ), gestureSettings.flickEnabled );\n if( this.constrainDuringPan ){\n this.viewport.applyConstraints();\n }\n }\n /**\n * Raised when a mouse or touch drag operation occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-drag\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag.\n * @property {Number} speed - Current computed speed, in pixels per second.\n * @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-drag', {\n tracker: event.eventSource,\n position: event.position,\n delta: event.delta,\n speed: event.speed,\n direction: event.direction,\n shift: event.shift,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasDragEnd( event ) {\n if (!event.preventDefaultAction && this.viewport) {\n var gestureSettings = this.gestureSettingsByDeviceType(event.pointerType);\n if (gestureSettings.flickEnabled &&\n event.speed >= gestureSettings.flickMinSpeed) {\n var amplitudeX = 0;\n if (this.panHorizontal) {\n amplitudeX = gestureSettings.flickMomentum * event.speed *\n Math.cos(event.direction);\n }\n var amplitudeY = 0;\n if (this.panVertical) {\n amplitudeY = gestureSettings.flickMomentum * event.speed *\n Math.sin(event.direction);\n }\n var center = this.viewport.pixelFromPoint(\n this.viewport.getCenter(true));\n var target = this.viewport.pointFromPixel(\n new $.Point(center.x - amplitudeX, center.y - amplitudeY));\n this.viewport.panTo(target, false);\n }\n this.viewport.applyConstraints();\n }\n /**\n * Raised when a mouse or touch drag operation ends on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-drag-end\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} speed - Speed at the end of a drag gesture, in pixels per second.\n * @property {Number} direction - Direction at the end of a drag gesture, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('canvas-drag-end', {\n tracker: event.eventSource,\n position: event.position,\n speed: event.speed,\n direction: event.direction,\n shift: event.shift,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasEnter( event ) {\n /**\n * Raised when a pointer enters the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-enter\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. <span style=\"color:red;\">Deprecated. Use buttons instead.</span>\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-enter', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasExit( event ) {\n /**\n * Raised when a pointer leaves the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-exit\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. <span style=\"color:red;\">Deprecated. Use buttons instead.</span>\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-exit', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasPress( event ) {\n /**\n * Raised when the primary mouse button is pressed or touch starts on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-press\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-press', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n insideElementPressed: event.insideElementPressed,\n insideElementReleased: event.insideElementReleased,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasRelease( event ) {\n /**\n * Raised when the primary mouse button is released or touch ends on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-release\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} insideElementReleased - True if the cursor still inside the tracked element when the button was released.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-release', {\n tracker: event.eventSource,\n pointerType: event.pointerType,\n position: event.position,\n insideElementPressed: event.insideElementPressed,\n insideElementReleased: event.insideElementReleased,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasNonPrimaryPress( event ) {\n /**\n * Raised when any non-primary pointer button is pressed on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-nonprimary-press\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {Number} button - Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @property {Number} buttons - Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-nonprimary-press', {\n tracker: event.eventSource,\n position: event.position,\n pointerType: event.pointerType,\n button: event.button,\n buttons: event.buttons,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasNonPrimaryRelease( event ) {\n /**\n * Raised when any non-primary pointer button is released on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-nonprimary-release\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {String} pointerType - \"mouse\", \"touch\", \"pen\", etc.\n * @property {Number} button - Button which caused the event.\n * -1: none, 0: primary/left, 1: aux/middle, 2: secondary/right, 3: X1/back, 4: X2/forward, 5: pen eraser.\n * @property {Number} buttons - Current buttons pressed.\n * Combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-nonprimary-release', {\n tracker: event.eventSource,\n position: event.position,\n pointerType: event.pointerType,\n button: event.button,\n buttons: event.buttons,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onCanvasPinch( event ) {\n var gestureSettings,\n centerPt,\n lastCenterPt,\n panByPt;\n\n if ( !event.preventDefaultAction && this.viewport ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.pinchToZoom ) {\n centerPt = this.viewport.pointFromPixel( event.center, true );\n lastCenterPt = this.viewport.pointFromPixel( event.lastCenter, true );\n panByPt = lastCenterPt.minus( centerPt );\n if( !this.panHorizontal ) {\n panByPt.x = 0;\n }\n if( !this.panVertical ) {\n panByPt.y = 0;\n }\n this.viewport.zoomBy( event.distance / event.lastDistance, centerPt, true );\n this.viewport.panBy( panByPt, true );\n this.viewport.applyConstraints();\n }\n if ( gestureSettings.pinchRotate ) {\n // Pinch rotate\n var angle1 = Math.atan2(event.gesturePoints[0].currentPos.y - event.gesturePoints[1].currentPos.y,\n event.gesturePoints[0].currentPos.x - event.gesturePoints[1].currentPos.x);\n var angle2 = Math.atan2(event.gesturePoints[0].lastPos.y - event.gesturePoints[1].lastPos.y,\n event.gesturePoints[0].lastPos.x - event.gesturePoints[1].lastPos.x);\n this.viewport.setRotation(this.viewport.getRotation() + ((angle1 - angle2) * (180 / Math.PI)));\n }\n }\n /**\n * Raised when a pinch event occurs on the {@link OpenSeadragon.Viewer#canvas} element.\n *\n * @event canvas-pinch\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {Array.<OpenSeadragon.MouseTracker.GesturePoint>} gesturePoints - Gesture points associated with the gesture. Velocity data can be found here.\n * @property {OpenSeadragon.Point} lastCenter - The previous center point of the two pinch contact points relative to the tracked element.\n * @property {OpenSeadragon.Point} center - The center point of the two pinch contact points relative to the tracked element.\n * @property {Number} lastDistance - The previous distance between the two pinch contact points in CSS pixels.\n * @property {Number} distance - The distance between the two pinch contact points in CSS pixels.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('canvas-pinch', {\n tracker: event.eventSource,\n gesturePoints: event.gesturePoints,\n lastCenter: event.lastCenter,\n center: event.center,\n lastDistance: event.lastDistance,\n distance: event.distance,\n shift: event.shift,\n originalEvent: event.originalEvent\n });\n //cancels event\n return false;\n}\n\nfunction onCanvasScroll( event ) {\n var gestureSettings,\n factor,\n thisScrollTime,\n deltaScrollTime;\n\n /* Certain scroll devices fire the scroll event way too fast so we are injecting a simple adjustment to keep things\n * partially normalized. If we have already fired an event within the last 'minScrollDelta' milliseconds we skip\n * this one and wait for the next event. */\n thisScrollTime = $.now();\n deltaScrollTime = thisScrollTime - this._lastScrollTime;\n if (deltaScrollTime > this.minScrollDeltaTime) {\n this._lastScrollTime = thisScrollTime;\n\n if ( !event.preventDefaultAction && this.viewport ) {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if ( gestureSettings.scrollToZoom ) {\n factor = Math.pow( this.zoomPerScroll, event.scroll );\n this.viewport.zoomBy(\n factor,\n this.viewport.pointFromPixel( event.position, true )\n );\n this.viewport.applyConstraints();\n }\n }\n /**\n * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#canvas} element (mouse wheel).\n *\n * @event canvas-scroll\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} scroll - The scroll delta for the event.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'canvas-scroll', {\n tracker: event.eventSource,\n position: event.position,\n scroll: event.scroll,\n shift: event.shift,\n originalEvent: event.originalEvent\n });\n if (gestureSettings && gestureSettings.scrollToZoom) {\n //cancels event\n return false;\n }\n }\n else {\n gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );\n if (gestureSettings && gestureSettings.scrollToZoom) {\n return false; // We are swallowing this event\n }\n }\n}\n\nfunction onContainerEnter( event ) {\n THIS[ this.hash ].mouseInside = true;\n abortControlsAutoHide( this );\n /**\n * Raised when the cursor enters the {@link OpenSeadragon.Viewer#container} element.\n *\n * @event container-enter\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. <span style=\"color:red;\">Deprecated. Use buttons instead.</span>\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'container-enter', {\n tracker: event.eventSource,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\nfunction onContainerExit( event ) {\n if ( event.pointers < 1 ) {\n THIS[ this.hash ].mouseInside = false;\n if ( !THIS[ this.hash ].animating ) {\n beginControlsAutoHide( this );\n }\n }\n /**\n * Raised when the cursor leaves the {@link OpenSeadragon.Viewer#container} element.\n *\n * @event container-exit\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} buttons - Current buttons pressed. A combination of bit flags 0: none, 1: primary (or touch contact), 2: secondary, 4: aux (often middle), 8: X1 (often back), 16: X2 (often forward), 32: pen eraser.\n * @property {Number} pointers - Number of pointers (all types) active in the tracked element.\n * @property {Boolean} insideElementPressed - True if the left mouse button is currently being pressed and was initiated inside the tracked element, otherwise false.\n * @property {Boolean} buttonDownAny - Was the button down anywhere in the screen during the event. <span style=\"color:red;\">Deprecated. Use buttons instead.</span>\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'container-exit', {\n tracker: event.eventSource,\n position: event.position,\n buttons: event.buttons,\n pointers: event.pointers,\n insideElementPressed: event.insideElementPressed,\n buttonDownAny: event.buttonDownAny,\n originalEvent: event.originalEvent\n });\n}\n\n\n///////////////////////////////////////////////////////////////////////////////\n// Page update routines ( aka Views - for future reference )\n///////////////////////////////////////////////////////////////////////////////\n\nfunction updateMulti( viewer ) {\n updateOnce( viewer );\n\n // Request the next frame, unless we've been closed\n if ( viewer.isOpen() ) {\n viewer._updateRequestId = scheduleUpdate( viewer, updateMulti );\n } else {\n viewer._updateRequestId = false;\n }\n}\n\nfunction updateOnce( viewer ) {\n\n //viewer.profiler.beginUpdate();\n\n if (viewer._opening) {\n return;\n }\n\n if (viewer.autoResize) {\n var containerSize = _getSafeElemSize(viewer.container);\n var prevContainerSize = THIS[viewer.hash].prevContainerSize;\n if (!containerSize.equals(prevContainerSize)) {\n var viewport = viewer.viewport;\n if (viewer.preserveImageSizeOnResize) {\n var resizeRatio = prevContainerSize.x / containerSize.x;\n var zoom = viewport.getZoom() * resizeRatio;\n var center = viewport.getCenter();\n viewport.resize(containerSize, false);\n viewport.zoomTo(zoom, null, true);\n viewport.panTo(center, true);\n } else {\n // maintain image position\n var oldBounds = viewport.getBounds();\n viewport.resize(containerSize, true);\n viewport.fitBoundsWithConstraints(oldBounds, true);\n }\n THIS[viewer.hash].prevContainerSize = containerSize;\n THIS[viewer.hash].forceRedraw = true;\n }\n }\n\n var viewportChange = viewer.viewport.update();\n var animated = viewer.world.update() || viewportChange;\n\n if (viewportChange) {\n /**\n * Raised when any spring animation update occurs (zoom, pan, etc.),\n * before the viewer has drawn the new location.\n *\n * @event viewport-change\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent('viewport-change');\n }\n\n if( viewer.referenceStrip ){\n animated = viewer.referenceStrip.update( viewer.viewport ) || animated;\n }\n\n if ( !THIS[ viewer.hash ].animating && animated ) {\n /**\n * Raised when any spring animation starts (zoom, pan, etc.).\n *\n * @event animation-start\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation-start\" );\n abortControlsAutoHide( viewer );\n }\n\n if ( animated || THIS[ viewer.hash ].forceRedraw || viewer.world.needsDraw() ) {\n drawWorld( viewer );\n viewer._drawOverlays();\n if( viewer.navigator ){\n viewer.navigator.update( viewer.viewport );\n }\n\n THIS[ viewer.hash ].forceRedraw = false;\n\n if (animated) {\n /**\n * Raised when any spring animation update occurs (zoom, pan, etc.),\n * after the viewer has drawn the new location.\n *\n * @event animation\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation\" );\n }\n }\n\n if ( THIS[ viewer.hash ].animating && !animated ) {\n /**\n * Raised when any spring animation ends (zoom, pan, etc.).\n *\n * @event animation-finish\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( \"animation-finish\" );\n\n if ( !THIS[ viewer.hash ].mouseInside ) {\n beginControlsAutoHide( viewer );\n }\n }\n\n THIS[ viewer.hash ].animating = animated;\n\n //viewer.profiler.endUpdate();\n}\n\nfunction drawWorld( viewer ) {\n viewer.imageLoader.clear();\n viewer.drawer.clear();\n viewer.world.draw();\n\n /**\n * <em>- Needs documentation -</em>\n *\n * @event update-viewport\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n viewer.raiseEvent( 'update-viewport', {} );\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// Navigation Controls\n///////////////////////////////////////////////////////////////////////////////\nfunction resolveUrl( prefix, url ) {\n return prefix ? prefix + url : url;\n}\n\n\n\nfunction beginZoomingIn() {\n THIS[ this.hash ].lastZoomTime = $.now();\n THIS[ this.hash ].zoomFactor = this.zoomPerSecond;\n THIS[ this.hash ].zooming = true;\n scheduleZoom( this );\n}\n\n\nfunction beginZoomingOut() {\n THIS[ this.hash ].lastZoomTime = $.now();\n THIS[ this.hash ].zoomFactor = 1.0 / this.zoomPerSecond;\n THIS[ this.hash ].zooming = true;\n scheduleZoom( this );\n}\n\n\nfunction endZooming() {\n THIS[ this.hash ].zooming = false;\n}\n\n\nfunction scheduleZoom( viewer ) {\n $.requestAnimationFrame( $.delegate( viewer, doZoom ) );\n}\n\n\nfunction doZoom() {\n var currentTime,\n deltaTime,\n adjustedFactor;\n\n if ( THIS[ this.hash ].zooming && this.viewport) {\n currentTime = $.now();\n deltaTime = currentTime - THIS[ this.hash ].lastZoomTime;\n adjustedFactor = Math.pow( THIS[ this.hash ].zoomFactor, deltaTime / 1000 );\n\n this.viewport.zoomBy( adjustedFactor );\n this.viewport.applyConstraints();\n THIS[ this.hash ].lastZoomTime = currentTime;\n scheduleZoom( this );\n }\n}\n\n\nfunction doSingleZoomIn() {\n if ( this.viewport ) {\n THIS[ this.hash ].zooming = false;\n this.viewport.zoomBy(\n this.zoomPerClick / 1.0\n );\n this.viewport.applyConstraints();\n }\n}\n\n\nfunction doSingleZoomOut() {\n if ( this.viewport ) {\n THIS[ this.hash ].zooming = false;\n this.viewport.zoomBy(\n 1.0 / this.zoomPerClick\n );\n this.viewport.applyConstraints();\n }\n}\n\n\nfunction lightUp() {\n this.buttons.emulateEnter();\n this.buttons.emulateExit();\n}\n\n\nfunction onHome() {\n if ( this.viewport ) {\n this.viewport.goHome();\n }\n}\n\n\nfunction onFullScreen() {\n if ( this.isFullPage() && !$.isFullScreen() ) {\n // Is fullPage but not fullScreen\n this.setFullPage( false );\n } else {\n this.setFullScreen( !this.isFullPage() );\n }\n // correct for no mouseout event on change\n if ( this.buttons ) {\n this.buttons.emulateExit();\n }\n this.fullPageButton.element.focus();\n if ( this.viewport ) {\n this.viewport.applyConstraints();\n }\n}\n\n/**\n * Note: The current rotation feature is limited to 90 degree turns.\n */\nfunction onRotateLeft() {\n if ( this.viewport ) {\n var currRotation = this.viewport.getRotation();\n if (currRotation === 0) {\n currRotation = 270;\n }\n else {\n currRotation -= 90;\n }\n this.viewport.setRotation(currRotation);\n }\n}\n\n/**\n * Note: The current rotation feature is limited to 90 degree turns.\n */\nfunction onRotateRight() {\n if ( this.viewport ) {\n var currRotation = this.viewport.getRotation();\n if (currRotation === 270) {\n currRotation = 0;\n }\n else {\n currRotation += 90;\n }\n this.viewport.setRotation(currRotation);\n }\n}\n\n\nfunction onPrevious(){\n var previous = this._sequenceIndex - 1;\n if(this.navPrevNextWrap && previous < 0){\n previous += this.tileSources.length;\n }\n this.goToPage( previous );\n}\n\n\nfunction onNext(){\n var next = this._sequenceIndex + 1;\n if(this.navPrevNextWrap && next >= this.tileSources.length){\n next = 0;\n }\n this.goToPage( next );\n}\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Navigator\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Navigator\n * @classdesc The Navigator provides a small view of the current image as fixed\n * while representing the viewport as a moving box serving as a frame\n * of reference in the larger viewport as to which portion of the image\n * is currently being examined. The navigator's viewport can be interacted\n * with using the keyboard or the mouse.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.Viewer\n * @extends OpenSeadragon.EventSource\n * @param {Object} options\n */\n$.Navigator = function( options ){\n\n var viewer = options.viewer,\n _this = this,\n viewerSize,\n navigatorSize;\n\n //We may need to create a new element and id if they did not\n //provide the id for the existing element\n if( !options.id ){\n options.id = 'navigator-' + $.now();\n this.element = $.makeNeutralElement( \"div\" );\n options.controlOptions = {\n anchor: $.ControlAnchor.TOP_RIGHT,\n attachToViewer: true,\n autoFade: options.autoFade\n };\n\n if( options.position ){\n if( 'BOTTOM_RIGHT' == options.position ){\n options.controlOptions.anchor = $.ControlAnchor.BOTTOM_RIGHT;\n } else if( 'BOTTOM_LEFT' == options.position ){\n options.controlOptions.anchor = $.ControlAnchor.BOTTOM_LEFT;\n } else if( 'TOP_RIGHT' == options.position ){\n options.controlOptions.anchor = $.ControlAnchor.TOP_RIGHT;\n } else if( 'TOP_LEFT' == options.position ){\n options.controlOptions.anchor = $.ControlAnchor.TOP_LEFT;\n } else if( 'ABSOLUTE' == options.position ){\n options.controlOptions.anchor = $.ControlAnchor.ABSOLUTE;\n options.controlOptions.top = options.top;\n options.controlOptions.left = options.left;\n options.controlOptions.height = options.height;\n options.controlOptions.width = options.width;\n }\n }\n\n } else {\n this.element = document.getElementById( options.id );\n options.controlOptions = {\n anchor: $.ControlAnchor.NONE,\n attachToViewer: false,\n autoFade: false\n };\n }\n this.element.id = options.id;\n this.element.className += ' navigator';\n\n options = $.extend( true, {\n sizeRatio: $.DEFAULT_SETTINGS.navigatorSizeRatio\n }, options, {\n element: this.element,\n tabIndex: -1, // No keyboard navigation, omit from tab order\n //These need to be overridden to prevent recursion since\n //the navigator is a viewer and a viewer has a navigator\n showNavigator: false,\n mouseNavEnabled: false,\n showNavigationControl: false,\n showSequenceControl: false,\n immediateRender: true,\n blendTime: 0,\n animationTime: 0,\n autoResize: options.autoResize,\n // prevent resizing the navigator from adding unwanted space around the image\n minZoomImageRatio: 1.0\n });\n\n options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;\n\n $.setElementTouchActionNone( this.element );\n\n this.borderWidth = 2;\n //At some browser magnification levels the display regions lines up correctly, but at some there appears to\n //be a one pixel gap.\n this.fudge = new $.Point(1, 1);\n this.totalBorderWidths = new $.Point(this.borderWidth*2, this.borderWidth*2).minus(this.fudge);\n\n\n if ( options.controlOptions.anchor != $.ControlAnchor.NONE ) {\n (function( style, borderWidth ){\n style.margin = '0px';\n style.border = borderWidth + 'px solid #555';\n style.padding = '0px';\n style.background = '#000';\n style.opacity = 0.8;\n style.overflow = 'hidden';\n }( this.element.style, this.borderWidth));\n }\n\n this.displayRegion = $.makeNeutralElement( \"div\" );\n this.displayRegion.id = this.element.id + '-displayregion';\n this.displayRegion.className = 'displayregion';\n\n (function( style, borderWidth ){\n style.position = 'relative';\n style.top = '0px';\n style.left = '0px';\n style.fontSize = '0px';\n style.overflow = 'hidden';\n style.border = borderWidth + 'px solid #900';\n style.margin = '0px';\n style.padding = '0px';\n //TODO: IE doesnt like this property being set\n //try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/}\n\n style.background = 'transparent';\n\n // We use square bracket notation on the statement below, because float is a keyword.\n // This is important for the Google Closure compiler, if nothing else.\n /*jshint sub:true */\n style['float'] = 'left'; //Webkit\n\n style.cssFloat = 'left'; //Firefox\n style.styleFloat = 'left'; //IE\n style.zIndex = 999999999;\n style.cursor = 'default';\n }( this.displayRegion.style, this.borderWidth ));\n\n this.displayRegionContainer = $.makeNeutralElement(\"div\");\n this.displayRegionContainer.id = this.element.id + '-displayregioncontainer';\n this.displayRegionContainer.className = \"displayregioncontainer\";\n this.displayRegionContainer.style.width = \"100%\";\n this.displayRegionContainer.style.height = \"100%\";\n\n viewer.addControl(\n this.element,\n options.controlOptions\n );\n\n this._resizeWithViewer = options.controlOptions.anchor != $.ControlAnchor.ABSOLUTE &&\n options.controlOptions.anchor != $.ControlAnchor.NONE;\n\n if ( this._resizeWithViewer ) {\n if ( options.width && options.height ) {\n this.element.style.height = typeof ( options.height ) == \"number\" ? ( options.height + 'px' ) : options.height;\n this.element.style.width = typeof ( options.width ) == \"number\" ? ( options.width + 'px' ) : options.width;\n } else {\n viewerSize = $.getElementSize( viewer.element );\n this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px';\n this.element.style.width = Math.round( viewerSize.x * options.sizeRatio ) + 'px';\n this.oldViewerSize = viewerSize;\n }\n navigatorSize = $.getElementSize( this.element );\n this.elementArea = navigatorSize.x * navigatorSize.y;\n }\n\n this.oldContainerSize = new $.Point( 0, 0 );\n\n $.Viewer.apply( this, [ options ] );\n\n this.displayRegionContainer.appendChild(this.displayRegion);\n this.element.getElementsByTagName('div')[0].appendChild(this.displayRegionContainer);\n\n function rotate(degrees) {\n _setTransformRotate(_this.displayRegionContainer, degrees);\n _setTransformRotate(_this.displayRegion, -degrees);\n _this.viewport.setRotation(degrees);\n }\n if (options.navigatorRotate) {\n var degrees = options.viewer.viewport ?\n options.viewer.viewport.getRotation() :\n options.viewer.degrees || 0;\n rotate(degrees);\n options.viewer.addHandler(\"rotate\", function (args) {\n rotate(args.degrees);\n });\n }\n\n // Remove the base class' (Viewer's) innerTracker and replace it with our own\n this.innerTracker.destroy();\n this.innerTracker = new $.MouseTracker({\n element: this.element,\n dragHandler: $.delegate( this, onCanvasDrag ),\n clickHandler: $.delegate( this, onCanvasClick ),\n releaseHandler: $.delegate( this, onCanvasRelease ),\n scrollHandler: $.delegate( this, onCanvasScroll )\n });\n\n this.addHandler(\"reset-size\", function() {\n if (_this.viewport) {\n _this.viewport.goHome(true);\n }\n });\n\n viewer.world.addHandler(\"item-index-change\", function(event) {\n var item = _this.world.getItemAt(event.previousIndex);\n _this.world.setItemIndex(item, event.newIndex);\n });\n\n viewer.world.addHandler(\"remove-item\", function(event) {\n var theirItem = event.item;\n var myItem = _this._getMatchingItem(theirItem);\n if (myItem) {\n _this.world.removeItem(myItem);\n }\n });\n\n this.update(viewer.viewport);\n};\n\n$.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.Navigator.prototype */{\n\n /**\n * Used to notify the navigator when its size has changed.\n * Especially useful when {@link OpenSeadragon.Options}.navigatorAutoResize is set to false and the navigator is resizable.\n * @function\n */\n updateSize: function () {\n if ( this.viewport ) {\n var containerSize = new $.Point(\n (this.container.clientWidth === 0 ? 1 : this.container.clientWidth),\n (this.container.clientHeight === 0 ? 1 : this.container.clientHeight)\n );\n\n if ( !containerSize.equals( this.oldContainerSize ) ) {\n this.viewport.resize( containerSize, true );\n this.viewport.goHome(true);\n this.oldContainerSize = containerSize;\n this.drawer.clear();\n this.world.draw();\n }\n }\n },\n\n /**\n * Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs.\n * @function\n * @param {OpenSeadragon.Viewport} The viewport this navigator is tracking.\n */\n update: function( viewport ) {\n\n var viewerSize,\n newWidth,\n newHeight,\n bounds,\n topleft,\n bottomright;\n\n viewerSize = $.getElementSize( this.viewer.element );\n if ( this._resizeWithViewer && viewerSize.x && viewerSize.y && !viewerSize.equals( this.oldViewerSize ) ) {\n this.oldViewerSize = viewerSize;\n\n if ( this.maintainSizeRatio || !this.elementArea) {\n newWidth = viewerSize.x * this.sizeRatio;\n newHeight = viewerSize.y * this.sizeRatio;\n } else {\n newWidth = Math.sqrt(this.elementArea * (viewerSize.x / viewerSize.y));\n newHeight = this.elementArea / newWidth;\n }\n\n this.element.style.width = Math.round( newWidth ) + 'px';\n this.element.style.height = Math.round( newHeight ) + 'px';\n\n if (!this.elementArea) {\n this.elementArea = newWidth * newHeight;\n }\n\n this.updateSize();\n }\n\n if (viewport && this.viewport) {\n bounds = viewport.getBoundsNoRotate(true);\n topleft = this.viewport.pixelFromPointNoRotate(bounds.getTopLeft(), false);\n bottomright = this.viewport.pixelFromPointNoRotate(bounds.getBottomRight(), false)\n .minus( this.totalBorderWidths );\n\n //update style for navigator-box\n var style = this.displayRegion.style;\n style.display = this.world.getItemCount() ? 'block' : 'none';\n\n style.top = Math.round( topleft.y ) + 'px';\n style.left = Math.round( topleft.x ) + 'px';\n\n var width = Math.abs( topleft.x - bottomright.x );\n var height = Math.abs( topleft.y - bottomright.y );\n // make sure width and height are non-negative so IE doesn't throw\n style.width = Math.round( Math.max( width, 0 ) ) + 'px';\n style.height = Math.round( Math.max( height, 0 ) ) + 'px';\n }\n\n },\n\n // overrides Viewer.addTiledImage\n addTiledImage: function(options) {\n var _this = this;\n\n var original = options.originalTiledImage;\n delete options.original;\n\n var optionsClone = $.extend({}, options, {\n success: function(event) {\n var myItem = event.item;\n myItem._originalForNavigator = original;\n _this._matchBounds(myItem, original, true);\n\n original.addHandler('bounds-change', function() {\n _this._matchBounds(myItem, original);\n });\n }\n });\n\n return $.Viewer.prototype.addTiledImage.apply(this, [optionsClone]);\n },\n\n // private\n _getMatchingItem: function(theirItem) {\n var count = this.world.getItemCount();\n var item;\n for (var i = 0; i < count; i++) {\n item = this.world.getItemAt(i);\n if (item._originalForNavigator === theirItem) {\n return item;\n }\n }\n\n return null;\n },\n\n // private\n _matchBounds: function(myItem, theirItem, immediately) {\n var bounds = theirItem.getBounds();\n myItem.setPosition(bounds.getTopLeft(), immediately);\n myItem.setWidth(bounds.width, immediately);\n }\n});\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasClick( event ) {\n if ( event.quick && this.viewer.viewport ) {\n this.viewer.viewport.panTo(this.viewport.pointFromPixel(event.position));\n this.viewer.viewport.applyConstraints();\n }\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasDrag( event ) {\n if ( this.viewer.viewport ) {\n if( !this.panHorizontal ){\n event.delta.x = 0;\n }\n if( !this.panVertical ){\n event.delta.y = 0;\n }\n this.viewer.viewport.panBy(\n this.viewport.deltaPointsFromPixels(\n event.delta\n )\n );\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasRelease( event ) {\n if ( event.insideElementPressed && this.viewer.viewport ) {\n this.viewer.viewport.applyConstraints();\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onCanvasScroll( event ) {\n /**\n * Raised when a scroll event occurs on the {@link OpenSeadragon.Viewer#navigator} element (mouse wheel, touch pinch, etc.).\n *\n * @event navigator-scroll\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.\n * @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.\n * @property {Number} scroll - The scroll delta for the event.\n * @property {Boolean} shift - True if the shift key was pressed during this event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'navigator-scroll', {\n tracker: event.eventSource,\n position: event.position,\n scroll: event.scroll,\n shift: event.shift,\n originalEvent: event.originalEvent\n });\n\n //dont scroll the page up and down if the user is scrolling\n //in the navigator\n return false;\n}\n\n/**\n * @function\n * @private\n * @param {Object} element\n * @param {Number} degrees\n */\nfunction _setTransformRotate (element, degrees) {\n element.style.webkitTransform = \"rotate(\" + degrees + \"deg)\";\n element.style.mozTransform = \"rotate(\" + degrees + \"deg)\";\n element.style.msTransform = \"rotate(\" + degrees + \"deg)\";\n element.style.oTransform = \"rotate(\" + degrees + \"deg)\";\n element.style.transform = \"rotate(\" + degrees + \"deg)\";\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - getString/setString\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n//TODO: I guess this is where the i18n needs to be reimplemented. I'll look\n// into existing patterns for i18n in javascript but i think that mimicking\n// pythons gettext might be a reasonable approach.\nvar I18N = {\n Errors: {\n Dzc: \"Sorry, we don't support Deep Zoom Collections!\",\n Dzi: \"Hmm, this doesn't appear to be a valid Deep Zoom Image.\",\n Xml: \"Hmm, this doesn't appear to be a valid Deep Zoom Image.\",\n ImageFormat: \"Sorry, we don't support {0}-based Deep Zoom Images.\",\n Security: \"It looks like a security restriction stopped us from \" +\n \"loading this Deep Zoom Image.\",\n Status: \"This space unintentionally left blank ({0} {1}).\",\n OpenFailed: \"Unable to open {0}: {1}\"\n },\n\n Tooltips: {\n FullPage: \"Toggle full page\",\n Home: \"Go home\",\n ZoomIn: \"Zoom in\",\n ZoomOut: \"Zoom out\",\n NextPage: \"Next page\",\n PreviousPage: \"Previous page\",\n RotateLeft: \"Rotate left\",\n RotateRight: \"Rotate right\"\n }\n};\n\n$.extend( $, /** @lends OpenSeadragon */{\n\n /**\n * @function\n * @param {String} property\n */\n getString: function( prop ) {\n\n var props = prop.split('.'),\n string = null,\n args = arguments,\n container = I18N,\n i;\n\n for ( i = 0; i < props.length-1; i++ ) {\n // in case not a subproperty\n container = container[ props[ i ] ] || {};\n }\n string = container[ props[ i ] ];\n\n if ( typeof( string ) != \"string\" ) {\n $.console.debug( \"Untranslated source string:\", prop );\n string = \"\"; // FIXME: this breaks gettext()-style convention, which would return source\n }\n\n return string.replace(/\\{\\d+\\}/g, function(capture) {\n var i = parseInt( capture.match( /\\d+/ ), 10 ) + 1;\n return i < args.length ?\n args[ i ] :\n \"\";\n });\n },\n\n /**\n * @function\n * @param {String} property\n * @param {*} value\n */\n setString: function( prop, value ) {\n\n var props = prop.split('.'),\n container = I18N,\n i;\n\n for ( i = 0; i < props.length - 1; i++ ) {\n if ( !container[ props[ i ] ] ) {\n container[ props[ i ] ] = {};\n }\n container = container[ props[ i ] ];\n }\n\n container[ props[ i ] ] = value;\n }\n\n});\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Point\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Point\n * @classdesc A Point is really used as a 2-dimensional vector, equally useful for\n * representing a point on a plane, or the height and width of a plane\n * not requiring any other frame of reference.\n *\n * @memberof OpenSeadragon\n * @param {Number} [x] The vector component 'x'. Defaults to the origin at 0.\n * @param {Number} [y] The vector component 'y'. Defaults to the origin at 0.\n */\n$.Point = function( x, y ) {\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Point#\n */\n this.x = typeof ( x ) == \"number\" ? x : 0;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Point#\n */\n this.y = typeof ( y ) == \"number\" ? y : 0;\n};\n\n/** @lends OpenSeadragon.Point.prototype */\n$.Point.prototype = {\n /**\n * @function\n * @returns {OpenSeadragon.Point} a duplicate of this Point\n */\n clone: function() {\n return new $.Point(this.x, this.y);\n },\n\n /**\n * Add another Point to this point and return a new Point.\n * @function\n * @param {OpenSeadragon.Point} point The point to add vector components.\n * @returns {OpenSeadragon.Point} A new point representing the sum of the\n * vector components\n */\n plus: function( point ) {\n return new $.Point(\n this.x + point.x,\n this.y + point.y\n );\n },\n\n /**\n * Substract another Point to this point and return a new Point.\n * @function\n * @param {OpenSeadragon.Point} point The point to substract vector components.\n * @returns {OpenSeadragon.Point} A new point representing the substraction of the\n * vector components\n */\n minus: function( point ) {\n return new $.Point(\n this.x - point.x,\n this.y - point.y\n );\n },\n\n /**\n * Multiply this point by a factor and return a new Point.\n * @function\n * @param {Number} factor The factor to multiply vector components.\n * @returns {OpenSeadragon.Point} A new point representing the multiplication\n * of the vector components by the factor\n */\n times: function( factor ) {\n return new $.Point(\n this.x * factor,\n this.y * factor\n );\n },\n\n /**\n * Divide this point by a factor and return a new Point.\n * @function\n * @param {Number} factor The factor to divide vector components.\n * @returns {OpenSeadragon.Point} A new point representing the division of the\n * vector components by the factor\n */\n divide: function( factor ) {\n return new $.Point(\n this.x / factor,\n this.y / factor\n );\n },\n\n /**\n * Compute the opposite of this point and return a new Point.\n * @function\n * @returns {OpenSeadragon.Point} A new point representing the opposite of the\n * vector components\n */\n negate: function() {\n return new $.Point( -this.x, -this.y );\n },\n\n /**\n * Compute the distance between this point and another point.\n * @function\n * @param {OpenSeadragon.Point} point The point to compute the distance with.\n * @returns {Number} The distance between the 2 points\n */\n distanceTo: function( point ) {\n return Math.sqrt(\n Math.pow( this.x - point.x, 2 ) +\n Math.pow( this.y - point.y, 2 )\n );\n },\n\n /**\n * Apply a function to each coordinate of this point and return a new point.\n * @function\n * @param {function} func The function to apply to each coordinate.\n * @returns {OpenSeadragon.Point} A new point with the coordinates computed\n * by the specified function\n */\n apply: function( func ) {\n return new $.Point( func( this.x ), func( this.y ) );\n },\n\n /**\n * Check if this point is equal to another one.\n * @function\n * @param {OpenSeadragon.Point} point The point to compare this point with.\n * @returns {Boolean} true if they are equal, false otherwise.\n */\n equals: function( point ) {\n return (\n point instanceof $.Point\n ) && (\n this.x === point.x\n ) && (\n this.y === point.y\n );\n },\n\n /**\n * Rotates the point around the specified pivot\n * From http://stackoverflow.com/questions/4465931/rotate-rectangle-around-a-point\n * @function\n * @param {Number} degress to rotate around the pivot.\n * @param {OpenSeadragon.Point} [pivot=(0,0)] Point around which to rotate.\n * Defaults to the origin.\n * @returns {OpenSeadragon.Point}. A new point representing the point rotated around the specified pivot\n */\n rotate: function (degrees, pivot) {\n pivot = pivot || new $.Point(0, 0);\n var cos;\n var sin;\n // Avoid float computations when possible\n if (degrees % 90 === 0) {\n var d = degrees % 360;\n if (d < 0) {\n d += 360;\n }\n switch (d) {\n case 0:\n cos = 1;\n sin = 0;\n break;\n case 90:\n cos = 0;\n sin = 1;\n break;\n case 180:\n cos = -1;\n sin = 0;\n break;\n case 270:\n cos = 0;\n sin = -1;\n break;\n }\n } else {\n var angle = degrees * Math.PI / 180.0;\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n }\n var x = cos * (this.x - pivot.x) - sin * (this.y - pivot.y) + pivot.x;\n var y = sin * (this.x - pivot.x) + cos * (this.y - pivot.y) + pivot.y;\n return new $.Point(x, y);\n },\n\n /**\n * Convert this point to a string in the format (x,y) where x and y are\n * rounded to the nearest integer.\n * @function\n * @returns {String} A string representation of this point.\n */\n toString: function() {\n return \"(\" + (Math.round(this.x * 100) / 100) + \",\" + (Math.round(this.y * 100) / 100) + \")\";\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n\n/**\n * @class TileSource\n * @classdesc The TileSource contains the most basic implementation required to create a\n * smooth transition between layers in an image pyramid. It has only a single key\n * interface that must be implemented to complete its key functionality:\n * 'getTileUrl'. It also has several optional interfaces that can be\n * implemented if a new TileSource wishes to support configuration via a simple\n * object or array ('configure') and if the tile source supports or requires\n * configuration via retrieval of a document on the network ala AJAX or JSONP,\n * ('getImageInfo').\n * <br/>\n * By default the image pyramid is split into N layers where the image's longest\n * side in M (in pixels), where N is the smallest integer which satisfies\n * <strong>2^(N+1) >= M</strong>.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @param {Object} options\n * You can either specify a URL, or literally define the TileSource (by specifying\n * width, height, tileSize, tileOverlap, minLevel, and maxLevel). For the former,\n * the extending class is expected to implement 'getImageInfo' and 'configure'.\n * For the latter, the construction is assumed to occur through\n * the extending classes implementation of 'configure'.\n * @param {String} [options.url]\n * The URL for the data necessary for this TileSource.\n * @param {Function} [options.success]\n * A function to be called upon successful creation.\n * @param {Boolean} [options.ajaxWithCredentials]\n * If this TileSource needs to make an AJAX call, this specifies whether to set\n * the XHR's withCredentials (for accessing secure data).\n * @param {Number} [options.width]\n * Width of the source image at max resolution in pixels.\n * @param {Number} [options.height]\n * Height of the source image at max resolution in pixels.\n * @param {Number} [options.tileSize]\n * The size of the tiles to assumed to make up each pyramid layer in pixels.\n * Tile size determines the point at which the image pyramid must be\n * divided into a matrix of smaller images.\n * Use options.tileWidth and options.tileHeight to support non-square tiles.\n * @param {Number} [options.tileWidth]\n * The width of the tiles to assumed to make up each pyramid layer in pixels.\n * @param {Number} [options.tileHeight]\n * The height of the tiles to assumed to make up each pyramid layer in pixels.\n * @param {Number} [options.tileOverlap]\n * The number of pixels each tile is expected to overlap touching tiles.\n * @param {Number} [options.minLevel]\n * The minimum level to attempt to load.\n * @param {Number} [options.maxLevel]\n * The maximum level to attempt to load.\n */\n$.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) {\n var _this = this;\n\n var args = arguments,\n options,\n i;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: args[0],\n height: args[1],\n tileSize: args[2],\n tileOverlap: args[3],\n minLevel: args[4],\n maxLevel: args[5]\n };\n }\n\n //Tile sources supply some events, namely 'ready' when they must be configured\n //by asynchronously fetching their configuration data.\n $.EventSource.call( this );\n\n //we allow options to override anything we dont treat as\n //required via idiomatic options or which is functionally\n //set depending on the state of the readiness of this tile\n //source\n $.extend( true, this, options );\n\n if (!this.success) {\n //Any functions that are passed as arguments are bound to the ready callback\n for ( i = 0; i < arguments.length; i++ ) {\n if ( $.isFunction( arguments[ i ] ) ) {\n this.success = arguments[ i ];\n //only one callback per constructor\n break;\n }\n }\n }\n\n if (this.success) {\n this.addHandler( 'ready', function ( event ) {\n _this.success( event );\n } );\n }\n\n /**\n * Ratio of width to height\n * @member {Number} aspectRatio\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * Vector storing x and y dimensions ( width and height respectively ).\n * @member {OpenSeadragon.Point} dimensions\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The overlap in pixels each tile shares with its adjacent neighbors.\n * @member {Number} tileOverlap\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The minimum pyramid level this tile source supports or should attempt to load.\n * @member {Number} minLevel\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n * The maximum pyramid level this tile source supports or should attempt to load.\n * @member {Number} maxLevel\n * @memberof OpenSeadragon.TileSource#\n */\n /**\n *\n * @member {Boolean} ready\n * @memberof OpenSeadragon.TileSource#\n */\n\n if( 'string' == $.type( arguments[ 0 ] ) ){\n this.url = arguments[0];\n }\n\n if (this.url) {\n //in case the getImageInfo method is overriden and/or implies an\n //async mechanism set some safe defaults first\n this.aspectRatio = 1;\n this.dimensions = new $.Point( 10, 10 );\n this._tileWidth = 0;\n this._tileHeight = 0;\n this.tileOverlap = 0;\n this.minLevel = 0;\n this.maxLevel = 0;\n this.ready = false;\n //configuration via url implies the extending class\n //implements and 'configure'\n this.getImageInfo( this.url );\n\n } else {\n\n //explicit configuration via positional args in constructor\n //or the more idiomatic 'options' object\n this.ready = true;\n this.aspectRatio = ( options.width && options.height ) ?\n ( options.width / options.height ) : 1;\n this.dimensions = new $.Point( options.width, options.height );\n\n if ( this.tileSize ){\n this._tileWidth = this._tileHeight = this.tileSize;\n delete this.tileSize;\n } else {\n if( this.tileWidth ){\n // We were passed tileWidth in options, but we want to rename it\n // with a leading underscore to make clear that it is not safe to directly modify it\n this._tileWidth = this.tileWidth;\n delete this.tileWidth;\n } else {\n this._tileWidth = 0;\n }\n\n if( this.tileHeight ){\n // See note above about renaming this.tileWidth\n this._tileHeight = this.tileHeight;\n delete this.tileHeight;\n } else {\n this._tileHeight = 0;\n }\n }\n\n this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0;\n this.minLevel = options.minLevel ? options.minLevel : 0;\n this.maxLevel = ( undefined !== options.maxLevel && null !== options.maxLevel ) ?\n options.maxLevel : (\n ( options.width && options.height ) ? Math.ceil(\n Math.log( Math.max( options.width, options.height ) ) /\n Math.log( 2 )\n ) : 0\n );\n if( this.success && $.isFunction( this.success ) ){\n this.success( this );\n }\n }\n\n\n};\n\n/** @lends OpenSeadragon.TileSource.prototype */\n$.TileSource.prototype = {\n\n getTileSize: function( level ) {\n $.console.error(\n \"[TileSource.getTileSize] is deprecated.\" +\n \"Use TileSource.getTileWidth() and TileSource.getTileHeight() instead\"\n );\n return this._tileWidth;\n },\n\n /**\n * Return the tileWidth for a given level.\n * Subclasses should override this if tileWidth can be different at different levels\n * such as in IIIFTileSource. Code should use this function rather than reading\n * from ._tileWidth directly.\n * @function\n * @param {Number} level\n */\n getTileWidth: function( level ) {\n if (!this._tileWidth) {\n return this.getTileSize(level);\n }\n return this._tileWidth;\n },\n\n /**\n * Return the tileHeight for a given level.\n * Subclasses should override this if tileHeight can be different at different levels\n * such as in IIIFTileSource. Code should use this function rather than reading\n * from ._tileHeight directly.\n * @function\n * @param {Number} level\n */\n getTileHeight: function( level ) {\n if (!this._tileHeight) {\n return this.getTileSize(level);\n }\n return this._tileHeight;\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function( level ) {\n\n // see https://github.com/openseadragon/openseadragon/issues/22\n // we use the tilesources implementation of getLevelScale to generate\n // a memoized re-implementation\n var levelScaleCache = {},\n i;\n for( i = 0; i <= this.maxLevel; i++ ){\n levelScaleCache[ i ] = 1 / Math.pow(2, this.maxLevel - i);\n }\n this.getLevelScale = function( _level ){\n return levelScaleCache[ _level ];\n };\n return this.getLevelScale( level );\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n var scale = this.getLevelScale( level ),\n x = Math.ceil( scale * this.dimensions.x / this.getTileWidth(level) ),\n y = Math.ceil( scale * this.dimensions.y / this.getTileHeight(level) );\n\n return new $.Point( x, y );\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getPixelRatio: function( level ) {\n var imageSizeScaled = this.dimensions.times( this.getLevelScale( level ) ),\n rx = 1.0 / imageSizeScaled.x,\n ry = 1.0 / imageSizeScaled.y;\n\n return new $.Point(rx, ry);\n },\n\n\n /**\n * @function\n * @param {Number} level\n */\n getClosestLevel: function( rect ) {\n var i,\n tilesPerSide,\n tiles;\n\n for( i = this.minLevel; i < this.maxLevel; i++ ){\n tiles = this.getNumTiles( i );\n tilesPerSide = new $.Point(\n Math.floor( rect.x / this.getTileWidth(i) ),\n Math.floor( rect.y / this.getTileHeight(i) )\n );\n\n if( tiles.x + 1 >= tilesPerSide.x && tiles.y + 1 >= tilesPerSide.y ){\n break;\n }\n }\n return Math.max( 0, i - 1 );\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {OpenSeadragon.Point} point\n */\n getTileAtPoint: function( level, point ) {\n var pixel = point.times( this.dimensions.x ).times( this.getLevelScale(level) ),\n tx = Math.floor( pixel.x / this.getTileWidth(level) ),\n ty = Math.floor( pixel.y / this.getTileHeight(level) );\n\n return new $.Point( tx, ty );\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileBounds: function( level, x, y ) {\n var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ),\n tileWidth = this.getTileWidth(level),\n tileHeight = this.getTileHeight(level),\n px = ( x === 0 ) ? 0 : tileWidth * x - this.tileOverlap,\n py = ( y === 0 ) ? 0 : tileHeight * y - this.tileOverlap,\n sx = tileWidth + ( x === 0 ? 1 : 2 ) * this.tileOverlap,\n sy = tileHeight + ( y === 0 ? 1 : 2 ) * this.tileOverlap,\n scale = 1.0 / dimensionsScaled.x;\n\n sx = Math.min( sx, dimensionsScaled.x - px );\n sy = Math.min( sy, dimensionsScaled.y - py );\n\n return new $.Rect( px * scale, py * scale, sx * scale, sy * scale );\n },\n\n\n /**\n * Responsible for retrieving, and caching the\n * image metadata pertinent to this TileSources implementation.\n * @function\n * @param {String} url\n * @throws {Error}\n */\n getImageInfo: function( url ) {\n var _this = this,\n callbackName,\n callback,\n readySource,\n options,\n urlParts,\n filename,\n lastDot;\n\n\n if( url ) {\n urlParts = url.split( '/' );\n filename = urlParts[ urlParts.length - 1 ];\n lastDot = filename.lastIndexOf( '.' );\n if ( lastDot > -1 ) {\n urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot );\n }\n }\n\n callback = function( data ){\n if( typeof(data) === \"string\" ) {\n data = $.parseXml( data );\n }\n var $TileSource = $.TileSource.determineType( _this, data, url );\n if ( !$TileSource ) {\n /**\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', { message: \"Unable to load TileSource\", source: url } );\n return;\n }\n\n options = $TileSource.prototype.configure.apply( _this, [ data, url ]);\n if (options.ajaxWithCredentials === undefined) {\n options.ajaxWithCredentials = _this.ajaxWithCredentials;\n }\n\n readySource = new $TileSource( options );\n _this.ready = true;\n /**\n * Raised when a TileSource is opened and initialized.\n *\n * @event ready\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {Object} tileSource\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'ready', { tileSource: readySource } );\n };\n\n if( url.match(/\\.js$/) ){\n //TODO: Its not very flexible to require tile sources to end jsonp\n // request for info with a url that ends with '.js' but for\n // now it's the only way I see to distinguish uniformly.\n callbackName = url.split( '/' ).pop().replace('.js','');\n $.jsonp({\n url: url,\n async: false,\n callbackName: callbackName,\n callback: callback\n });\n } else {\n // request info via xhr asynchronously.\n $.makeAjaxRequest( {\n url: url,\n withCredentials: this.ajaxWithCredentials,\n success: function( xhr ) {\n var data = processResponse( xhr );\n callback( data );\n },\n error: function ( xhr, exc ) {\n var msg;\n\n /*\n IE < 10 will block XHR requests to different origins. Any property access on the request\n object will raise an exception which we'll attempt to handle by formatting the original\n exception rather than the second one raised when we try to access xhr.status\n */\n try {\n msg = \"HTTP \" + xhr.status + \" attempting to load TileSource\";\n } catch ( e ) {\n var formattedExc;\n if ( typeof( exc ) == \"undefined\" || !exc.toString ) {\n formattedExc = \"Unknown error\";\n } else {\n formattedExc = exc.toString();\n }\n\n msg = formattedExc + \" attempting to load TileSource\";\n }\n\n /***\n * Raised when an error occurs loading a TileSource.\n *\n * @event open-failed\n * @memberof OpenSeadragon.TileSource\n * @type {object}\n * @property {OpenSeadragon.TileSource} eventSource - A reference to the TileSource which raised the event.\n * @property {String} message\n * @property {String} source\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( 'open-failed', {\n message: msg,\n source: url\n });\n }\n });\n }\n\n },\n\n /**\n * Responsible determining if a the particular TileSource supports the\n * data format ( and allowed to apply logic against the url the data was\n * loaded from, if any ). Overriding implementations are expected to do\n * something smart with data and / or url to determine support. Also\n * understand that iteration order of TileSources is not guarunteed so\n * please make sure your data or url is expressive enough to ensure a simple\n * and sufficient mechanisim for clear determination.\n * @function\n * @param {String|Object|Array|Document} data\n * @param {String} url - the url the data was loaded\n * from if any.\n * @return {Boolean}\n */\n supports: function( data, url ) {\n return false;\n },\n\n /**\n * Responsible for parsing and configuring the\n * image metadata pertinent to this TileSources implementation.\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {String|Object|Array|Document} data\n * @param {String} url - the url the data was loaded\n * from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n * @throws {Error}\n */\n configure: function( data, url ) {\n throw new Error( \"Method not implemented.\" );\n },\n\n /**\n * Responsible for retriving the url which will return an image for the\n * region specified by the given x, y, and level components.\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @throws {Error}\n */\n getTileUrl: function( level, x, y ) {\n throw new Error( \"Method not implemented.\" );\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n tileExists: function( level, x, y ) {\n var numTiles = this.getNumTiles( level );\n return level >= this.minLevel &&\n level <= this.maxLevel &&\n x >= 0 &&\n y >= 0 &&\n x < numTiles.x &&\n y < numTiles.y;\n }\n};\n\n\n$.extend( true, $.TileSource.prototype, $.EventSource.prototype );\n\n\n/**\n * Decides whether to try to process the response as xml, json, or hand back\n * the text\n * @private\n * @inner\n * @function\n * @param {XMLHttpRequest} xhr - the completed network request\n */\nfunction processResponse( xhr ){\n var responseText = xhr.responseText,\n status = xhr.status,\n statusText,\n data;\n\n if ( !xhr ) {\n throw new Error( $.getString( \"Errors.Security\" ) );\n } else if ( xhr.status !== 200 && xhr.status !== 0 ) {\n status = xhr.status;\n statusText = ( status == 404 ) ?\n \"Not Found\" :\n xhr.statusText;\n throw new Error( $.getString( \"Errors.Status\", status, statusText ) );\n }\n\n if( responseText.match(/\\s*<.*/) ){\n try{\n data = ( xhr.responseXML && xhr.responseXML.documentElement ) ?\n xhr.responseXML :\n $.parseXml( responseText );\n } catch (e){\n data = xhr.responseText;\n }\n }else if( responseText.match(/\\s*[\\{\\[].*/) ){\n data = $.parseJSON(responseText);\n }else{\n data = responseText;\n }\n return data;\n}\n\n\n/**\n * Determines the TileSource Implementation by introspection of OpenSeadragon\n * namespace, calling each TileSource implementation of 'isType'\n * @private\n * @inner\n * @function\n * @param {Object|Array|Document} data - the tile source configuration object\n * @param {String} url - the url where the tile source configuration object was\n * loaded from, if any.\n */\n$.TileSource.determineType = function( tileSource, data, url ){\n var property;\n for( property in OpenSeadragon ){\n if( property.match(/.+TileSource$/) &&\n $.isFunction( OpenSeadragon[ property ] ) &&\n $.isFunction( OpenSeadragon[ property ].prototype.supports ) &&\n OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url )\n ){\n return OpenSeadragon[ property ];\n }\n }\n\n $.console.error( \"No TileSource was able to open %s %s\", url, data );\n};\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - DziTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class DziTileSource\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n * @param {String} fileFormat\n * @param {OpenSeadragon.DisplayRect[]} displayRects\n * @property {String} tilesUrl\n * @property {String} fileFormat\n * @property {OpenSeadragon.DisplayRect[]} displayRects\n */\n$.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, fileFormat, displayRects, minLevel, maxLevel ) {\n var i,\n rect,\n level,\n options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[ 0 ],\n height: arguments[ 1 ],\n tileSize: arguments[ 2 ],\n tileOverlap: arguments[ 3 ],\n tilesUrl: arguments[ 4 ],\n fileFormat: arguments[ 5 ],\n displayRects: arguments[ 6 ],\n minLevel: arguments[ 7 ],\n maxLevel: arguments[ 8 ]\n };\n }\n\n this._levelRects = {};\n this.tilesUrl = options.tilesUrl;\n this.fileFormat = options.fileFormat;\n this.displayRects = options.displayRects;\n\n if ( this.displayRects ) {\n for ( i = this.displayRects.length - 1; i >= 0; i-- ) {\n rect = this.displayRects[ i ];\n for ( level = rect.minLevel; level <= rect.maxLevel; level++ ) {\n if ( !this._levelRects[ level ] ) {\n this._levelRects[ level ] = [];\n }\n this._levelRects[ level ].push( rect );\n }\n }\n }\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.DziTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.DziTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n var ns;\n if ( data.Image ) {\n ns = data.Image.xmlns;\n } else if ( data.documentElement) {\n if (\"Image\" == data.documentElement.localName || \"Image\" == data.documentElement.tagName) {\n ns = data.documentElement.namespaceURI;\n }\n }\n\n return ( \"http://schemas.microsoft.com/deepzoom/2008\" == ns ||\n \"http://schemas.microsoft.com/deepzoom/2009\" == ns );\n },\n\n /**\n *\n * @function\n * @param {Object|XMLDocument} data - the raw configuration\n * @param {String} url - the url the data was retreived from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url ){\n\n var options;\n\n if( !$.isPlainObject(data) ){\n\n options = configureFromXML( this, data );\n\n }else{\n\n options = configureFromObject( this, data );\n }\n\n if (url && !options.tilesUrl) {\n options.tilesUrl = url.replace(\n /([^\\/]+?)(\\.(dzi|xml|js))?\\/?(\\?.*)?$/, '$1_files/');\n\n if (url.search(/\\.(dzi|xml|js)\\?/) != -1) {\n options.queryParams = url.match(/\\?.*/);\n }else{\n options.queryParams = '';\n }\n }\n\n return options;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat, this.queryParams ].join( '' );\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n tileExists: function( level, x, y ) {\n var rects = this._levelRects[ level ],\n rect,\n scale,\n xMin,\n yMin,\n xMax,\n yMax,\n i;\n\n if ( !rects || !rects.length ) {\n return true;\n }\n\n for ( i = rects.length - 1; i >= 0; i-- ) {\n rect = rects[ i ];\n\n if ( level < rect.minLevel || level > rect.maxLevel ) {\n continue;\n }\n\n scale = this.getLevelScale( level );\n xMin = rect.x * scale;\n yMin = rect.y * scale;\n xMax = xMin + rect.width * scale;\n yMax = yMin + rect.height * scale;\n\n xMin = Math.floor( xMin / this.tileSize );\n yMin = Math.floor( yMin / this.tileSize );\n xMax = Math.ceil( xMax / this.tileSize );\n yMax = Math.ceil( yMax / this.tileSize );\n\n if ( xMin <= x && x < xMax && yMin <= y && y < yMax ) {\n return true;\n }\n }\n\n return false;\n }\n});\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromXML( tileSource, xmlDoc ){\n\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.localName || root.tagName,\n ns = xmlDoc.documentElement.namespaceURI,\n configuration = null,\n displayRects = [],\n dispRectNodes,\n dispRectNode,\n rectNode,\n sizeNode,\n i;\n\n if ( rootName == \"Image\" ) {\n\n try {\n sizeNode = root.getElementsByTagName(\"Size\" )[ 0 ];\n if (sizeNode === undefined) {\n sizeNode = root.getElementsByTagNameNS(ns, \"Size\" )[ 0 ];\n }\n\n configuration = {\n Image: {\n xmlns: \"http://schemas.microsoft.com/deepzoom/2008\",\n Url: root.getAttribute( \"Url\" ),\n Format: root.getAttribute( \"Format\" ),\n DisplayRect: null,\n Overlap: parseInt( root.getAttribute( \"Overlap\" ), 10 ),\n TileSize: parseInt( root.getAttribute( \"TileSize\" ), 10 ),\n Size: {\n Height: parseInt( sizeNode.getAttribute( \"Height\" ), 10 ),\n Width: parseInt( sizeNode.getAttribute( \"Width\" ), 10 )\n }\n }\n };\n\n if ( !$.imageFormatSupported( configuration.Image.Format ) ) {\n throw new Error(\n $.getString( \"Errors.ImageFormat\", configuration.Image.Format.toUpperCase() )\n );\n }\n\n dispRectNodes = root.getElementsByTagName(\"DisplayRect\" );\n if (dispRectNodes === undefined) {\n dispRectNodes = root.getElementsByTagNameNS(ns, \"DisplayRect\" )[ 0 ];\n }\n\n for ( i = 0; i < dispRectNodes.length; i++ ) {\n dispRectNode = dispRectNodes[ i ];\n rectNode = dispRectNode.getElementsByTagName(\"Rect\" )[ 0 ];\n if (rectNode === undefined) {\n rectNode = dispRectNode.getElementsByTagNameNS(ns, \"Rect\" )[ 0 ];\n }\n\n displayRects.push({\n Rect: {\n X: parseInt( rectNode.getAttribute( \"X\" ), 10 ),\n Y: parseInt( rectNode.getAttribute( \"Y\" ), 10 ),\n Width: parseInt( rectNode.getAttribute( \"Width\" ), 10 ),\n Height: parseInt( rectNode.getAttribute( \"Height\" ), 10 ),\n MinLevel: parseInt( dispRectNode.getAttribute( \"MinLevel\" ), 10 ),\n MaxLevel: parseInt( dispRectNode.getAttribute( \"MaxLevel\" ), 10 )\n }\n });\n }\n\n if( displayRects.length ){\n configuration.Image.DisplayRect = displayRects;\n }\n\n return configureFromObject( tileSource, configuration );\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( $.getString(\"Errors.Dzi\") );\n }\n } else if ( rootName == \"Collection\" ) {\n throw new Error( $.getString( \"Errors.Dzc\" ) );\n } else if ( rootName == \"Error\" ) {\n var messageNode = root.getElementsByTagName(\"Message\")[0];\n var message = messageNode.firstChild.nodeValue;\n throw new Error(message);\n }\n\n throw new Error( $.getString( \"Errors.Dzi\" ) );\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromObject( tileSource, configuration ){\n var imageData = configuration.Image,\n tilesUrl = imageData.Url,\n fileFormat = imageData.Format,\n sizeData = imageData.Size,\n dispRectData = imageData.DisplayRect || [],\n width = parseInt( sizeData.Width, 10 ),\n height = parseInt( sizeData.Height, 10 ),\n tileSize = parseInt( imageData.TileSize, 10 ),\n tileOverlap = parseInt( imageData.Overlap, 10 ),\n displayRects = [],\n rectData,\n i;\n\n //TODO: need to figure out out to better handle image format compatibility\n // which actually includes additional file formats like xml and pdf\n // and plain text for various tilesource implementations to avoid low\n // level errors.\n //\n // For now, just don't perform the check.\n //\n /*if ( !imageFormatSupported( fileFormat ) ) {\n throw new Error(\n $.getString( \"Errors.ImageFormat\", fileFormat.toUpperCase() )\n );\n }*/\n\n for ( i = 0; i < dispRectData.length; i++ ) {\n rectData = dispRectData[ i ].Rect;\n\n displayRects.push( new $.DisplayRect(\n parseInt( rectData.X, 10 ),\n parseInt( rectData.Y, 10 ),\n parseInt( rectData.Width, 10 ),\n parseInt( rectData.Height, 10 ),\n parseInt( rectData.MinLevel, 10 ),\n parseInt( rectData.MaxLevel, 10 )\n ));\n }\n\n return $.extend(true, {\n width: width, /* width *required */\n height: height, /* height *required */\n tileSize: tileSize, /* tileSize *required */\n tileOverlap: tileOverlap, /* tileOverlap *required */\n minLevel: null, /* minLevel */\n maxLevel: null, /* maxLevel */\n tilesUrl: tilesUrl, /* tilesUrl */\n fileFormat: fileFormat, /* fileFormat */\n displayRects: displayRects /* displayRects */\n }, configuration );\n\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - IIIFTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class IIIFTileSource\n * @classdesc A client implementation of the International Image Interoperability Framework\n * Format: Image API 1.0 - 2.1\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @see http://iiif.io/api/image/\n */\n$.IIIFTileSource = function( options ){\n\n\n $.extend( true, this, options );\n\n if ( !( this.height && this.width && this['@id'] ) ) {\n throw new Error( 'IIIF required parameters not provided.' );\n }\n\n options.tileSizePerScaleFactor = {};\n\n // N.B. 2.0 renamed scale_factors to scaleFactors\n if ( this.tile_width && this.tile_height ) {\n options.tileWidth = this.tile_width;\n options.tileHeight = this.tile_height;\n } else if ( this.tile_width ) {\n options.tileSize = this.tile_width;\n } else if ( this.tile_height ) {\n options.tileSize = this.tile_height;\n } else if ( this.tiles ) {\n // Version 2.0 forwards\n if ( this.tiles.length == 1 ) {\n options.tileWidth = this.tiles[0].width;\n // Use height if provided, otherwise assume square tiles and use width.\n options.tileHeight = this.tiles[0].height || this.tiles[0].width;\n this.scale_factors = this.tiles[0].scaleFactors;\n } else {\n // Multiple tile sizes at different levels\n this.scale_factors = [];\n for (var t = 0; t < this.tiles.length; t++ ) {\n for (var sf = 0; sf < this.tiles[t].scaleFactors.length; sf++) {\n var scaleFactor = this.tiles[t].scaleFactors[sf];\n this.scale_factors.push(scaleFactor);\n options.tileSizePerScaleFactor[scaleFactor] = {\n width: this.tiles[t].width,\n height: this.tiles[t].height || this.tiles[t].width\n };\n }\n }\n }\n } else if ( canBeTiled(options.profile) ) {\n // use the largest of tileOptions that is smaller than the short dimension\n var shortDim = Math.min( this.height, this.width ),\n tileOptions = [256,512,1024],\n smallerTiles = [];\n\n for ( var c = 0; c < tileOptions.length; c++ ) {\n if ( tileOptions[c] <= shortDim ) {\n smallerTiles.push( tileOptions[c] );\n }\n }\n\n if ( smallerTiles.length > 0 ) {\n options.tileSize = Math.max.apply( null, smallerTiles );\n } else {\n // If we're smaller than 256, just use the short side.\n options.tileSize = shortDim;\n }\n } else if (this.sizes && this.sizes.length > 0) {\n // This info.json can't be tiled, but we can still construct a legacy pyramid from the sizes array. \n // In this mode, IIIFTileSource will call functions from the abstract baseTileSource or the \n // LegacyTileSource instead of performing IIIF tiling. \n this.emulateLegacyImagePyramid = true;\n \n options.levels = constructLevels( this );\n // use the largest available size to define tiles\n $.extend( true, options, {\n width: options.levels[ options.levels.length - 1 ].width,\n height: options.levels[ options.levels.length - 1 ].height,\n tileSize: Math.max( options.height, options.width ),\n tileOverlap: 0,\n minLevel: 0,\n maxLevel: options.levels.length - 1\n });\n this.levels = options.levels;\n } else {\n $.console.error(\"Nothing in the info.json to construct image pyramids from\");\n }\n\n if (!options.maxLevel && !this.emulateLegacyImagePyramid) {\n if (!this.scale_factors) {\n options.maxLevel = Number(Math.ceil(Math.log(Math.max(this.width, this.height), 2)));\n } else {\n options.maxLevel = Math.floor(Math.pow(Math.max.apply(null, this.scale_factors), 0.5));\n }\n }\n\n $.TileSource.apply( this, [ options ] );\n};\n\n$.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.IIIFTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n \n supports: function( data, url ) {\n // Version 2.0 and forwards\n if (data.protocol && data.protocol == 'http://iiif.io/api/image') {\n return true;\n // Version 1.1\n } else if ( data['@context'] && (\n data['@context'] == \"http://library.stanford.edu/iiif/image-api/1.1/context.json\" ||\n data['@context'] == \"http://iiif.io/api/image/1/context.json\") ) {\n // N.B. the iiif.io context is wrong, but where the representation lives so likely to be used\n return true;\n\n // Version 1.0\n } else if ( data.profile &&\n data.profile.indexOf(\"http://library.stanford.edu/iiif/image-api/compliance.html\") === 0) {\n return true;\n } else if ( data.identifier && data.width && data.height ) {\n return true;\n } else if ( data.documentElement &&\n \"info\" == data.documentElement.tagName &&\n \"http://library.stanford.edu/iiif/image-api/ns/\" ==\n data.documentElement.namespaceURI) {\n return true;\n\n // Not IIIF\n } else {\n return false;\n }\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @example <caption>IIIF 1.1 Info Looks like this</caption>\n * {\n * \"@context\" : \"http://library.stanford.edu/iiif/image-api/1.1/context.json\",\n * \"@id\" : \"http://iiif.example.com/prefix/1E34750D-38DB-4825-A38A-B60A345E591C\",\n * \"width\" : 6000,\n * \"height\" : 4000,\n * \"scale_factors\" : [ 1, 2, 4 ],\n * \"tile_width\" : 1024,\n * \"tile_height\" : 1024,\n * \"formats\" : [ \"jpg\", \"png\" ],\n * \"qualities\" : [ \"native\", \"grey\" ],\n * \"profile\" : \"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0\"\n * }\n */\n configure: function( data, url ){\n // Try to deduce our version and fake it upwards if needed\n if ( !$.isPlainObject(data) ) {\n var options = configureFromXml10( data );\n options['@context'] = \"http://iiif.io/api/image/1.0/context.json\";\n options['@id'] = url.replace('/info.xml', '');\n return options;\n } else if ( !data['@context'] ) {\n data['@context'] = 'http://iiif.io/api/image/1.0/context.json';\n data['@id'] = url.replace('/info.json', '');\n return data;\n } else {\n return data;\n }\n },\n\n /**\n * Return the tileWidth for the given level.\n * @function\n * @param {Number} level\n */\n getTileWidth: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n return $.TileSource.prototype.getTileWidth.call(this, level);\n }\n\n var scaleFactor = Math.pow(2, this.maxLevel - level);\n\n if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {\n return this.tileSizePerScaleFactor[scaleFactor].width;\n }\n return this._tileWidth;\n },\n\n /**\n * Return the tileHeight for the given level.\n * @function\n * @param {Number} level\n */\n getTileHeight: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n return $.TileSource.prototype.getTileHeight.call(this, level);\n }\n\n var scaleFactor = Math.pow(2, this.maxLevel - level);\n\n if (this.tileSizePerScaleFactor && this.tileSizePerScaleFactor[scaleFactor]) {\n return this.tileSizePerScaleFactor[scaleFactor].height;\n }\n return this._tileHeight;\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function ( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n var levelScale = NaN;\n if (this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel) {\n levelScale =\n this.levels[level].width /\n this.levels[this.maxLevel].width;\n }\n return levelScale;\n }\n\n return $.TileSource.prototype.getLevelScale.call(this, level);\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n\n if(this.emulateLegacyImagePyramid) {\n var scale = this.getLevelScale(level);\n if (scale) {\n return new $.Point(1, 1);\n } else {\n return new $.Point(0, 0);\n }\n }\n\n return $.TileSource.prototype.getNumTiles.call(this, level);\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {OpenSeadragon.Point} point\n */\n getTileAtPoint: function( level, point ) {\n\n if(this.emulateLegacyImagePyramid) {\n return new $.Point(0, 0);\n }\n\n return $.TileSource.prototype.getTileAtPoint.call(this, level, point);\n },\n\n\n /**\n * Responsible for retrieving the url which will return an image for the\n * region specified by the given x, y, and level components.\n * @function\n * @param {Number} level - z index\n * @param {Number} x\n * @param {Number} y\n * @throws {Error}\n */\n getTileUrl: function( level, x, y ){\n\n if(this.emulateLegacyImagePyramid) {\n var url = null;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n url = this.levels[ level ].url;\n }\n return url;\n }\n\n //# constants\n var IIIF_ROTATION = '0',\n //## get the scale (level as a decimal)\n scale = Math.pow( 0.5, this.maxLevel - level ),\n\n //# image dimensions at this level\n levelWidth = Math.ceil( this.width * scale ),\n levelHeight = Math.ceil( this.height * scale ),\n\n //## iiif region\n tileWidth,\n tileHeight,\n iiifTileSizeWidth,\n iiifTileSizeHeight,\n iiifRegion,\n iiifTileX,\n iiifTileY,\n iiifTileW,\n iiifTileH,\n iiifSize,\n iiifQuality,\n uri;\n\n tileWidth = this.getTileWidth(level);\n tileHeight = this.getTileHeight(level);\n iiifTileSizeWidth = Math.ceil( tileWidth / scale );\n iiifTileSizeHeight = Math.ceil( tileHeight / scale );\n\n if ( this['@context'].indexOf('/1.0/context.json') > -1 ||\n this['@context'].indexOf('/1.1/context.json') > -1 ||\n this['@context'].indexOf('/1/context.json') > -1 ) {\n iiifQuality = \"native.jpg\";\n } else {\n iiifQuality = \"default.jpg\";\n }\n\n if ( levelWidth < tileWidth && levelHeight < tileHeight ){\n iiifSize = levelWidth + \",\";\n iiifRegion = 'full';\n } else {\n iiifTileX = x * iiifTileSizeWidth;\n iiifTileY = y * iiifTileSizeHeight;\n iiifTileW = Math.min( iiifTileSizeWidth, this.width - iiifTileX );\n iiifTileH = Math.min( iiifTileSizeHeight, this.height - iiifTileY );\n iiifSize = Math.ceil( iiifTileW * scale ) + \",\";\n iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' );\n }\n uri = [ this['@id'], iiifRegion, iiifSize, IIIF_ROTATION, iiifQuality ].join( '/' );\n\n return uri;\n }\n\n });\n\n /**\n * Determine whether arbitrary tile requests can be made against a service with the given profile\n * @function\n * @param {object} profile - IIIF profile object\n * @throws {Error}\n */\n function canBeTiled (profile ) {\n var level0Profiles = [\n \"http://library.stanford.edu/iiif/image-api/compliance.html#level0\",\n \"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0\",\n \"http://iiif.io/api/image/2/level0.json\"\n ];\n var isLevel0 = (level0Profiles.indexOf(profile[0]) != -1);\n return !isLevel0 || (profile.indexOf(\"sizeByW\") != -1);\n }\n\n /**\n * Build the legacy pyramid URLs (one tile per level)\n * @function\n * @param {object} options - infoJson\n * @throws {Error}\n */\n function constructLevels(options) {\n var levels = [];\n for(var i=0; i<options.sizes.length; i++) {\n levels.push({\n url: options['@id'] + '/full/' + options.sizes[i].width + ',/0/default.jpg',\n width: options.sizes[i].width,\n height: options.sizes[i].height\n });\n }\n return levels.sort(function(a,b){return a.width - b.width;});\n }\n\n\n function configureFromXml10(xmlDoc) {\n //parse the xml\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.tagName,\n configuration = null;\n\n if ( rootName == \"info\" ) {\n try {\n configuration = {};\n parseXML10( root, configuration );\n return configuration;\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( $.getString(\"Errors.IIIF\") );\n }\n }\n throw new Error( $.getString( \"Errors.IIIF\" ) );\n }\n\n function parseXML10( node, configuration, property ) {\n var i,\n value;\n if ( node.nodeType == 3 && property ) {//text node\n value = node.nodeValue.trim();\n if( value.match(/^\\d*$/)){\n value = Number( value );\n }\n if( !configuration[ property ] ){\n configuration[ property ] = value;\n }else{\n if( !$.isArray( configuration[ property ] ) ){\n configuration[ property ] = [ configuration[ property ] ];\n }\n configuration[ property ].push( value );\n }\n } else if( node.nodeType == 1 ){\n for( i = 0; i < node.childNodes.length; i++ ){\n parseXML10( node.childNodes[ i ], configuration, node.nodeName );\n }\n }\n }\n\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - OsmTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Derived from the OSM tile source in Rainer Simon's seajax-utils project\n * <http://github.com/rsimon/seajax-utils>. Rainer Simon has contributed\n * the included code to the OpenSeadragon project under the New BSD license;\n * see <https://github.com/openseadragon/openseadragon/issues/58>.\n */\n\n\n(function( $ ){\n\n/**\n * @class OsmTileSource\n * @classdesc A tilesource implementation for OpenStreetMap.<br><br>\n *\n * Note 1. Zoomlevels. Deep Zoom and OSM define zoom levels differently. In Deep\n * Zoom, level 0 equals an image of 1x1 pixels. In OSM, level 0 equals an image of\n * 256x256 levels (see http://gasi.ch/blog/inside-deep-zoom-2). I.e. there is a\n * difference of log2(256)=8 levels.<br><br>\n *\n * Note 2. Image dimension. According to the OSM Wiki\n * (http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Zoom_levels)\n * the highest Mapnik zoom level has 256.144x256.144 tiles, with a 256x256\n * pixel size. I.e. the Deep Zoom image dimension is 65.572.864x65.572.864\n * pixels.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n */\n$.OsmTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) {\n var options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[0],\n height: arguments[1],\n tileSize: arguments[2],\n tileOverlap: arguments[3],\n tilesUrl: arguments[4]\n };\n }\n //apply default setting for standard public OpenStreatMaps service\n //but allow them to be specified so fliks can host there own instance\n //or apply against other services supportting the same standard\n if( !options.width || !options.height ){\n options.width = 65572864;\n options.height = 65572864;\n }\n if( !options.tileSize ){\n options.tileSize = 256;\n options.tileOverlap = 0;\n }\n if( !options.tilesUrl ){\n options.tilesUrl = \"http://tile.openstreetmap.org/\";\n }\n options.minLevel = 8;\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.OsmTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.OsmTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return (\n data.type &&\n \"openstreetmaps\" == data.type\n );\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @param {String} url - the url the data was retreived from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url ){\n return data;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n return this.tilesUrl + (level - 8) + \"/\" + x + \"/\" + y + \".png\";\n }\n});\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TmsTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * Derived from the TMS tile source in Rainer Simon's seajax-utils project\n * <http://github.com/rsimon/seajax-utils>. Rainer Simon has contributed\n * the included code to the OpenSeadragon project under the New BSD license;\n * see <https://github.com/openseadragon/openseadragon/issues/58>.\n */\n\n\n(function( $ ){\n\n/**\n * @class TmsTileSource\n * @classdesc A tilesource implementation for Tiled Map Services (TMS).\n * TMS tile scheme ( [ as supported by OpenLayers ] is described here\n * ( http://openlayers.org/dev/examples/tms.html ).\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Number|Object} width - the pixel width of the image or the idiomatic\n * options object which is used instead of positional arguments.\n * @param {Number} height\n * @param {Number} tileSize\n * @param {Number} tileOverlap\n * @param {String} tilesUrl\n */\n$.TmsTileSource = function( width, height, tileSize, tileOverlap, tilesUrl ) {\n var options;\n\n if( $.isPlainObject( width ) ){\n options = width;\n }else{\n options = {\n width: arguments[0],\n height: arguments[1],\n tileSize: arguments[2],\n tileOverlap: arguments[3],\n tilesUrl: arguments[4]\n };\n }\n // TMS has integer multiples of 256 for width/height and adds buffer\n // if necessary -> account for this!\n var bufferedWidth = Math.ceil(options.width / 256) * 256,\n bufferedHeight = Math.ceil(options.height / 256) * 256,\n max;\n\n // Compute number of zoomlevels in this tileset\n if (bufferedWidth > bufferedHeight) {\n max = bufferedWidth / 256;\n } else {\n max = bufferedHeight / 256;\n }\n options.maxLevel = Math.ceil(Math.log(max)/Math.log(2)) - 1;\n options.tileSize = 256;\n options.width = bufferedWidth;\n options.height = bufferedHeight;\n\n $.TileSource.apply( this, [ options ] );\n\n};\n\n$.extend( $.TmsTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.TmsTileSource.prototype */{\n\n\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return ( data.type && \"tiledmapservice\" == data.type );\n },\n\n /**\n *\n * @function\n * @param {Object} data - the raw configuration\n * @param {String} url - the url the data was retreived from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( data, url ){\n return data;\n },\n\n\n /**\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n */\n getTileUrl: function( level, x, y ) {\n // Convert from Deep Zoom definition to TMS zoom definition\n var yTiles = this.getNumTiles( level ).y - 1;\n\n return this.tilesUrl + level + \"/\" + x + \"/\" + (yTiles - y) + \".png\";\n }\n});\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - LegacyTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class LegacyTileSource\n * @classdesc The LegacyTileSource allows simple, traditional image pyramids to be loaded\n * into an OpenSeadragon Viewer. Basically, this translates to the historically\n * common practice of starting with a 'master' image, maybe a tiff for example,\n * and generating a set of 'service' images like one or more thumbnails, a medium\n * resolution image and a high resolution image in standard web formats like\n * png or jpg.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Array} levels An array of file descriptions, each is an object with\n * a 'url', a 'width', and a 'height'. Overriding classes can expect more\n * properties but these properties are sufficient for this implementation.\n * Additionally, the levels are required to be listed in order from\n * smallest to largest.\n * @property {Number} aspectRatio\n * @property {Number} dimensions\n * @property {Number} tileSize\n * @property {Number} tileOverlap\n * @property {Number} minLevel\n * @property {Number} maxLevel\n * @property {Array} levels\n */\n$.LegacyTileSource = function( levels ) {\n\n var options,\n width,\n height;\n\n if( $.isArray( levels ) ){\n options = {\n type: 'legacy-image-pyramid',\n levels: levels\n };\n }\n\n //clean up the levels to make sure we support all formats\n options.levels = filterFiles( options.levels );\n\n if ( options.levels.length > 0 ) {\n width = options.levels[ options.levels.length - 1 ].width;\n height = options.levels[ options.levels.length - 1 ].height;\n }\n else {\n width = 0;\n height = 0;\n $.console.error( \"No supported image formats found\" );\n }\n\n $.extend( true, options, {\n width: width,\n height: height,\n tileSize: Math.max( height, width ),\n tileOverlap: 0,\n minLevel: 0,\n maxLevel: options.levels.length > 0 ? options.levels.length - 1 : 0\n } );\n\n $.TileSource.apply( this, [ options ] );\n\n this.levels = options.levels;\n};\n\n$.extend( $.LegacyTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.LegacyTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function( data, url ){\n return (\n data.type &&\n \"legacy-image-pyramid\" == data.type\n ) || (\n data.documentElement &&\n \"legacy-image-pyramid\" == data.documentElement.getAttribute('type')\n );\n },\n\n\n /**\n *\n * @function\n * @param {Object|XMLDocument} configuration - the raw configuration\n * @param {String} dataUrl - the url the data was retreived from if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function( configuration, dataUrl ){\n\n var options;\n\n if( !$.isPlainObject(configuration) ){\n\n options = configureFromXML( this, configuration );\n\n }else{\n\n options = configureFromObject( this, configuration );\n }\n\n return options;\n\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function ( level ) {\n var levelScale = NaN;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n levelScale =\n this.levels[ level ].width /\n this.levels[ this.maxLevel ].width;\n }\n return levelScale;\n },\n\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function( level ) {\n var scale = this.getLevelScale( level );\n if ( scale ){\n return new $.Point( 1, 1 );\n } else {\n return new $.Point( 0, 0 );\n }\n },\n\n /**\n * @function\n * @param {Number} level\n * @param {OpenSeadragon.Point} point\n */\n getTileAtPoint: function( level, point ) {\n return new $.Point( 0, 0 );\n },\n\n\n /**\n * This method is not implemented by this class other than to throw an Error\n * announcing you have to implement it. Because of the variety of tile\n * server technologies, and various specifications for building image\n * pyramids, this method is here to allow easy integration.\n * @function\n * @param {Number} level\n * @param {Number} x\n * @param {Number} y\n * @throws {Error}\n */\n getTileUrl: function ( level, x, y ) {\n var url = null;\n if ( this.levels.length > 0 && level >= this.minLevel && level <= this.maxLevel ) {\n url = this.levels[ level ].url;\n }\n return url;\n }\n} );\n\n/**\n * This method removes any files from the Array which dont conform to our\n * basic requirements for a 'level' in the LegacyTileSource.\n * @private\n * @inner\n * @function\n */\nfunction filterFiles( files ){\n var filtered = [],\n file,\n i;\n for( i = 0; i < files.length; i++ ){\n file = files[ i ];\n if( file.height &&\n file.width &&\n file.url && (\n file.url.toLowerCase().match(/^.*\\.(png|jpg|jpeg|gif)(?:\\?.*)?$/) || (\n file.mimetype &&\n file.mimetype.toLowerCase().match(/^.*\\/(png|jpg|jpeg|gif)$/)\n )\n ) ){\n //This is sufficient to serve as a level\n filtered.push({\n url: file.url,\n width: Number( file.width ),\n height: Number( file.height )\n });\n }\n else {\n $.console.error( 'Unsupported image format: %s', file.url ? file.url : '<no URL>' );\n }\n }\n\n return filtered.sort(function(a,b){\n return a.height - b.height;\n });\n\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromXML( tileSource, xmlDoc ){\n\n if ( !xmlDoc || !xmlDoc.documentElement ) {\n throw new Error( $.getString( \"Errors.Xml\" ) );\n }\n\n var root = xmlDoc.documentElement,\n rootName = root.tagName,\n conf = null,\n levels = [],\n level,\n i;\n\n if ( rootName == \"image\" ) {\n\n try {\n conf = {\n type: root.getAttribute( \"type\" ),\n levels: []\n };\n\n levels = root.getElementsByTagName( \"level\" );\n for ( i = 0; i < levels.length; i++ ) {\n level = levels[ i ];\n\n conf.levels .push({\n url: level.getAttribute( \"url\" ),\n width: parseInt( level.getAttribute( \"width\" ), 10 ),\n height: parseInt( level.getAttribute( \"height\" ), 10 )\n });\n }\n\n return configureFromObject( tileSource, conf );\n\n } catch ( e ) {\n throw (e instanceof Error) ?\n e :\n new Error( 'Unknown error parsing Legacy Image Pyramid XML.' );\n }\n } else if ( rootName == \"collection\" ) {\n throw new Error( 'Legacy Image Pyramid Collections not yet supported.' );\n } else if ( rootName == \"error\" ) {\n throw new Error( 'Error: ' + xmlDoc );\n }\n\n throw new Error( 'Unknown element ' + rootName );\n}\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction configureFromObject( tileSource, configuration ){\n\n return configuration.levels;\n\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ImageTileSource\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ($) {\n\n /**\n * @class ImageTileSource\n * @classdesc The ImageTileSource allows a simple image to be loaded\n * into an OpenSeadragon Viewer.\n * There are 2 ways to open an ImageTileSource:\n * 1. viewer.open({type: 'image', url: fooUrl});\n * 2. viewer.open(new OpenSeadragon.ImageTileSource({url: fooUrl}));\n *\n * With the first syntax, the crossOriginPolicy, ajaxWithCredentials and\n * useCanvas options are inherited from the viewer if they are not\n * specified directly in the options object.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.TileSource\n * @param {Object} options Options object.\n * @param {String} options.url URL of the image\n * @param {Boolean} [options.buildPyramid=true] If set to true (default), a\n * pyramid will be built internally to provide a better downsampling.\n * @param {String|Boolean} [options.crossOriginPolicy=false] Valid values are\n * 'Anonymous', 'use-credentials', and false. If false, image requests will\n * not use CORS preventing internal pyramid building for images from other\n * domains.\n * @param {String|Boolean} [options.ajaxWithCredentials=false] Whether to set\n * the withCredentials XHR flag for AJAX requests (when loading tile sources).\n * @param {Boolean} [options.useCanvas=true] Set to false to prevent any use\n * of the canvas API.\n */\n $.ImageTileSource = function (options) {\n\n options = $.extend({\n buildPyramid: true,\n crossOriginPolicy: false,\n ajaxWithCredentials: false,\n useCanvas: true\n }, options);\n $.TileSource.apply(this, [options]);\n\n };\n\n $.extend($.ImageTileSource.prototype, $.TileSource.prototype, /** @lends OpenSeadragon.ImageTileSource.prototype */{\n /**\n * Determine if the data and/or url imply the image service is supported by\n * this tile source.\n * @function\n * @param {Object|Array} data\n * @param {String} optional - url\n */\n supports: function (data, url) {\n return data.type && data.type === \"image\";\n },\n /**\n *\n * @function\n * @param {Object} options - the options\n * @param {String} dataUrl - the url the image was retreived from, if any.\n * @return {Object} options - A dictionary of keyword arguments sufficient\n * to configure this tile sources constructor.\n */\n configure: function (options, dataUrl) {\n return options;\n },\n /**\n * Responsible for retrieving, and caching the\n * image metadata pertinent to this TileSources implementation.\n * @function\n * @param {String} url\n * @throws {Error}\n */\n getImageInfo: function (url) {\n var image = this._image = new Image();\n var _this = this;\n\n if (this.crossOriginPolicy) {\n image.crossOrigin = this.crossOriginPolicy;\n }\n if (this.ajaxWithCredentials) {\n image.useCredentials = this.ajaxWithCredentials;\n }\n\n $.addEvent(image, 'load', function () {\n _this.width = image.naturalWidth;\n _this.height = image.naturalHeight;\n _this.aspectRatio = _this.width / _this.height;\n _this.dimensions = new $.Point(_this.width, _this.height);\n _this._tileWidth = _this.width;\n _this._tileHeight = _this.height;\n _this.tileOverlap = 0;\n _this.minLevel = 0;\n _this.levels = _this._buildLevels();\n _this.maxLevel = _this.levels.length - 1;\n\n _this.ready = true;\n\n // Note: this event is documented elsewhere, in TileSource\n _this.raiseEvent('ready', {tileSource: _this});\n });\n\n $.addEvent(image, 'error', function () {\n // Note: this event is documented elsewhere, in TileSource\n _this.raiseEvent('open-failed', {\n message: \"Error loading image at \" + url,\n source: url\n });\n });\n\n image.src = url;\n },\n /**\n * @function\n * @param {Number} level\n */\n getLevelScale: function (level) {\n var levelScale = NaN;\n if (level >= this.minLevel && level <= this.maxLevel) {\n levelScale =\n this.levels[level].width /\n this.levels[this.maxLevel].width;\n }\n return levelScale;\n },\n /**\n * @function\n * @param {Number} level\n */\n getNumTiles: function (level) {\n var scale = this.getLevelScale(level);\n if (scale) {\n return new $.Point(1, 1);\n } else {\n return new $.Point(0, 0);\n }\n },\n /**\n * @function\n * @param {Number} level\n * @param {OpenSeadragon.Point} point\n */\n getTileAtPoint: function (level, point) {\n return new $.Point(0, 0);\n },\n /**\n * Retrieves a tile url\n * @function\n * @param {Number} level Level of the tile\n * @param {Number} x x coordinate of the tile\n * @param {Number} y y coordinate of the tile\n */\n getTileUrl: function (level, x, y) {\n var url = null;\n if (level >= this.minLevel && level <= this.maxLevel) {\n url = this.levels[level].url;\n }\n return url;\n },\n /**\n * Retrieves a tile context 2D\n * @function\n * @param {Number} level Level of the tile\n * @param {Number} x x coordinate of the tile\n * @param {Number} y y coordinate of the tile\n */\n getContext2D: function (level, x, y) {\n var context = null;\n if (level >= this.minLevel && level <= this.maxLevel) {\n context = this.levels[level].context2D;\n }\n return context;\n },\n\n // private\n //\n // Builds the differents levels of the pyramid if possible\n // (i.e. if canvas API enabled and no canvas tainting issue).\n _buildLevels: function () {\n var levels = [{\n url: this._image.src,\n width: this._image.naturalWidth,\n height: this._image.naturalHeight\n }];\n\n if (!this.buildPyramid || !$.supportsCanvas || !this.useCanvas) {\n // We don't need the image anymore. Allows it to be GC.\n delete this._image;\n return levels;\n }\n\n var currentWidth = this._image.naturalWidth;\n var currentHeight = this._image.naturalHeight;\n\n var bigCanvas = document.createElement(\"canvas\");\n var bigContext = bigCanvas.getContext(\"2d\");\n\n bigCanvas.width = currentWidth;\n bigCanvas.height = currentHeight;\n bigContext.drawImage(this._image, 0, 0, currentWidth, currentHeight);\n // We cache the context of the highest level because the browser\n // is a lot faster at downsampling something it already has\n // downsampled before.\n levels[0].context2D = bigContext;\n // We don't need the image anymore. Allows it to be GC.\n delete this._image;\n\n if ($.isCanvasTainted(bigCanvas)) {\n // If the canvas is tainted, we can't compute the pyramid.\n return levels;\n }\n\n // We build smaller levels until either width or height becomes\n // 1 pixel wide.\n while (currentWidth >= 2 && currentHeight >= 2) {\n currentWidth = Math.floor(currentWidth / 2);\n currentHeight = Math.floor(currentHeight / 2);\n var smallCanvas = document.createElement(\"canvas\");\n var smallContext = smallCanvas.getContext(\"2d\");\n smallCanvas.width = currentWidth;\n smallCanvas.height = currentHeight;\n smallContext.drawImage(bigCanvas, 0, 0, currentWidth, currentHeight);\n\n levels.splice(0, 0, {\n context2D: smallContext,\n width: currentWidth,\n height: currentHeight\n });\n\n bigCanvas = smallCanvas;\n bigContext = smallContext;\n }\n return levels;\n }\n });\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - TileSourceCollection\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// deprecated\n$.TileSourceCollection = function( tileSize, tileSources, rows, layout ) {\n $.console.error('TileSourceCollection is deprecated; use World instead');\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Button\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * An enumeration of button states\n * @member ButtonState\n * @memberof OpenSeadragon\n * @static\n * @type {Object}\n * @property {Number} REST\n * @property {Number} GROUP\n * @property {Number} HOVER\n * @property {Number} DOWN\n */\n$.ButtonState = {\n REST: 0,\n GROUP: 1,\n HOVER: 2,\n DOWN: 3\n};\n\n/**\n * @class Button\n * @classdesc Manages events, hover states for individual buttons, tool-tips, as well\n * as fading the buttons out when the user has not interacted with them\n * for a specified period.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @param {Object} options\n * @param {Element} [options.element=null] Element to use as the button. If not specified, an HTML &lt;button&gt; element is created.\n * @param {String} [options.tooltip=null] Provides context help for the button when the\n * user hovers over it.\n * @param {String} [options.srcRest=null] URL of image to use in 'rest' state.\n * @param {String} [options.srcGroup=null] URL of image to use in 'up' state.\n * @param {String} [options.srcHover=null] URL of image to use in 'hover' state.\n * @param {String} [options.srcDown=null] URL of image to use in 'down' state.\n * @param {Number} [options.fadeDelay=0] How long to wait before fading.\n * @param {Number} [options.fadeLength=2000] How long should it take to fade the button.\n * @param {OpenSeadragon.EventHandler} [options.onPress=null] Event handler callback for {@link OpenSeadragon.Button.event:press}.\n * @param {OpenSeadragon.EventHandler} [options.onRelease=null] Event handler callback for {@link OpenSeadragon.Button.event:release}.\n * @param {OpenSeadragon.EventHandler} [options.onClick=null] Event handler callback for {@link OpenSeadragon.Button.event:click}.\n * @param {OpenSeadragon.EventHandler} [options.onEnter=null] Event handler callback for {@link OpenSeadragon.Button.event:enter}.\n * @param {OpenSeadragon.EventHandler} [options.onExit=null] Event handler callback for {@link OpenSeadragon.Button.event:exit}.\n * @param {OpenSeadragon.EventHandler} [options.onFocus=null] Event handler callback for {@link OpenSeadragon.Button.event:focus}.\n * @param {OpenSeadragon.EventHandler} [options.onBlur=null] Event handler callback for {@link OpenSeadragon.Button.event:blur}.\n */\n$.Button = function( options ) {\n\n var _this = this;\n\n $.EventSource.call( this );\n\n $.extend( true, this, {\n\n tooltip: null,\n srcRest: null,\n srcGroup: null,\n srcHover: null,\n srcDown: null,\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold,\n clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold,\n /**\n * How long to wait before fading.\n * @member {Number} fadeDelay\n * @memberof OpenSeadragon.Button#\n */\n fadeDelay: 0,\n /**\n * How long should it take to fade the button.\n * @member {Number} fadeLength\n * @memberof OpenSeadragon.Button#\n */\n fadeLength: 2000,\n onPress: null,\n onRelease: null,\n onClick: null,\n onEnter: null,\n onExit: null,\n onFocus: null,\n onBlur: null\n\n }, options );\n\n /**\n * The button element.\n * @member {Element} element\n * @memberof OpenSeadragon.Button#\n */\n this.element = options.element || $.makeNeutralElement( \"div\" );\n\n //if the user has specified the element to bind the control to explicitly\n //then do not add the default control images\n if ( !options.element ) {\n this.imgRest = $.makeTransparentImage( this.srcRest );\n this.imgGroup = $.makeTransparentImage( this.srcGroup );\n this.imgHover = $.makeTransparentImage( this.srcHover );\n this.imgDown = $.makeTransparentImage( this.srcDown );\n\n this.imgRest.alt =\n this.imgGroup.alt =\n this.imgHover.alt =\n this.imgDown.alt =\n this.tooltip;\n\n this.element.style.position = \"relative\";\n $.setElementTouchActionNone( this.element );\n\n this.imgGroup.style.position =\n this.imgHover.style.position =\n this.imgDown.style.position =\n \"absolute\";\n\n this.imgGroup.style.top =\n this.imgHover.style.top =\n this.imgDown.style.top =\n \"0px\";\n\n this.imgGroup.style.left =\n this.imgHover.style.left =\n this.imgDown.style.left =\n \"0px\";\n\n this.imgHover.style.visibility =\n this.imgDown.style.visibility =\n \"hidden\";\n\n if ( $.Browser.vendor == $.BROWSERS.FIREFOX && $.Browser.version < 3 ){\n this.imgGroup.style.top =\n this.imgHover.style.top =\n this.imgDown.style.top =\n \"\";\n }\n\n this.element.appendChild( this.imgRest );\n this.element.appendChild( this.imgGroup );\n this.element.appendChild( this.imgHover );\n this.element.appendChild( this.imgDown );\n }\n\n\n this.addHandler( \"press\", this.onPress );\n this.addHandler( \"release\", this.onRelease );\n this.addHandler( \"click\", this.onClick );\n this.addHandler( \"enter\", this.onEnter );\n this.addHandler( \"exit\", this.onExit );\n this.addHandler( \"focus\", this.onFocus );\n this.addHandler( \"blur\", this.onBlur );\n\n /**\n * The button's current state.\n * @member {OpenSeadragon.ButtonState} currentState\n * @memberof OpenSeadragon.Button#\n */\n this.currentState = $.ButtonState.GROUP;\n\n // When the button last began to fade.\n this.fadeBeginTime = null;\n // Whether this button should fade after user stops interacting with the viewport.\n this.shouldFade = false;\n\n this.element.style.display = \"inline-block\";\n this.element.style.position = \"relative\";\n this.element.title = this.tooltip;\n\n /**\n * Tracks mouse/touch/key events on the button.\n * @member {OpenSeadragon.MouseTracker} tracker\n * @memberof OpenSeadragon.Button#\n */\n this.tracker = new $.MouseTracker({\n\n element: this.element,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n\n enterHandler: function( event ) {\n if ( event.insideElementPressed ) {\n inTo( _this, $.ButtonState.DOWN );\n /**\n * Raised when the cursor enters the Button element.\n *\n * @event enter\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"enter\", { originalEvent: event.originalEvent } );\n } else if ( !event.buttonDownAny ) {\n inTo( _this, $.ButtonState.HOVER );\n }\n },\n\n focusHandler: function ( event ) {\n this.enterHandler( event );\n /**\n * Raised when the Button element receives focus.\n *\n * @event focus\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"focus\", { originalEvent: event.originalEvent } );\n },\n\n exitHandler: function( event ) {\n outTo( _this, $.ButtonState.GROUP );\n if ( event.insideElementPressed ) {\n /**\n * Raised when the cursor leaves the Button element.\n *\n * @event exit\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"exit\", { originalEvent: event.originalEvent } );\n }\n },\n\n blurHandler: function ( event ) {\n this.exitHandler( event );\n /**\n * Raised when the Button element loses focus.\n *\n * @event blur\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"blur\", { originalEvent: event.originalEvent } );\n },\n\n pressHandler: function ( event ) {\n inTo( _this, $.ButtonState.DOWN );\n /**\n * Raised when a mouse button is pressed or touch occurs in the Button element.\n *\n * @event press\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"press\", { originalEvent: event.originalEvent } );\n },\n\n releaseHandler: function( event ) {\n if ( event.insideElementPressed && event.insideElementReleased ) {\n outTo( _this, $.ButtonState.HOVER );\n /**\n * Raised when the mouse button is released or touch ends in the Button element.\n *\n * @event release\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"release\", { originalEvent: event.originalEvent } );\n } else if ( event.insideElementPressed ) {\n outTo( _this, $.ButtonState.GROUP );\n } else {\n inTo( _this, $.ButtonState.HOVER );\n }\n },\n\n clickHandler: function( event ) {\n if ( event.quick ) {\n /**\n * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold.\n *\n * @event click\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent(\"click\", { originalEvent: event.originalEvent });\n }\n },\n\n keyHandler: function( event ){\n //console.log( \"%s : handling key %s!\", _this.tooltip, event.keyCode);\n if( 13 === event.keyCode ){\n /***\n * Raised when a mouse button is pressed and released or touch is initiated and ended in the Button element within the time and distance threshold.\n *\n * @event click\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"click\", { originalEvent: event.originalEvent } );\n /***\n * Raised when the mouse button is released or touch ends in the Button element.\n *\n * @event release\n * @memberof OpenSeadragon.Button\n * @type {object}\n * @property {OpenSeadragon.Button} eventSource - A reference to the Button which raised the event.\n * @property {Object} originalEvent - The original DOM event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.raiseEvent( \"release\", { originalEvent: event.originalEvent } );\n return false;\n }\n return true;\n }\n\n });\n\n outTo( this, $.ButtonState.REST );\n};\n\n$.extend( $.Button.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.Button.prototype */{\n\n /**\n * TODO: Determine what this function is intended to do and if it's actually\n * useful as an API point.\n * @function\n */\n notifyGroupEnter: function() {\n inTo( this, $.ButtonState.GROUP );\n },\n\n /**\n * TODO: Determine what this function is intended to do and if it's actually\n * useful as an API point.\n * @function\n */\n notifyGroupExit: function() {\n outTo( this, $.ButtonState.REST );\n },\n\n /**\n * @function\n */\n disable: function(){\n this.notifyGroupExit();\n this.element.disabled = true;\n $.setElementOpacity( this.element, 0.2, true );\n },\n\n /**\n * @function\n */\n enable: function(){\n this.element.disabled = false;\n $.setElementOpacity( this.element, 1.0, true );\n this.notifyGroupEnter();\n }\n\n});\n\n\nfunction scheduleFade( button ) {\n $.requestAnimationFrame(function(){\n updateFade( button );\n });\n}\n\nfunction updateFade( button ) {\n var currentTime,\n deltaTime,\n opacity;\n\n if ( button.shouldFade ) {\n currentTime = $.now();\n deltaTime = currentTime - button.fadeBeginTime;\n opacity = 1.0 - deltaTime / button.fadeLength;\n opacity = Math.min( 1.0, opacity );\n opacity = Math.max( 0.0, opacity );\n\n if( button.imgGroup ){\n $.setElementOpacity( button.imgGroup, opacity, true );\n }\n if ( opacity > 0 ) {\n // fade again\n scheduleFade( button );\n }\n }\n}\n\nfunction beginFading( button ) {\n button.shouldFade = true;\n button.fadeBeginTime = $.now() + button.fadeDelay;\n window.setTimeout( function(){\n scheduleFade( button );\n }, button.fadeDelay );\n}\n\nfunction stopFading( button ) {\n button.shouldFade = false;\n if( button.imgGroup ){\n $.setElementOpacity( button.imgGroup, 1.0, true );\n }\n}\n\nfunction inTo( button, newState ) {\n\n if( button.element.disabled ){\n return;\n }\n\n if ( newState >= $.ButtonState.GROUP &&\n button.currentState == $.ButtonState.REST ) {\n stopFading( button );\n button.currentState = $.ButtonState.GROUP;\n }\n\n if ( newState >= $.ButtonState.HOVER &&\n button.currentState == $.ButtonState.GROUP ) {\n if( button.imgHover ){\n button.imgHover.style.visibility = \"\";\n }\n button.currentState = $.ButtonState.HOVER;\n }\n\n if ( newState >= $.ButtonState.DOWN &&\n button.currentState == $.ButtonState.HOVER ) {\n if( button.imgDown ){\n button.imgDown.style.visibility = \"\";\n }\n button.currentState = $.ButtonState.DOWN;\n }\n}\n\n\nfunction outTo( button, newState ) {\n\n if( button.element.disabled ){\n return;\n }\n\n if ( newState <= $.ButtonState.HOVER &&\n button.currentState == $.ButtonState.DOWN ) {\n if( button.imgDown ){\n button.imgDown.style.visibility = \"hidden\";\n }\n button.currentState = $.ButtonState.HOVER;\n }\n\n if ( newState <= $.ButtonState.GROUP &&\n button.currentState == $.ButtonState.HOVER ) {\n if( button.imgHover ){\n button.imgHover.style.visibility = \"hidden\";\n }\n button.currentState = $.ButtonState.GROUP;\n }\n\n if ( newState <= $.ButtonState.REST &&\n button.currentState == $.ButtonState.GROUP ) {\n beginFading( button );\n button.currentState = $.ButtonState.REST;\n }\n}\n\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ButtonGroup\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n/**\n * @class ButtonGroup\n * @classdesc Manages events on groups of buttons.\n *\n * @memberof OpenSeadragon\n * @param {Object} options - A dictionary of settings applied against the entire group of buttons.\n * @param {Array} options.buttons Array of buttons\n * @param {Element} [options.element] Element to use as the container\n **/\n$.ButtonGroup = function( options ) {\n\n $.extend( true, this, {\n /**\n * An array containing the buttons themselves.\n * @member {Array} buttons\n * @memberof OpenSeadragon.ButtonGroup#\n */\n buttons: [],\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold,\n clickDistThreshold: $.DEFAULT_SETTINGS.clickDistThreshold,\n labelText: \"\"\n }, options );\n\n // copy the button elements TODO: Why?\n var buttons = this.buttons.concat([]),\n _this = this,\n i;\n\n /**\n * The shared container for the buttons.\n * @member {Element} element\n * @memberof OpenSeadragon.ButtonGroup#\n */\n this.element = options.element || $.makeNeutralElement( \"div\" );\n\n // TODO What if there IS an options.group specified?\n if( !options.group ){\n this.label = $.makeNeutralElement( \"label\" );\n //TODO: support labels for ButtonGroups\n //this.label.innerHTML = this.labelText;\n this.element.style.display = \"inline-block\";\n this.element.appendChild( this.label );\n for ( i = 0; i < buttons.length; i++ ) {\n this.element.appendChild( buttons[ i ].element );\n }\n }\n\n $.setElementTouchActionNone( this.element );\n\n /**\n * Tracks mouse/touch/key events accross the group of buttons.\n * @member {OpenSeadragon.MouseTracker} tracker\n * @memberof OpenSeadragon.ButtonGroup#\n */\n this.tracker = new $.MouseTracker({\n element: this.element,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n enterHandler: function ( event ) {\n var i;\n for ( i = 0; i < _this.buttons.length; i++ ) {\n _this.buttons[ i ].notifyGroupEnter();\n }\n },\n exitHandler: function ( event ) {\n var i;\n if ( !event.insideElementPressed ) {\n for ( i = 0; i < _this.buttons.length; i++ ) {\n _this.buttons[ i ].notifyGroupExit();\n }\n }\n },\n });\n};\n\n/** @lends OpenSeadragon.ButtonGroup.prototype */\n$.ButtonGroup.prototype = {\n\n /**\n * TODO: Figure out why this is used on the public API and if a more useful\n * api can be created.\n * @function\n * @private\n */\n emulateEnter: function() {\n this.tracker.enterHandler( { eventSource: this.tracker } );\n },\n\n /**\n * TODO: Figure out why this is used on the public API and if a more useful\n * api can be created.\n * @function\n * @private\n */\n emulateExit: function() {\n this.tracker.exitHandler( { eventSource: this.tracker } );\n }\n};\n\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Rect\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n/**\n * @class Rect\n * @classdesc A Rectangle is described by it top left coordinates (x, y), width,\n * height and degrees of rotation around (x, y).\n * Note that the coordinate system used is the one commonly used with images:\n * x increases when going to the right\n * y increases when going to the bottom\n * degrees increases clockwise with 0 being the horizontal\n *\n * The constructor normalizes the rectangle to always have 0 <= degrees < 90\n *\n * @memberof OpenSeadragon\n * @param {Number} [x=0] The vector component 'x'.\n * @param {Number} [y=0] The vector component 'y'.\n * @param {Number} [width=0] The vector component 'width'.\n * @param {Number} [height=0] The vector component 'height'.\n * @param {Number} [degrees=0] Rotation of the rectangle around (x,y) in degrees.\n */\n$.Rect = function(x, y, width, height, degrees) {\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Rect#\n */\n this.x = typeof(x) === \"number\" ? x : 0;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Rect#\n */\n this.y = typeof(y) === \"number\" ? y : 0;\n /**\n * The vector component 'width'.\n * @member {Number} width\n * @memberof OpenSeadragon.Rect#\n */\n this.width = typeof(width) === \"number\" ? width : 0;\n /**\n * The vector component 'height'.\n * @member {Number} height\n * @memberof OpenSeadragon.Rect#\n */\n this.height = typeof(height) === \"number\" ? height : 0;\n\n this.degrees = typeof(degrees) === \"number\" ? degrees : 0;\n\n // Normalizes the rectangle.\n this.degrees = this.degrees % 360;\n if (this.degrees < 0) {\n this.degrees += 360;\n }\n var newTopLeft, newWidth;\n if (this.degrees >= 270) {\n newTopLeft = this.getTopRight();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n newWidth = this.height;\n this.height = this.width;\n this.width = newWidth;\n this.degrees -= 270;\n } else if (this.degrees >= 180) {\n newTopLeft = this.getBottomRight();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n this.degrees -= 180;\n } else if (this.degrees >= 90) {\n newTopLeft = this.getBottomLeft();\n this.x = newTopLeft.x;\n this.y = newTopLeft.y;\n newWidth = this.height;\n this.height = this.width;\n this.width = newWidth;\n this.degrees -= 90;\n }\n};\n\n/**\n * Builds a rectangle having the 3 specified points as summits.\n * @static\n * @memberof OpenSeadragon.Rect\n * @param {OpenSeadragon.Point} topLeft\n * @param {OpenSeadragon.Point} topRight\n * @param {OpenSeadragon.Point} bottomLeft\n * @returns {OpenSeadragon.Rect}\n */\n$.Rect.fromSummits = function(topLeft, topRight, bottomLeft) {\n var width = topLeft.distanceTo(topRight);\n var height = topLeft.distanceTo(bottomLeft);\n var diff = topRight.minus(topLeft);\n var radians = Math.atan(diff.y / diff.x);\n if (diff.x < 0) {\n radians += Math.PI;\n } else if (diff.y < 0) {\n radians += 2 * Math.PI;\n }\n return new $.Rect(\n topLeft.x,\n topLeft.y,\n width,\n height,\n radians / Math.PI * 180);\n};\n\n/** @lends OpenSeadragon.Rect.prototype */\n$.Rect.prototype = {\n /**\n * @function\n * @returns {OpenSeadragon.Rect} a duplicate of this Rect\n */\n clone: function() {\n return new $.Rect(\n this.x,\n this.y,\n this.width,\n this.height,\n this.degrees);\n },\n\n /**\n * The aspect ratio is simply the ratio of width to height.\n * @function\n * @returns {Number} The ratio of width to height.\n */\n getAspectRatio: function() {\n return this.width / this.height;\n },\n\n /**\n * Provides the coordinates of the upper-left corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the upper-left corner of\n * the rectangle.\n */\n getTopLeft: function() {\n return new $.Point(\n this.x,\n this.y\n );\n },\n\n /**\n * Provides the coordinates of the bottom-right corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the bottom-right corner of\n * the rectangle.\n */\n getBottomRight: function() {\n return new $.Point(this.x + this.width, this.y + this.height)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Provides the coordinates of the top-right corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the top-right corner of\n * the rectangle.\n */\n getTopRight: function() {\n return new $.Point(this.x + this.width, this.y)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Provides the coordinates of the bottom-left corner of the rectangle as a\n * point.\n * @function\n * @returns {OpenSeadragon.Point} The coordinate of the bottom-left corner of\n * the rectangle.\n */\n getBottomLeft: function() {\n return new $.Point(this.x, this.y + this.height)\n .rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Computes the center of the rectangle.\n * @function\n * @returns {OpenSeadragon.Point} The center of the rectangle as represented\n * as represented by a 2-dimensional vector (x,y)\n */\n getCenter: function() {\n return new $.Point(\n this.x + this.width / 2.0,\n this.y + this.height / 2.0\n ).rotate(this.degrees, this.getTopLeft());\n },\n\n /**\n * Returns the width and height component as a vector OpenSeadragon.Point\n * @function\n * @returns {OpenSeadragon.Point} The 2 dimensional vector representing the\n * the width and height of the rectangle.\n */\n getSize: function() {\n return new $.Point(this.width, this.height);\n },\n\n /**\n * Determines if two Rectangles have equivalent components.\n * @function\n * @param {OpenSeadragon.Rect} rectangle The Rectangle to compare to.\n * @return {Boolean} 'true' if all components are equal, otherwise 'false'.\n */\n equals: function(other) {\n return (other instanceof $.Rect) &&\n this.x === other.x &&\n this.y === other.y &&\n this.width === other.width &&\n this.height === other.height &&\n this.degrees === other.degrees;\n },\n\n /**\n * Multiply all dimensions (except degrees) in this Rect by a factor and\n * return a new Rect.\n * @function\n * @param {Number} factor The factor to multiply vector components.\n * @returns {OpenSeadragon.Rect} A new rect representing the multiplication\n * of the vector components by the factor\n */\n times: function(factor) {\n return new $.Rect(\n this.x * factor,\n this.y * factor,\n this.width * factor,\n this.height * factor,\n this.degrees);\n },\n\n /**\n * Translate/move this Rect by a vector and return new Rect.\n * @function\n * @param {OpenSeadragon.Point} delta The translation vector.\n * @returns {OpenSeadragon.Rect} A new rect with altered position\n */\n translate: function(delta) {\n return new $.Rect(\n this.x + delta.x,\n this.y + delta.y,\n this.width,\n this.height,\n this.degrees);\n },\n\n /**\n * Returns the smallest rectangle that will contain this and the given\n * rectangle bounding boxes.\n * @param {OpenSeadragon.Rect} rect\n * @return {OpenSeadragon.Rect} The new rectangle.\n */\n union: function(rect) {\n var thisBoundingBox = this.getBoundingBox();\n var otherBoundingBox = rect.getBoundingBox();\n\n var left = Math.min(thisBoundingBox.x, otherBoundingBox.x);\n var top = Math.min(thisBoundingBox.y, otherBoundingBox.y);\n var right = Math.max(\n thisBoundingBox.x + thisBoundingBox.width,\n otherBoundingBox.x + otherBoundingBox.width);\n var bottom = Math.max(\n thisBoundingBox.y + thisBoundingBox.height,\n otherBoundingBox.y + otherBoundingBox.height);\n\n return new $.Rect(\n left,\n top,\n right - left,\n bottom - top);\n },\n\n /**\n * Returns the bounding box of the intersection of this rectangle with the\n * given rectangle.\n * @param {OpenSeadragon.Rect} rect\n * @return {OpenSeadragon.Rect} the bounding box of the intersection\n * or null if the rectangles don't intersect.\n */\n intersection: function(rect) {\n // Simplified version of Weiler Atherton clipping algorithm\n // https://en.wikipedia.org/wiki/Weiler%E2%80%93Atherton_clipping_algorithm\n // Because we just want the bounding box of the intersection,\n // we can just compute the bounding box of:\n // 1. all the summits of this which are inside rect\n // 2. all the summits of rect which are inside this\n // 3. all the intersections of rect and this\n var EPSILON = 0.0000000001;\n\n var intersectionPoints = [];\n\n var thisTopLeft = this.getTopLeft();\n if (rect.containsPoint(thisTopLeft, EPSILON)) {\n intersectionPoints.push(thisTopLeft);\n }\n var thisTopRight = this.getTopRight();\n if (rect.containsPoint(thisTopRight, EPSILON)) {\n intersectionPoints.push(thisTopRight);\n }\n var thisBottomLeft = this.getBottomLeft();\n if (rect.containsPoint(thisBottomLeft, EPSILON)) {\n intersectionPoints.push(thisBottomLeft);\n }\n var thisBottomRight = this.getBottomRight();\n if (rect.containsPoint(thisBottomRight, EPSILON)) {\n intersectionPoints.push(thisBottomRight);\n }\n\n var rectTopLeft = rect.getTopLeft();\n if (this.containsPoint(rectTopLeft, EPSILON)) {\n intersectionPoints.push(rectTopLeft);\n }\n var rectTopRight = rect.getTopRight();\n if (this.containsPoint(rectTopRight, EPSILON)) {\n intersectionPoints.push(rectTopRight);\n }\n var rectBottomLeft = rect.getBottomLeft();\n if (this.containsPoint(rectBottomLeft, EPSILON)) {\n intersectionPoints.push(rectBottomLeft);\n }\n var rectBottomRight = rect.getBottomRight();\n if (this.containsPoint(rectBottomRight, EPSILON)) {\n intersectionPoints.push(rectBottomRight);\n }\n\n var thisSegments = this._getSegments();\n var rectSegments = rect._getSegments();\n for (var i = 0; i < thisSegments.length; i++) {\n var thisSegment = thisSegments[i];\n for (var j = 0; j < rectSegments.length; j++) {\n var rectSegment = rectSegments[j];\n var intersect = getIntersection(thisSegment[0], thisSegment[1],\n rectSegment[0], rectSegment[1]);\n if (intersect) {\n intersectionPoints.push(intersect);\n }\n }\n }\n\n // Get intersection point of segments [a,b] and [c,d]\n function getIntersection(a, b, c, d) {\n // http://stackoverflow.com/a/1968345/1440403\n var abVector = b.minus(a);\n var cdVector = d.minus(c);\n\n var denom = -cdVector.x * abVector.y + abVector.x * cdVector.y;\n if (denom === 0) {\n return null;\n }\n\n var s = (abVector.x * (a.y - c.y) - abVector.y * (a.x - c.x)) / denom;\n var t = (cdVector.x * (a.y - c.y) - cdVector.y * (a.x - c.x)) / denom;\n\n if (-EPSILON <= s && s <= 1 - EPSILON &&\n -EPSILON <= t && t <= 1 - EPSILON) {\n return new $.Point(a.x + t * abVector.x, a.y + t * abVector.y);\n }\n return null;\n }\n\n if (intersectionPoints.length === 0) {\n return null;\n }\n\n var minX = intersectionPoints[0].x;\n var maxX = intersectionPoints[0].x;\n var minY = intersectionPoints[0].y;\n var maxY = intersectionPoints[0].y;\n for (var k = 1; k < intersectionPoints.length; k++) {\n var point = intersectionPoints[k];\n if (point.x < minX) {\n minX = point.x;\n }\n if (point.x > maxX) {\n maxX = point.x;\n }\n if (point.y < minY) {\n minY = point.y;\n }\n if (point.y > maxY) {\n maxY = point.y;\n }\n }\n return new $.Rect(minX, minY, maxX - minX, maxY - minY);\n },\n\n // private\n _getSegments: function() {\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var bottomRight = this.getBottomRight();\n return [[topLeft, topRight],\n [topRight, bottomRight],\n [bottomRight, bottomLeft],\n [bottomLeft, topLeft]];\n },\n\n /**\n * Rotates a rectangle around a point.\n * @function\n * @param {Number} degrees The angle in degrees to rotate.\n * @param {OpenSeadragon.Point} [pivot] The point about which to rotate.\n * Defaults to the center of the rectangle.\n * @return {OpenSeadragon.Rect}\n */\n rotate: function(degrees, pivot) {\n degrees = degrees % 360;\n if (degrees === 0) {\n return this.clone();\n }\n if (degrees < 0) {\n degrees += 360;\n }\n\n pivot = pivot || this.getCenter();\n var newTopLeft = this.getTopLeft().rotate(degrees, pivot);\n var newTopRight = this.getTopRight().rotate(degrees, pivot);\n\n var diff = newTopRight.minus(newTopLeft);\n var radians = Math.atan(diff.y / diff.x);\n if (diff.x < 0) {\n radians += Math.PI;\n } else if (diff.y < 0) {\n radians += 2 * Math.PI;\n }\n return new $.Rect(\n newTopLeft.x,\n newTopLeft.y,\n this.width,\n this.height,\n radians / Math.PI * 180);\n },\n\n /**\n * Retrieves the smallest horizontal (degrees=0) rectangle which contains\n * this rectangle.\n * @returns {OpenSeadragon.Rect}\n */\n getBoundingBox: function() {\n if (this.degrees === 0) {\n return this.clone();\n }\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var bottomRight = this.getBottomRight();\n var minX = Math.min(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n var maxX = Math.max(topLeft.x, topRight.x, bottomLeft.x, bottomRight.x);\n var minY = Math.min(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n var maxY = Math.max(topLeft.y, topRight.y, bottomLeft.y, bottomRight.y);\n return new $.Rect(\n minX,\n minY,\n maxX - minX,\n maxY - minY);\n },\n\n /**\n * Retrieves the smallest horizontal (degrees=0) rectangle which contains\n * this rectangle and has integers x, y, width and height\n * @returns {OpenSeadragon.Rect}\n */\n getIntegerBoundingBox: function() {\n var boundingBox = this.getBoundingBox();\n var x = Math.floor(boundingBox.x);\n var y = Math.floor(boundingBox.y);\n var width = Math.ceil(boundingBox.width + boundingBox.x - x);\n var height = Math.ceil(boundingBox.height + boundingBox.y - y);\n return new $.Rect(x, y, width, height);\n },\n\n /**\n * Determines whether a point is inside this rectangle (edge included).\n * @function\n * @param {OpenSeadragon.Point} point\n * @param {Number} [epsilon=0] the margin of error allowed\n * @returns {Boolean} true if the point is inside this rectangle, false\n * otherwise.\n */\n containsPoint: function(point, epsilon) {\n epsilon = epsilon || 0;\n\n // See http://stackoverflow.com/a/2752754/1440403 for explanation\n var topLeft = this.getTopLeft();\n var topRight = this.getTopRight();\n var bottomLeft = this.getBottomLeft();\n var topDiff = topRight.minus(topLeft);\n var leftDiff = bottomLeft.minus(topLeft);\n\n return ((point.x - topLeft.x) * topDiff.x +\n (point.y - topLeft.y) * topDiff.y >= -epsilon) &&\n\n ((point.x - topRight.x) * topDiff.x +\n (point.y - topRight.y) * topDiff.y <= epsilon) &&\n\n ((point.x - topLeft.x) * leftDiff.x +\n (point.y - topLeft.y) * leftDiff.y >= -epsilon) &&\n\n ((point.x - bottomLeft.x) * leftDiff.x +\n (point.y - bottomLeft.y) * leftDiff.y <= epsilon);\n },\n\n /**\n * Provides a string representation of the rectangle which is useful for\n * debugging.\n * @function\n * @returns {String} A string representation of the rectangle.\n */\n toString: function() {\n return \"[\" +\n (Math.round(this.x * 100) / 100) + \", \" +\n (Math.round(this.y * 100) / 100) + \", \" +\n (Math.round(this.width * 100) / 100) + \"x\" +\n (Math.round(this.height * 100) / 100) + \", \" +\n (Math.round(this.degrees * 100) / 100) + \"deg\" +\n \"]\";\n }\n};\n\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - ReferenceStrip\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function ( $ ) {\n\n// dictionary from id to private properties\nvar THIS = {};\n\n/**\n * The CollectionDrawer is a reimplementation if the Drawer API that\n * focuses on allowing a viewport to be redefined as a collection\n * of smaller viewports, defined by a clear number of rows and / or\n * columns of which each item in the matrix of viewports has its own\n * source.\n *\n * This idea is a reexpression of the idea of dzi collections\n * which allows a clearer algorithm to reuse the tile sources already\n * supported by OpenSeadragon, in heterogenious or homogenious\n * sequences just like mixed groups already supported by the viewer\n * for the purpose of image sequnces.\n *\n * TODO: The difficult part of this feature is figuring out how to express\n * this functionality as a combination of the functionality already\n * provided by Drawer, Viewport, TileSource, and Navigator. It may\n * require better abstraction at those points in order to effeciently\n * reuse those paradigms.\n */\n/**\n * @class ReferenceStrip\n * @memberof OpenSeadragon\n * @param {Object} options\n */\n$.ReferenceStrip = function ( options ) {\n\n var _this = this,\n viewer = options.viewer,\n viewerSize = $.getElementSize( viewer.element ),\n element,\n style,\n i;\n\n //We may need to create a new element and id if they did not\n //provide the id for the existing element\n if ( !options.id ) {\n options.id = 'referencestrip-' + $.now();\n this.element = $.makeNeutralElement( \"div\" );\n this.element.id = options.id;\n this.element.className = 'referencestrip';\n }\n\n options = $.extend( true, {\n sizeRatio: $.DEFAULT_SETTINGS.referenceStripSizeRatio,\n position: $.DEFAULT_SETTINGS.referenceStripPosition,\n scroll: $.DEFAULT_SETTINGS.referenceStripScroll,\n clickTimeThreshold: $.DEFAULT_SETTINGS.clickTimeThreshold\n }, options, {\n //required overrides\n element: this.element,\n //These need to be overridden to prevent recursion since\n //the navigator is a viewer and a viewer has a navigator\n showNavigator: false,\n mouseNavEnabled: false,\n showNavigationControl: false,\n showSequenceControl: false\n } );\n\n $.extend( this, options );\n //Private state properties\n THIS[this.id] = {\n \"animating\": false\n };\n\n this.minPixelRatio = this.viewer.minPixelRatio;\n\n style = this.element.style;\n style.marginTop = '0px';\n style.marginRight = '0px';\n style.marginBottom = '0px';\n style.marginLeft = '0px';\n style.left = '0px';\n style.bottom = '0px';\n style.border = '0px';\n style.background = '#000';\n style.position = 'relative';\n\n $.setElementTouchActionNone( this.element );\n\n $.setElementOpacity( this.element, 0.8 );\n\n this.viewer = viewer;\n this.innerTracker = new $.MouseTracker( {\n element: this.element,\n dragHandler: $.delegate( this, onStripDrag ),\n scrollHandler: $.delegate( this, onStripScroll ),\n enterHandler: $.delegate( this, onStripEnter ),\n exitHandler: $.delegate( this, onStripExit ),\n keyDownHandler: $.delegate( this, onKeyDown ),\n keyHandler: $.delegate( this, onKeyPress )\n } );\n\n //Controls the position and orientation of the reference strip and sets the\n //appropriate width and height\n if ( options.width && options.height ) {\n this.element.style.width = options.width + 'px';\n this.element.style.height = options.height + 'px';\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.BOTTOM_LEFT }\n );\n } else {\n if ( \"horizontal\" == options.scroll ) {\n this.element.style.width = (\n viewerSize.x *\n options.sizeRatio *\n viewer.tileSources.length\n ) + ( 12 * viewer.tileSources.length ) + 'px';\n\n this.element.style.height = (\n viewerSize.y *\n options.sizeRatio\n ) + 'px';\n\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.BOTTOM_LEFT }\n );\n } else {\n this.element.style.height = (\n viewerSize.y *\n options.sizeRatio *\n viewer.tileSources.length\n ) + ( 12 * viewer.tileSources.length ) + 'px';\n\n this.element.style.width = (\n viewerSize.x *\n options.sizeRatio\n ) + 'px';\n\n viewer.addControl(\n this.element,\n { anchor: $.ControlAnchor.TOP_LEFT }\n );\n\n }\n }\n\n this.panelWidth = ( viewerSize.x * this.sizeRatio ) + 8;\n this.panelHeight = ( viewerSize.y * this.sizeRatio ) + 8;\n this.panels = [];\n\n /*jshint loopfunc:true*/\n for ( i = 0; i < viewer.tileSources.length; i++ ) {\n\n element = $.makeNeutralElement( 'div' );\n element.id = this.element.id + \"-\" + i;\n\n element.style.width = _this.panelWidth + 'px';\n element.style.height = _this.panelHeight + 'px';\n element.style.display = 'inline';\n element.style.float = 'left'; //Webkit\n element.style.cssFloat = 'left'; //Firefox\n element.style.styleFloat = 'left'; //IE\n element.style.padding = '2px';\n $.setElementTouchActionNone( element );\n\n element.innerTracker = new $.MouseTracker( {\n element: element,\n clickTimeThreshold: this.clickTimeThreshold,\n clickDistThreshold: this.clickDistThreshold,\n pressHandler: function ( event ) {\n event.eventSource.dragging = $.now();\n },\n releaseHandler: function ( event ) {\n var tracker = event.eventSource,\n id = tracker.element.id,\n page = Number( id.split( '-' )[2] ),\n now = $.now();\n\n if ( event.insideElementPressed &&\n event.insideElementReleased &&\n tracker.dragging &&\n ( now - tracker.dragging ) < tracker.clickTimeThreshold ) {\n tracker.dragging = null;\n viewer.goToPage( page );\n }\n }\n } );\n\n this.element.appendChild( element );\n\n element.activePanel = false;\n\n this.panels.push( element );\n\n }\n loadPanels( this, this.scroll == 'vertical' ? viewerSize.y : viewerSize.x, 0 );\n this.setFocus( 0 );\n\n};\n\n$.extend( $.ReferenceStrip.prototype, $.EventSource.prototype, $.Viewer.prototype, /** @lends OpenSeadragon.ReferenceStrip.prototype */{\n\n /**\n * @function\n */\n setFocus: function ( page ) {\n var element = $.getElement( this.element.id + '-' + page ),\n viewerSize = $.getElementSize( this.viewer.canvas ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n offsetLeft = -Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = -Number( this.element.style.marginTop.replace( 'px', '' ) ),\n offset;\n\n if ( this.currentSelected !== element ) {\n if ( this.currentSelected ) {\n this.currentSelected.style.background = '#000';\n }\n this.currentSelected = element;\n this.currentSelected.style.background = '#999';\n\n if ( 'horizontal' == this.scroll ) {\n //right left\n offset = ( Number( page ) ) * ( this.panelWidth + 3 );\n if ( offset > offsetLeft + viewerSize.x - this.panelWidth ) {\n offset = Math.min( offset, ( scrollWidth - viewerSize.x ) );\n this.element.style.marginLeft = -offset + 'px';\n loadPanels( this, viewerSize.x, -offset );\n } else if ( offset < offsetLeft ) {\n offset = Math.max( 0, offset - viewerSize.x / 2 );\n this.element.style.marginLeft = -offset + 'px';\n loadPanels( this, viewerSize.x, -offset );\n }\n } else {\n offset = ( Number( page ) ) * ( this.panelHeight + 3 );\n if ( offset > offsetTop + viewerSize.y - this.panelHeight ) {\n offset = Math.min( offset, ( scrollHeight - viewerSize.y ) );\n this.element.style.marginTop = -offset + 'px';\n loadPanels( this, viewerSize.y, -offset );\n } else if ( offset < offsetTop ) {\n offset = Math.max( 0, offset - viewerSize.y / 2 );\n this.element.style.marginTop = -offset + 'px';\n loadPanels( this, viewerSize.y, -offset );\n }\n }\n\n this.currentPage = page;\n onStripEnter.call( this, { eventSource: this.innerTracker } );\n }\n },\n\n /**\n * @function\n */\n update: function () {\n if ( THIS[this.id].animating ) {\n $.console.log( 'image reference strip update' );\n return true;\n }\n return false;\n },\n\n // Overrides Viewer.destroy\n destroy: function() {\n if (this.element) {\n this.element.parentNode.removeChild(this.element);\n }\n }\n\n} );\n\n\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripDrag( event ) {\n\n var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n viewerSize = $.getElementSize( this.viewer.canvas );\n this.dragging = true;\n if ( this.element ) {\n if ( 'horizontal' == this.scroll ) {\n if ( -event.delta.x > 0 ) {\n //forward\n if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) {\n this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) );\n }\n } else if ( -event.delta.x < 0 ) {\n //reverse\n if ( offsetLeft < 0 ) {\n this.element.style.marginLeft = ( offsetLeft + ( event.delta.x * 2 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft + ( event.delta.x * 2 ) );\n }\n }\n } else {\n if ( -event.delta.y > 0 ) {\n //forward\n if ( offsetTop > -( scrollHeight - viewerSize.y ) ) {\n this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) );\n }\n } else if ( -event.delta.y < 0 ) {\n //reverse\n if ( offsetTop < 0 ) {\n this.element.style.marginTop = ( offsetTop + ( event.delta.y * 2 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.delta.y * 2 ) );\n }\n }\n }\n }\n return false;\n\n}\n\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripScroll( event ) {\n var offsetLeft = Number( this.element.style.marginLeft.replace( 'px', '' ) ),\n offsetTop = Number( this.element.style.marginTop.replace( 'px', '' ) ),\n scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),\n scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),\n viewerSize = $.getElementSize( this.viewer.canvas );\n if ( this.element ) {\n if ( 'horizontal' == this.scroll ) {\n if ( event.scroll > 0 ) {\n //forward\n if ( offsetLeft > -( scrollWidth - viewerSize.x ) ) {\n this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) );\n }\n } else if ( event.scroll < 0 ) {\n //reverse\n if ( offsetLeft < 0 ) {\n this.element.style.marginLeft = ( offsetLeft - ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.x, offsetLeft - ( event.scroll * 60 ) );\n }\n }\n } else {\n if ( event.scroll < 0 ) {\n //scroll up\n if ( offsetTop > viewerSize.y - scrollHeight ) {\n this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) );\n }\n } else if ( event.scroll > 0 ) {\n //scroll dowm\n if ( offsetTop < 0 ) {\n this.element.style.marginTop = ( offsetTop + ( event.scroll * 60 ) ) + 'px';\n loadPanels( this, viewerSize.y, offsetTop + ( event.scroll * 60 ) );\n }\n }\n }\n }\n //cancels event\n return false;\n}\n\n\nfunction loadPanels( strip, viewerSize, scroll ) {\n var panelSize,\n activePanelsStart,\n activePanelsEnd,\n miniViewer,\n style,\n i,\n element;\n if ( 'horizontal' == strip.scroll ) {\n panelSize = strip.panelWidth;\n } else {\n panelSize = strip.panelHeight;\n }\n activePanelsStart = Math.ceil( viewerSize / panelSize ) + 5;\n activePanelsEnd = Math.ceil( ( Math.abs( scroll ) + viewerSize ) / panelSize ) + 1;\n activePanelsStart = activePanelsEnd - activePanelsStart;\n activePanelsStart = activePanelsStart < 0 ? 0 : activePanelsStart;\n\n for ( i = activePanelsStart; i < activePanelsEnd && i < strip.panels.length; i++ ) {\n element = strip.panels[i];\n if ( !element.activePanel ) {\n miniViewer = new $.Viewer( {\n id: element.id,\n tileSources: [strip.viewer.tileSources[i]],\n element: element,\n navigatorSizeRatio: strip.sizeRatio,\n showNavigator: false,\n mouseNavEnabled: false,\n showNavigationControl: false,\n showSequenceControl: false,\n immediateRender: true,\n blendTime: 0,\n animationTime: 0\n } );\n\n miniViewer.displayRegion = $.makeNeutralElement( \"div\" );\n miniViewer.displayRegion.id = element.id + '-displayregion';\n miniViewer.displayRegion.className = 'displayregion';\n\n style = miniViewer.displayRegion.style;\n style.position = 'relative';\n style.top = '0px';\n style.left = '0px';\n style.fontSize = '0px';\n style.overflow = 'hidden';\n style.float = 'left'; //Webkit\n style.cssFloat = 'left'; //Firefox\n style.styleFloat = 'left'; //IE\n style.zIndex = 999999999;\n style.cursor = 'default';\n style.width = ( strip.panelWidth - 4 ) + 'px';\n style.height = ( strip.panelHeight - 4 ) + 'px';\n\n // TODO: What is this for? Future keyboard navigation support?\n miniViewer.displayRegion.innerTracker = new $.MouseTracker( {\n element: miniViewer.displayRegion,\n startDisabled: true\n } );\n\n element.getElementsByTagName( 'div' )[0].appendChild(\n miniViewer.displayRegion\n );\n\n element.activePanel = true;\n }\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripEnter( event ) {\n var element = event.eventSource.element;\n\n //$.setElementOpacity(element, 0.8);\n\n //element.style.border = '1px solid #555';\n //element.style.background = '#000';\n\n if ( 'horizontal' == this.scroll ) {\n\n //element.style.paddingTop = \"0px\";\n element.style.marginBottom = \"0px\";\n\n } else {\n\n //element.style.paddingRight = \"0px\";\n element.style.marginLeft = \"0px\";\n\n }\n return false;\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onStripExit( event ) {\n var element = event.eventSource.element;\n\n if ( 'horizontal' == this.scroll ) {\n\n //element.style.paddingTop = \"10px\";\n element.style.marginBottom = \"-\" + ( $.getElementSize( element ).y / 2 ) + \"px\";\n\n } else {\n\n //element.style.paddingRight = \"10px\";\n element.style.marginLeft = \"-\" + ( $.getElementSize( element ).x / 2 ) + \"px\";\n\n }\n return false;\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onKeyDown( event ) {\n //console.log( event.keyCode );\n\n if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n switch ( event.keyCode ) {\n case 38: //up arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n return false;\n case 40: //down arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n return false;\n case 37: //left arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n return false;\n case 39: //right arrow\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n return false;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n return true;\n }\n } else {\n return true;\n }\n}\n\n\n/**\n * @private\n * @inner\n * @function\n */\nfunction onKeyPress( event ) {\n //console.log( event.keyCode );\n\n if ( !event.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {\n switch ( event.keyCode ) {\n case 61: //=|+\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n return false;\n case 45: //-|_\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n return false;\n case 48: //0|)\n case 119: //w\n case 87: //W\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n return false;\n case 115: //s\n case 83: //S\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n return false;\n case 97: //a\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: -1, shift: null } );\n return false;\n case 100: //d\n onStripScroll.call( this, { eventSource: this.tracker, position: null, scroll: 1, shift: null } );\n return false;\n default:\n //console.log( 'navigator keycode %s', event.keyCode );\n return true;\n }\n } else {\n return true;\n }\n}\n\n\n\n} ( OpenSeadragon ) );\n","/*\n * OpenSeadragon - DisplayRect\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class DisplayRect\n * @classdesc A display rectangle is very similar to {@link OpenSeadragon.Rect} but adds two\n * fields, 'minLevel' and 'maxLevel' which denote the supported zoom levels\n * for this rectangle.\n *\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.Rect\n * @param {Number} x The vector component 'x'.\n * @param {Number} y The vector component 'y'.\n * @param {Number} width The vector component 'height'.\n * @param {Number} height The vector component 'width'.\n * @param {Number} minLevel The lowest zoom level supported.\n * @param {Number} maxLevel The highest zoom level supported.\n */\n$.DisplayRect = function( x, y, width, height, minLevel, maxLevel ) {\n $.Rect.apply( this, [ x, y, width, height ] );\n\n /**\n * The lowest zoom level supported.\n * @member {Number} minLevel\n * @memberof OpenSeadragon.DisplayRect#\n */\n this.minLevel = minLevel;\n /**\n * The highest zoom level supported.\n * @member {Number} maxLevel\n * @memberof OpenSeadragon.DisplayRect#\n */\n this.maxLevel = maxLevel;\n};\n\n$.extend( $.DisplayRect.prototype, $.Rect.prototype );\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Spring\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Spring\n * @memberof OpenSeadragon\n * @param {Object} options - Spring configuration settings.\n * @param {Number} options.springStiffness - Spring stiffness. Must be greater than zero.\n * The closer to zero, the closer to linear animation.\n * @param {Number} options.animationTime - Animation duration per spring, in seconds.\n * Must be zero or greater.\n * @param {Number} [options.initial=0] - Initial value of spring.\n * @param {Boolean} [options.exponential=false] - Whether this spring represents\n * an exponential scale (such as zoom) and should be animated accordingly. Note that\n * exponential springs must have non-zero values.\n */\n$.Spring = function( options ) {\n var args = arguments;\n\n if( typeof( options ) != 'object' ){\n //allows backward compatible use of ( initialValue, config ) as\n //constructor parameters\n options = {\n initial: args.length && typeof ( args[ 0 ] ) == \"number\" ?\n args[ 0 ] :\n undefined,\n /**\n * Spring stiffness.\n * @member {Number} springStiffness\n * @memberof OpenSeadragon.Spring#\n */\n springStiffness: args.length > 1 ?\n args[ 1 ].springStiffness :\n 5.0,\n /**\n * Animation duration per spring.\n * @member {Number} animationTime\n * @memberof OpenSeadragon.Spring#\n */\n animationTime: args.length > 1 ?\n args[ 1 ].animationTime :\n 1.5\n };\n }\n\n $.console.assert(typeof options.springStiffness === \"number\" && options.springStiffness !== 0,\n \"[OpenSeadragon.Spring] options.springStiffness must be a non-zero number\");\n\n $.console.assert(typeof options.animationTime === \"number\" && options.animationTime >= 0,\n \"[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0\");\n\n if (options.exponential) {\n this._exponential = true;\n delete options.exponential;\n }\n\n $.extend( true, this, options);\n\n /**\n * @member {Object} current\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.current = {\n value: typeof ( this.initial ) == \"number\" ?\n this.initial :\n (this._exponential ? 0 : 1),\n time: $.now() // always work in milliseconds\n };\n\n $.console.assert(!this._exponential || this.current.value !== 0,\n \"[OpenSeadragon.Spring] value must be non-zero for exponential springs\");\n\n /**\n * @member {Object} start\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.start = {\n value: this.current.value,\n time: this.current.time\n };\n\n /**\n * @member {Object} target\n * @memberof OpenSeadragon.Spring#\n * @property {Number} value\n * @property {Number} time\n */\n this.target = {\n value: this.current.value,\n time: this.current.time\n };\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n};\n\n/** @lends OpenSeadragon.Spring.prototype */\n$.Spring.prototype = {\n\n /**\n * @function\n * @param {Number} target\n */\n resetTo: function( target ) {\n $.console.assert(!this._exponential || target !== 0,\n \"[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs\");\n\n this.start.value = this.target.value = this.current.value = target;\n this.start.time = this.target.time = this.current.time = $.now();\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n },\n\n /**\n * @function\n * @param {Number} target\n */\n springTo: function( target ) {\n $.console.assert(!this._exponential || target !== 0,\n \"[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs\");\n\n this.start.value = this.current.value;\n this.start.time = this.current.time;\n this.target.value = target;\n this.target.time = this.start.time + 1000 * this.animationTime;\n\n if (this._exponential) {\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n }\n },\n\n /**\n * @function\n * @param {Number} delta\n */\n shiftBy: function( delta ) {\n this.start.value += delta;\n this.target.value += delta;\n\n if (this._exponential) {\n $.console.assert(this.target.value !== 0 && this.start.value !== 0,\n \"[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs\");\n\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n }\n },\n\n setExponential: function(value) {\n this._exponential = value;\n\n if (this._exponential) {\n $.console.assert(this.current.value !== 0 && this.target.value !== 0 && this.start.value !== 0,\n \"[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs\");\n\n this.start._logValue = Math.log(this.start.value);\n this.target._logValue = Math.log(this.target.value);\n this.current._logValue = Math.log(this.current.value);\n }\n },\n\n /**\n * @function\n */\n update: function() {\n this.current.time = $.now();\n\n var startValue, targetValue;\n if (this._exponential) {\n startValue = this.start._logValue;\n targetValue = this.target._logValue;\n } else {\n startValue = this.start.value;\n targetValue = this.target.value;\n }\n\n var currentValue = (this.current.time >= this.target.time) ?\n targetValue :\n startValue +\n ( targetValue - startValue ) *\n transform(\n this.springStiffness,\n ( this.current.time - this.start.time ) /\n ( this.target.time - this.start.time )\n );\n\n if (this._exponential) {\n this.current.value = Math.exp(currentValue);\n } else {\n this.current.value = currentValue;\n }\n },\n\n /**\n * Returns whether the spring is at the target value\n * @function\n * @returns {Boolean} True if at target value, false otherwise\n */\n isAtTargetValue: function() {\n return this.current.value === this.target.value;\n }\n};\n\n/**\n * @private\n */\nfunction transform( stiffness, x ) {\n return ( 1.0 - Math.exp( stiffness * -x ) ) /\n ( 1.0 - Math.exp( -stiffness ) );\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - ImageLoader\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// private class\nfunction ImageJob ( options ) {\n\n $.extend( true, this, {\n timeout: $.DEFAULT_SETTINGS.timeout,\n jobId: null\n }, options );\n\n /**\n * Image object which will contain downloaded image.\n * @member {Image} image\n * @memberof OpenSeadragon.ImageJob#\n */\n this.image = null;\n}\n\nImageJob.prototype = {\n errorMsg: null,\n start: function(){\n var _this = this;\n\n this.image = new Image();\n\n if ( this.crossOriginPolicy !== false ) {\n this.image.crossOrigin = this.crossOriginPolicy;\n }\n\n this.image.onload = function(){\n _this.finish( true );\n };\n this.image.onabort = this.image.onerror = function(){\n _this.errorMsg = \"Image load aborted\";\n _this.finish( false );\n };\n\n this.jobId = window.setTimeout( function(){\n _this.errorMsg = \"Image load exceeded timeout\";\n _this.finish( false );\n }, this.timeout);\n\n this.image.src = this.src;\n },\n\n finish: function( successful ) {\n this.image.onload = this.image.onerror = this.image.onabort = null;\n if (!successful) {\n this.image = null;\n }\n\n if ( this.jobId ) {\n window.clearTimeout( this.jobId );\n }\n\n this.callback( this );\n }\n\n};\n\n/**\n * @class ImageLoader\n * @memberof OpenSeadragon\n * @classdesc Handles downloading of a set of images using asynchronous queue pattern.\n * You generally won't have to interact with the ImageLoader directly.\n * @param {Object} options - Options for this ImageLoader.\n * @param {Number} [options.jobLimit] - The number of concurrent image requests. See imageLoaderLimit in {@link OpenSeadragon.Options} for details.\n */\n$.ImageLoader = function( options ) {\n\n $.extend( true, this, {\n jobLimit: $.DEFAULT_SETTINGS.imageLoaderLimit,\n jobQueue: [],\n jobsInProgress: 0\n }, options );\n\n};\n\n/** @lends OpenSeadragon.ImageLoader.prototype */\n$.ImageLoader.prototype = {\n\n /**\n * Add an unloaded image to the loader queue.\n * @method\n * @param {String} src - URL of image to download.\n * @param {String} crossOriginPolicy - CORS policy to use for downloads\n * @param {Function} callback - Called once image has been downloaded.\n */\n addJob: function( options ) {\n var _this = this,\n complete = function( job ) {\n completeJob( _this, job, options.callback );\n },\n jobOptions = {\n src: options.src,\n crossOriginPolicy: options.crossOriginPolicy,\n callback: complete,\n abort: options.abort\n },\n newJob = new ImageJob( jobOptions );\n\n if ( !this.jobLimit || this.jobsInProgress < this.jobLimit ) {\n newJob.start();\n this.jobsInProgress++;\n }\n else {\n this.jobQueue.push( newJob );\n }\n },\n\n /**\n * Clear any unstarted image loading jobs from the queue.\n * @method\n */\n clear: function() {\n for( var i = 0; i < this.jobQueue.length; i++ ) {\n var job = this.jobQueue[i];\n if ( typeof job.abort === \"function\" ) {\n job.abort();\n }\n }\n\n this.jobQueue = [];\n }\n};\n\n/**\n * Cleans up ImageJob once completed.\n * @method\n * @private\n * @param loader - ImageLoader used to start job.\n * @param job - The ImageJob that has completed.\n * @param callback - Called once cleanup is finished.\n */\nfunction completeJob( loader, job, callback ) {\n var nextJob;\n\n loader.jobsInProgress--;\n\n if ( (!loader.jobLimit || loader.jobsInProgress < loader.jobLimit) && loader.jobQueue.length > 0) {\n nextJob = loader.jobQueue.shift();\n nextJob.start();\n loader.jobsInProgress++;\n }\n\n callback( job.image, job.errorMsg );\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Tile\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Tile\n * @memberof OpenSeadragon\n * @param {Number} level The zoom level this tile belongs to.\n * @param {Number} x The vector component 'x'.\n * @param {Number} y The vector component 'y'.\n * @param {OpenSeadragon.Point} bounds Where this tile fits, in normalized\n * coordinates.\n * @param {Boolean} exists Is this tile a part of a sparse image? ( Also has\n * this tile failed to load? )\n * @param {String} url The URL of this tile's image.\n * @param {CanvasRenderingContext2D} context2D The context2D of this tile if it\n * is provided directly by the tile source.\n */\n$.Tile = function(level, x, y, bounds, exists, url, context2D) {\n /**\n * The zoom level this tile belongs to.\n * @member {Number} level\n * @memberof OpenSeadragon.Tile#\n */\n this.level = level;\n /**\n * The vector component 'x'.\n * @member {Number} x\n * @memberof OpenSeadragon.Tile#\n */\n this.x = x;\n /**\n * The vector component 'y'.\n * @member {Number} y\n * @memberof OpenSeadragon.Tile#\n */\n this.y = y;\n /**\n * Where this tile fits, in normalized coordinates\n * @member {OpenSeadragon.Rect} bounds\n * @memberof OpenSeadragon.Tile#\n */\n this.bounds = bounds;\n /**\n * Is this tile a part of a sparse image? Also has this tile failed to load?\n * @member {Boolean} exists\n * @memberof OpenSeadragon.Tile#\n */\n this.exists = exists;\n /**\n * The URL of this tile's image.\n * @member {String} url\n * @memberof OpenSeadragon.Tile#\n */\n this.url = url;\n /**\n * The context2D of this tile if it is provided directly by the tile source.\n * @member {CanvasRenderingContext2D} context2D\n * @memberOf OpenSeadragon.Tile#\n */\n this.context2D = context2D;\n /**\n * Is this tile loaded?\n * @member {Boolean} loaded\n * @memberof OpenSeadragon.Tile#\n */\n this.loaded = false;\n /**\n * Is this tile loading?\n * @member {Boolean} loading\n * @memberof OpenSeadragon.Tile#\n */\n this.loading = false;\n\n /**\n * The HTML div element for this tile\n * @member {Element} element\n * @memberof OpenSeadragon.Tile#\n */\n this.element = null;\n /**\n * The HTML img element for this tile.\n * @member {Element} imgElement\n * @memberof OpenSeadragon.Tile#\n */\n this.imgElement = null;\n /**\n * The Image object for this tile.\n * @member {Object} image\n * @memberof OpenSeadragon.Tile#\n */\n this.image = null;\n\n /**\n * The alias of this.element.style.\n * @member {String} style\n * @memberof OpenSeadragon.Tile#\n */\n this.style = null;\n /**\n * This tile's position on screen, in pixels.\n * @member {OpenSeadragon.Point} position\n * @memberof OpenSeadragon.Tile#\n */\n this.position = null;\n /**\n * This tile's size on screen, in pixels.\n * @member {OpenSeadragon.Point} size\n * @memberof OpenSeadragon.Tile#\n */\n this.size = null;\n /**\n * The start time of this tile's blending.\n * @member {Number} blendStart\n * @memberof OpenSeadragon.Tile#\n */\n this.blendStart = null;\n /**\n * The current opacity this tile should be.\n * @member {Number} opacity\n * @memberof OpenSeadragon.Tile#\n */\n this.opacity = null;\n /**\n * The distance of this tile to the viewport center.\n * @member {Number} distance\n * @memberof OpenSeadragon.Tile#\n */\n this.distance = null;\n /**\n * The visibility score of this tile.\n * @member {Number} visibility\n * @memberof OpenSeadragon.Tile#\n */\n this.visibility = null;\n\n /**\n * Whether this tile is currently being drawn.\n * @member {Boolean} beingDrawn\n * @memberof OpenSeadragon.Tile#\n */\n this.beingDrawn = false;\n /**\n * Timestamp the tile was last touched.\n * @member {Number} lastTouchTime\n * @memberof OpenSeadragon.Tile#\n */\n this.lastTouchTime = 0;\n};\n\n/** @lends OpenSeadragon.Tile.prototype */\n$.Tile.prototype = {\n\n /**\n * Provides a string representation of this tiles level and (x,y)\n * components.\n * @function\n * @returns {String}\n */\n toString: function() {\n return this.level + \"/\" + this.x + \"_\" + this.y;\n },\n\n // private\n _hasTransparencyChannel: function() {\n return !!this.context2D || this.url.match('.png');\n },\n\n /**\n * Renders the tile in an html container.\n * @function\n * @param {Element} container\n */\n drawHTML: function( container ) {\n if (!this.cacheImageRecord) {\n $.console.warn(\n '[Tile.drawHTML] attempting to draw tile %s when it\\'s not cached',\n this.toString());\n return;\n }\n\n if ( !this.loaded ) {\n $.console.warn(\n \"Attempting to draw tile %s when it's not yet loaded.\",\n this.toString()\n );\n return;\n }\n\n //EXPERIMENTAL - trying to figure out how to scale the container\n // content during animation of the container size.\n\n if ( !this.element ) {\n this.element = $.makeNeutralElement( \"div\" );\n this.imgElement = this.cacheImageRecord.getImage().cloneNode();\n this.imgElement.style.msInterpolationMode = \"nearest-neighbor\";\n this.imgElement.style.width = \"100%\";\n this.imgElement.style.height = \"100%\";\n\n this.style = this.element.style;\n this.style.position = \"absolute\";\n }\n if ( this.element.parentNode != container ) {\n container.appendChild( this.element );\n }\n if ( this.imgElement.parentNode != this.element ) {\n this.element.appendChild( this.imgElement );\n }\n\n this.style.top = this.position.y + \"px\";\n this.style.left = this.position.x + \"px\";\n this.style.height = this.size.y + \"px\";\n this.style.width = this.size.x + \"px\";\n\n $.setElementOpacity( this.element, this.opacity );\n },\n\n /**\n * Renders the tile in a canvas-based context.\n * @function\n * @param {Canvas} context\n * @param {Function} drawingHandler - Method for firing the drawing event.\n * drawingHandler({context, tile, rendered})\n * where <code>rendered</code> is the context with the pre-drawn image.\n * @param {Number} [scale=1] - Apply a scale to position and size\n * @param {OpenSeadragon.Point} [translate] - A translation vector\n */\n drawCanvas: function( context, drawingHandler, scale, translate ) {\n\n var position = this.position.times($.pixelDensityRatio),\n size = this.size.times($.pixelDensityRatio),\n rendered;\n\n if (!this.context2D && !this.cacheImageRecord) {\n $.console.warn(\n '[Tile.drawCanvas] attempting to draw tile %s when it\\'s not cached',\n this.toString());\n return;\n }\n\n rendered = this.context2D || this.cacheImageRecord.getRenderedContext();\n\n if ( !this.loaded || !rendered ){\n $.console.warn(\n \"Attempting to draw tile %s when it's not yet loaded.\",\n this.toString()\n );\n\n return;\n }\n\n context.save();\n\n context.globalAlpha = this.opacity;\n\n if (typeof scale === 'number' && scale !== 1) {\n // draw tile at a different scale\n position = position.times(scale);\n size = size.times(scale);\n }\n\n if (translate instanceof $.Point) {\n // shift tile position slightly\n position = position.plus(translate);\n }\n\n //if we are supposed to be rendering fully opaque rectangle,\n //ie its done fading or fading is turned off, and if we are drawing\n //an image with an alpha channel, then the only way\n //to avoid seeing the tile underneath is to clear the rectangle\n if (context.globalAlpha === 1 && this._hasTransparencyChannel()) {\n //clearing only the inside of the rectangle occupied\n //by the png prevents edge flikering\n context.clearRect(\n position.x + 1,\n position.y + 1,\n size.x - 2,\n size.y - 2\n );\n }\n\n // This gives the application a chance to make image manipulation\n // changes as we are rendering the image\n drawingHandler({context: context, tile: this, rendered: rendered});\n\n context.drawImage(\n rendered.canvas,\n 0,\n 0,\n rendered.canvas.width,\n rendered.canvas.height,\n position.x,\n position.y,\n size.x,\n size.y\n );\n\n context.restore();\n },\n\n /**\n * Get the ratio between current and original size.\n * @function\n * @return {Float}\n */\n getScaleForEdgeSmoothing: function() {\n var context;\n if (this.cacheImageRecord) {\n context = this.cacheImageRecord.getRenderedContext();\n } else if (this.context2D) {\n context = this.context2D;\n } else {\n $.console.warn(\n '[Tile.drawCanvas] attempting to get tile scale %s when tile\\'s not cached',\n this.toString());\n return 1;\n }\n return context.canvas.width / (this.size.x * $.pixelDensityRatio);\n },\n\n /**\n * Get a translation vector that when applied to the tile position produces integer coordinates.\n * Needed to avoid swimming and twitching.\n * @function\n * @param {Number} [scale=1] - Scale to be applied to position.\n * @return {OpenSeadragon.Point}\n */\n getTranslationForEdgeSmoothing: function(scale, canvasSize, sketchCanvasSize) {\n // The translation vector must have positive values, otherwise the image goes a bit off\n // the sketch canvas to the top and left and we must use negative coordinates to repaint it\n // to the main canvas. In that case, some browsers throw:\n // INDEX_SIZE_ERR: DOM Exception 1: Index or size was negative, or greater than the allowed value.\n var x = Math.max(1, Math.ceil((sketchCanvasSize.x - canvasSize.x) / 2));\n var y = Math.max(1, Math.ceil((sketchCanvasSize.y - canvasSize.y) / 2));\n return new $.Point(x, y).minus(\n this.position\n .times($.pixelDensityRatio)\n .times(scale || 1)\n .apply(function(x) {\n return x % 1;\n })\n );\n },\n\n /**\n * Removes tile from its container.\n * @function\n */\n unload: function() {\n if ( this.imgElement && this.imgElement.parentNode ) {\n this.imgElement.parentNode.removeChild( this.imgElement );\n }\n if ( this.element && this.element.parentNode ) {\n this.element.parentNode.removeChild( this.element );\n }\n\n this.element = null;\n this.imgElement = null;\n this.loaded = false;\n this.loading = false;\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Overlay\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function($) {\n\n /**\n * An enumeration of positions that an overlay may be assigned relative to\n * the viewport.\n * It is identical to OpenSeadragon.Placement but is kept for backward\n * compatibility.\n * @member OverlayPlacement\n * @memberof OpenSeadragon\n * @static\n * @readonly\n * @type {Object}\n * @property {Number} CENTER\n * @property {Number} TOP_LEFT\n * @property {Number} TOP\n * @property {Number} TOP_RIGHT\n * @property {Number} RIGHT\n * @property {Number} BOTTOM_RIGHT\n * @property {Number} BOTTOM\n * @property {Number} BOTTOM_LEFT\n * @property {Number} LEFT\n */\n $.OverlayPlacement = $.Placement;\n\n /**\n * An enumeration of possible ways to handle overlays rotation\n * @member OverlayRotationMode\n * @memberOf OpenSeadragon\n * @static\n * @readonly\n * @property {Number} NO_ROTATION The overlay ignore the viewport rotation.\n * @property {Number} EXACT The overlay use CSS 3 transforms to rotate with\n * the viewport. If the overlay contains text, it will get rotated as well.\n * @property {Number} BOUNDING_BOX The overlay adjusts for rotation by\n * taking the size of the bounding box of the rotated bounds.\n * Only valid for overlays with Rect location and scalable in both directions.\n */\n $.OverlayRotationMode = $.freezeObject({\n NO_ROTATION: 1,\n EXACT: 2,\n BOUNDING_BOX: 3\n });\n\n /**\n * @class Overlay\n * @classdesc Provides a way to float an HTML element on top of the viewer element.\n *\n * @memberof OpenSeadragon\n * @param {Object} options\n * @param {Element} options.element\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect} options.location - The\n * location of the overlay on the image. If a {@link OpenSeadragon.Point}\n * is specified, the overlay will be located at this location with respect\n * to the placement option. If a {@link OpenSeadragon.Rect} is specified,\n * the overlay will be placed at this location with the corresponding width\n * and height and placement TOP_LEFT.\n * @param {OpenSeadragon.Placement} [options.placement=OpenSeadragon.Placement.TOP_LEFT]\n * Defines what part of the overlay should be at the specified options.location\n * @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw]\n * @param {Boolean} [options.checkResize=true] Set to false to avoid to\n * check the size of the overlay everytime it is drawn in the directions\n * which are not scaled. It will improve performances but will cause a\n * misalignment if the overlay size changes.\n * @param {Number} [options.width] The width of the overlay in viewport\n * coordinates. If specified, the width of the overlay will be adjusted when\n * the zoom changes.\n * @param {Number} [options.height] The height of the overlay in viewport\n * coordinates. If specified, the height of the overlay will be adjusted when\n * the zoom changes.\n * @param {Boolean} [options.rotationMode=OpenSeadragon.OverlayRotationMode.EXACT]\n * How to handle the rotation of the viewport.\n */\n $.Overlay = function(element, location, placement) {\n\n /**\n * onDraw callback signature used by {@link OpenSeadragon.Overlay}.\n *\n * @callback OnDrawCallback\n * @memberof OpenSeadragon.Overlay\n * @param {OpenSeadragon.Point} position\n * @param {OpenSeadragon.Point} size\n * @param {Element} element\n */\n\n var options;\n if ($.isPlainObject(element)) {\n options = element;\n } else {\n options = {\n element: element,\n location: location,\n placement: placement\n };\n }\n\n this.element = options.element;\n this.style = options.element.style;\n this._init(options);\n };\n\n /** @lends OpenSeadragon.Overlay.prototype */\n $.Overlay.prototype = {\n\n // private\n _init: function(options) {\n this.location = options.location;\n this.placement = options.placement === undefined ?\n $.Placement.TOP_LEFT : options.placement;\n this.onDraw = options.onDraw;\n this.checkResize = options.checkResize === undefined ?\n true : options.checkResize;\n\n // When this.width is not null, the overlay get scaled horizontally\n this.width = options.width === undefined ? null : options.width;\n\n // When this.height is not null, the overlay get scaled vertically\n this.height = options.height === undefined ? null : options.height;\n\n this.rotationMode = options.rotationMode || $.OverlayRotationMode.EXACT;\n\n // Having a rect as location is a syntactic sugar\n if (this.location instanceof $.Rect) {\n this.width = this.location.width;\n this.height = this.location.height;\n this.location = this.location.getTopLeft();\n this.placement = $.Placement.TOP_LEFT;\n }\n\n // Deprecated properties kept for backward compatibility.\n this.scales = this.width !== null && this.height !== null;\n this.bounds = new $.Rect(\n this.location.x, this.location.y, this.width, this.height);\n this.position = this.location;\n },\n\n /**\n * Internal function to adjust the position of an overlay\n * depending on it size and placement.\n * @function\n * @param {OpenSeadragon.Point} position\n * @param {OpenSeadragon.Point} size\n */\n adjust: function(position, size) {\n var properties = $.Placement.properties[this.placement];\n if (!properties) {\n return;\n }\n if (properties.isHorizontallyCentered) {\n position.x -= size.x / 2;\n } else if (properties.isRight) {\n position.x -= size.x;\n }\n if (properties.isVerticallyCentered) {\n position.y -= size.y / 2;\n } else if (properties.isBottom) {\n position.y -= size.y;\n }\n },\n\n /**\n * @function\n */\n destroy: function() {\n var element = this.element;\n var style = this.style;\n\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n //this should allow us to preserve overlays when required between\n //pages\n if (element.prevElementParent) {\n style.display = 'none';\n //element.prevElementParent.insertBefore(\n // element,\n // element.prevNextSibling\n //);\n document.body.appendChild(element);\n }\n }\n\n // clear the onDraw callback\n this.onDraw = null;\n\n style.top = \"\";\n style.left = \"\";\n style.position = \"\";\n\n if (this.width !== null) {\n style.width = \"\";\n }\n if (this.height !== null) {\n style.height = \"\";\n }\n var transformOriginProp = $.getCssPropertyWithVendorPrefix(\n 'transformOrigin');\n var transformProp = $.getCssPropertyWithVendorPrefix(\n 'transform');\n if (transformOriginProp && transformProp) {\n style[transformOriginProp] = \"\";\n style[transformProp] = \"\";\n }\n },\n\n /**\n * @function\n * @param {Element} container\n */\n drawHTML: function(container, viewport) {\n var element = this.element;\n if (element.parentNode !== container) {\n //save the source parent for later if we need it\n element.prevElementParent = element.parentNode;\n element.prevNextSibling = element.nextSibling;\n container.appendChild(element);\n\n // this.size is used by overlays which don't get scaled in at\n // least one direction when this.checkResize is set to false.\n this.size = $.getElementSize(element);\n }\n\n var positionAndSize = this._getOverlayPositionAndSize(viewport);\n\n var position = positionAndSize.position;\n var size = this.size = positionAndSize.size;\n var rotate = positionAndSize.rotate;\n\n // call the onDraw callback if it exists to allow one to overwrite\n // the drawing/positioning/sizing of the overlay\n if (this.onDraw) {\n this.onDraw(position, size, this.element);\n } else {\n var style = this.style;\n style.left = position.x + \"px\";\n style.top = position.y + \"px\";\n if (this.width !== null) {\n style.width = size.x + \"px\";\n }\n if (this.height !== null) {\n style.height = size.y + \"px\";\n }\n var transformOriginProp = $.getCssPropertyWithVendorPrefix(\n 'transformOrigin');\n var transformProp = $.getCssPropertyWithVendorPrefix(\n 'transform');\n if (transformOriginProp && transformProp) {\n if (rotate) {\n style[transformOriginProp] = this._getTransformOrigin();\n style[transformProp] = \"rotate(\" + rotate + \"deg)\";\n } else {\n style[transformOriginProp] = \"\";\n style[transformProp] = \"\";\n }\n }\n style.position = \"absolute\";\n\n if (style.display !== 'none') {\n style.display = 'block';\n }\n }\n },\n\n // private\n _getOverlayPositionAndSize: function(viewport) {\n var position = viewport.pixelFromPoint(this.location, true);\n var size = this._getSizeInPixels(viewport);\n this.adjust(position, size);\n\n var rotate = 0;\n if (viewport.degrees &&\n this.rotationMode !== $.OverlayRotationMode.NO_ROTATION) {\n // BOUNDING_BOX is only valid if both directions get scaled.\n // Get replaced by EXACT otherwise.\n if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX &&\n this.width !== null && this.height !== null) {\n var rect = new $.Rect(position.x, position.y, size.x, size.y);\n var boundingBox = this._getBoundingBox(rect, viewport.degrees);\n position = boundingBox.getTopLeft();\n size = boundingBox.getSize();\n } else {\n rotate = viewport.degrees;\n }\n }\n\n return {\n position: position,\n size: size,\n rotate: rotate\n };\n },\n\n // private\n _getSizeInPixels: function(viewport) {\n var width = this.size.x;\n var height = this.size.y;\n if (this.width !== null || this.height !== null) {\n var scaledSize = viewport.deltaPixelsFromPointsNoRotate(\n new $.Point(this.width || 0, this.height || 0), true);\n if (this.width !== null) {\n width = scaledSize.x;\n }\n if (this.height !== null) {\n height = scaledSize.y;\n }\n }\n if (this.checkResize &&\n (this.width === null || this.height === null)) {\n var eltSize = this.size = $.getElementSize(this.element);\n if (this.width === null) {\n width = eltSize.x;\n }\n if (this.height === null) {\n height = eltSize.y;\n }\n }\n return new $.Point(width, height);\n },\n\n // private\n _getBoundingBox: function(rect, degrees) {\n var refPoint = this._getPlacementPoint(rect);\n return rect.rotate(degrees, refPoint).getBoundingBox();\n },\n\n // private\n _getPlacementPoint: function(rect) {\n var result = new $.Point(rect.x, rect.y);\n var properties = $.Placement.properties[this.placement];\n if (properties) {\n if (properties.isHorizontallyCentered) {\n result.x += rect.width / 2;\n } else if (properties.isRight) {\n result.x += rect.width;\n }\n if (properties.isVerticallyCentered) {\n result.y += rect.height / 2;\n } else if (properties.isBottom) {\n result.y += rect.height;\n }\n }\n return result;\n },\n\n // private\n _getTransformOrigin: function() {\n var result = \"\";\n var properties = $.Placement.properties[this.placement];\n if (!properties) {\n return result;\n }\n if (properties.isLeft) {\n result = \"left\";\n } else if (properties.isRight) {\n result = \"right\";\n }\n if (properties.isTop) {\n result += \" top\";\n } else if (properties.isBottom) {\n result += \" bottom\";\n }\n return result;\n },\n\n /**\n * Changes the overlay settings.\n * @function\n * @param {OpenSeadragon.Point|OpenSeadragon.Rect|Object} location\n * If an object is specified, the options are the same than the constructor\n * except for the element which can not be changed.\n * @param {OpenSeadragon.Placement} position\n */\n update: function(location, placement) {\n var options = $.isPlainObject(location) ? location : {\n location: location,\n placement: placement\n };\n this._init({\n location: options.location || this.location,\n placement: options.placement !== undefined ?\n options.placement : this.placement,\n onDraw: options.onDraw || this.onDraw,\n checkResize: options.checkResize || this.checkResize,\n width: options.width !== undefined ? options.width : this.width,\n height: options.height !== undefined ? options.height : this.height,\n rotationMode: options.rotationMode || this.rotationMode\n });\n },\n\n /**\n * Returns the current bounds of the overlay in viewport coordinates\n * @function\n * @param {OpenSeadragon.Viewport} viewport the viewport\n * @returns {OpenSeadragon.Rect} overlay bounds\n */\n getBounds: function(viewport) {\n $.console.assert(viewport,\n 'A viewport must now be passed to Overlay.getBounds.');\n var width = this.width;\n var height = this.height;\n if (width === null || height === null) {\n var size = viewport.deltaPointsFromPixelsNoRotate(this.size, true);\n if (width === null) {\n width = size.x;\n }\n if (height === null) {\n height = size.y;\n }\n }\n var location = this.location.clone();\n this.adjust(location, new $.Point(width, height));\n return this._adjustBoundsForRotation(\n viewport, new $.Rect(location.x, location.y, width, height));\n },\n\n // private\n _adjustBoundsForRotation: function(viewport, bounds) {\n if (!viewport ||\n viewport.degrees === 0 ||\n this.rotationMode === $.OverlayRotationMode.EXACT) {\n return bounds;\n }\n if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX) {\n // If overlay not fully scalable, BOUNDING_BOX falls back to EXACT\n if (this.width === null || this.height === null) {\n return bounds;\n }\n // It is easier to just compute the position and size and\n // convert to viewport coordinates.\n var positionAndSize = this._getOverlayPositionAndSize(viewport);\n return viewport.viewerElementToViewportRectangle(new $.Rect(\n positionAndSize.position.x,\n positionAndSize.position.y,\n positionAndSize.size.x,\n positionAndSize.size.y));\n }\n\n // NO_ROTATION case\n return bounds.rotate(-viewport.degrees,\n this._getPlacementPoint(bounds));\n }\n };\n\n}(OpenSeadragon));\n","/*\n * OpenSeadragon - Drawer\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class Drawer\n * @memberof OpenSeadragon\n * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.\n * @param {Object} options - Options for this Drawer.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this Drawer.\n * @param {OpenSeadragon.Viewport} options.viewport - Reference to Viewer viewport.\n * @param {Element} options.element - Parent element.\n * @param {Number} [options.debugGridColor] - See debugGridColor in {@link OpenSeadragon.Options} for details.\n */\n$.Drawer = function( options ) {\n\n $.console.assert( options.viewer, \"[Drawer] options.viewer is required\" );\n\n //backward compatibility for positional args while prefering more\n //idiomatic javascript options object as the only argument\n var args = arguments;\n\n if( !$.isPlainObject( options ) ){\n options = {\n source: args[ 0 ], // Reference to Viewer tile source.\n viewport: args[ 1 ], // Reference to Viewer viewport.\n element: args[ 2 ] // Parent element.\n };\n }\n\n $.console.assert( options.viewport, \"[Drawer] options.viewport is required\" );\n $.console.assert( options.element, \"[Drawer] options.element is required\" );\n\n if ( options.source ) {\n $.console.error( \"[Drawer] options.source is no longer accepted; use TiledImage instead\" );\n }\n\n this.viewer = options.viewer;\n this.viewport = options.viewport;\n this.debugGridColor = options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;\n if (options.opacity) {\n $.console.error( \"[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead\" );\n }\n\n this.useCanvas = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true );\n /**\n * The parent element of this Drawer instance, passed in when the Drawer was created.\n * The parent of {@link OpenSeadragon.Drawer#canvas}.\n * @member {Element} container\n * @memberof OpenSeadragon.Drawer#\n */\n this.container = $.getElement( options.element );\n /**\n * A &lt;canvas&gt; element if the browser supports them, otherwise a &lt;div&gt; element.\n * Child element of {@link OpenSeadragon.Drawer#container}.\n * @member {Element} canvas\n * @memberof OpenSeadragon.Drawer#\n */\n this.canvas = $.makeNeutralElement( this.useCanvas ? \"canvas\" : \"div\" );\n /**\n * 2d drawing context for {@link OpenSeadragon.Drawer#canvas} if it's a &lt;canvas&gt; element, otherwise null.\n * @member {Object} context\n * @memberof OpenSeadragon.Drawer#\n */\n this.context = this.useCanvas ? this.canvas.getContext( \"2d\" ) : null;\n\n /**\n * Sketch canvas used to temporarily draw tiles which cannot be drawn directly\n * to the main canvas due to opacity. Lazily initialized.\n */\n this.sketchCanvas = null;\n this.sketchContext = null;\n\n /**\n * @member {Element} element\n * @memberof OpenSeadragon.Drawer#\n * @deprecated Alias for {@link OpenSeadragon.Drawer#container}.\n */\n this.element = this.container;\n\n // We force our container to ltr because our drawing math doesn't work in rtl.\n // This issue only affects our canvas renderer, but we do it always for consistency.\n // Note that this means overlays you want to be rtl need to be explicitly set to rtl.\n this.container.dir = 'ltr';\n\n // check canvas available width and height, set canvas width and height such that the canvas backing store is set to the proper pixel density\n if (this.useCanvas) {\n var viewportSize = this._calculateCanvasSize();\n this.canvas.width = viewportSize.x;\n this.canvas.height = viewportSize.y;\n }\n\n this.canvas.style.width = \"100%\";\n this.canvas.style.height = \"100%\";\n this.canvas.style.position = \"absolute\";\n $.setElementOpacity( this.canvas, this.opacity, true );\n\n // explicit left-align\n this.container.style.textAlign = \"left\";\n this.container.appendChild( this.canvas );\n};\n\n/** @lends OpenSeadragon.Drawer.prototype */\n$.Drawer.prototype = {\n // deprecated\n addOverlay: function( element, location, placement, onDraw ) {\n $.console.error(\"drawer.addOverlay is deprecated. Use viewer.addOverlay instead.\");\n this.viewer.addOverlay( element, location, placement, onDraw );\n return this;\n },\n\n // deprecated\n updateOverlay: function( element, location, placement ) {\n $.console.error(\"drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.\");\n this.viewer.updateOverlay( element, location, placement );\n return this;\n },\n\n // deprecated\n removeOverlay: function( element ) {\n $.console.error(\"drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.\");\n this.viewer.removeOverlay( element );\n return this;\n },\n\n // deprecated\n clearOverlays: function() {\n $.console.error(\"drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.\");\n this.viewer.clearOverlays();\n return this;\n },\n\n /**\n * Set the opacity of the drawer.\n * @param {Number} opacity\n * @return {OpenSeadragon.Drawer} Chainable.\n */\n setOpacity: function( opacity ) {\n $.console.error(\"drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.\");\n var world = this.viewer.world;\n for (var i = 0; i < world.getItemCount(); i++) {\n world.getItemAt( i ).setOpacity( opacity );\n }\n return this;\n },\n\n /**\n * Get the opacity of the drawer.\n * @returns {Number}\n */\n getOpacity: function() {\n $.console.error(\"drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead.\");\n var world = this.viewer.world;\n var maxOpacity = 0;\n for (var i = 0; i < world.getItemCount(); i++) {\n var opacity = world.getItemAt( i ).getOpacity();\n if ( opacity > maxOpacity ) {\n maxOpacity = opacity;\n }\n }\n return maxOpacity;\n },\n\n // deprecated\n needsUpdate: function() {\n $.console.error( \"[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead.\" );\n return this.viewer.world.needsDraw();\n },\n\n // deprecated\n numTilesLoaded: function() {\n $.console.error( \"[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead.\" );\n return this.viewer.tileCache.numTilesLoaded();\n },\n\n // deprecated\n reset: function() {\n $.console.error( \"[Drawer.reset] this function is deprecated. Use World.resetItems instead.\" );\n this.viewer.world.resetItems();\n return this;\n },\n\n // deprecated\n update: function() {\n $.console.error( \"[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead.\" );\n this.clear();\n this.viewer.world.draw();\n return this;\n },\n\n /**\n * @return {Boolean} True if rotation is supported.\n */\n canRotate: function() {\n return this.useCanvas;\n },\n\n /**\n * Destroy the drawer (unload current loaded tiles)\n */\n destroy: function() {\n //force unloading of current canvas (1x1 will be gc later, trick not necessarily needed)\n this.canvas.width = 1;\n this.canvas.height = 1;\n this.sketchCanvas = null;\n this.sketchContext = null;\n },\n\n /**\n * Clears the Drawer so it's ready to draw another frame.\n */\n clear: function() {\n this.canvas.innerHTML = \"\";\n if ( this.useCanvas ) {\n var viewportSize = this._calculateCanvasSize();\n if( this.canvas.width != viewportSize.x ||\n this.canvas.height != viewportSize.y ) {\n this.canvas.width = viewportSize.x;\n this.canvas.height = viewportSize.y;\n if ( this.sketchCanvas !== null ) {\n var sketchCanvasSize = this._calculateSketchCanvasSize();\n this.sketchCanvas.width = sketchCanvasSize.x;\n this.sketchCanvas.height = sketchCanvasSize.y;\n }\n }\n this._clear();\n }\n },\n\n _clear: function (useSketch, bounds) {\n if (!this.useCanvas) {\n return;\n }\n var context = this._getContext(useSketch);\n if (bounds) {\n context.clearRect(bounds.x, bounds.y, bounds.width, bounds.height);\n } else {\n var canvas = context.canvas;\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n },\n\n /**\n * Scale from OpenSeadragon viewer rectangle to drawer rectangle\n * (ignoring rotation)\n * @param {OpenSeadragon.Rect} rectangle - The rectangle in viewport coordinate system.\n * @return {OpenSeadragon.Rect} Rectangle in drawer coordinate system.\n */\n viewportToDrawerRectangle: function(rectangle) {\n var topLeft = this.viewport.pixelFromPointNoRotate(rectangle.getTopLeft(), true);\n var size = this.viewport.deltaPixelsFromPointsNoRotate(rectangle.getSize(), true);\n\n return new $.Rect(\n topLeft.x * $.pixelDensityRatio,\n topLeft.y * $.pixelDensityRatio,\n size.x * $.pixelDensityRatio,\n size.y * $.pixelDensityRatio\n );\n },\n\n /**\n * Draws the given tile.\n * @param {OpenSeadragon.Tile} tile - The tile to draw.\n * @param {Function} drawingHandler - Method for firing the drawing event if using canvas.\n * drawingHandler({context, tile, rendered})\n * @param {Boolean} useSketch - Whether to use the sketch canvas or not.\n * where <code>rendered</code> is the context with the pre-drawn image.\n * @param {Float} [scale=1] - Apply a scale to tile position and size. Defaults to 1.\n * @param {OpenSeadragon.Point} [translate] A translation vector to offset tile position\n */\n drawTile: function(tile, drawingHandler, useSketch, scale, translate) {\n $.console.assert(tile, '[Drawer.drawTile] tile is required');\n $.console.assert(drawingHandler, '[Drawer.drawTile] drawingHandler is required');\n\n if (this.useCanvas) {\n var context = this._getContext(useSketch);\n scale = scale || 1;\n tile.drawCanvas(context, drawingHandler, scale, translate);\n } else {\n tile.drawHTML( this.canvas );\n }\n },\n\n _getContext: function( useSketch ) {\n var context = this.context;\n if ( useSketch ) {\n if (this.sketchCanvas === null) {\n this.sketchCanvas = document.createElement( \"canvas\" );\n var sketchCanvasSize = this._calculateSketchCanvasSize();\n this.sketchCanvas.width = sketchCanvasSize.x;\n this.sketchCanvas.height = sketchCanvasSize.y;\n this.sketchContext = this.sketchCanvas.getContext( \"2d\" );\n\n // If the viewport is not currently rotated, the sketchCanvas\n // will have the same size as the main canvas. However, if\n // the viewport get rotated later on, we will need to resize it.\n if (this.viewport.getRotation() === 0) {\n var self = this;\n this.viewer.addHandler('rotate', function resizeSketchCanvas() {\n self.viewer.removeHandler('rotate', resizeSketchCanvas);\n var sketchCanvasSize = self._calculateSketchCanvasSize();\n self.sketchCanvas.width = sketchCanvasSize.x;\n self.sketchCanvas.height = sketchCanvasSize.y;\n });\n }\n }\n context = this.sketchContext;\n }\n return context;\n },\n\n // private\n saveContext: function( useSketch ) {\n if (!this.useCanvas) {\n return;\n }\n\n this._getContext( useSketch ).save();\n },\n\n // private\n restoreContext: function( useSketch ) {\n if (!this.useCanvas) {\n return;\n }\n\n this._getContext( useSketch ).restore();\n },\n\n // private\n setClip: function(rect, useSketch) {\n if (!this.useCanvas) {\n return;\n }\n\n var context = this._getContext( useSketch );\n context.beginPath();\n context.rect(rect.x, rect.y, rect.width, rect.height);\n context.clip();\n },\n\n // private\n drawRectangle: function(rect, fillStyle, useSketch) {\n if (!this.useCanvas) {\n return;\n }\n\n var context = this._getContext( useSketch );\n context.save();\n context.fillStyle = fillStyle;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n context.restore();\n },\n\n /**\n * Blends the sketch canvas in the main canvas.\n * @param {Object} options The options\n * @param {Float} options.opacity The opacity of the blending.\n * @param {Float} [options.scale=1] The scale at which tiles were drawn on\n * the sketch. Default is 1.\n * Use scale to draw at a lower scale and then enlarge onto the main canvas.\n * @param {OpenSeadragon.Point} [options.translate] A translation vector\n * that was used to draw the tiles\n * @param {String} [options.compositeOperation] - How the image is\n * composited onto other images; see compositeOperation in\n * {@link OpenSeadragon.Options} for possible values.\n * @param {OpenSeadragon.Rect} [options.bounds] The part of the sketch\n * canvas to blend in the main canvas. If specified, options.scale and\n * options.translate get ignored.\n */\n blendSketch: function(opacity, scale, translate, compositeOperation) {\n var options = opacity;\n if (!$.isPlainObject(options)) {\n options = {\n opacity: opacity,\n scale: scale,\n translate: translate,\n compositeOperation: compositeOperation\n };\n }\n if (!this.useCanvas || !this.sketchCanvas) {\n return;\n }\n opacity = options.opacity;\n compositeOperation = options.compositeOperation;\n var bounds = options.bounds;\n\n this.context.save();\n this.context.globalAlpha = opacity;\n if (compositeOperation) {\n this.context.globalCompositeOperation = compositeOperation;\n }\n if (bounds) {\n this.context.drawImage(\n this.sketchCanvas,\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height,\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height\n );\n } else {\n scale = options.scale || 1;\n translate = options.translate;\n var position = translate instanceof $.Point ?\n translate : new $.Point(0, 0);\n\n var widthExt = 0;\n var heightExt = 0;\n if (translate) {\n var widthDiff = this.sketchCanvas.width - this.canvas.width;\n var heightDiff = this.sketchCanvas.height - this.canvas.height;\n widthExt = Math.round(widthDiff / 2);\n heightExt = Math.round(heightDiff / 2);\n }\n this.context.drawImage(\n this.sketchCanvas,\n position.x - widthExt * scale,\n position.y - heightExt * scale,\n (this.canvas.width + 2 * widthExt) * scale,\n (this.canvas.height + 2 * heightExt) * scale,\n -widthExt,\n -heightExt,\n this.canvas.width + 2 * widthExt,\n this.canvas.height + 2 * heightExt\n );\n }\n this.context.restore();\n },\n\n // private\n drawDebugInfo: function( tile, count, i ){\n if ( !this.useCanvas ) {\n return;\n }\n\n var context = this.context;\n context.save();\n context.lineWidth = 2 * $.pixelDensityRatio;\n context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial';\n context.strokeStyle = this.debugGridColor;\n context.fillStyle = this.debugGridColor;\n\n if ( this.viewport.degrees !== 0 ) {\n this._offsetForRotation(this.viewport.degrees);\n }\n\n context.strokeRect(\n tile.position.x * $.pixelDensityRatio,\n tile.position.y * $.pixelDensityRatio,\n tile.size.x * $.pixelDensityRatio,\n tile.size.y * $.pixelDensityRatio\n );\n\n var tileCenterX = (tile.position.x + (tile.size.x / 2)) * $.pixelDensityRatio;\n var tileCenterY = (tile.position.y + (tile.size.y / 2)) * $.pixelDensityRatio;\n\n // Rotate the text the right way around.\n context.translate( tileCenterX, tileCenterY );\n context.rotate( Math.PI / 180 * -this.viewport.degrees );\n context.translate( -tileCenterX, -tileCenterY );\n\n if( tile.x === 0 && tile.y === 0 ){\n context.fillText(\n \"Zoom: \" + this.viewport.getZoom(),\n tile.position.x * $.pixelDensityRatio,\n (tile.position.y - 30) * $.pixelDensityRatio\n );\n context.fillText(\n \"Pan: \" + this.viewport.getBounds().toString(),\n tile.position.x * $.pixelDensityRatio,\n (tile.position.y - 20) * $.pixelDensityRatio\n );\n }\n context.fillText(\n \"Level: \" + tile.level,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 20) * $.pixelDensityRatio\n );\n context.fillText(\n \"Column: \" + tile.x,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 30) * $.pixelDensityRatio\n );\n context.fillText(\n \"Row: \" + tile.y,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 40) * $.pixelDensityRatio\n );\n context.fillText(\n \"Order: \" + i + \" of \" + count,\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 50) * $.pixelDensityRatio\n );\n context.fillText(\n \"Size: \" + tile.size.toString(),\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 60) * $.pixelDensityRatio\n );\n context.fillText(\n \"Position: \" + tile.position.toString(),\n (tile.position.x + 10) * $.pixelDensityRatio,\n (tile.position.y + 70) * $.pixelDensityRatio\n );\n\n if ( this.viewport.degrees !== 0 ) {\n this._restoreRotationChanges();\n }\n context.restore();\n },\n\n // private\n debugRect: function(rect) {\n if ( this.useCanvas ) {\n var context = this.context;\n context.save();\n context.lineWidth = 2 * $.pixelDensityRatio;\n context.strokeStyle = this.debugGridColor;\n context.fillStyle = this.debugGridColor;\n\n context.strokeRect(\n rect.x * $.pixelDensityRatio,\n rect.y * $.pixelDensityRatio,\n rect.width * $.pixelDensityRatio,\n rect.height * $.pixelDensityRatio\n );\n\n context.restore();\n }\n },\n\n /**\n * Get the canvas size\n * @param {Boolean} sketch If set to true return the size of the sketch canvas\n * @returns {OpenSeadragon.Point} The size of the canvas\n */\n getCanvasSize: function(sketch) {\n var canvas = this._getContext(sketch).canvas;\n return new $.Point(canvas.width, canvas.height);\n },\n\n // private\n _offsetForRotation: function(degrees, useSketch) {\n var cx = this.canvas.width / 2;\n var cy = this.canvas.height / 2;\n\n var context = this._getContext(useSketch);\n context.save();\n\n context.translate(cx, cy);\n context.rotate(Math.PI / 180 * degrees);\n context.translate(-cx, -cy);\n },\n\n // private\n _restoreRotationChanges: function(useSketch) {\n var context = this._getContext(useSketch);\n context.restore();\n },\n\n // private\n _calculateCanvasSize: function() {\n var pixelDensityRatio = $.pixelDensityRatio;\n var viewportSize = this.viewport.getContainerSize();\n return {\n x: viewportSize.x * pixelDensityRatio,\n y: viewportSize.y * pixelDensityRatio\n };\n },\n\n // private\n _calculateSketchCanvasSize: function() {\n var canvasSize = this._calculateCanvasSize();\n if (this.viewport.getRotation() === 0) {\n return canvasSize;\n }\n // If the viewport is rotated, we need a larger sketch canvas in order\n // to support edge smoothing.\n var sketchCanvasSize = Math.ceil(Math.sqrt(\n canvasSize.x * canvasSize.x +\n canvasSize.y * canvasSize.y));\n return {\n x: sketchCanvasSize,\n y: sketchCanvasSize\n };\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - Viewport\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n\n/**\n * @class Viewport\n * @memberof OpenSeadragon\n * @classdesc Handles coordinate-related functionality (zoom, pan, rotation, etc.)\n * for an {@link OpenSeadragon.Viewer}.\n * @param {Object} options - Options for this Viewport.\n * @param {Object} [options.margins] - See viewportMargins in {@link OpenSeadragon.Options}.\n * @param {Number} [options.springStiffness] - See springStiffness in {@link OpenSeadragon.Options}.\n * @param {Number} [options.animationTime] - See animationTime in {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomImageRatio] - See minZoomImageRatio in {@link OpenSeadragon.Options}.\n * @param {Number} [options.maxZoomPixelRatio] - See maxZoomPixelRatio in {@link OpenSeadragon.Options}.\n * @param {Number} [options.visibilityRatio] - See visibilityRatio in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapHorizontal] - See wrapHorizontal in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapVertical] - See wrapVertical in {@link OpenSeadragon.Options}.\n * @param {Number} [options.defaultZoomLevel] - See defaultZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomLevel] - See minZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.maxZoomLevel] - See maxZoomLevel in {@link OpenSeadragon.Options}.\n * @param {Number} [options.degrees] - See degrees in {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.homeFillsViewer] - See homeFillsViewer in {@link OpenSeadragon.Options}.\n */\n$.Viewport = function( options ) {\n\n //backward compatibility for positional args while prefering more\n //idiomatic javascript options object as the only argument\n var args = arguments;\n if( args.length && args[ 0 ] instanceof $.Point ){\n options = {\n containerSize: args[ 0 ],\n contentSize: args[ 1 ],\n config: args[ 2 ]\n };\n }\n\n //options.config and the general config argument are deprecated\n //in favor of the more direct specification of optional settings\n //being passed directly on the options object\n if ( options.config ){\n $.extend( true, options, options.config );\n delete options.config;\n }\n\n this._margins = $.extend({\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n }, options.margins || {});\n\n delete options.margins;\n\n $.extend( true, this, {\n\n //required settings\n containerSize: null,\n contentSize: null,\n\n //internal state properties\n zoomPoint: null,\n viewer: null,\n\n //configurable options\n springStiffness: $.DEFAULT_SETTINGS.springStiffness,\n animationTime: $.DEFAULT_SETTINGS.animationTime,\n minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio,\n maxZoomPixelRatio: $.DEFAULT_SETTINGS.maxZoomPixelRatio,\n visibilityRatio: $.DEFAULT_SETTINGS.visibilityRatio,\n wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal,\n wrapVertical: $.DEFAULT_SETTINGS.wrapVertical,\n defaultZoomLevel: $.DEFAULT_SETTINGS.defaultZoomLevel,\n minZoomLevel: $.DEFAULT_SETTINGS.minZoomLevel,\n maxZoomLevel: $.DEFAULT_SETTINGS.maxZoomLevel,\n degrees: $.DEFAULT_SETTINGS.degrees,\n homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer\n\n }, options );\n\n this._updateContainerInnerSize();\n\n this.centerSpringX = new $.Spring({\n initial: 0,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n this.centerSpringY = new $.Spring({\n initial: 0,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n this.zoomSpring = new $.Spring({\n exponential: true,\n initial: 1,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._oldCenterX = this.centerSpringX.current.value;\n this._oldCenterY = this.centerSpringY.current.value;\n this._oldZoom = this.zoomSpring.current.value;\n\n this._setContentBounds(new $.Rect(0, 0, 1, 1), 1);\n\n this.goHome(true);\n this.update();\n};\n\n/** @lends OpenSeadragon.Viewport.prototype */\n$.Viewport.prototype = {\n /**\n * Updates the viewport's home bounds and constraints for the given content size.\n * @function\n * @param {OpenSeadragon.Point} contentSize - size of the content in content units\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:reset-size\n */\n resetContentSize: function(contentSize) {\n $.console.assert(contentSize, \"[Viewport.resetContentSize] contentSize is required\");\n $.console.assert(contentSize instanceof $.Point, \"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point\");\n $.console.assert(contentSize.x > 0, \"[Viewport.resetContentSize] contentSize.x must be greater than 0\");\n $.console.assert(contentSize.y > 0, \"[Viewport.resetContentSize] contentSize.y must be greater than 0\");\n\n this._setContentBounds(new $.Rect(0, 0, 1, contentSize.y / contentSize.x), contentSize.x);\n return this;\n },\n\n // deprecated\n setHomeBounds: function(bounds, contentFactor) {\n $.console.error(\"[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually.\");\n this._setContentBounds(bounds, contentFactor);\n },\n\n // Set the viewport's content bounds\n // @param {OpenSeadragon.Rect} bounds - the new bounds in viewport coordinates\n // without rotation\n // @param {Number} contentFactor - how many content units per viewport unit\n // @fires OpenSeadragon.Viewer.event:reset-size\n // @private\n _setContentBounds: function(bounds, contentFactor) {\n $.console.assert(bounds, \"[Viewport._setContentBounds] bounds is required\");\n $.console.assert(bounds instanceof $.Rect, \"[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect\");\n $.console.assert(bounds.width > 0, \"[Viewport._setContentBounds] bounds.width must be greater than 0\");\n $.console.assert(bounds.height > 0, \"[Viewport._setContentBounds] bounds.height must be greater than 0\");\n\n this._contentBoundsNoRotate = bounds.clone();\n this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times(\n contentFactor);\n\n this._contentBounds = bounds.rotate(this.degrees).getBoundingBox();\n this._contentSize = this._contentBounds.getSize().times(contentFactor);\n this._contentAspectRatio = this._contentSize.x / this._contentSize.y;\n\n if (this.viewer) {\n /**\n * Raised when the viewer's content size or home bounds are reset\n * (see {@link OpenSeadragon.Viewport#resetContentSize}).\n *\n * @event reset-size\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} contentSize\n * @property {OpenSeadragon.Rect} contentBounds - Content bounds.\n * @property {OpenSeadragon.Rect} homeBounds - Content bounds.\n * Deprecated use contentBounds instead.\n * @property {Number} contentFactor\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('reset-size', {\n contentSize: this._contentSizeNoRotate.clone(),\n contentFactor: contentFactor,\n homeBounds: this._contentBoundsNoRotate.clone(),\n contentBounds: this._contentBounds.clone()\n });\n }\n },\n\n /**\n * Returns the home zoom in \"viewport zoom\" value.\n * @function\n * @returns {Number} The home zoom in \"viewport zoom\".\n */\n getHomeZoom: function() {\n if (this.defaultZoomLevel) {\n return this.defaultZoomLevel;\n }\n\n var aspectFactor = this._contentAspectRatio / this.getAspectRatio();\n var output;\n if (this.homeFillsViewer) { // fill the viewer and clip the image\n output = aspectFactor >= 1 ? aspectFactor : 1;\n } else {\n output = aspectFactor >= 1 ? 1 : aspectFactor;\n }\n\n return output / this._contentBounds.width;\n },\n\n /**\n * Returns the home bounds in viewport coordinates.\n * @function\n * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.\n */\n getHomeBounds: function() {\n return this.getHomeBoundsNoRotate().rotate(-this.getRotation());\n },\n\n /**\n * Returns the home bounds in viewport coordinates.\n * This method ignores the viewport rotation. Use\n * {@link OpenSeadragon.Viewport#getHomeBounds} to take it into account.\n * @function\n * @returns {OpenSeadragon.Rect} The home bounds in vewport coordinates.\n */\n getHomeBoundsNoRotate: function() {\n var center = this._contentBounds.getCenter();\n var width = 1.0 / this.getHomeZoom();\n var height = width / this.getAspectRatio();\n\n return new $.Rect(\n center.x - (width / 2.0),\n center.y - (height / 2.0),\n width,\n height\n );\n },\n\n /**\n * @function\n * @param {Boolean} immediately\n * @fires OpenSeadragon.Viewer.event:home\n */\n goHome: function(immediately) {\n if (this.viewer) {\n /**\n * Raised when the \"home\" operation occurs (see {@link OpenSeadragon.Viewport#goHome}).\n *\n * @event home\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('home', {\n immediately: immediately\n });\n }\n return this.fitBounds(this.getHomeBounds(), immediately);\n },\n\n /**\n * @function\n */\n getMinZoom: function() {\n var homeZoom = this.getHomeZoom(),\n zoom = this.minZoomLevel ?\n this.minZoomLevel :\n this.minZoomImageRatio * homeZoom;\n\n return zoom;\n },\n\n /**\n * @function\n */\n getMaxZoom: function() {\n var zoom = this.maxZoomLevel;\n if (!zoom) {\n zoom = this._contentSize.x * this.maxZoomPixelRatio / this._containerInnerSize.x;\n zoom /= this._contentBounds.width;\n }\n\n return Math.max( zoom, this.getHomeZoom() );\n },\n\n /**\n * @function\n */\n getAspectRatio: function() {\n return this._containerInnerSize.x / this._containerInnerSize.y;\n },\n\n /**\n * @function\n * @returns {OpenSeadragon.Point} The size of the container, in screen coordinates.\n */\n getContainerSize: function() {\n return new $.Point(\n this.containerSize.x,\n this.containerSize.y\n );\n },\n\n /**\n * The margins push the \"home\" region in from the sides by the specified amounts.\n * @function\n * @returns {Object} Properties (Numbers, in screen coordinates): left, top, right, bottom.\n */\n getMargins: function() {\n return $.extend({}, this._margins); // Make a copy so we are not returning our original\n },\n\n /**\n * The margins push the \"home\" region in from the sides by the specified amounts.\n * @function\n * @param {Object} margins - Properties (Numbers, in screen coordinates): left, top, right, bottom.\n */\n setMargins: function(margins) {\n $.console.assert($.type(margins) === 'object', '[Viewport.setMargins] margins must be an object');\n\n this._margins = $.extend({\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n }, margins);\n\n this._updateContainerInnerSize();\n if (this.viewer) {\n this.viewer.forceRedraw();\n }\n },\n\n /**\n * Returns the bounds of the visible area in viewport coordinates.\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.\n */\n getBounds: function(current) {\n return this.getBoundsNoRotate(current).rotate(-this.getRotation());\n },\n\n /**\n * Returns the bounds of the visible area in viewport coordinates.\n * This method ignores the viewport rotation. Use\n * {@link OpenSeadragon.Viewport#getBounds} to take it into account.\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.\n */\n getBoundsNoRotate: function(current) {\n var center = this.getCenter(current);\n var width = 1.0 / this.getZoom(current);\n var height = width / this.getAspectRatio();\n\n return new $.Rect(\n center.x - (width / 2.0),\n center.y - (height / 2.0),\n width,\n height\n );\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,\n * including the space taken by margins, in viewport coordinates.\n */\n getBoundsWithMargins: function(current) {\n return this.getBoundsNoRotateWithMargins(current).rotate(\n -this.getRotation(), this.getCenter(current));\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n * @returns {OpenSeadragon.Rect} The location you are zoomed/panned to,\n * including the space taken by margins, in viewport coordinates.\n */\n getBoundsNoRotateWithMargins: function(current) {\n var bounds = this.getBoundsNoRotate(current);\n var factor = this._containerInnerSize.x * this.getZoom(current);\n bounds.x -= this._margins.left / factor;\n bounds.y -= this._margins.top / factor;\n bounds.width += (this._margins.left + this._margins.right) / factor;\n bounds.height += (this._margins.top + this._margins.bottom) / factor;\n return bounds;\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n */\n getCenter: function( current ) {\n var centerCurrent = new $.Point(\n this.centerSpringX.current.value,\n this.centerSpringY.current.value\n ),\n centerTarget = new $.Point(\n this.centerSpringX.target.value,\n this.centerSpringY.target.value\n ),\n oldZoomPixel,\n zoom,\n width,\n height,\n bounds,\n newZoomPixel,\n deltaZoomPixels,\n deltaZoomPoints;\n\n if ( current ) {\n return centerCurrent;\n } else if ( !this.zoomPoint ) {\n return centerTarget;\n }\n\n oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n\n zoom = this.getZoom();\n width = 1.0 / zoom;\n height = width / this.getAspectRatio();\n bounds = new $.Rect(\n centerCurrent.x - width / 2.0,\n centerCurrent.y - height / 2.0,\n width,\n height\n );\n\n newZoomPixel = this._pixelFromPoint(this.zoomPoint, bounds);\n deltaZoomPixels = newZoomPixel.minus( oldZoomPixel );\n deltaZoomPoints = deltaZoomPixels.divide( this._containerInnerSize.x * zoom );\n\n return centerTarget.plus( deltaZoomPoints );\n },\n\n /**\n * @function\n * @param {Boolean} current - Pass true for the current location; defaults to false (target location).\n */\n getZoom: function( current ) {\n if ( current ) {\n return this.zoomSpring.current.value;\n } else {\n return this.zoomSpring.target.value;\n }\n },\n\n // private\n _applyZoomConstraints: function(zoom) {\n return Math.max(\n Math.min(zoom, this.getMaxZoom()),\n this.getMinZoom());\n },\n\n /**\n * @function\n * @private\n * @param {OpenSeadragon.Rect} bounds\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Rect} constrained bounds.\n */\n _applyBoundaryConstraints: function(bounds, immediately) {\n var newBounds = new $.Rect(\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height);\n\n if (this.wrapHorizontal) {\n //do nothing\n } else {\n var horizontalThreshold = this.visibilityRatio * newBounds.width;\n var boundsRight = newBounds.x + newBounds.width;\n var contentRight = this._contentBoundsNoRotate.x + this._contentBoundsNoRotate.width;\n var leftDx = this._contentBoundsNoRotate.x - boundsRight + horizontalThreshold;\n var rightDx = contentRight - newBounds.x - horizontalThreshold;\n\n if (horizontalThreshold > this._contentBoundsNoRotate.width) {\n newBounds.x += (leftDx + rightDx) / 2;\n } else if (rightDx < 0) {\n newBounds.x += rightDx;\n } else if (leftDx > 0) {\n newBounds.x += leftDx;\n }\n }\n\n if (this.wrapVertical) {\n //do nothing\n } else {\n var verticalThreshold = this.visibilityRatio * newBounds.height;\n var boundsBottom = newBounds.y + newBounds.height;\n var contentBottom = this._contentBoundsNoRotate.y + this._contentBoundsNoRotate.height;\n var topDy = this._contentBoundsNoRotate.y - boundsBottom + verticalThreshold;\n var bottomDy = contentBottom - newBounds.y - verticalThreshold;\n\n if (verticalThreshold > this._contentBoundsNoRotate.height) {\n newBounds.y += (topDy + bottomDy) / 2;\n } else if (bottomDy < 0) {\n newBounds.y += bottomDy;\n } else if (topDy > 0) {\n newBounds.y += topDy;\n }\n }\n\n if (this.viewer) {\n /**\n * Raised when the viewport constraints are applied (see {@link OpenSeadragon.Viewport#applyConstraints}).\n *\n * @event constrain\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'constrain', {\n immediately: immediately\n });\n }\n\n return newBounds;\n },\n\n /**\n * Enforces the minZoom, maxZoom and visibilityRatio constraints by\n * zooming and panning to the closest acceptable zoom and location.\n * @function\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:constrain\n */\n applyConstraints: function(immediately) {\n var actualZoom = this.getZoom();\n var constrainedZoom = this._applyZoomConstraints(actualZoom);\n\n if (actualZoom !== constrainedZoom) {\n this.zoomTo(constrainedZoom, this.zoomPoint, immediately);\n }\n\n var bounds = this.getBoundsNoRotate();\n var constrainedBounds = this._applyBoundaryConstraints(\n bounds, immediately);\n\n if (bounds.x !== constrainedBounds.x ||\n bounds.y !== constrainedBounds.y ||\n immediately) {\n this.fitBounds(\n constrainedBounds.rotate(-this.getRotation()),\n immediately);\n }\n return this;\n },\n\n /**\n * Equivalent to {@link OpenSeadragon.Viewport#applyConstraints}\n * @function\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:constrain\n */\n ensureVisible: function(immediately) {\n return this.applyConstraints(immediately);\n },\n\n /**\n * @function\n * @private\n * @param {OpenSeadragon.Rect} bounds\n * @param {Object} options (immediately=false, constraints=false)\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n _fitBounds: function(bounds, options) {\n options = options || {};\n var immediately = options.immediately || false;\n var constraints = options.constraints || false;\n\n var aspect = this.getAspectRatio();\n var center = bounds.getCenter();\n\n // Compute width and height of bounding box.\n var newBounds = new $.Rect(\n bounds.x,\n bounds.y,\n bounds.width,\n bounds.height,\n bounds.degrees + this.getRotation())\n .getBoundingBox();\n\n if (newBounds.getAspectRatio() >= aspect) {\n newBounds.height = newBounds.width / aspect;\n } else {\n newBounds.width = newBounds.height * aspect;\n }\n\n // Compute x and y from width, height and center position\n newBounds.x = center.x - newBounds.width / 2;\n newBounds.y = center.y - newBounds.height / 2;\n var newZoom = 1.0 / newBounds.width;\n\n if (constraints) {\n var newBoundsAspectRatio = newBounds.getAspectRatio();\n var newConstrainedZoom = this._applyZoomConstraints(newZoom);\n\n if (newZoom !== newConstrainedZoom) {\n newZoom = newConstrainedZoom;\n newBounds.width = 1.0 / newZoom;\n newBounds.x = center.x - newBounds.width / 2;\n newBounds.height = newBounds.width / newBoundsAspectRatio;\n newBounds.y = center.y - newBounds.height / 2;\n }\n\n newBounds = this._applyBoundaryConstraints(newBounds, immediately);\n center = newBounds.getCenter();\n }\n\n if (immediately) {\n this.panTo(center, true);\n return this.zoomTo(newZoom, null, true);\n }\n\n this.panTo(this.getCenter(true), true);\n this.zoomTo(this.getZoom(true), null, true);\n\n var oldBounds = this.getBounds();\n var oldZoom = this.getZoom();\n\n if (oldZoom === 0 || Math.abs(newZoom / oldZoom - 1) < 0.00000001) {\n this.zoomTo(newZoom, true);\n return this.panTo(center, immediately);\n }\n\n newBounds = newBounds.rotate(-this.getRotation());\n var referencePoint = newBounds.getTopLeft().times(newZoom)\n .minus(oldBounds.getTopLeft().times(oldZoom))\n .divide(newZoom - oldZoom);\n\n return this.zoomTo(newZoom, referencePoint, immediately);\n },\n\n /**\n * Makes the viewport zoom and pan so that the specified bounds take\n * as much space as possible in the viewport.\n * Note: this method ignores the constraints (minZoom, maxZoom and\n * visibilityRatio).\n * Use {@link OpenSeadragon.Viewport#fitBoundsWithConstraints} to enforce\n * them.\n * @function\n * @param {OpenSeadragon.Rect} bounds\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n fitBounds: function(bounds, immediately) {\n return this._fitBounds(bounds, {\n immediately: immediately,\n constraints: false\n });\n },\n\n /**\n * Makes the viewport zoom and pan so that the specified bounds take\n * as much space as possible in the viewport while enforcing the constraints\n * (minZoom, maxZoom and visibilityRatio).\n * Note: because this method enforces the constraints, part of the\n * provided bounds may end up outside of the viewport.\n * Use {@link OpenSeadragon.Viewport#fitBounds} to ignore them.\n * @function\n * @param {OpenSeadragon.Rect} bounds\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n fitBoundsWithConstraints: function(bounds, immediately) {\n return this._fitBounds(bounds, {\n immediately: immediately,\n constraints: true\n });\n },\n\n /**\n * Zooms so the image just fills the viewer vertically.\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n fitVertically: function(immediately) {\n var box = new $.Rect(\n this._contentBounds.x + (this._contentBounds.width / 2),\n this._contentBounds.y,\n 0,\n this._contentBounds.height);\n return this.fitBounds(box, immediately);\n },\n\n /**\n * Zooms so the image just fills the viewer horizontally.\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n fitHorizontally: function(immediately) {\n var box = new $.Rect(\n this._contentBounds.x,\n this._contentBounds.y + (this._contentBounds.height / 2),\n this._contentBounds.width,\n 0);\n return this.fitBounds(box, immediately);\n },\n\n\n /**\n * @function\n * @param {OpenSeadragon.Point} delta\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:pan\n */\n panBy: function( delta, immediately ) {\n var center = new $.Point(\n this.centerSpringX.target.value,\n this.centerSpringY.target.value\n );\n return this.panTo( center.plus( delta ), immediately );\n },\n\n /**\n * @function\n * @param {OpenSeadragon.Point} center\n * @param {Boolean} immediately\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:pan\n */\n panTo: function( center, immediately ) {\n if ( immediately ) {\n this.centerSpringX.resetTo( center.x );\n this.centerSpringY.resetTo( center.y );\n } else {\n this.centerSpringX.springTo( center.x );\n this.centerSpringY.springTo( center.y );\n }\n\n if( this.viewer ){\n /**\n * Raised when the viewport is panned (see {@link OpenSeadragon.Viewport#panBy} and {@link OpenSeadragon.Viewport#panTo}).\n *\n * @event pan\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} center\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'pan', {\n center: center,\n immediately: immediately\n });\n }\n\n return this;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:zoom\n */\n zoomBy: function(factor, refPoint, immediately) {\n return this.zoomTo(\n this.zoomSpring.target.value * factor, refPoint, immediately);\n },\n\n /**\n * Zooms to the specified zoom level\n * @function\n * @param {Number} zoom The zoom level to zoom to.\n * @param {OpenSeadragon.Point} [refPoint] The point which will stay at\n * the same screen location. Defaults to the viewport center.\n * @param {Boolean} [immediately=false]\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:zoom\n */\n zoomTo: function( zoom, refPoint, immediately ) {\n\n this.zoomPoint = refPoint instanceof $.Point &&\n !isNaN(refPoint.x) &&\n !isNaN(refPoint.y) ?\n refPoint :\n null;\n\n if ( immediately ) {\n this.zoomSpring.resetTo( zoom );\n } else {\n this.zoomSpring.springTo( zoom );\n }\n\n if( this.viewer ){\n /**\n * Raised when the viewport zoom level changes (see {@link OpenSeadragon.Viewport#zoomBy} and {@link OpenSeadragon.Viewport#zoomTo}).\n *\n * @event zoom\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {Number} zoom\n * @property {OpenSeadragon.Point} refPoint\n * @property {Boolean} immediately\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'zoom', {\n zoom: zoom,\n refPoint: refPoint,\n immediately: immediately\n });\n }\n\n return this;\n },\n\n /**\n * Rotates this viewport to the angle specified.\n * @function\n * @return {OpenSeadragon.Viewport} Chainable.\n */\n setRotation: function(degrees) {\n if (!this.viewer || !this.viewer.drawer.canRotate()) {\n return this;\n }\n\n degrees = degrees % 360;\n if (degrees < 0) {\n degrees += 360;\n }\n this.degrees = degrees;\n this._setContentBounds(\n this.viewer.world.getHomeBounds(),\n this.viewer.world.getContentFactor());\n this.viewer.forceRedraw();\n\n /**\n * Raised when rotation has been changed.\n *\n * @event rotate\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {Number} degrees - The number of degrees the rotation was set to.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent('rotate', {\"degrees\": degrees});\n return this;\n },\n\n /**\n * Gets the current rotation in degrees.\n * @function\n * @return {Number} The current rotation in degrees.\n */\n getRotation: function() {\n return this.degrees;\n },\n\n /**\n * @function\n * @return {OpenSeadragon.Viewport} Chainable.\n * @fires OpenSeadragon.Viewer.event:resize\n */\n resize: function( newContainerSize, maintain ) {\n var oldBounds = this.getBoundsNoRotate(),\n newBounds = oldBounds,\n widthDeltaFactor;\n\n this.containerSize.x = newContainerSize.x;\n this.containerSize.y = newContainerSize.y;\n\n this._updateContainerInnerSize();\n\n if ( maintain ) {\n // TODO: widthDeltaFactor will always be 1; probably not what's intended\n widthDeltaFactor = newContainerSize.x / this.containerSize.x;\n newBounds.width = oldBounds.width * widthDeltaFactor;\n newBounds.height = newBounds.width / this.getAspectRatio();\n }\n\n if( this.viewer ){\n /**\n * Raised when the viewer is resized (see {@link OpenSeadragon.Viewport#resize}).\n *\n * @event resize\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.\n * @property {OpenSeadragon.Point} newContainerSize\n * @property {Boolean} maintain\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.viewer.raiseEvent( 'resize', {\n newContainerSize: newContainerSize,\n maintain: maintain\n });\n }\n\n return this.fitBounds( newBounds, true );\n },\n\n // private\n _updateContainerInnerSize: function() {\n this._containerInnerSize = new $.Point(\n Math.max(1, this.containerSize.x - (this._margins.left + this._margins.right)),\n Math.max(1, this.containerSize.y - (this._margins.top + this._margins.bottom))\n );\n },\n\n /**\n * Update the zoom and center (X and Y) springs.\n * @function\n * @returns {Boolean} True if any change has been made, false otherwise.\n */\n update: function() {\n\n if (this.zoomPoint) {\n var oldZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n this.zoomSpring.update();\n var newZoomPixel = this.pixelFromPoint(this.zoomPoint, true);\n\n var deltaZoomPixels = newZoomPixel.minus(oldZoomPixel);\n var deltaZoomPoints = this.deltaPointsFromPixels(\n deltaZoomPixels, true);\n\n this.centerSpringX.shiftBy(deltaZoomPoints.x);\n this.centerSpringY.shiftBy(deltaZoomPoints.y);\n\n if (this.zoomSpring.isAtTargetValue()) {\n this.zoomPoint = null;\n }\n } else {\n this.zoomSpring.update();\n }\n\n this.centerSpringX.update();\n this.centerSpringY.update();\n\n var changed = this.centerSpringX.current.value !== this._oldCenterX ||\n this.centerSpringY.current.value !== this._oldCenterY ||\n this.zoomSpring.current.value !== this._oldZoom;\n\n this._oldCenterX = this.centerSpringX.current.value;\n this._oldCenterY = this.centerSpringY.current.value;\n this._oldZoom = this.zoomSpring.current.value;\n\n return changed;\n },\n\n /**\n * Convert a delta (translation vector) from viewport coordinates to pixels\n * coordinates. This method does not take rotation into account.\n * Consider using deltaPixelsFromPoints if you need to account for rotation.\n * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPixelsFromPointsNoRotate: function(deltaPoints, current) {\n return deltaPoints.times(\n this._containerInnerSize.x * this.getZoom(current)\n );\n },\n\n /**\n * Convert a delta (translation vector) from viewport coordinates to pixels\n * coordinates.\n * @param {OpenSeadragon.Point} deltaPoints - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPixelsFromPoints: function(deltaPoints, current) {\n return this.deltaPixelsFromPointsNoRotate(\n deltaPoints.rotate(this.getRotation()),\n current);\n },\n\n /**\n * Convert a delta (translation vector) from pixels coordinates to viewport\n * coordinates. This method does not take rotation into account.\n * Consider using deltaPointsFromPixels if you need to account for rotation.\n * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPointsFromPixelsNoRotate: function(deltaPixels, current) {\n return deltaPixels.divide(\n this._containerInnerSize.x * this.getZoom(current)\n );\n },\n\n /**\n * Convert a delta (translation vector) from pixels coordinates to viewport\n * coordinates.\n * @param {OpenSeadragon.Point} deltaPixels - The translation vector to convert.\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n deltaPointsFromPixels: function(deltaPixels, current) {\n return this.deltaPointsFromPixelsNoRotate(deltaPixels, current)\n .rotate(-this.getRotation());\n },\n\n /**\n * Convert viewport coordinates to pixels coordinates.\n * This method does not take rotation into account.\n * Consider using pixelFromPoint if you need to account for rotation.\n * @param {OpenSeadragon.Point} point the viewport coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pixelFromPointNoRotate: function(point, current) {\n return this._pixelFromPointNoRotate(\n point, this.getBoundsNoRotate(current));\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates.\n * @param {OpenSeadragon.Point} point the viewport coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pixelFromPoint: function(point, current) {\n return this._pixelFromPoint(point, this.getBoundsNoRotate(current));\n },\n\n // private\n _pixelFromPointNoRotate: function(point, bounds) {\n return point.minus(\n bounds.getTopLeft()\n ).times(\n this._containerInnerSize.x / bounds.width\n ).plus(\n new $.Point(this._margins.left, this._margins.top)\n );\n },\n\n // private\n _pixelFromPoint: function(point, bounds) {\n return this._pixelFromPointNoRotate(\n point.rotate(this.getRotation(), this.getCenter(true)),\n bounds);\n },\n\n /**\n * Convert pixel coordinates to viewport coordinates.\n * This method does not take rotation into account.\n * Consider using pointFromPixel if you need to account for rotation.\n * @param {OpenSeadragon.Point} pixel Pixel coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pointFromPixelNoRotate: function(pixel, current) {\n var bounds = this.getBoundsNoRotate(current);\n return pixel.minus(\n new $.Point(this._margins.left, this._margins.top)\n ).divide(\n this._containerInnerSize.x / bounds.width\n ).plus(\n bounds.getTopLeft()\n );\n },\n\n /**\n * Convert pixel coordinates to viewport coordinates.\n * @param {OpenSeadragon.Point} pixel Pixel coordinates\n * @param {Boolean} [current=false] - Pass true for the current location;\n * defaults to false (target location).\n * @returns {OpenSeadragon.Point}\n */\n pointFromPixel: function(pixel, current) {\n return this.pointFromPixelNoRotate(pixel, current).rotate(\n -this.getRotation(),\n this.getCenter(true)\n );\n },\n\n // private\n _viewportToImageDelta: function( viewerX, viewerY ) {\n var scale = this._contentBoundsNoRotate.width;\n return new $.Point(\n viewerX * this._contentSizeNoRotate.x / scale,\n viewerY * this._contentSizeNoRotate.x / scale);\n },\n\n /**\n * Translates from OpenSeadragon viewer coordinate system to image coordinate system.\n * This method can be called either by passing X,Y coordinates or an\n * OpenSeadragon.Point\n * Note: not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.\n * @function\n * @param {(OpenSeadragon.Point|Number)} viewerX either a point or the X\n * coordinate in viewport coordinate system.\n * @param {Number} [viewerY] Y coordinate in viewport coordinate system.\n * @return {OpenSeadragon.Point} a point representing the coordinates in the image.\n */\n viewportToImageCoordinates: function(viewerX, viewerY) {\n if (viewerX instanceof $.Point) {\n //they passed a point instead of individual components\n return this.viewportToImageCoordinates(viewerX.x, viewerX.y);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.viewportToImageCoordinates] is not accurate ' +\n 'with multi-image; use TiledImage.viewportToImageCoordinates instead.');\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageCoordinates(viewerX, viewerY, true);\n }\n }\n\n return this._viewportToImageDelta(\n viewerX - this._contentBoundsNoRotate.x,\n viewerY - this._contentBoundsNoRotate.y);\n },\n\n // private\n _imageToViewportDelta: function( imageX, imageY ) {\n var scale = this._contentBoundsNoRotate.width;\n return new $.Point(\n imageX / this._contentSizeNoRotate.x * scale,\n imageY / this._contentSizeNoRotate.x * scale);\n },\n\n /**\n * Translates from image coordinate system to OpenSeadragon viewer coordinate system\n * This method can be called either by passing X,Y coordinates or an\n * OpenSeadragon.Point\n * Note: not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.\n * @function\n * @param {(OpenSeadragon.Point | Number)} imageX the point or the\n * X coordinate in image coordinate system.\n * @param {Number} [imageY] Y coordinate in image coordinate system.\n * @return {OpenSeadragon.Point} a point representing the coordinates in the viewport.\n */\n imageToViewportCoordinates: function(imageX, imageY) {\n if (imageX instanceof $.Point) {\n //they passed a point instead of individual components\n return this.imageToViewportCoordinates(imageX.x, imageX.y);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.imageToViewportCoordinates] is not accurate ' +\n 'with multi-image; use TiledImage.imageToViewportCoordinates instead.');\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportCoordinates(imageX, imageY, true);\n }\n }\n\n var point = this._imageToViewportDelta(imageX, imageY);\n point.x += this._contentBoundsNoRotate.x;\n point.y += this._contentBoundsNoRotate.y;\n return point;\n },\n\n /**\n * Translates from a rectangle which describes a portion of the image in\n * pixel coordinates to OpenSeadragon viewport rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an\n * OpenSeadragon.Rect\n * Note: not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.\n * @function\n * @param {(OpenSeadragon.Rect | Number)} imageX the rectangle or the X\n * coordinate of the top left corner of the rectangle in image coordinate system.\n * @param {Number} [imageY] the Y coordinate of the top left corner of the rectangle\n * in image coordinate system.\n * @param {Number} [pixelWidth] the width in pixel of the rectangle.\n * @param {Number} [pixelHeight] the height in pixel of the rectangle.\n */\n imageToViewportRectangle: function(imageX, imageY, pixelWidth, pixelHeight) {\n var rect = imageX;\n if (!(rect instanceof $.Rect)) {\n //they passed individual components instead of a rectangle\n rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.imageToViewportRectangle] is not accurate ' +\n 'with multi-image; use TiledImage.imageToViewportRectangle instead.');\n } else if (count === 1) {\n // It is better to use TiledImage.imageToViewportRectangle\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportRectangle(\n imageX, imageY, pixelWidth, pixelHeight, true);\n }\n }\n\n var coordA = this.imageToViewportCoordinates(rect.x, rect.y);\n var coordB = this._imageToViewportDelta(rect.width, rect.height);\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees\n );\n },\n\n /**\n * Translates from a rectangle which describes a portion of\n * the viewport in point coordinates to image rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an\n * OpenSeadragon.Rect\n * Note: not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.\n * @function\n * @param {(OpenSeadragon.Rect | Number)} viewerX either a rectangle or\n * the X coordinate of the top left corner of the rectangle in viewport\n * coordinate system.\n * @param {Number} [viewerY] the Y coordinate of the top left corner of the rectangle\n * in viewport coordinate system.\n * @param {Number} [pointWidth] the width of the rectangle in viewport coordinate system.\n * @param {Number} [pointHeight] the height of the rectangle in viewport coordinate system.\n */\n viewportToImageRectangle: function(viewerX, viewerY, pointWidth, pointHeight) {\n var rect = viewerX;\n if (!(rect instanceof $.Rect)) {\n //they passed individual components instead of a rectangle\n rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);\n }\n\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.viewportToImageRectangle] is not accurate ' +\n 'with multi-image; use TiledImage.viewportToImageRectangle instead.');\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageCoordinates\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageRectangle(\n viewerX, viewerY, pointWidth, pointHeight, true);\n }\n }\n\n var coordA = this.viewportToImageCoordinates(rect.x, rect.y);\n var coordB = this._viewportToImageDelta(rect.width, rect.height);\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees\n );\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to image\n * coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToImageCoordinates: function( pixel ) {\n var point = this.pointFromPixel( pixel, true );\n return this.viewportToImageCoordinates( point );\n },\n\n /**\n * Convert pixel coordinates relative to the image to\n * viewer element coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToViewerElementCoordinates: function( pixel ) {\n var point = this.imageToViewportCoordinates( pixel );\n return this.pixelFromPoint( point, true );\n },\n\n /**\n * Convert pixel coordinates relative to the window to image coordinates.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToImageCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.windowToImageCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = pixel.minus(\n $.getElementPosition(this.viewer.element));\n return this.viewerElementToImageCoordinates(viewerCoordinates);\n },\n\n /**\n * Convert image coordinates to pixel coordinates relative to the window.\n * Note: not accurate with multi-image.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToWindowCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.imageToWindowCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = this.imageToViewerElementCoordinates(pixel);\n return viewerCoordinates.plus(\n $.getElementPosition(this.viewer.element));\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to viewport\n * coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToViewportCoordinates: function( pixel ) {\n return this.pointFromPixel( pixel, true );\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates relative to the\n * viewer element.\n * @param {OpenSeadragon.Point} point\n * @returns {OpenSeadragon.Point}\n */\n viewportToViewerElementCoordinates: function( point ) {\n return this.pixelFromPoint( point, true );\n },\n\n /**\n * Convert a rectangle in pixel coordinates relative to the viewer element\n * to viewport coordinates.\n * @param {OpenSeadragon.Rect} rectangle the rectangle to convert\n * @returns {OpenSeadragon.Rect} the converted rectangle\n */\n viewerElementToViewportRectangle: function(rectangle) {\n return $.Rect.fromSummits(\n this.pointFromPixel(rectangle.getTopLeft(), true),\n this.pointFromPixel(rectangle.getTopRight(), true),\n this.pointFromPixel(rectangle.getBottomLeft(), true)\n );\n },\n\n /**\n * Convert a rectangle in viewport coordinates to pixel coordinates relative\n * to the viewer element.\n * @param {OpenSeadragon.Rect} rectangle the rectangle to convert\n * @returns {OpenSeadragon.Rect} the converted rectangle\n */\n viewportToViewerElementRectangle: function(rectangle) {\n return $.Rect.fromSummits(\n this.pixelFromPoint(rectangle.getTopLeft(), true),\n this.pixelFromPoint(rectangle.getTopRight(), true),\n this.pixelFromPoint(rectangle.getBottomLeft(), true)\n );\n },\n\n /**\n * Convert pixel coordinates relative to the window to viewport coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToViewportCoordinates: function(pixel) {\n $.console.assert(this.viewer,\n \"[Viewport.windowToViewportCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = pixel.minus(\n $.getElementPosition(this.viewer.element));\n return this.viewerElementToViewportCoordinates(viewerCoordinates);\n },\n\n /**\n * Convert viewport coordinates to pixel coordinates relative to the window.\n * @param {OpenSeadragon.Point} point\n * @returns {OpenSeadragon.Point}\n */\n viewportToWindowCoordinates: function(point) {\n $.console.assert(this.viewer,\n \"[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.\");\n var viewerCoordinates = this.viewportToViewerElementCoordinates(point);\n return viewerCoordinates.plus(\n $.getElementPosition(this.viewer.element));\n },\n\n /**\n * Convert a viewport zoom to an image zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} viewportZoom The viewport zoom\n * target zoom.\n * @returns {Number} imageZoom The image zoom\n */\n viewportToImageZoom: function(viewportZoom) {\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.viewportToImageZoom] is not ' +\n 'accurate with multi-image.');\n } else if (count === 1) {\n // It is better to use TiledImage.viewportToImageZoom\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.viewportToImageZoom(viewportZoom);\n }\n }\n\n var imageWidth = this._contentSizeNoRotate.x;\n var containerWidth = this._containerInnerSize.x;\n var scale = this._contentBoundsNoRotate.width;\n var viewportToImageZoomRatio = (containerWidth / imageWidth) * scale;\n return viewportZoom * viewportToImageZoomRatio;\n },\n\n /**\n * Convert an image zoom to a viewport zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} imageZoom The image zoom\n * target zoom.\n * @returns {Number} viewportZoom The viewport zoom\n */\n imageToViewportZoom: function(imageZoom) {\n if (this.viewer) {\n var count = this.viewer.world.getItemCount();\n if (count > 1) {\n $.console.error('[Viewport.imageToViewportZoom] is not accurate ' +\n 'with multi-image.');\n } else if (count === 1) {\n // It is better to use TiledImage.imageToViewportZoom\n // because this._contentBoundsNoRotate can not be relied on\n // with clipping.\n var item = this.viewer.world.getItemAt(0);\n return item.imageToViewportZoom(imageZoom);\n }\n }\n\n var imageWidth = this._contentSizeNoRotate.x;\n var containerWidth = this._containerInnerSize.x;\n var scale = this._contentBoundsNoRotate.width;\n var viewportToImageZoomRatio = (imageWidth / containerWidth) / scale;\n return imageZoom * viewportToImageZoomRatio;\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TiledImage\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * You shouldn't have to create a TiledImage directly; use {@link OpenSeadragon.Viewer#open}\n * or {@link OpenSeadragon.Viewer#addTiledImage} instead.\n * @class TiledImage\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.\n * A new instance is created for each TileSource opened.\n * @param {Object} options - Configuration for this TiledImage.\n * @param {OpenSeadragon.TileSource} options.source - The TileSource that defines this TiledImage.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this TiledImage.\n * @param {OpenSeadragon.TileCache} options.tileCache - The TileCache for this TiledImage to use.\n * @param {OpenSeadragon.Drawer} options.drawer - The Drawer for this TiledImage to draw onto.\n * @param {OpenSeadragon.ImageLoader} options.imageLoader - The ImageLoader for this TiledImage to use.\n * @param {Number} [options.x=0] - Left position, in viewport coordinates.\n * @param {Number} [options.y=0] - Top position, in viewport coordinates.\n * @param {Number} [options.width=1] - Width, in viewport coordinates.\n * @param {Number} [options.height] - Height, in viewport coordinates.\n * @param {OpenSeadragon.Rect} [options.fitBounds] The bounds in viewport coordinates\n * to fit the image into. If specified, x, y, width and height get ignored.\n * @param {OpenSeadragon.Placement} [options.fitBoundsPlacement=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds if options.fitBounds is set.\n * @param {OpenSeadragon.Rect} [options.clip] - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n * @param {Number} [options.springStiffness] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.animationTime] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.minZoomImageRatio] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapHorizontal] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.wrapVertical] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.immediateRender] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.blendTime] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.alwaysBlend] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.minPixelRatio] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.smoothTileEdgesMinZoom] - See {@link OpenSeadragon.Options}.\n * @param {Boolean} [options.iOSDevice] - See {@link OpenSeadragon.Options}.\n * @param {Number} [options.opacity=1] - Opacity the tiled image should be drawn at.\n * @param {String} [options.compositeOperation] - How the image is composited onto other images; see compositeOperation in {@link OpenSeadragon.Options} for possible values.\n * @param {Boolean} [options.debugMode] - See {@link OpenSeadragon.Options}.\n * @param {String|CanvasGradient|CanvasPattern|Function} [options.placeholderFillStyle] - See {@link OpenSeadragon.Options}.\n * @param {String|Boolean} [options.crossOriginPolicy] - See {@link OpenSeadragon.Options}.\n */\n$.TiledImage = function( options ) {\n var _this = this;\n\n $.console.assert( options.tileCache, \"[TiledImage] options.tileCache is required\" );\n $.console.assert( options.drawer, \"[TiledImage] options.drawer is required\" );\n $.console.assert( options.viewer, \"[TiledImage] options.viewer is required\" );\n $.console.assert( options.imageLoader, \"[TiledImage] options.imageLoader is required\" );\n $.console.assert( options.source, \"[TiledImage] options.source is required\" );\n $.console.assert(!options.clip || options.clip instanceof $.Rect,\n \"[TiledImage] options.clip must be an OpenSeadragon.Rect if present\");\n\n $.EventSource.call( this );\n\n this._tileCache = options.tileCache;\n delete options.tileCache;\n\n this._drawer = options.drawer;\n delete options.drawer;\n\n this._imageLoader = options.imageLoader;\n delete options.imageLoader;\n\n if (options.clip instanceof $.Rect) {\n this._clip = options.clip.clone();\n }\n\n delete options.clip;\n\n var x = options.x || 0;\n delete options.x;\n var y = options.y || 0;\n delete options.y;\n\n // Ratio of zoomable image height to width.\n this.normHeight = options.source.dimensions.y / options.source.dimensions.x;\n this.contentAspectX = options.source.dimensions.x / options.source.dimensions.y;\n\n var scale = 1;\n if ( options.width ) {\n scale = options.width;\n delete options.width;\n\n if ( options.height ) {\n $.console.error( \"specifying both width and height to a tiledImage is not supported\" );\n delete options.height;\n }\n } else if ( options.height ) {\n scale = options.height / this.normHeight;\n delete options.height;\n }\n\n var fitBounds = options.fitBounds;\n delete options.fitBounds;\n var fitBoundsPlacement = options.fitBoundsPlacement || OpenSeadragon.Placement.CENTER;\n delete options.fitBoundsPlacement;\n\n $.extend( true, this, {\n\n //internal state properties\n viewer: null,\n tilesMatrix: {}, // A '3d' dictionary [level][x][y] --> Tile.\n coverage: {}, // A '3d' dictionary [level][x][y] --> Boolean.\n lastDrawn: [], // An unordered list of Tiles drawn last frame.\n lastResetTime: 0, // Last time for which the tiledImage was reset.\n _midDraw: false, // Is the tiledImage currently updating the viewport?\n _needsDraw: true, // Does the tiledImage need to update the viewport again?\n _hasOpaqueTile: false, // Do we have even one fully opaque tile?\n //configurable settings\n springStiffness: $.DEFAULT_SETTINGS.springStiffness,\n animationTime: $.DEFAULT_SETTINGS.animationTime,\n minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio,\n wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal,\n wrapVertical: $.DEFAULT_SETTINGS.wrapVertical,\n immediateRender: $.DEFAULT_SETTINGS.immediateRender,\n blendTime: $.DEFAULT_SETTINGS.blendTime,\n alwaysBlend: $.DEFAULT_SETTINGS.alwaysBlend,\n minPixelRatio: $.DEFAULT_SETTINGS.minPixelRatio,\n smoothTileEdgesMinZoom: $.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,\n iOSDevice: $.DEFAULT_SETTINGS.iOSDevice,\n debugMode: $.DEFAULT_SETTINGS.debugMode,\n crossOriginPolicy: $.DEFAULT_SETTINGS.crossOriginPolicy,\n placeholderFillStyle: $.DEFAULT_SETTINGS.placeholderFillStyle,\n opacity: $.DEFAULT_SETTINGS.opacity,\n compositeOperation: $.DEFAULT_SETTINGS.compositeOperation\n\n }, options );\n\n this._xSpring = new $.Spring({\n initial: x,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._ySpring = new $.Spring({\n initial: y,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._scaleSpring = new $.Spring({\n initial: scale,\n springStiffness: this.springStiffness,\n animationTime: this.animationTime\n });\n\n this._updateForScale();\n\n if (fitBounds) {\n this.fitBounds(fitBounds, fitBoundsPlacement, true);\n }\n\n // We need a callback to give image manipulation a chance to happen\n this._drawingHandler = function(args) {\n /**\n * This event is fired just before the tile is drawn giving the application a chance to alter the image.\n *\n * NOTE: This event is only fired when the drawer is using a &lt;canvas&gt;.\n *\n * @event tile-drawing\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.Tile} tile - The Tile being drawn.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} context - The HTML canvas context being drawn into.\n * @property {OpenSeadragon.Tile} rendered - The HTML canvas context containing the tile imagery.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n _this.viewer.raiseEvent('tile-drawing', $.extend({\n tiledImage: _this\n }, args));\n };\n};\n\n$.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.TiledImage.prototype */{\n /**\n * @returns {Boolean} Whether the TiledImage needs to be drawn.\n */\n needsDraw: function() {\n return this._needsDraw;\n },\n\n /**\n * Clears all tiles and triggers an update on the next call to\n * {@link OpenSeadragon.TiledImage#update}.\n */\n reset: function() {\n this._tileCache.clearTilesFor(this);\n this.lastResetTime = $.now();\n this._needsDraw = true;\n },\n\n /**\n * Updates the TiledImage's bounds, animating if needed.\n * @returns {Boolean} Whether the TiledImage animated.\n */\n update: function() {\n var oldX = this._xSpring.current.value;\n var oldY = this._ySpring.current.value;\n var oldScale = this._scaleSpring.current.value;\n\n this._xSpring.update();\n this._ySpring.update();\n this._scaleSpring.update();\n\n if (this._xSpring.current.value !== oldX || this._ySpring.current.value !== oldY ||\n this._scaleSpring.current.value !== oldScale) {\n this._updateForScale();\n this._needsDraw = true;\n return true;\n }\n\n return false;\n },\n\n /**\n * Draws the TiledImage to its Drawer.\n */\n draw: function() {\n if (this.opacity !== 0) {\n this._midDraw = true;\n updateViewport(this);\n this._midDraw = false;\n }\n },\n\n /**\n * Destroy the TiledImage (unload current loaded tiles).\n */\n destroy: function() {\n this.reset();\n },\n\n /**\n * @returns {OpenSeadragon.Rect} This TiledImage's bounds in viewport coordinates.\n * @param {Boolean} [current=false] - Pass true for the current location; false for target location.\n */\n getBounds: function(current) {\n if (current) {\n return new $.Rect( this._xSpring.current.value, this._ySpring.current.value,\n this._worldWidthCurrent, this._worldHeightCurrent );\n }\n\n return new $.Rect( this._xSpring.target.value, this._ySpring.target.value,\n this._worldWidthTarget, this._worldHeightTarget );\n },\n\n // deprecated\n getWorldBounds: function() {\n $.console.error('[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead');\n return this.getBounds();\n },\n\n /**\n * Get the bounds of the displayed part of the tiled image.\n * @param {Boolean} [current=false] Pass true for the current location,\n * false for the target location.\n * @returns {$.Rect} The clipped bounds in viewport coordinates.\n */\n getClippedBounds: function(current) {\n var bounds = this.getBounds(current);\n if (this._clip) {\n var ratio = this._worldWidthCurrent / this.source.dimensions.x;\n var clip = this._clip.times(ratio);\n bounds = new $.Rect(\n bounds.x + clip.x,\n bounds.y + clip.y,\n clip.width,\n clip.height);\n }\n return bounds;\n },\n\n /**\n * @returns {OpenSeadragon.Point} This TiledImage's content size, in original pixels.\n */\n getContentSize: function() {\n return new $.Point(this.source.dimensions.x, this.source.dimensions.y);\n },\n\n // private\n _viewportToImageDelta: function( viewerX, viewerY, current ) {\n var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);\n return new $.Point(viewerX * (this.source.dimensions.x / scale),\n viewerY * ((this.source.dimensions.y * this.contentAspectX) / scale));\n },\n\n /**\n * Translates from OpenSeadragon viewer coordinate system to image coordinate system.\n * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.\n * @param {Number|OpenSeadragon.Point} viewerX - The X coordinate or point in viewport coordinate system.\n * @param {Number} [viewerY] - The Y coordinate in viewport coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @return {OpenSeadragon.Point} A point representing the coordinates in the image.\n */\n viewportToImageCoordinates: function( viewerX, viewerY, current ) {\n if (viewerX instanceof $.Point) {\n //they passed a point instead of individual components\n current = viewerY;\n viewerY = viewerX.y;\n viewerX = viewerX.x;\n }\n\n if (current) {\n return this._viewportToImageDelta(viewerX - this._xSpring.current.value,\n viewerY - this._ySpring.current.value);\n }\n\n return this._viewportToImageDelta(viewerX - this._xSpring.target.value,\n viewerY - this._ySpring.target.value);\n },\n\n // private\n _imageToViewportDelta: function( imageX, imageY, current ) {\n var scale = (current ? this._scaleSpring.current.value : this._scaleSpring.target.value);\n return new $.Point((imageX / this.source.dimensions.x) * scale,\n (imageY / this.source.dimensions.y / this.contentAspectX) * scale);\n },\n\n /**\n * Translates from image coordinate system to OpenSeadragon viewer coordinate system\n * This method can be called either by passing X,Y coordinates or an {@link OpenSeadragon.Point}.\n * @param {Number|OpenSeadragon.Point} imageX - The X coordinate or point in image coordinate system.\n * @param {Number} [imageY] - The Y coordinate in image coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @return {OpenSeadragon.Point} A point representing the coordinates in the viewport.\n */\n imageToViewportCoordinates: function( imageX, imageY, current ) {\n if (imageX instanceof $.Point) {\n //they passed a point instead of individual components\n current = imageY;\n imageY = imageX.y;\n imageX = imageX.x;\n }\n\n var point = this._imageToViewportDelta(imageX, imageY);\n if (current) {\n point.x += this._xSpring.current.value;\n point.y += this._ySpring.current.value;\n } else {\n point.x += this._xSpring.target.value;\n point.y += this._ySpring.target.value;\n }\n\n return point;\n },\n\n /**\n * Translates from a rectangle which describes a portion of the image in\n * pixel coordinates to OpenSeadragon viewport rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.\n * @param {Number|OpenSeadragon.Rect} imageX - The left coordinate or rectangle in image coordinate system.\n * @param {Number} [imageY] - The top coordinate in image coordinate system.\n * @param {Number} [pixelWidth] - The width in pixel of the rectangle.\n * @param {Number} [pixelHeight] - The height in pixel of the rectangle.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @return {OpenSeadragon.Rect} A rect representing the coordinates in the viewport.\n */\n imageToViewportRectangle: function( imageX, imageY, pixelWidth, pixelHeight, current ) {\n var rect = imageX;\n if (rect instanceof $.Rect) {\n //they passed a rect instead of individual components\n current = imageY;\n } else {\n rect = new $.Rect(imageX, imageY, pixelWidth, pixelHeight);\n }\n\n var coordA = this.imageToViewportCoordinates(rect.getTopLeft(), current);\n var coordB = this._imageToViewportDelta(rect.width, rect.height, current);\n\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees\n );\n },\n\n /**\n * Translates from a rectangle which describes a portion of\n * the viewport in point coordinates to image rectangle coordinates.\n * This method can be called either by passing X,Y,width,height or an {@link OpenSeadragon.Rect}.\n * @param {Number|OpenSeadragon.Rect} viewerX - The left coordinate or rectangle in viewport coordinate system.\n * @param {Number} [viewerY] - The top coordinate in viewport coordinate system.\n * @param {Number} [pointWidth] - The width in viewport coordinate system.\n * @param {Number} [pointHeight] - The height in viewport coordinate system.\n * @param {Boolean} [current=false] - Pass true to use the current location; false for target location.\n * @return {OpenSeadragon.Rect} A rect representing the coordinates in the image.\n */\n viewportToImageRectangle: function( viewerX, viewerY, pointWidth, pointHeight, current ) {\n var rect = viewerX;\n if (viewerX instanceof $.Rect) {\n //they passed a rect instead of individual components\n current = viewerY;\n } else {\n rect = new $.Rect(viewerX, viewerY, pointWidth, pointHeight);\n }\n\n var coordA = this.viewportToImageCoordinates(rect.getTopLeft(), current);\n var coordB = this._viewportToImageDelta(rect.width, rect.height, current);\n\n return new $.Rect(\n coordA.x,\n coordA.y,\n coordB.x,\n coordB.y,\n rect.degrees\n );\n },\n\n /**\n * Convert pixel coordinates relative to the viewer element to image\n * coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n viewerElementToImageCoordinates: function( pixel ) {\n var point = this.viewport.pointFromPixel( pixel, true );\n return this.viewportToImageCoordinates( point );\n },\n\n /**\n * Convert pixel coordinates relative to the image to\n * viewer element coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToViewerElementCoordinates: function( pixel ) {\n var point = this.imageToViewportCoordinates( pixel );\n return this.viewport.pixelFromPoint( point, true );\n },\n\n /**\n * Convert pixel coordinates relative to the window to image coordinates.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n windowToImageCoordinates: function( pixel ) {\n var viewerCoordinates = pixel.minus(\n OpenSeadragon.getElementPosition( this.viewer.element ));\n return this.viewerElementToImageCoordinates( viewerCoordinates );\n },\n\n /**\n * Convert image coordinates to pixel coordinates relative to the window.\n * @param {OpenSeadragon.Point} pixel\n * @returns {OpenSeadragon.Point}\n */\n imageToWindowCoordinates: function( pixel ) {\n var viewerCoordinates = this.imageToViewerElementCoordinates( pixel );\n return viewerCoordinates.plus(\n OpenSeadragon.getElementPosition( this.viewer.element ));\n },\n\n /**\n * Convert a viewport zoom to an image zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * @function\n * @param {Number} viewportZoom The viewport zoom\n * @returns {Number} imageZoom The image zoom\n */\n viewportToImageZoom: function( viewportZoom ) {\n var ratio = this._scaleSpring.current.value *\n this.viewport._containerInnerSize.x / this.source.dimensions.x;\n return ratio * viewportZoom ;\n },\n\n /**\n * Convert an image zoom to a viewport zoom.\n * Image zoom: ratio of the original image size to displayed image size.\n * 1 means original image size, 0.5 half size...\n * Viewport zoom: ratio of the displayed image's width to viewport's width.\n * 1 means identical width, 2 means image's width is twice the viewport's width...\n * Note: not accurate with multi-image.\n * @function\n * @param {Number} imageZoom The image zoom\n * @returns {Number} viewportZoom The viewport zoom\n */\n imageToViewportZoom: function( imageZoom ) {\n var ratio = this._scaleSpring.current.value *\n this.viewport._containerInnerSize.x / this.source.dimensions.x;\n return imageZoom / ratio;\n },\n\n /**\n * Sets the TiledImage's position in the world.\n * @param {OpenSeadragon.Point} position - The new position, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new position or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setPosition: function(position, immediately) {\n var sameTarget = (this._xSpring.target.value === position.x &&\n this._ySpring.target.value === position.y);\n\n if (immediately) {\n if (sameTarget && this._xSpring.current.value === position.x &&\n this._ySpring.current.value === position.y) {\n return;\n }\n\n this._xSpring.resetTo(position.x);\n this._ySpring.resetTo(position.y);\n this._needsDraw = true;\n } else {\n if (sameTarget) {\n return;\n }\n\n this._xSpring.springTo(position.x);\n this._ySpring.springTo(position.y);\n this._needsDraw = true;\n }\n\n if (!sameTarget) {\n this._raiseBoundsChange();\n }\n },\n\n /**\n * Sets the TiledImage's width in the world, adjusting the height to match based on aspect ratio.\n * @param {Number} width - The new width, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setWidth: function(width, immediately) {\n this._setScale(width, immediately);\n },\n\n /**\n * Sets the TiledImage's height in the world, adjusting the width to match based on aspect ratio.\n * @param {Number} height - The new height, in viewport coordinates.\n * @param {Boolean} [immediately=false] - Whether to animate to the new size or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n setHeight: function(height, immediately) {\n this._setScale(height / this.normHeight, immediately);\n },\n\n /**\n * Positions and scales the TiledImage to fit in the specified bounds.\n * Note: this method fires OpenSeadragon.TiledImage.event:bounds-change\n * twice\n * @param {OpenSeadragon.Rect} bounds The bounds to fit the image into.\n * @param {OpenSeadragon.Placement} [anchor=OpenSeadragon.Placement.CENTER]\n * How to anchor the image in the bounds.\n * @param {Boolean} [immediately=false] Whether to animate to the new size\n * or snap immediately.\n * @fires OpenSeadragon.TiledImage.event:bounds-change\n */\n fitBounds: function(bounds, anchor, immediately) {\n anchor = anchor || $.Placement.CENTER;\n var anchorProperties = $.Placement.properties[anchor];\n var aspectRatio = this.contentAspectX;\n var xOffset = 0;\n var yOffset = 0;\n var displayedWidthRatio = 1;\n var displayedHeightRatio = 1;\n if (this._clip) {\n aspectRatio = this._clip.getAspectRatio();\n displayedWidthRatio = this._clip.width / this.source.dimensions.x;\n displayedHeightRatio = this._clip.height / this.source.dimensions.y;\n if (bounds.getAspectRatio() > aspectRatio) {\n xOffset = this._clip.x / this._clip.height * bounds.height;\n yOffset = this._clip.y / this._clip.height * bounds.height;\n } else {\n xOffset = this._clip.x / this._clip.width * bounds.width;\n yOffset = this._clip.y / this._clip.width * bounds.width;\n }\n }\n\n if (bounds.getAspectRatio() > aspectRatio) {\n // We will have margins on the X axis\n var height = bounds.height / displayedHeightRatio;\n var marginLeft = 0;\n if (anchorProperties.isHorizontallyCentered) {\n marginLeft = (bounds.width - bounds.height * aspectRatio) / 2;\n } else if (anchorProperties.isRight) {\n marginLeft = bounds.width - bounds.height * aspectRatio;\n }\n this.setPosition(\n new $.Point(bounds.x - xOffset + marginLeft, bounds.y - yOffset),\n immediately);\n this.setHeight(height, immediately);\n } else {\n // We will have margins on the Y axis\n var width = bounds.width / displayedWidthRatio;\n var marginTop = 0;\n if (anchorProperties.isVerticallyCentered) {\n marginTop = (bounds.height - bounds.width / aspectRatio) / 2;\n } else if (anchorProperties.isBottom) {\n marginTop = bounds.height - bounds.width / aspectRatio;\n }\n this.setPosition(\n new $.Point(bounds.x - xOffset, bounds.y - yOffset + marginTop),\n immediately);\n this.setWidth(width, immediately);\n }\n },\n\n /**\n * @returns {OpenSeadragon.Rect|null} The TiledImage's current clip rectangle,\n * in image pixels, or null if none.\n */\n getClip: function() {\n if (this._clip) {\n return this._clip.clone();\n }\n\n return null;\n },\n\n /**\n * @param {OpenSeadragon.Rect|null} newClip - An area, in image pixels, to clip to\n * (portions of the image outside of this area will not be visible). Only works on\n * browsers that support the HTML5 canvas.\n */\n setClip: function(newClip) {\n $.console.assert(!newClip || newClip instanceof $.Rect,\n \"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null\");\n\n if (newClip instanceof $.Rect) {\n this._clip = newClip.clone();\n } else {\n this._clip = null;\n }\n\n this._needsDraw = true;\n },\n\n /**\n * @returns {Number} The TiledImage's current opacity.\n */\n getOpacity: function() {\n return this.opacity;\n },\n\n /**\n * @param {Number} opacity Opacity the tiled image should be drawn at.\n */\n setOpacity: function(opacity) {\n this.opacity = opacity;\n this._needsDraw = true;\n },\n\n /**\n * @returns {String} The TiledImage's current compositeOperation.\n */\n getCompositeOperation: function() {\n return this.compositeOperation;\n },\n\n /**\n * @param {String} compositeOperation the tiled image should be drawn with this globalCompositeOperation.\n */\n setCompositeOperation: function(compositeOperation) {\n this.compositeOperation = compositeOperation;\n this._needsDraw = true;\n },\n\n // private\n _setScale: function(scale, immediately) {\n var sameTarget = (this._scaleSpring.target.value === scale);\n if (immediately) {\n if (sameTarget && this._scaleSpring.current.value === scale) {\n return;\n }\n\n this._scaleSpring.resetTo(scale);\n this._updateForScale();\n this._needsDraw = true;\n } else {\n if (sameTarget) {\n return;\n }\n\n this._scaleSpring.springTo(scale);\n this._updateForScale();\n this._needsDraw = true;\n }\n\n if (!sameTarget) {\n this._raiseBoundsChange();\n }\n },\n\n // private\n _updateForScale: function() {\n this._worldWidthTarget = this._scaleSpring.target.value;\n this._worldHeightTarget = this.normHeight * this._scaleSpring.target.value;\n this._worldWidthCurrent = this._scaleSpring.current.value;\n this._worldHeightCurrent = this.normHeight * this._scaleSpring.current.value;\n },\n\n // private\n _raiseBoundsChange: function() {\n /**\n * Raised when the TiledImage's bounds are changed.\n * Note that this event is triggered only when the animation target is changed;\n * not for every frame of animation.\n * @event bounds-change\n * @memberOf OpenSeadragon.TiledImage\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the TiledImage which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('bounds-change');\n },\n\n // private\n _isBottomItem: function() {\n return this.viewer.world.getItemAt(0) === this;\n }\n});\n\n/**\n * @private\n * @inner\n * Pretty much every other line in this needs to be documented so it's clear\n * how each piece of this routine contributes to the drawing process. That's\n * why there are so many TODO's inside this function.\n */\nfunction updateViewport( tiledImage ) {\n\n tiledImage._needsDraw = false;\n\n var tile,\n level,\n best = null,\n haveDrawn = false,\n currentTime = $.now(),\n viewportBounds = tiledImage.viewport.getBoundsWithMargins( true ),\n zeroRatioC = tiledImage.viewport.deltaPixelsFromPointsNoRotate(\n tiledImage.source.getPixelRatio( 0 ),\n true\n ).x * tiledImage._scaleSpring.current.value,\n lowestLevel = Math.max(\n tiledImage.source.minLevel,\n Math.floor(\n Math.log( tiledImage.minZoomImageRatio ) /\n Math.log( 2 )\n )\n ),\n highestLevel = Math.min(\n Math.abs(tiledImage.source.maxLevel),\n Math.abs(Math.floor(\n Math.log( zeroRatioC / tiledImage.minPixelRatio ) /\n Math.log( 2 )\n ))\n ),\n renderPixelRatioC,\n renderPixelRatioT,\n zeroRatioT,\n optimalRatio,\n levelOpacity,\n levelVisibility;\n\n // Reset tile's internal drawn state\n while (tiledImage.lastDrawn.length > 0) {\n tile = tiledImage.lastDrawn.pop();\n tile.beingDrawn = false;\n }\n\n if (!tiledImage.wrapHorizontal && !tiledImage.wrapVertical) {\n var tiledImageBounds = tiledImage.getClippedBounds(true);\n var intersection = viewportBounds.intersection(tiledImageBounds);\n if (intersection === null) {\n return;\n }\n viewportBounds = intersection;\n }\n viewportBounds = viewportBounds.getBoundingBox();\n viewportBounds.x -= tiledImage._xSpring.current.value;\n viewportBounds.y -= tiledImage._ySpring.current.value;\n\n var viewportTL = viewportBounds.getTopLeft();\n var viewportBR = viewportBounds.getBottomRight();\n\n //Don't draw if completely outside of the viewport\n if ( !tiledImage.wrapHorizontal && (viewportBR.x < 0 || viewportTL.x > tiledImage._worldWidthCurrent ) ) {\n return;\n }\n\n if ( !tiledImage.wrapVertical && ( viewportBR.y < 0 || viewportTL.y > tiledImage._worldHeightCurrent ) ) {\n return;\n }\n\n // Calculate viewport rect / bounds\n if ( !tiledImage.wrapHorizontal ) {\n viewportTL.x = Math.max( viewportTL.x, 0 );\n viewportBR.x = Math.min( viewportBR.x, tiledImage._worldWidthCurrent );\n }\n\n if ( !tiledImage.wrapVertical ) {\n viewportTL.y = Math.max( viewportTL.y, 0 );\n viewportBR.y = Math.min( viewportBR.y, tiledImage._worldHeightCurrent );\n }\n\n // Calculations for the interval of levels to draw\n // (above in initial var statement)\n // can return invalid intervals; fix that here if necessary\n lowestLevel = Math.min( lowestLevel, highestLevel );\n\n // Update any level that will be drawn\n var drawLevel; // FIXME: drawLevel should have a more explanatory name\n for ( level = highestLevel; level >= lowestLevel; level-- ) {\n drawLevel = false;\n\n //Avoid calculations for draw if we have already drawn this\n renderPixelRatioC = tiledImage.viewport.deltaPixelsFromPointsNoRotate(\n tiledImage.source.getPixelRatio( level ),\n true\n ).x * tiledImage._scaleSpring.current.value;\n\n if ( ( !haveDrawn && renderPixelRatioC >= tiledImage.minPixelRatio ) ||\n ( level == lowestLevel ) ) {\n drawLevel = true;\n haveDrawn = true;\n } else if ( !haveDrawn ) {\n continue;\n }\n\n //Perform calculations for draw if we haven't drawn this\n renderPixelRatioT = tiledImage.viewport.deltaPixelsFromPointsNoRotate(\n tiledImage.source.getPixelRatio( level ),\n false\n ).x * tiledImage._scaleSpring.current.value;\n\n zeroRatioT = tiledImage.viewport.deltaPixelsFromPointsNoRotate(\n tiledImage.source.getPixelRatio(\n Math.max(\n tiledImage.source.getClosestLevel( tiledImage.viewport.containerSize ) - 1,\n 0\n )\n ),\n false\n ).x * tiledImage._scaleSpring.current.value;\n\n optimalRatio = tiledImage.immediateRender ?\n 1 :\n zeroRatioT;\n\n levelOpacity = Math.min( 1, ( renderPixelRatioC - 0.5 ) / 0.5 );\n\n levelVisibility = optimalRatio / Math.abs(\n optimalRatio - renderPixelRatioT\n );\n\n // Update the level and keep track of 'best' tile to load\n best = updateLevel(\n tiledImage,\n haveDrawn,\n drawLevel,\n level,\n levelOpacity,\n levelVisibility,\n viewportTL,\n viewportBR,\n currentTime,\n best\n );\n\n // Stop the loop if lower-res tiles would all be covered by\n // already drawn tiles\n if ( providesCoverage( tiledImage.coverage, level ) ) {\n break;\n }\n }\n\n // Perform the actual drawing\n drawTiles( tiledImage, tiledImage.lastDrawn );\n\n // Load the new 'best' tile\n if (best && !best.context2D) {\n loadTile( tiledImage, best, currentTime );\n }\n\n}\n\n\nfunction updateLevel( tiledImage, haveDrawn, drawLevel, level, levelOpacity, levelVisibility, viewportTL, viewportBR, currentTime, best ){\n\n var x, y,\n tileTL,\n tileBR,\n numberOfTiles,\n viewportCenter = tiledImage.viewport.pixelFromPoint( tiledImage.viewport.getCenter() );\n\n\n if( tiledImage.viewer ){\n /**\n * <em>- Needs documentation -</em>\n *\n * @event update-level\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {Object} havedrawn\n * @property {Object} level\n * @property {Object} opacity\n * @property {Object} visibility\n * @property {Object} topleft\n * @property {Object} bottomright\n * @property {Object} currenttime\n * @property {Object} best\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n tiledImage.viewer.raiseEvent( 'update-level', {\n tiledImage: tiledImage,\n havedrawn: haveDrawn,\n level: level,\n opacity: levelOpacity,\n visibility: levelVisibility,\n topleft: viewportTL,\n bottomright: viewportBR,\n currenttime: currentTime,\n best: best\n });\n }\n\n //OK, a new drawing so do your calculations\n tileTL = tiledImage.source.getTileAtPoint( level, viewportTL.divide( tiledImage._scaleSpring.current.value ));\n tileBR = tiledImage.source.getTileAtPoint( level, viewportBR.divide( tiledImage._scaleSpring.current.value ));\n numberOfTiles = tiledImage.source.getNumTiles( level );\n\n resetCoverage( tiledImage.coverage, level );\n\n if ( !tiledImage.wrapHorizontal ) {\n tileBR.x = Math.min( tileBR.x, numberOfTiles.x - 1 );\n }\n if ( !tiledImage.wrapVertical ) {\n tileBR.y = Math.min( tileBR.y, numberOfTiles.y - 1 );\n }\n\n for ( x = tileTL.x; x <= tileBR.x; x++ ) {\n for ( y = tileTL.y; y <= tileBR.y; y++ ) {\n\n best = updateTile(\n tiledImage,\n drawLevel,\n haveDrawn,\n x, y,\n level,\n levelOpacity,\n levelVisibility,\n viewportCenter,\n numberOfTiles,\n currentTime,\n best\n );\n\n }\n }\n\n return best;\n}\n\nfunction updateTile( tiledImage, drawLevel, haveDrawn, x, y, level, levelOpacity, levelVisibility, viewportCenter, numberOfTiles, currentTime, best){\n\n var tile = getTile(\n x, y,\n level,\n tiledImage.source,\n tiledImage.tilesMatrix,\n currentTime,\n numberOfTiles,\n tiledImage._worldWidthCurrent,\n tiledImage._worldHeightCurrent\n ),\n drawTile = drawLevel;\n\n if( tiledImage.viewer ){\n /**\n * <em>- Needs documentation -</em>\n *\n * @event update-tile\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} tile\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n tiledImage.viewer.raiseEvent( 'update-tile', {\n tiledImage: tiledImage,\n tile: tile\n });\n }\n\n setCoverage( tiledImage.coverage, level, x, y, false );\n\n if ( !tile.exists ) {\n return best;\n }\n\n if ( haveDrawn && !drawTile ) {\n if ( isCovered( tiledImage.coverage, level, x, y ) ) {\n setCoverage( tiledImage.coverage, level, x, y, true );\n } else {\n drawTile = true;\n }\n }\n\n if ( !drawTile ) {\n return best;\n }\n\n positionTile(\n tile,\n tiledImage.source.tileOverlap,\n tiledImage.viewport,\n viewportCenter,\n levelVisibility,\n tiledImage\n );\n\n if (!tile.loaded) {\n if (tile.context2D) {\n setTileLoaded(tiledImage, tile);\n } else {\n var imageRecord = tiledImage._tileCache.getImageRecord(tile.url);\n if (imageRecord) {\n var image = imageRecord.getImage();\n setTileLoaded(tiledImage, tile, image);\n }\n }\n }\n\n if ( tile.loaded ) {\n var needsDraw = blendTile(\n tiledImage,\n tile,\n x, y,\n level,\n levelOpacity,\n currentTime\n );\n\n if ( needsDraw ) {\n tiledImage._needsDraw = true;\n }\n } else if ( tile.loading ) {\n // the tile is already in the download queue\n // thanks josh1093 for finally translating this typo\n } else {\n best = compareTiles( best, tile );\n }\n\n return best;\n}\n\nfunction getTile( x, y, level, tileSource, tilesMatrix, time, numTiles, worldWidth, worldHeight ) {\n var xMod,\n yMod,\n bounds,\n exists,\n url,\n context2D,\n tile;\n\n if ( !tilesMatrix[ level ] ) {\n tilesMatrix[ level ] = {};\n }\n if ( !tilesMatrix[ level ][ x ] ) {\n tilesMatrix[ level ][ x ] = {};\n }\n\n if ( !tilesMatrix[ level ][ x ][ y ] ) {\n xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x;\n yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y;\n bounds = tileSource.getTileBounds( level, xMod, yMod );\n exists = tileSource.tileExists( level, xMod, yMod );\n url = tileSource.getTileUrl( level, xMod, yMod );\n context2D = tileSource.getContext2D ?\n tileSource.getContext2D(level, xMod, yMod) : undefined;\n\n bounds.x += ( x - xMod ) / numTiles.x;\n bounds.y += (worldHeight / worldWidth) * (( y - yMod ) / numTiles.y);\n\n tilesMatrix[ level ][ x ][ y ] = new $.Tile(\n level,\n x,\n y,\n bounds,\n exists,\n url,\n context2D\n );\n }\n\n tile = tilesMatrix[ level ][ x ][ y ];\n tile.lastTouchTime = time;\n\n return tile;\n}\n\nfunction loadTile( tiledImage, tile, time ) {\n tile.loading = true;\n tiledImage._imageLoader.addJob({\n src: tile.url,\n crossOriginPolicy: tiledImage.crossOriginPolicy,\n callback: function( image, errorMsg ){\n onTileLoad( tiledImage, tile, time, image, errorMsg );\n },\n abort: function() {\n tile.loading = false;\n }\n });\n}\n\nfunction onTileLoad( tiledImage, tile, time, image, errorMsg ) {\n if ( !image ) {\n $.console.log( \"Tile %s failed to load: %s - error: %s\", tile, tile.url, errorMsg );\n /**\n * Triggered when a tile fails to load.\n *\n * @event tile-load-failed\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Tile} tile - The tile that failed to load.\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image the tile belongs to.\n * @property {number} time - The time in milliseconds when the tile load began.\n * @property {string} message - The error message.\n */\n tiledImage.viewer.raiseEvent(\"tile-load-failed\", {tile: tile, tiledImage: tiledImage, time: time, message: errorMsg});\n tile.loading = false;\n tile.exists = false;\n return;\n }\n\n if ( time < tiledImage.lastResetTime ) {\n $.console.log( \"Ignoring tile %s loaded before reset: %s\", tile, tile.url );\n tile.loading = false;\n return;\n }\n\n var finish = function() {\n var cutoff = Math.ceil( Math.log(\n tiledImage.source.getTileWidth(tile.level) ) / Math.log( 2 ) );\n setTileLoaded(tiledImage, tile, image, cutoff);\n };\n\n // Check if we're mid-update; this can happen on IE8 because image load events for\n // cached images happen immediately there\n if ( !tiledImage._midDraw ) {\n finish();\n } else {\n // Wait until after the update, in case caching unloads any tiles\n window.setTimeout( finish, 1);\n }\n}\n\nfunction setTileLoaded(tiledImage, tile, image, cutoff) {\n var increment = 0;\n\n function getCompletionCallback() {\n increment++;\n return completionCallback;\n }\n\n function completionCallback() {\n increment--;\n if (increment === 0) {\n tile.loading = false;\n tile.loaded = true;\n if (!tile.context2D) {\n tiledImage._tileCache.cacheTile({\n image: image,\n tile: tile,\n cutoff: cutoff,\n tiledImage: tiledImage\n });\n }\n tiledImage._needsDraw = true;\n }\n }\n\n /**\n * Triggered when a tile has just been loaded in memory. That means that the\n * image has been downloaded and can be modified before being drawn to the canvas.\n *\n * @event tile-loaded\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {Image} image - The image of the tile.\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the loaded tile.\n * @property {OpenSeadragon.Tile} tile - The tile which has been loaded.\n * @property {function} getCompletionCallback - A function giving a callback to call\n * when the asynchronous processing of the image is done. The image will be\n * marked as entirely loaded when the callback has been called once for each\n * call to getCompletionCallback.\n */\n tiledImage.viewer.raiseEvent(\"tile-loaded\", {\n tile: tile,\n tiledImage: tiledImage,\n image: image,\n getCompletionCallback: getCompletionCallback\n });\n // In case the completion callback is never called, we at least force it once.\n getCompletionCallback()();\n}\n\nfunction positionTile( tile, overlap, viewport, viewportCenter, levelVisibility, tiledImage ){\n var boundsTL = tile.bounds.getTopLeft();\n\n boundsTL.x *= tiledImage._scaleSpring.current.value;\n boundsTL.y *= tiledImage._scaleSpring.current.value;\n boundsTL.x += tiledImage._xSpring.current.value;\n boundsTL.y += tiledImage._ySpring.current.value;\n\n var boundsSize = tile.bounds.getSize();\n\n boundsSize.x *= tiledImage._scaleSpring.current.value;\n boundsSize.y *= tiledImage._scaleSpring.current.value;\n\n var positionC = viewport.pixelFromPointNoRotate(boundsTL, true),\n positionT = viewport.pixelFromPointNoRotate(boundsTL, false),\n sizeC = viewport.deltaPixelsFromPointsNoRotate(boundsSize, true),\n sizeT = viewport.deltaPixelsFromPointsNoRotate(boundsSize, false),\n tileCenter = positionT.plus( sizeT.divide( 2 ) ),\n tileDistance = viewportCenter.distanceTo( tileCenter );\n\n if ( !overlap ) {\n sizeC = sizeC.plus( new $.Point( 1, 1 ) );\n }\n\n tile.position = positionC;\n tile.size = sizeC;\n tile.distance = tileDistance;\n tile.visibility = levelVisibility;\n}\n\n\nfunction blendTile( tiledImage, tile, x, y, level, levelOpacity, currentTime ){\n var blendTimeMillis = 1000 * tiledImage.blendTime,\n deltaTime,\n opacity;\n\n if ( !tile.blendStart ) {\n tile.blendStart = currentTime;\n }\n\n deltaTime = currentTime - tile.blendStart;\n opacity = blendTimeMillis ? Math.min( 1, deltaTime / ( blendTimeMillis ) ) : 1;\n\n if ( tiledImage.alwaysBlend ) {\n opacity *= levelOpacity;\n }\n\n tile.opacity = opacity;\n\n tiledImage.lastDrawn.push( tile );\n\n if ( opacity == 1 ) {\n setCoverage( tiledImage.coverage, level, x, y, true );\n tiledImage._hasOpaqueTile = true;\n } else if ( deltaTime < blendTimeMillis ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * @private\n * @inner\n * Returns true if the given tile provides coverage to lower-level tiles of\n * lower resolution representing the same content. If neither x nor y is\n * given, returns true if the entire visible level provides coverage.\n *\n * Note that out-of-bounds tiles provide coverage in this sense, since\n * there's no content that they would need to cover. Tiles at non-existent\n * levels that are within the image bounds, however, do not.\n */\nfunction providesCoverage( coverage, level, x, y ) {\n var rows,\n cols,\n i, j;\n\n if ( !coverage[ level ] ) {\n return false;\n }\n\n if ( x === undefined || y === undefined ) {\n rows = coverage[ level ];\n for ( i in rows ) {\n if ( rows.hasOwnProperty( i ) ) {\n cols = rows[ i ];\n for ( j in cols ) {\n if ( cols.hasOwnProperty( j ) && !cols[ j ] ) {\n return false;\n }\n }\n }\n }\n\n return true;\n }\n\n return (\n coverage[ level ][ x] === undefined ||\n coverage[ level ][ x ][ y ] === undefined ||\n coverage[ level ][ x ][ y ] === true\n );\n}\n\n/**\n * @private\n * @inner\n * Returns true if the given tile is completely covered by higher-level\n * tiles of higher resolution representing the same content. If neither x\n * nor y is given, returns true if the entire visible level is covered.\n */\nfunction isCovered( coverage, level, x, y ) {\n if ( x === undefined || y === undefined ) {\n return providesCoverage( coverage, level + 1 );\n } else {\n return (\n providesCoverage( coverage, level + 1, 2 * x, 2 * y ) &&\n providesCoverage( coverage, level + 1, 2 * x, 2 * y + 1 ) &&\n providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y ) &&\n providesCoverage( coverage, level + 1, 2 * x + 1, 2 * y + 1 )\n );\n }\n}\n\n/**\n * @private\n * @inner\n * Sets whether the given tile provides coverage or not.\n */\nfunction setCoverage( coverage, level, x, y, covers ) {\n if ( !coverage[ level ] ) {\n $.console.warn(\n \"Setting coverage for a tile before its level's coverage has been reset: %s\",\n level\n );\n return;\n }\n\n if ( !coverage[ level ][ x ] ) {\n coverage[ level ][ x ] = {};\n }\n\n coverage[ level ][ x ][ y ] = covers;\n}\n\n/**\n * @private\n * @inner\n * Resets coverage information for the given level. This should be called\n * after every draw routine. Note that at the beginning of the next draw\n * routine, coverage for every visible tile should be explicitly set.\n */\nfunction resetCoverage( coverage, level ) {\n coverage[ level ] = {};\n}\n\n/**\n * @private\n * @inner\n * Determines whether the 'last best' tile for the area is better than the\n * tile in question.\n */\nfunction compareTiles( previousBest, tile ) {\n if ( !previousBest ) {\n return tile;\n }\n\n if ( tile.visibility > previousBest.visibility ) {\n return tile;\n } else if ( tile.visibility == previousBest.visibility ) {\n if ( tile.distance < previousBest.distance ) {\n return tile;\n }\n }\n\n return previousBest;\n}\n\nfunction drawTiles( tiledImage, lastDrawn ) {\n if (lastDrawn.length === 0) {\n return;\n }\n var tile = lastDrawn[0];\n\n var useSketch = tiledImage.opacity < 1 ||\n (tiledImage.compositeOperation &&\n tiledImage.compositeOperation !== 'source-over') ||\n (!tiledImage._isBottomItem() && tile._hasTransparencyChannel());\n\n var sketchScale;\n var sketchTranslate;\n\n var zoom = tiledImage.viewport.getZoom(true);\n var imageZoom = tiledImage.viewportToImageZoom(zoom);\n if (imageZoom > tiledImage.smoothTileEdgesMinZoom && !tiledImage.iOSDevice) {\n // When zoomed in a lot (>100%) the tile edges are visible.\n // So we have to composite them at ~100% and scale them up together.\n // Note: Disabled on iOS devices per default as it causes a native crash\n useSketch = true;\n sketchScale = tile.getScaleForEdgeSmoothing();\n sketchTranslate = tile.getTranslationForEdgeSmoothing(sketchScale,\n tiledImage._drawer.getCanvasSize(false),\n tiledImage._drawer.getCanvasSize(true));\n }\n\n var bounds;\n if (useSketch) {\n if (!sketchScale) {\n // Except when edge smoothing, we only clean the part of the\n // sketch canvas we are going to use for performance reasons.\n bounds = tiledImage.viewport.viewportToViewerElementRectangle(\n tiledImage.getClippedBounds(true))\n .getIntegerBoundingBox()\n .times($.pixelDensityRatio);\n }\n tiledImage._drawer._clear(true, bounds);\n }\n\n // When scaling, we must rotate only when blending the sketch canvas to avoid\n // interpolation\n if (tiledImage.viewport.degrees !== 0 && !sketchScale) {\n tiledImage._drawer._offsetForRotation(tiledImage.viewport.degrees, useSketch);\n }\n\n var usedClip = false;\n if ( tiledImage._clip ) {\n tiledImage._drawer.saveContext(useSketch);\n\n var box = tiledImage.imageToViewportRectangle(tiledImage._clip, true);\n var clipRect = tiledImage._drawer.viewportToDrawerRectangle(box);\n if (sketchScale) {\n clipRect = clipRect.times(sketchScale);\n }\n if (sketchTranslate) {\n clipRect = clipRect.translate(sketchTranslate);\n }\n tiledImage._drawer.setClip(clipRect, useSketch);\n\n usedClip = true;\n }\n\n if ( tiledImage.placeholderFillStyle && tiledImage._hasOpaqueTile === false ) {\n var placeholderRect = tiledImage._drawer.viewportToDrawerRectangle(tiledImage.getBounds(true));\n if (sketchScale) {\n placeholderRect = placeholderRect.times(sketchScale);\n }\n if (sketchTranslate) {\n placeholderRect = placeholderRect.translate(sketchTranslate);\n }\n\n var fillStyle = null;\n if ( typeof tiledImage.placeholderFillStyle === \"function\" ) {\n fillStyle = tiledImage.placeholderFillStyle(tiledImage, tiledImage._drawer.context);\n }\n else {\n fillStyle = tiledImage.placeholderFillStyle;\n }\n\n tiledImage._drawer.drawRectangle(placeholderRect, fillStyle, useSketch);\n }\n\n for (var i = lastDrawn.length - 1; i >= 0; i--) {\n tile = lastDrawn[ i ];\n tiledImage._drawer.drawTile( tile, tiledImage._drawingHandler, useSketch, sketchScale, sketchTranslate );\n tile.beingDrawn = true;\n\n if( tiledImage.viewer ){\n /**\n * <em>- Needs documentation -</em>\n *\n * @event tile-drawn\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.\n * @property {OpenSeadragon.TiledImage} tiledImage - Which TiledImage is being drawn.\n * @property {OpenSeadragon.Tile} tile\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n tiledImage.viewer.raiseEvent( 'tile-drawn', {\n tiledImage: tiledImage,\n tile: tile\n });\n }\n }\n\n if ( usedClip ) {\n tiledImage._drawer.restoreContext( useSketch );\n }\n\n if (tiledImage.viewport.degrees !== 0 && !sketchScale) {\n tiledImage._drawer._restoreRotationChanges(useSketch);\n }\n\n if (useSketch) {\n var offsetForRotation = tiledImage.viewport.degrees !== 0 && sketchScale;\n if (offsetForRotation) {\n tiledImage._drawer._offsetForRotation(tiledImage.viewport.degrees, false);\n }\n tiledImage._drawer.blendSketch({\n opacity: tiledImage.opacity,\n scale: sketchScale,\n translate: sketchTranslate,\n compositeOperation: tiledImage.compositeOperation,\n bounds: bounds\n });\n if (offsetForRotation) {\n tiledImage._drawer._restoreRotationChanges(false);\n }\n }\n drawDebugInfo( tiledImage, lastDrawn );\n}\n\nfunction drawDebugInfo( tiledImage, lastDrawn ) {\n if( tiledImage.debugMode ) {\n for ( var i = lastDrawn.length - 1; i >= 0; i-- ) {\n var tile = lastDrawn[ i ];\n try {\n tiledImage._drawer.drawDebugInfo( tile, lastDrawn.length, i );\n } catch(e) {\n $.console.error(e);\n }\n }\n }\n}\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - TileCache\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n// private class\nvar TileRecord = function( options ) {\n $.console.assert( options, \"[TileCache.cacheTile] options is required\" );\n $.console.assert( options.tile, \"[TileCache.cacheTile] options.tile is required\" );\n $.console.assert( options.tiledImage, \"[TileCache.cacheTile] options.tiledImage is required\" );\n this.tile = options.tile;\n this.tiledImage = options.tiledImage;\n};\n\n// private class\nvar ImageRecord = function(options) {\n $.console.assert( options, \"[ImageRecord] options is required\" );\n $.console.assert( options.image, \"[ImageRecord] options.image is required\" );\n this._image = options.image;\n this._tiles = [];\n};\n\nImageRecord.prototype = {\n destroy: function() {\n this._image = null;\n this._renderedContext = null;\n this._tiles = null;\n },\n\n getImage: function() {\n return this._image;\n },\n\n getRenderedContext: function() {\n if (!this._renderedContext) {\n var canvas = document.createElement( 'canvas' );\n canvas.width = this._image.width;\n canvas.height = this._image.height;\n this._renderedContext = canvas.getContext('2d');\n this._renderedContext.drawImage( this._image, 0, 0 );\n //since we are caching the prerendered image on a canvas\n //allow the image to not be held in memory\n this._image = null;\n }\n return this._renderedContext;\n },\n\n setRenderedContext: function(renderedContext) {\n $.console.error(\"ImageRecord.setRenderedContext is deprecated. \" +\n \"The rendered context should be created by the ImageRecord \" +\n \"itself when calling ImageRecord.getRenderedContext.\");\n this._renderedContext = renderedContext;\n },\n\n addTile: function(tile) {\n $.console.assert(tile, '[ImageRecord.addTile] tile is required');\n this._tiles.push(tile);\n },\n\n removeTile: function(tile) {\n for (var i = 0; i < this._tiles.length; i++) {\n if (this._tiles[i] === tile) {\n this._tiles.splice(i, 1);\n return;\n }\n }\n\n $.console.warn('[ImageRecord.removeTile] trying to remove unknown tile', tile);\n },\n\n getTileCount: function() {\n return this._tiles.length;\n }\n};\n\n/**\n * @class TileCache\n * @memberof OpenSeadragon\n * @classdesc Stores all the tiles displayed in a {@link OpenSeadragon.Viewer}.\n * You generally won't have to interact with the TileCache directly.\n * @param {Object} options - Configuration for this TileCache.\n * @param {Number} [options.maxImageCacheCount] - See maxImageCacheCount in\n * {@link OpenSeadragon.Options} for details.\n */\n$.TileCache = function( options ) {\n options = options || {};\n\n this._maxImageCacheCount = options.maxImageCacheCount || $.DEFAULT_SETTINGS.maxImageCacheCount;\n this._tilesLoaded = [];\n this._imagesLoaded = [];\n this._imagesLoadedCount = 0;\n};\n\n/** @lends OpenSeadragon.TileCache.prototype */\n$.TileCache.prototype = {\n /**\n * @returns {Number} The total number of tiles that have been loaded by\n * this TileCache.\n */\n numTilesLoaded: function() {\n return this._tilesLoaded.length;\n },\n\n /**\n * Caches the specified tile, removing an old tile if necessary to stay under the\n * maxImageCacheCount specified on construction. Note that if multiple tiles reference\n * the same image, there may be more tiles than maxImageCacheCount; the goal is to keep\n * the number of images below that number. Note, as well, that even the number of images\n * may temporarily surpass that number, but should eventually come back down to the max specified.\n * @param {Object} options - Tile info.\n * @param {OpenSeadragon.Tile} options.tile - The tile to cache.\n * @param {Image} options.image - The image of the tile to cache.\n * @param {OpenSeadragon.TiledImage} options.tiledImage - The TiledImage that owns that tile.\n * @param {Number} [options.cutoff=0] - If adding this tile goes over the cache max count, this\n * function will release an old tile. The cutoff option specifies a tile level at or below which\n * tiles will not be released.\n */\n cacheTile: function( options ) {\n $.console.assert( options, \"[TileCache.cacheTile] options is required\" );\n $.console.assert( options.tile, \"[TileCache.cacheTile] options.tile is required\" );\n $.console.assert( options.tile.url, \"[TileCache.cacheTile] options.tile.url is required\" );\n $.console.assert( options.tiledImage, \"[TileCache.cacheTile] options.tiledImage is required\" );\n\n var cutoff = options.cutoff || 0;\n var insertionIndex = this._tilesLoaded.length;\n\n var imageRecord = this._imagesLoaded[options.tile.url];\n if (!imageRecord) {\n $.console.assert( options.image, \"[TileCache.cacheTile] options.image is required to create an ImageRecord\" );\n imageRecord = this._imagesLoaded[options.tile.url] = new ImageRecord({\n image: options.image\n });\n\n this._imagesLoadedCount++;\n }\n\n imageRecord.addTile(options.tile);\n options.tile.cacheImageRecord = imageRecord;\n\n // Note that just because we're unloading a tile doesn't necessarily mean\n // we're unloading an image. With repeated calls it should sort itself out, though.\n if ( this._imagesLoadedCount > this._maxImageCacheCount ) {\n var worstTile = null;\n var worstTileIndex = -1;\n var worstTileRecord = null;\n var prevTile, worstTime, worstLevel, prevTime, prevLevel, prevTileRecord;\n\n for ( var i = this._tilesLoaded.length - 1; i >= 0; i-- ) {\n prevTileRecord = this._tilesLoaded[ i ];\n prevTile = prevTileRecord.tile;\n\n if ( prevTile.level <= cutoff || prevTile.beingDrawn ) {\n continue;\n } else if ( !worstTile ) {\n worstTile = prevTile;\n worstTileIndex = i;\n worstTileRecord = prevTileRecord;\n continue;\n }\n\n prevTime = prevTile.lastTouchTime;\n worstTime = worstTile.lastTouchTime;\n prevLevel = prevTile.level;\n worstLevel = worstTile.level;\n\n if ( prevTime < worstTime ||\n ( prevTime == worstTime && prevLevel > worstLevel ) ) {\n worstTile = prevTile;\n worstTileIndex = i;\n worstTileRecord = prevTileRecord;\n }\n }\n\n if ( worstTile && worstTileIndex >= 0 ) {\n this._unloadTile(worstTileRecord);\n insertionIndex = worstTileIndex;\n }\n }\n\n this._tilesLoaded[ insertionIndex ] = new TileRecord({\n tile: options.tile,\n tiledImage: options.tiledImage\n });\n },\n\n /**\n * Clears all tiles associated with the specified tiledImage.\n * @param {OpenSeadragon.TiledImage} tiledImage\n */\n clearTilesFor: function( tiledImage ) {\n $.console.assert(tiledImage, '[TileCache.clearTilesFor] tiledImage is required');\n var tileRecord;\n for ( var i = 0; i < this._tilesLoaded.length; ++i ) {\n tileRecord = this._tilesLoaded[ i ];\n if ( tileRecord.tiledImage === tiledImage ) {\n this._unloadTile(tileRecord);\n this._tilesLoaded.splice( i, 1 );\n i--;\n }\n }\n },\n\n // private\n getImageRecord: function(url) {\n $.console.assert(url, '[TileCache.getImageRecord] url is required');\n return this._imagesLoaded[url];\n },\n\n // private\n _unloadTile: function(tileRecord) {\n $.console.assert(tileRecord, '[TileCache._unloadTile] tileRecord is required');\n var tile = tileRecord.tile;\n var tiledImage = tileRecord.tiledImage;\n\n tile.unload();\n tile.cacheImageRecord = null;\n\n var imageRecord = this._imagesLoaded[tile.url];\n imageRecord.removeTile(tile);\n if (!imageRecord.getTileCount()) {\n imageRecord.destroy();\n delete this._imagesLoaded[tile.url];\n this._imagesLoadedCount--;\n }\n\n /**\n * Triggered when a tile has just been unloaded from memory.\n *\n * @event tile-unloaded\n * @memberof OpenSeadragon.Viewer\n * @type {object}\n * @property {OpenSeadragon.TiledImage} tiledImage - The tiled image of the unloaded tile.\n * @property {OpenSeadragon.Tile} tile - The tile which has been unloaded.\n */\n tiledImage.viewer.raiseEvent(\"tile-unloaded\", {\n tile: tile,\n tiledImage: tiledImage\n });\n }\n};\n\n}( OpenSeadragon ));\n","/*\n * OpenSeadragon - World\n *\n * Copyright (C) 2009 CodePlex Foundation\n * Copyright (C) 2010-2013 OpenSeadragon contributors\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * - Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * - Neither the name of CodePlex Foundation nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n(function( $ ){\n\n/**\n * @class World\n * @memberof OpenSeadragon\n * @extends OpenSeadragon.EventSource\n * @classdesc Keeps track of all of the tiled images in the scene.\n * @param {Object} options - World options.\n * @param {OpenSeadragon.Viewer} options.viewer - The Viewer that owns this World.\n **/\n$.World = function( options ) {\n var _this = this;\n\n $.console.assert( options.viewer, \"[World] options.viewer is required\" );\n\n $.EventSource.call( this );\n\n this.viewer = options.viewer;\n this._items = [];\n this._needsDraw = false;\n this._autoRefigureSizes = true;\n this._needsSizesFigured = false;\n this._delegatedFigureSizes = function(event) {\n if (_this._autoRefigureSizes) {\n _this._figureSizes();\n } else {\n _this._needsSizesFigured = true;\n }\n };\n\n this._figureSizes();\n};\n\n$.extend( $.World.prototype, $.EventSource.prototype, /** @lends OpenSeadragon.World.prototype */{\n /**\n * Add the specified item.\n * @param {OpenSeadragon.TiledImage} item - The item to add.\n * @param {Number} [options.index] - Index for the item. If not specified, goes at the top.\n * @fires OpenSeadragon.World.event:add-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n addItem: function( item, options ) {\n $.console.assert(item, \"[World.addItem] item is required\");\n $.console.assert(item instanceof $.TiledImage, \"[World.addItem] only TiledImages supported at this time\");\n\n options = options || {};\n if (options.index !== undefined) {\n var index = Math.max(0, Math.min(this._items.length, options.index));\n this._items.splice(index, 0, item);\n } else {\n this._items.push( item );\n }\n\n if (this._autoRefigureSizes) {\n this._figureSizes();\n } else {\n this._needsSizesFigured = true;\n }\n\n this._needsDraw = true;\n\n item.addHandler('bounds-change', this._delegatedFigureSizes);\n\n /**\n * Raised when an item is added to the World.\n * @event add-item\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.Viewer} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item that has been added.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'add-item', {\n item: item\n } );\n },\n\n /**\n * Get the item at the specified index.\n * @param {Number} index - The item's index.\n * @returns {OpenSeadragon.TiledImage} The item at the specified index.\n */\n getItemAt: function( index ) {\n $.console.assert(index !== undefined, \"[World.getItemAt] index is required\");\n return this._items[ index ];\n },\n\n /**\n * Get the index of the given item or -1 if not present.\n * @param {OpenSeadragon.TiledImage} item - The item.\n * @returns {Number} The index of the item or -1 if not present.\n */\n getIndexOfItem: function( item ) {\n $.console.assert(item, \"[World.getIndexOfItem] item is required\");\n return $.indexOf( this._items, item );\n },\n\n /**\n * @returns {Number} The number of items used.\n */\n getItemCount: function() {\n return this._items.length;\n },\n\n /**\n * Change the index of a item so that it appears over or under others.\n * @param {OpenSeadragon.TiledImage} item - The item to move.\n * @param {Number} index - The new index.\n * @fires OpenSeadragon.World.event:item-index-change\n */\n setItemIndex: function( item, index ) {\n $.console.assert(item, \"[World.setItemIndex] item is required\");\n $.console.assert(index !== undefined, \"[World.setItemIndex] index is required\");\n\n var oldIndex = this.getIndexOfItem( item );\n\n if ( index >= this._items.length ) {\n throw new Error( \"Index bigger than number of layers.\" );\n }\n\n if ( index === oldIndex || oldIndex === -1 ) {\n return;\n }\n\n this._items.splice( oldIndex, 1 );\n this._items.splice( index, 0, item );\n this._needsDraw = true;\n\n /**\n * Raised when the order of the indexes has been changed.\n * @event item-index-change\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item whose index has\n * been changed\n * @property {Number} previousIndex - The previous index of the item\n * @property {Number} newIndex - The new index of the item\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'item-index-change', {\n item: item,\n previousIndex: oldIndex,\n newIndex: index\n } );\n },\n\n /**\n * Remove an item.\n * @param {OpenSeadragon.TiledImage} item - The item to remove.\n * @fires OpenSeadragon.World.event:remove-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n removeItem: function( item ) {\n $.console.assert(item, \"[World.removeItem] item is required\");\n\n var index = $.indexOf(this._items, item );\n if ( index === -1 ) {\n return;\n }\n\n item.removeHandler('bounds-change', this._delegatedFigureSizes);\n item.destroy();\n this._items.splice( index, 1 );\n this._figureSizes();\n this._needsDraw = true;\n this._raiseRemoveItem(item);\n },\n\n /**\n * Remove all items.\n * @fires OpenSeadragon.World.event:remove-item\n * @fires OpenSeadragon.World.event:metrics-change\n */\n removeAll: function() {\n // We need to make sure any pending images are canceled so the world items don't get messed up\n this.viewer._cancelPendingImages();\n var item;\n for (var i = 0; i < this._items.length; i++) {\n item = this._items[i];\n item.removeHandler('bounds-change', this._delegatedFigureSizes);\n item.destroy();\n }\n\n var removedItems = this._items;\n this._items = [];\n this._figureSizes();\n this._needsDraw = true;\n\n for (i = 0; i < removedItems.length; i++) {\n item = removedItems[i];\n this._raiseRemoveItem(item);\n }\n },\n\n /**\n * Clears all tiles and triggers updates for all items.\n */\n resetItems: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n this._items[i].reset();\n }\n },\n\n /**\n * Updates (i.e. animates bounds of) all items.\n */\n update: function() {\n var animated = false;\n for ( var i = 0; i < this._items.length; i++ ) {\n animated = this._items[i].update() || animated;\n }\n\n return animated;\n },\n\n /**\n * Draws all items.\n */\n draw: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n this._items[i].draw();\n }\n\n this._needsDraw = false;\n },\n\n /**\n * @returns {Boolean} true if any items need updating.\n */\n needsDraw: function() {\n for ( var i = 0; i < this._items.length; i++ ) {\n if ( this._items[i].needsDraw() ) {\n return true;\n }\n }\n return this._needsDraw;\n },\n\n /**\n * @returns {OpenSeadragon.Rect} The smallest rectangle that encloses all items, in viewport coordinates.\n */\n getHomeBounds: function() {\n return this._homeBounds.clone();\n },\n\n /**\n * To facilitate zoom constraints, we keep track of the pixel density of the\n * densest item in the World (i.e. the item whose content size to viewport size\n * ratio is the highest) and save it as this \"content factor\".\n * @returns {Number} the number of content units per viewport unit.\n */\n getContentFactor: function() {\n return this._contentFactor;\n },\n\n /**\n * As a performance optimization, setting this flag to false allows the bounds-change event handler\n * on tiledImages to skip calculations on the world bounds. If a lot of images are going to be positioned in\n * rapid succession, this is a good idea. When finished, setAutoRefigureSizes should be called with true\n * or the system may behave oddly.\n * @param {Boolean} [value] The value to which to set the flag.\n */\n setAutoRefigureSizes: function(value) {\n this._autoRefigureSizes = value;\n if (value & this._needsSizesFigured) {\n this._figureSizes();\n this._needsSizesFigured = false;\n }\n },\n\n /**\n * Arranges all of the TiledImages with the specified settings.\n * @param {Object} options - Specifies how to arrange.\n * @param {Boolean} [options.immediately=false] - Whether to animate to the new arrangement.\n * @param {String} [options.layout] - See collectionLayout in {@link OpenSeadragon.Options}.\n * @param {Number} [options.rows] - See collectionRows in {@link OpenSeadragon.Options}.\n * @param {Number} [options.columns] - See collectionColumns in {@link OpenSeadragon.Options}.\n * @param {Number} [options.tileSize] - See collectionTileSize in {@link OpenSeadragon.Options}.\n * @param {Number} [options.tileMargin] - See collectionTileMargin in {@link OpenSeadragon.Options}.\n * @fires OpenSeadragon.World.event:metrics-change\n */\n arrange: function(options) {\n options = options || {};\n var immediately = options.immediately || false;\n var layout = options.layout || $.DEFAULT_SETTINGS.collectionLayout;\n var rows = options.rows || $.DEFAULT_SETTINGS.collectionRows;\n var columns = options.columns || $.DEFAULT_SETTINGS.collectionColumns;\n var tileSize = options.tileSize || $.DEFAULT_SETTINGS.collectionTileSize;\n var tileMargin = options.tileMargin || $.DEFAULT_SETTINGS.collectionTileMargin;\n var increment = tileSize + tileMargin;\n var wrap;\n if (!options.rows && columns) {\n wrap = columns;\n } else {\n wrap = Math.ceil(this._items.length / rows);\n }\n var x = 0;\n var y = 0;\n var item, box, width, height, position;\n\n this.setAutoRefigureSizes(false);\n for (var i = 0; i < this._items.length; i++) {\n if (i && (i % wrap) === 0) {\n if (layout === 'horizontal') {\n y += increment;\n x = 0;\n } else {\n x += increment;\n y = 0;\n }\n }\n\n item = this._items[i];\n box = item.getBounds();\n if (box.width > box.height) {\n width = tileSize;\n } else {\n width = tileSize * (box.width / box.height);\n }\n\n height = width * (box.height / box.width);\n position = new $.Point(x + ((tileSize - width) / 2),\n y + ((tileSize - height) / 2));\n\n item.setPosition(position, immediately);\n item.setWidth(width, immediately);\n\n if (layout === 'horizontal') {\n x += increment;\n } else {\n y += increment;\n }\n }\n this.setAutoRefigureSizes(true);\n },\n\n // private\n _figureSizes: function() {\n var oldHomeBounds = this._homeBounds ? this._homeBounds.clone() : null;\n var oldContentSize = this._contentSize ? this._contentSize.clone() : null;\n var oldContentFactor = this._contentFactor || 0;\n\n if (!this._items.length) {\n this._homeBounds = new $.Rect(0, 0, 1, 1);\n this._contentSize = new $.Point(1, 1);\n this._contentFactor = 1;\n } else {\n var item = this._items[0];\n var bounds = item.getBounds();\n this._contentFactor = item.getContentSize().x / bounds.width;\n var clippedBounds = item.getClippedBounds();\n var left = clippedBounds.x;\n var top = clippedBounds.y;\n var right = clippedBounds.x + clippedBounds.width;\n var bottom = clippedBounds.y + clippedBounds.height;\n for (var i = 1; i < this._items.length; i++) {\n item = this._items[i];\n bounds = item.getBounds();\n this._contentFactor = Math.max(this._contentFactor,\n item.getContentSize().x / bounds.width);\n clippedBounds = item.getClippedBounds();\n left = Math.min(left, clippedBounds.x);\n top = Math.min(top, clippedBounds.y);\n right = Math.max(right, clippedBounds.x + clippedBounds.width);\n bottom = Math.max(bottom, clippedBounds.y + clippedBounds.height);\n }\n\n this._homeBounds = new $.Rect(left, top, right - left, bottom - top);\n this._contentSize = new $.Point(\n this._homeBounds.width * this._contentFactor,\n this._homeBounds.height * this._contentFactor);\n }\n\n if (this._contentFactor !== oldContentFactor ||\n !this._homeBounds.equals(oldHomeBounds) ||\n !this._contentSize.equals(oldContentSize)) {\n /**\n * Raised when the home bounds or content factor change.\n * @event metrics-change\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent('metrics-change', {});\n }\n },\n\n // private\n _raiseRemoveItem: function(item) {\n /**\n * Raised when an item is removed.\n * @event remove-item\n * @memberOf OpenSeadragon.World\n * @type {object}\n * @property {OpenSeadragon.World} eventSource - A reference to the World which raised the event.\n * @property {OpenSeadragon.TiledImage} item - The item's underlying item.\n * @property {?Object} userData - Arbitrary subscriber-defined object.\n */\n this.raiseEvent( 'remove-item', { item: item } );\n }\n});\n\n}( OpenSeadragon ));\n"]}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.min.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.min.js
deleted file mode 100755
index a85c6f9..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.min.js
+++ /dev/null
@@ -1,15 +0,0 @@
-//! openseadragon 2.2.1
-//! Built on 2016-06-21
-//! Git commit: v2.2.1-0-babdefd
-//! http://openseadragon.github.io
-//! License: http://openseadragon.github.io/license/
-
-
-window.OpenSeadragon=window.OpenSeadragon||function(a){return new OpenSeadragon.Viewer(a)};"function"==typeof define&&define.amd&&define(function(){return window.OpenSeadragon});!function(a){a.version={versionStr:"<%= osdVersion.versionStr %>",major:parseInt("<%= osdVersion.major %>",10),minor:parseInt("<%= osdVersion.minor %>",10),revision:parseInt("<%= osdVersion.revision %>",10)};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(var e in b)c=e;return void 0===c||d.call(b,c)};a.isEmptyObject=function(a){for(var b in a)return!1;return!0};a.freezeObject=function(b){Object.freeze?a.freezeObject=Object.freeze:a.freezeObject=function(a){return a};return a.freezeObject(b)};a.supportsCanvas=function(){var b=document.createElement("canvas");return!(!a.isFunction(b.getContext)||!b.getContext("2d"))}();a.isCanvasTainted=function(a){var b=!1;try{a.getContext("2d").getImageData(0,0,1,1)}catch(c){b=!0}return b};a.pixelDensityRatio=function(){if(a.supportsCanvas){var b=document.createElement("canvas").getContext("2d");var c=window.devicePixelRatio||1;var d=b.webkitBackingStorePixelRatio||b.mozBackingStorePixelRatio||b.msBackingStorePixelRatio||b.oBackingStorePixelRatio||b.backingStorePixelRatio||1;return c/d}return 1}()}(OpenSeadragon);!function($){function getOffsetParent(a,b){return b&&a!=document.body?document.body:a.offsetParent}$.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=arguments.length,i=!1,j=1;if("boolean"==typeof g){i=g;g=arguments[1]||{};j=2}"object"==typeof g||OpenSeadragon.isFunction(g)||(g={});if(h===j){g=this;--j}for(;h>j;j++){a=arguments[j];if(null!==a||void 0!==a)for(b in a){c=g[b];d=a[b];if(g!==d)if(i&&d&&(OpenSeadragon.isPlainObject(d)||(e=OpenSeadragon.isArray(d)))){if(e){e=!1;f=c&&OpenSeadragon.isArray(c)?c:[]}else f=c&&OpenSeadragon.isPlainObject(c)?c:{};g[b]=OpenSeadragon.extend(i,f,d)}else void 0!==d&&(g[b]=d)}}return g};var isIOSDevice=function(){if("object"!=typeof navigator)return!1;var a=navigator.userAgent;return"string"!=typeof a?!1:-1!==a.indexOf("iPhone")||-1!==a.indexOf("iPad")||-1!==a.indexOf("iPod")};$.extend($,{DEFAULT_SETTINGS:{xmlPath:null,tileSources:null,tileHost:null,initialPage:0,crossOriginPolicy:!1,ajaxWithCredentials:!1,panHorizontal:!0,panVertical:!0,constrainDuringPan:!1,wrapHorizontal:!1,wrapVertical:!1,visibilityRatio:.5,minPixelRatio:.5,defaultZoomLevel:0,minZoomLevel:null,maxZoomLevel:null,homeFillsViewer:!1,clickTimeThreshold:300,clickDistThreshold:5,dblClickTimeThreshold:300,dblClickDistThreshold:20,springStiffness:6.5,animationTime:1.2,gestureSettingsMouse:{scrollToZoom:!0,clickToZoom:!0,dblClickToZoom:!1,pinchToZoom:!1,flickEnabled:!1,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsTouch:{scrollToZoom:!1,clickToZoom:!1,dblClickToZoom:!0,pinchToZoom:!0,flickEnabled:!0,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsPen:{scrollToZoom:!1,clickToZoom:!0,dblClickToZoom:!1,pinchToZoom:!1,flickEnabled:!1,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},gestureSettingsUnknown:{scrollToZoom:!1,clickToZoom:!1,dblClickToZoom:!0,pinchToZoom:!0,flickEnabled:!0,flickMinSpeed:120,flickMomentum:.25,pinchRotate:!1},zoomPerClick:2,zoomPerScroll:1.2,zoomPerSecond:1,blendTime:0,alwaysBlend:!1,autoHideControls:!0,immediateRender:!1,minZoomImageRatio:.9,maxZoomPixelRatio:1.1,smoothTileEdgesMinZoom:1.1,iOSDevice:isIOSDevice(),pixelsPerWheelLine:40,autoResize:!0,preserveImageSizeOnResize:!1,minScrollDeltaTime:50,showSequenceControl:!0,sequenceControlAnchor:null,preserveViewport:!1,preserveOverlays:!1,navPrevNextWrap:!1,showNavigationControl:!0,navigationControlAnchor:null,showZoomControl:!0,showHomeControl:!0,showFullPageControl:!0,showRotationControl:!1,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,navigatorAutoFade:!0,navigatorRotate:!0,degrees:0,opacity:1,compositeOperation:null,placeholderFillStyle:null,showReferenceStrip:!1,referenceStripScroll:"horizontal",referenceStripElement:null,referenceStripHeight:null,referenceStripWidth:null,referenceStripPosition:"BOTTOM_LEFT",referenceStripSizeRatio:.2,collectionRows:3,collectionColumns:0,collectionLayout:"horizontal",collectionMode:!1,collectionTileSize:800,collectionTileMargin:80,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"}},debugMode:!1,debugGridColor:"#437AB2"},SIGNAL:"----seadragon----",delegate:function(a,b){return function(){var c=arguments;void 0===c&&(c=[]);return b.apply(a,c)}},BROWSERS:{UNKNOWN:0,IE:1,FIREFOX:2,SAFARI:3,CHROME:4,OPERA:5},getElement:function(a){"string"==typeof a&&(a=document.getElementById(a));return a},getElementPosition:function(a){var b,c,d=new $.Point;a=$.getElement(a);b="fixed"==$.getElementStyle(a).position;c=getOffsetParent(a,b);for(;c;){d.x+=a.offsetLeft;d.y+=a.offsetTop;b&&(d=d.plus($.getPageScroll()));a=c;b="fixed"==$.getElementStyle(a).position;c=getOffsetParent(a,b)}return d},getElementOffset:function(a){a=$.getElement(a);var b,c,d=a&&a.ownerDocument,e={top:0,left:0};if(!d)return new $.Point;b=d.documentElement;"undefined"!=typeof a.getBoundingClientRect&&(e=a.getBoundingClientRect());c=d==d.window?d:9===d.nodeType?d.defaultView||d.parentWindow:!1;return new $.Point(e.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0),e.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0))},getElementSize:function(a){a=$.getElement(a);return new $.Point(a.clientWidth,a.clientHeight)},getElementStyle:document.documentElement.currentStyle?function(a){a=$.getElement(a);return a.currentStyle}:function(a){a=$.getElement(a);return window.getComputedStyle(a,"")},getCssPropertyWithVendorPrefix:function(a){var b={};$.getCssPropertyWithVendorPrefix=function(a){if(void 0!==b[a])return b[a];var c=document.createElement("div").style;var d=null;if(void 0!==c[a])d=a;else{var e=["Webkit","Moz","MS","O","webkit","moz","ms","o"];var f=$.capitalizeFirstLetter(a);for(var g=0;g<e.length;g++){var h=e[g]+f;if(void 0!==c[h]){d=h;break}}}b[a]=d;return d};return $.getCssPropertyWithVendorPrefix(a)},capitalizeFirstLetter:function(a){return a.charAt(0).toUpperCase()+a.slice(1)},pointInElement:function(a,b){a=$.getElement(a);var c=$.getElementOffset(a),d=$.getElementSize(a);return b.x>=c.x&&b.x<c.x+d.x&&b.y<c.y+d.y&&b.y>=c.y},getEvent:function(a){a?$.getEvent=function(a){return a}:$.getEvent=function(){return window.event};return $.getEvent(a)},getMousePosition:function(a){if("number"==typeof a.pageX)$.getMousePosition=function(a){var b=new $.Point;a=$.getEvent(a);b.x=a.pageX;b.y=a.pageY;return b};else{if("number"!=typeof a.clientX)throw new Error("Unknown event mouse position, no known technique.");$.getMousePosition=function(a){var b=new $.Point;a=$.getEvent(a);b.x=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;b.y=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return b}}return $.getMousePosition(a)},getPageScroll:function(){var a=document.documentElement||{},b=document.body||{};if("number"==typeof window.pageXOffset)$.getPageScroll=function(){return new $.Point(window.pageXOffset,window.pageYOffset)};else if(b.scrollLeft||b.scrollTop)$.getPageScroll=function(){return new $.Point(document.body.scrollLeft,document.body.scrollTop)};else{if(!a.scrollLeft&&!a.scrollTop)return new $.Point(0,0);$.getPageScroll=function(){return new $.Point(document.documentElement.scrollLeft,document.documentElement.scrollTop)}}return $.getPageScroll()},setPageScroll:function(a){if("undefined"!=typeof window.scrollTo)$.setPageScroll=function(a){window.scrollTo(a.x,a.y)};else{var b=$.getPageScroll();if(b.x===a.x&&b.y===a.y)return;document.body.scrollLeft=a.x;document.body.scrollTop=a.y;var c=$.getPageScroll();if(c.x!==b.x&&c.y!==b.y){$.setPageScroll=function(a){document.body.scrollLeft=a.x;document.body.scrollTop=a.y};return}document.documentElement.scrollLeft=a.x;document.documentElement.scrollTop=a.y;c=$.getPageScroll();if(c.x!==b.x&&c.y!==b.y){$.setPageScroll=function(a){document.documentElement.scrollLeft=a.x;document.documentElement.scrollTop=a.y};return}$.setPageScroll=function(a){}}return $.setPageScroll(a)},getWindowSize:function(){var a=document.documentElement||{},b=document.body||{};if("number"==typeof window.innerWidth)$.getWindowSize=function(){return new $.Point(window.innerWidth,window.innerHeight)};else if(a.clientWidth||a.clientHeight)$.getWindowSize=function(){return new $.Point(document.documentElement.clientWidth,document.documentElement.clientHeight)};else{if(!b.clientWidth&&!b.clientHeight)throw new Error("Unknown window size, no known technique.");$.getWindowSize=function(){return new $.Point(document.body.clientWidth,document.body.clientHeight)}}return $.getWindowSize()},makeCenteredNode:function(a){a=$.getElement(a);var b=[$.makeNeutralElement("div"),$.makeNeutralElement("div"),$.makeNeutralElement("div")];$.extend(b[0].style,{display:"table",height:"100%",width:"100%"});$.extend(b[1].style,{display:"table-row"});$.extend(b[2].style,{display:"table-cell",verticalAlign:"middle",textAlign:"center"});b[0].appendChild(b[1]);b[1].appendChild(b[2]);b[2].appendChild(a);return b[0]},makeNeutralElement:function(a){var b=document.createElement(a),c=b.style;c.background="transparent none";c.border="none";c.margin="0px";c.padding="0px";c.position="static";return b},now:function(){Date.now?$.now=Date.now:$.now=function(){return(new Date).getTime()};return $.now()},makeTransparentImage:function(a){$.makeTransparentImage=function(a){var b=$.makeNeutralElement("img");b.src=a;return b};$.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<7&&($.makeTransparentImage=function(a){var b=$.makeNeutralElement("img"),c=null;c=$.makeNeutralElement("span");c.style.display="inline-block";b.onload=function(){c.style.width=c.style.width||b.width+"px";c.style.height=c.style.height||b.height+"px";b.onload=null;b=null};b.src=a;c.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+a+"', sizingMethod='scale')";return c});return $.makeTransparentImage(a)},setElementOpacity:function(a,b,c){var d,e;a=$.getElement(a);c&&!$.Browser.alpha&&(b=Math.round(b));if($.Browser.opacity)a.style.opacity=1>b?b:"";else if(1>b){d=Math.round(100*b);e="alpha(opacity="+d+")";a.style.filter=e}else a.style.filter=""},setElementTouchActionNone:function(a){a=$.getElement(a);"undefined"!=typeof a.style.touchAction?a.style.touchAction="none":"undefined"!=typeof a.style.msTouchAction&&(a.style.msTouchAction="none")},addClass:function(a,b){a=$.getElement(a);a.className?-1===(" "+a.className+" ").indexOf(" "+b+" ")&&(a.className+=" "+b):a.className=b},indexOf:function(a,b,c){Array.prototype.indexOf?this.indexOf=function(a,b,c){return a.indexOf(b,c)}:this.indexOf=function(a,b,c){var d,e,f=c?c:0;if(!a)throw new TypeError;e=a.length;if(0===e||f>=e)return-1;0>f&&(f=e-Math.abs(f));for(d=f;e>d;d++)if(a[d]===b)return d;return-1};return this.indexOf(a,b,c)},removeClass:function(a,b){var c,d,e=[];a=$.getElement(a);c=a.className.split(/\s+/);for(d=0;d<c.length;d++)c[d]&&c[d]!==b&&e.push(c[d]);a.className=e.join(" ")},addEvent:function(){if(window.addEventListener)return function(a,b,c,d){a=$.getElement(a);a.addEventListener(b,c,d)};if(window.attachEvent)return function(a,b,c,d){a=$.getElement(a);a.attachEvent("on"+b,c)};throw new Error("No known event model.")}(),removeEvent:function(){if(window.removeEventListener)return function(a,b,c,d){a=$.getElement(a);a.removeEventListener(b,c,d)};if(window.detachEvent)return function(a,b,c,d){a=$.getElement(a);a.detachEvent("on"+b,c)};throw new Error("No known event model.")}(),cancelEvent:function(a){a=$.getEvent(a);a.preventDefault?$.cancelEvent=function(a){a.preventDefault()}:$.cancelEvent=function(a){a=$.getEvent(a);a.cancel=!0;a.returnValue=!1};$.cancelEvent(a)},stopEvent:function(a){a=$.getEvent(a);a.stopPropagation?$.stopEvent=function(a){a.stopPropagation()}:$.stopEvent=function(a){a=$.getEvent(a);a.cancelBubble=!0};$.stopEvent(a)},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=URLPARAMS[a];return b?b:null},getUrlProtocol:function(a){var b=a.match(/^([a-z]+:)\/\//i);return null===b?window.location.protocol:b[1].toLowerCase()},createAjaxRequest:function(a){var b;try{b=!!new ActiveXObject("Microsoft.XMLHTTP")}catch(c){b=!1}if(b)window.XMLHttpRequest?$.createAjaxRequest=function(a){return a?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest}:$.createAjaxRequest=function(){return new ActiveXObject("Microsoft.XMLHTTP")};else{if(!window.XMLHttpRequest)throw new Error("Browser doesn't support XMLHttpRequest.");$.createAjaxRequest=function(){return new XMLHttpRequest}}return $.createAjaxRequest(a)},makeAjaxRequest:function(a,b,c){var d;if($.isPlainObject(a)){b=a.success;c=a.error;d=a.withCredentials;a=a.url}var e=$.getUrlProtocol(a);var f=$.createAjaxRequest("file:"===e);if(!$.isFunction(b))throw new Error("makeAjaxRequest requires a success callback");f.onreadystatechange=function(){if(4==f.readyState){f.onreadystatechange=function(){};if(200===f.status||0===f.status&&"http:"!==e&&"https:"!==e)b(f);else{$.console.log("AJAX request returned %d: %s",f.status,a);$.isFunction(c)&&c(f)}}};d&&(f.withCredentials=!0);try{f.open("GET",a,!0);f.send(null)}catch(g){var h=g.message;var i=$.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<10;i&&"undefined"!=typeof g.number&&-2147024891==g.number&&(h+="\nSee http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx#xdomain");$.console.log("%s while making AJAX request: %s",g.name,h);f.onreadystatechange=function(){};if(window.XDomainRequest){var j=new XDomainRequest;if(j){j.onload=function(a){$.isFunction(b)&&b({responseText:j.responseText,status:200,statusText:"OK"})};j.onerror=function(a){$.isFunction(c)&&c({responseText:j.responseText,status:444,statusText:"An error happened. Due to an XDomainRequest deficiency we can not extract any information about this error. Upgrade your browser."})};try{j.open("GET",a);j.send()}catch(k){$.isFunction(c)&&c(f,g)}}}else $.isFunction(c)&&c(f,g)}},jsonp:function(a){var b,c=a.url,d=document.head||document.getElementsByTagName("head")[0]||document.documentElement,e=a.callbackName||"openseadragon"+$.now(),f=window[e],g="$1"+e+"$2",h=a.param||"callback",i=a.callback;c=c.replace(/(\=)\?(&|$)|\?\?/i,g);c+=(/\?/.test(c)?"&":"?")+h+"="+e;window[e]=function(a){if(f)window[e]=f;else try{delete window[e]}catch(b){}i&&$.isFunction(i)&&i(a)};b=document.createElement("script");(void 0!==a.async||!1!==a.async)&&(b.async="async");a.scriptCharset&&(b.charset=a.scriptCharset);b.src=c;b.onload=b.onreadystatechange=function(a,c){if(c||!b.readyState||/loaded|complete/.test(b.readyState)){b.onload=b.onreadystatechange=null;d&&b.parentNode&&d.removeChild(b);b=void 0}};d.insertBefore(b,d.firstChild)},createFromDZI:function(){throw"OpenSeadragon.createFromDZI is deprecated, use Viewer.open."},parseXml:function(a){if(window.DOMParser)$.parseXml=function(a){var b,c=null;b=new DOMParser;c=b.parseFromString(a,"text/xml");return c};else{if(!window.ActiveXObject)throw new Error("Browser doesn't support XML DOM.");$.parseXml=function(a){var b=null;b=new ActiveXObject("Microsoft.XMLDOM");b.async=!1;b.loadXML(a);return b}}return $.parseXml(a)},parseJSON:function(string){window.JSON&&window.JSON.parse?$.parseJSON=window.JSON.parse:$.parseJSON=function(string){return eval("("+string+")")};return $.parseJSON(string)},imageFormatSupported:function(a){a=a?a:"";return!!FILEFORMATS[a.toLowerCase()]}});$.Browser={vendor:$.BROWSERS.UNKNOWN,version:0,alpha:!0};var FILEFORMATS={bmp:!1,jpeg:!0,jpg:!0,png:!0,tif:!1,wdp:!1},URLPARAMS={};!function(){var a,b=(navigator.appName,navigator.appVersion),c=navigator.userAgent;switch(navigator.appName){case"Microsoft Internet Explorer":if(window.attachEvent&&window.ActiveXObject){$.Browser.vendor=$.BROWSERS.IE;$.Browser.version=parseFloat(c.substring(c.indexOf("MSIE")+5,c.indexOf(";",c.indexOf("MSIE"))))}break;case"Netscape":if(window.addEventListener)if(c.indexOf("Firefox")>=0){$.Browser.vendor=$.BROWSERS.FIREFOX;$.Browser.version=parseFloat(c.substring(c.indexOf("Firefox")+8))}else if(c.indexOf("Safari")>=0){$.Browser.vendor=c.indexOf("Chrome")>=0?$.BROWSERS.CHROME:$.BROWSERS.SAFARI;$.Browser.version=parseFloat(c.substring(c.substring(0,c.indexOf("Safari")).lastIndexOf("/")+1,c.indexOf("Safari")))}else{a=new RegExp("Trident/.*rv:([0-9]{1,}[.0-9]{0,})");if(null!==a.exec(c)){$.Browser.vendor=$.BROWSERS.IE;$.Browser.version=parseFloat(RegExp.$1)}}break;case"Opera":$.Browser.vendor=$.BROWSERS.OPERA;$.Browser.version=parseFloat(b)}var d,e,f,g=window.location.search.substring(1),h=g.split("&");for(f=0;f<h.length;f++){d=h[f];e=d.indexOf("=");e>0&&(URLPARAMS[d.substring(0,e)]=decodeURIComponent(d.substring(e+1)))}$.Browser.alpha=!($.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<9||$.Browser.vendor==$.BROWSERS.CHROME&&$.Browser.version<2);$.Browser.opacity=!($.Browser.vendor==$.BROWSERS.IE&&$.Browser.version<9)}();var nullfunction=function(a){};$.console=window.console||{log:nullfunction,debug:nullfunction,info:nullfunction,warn:nullfunction,error:nullfunction,assert:nullfunction};!function(a){var b=a.requestAnimationFrame||a.mozRequestAnimationFrame||a.webkitRequestAnimationFrame||a.msRequestAnimationFrame;var c=a.cancelAnimationFrame||a.mozCancelAnimationFrame||a.webkitCancelAnimationFrame||a.msCancelAnimationFrame;if(b&&c){$.requestAnimationFrame=function(){return b.apply(a,arguments)};$.cancelAnimationFrame=function(){return c.apply(a,arguments)}}else{var d,e=[],f=[],g=0;$.requestAnimationFrame=function(a){e.push([++g,a]);d||(d=setInterval(function(){if(e.length){var a=$.now();var b=f;f=e;e=b;for(;f.length;)f.shift()[1](a)}else{clearInterval(d);d=void 0}},20));return g};$.cancelAnimationFrame=function(a){var b,c;for(b=0,c=e.length;c>b;b+=1)if(e[b][0]===a){e.splice(b,1);return}for(b=0,c=f.length;c>b;b+=1)if(f[b][0]===a){f.splice(b,1);return}}}}(window)}(OpenSeadragon);!function(a){var b={supportsFullScreen:!1,isFullScreen:function(){return!1},getFullScreenElement:function(){return null},requestFullScreen:function(){},exitFullScreen:function(){},cancelFullScreen:function(){},fullScreenEventName:"",fullScreenErrorEventName:""};if(document.exitFullscreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.fullscreenElement};b.requestFullScreen=function(a){return a.requestFullscreen()};b.exitFullScreen=function(){document.exitFullscreen()};b.fullScreenEventName="fullscreenchange";b.fullScreenErrorEventName="fullscreenerror"}else if(document.msExitFullscreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.msFullscreenElement};b.requestFullScreen=function(a){return a.msRequestFullscreen()};b.exitFullScreen=function(){document.msExitFullscreen()};b.fullScreenEventName="MSFullscreenChange";b.fullScreenErrorEventName="MSFullscreenError"}else if(document.webkitExitFullscreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.webkitFullscreenElement};b.requestFullScreen=function(a){return a.webkitRequestFullscreen()};b.exitFullScreen=function(){document.webkitExitFullscreen()};b.fullScreenEventName="webkitfullscreenchange";b.fullScreenErrorEventName="webkitfullscreenerror"}else if(document.webkitCancelFullScreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.webkitCurrentFullScreenElement};b.requestFullScreen=function(a){return a.webkitRequestFullScreen()};b.exitFullScreen=function(){document.webkitCancelFullScreen()};b.fullScreenEventName="webkitfullscreenchange";b.fullScreenErrorEventName="webkitfullscreenerror"}else if(document.mozCancelFullScreen){b.supportsFullScreen=!0;b.getFullScreenElement=function(){return document.mozFullScreenElement};b.requestFullScreen=function(a){return a.mozRequestFullScreen()};b.exitFullScreen=function(){document.mozCancelFullScreen()};b.fullScreenEventName="mozfullscreenchange";b.fullScreenErrorEventName="mozfullscreenerror"}b.isFullScreen=function(){return null!==b.getFullScreenElement()};b.cancelFullScreen=function(){a.console.error("cancelFullScreen is deprecated. Use exitFullScreen instead.");b.exitFullScreen()};a.extend(a,b)}(OpenSeadragon);!function(a){a.EventSource=function(){this.events={}};a.EventSource.prototype={addOnceHandler:function(a,b,c,d){var e=this;d=d||1;var f=0;var g=function(c){f++;f===d&&e.removeHandler(a,g);b(c)};this.addHandler(a,g,c)},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];if(!b||!b.length)return null;b=1===b.length?[b[0]]:Array.apply(null,b);return function(a,c){var d,e=b.length;for(d=0;e>d;d++)if(b[d]){c.eventSource=a;c.userData=b[d].userData;b[d].handler(c)}}},raiseEvent:function(a,b){var c=this.getHandler(a);if(c){b||(b={});c(this,b)}}}}(OpenSeadragon);!function(a){function b(b){var c,d=pa[b.hash],e=d.activePointersLists.length;for(c=0;e>c;c++)if(d.activePointersLists[c].captureCount>0){a.removeEvent(a.MouseTracker.captureElement,"mousemove",d.mousemovecaptured,!0);a.removeEvent(a.MouseTracker.captureElement,"mouseup",d.mouseupcaptured,!0);a.removeEvent(a.MouseTracker.captureElement,a.MouseTracker.unprefixedPointerEvents?"pointermove":"MSPointerMove",d.pointermovecaptured,!0);a.removeEvent(a.MouseTracker.captureElement,a.MouseTracker.unprefixedPointerEvents?"pointerup":"MSPointerUp",d.pointerupcaptured,!0);a.removeEvent(a.MouseTracker.captureElement,"touchmove",d.touchmovecaptured,!0);a.removeEvent(a.MouseTracker.captureElement,"touchend",d.touchendcaptured,!0);d.activePointersLists[c].captureCount=0}for(c=0;e>c;c++)d.activePointersLists.pop()}function c(c){var d,e,f=pa[c.hash];if(!f.tracking){for(e=0;e<a.MouseTracker.subscribeEvents.length;e++){d=a.MouseTracker.subscribeEvents[e];a.addEvent(c.element,d,f[d],!1)}b(c);f.tracking=!0}}function d(c){var d,e,f=pa[c.hash];if(f.tracking){for(e=0;e<a.MouseTracker.subscribeEvents.length;e++){d=a.MouseTracker.subscribeEvents[e];a.removeEvent(c.element,d,f[d],!1)}b(c);f.tracking=!1}}function e(b,c){var d=pa[b.hash];if("pointerevent"===c)return{upName:a.MouseTracker.unprefixedPointerEvents?"pointerup":"MSPointerUp",upHandler:d.pointerupcaptured,moveName:a.MouseTracker.unprefixedPointerEvents?"pointermove":"MSPointerMove",moveHandler:d.pointermovecaptured};if("mouse"===c)return{upName:"mouseup",upHandler:d.mouseupcaptured,moveName:"mousemove",moveHandler:d.mousemovecaptured};if("touch"===c)return{upName:"touchend",upHandler:d.touchendcaptured,moveName:"touchmove",moveHandler:d.touchmovecaptured};throw new Error("MouseTracker.getCaptureEventParams: Unknown pointer type.")}function f(b,c,d){var f,g=b.getActivePointersListByType(c);g.captureCount+=d||1;if(1===g.captureCount)if(a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9)b.element.setCapture(!0);else{f=e(b,a.MouseTracker.havePointerEvents?"pointerevent":c);qa&&na(window.top)&&a.addEvent(window.top,f.upName,f.upHandler,!0);a.addEvent(a.MouseTracker.captureElement,f.upName,f.upHandler,!0);a.addEvent(a.MouseTracker.captureElement,f.moveName,f.moveHandler,!0)}}function g(b,c,d){var f,g=b.getActivePointersListByType(c);g.captureCount-=d||1;if(0===g.captureCount)if(a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9)b.element.releaseCapture();else{f=e(b,a.MouseTracker.havePointerEvents?"pointerevent":c);qa&&na(window.top)&&a.removeEvent(window.top,f.upName,f.upHandler,!0);a.removeEvent(a.MouseTracker.captureElement,f.moveName,f.moveHandler,!0);a.removeEvent(a.MouseTracker.captureElement,f.upName,f.upHandler,!0)}}function h(b){var c;if(a.MouseTracker.unprefixedPointerEvents)c=b.pointerType;else switch(b.pointerType){case 2:c="touch";break;case 3:c="pen";break;case 4:c="mouse";break;default:c=""}return c}function i(b){return a.getMousePosition(b)}function j(a,b){return k(i(a),b)}function k(b,c){var d=a.getElementOffset(c);return b.minus(d)}function l(b,c){return new a.Point((b.x+c.x)/2,(b.y+c.y)/2)}function m(b,c){b.clickHandler&&a.cancelEvent(c)}function n(b,c){b.dblClickHandler&&a.cancelEvent(c)}function o(b,c){var d;if(b.keyDownHandler){c=a.getEvent(c);d=b.keyDownHandler({eventSource:b,keyCode:c.keyCode?c.keyCode:c.charCode,ctrl:c.ctrlKey,shift:c.shiftKey,alt:c.altKey,meta:c.metaKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d||a.cancelEvent(c)}}function p(b,c){var d;if(b.keyUpHandler){c=a.getEvent(c);d=b.keyUpHandler({eventSource:b,keyCode:c.keyCode?c.keyCode:c.charCode,ctrl:c.ctrlKey,shift:c.shiftKey,alt:c.altKey,meta:c.metaKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d||a.cancelEvent(c)}}function q(b,c){var d;if(b.keyHandler){c=a.getEvent(c);d=b.keyHandler({eventSource:b,keyCode:c.keyCode?c.keyCode:c.charCode,ctrl:c.ctrlKey,shift:c.shiftKey,alt:c.altKey,meta:c.metaKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d||a.cancelEvent(c)}}function r(b,c){var d;if(b.focusHandler){c=a.getEvent(c);d=b.focusHandler({eventSource:b,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d===!1&&a.cancelEvent(c)}}function s(b,c){var d;if(b.blurHandler){c=a.getEvent(c);d=b.blurHandler({eventSource:b,originalEvent:c,preventDefaultAction:!1,userData:b.userData});d===!1&&a.cancelEvent(c)}}function t(a,b){v(a,b,b)}function u(b,c){c=a.getEvent(c);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};"mousewheel"==a.MouseTracker.wheelEventName?d.deltaY=-1/a.DEFAULT_SETTINGS.pixelsPerWheelLine*c.wheelDelta:d.deltaY=c.detail;v(b,d,c)}function v(b,c,d){var e,f=0;f=c.deltaY<0?1:-1;if(b.scrollHandler){e=b.scrollHandler({eventSource:b,pointerType:"mouse",position:j(c,b.element),scroll:f,shift:c.shiftKey,isTouchEvent:!1,originalEvent:d,preventDefaultAction:!1,userData:b.userData});e===!1&&a.cancelEvent(d)}}function w(a,b){if(a===b)return!1;for(;b&&b!==a;)b=b.parentNode;return b===a}function x(b,c){c=a.getEvent(c);z(b,c)}function y(b,c){c=a.getEvent(c);c.currentTarget===c.relatedTarget||w(c.currentTarget,c.relatedTarget)||z(b,c)}function z(b,c){var d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};ga(b,c,[d])}function A(b,c){c=a.getEvent(c);C(b,c)}function B(b,c){c=a.getEvent(c);c.currentTarget===c.relatedTarget||w(c.currentTarget,c.relatedTarget)||C(b,c)}function C(b,c){var d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};ha(b,c,[d])}function D(b){return a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9?1===b?0:2===b?2:4===b?1:-1:b}function E(b,c){var d;c=a.getEvent(c);d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};if(ia(b,c,[d],D(c.button))){a.stopEvent(c);f(b,"mouse")}(b.clickHandler||b.dblClickHandler||b.pressHandler||b.dragHandler||b.dragEndHandler)&&a.cancelEvent(c)}function F(a,b){H(a,b)}function G(b,c){H(b,c);a.stopEvent(c)}function H(b,c){var d;c=a.getEvent(c);d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};ja(b,c,[d],D(c.button))&&g(b,"mouse")}function I(a,b){K(a,b)}function J(b,c){K(b,c);a.stopEvent(c)}function K(b,c){var d;c=a.getEvent(c);d={id:a.MouseTracker.mousePointerId,type:"mouse",isPrimary:!0,currentPos:i(c),currentTime:a.now()};ka(b,c,[d])}function L(a,b,c){var d,e=c.getLength(),f=[];for(d=0;e>d;d++)f.push(c.getByIndex(d));if(f.length>0){ja(a,b,f,0);c.captureCount=1;g(a,"touch");ha(a,b,f)}}function M(b,c){var d,e,g,h,j=c.changedTouches.length,k=[],l=b.getActivePointersListByType("touch");d=a.now();if(l.getLength()>c.touches.length-j){a.console.warn("Tracked touch contact count doesn't match event.touches.length. Removing all tracked touch pointers.");L(b,c,l)}for(e=0;j>e;e++)k.push({id:c.changedTouches[e].identifier,type:"touch",currentPos:i(c.changedTouches[e]),currentTime:d});ga(b,c,k);for(e=0;e<oa.length;e++)if(oa[e]!==b&&oa[e].isTracking()&&w(oa[e].element,b.element)){h=[];for(g=0;j>g;g++)h.push({id:c.changedTouches[g].identifier,type:"touch",currentPos:i(c.changedTouches[g]),currentTime:d});ga(oa[e],c,h)}if(ia(b,c,k,0)){a.stopEvent(c);f(b,"touch",j)}a.cancelEvent(c)}function N(a,b){P(a,b)}function O(b,c){P(b,c);a.stopEvent(c)}function P(b,c){var d,e,f,h,j=c.changedTouches.length,k=[];d=a.now();for(e=0;j>e;e++)k.push({id:c.changedTouches[e].identifier,type:"touch",currentPos:i(c.changedTouches[e]),currentTime:d});ja(b,c,k,0)&&g(b,"touch",j);ha(b,c,k);for(e=0;e<oa.length;e++)if(oa[e]!==b&&oa[e].isTracking()&&w(oa[e].element,b.element)){h=[];for(f=0;j>f;f++)h.push({id:c.changedTouches[f].identifier,type:"touch",currentPos:i(c.changedTouches[f]),currentTime:d});ha(oa[e],c,h)}a.cancelEvent(c)}function Q(a,b){S(a,b)}function R(b,c){S(b,c);a.stopEvent(c)}function S(b,c){var d,e=c.changedTouches.length,f=[];for(d=0;e>d;d++)f.push({id:c.changedTouches[d].identifier,type:"touch",currentPos:i(c.changedTouches[d]),currentTime:a.now()});ka(b,c,f);a.cancelEvent(c)}function T(a,b){var c=(b.changedTouches.length,a.getActivePointersListByType("touch"));L(a,b,c)}function U(a,b){b.stopPropagation();b.preventDefault();return!1}function V(a,b){b.stopPropagation();b.preventDefault();return!1}function W(b,c){var d;if(c.currentTarget!==c.relatedTarget&&!w(c.currentTarget,c.relatedTarget)){d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};ga(b,c,[d])}}function X(b,c){var d;if(c.currentTarget!==c.relatedTarget&&!w(c.currentTarget,c.relatedTarget)){d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};ha(b,c,[d])}}function Y(b,c){var d;d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};if(ia(b,c,[d],c.button)){
-a.stopEvent(c);f(b,d.type)}(b.clickHandler||b.dblClickHandler||b.pressHandler||b.dragHandler||b.dragEndHandler||b.pinchHandler)&&a.cancelEvent(c)}function Z(a,b){_(a,b)}function $(b,c){var d=b.getActivePointersListByType(h(c));d.getById(c.pointerId)&&_(b,c);a.stopEvent(c)}function _(b,c){var d;d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};ja(b,c,[d],c.button)&&g(b,d.type)}function aa(a,b){ca(a,b)}function ba(b,c){var d=b.getActivePointersListByType(h(c));d.getById(c.pointerId)&&ca(b,c);a.stopEvent(c)}function ca(b,c){var d;d={id:c.pointerId,type:h(c),isPrimary:c.isPrimary,currentPos:i(c),currentTime:a.now()};ka(b,c,[d])}function da(a,b){var c;c={id:b.pointerId,type:h(b)};la(a,b,[c])}function ea(a,b){b.hasOwnProperty("isPrimary")||(0===a.getLength()?b.isPrimary=!0:b.isPrimary=!1);b.speed=0;b.direction=0;b.contactPos=b.currentPos;b.contactTime=b.currentTime;b.lastPos=b.currentPos;b.lastTime=b.currentTime;return a.add(b)}function fa(a,b){var c,d;if(a.getById(b.id)){c=a.removeById(b.id);if(!b.hasOwnProperty("isPrimary")){d=a.getPrimary();if(!d){d=a.getByIndex(0);d&&(d.isPrimary=!0)}}}else c=a.getLength();return c}function ga(b,c,d){var e,f,g,h,i=b.getActivePointersListByType(d[0].type),j=d.length;for(e=0;j>e;e++){f=d[e];g=i.getById(f.id);if(g){g.insideElement=!0;g.lastPos=g.currentPos;g.lastTime=g.currentTime;g.currentPos=f.currentPos;g.currentTime=f.currentTime;f=g}else{f.captured=!1;f.insideElementPressed=!1;f.insideElement=!0;ea(i,f)}if(b.enterHandler){h=b.enterHandler({eventSource:b,pointerType:f.type,position:k(f.currentPos,b.element),buttons:i.buttons,pointers:b.getActivePointerCount(),insideElementPressed:f.insideElementPressed,buttonDownAny:0!==i.buttons,isTouchEvent:"touch"===f.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});h===!1&&a.cancelEvent(c)}}}function ha(b,c,d){var e,f,g,h,i=(pa[b.hash],b.getActivePointersListByType(d[0].type)),j=d.length;for(e=0;j>e;e++){f=d[e];g=i.getById(f.id);if(g){if(g.captured){g.insideElement=!1;g.lastPos=g.currentPos;g.lastTime=g.currentTime;g.currentPos=f.currentPos;g.currentTime=f.currentTime}else fa(i,g);f=g}if(b.exitHandler){h=b.exitHandler({eventSource:b,pointerType:f.type,position:k(f.currentPos,b.element),buttons:i.buttons,pointers:b.getActivePointerCount(),insideElementPressed:g?g.insideElementPressed:!1,buttonDownAny:0!==i.buttons,isTouchEvent:"touch"===f.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});h===!1&&a.cancelEvent(c)}}}function ia(b,c,d,e){var f,g,h,i,j=pa[b.hash],m=b.getActivePointersListByType(d[0].type),n=d.length;"undefined"!=typeof c.buttons?m.buttons=c.buttons:a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9?0===e?m.buttons+=1:1===e?m.buttons+=4:2===e?m.buttons+=2:3===e?m.buttons+=8:4===e?m.buttons+=16:5===e&&(m.buttons+=32):0===e?m.buttons|=1:1===e?m.buttons|=4:2===e?m.buttons|=2:3===e?m.buttons|=8:4===e?m.buttons|=16:5===e&&(m.buttons|=32);if(0!==e){if(b.nonPrimaryPressHandler){f=b.nonPrimaryPressHandler({eventSource:b,pointerType:d[0].type,position:k(d[0].currentPos,b.element),button:e,buttons:m.buttons,isTouchEvent:"touch"===d[0].type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}return!1}for(g=0;n>g;g++){h=d[g];i=m.getById(h.id);if(i){i.captured=!0;i.insideElementPressed=!0;i.insideElement=!0;i.contactPos=h.currentPos;i.contactTime=h.currentTime;i.lastPos=i.currentPos;i.lastTime=i.currentTime;i.currentPos=h.currentPos;i.currentTime=h.currentTime;h=i}else{h.captured=!0;h.insideElementPressed=!0;h.insideElement=!0;ea(m,h)}m.contacts++;(b.dragHandler||b.dragEndHandler||b.pinchHandler)&&a.MouseTracker.gesturePointVelocityTracker.addPoint(b,h);if(1===m.contacts){if(b.pressHandler){f=b.pressHandler({eventSource:b,pointerType:h.type,position:k(h.contactPos,b.element),buttons:m.buttons,isTouchEvent:"touch"===h.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}}else if(2===m.contacts&&b.pinchHandler&&"touch"===h.type){j.pinchGPoints=m.asArray();j.lastPinchDist=j.currentPinchDist=j.pinchGPoints[0].currentPos.distanceTo(j.pinchGPoints[1].currentPos);j.lastPinchCenter=j.currentPinchCenter=l(j.pinchGPoints[0].currentPos,j.pinchGPoints[1].currentPos)}}return!0}function ja(b,c,d,e){var f,g,h,i,j,m,n,o=pa[b.hash],p=b.getActivePointersListByType(d[0].type),q=d.length,r=!1,s=!1;"undefined"!=typeof c.buttons?p.buttons=c.buttons:a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9?0===e?p.buttons-=1:1===e?p.buttons-=4:2===e?p.buttons-=2:3===e?p.buttons-=8:4===e?p.buttons-=16:5===e&&(p.buttons-=32):0===e?p.buttons^=-2:1===e?p.buttons^=-5:2===e?p.buttons^=-3:3===e?p.buttons^=-9:4===e?p.buttons^=-17:5===e&&(p.buttons^=-33);if(0!==e){if(b.nonPrimaryReleaseHandler){f=b.nonPrimaryReleaseHandler({eventSource:b,pointerType:d[0].type,position:k(d[0].currentPos,b.element),button:e,buttons:p.buttons,isTouchEvent:"touch"===d[0].type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}return!1}for(i=0;q>i;i++){j=d[i];m=p.getById(j.id);if(m){if(m.captured){m.captured=!1;r=!0;s=!0}m.lastPos=m.currentPos;m.lastTime=m.currentTime;m.currentPos=j.currentPos;m.currentTime=j.currentTime;m.insideElement||fa(p,m);g=m.currentPos;h=m.currentTime;if(s){p.contacts--;(b.dragHandler||b.dragEndHandler||b.pinchHandler)&&a.MouseTracker.gesturePointVelocityTracker.removePoint(b,m);if(0===p.contacts){if(b.releaseHandler){f=b.releaseHandler({eventSource:b,pointerType:m.type,position:k(g,b.element),buttons:p.buttons,insideElementPressed:m.insideElementPressed,insideElementReleased:m.insideElement,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}if(b.dragEndHandler&&!m.currentPos.equals(m.contactPos)){f=b.dragEndHandler({eventSource:b,pointerType:m.type,position:k(m.currentPos,b.element),speed:m.speed,direction:m.direction,shift:c.shiftKey,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}if((b.clickHandler||b.dblClickHandler)&&m.insideElement){n=h-m.contactTime<=b.clickTimeThreshold&&m.contactPos.distanceTo(g)<=b.clickDistThreshold;if(b.clickHandler){f=b.clickHandler({eventSource:b,pointerType:m.type,position:k(m.currentPos,b.element),quick:n,shift:c.shiftKey,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}if(b.dblClickHandler&&n){p.clicks++;if(1===p.clicks){o.lastClickPos=g;o.dblClickTimeOut=setTimeout(function(){p.clicks=0},b.dblClickTimeThreshold)}else if(2===p.clicks){clearTimeout(o.dblClickTimeOut);p.clicks=0;if(o.lastClickPos.distanceTo(g)<=b.dblClickDistThreshold){f=b.dblClickHandler({eventSource:b,pointerType:m.type,position:k(m.currentPos,b.element),shift:c.shiftKey,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}o.lastClickPos=null}}}}else if(2===p.contacts&&b.pinchHandler&&"touch"===m.type){o.pinchGPoints=p.asArray();o.lastPinchDist=o.currentPinchDist=o.pinchGPoints[0].currentPos.distanceTo(o.pinchGPoints[1].currentPos);o.lastPinchCenter=o.currentPinchCenter=l(o.pinchGPoints[0].currentPos,o.pinchGPoints[1].currentPos)}}else if(b.releaseHandler){f=b.releaseHandler({eventSource:b,pointerType:m.type,position:k(g,b.element),buttons:p.buttons,insideElementPressed:m.insideElementPressed,insideElementReleased:m.insideElement,isTouchEvent:"touch"===m.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});f===!1&&a.cancelEvent(c)}}}return r}function ka(b,c,d){var e,f,g,h,i,j,m=pa[b.hash],n=b.getActivePointersListByType(d[0].type),o=d.length;"undefined"!=typeof c.buttons&&(n.buttons=c.buttons);for(e=0;o>e;e++){f=d[e];g=n.getById(f.id);if(g){f.hasOwnProperty("isPrimary")&&(g.isPrimary=f.isPrimary);g.lastPos=g.currentPos;g.lastTime=g.currentTime;g.currentPos=f.currentPos;g.currentTime=f.currentTime}else{f.captured=!1;f.insideElementPressed=!1;f.insideElement=!0;ea(n,f)}}if(b.stopHandler&&"mouse"===d[0].type){clearTimeout(b.stopTimeOut);b.stopTimeOut=setTimeout(function(){ma(b,c,d[0].type)},b.stopDelay)}if(0===n.contacts){if(b.moveHandler){j=b.moveHandler({eventSource:b,pointerType:d[0].type,position:k(d[0].currentPos,b.element),buttons:n.buttons,isTouchEvent:"touch"===d[0].type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}}else if(1===n.contacts){if(b.moveHandler){g=n.asArray()[0];j=b.moveHandler({eventSource:b,pointerType:g.type,position:k(g.currentPos,b.element),buttons:n.buttons,isTouchEvent:"touch"===g.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}if(b.dragHandler){g=n.asArray()[0];i=g.currentPos.minus(g.lastPos);j=b.dragHandler({eventSource:b,pointerType:g.type,position:k(g.currentPos,b.element),buttons:n.buttons,delta:i,speed:g.speed,direction:g.direction,shift:c.shiftKey,isTouchEvent:"touch"===g.type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}}else if(2===n.contacts){if(b.moveHandler){h=n.asArray();j=b.moveHandler({eventSource:b,pointerType:h[0].type,position:k(l(h[0].currentPos,h[1].currentPos),b.element),buttons:n.buttons,isTouchEvent:"touch"===h[0].type,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}if(b.pinchHandler&&"touch"===d[0].type){i=m.pinchGPoints[0].currentPos.distanceTo(m.pinchGPoints[1].currentPos);if(i!=m.currentPinchDist){m.lastPinchDist=m.currentPinchDist;m.currentPinchDist=i;m.lastPinchCenter=m.currentPinchCenter;m.currentPinchCenter=l(m.pinchGPoints[0].currentPos,m.pinchGPoints[1].currentPos);j=b.pinchHandler({eventSource:b,pointerType:"touch",gesturePoints:m.pinchGPoints,lastCenter:k(m.lastPinchCenter,b.element),center:k(m.currentPinchCenter,b.element),lastDistance:m.lastPinchDist,distance:m.currentPinchDist,shift:c.shiftKey,originalEvent:c,preventDefaultAction:!1,userData:b.userData});j===!1&&a.cancelEvent(c)}}}}function la(a,b,c){ja(a,b,c,0);ha(a,b,c)}function ma(a,b,c){a.stopHandler&&a.stopHandler({eventSource:a,pointerType:c,position:j(b,a.element),buttons:a.getActivePointersListByType(c).buttons,isTouchEvent:"touch"===c,originalEvent:b,preventDefaultAction:!1,userData:a.userData})}function na(a){try{return a.addEventListener&&a.removeEventListener}catch(b){return!1}}var oa=[];var pa={};a.MouseTracker=function(b){oa.push(this);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||a.DEFAULT_SETTINGS.clickTimeThreshold;this.clickDistThreshold=b.clickDistThreshold||a.DEFAULT_SETTINGS.clickDistThreshold;this.dblClickTimeThreshold=b.dblClickTimeThreshold||a.DEFAULT_SETTINGS.dblClickTimeThreshold;this.dblClickDistThreshold=b.dblClickDistThreshold||a.DEFAULT_SETTINGS.dblClickDistThreshold;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.nonPrimaryPressHandler=b.nonPrimaryPressHandler||null;this.releaseHandler=b.releaseHandler||null;this.nonPrimaryReleaseHandler=b.nonPrimaryReleaseHandler||null;this.moveHandler=b.moveHandler||null;this.scrollHandler=b.scrollHandler||null;this.clickHandler=b.clickHandler||null;this.dblClickHandler=b.dblClickHandler||null;this.dragHandler=b.dragHandler||null;this.dragEndHandler=b.dragEndHandler||null;this.pinchHandler=b.pinchHandler||null;this.stopHandler=b.stopHandler||null;this.keyDownHandler=b.keyDownHandler||null;this.keyUpHandler=b.keyUpHandler||null;this.keyHandler=b.keyHandler||null;this.focusHandler=b.focusHandler||null;this.blurHandler=b.blurHandler||null;var d=this;pa[this.hash]={click:function(a){m(d,a)},dblclick:function(a){n(d,a)},keydown:function(a){o(d,a)},keyup:function(a){p(d,a)},keypress:function(a){q(d,a)},focus:function(a){r(d,a)},blur:function(a){s(d,a)},wheel:function(a){t(d,a)},mousewheel:function(a){u(d,a)},DOMMouseScroll:function(a){u(d,a)},MozMousePixelScroll:function(a){u(d,a)},mouseenter:function(a){x(d,a)},mouseleave:function(a){A(d,a)},mouseover:function(a){y(d,a)},mouseout:function(a){B(d,a)},mousedown:function(a){E(d,a)},mouseup:function(a){F(d,a)},mouseupcaptured:function(a){G(d,a)},mousemove:function(a){I(d,a)},mousemovecaptured:function(a){J(d,a)},touchstart:function(a){M(d,a)},touchend:function(a){N(d,a)},touchendcaptured:function(a){O(d,a)},touchmove:function(a){Q(d,a)},touchmovecaptured:function(a){R(d,a)},touchcancel:function(a){T(d,a)},gesturestart:function(a){U(d,a)},gesturechange:function(a){V(d,a)},pointerover:function(a){W(d,a)},MSPointerOver:function(a){W(d,a)},pointerout:function(a){X(d,a)},MSPointerOut:function(a){X(d,a)},pointerdown:function(a){Y(d,a)},MSPointerDown:function(a){Y(d,a)},pointerup:function(a){Z(d,a)},MSPointerUp:function(a){Z(d,a)},pointermove:function(a){aa(d,a)},MSPointerMove:function(a){aa(d,a)},pointercancel:function(a){da(d,a)},MSPointerCancel:function(a){da(d,a)},pointerupcaptured:function(a){$(d,a)},pointermovecaptured:function(a){ba(d,a)},tracking:!1,activePointersLists:[],lastClickPos:null,dblClickTimeOut:null,pinchGPoints:[],lastPinchDist:0,currentPinchDist:0,lastPinchCenter:null,currentPinchCenter:null};b.startDisabled||this.setTracking(!0)};a.MouseTracker.prototype={destroy:function(){var a;d(this);this.element=null;for(a=0;a<oa.length;a++)if(oa[a]===this){oa.splice(a,1);break}pa[this.hash]=null;delete pa[this.hash]},isTracking:function(){return pa[this.hash].tracking},setTracking:function(a){a?c(this):d(this);return this},getActivePointersListByType:function(b){var c,d,e=pa[this.hash],f=e.activePointersLists.length;for(c=0;f>c;c++)if(e.activePointersLists[c].type===b)return e.activePointersLists[c];d=new a.MouseTracker.GesturePointList(b);e.activePointersLists.push(d);return d},getActivePointerCount:function(){var a,b=pa[this.hash],c=b.activePointersLists.length,d=0;for(a=0;c>a;a++)d+=b.activePointersLists[a].getLength();return d},enterHandler:function(){},exitHandler:function(){},pressHandler:function(){},nonPrimaryPressHandler:function(){},releaseHandler:function(){},nonPrimaryReleaseHandler:function(){},moveHandler:function(){},scrollHandler:function(){},clickHandler:function(){},dblClickHandler:function(){},dragHandler:function(){},dragEndHandler:function(){},pinchHandler:function(){},stopHandler:function(){},keyDownHandler:function(){},keyUpHandler:function(){},keyHandler:function(){},focusHandler:function(){},blurHandler:function(){}};a.MouseTracker.gesturePointVelocityTracker=function(){var b=[],c=0,d=0;var e=function(a,b){return a.hash.toString()+b.type+b.id.toString()};var f=function(){var c,e,f,g,h,i,j=b.length,k=a.now();g=k-d;d=k;for(c=0;j>c;c++){e=b[c];f=e.gPoint;f.direction=Math.atan2(f.currentPos.y-e.lastPos.y,f.currentPos.x-e.lastPos.x);h=e.lastPos.distanceTo(f.currentPos);e.lastPos=f.currentPos;i=1e3*h/(g+1);f.speed=.75*i+.25*f.speed}};var g=function(g,h){var i=e(g,h);b.push({guid:i,gPoint:h,lastPos:h.currentPos});if(1===b.length){d=a.now();c=window.setInterval(f,50)}};var h=function(a,d){var f,g=e(a,d),h=b.length;for(f=0;h>f;f++)if(b[f].guid===g){b.splice(f,1);h--;0===h&&window.clearInterval(c);break}};return{addPoint:g,removePoint:h}}();a.MouseTracker.captureElement=document;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";a.MouseTracker.supportsMouseCapture=function(){var b=document.createElement("div");return a.isFunction(b.setCapture)&&a.isFunction(b.releaseCapture)}();a.MouseTracker.subscribeEvents=["click","dblclick","keydown","keyup","keypress","focus","blur",a.MouseTracker.wheelEventName];"DOMMouseScroll"==a.MouseTracker.wheelEventName&&a.MouseTracker.subscribeEvents.push("MozMousePixelScroll");if(window.PointerEvent&&(window.navigator.pointerEnabled||a.Browser.vendor!==a.BROWSERS.IE)){a.MouseTracker.havePointerEvents=!0;a.MouseTracker.subscribeEvents.push("pointerover","pointerout","pointerdown","pointerup","pointermove","pointercancel");a.MouseTracker.unprefixedPointerEvents=!0;navigator.maxTouchPoints?a.MouseTracker.maxTouchPoints=navigator.maxTouchPoints:a.MouseTracker.maxTouchPoints=0;a.MouseTracker.haveMouseEnter=!1}else if(window.MSPointerEvent&&window.navigator.msPointerEnabled){a.MouseTracker.havePointerEvents=!0;a.MouseTracker.subscribeEvents.push("MSPointerOver","MSPointerOut","MSPointerDown","MSPointerUp","MSPointerMove","MSPointerCancel");a.MouseTracker.unprefixedPointerEvents=!1;navigator.msMaxTouchPoints?a.MouseTracker.maxTouchPoints=navigator.msMaxTouchPoints:a.MouseTracker.maxTouchPoints=0;a.MouseTracker.haveMouseEnter=!1}else{a.MouseTracker.havePointerEvents=!1;if(a.Browser.vendor===a.BROWSERS.IE&&a.Browser.version<9){a.MouseTracker.subscribeEvents.push("mouseenter","mouseleave");a.MouseTracker.haveMouseEnter=!0}else{a.MouseTracker.subscribeEvents.push("mouseover","mouseout");a.MouseTracker.haveMouseEnter=!1}a.MouseTracker.subscribeEvents.push("mousedown","mouseup","mousemove");"ontouchstart"in window&&a.MouseTracker.subscribeEvents.push("touchstart","touchend","touchmove","touchcancel");"ongesturestart"in window&&a.MouseTracker.subscribeEvents.push("gesturestart","gesturechange");a.MouseTracker.mousePointerId="legacy-mouse";a.MouseTracker.maxTouchPoints=10}a.MouseTracker.GesturePointList=function(a){this._gPoints=[];this.type=a;this.buttons=0;this.contacts=0;this.clicks=0;this.captureCount=0};a.MouseTracker.GesturePointList.prototype={getLength:function(){return this._gPoints.length},asArray:function(){return this._gPoints},add:function(a){return this._gPoints.push(a)},removeById:function(a){var b,c=this._gPoints.length;for(b=0;c>b;b++)if(this._gPoints[b].id===a){this._gPoints.splice(b,1);break}return this._gPoints.length},getByIndex:function(a){return a<this._gPoints.length?this._gPoints[a]:null},getById:function(a){var b,c=this._gPoints.length;for(b=0;c>b;b++)if(this._gPoints[b].id===a)return this._gPoints[b];return null},getPrimary:function(a){var b,c=this._gPoints.length;for(b=0;c>b;b++)if(this._gPoints[b].isPrimary)return this._gPoints[b];return null}};var qa=function(){try{return window.self!==window.top}catch(a){return!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;if("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;if(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%"}else{this.wrapper=a.makeNeutralElement("div");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"];a.extend(!0,this,{id:"controldock-"+a.now()+"-"+Math.floor(1e6*Math.random()),container:a.makeNeutralElement("div"),controls:[]},b);this.container.onsubmit=function(){return!1};if(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%"}for(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);if(d>=0){this.controls[d].destroy();this.controls.splice(d,1)}return 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(a){a.Placement=a.freezeObject({CENTER:0,TOP_LEFT:1,TOP:2,TOP_RIGHT:3,RIGHT:4,BOTTOM_RIGHT:5,BOTTOM:6,BOTTOM_LEFT:7,LEFT:8,properties:{0:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!1,isVerticallyCentered:!0,isBottom:!1},1:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!0,isVerticallyCentered:!1,isBottom:!1},2:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!0,isVerticallyCentered:!1,isBottom:!1},3:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!0,isVerticallyCentered:!1,isBottom:!1},4:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!1,isVerticallyCentered:!0,isBottom:!1},5:{isLeft:!1,isHorizontallyCentered:!1,isRight:!0,isTop:!1,isVerticallyCentered:!1,isBottom:!0},6:{isLeft:!1,isHorizontallyCentered:!0,isRight:!1,isTop:!1,isVerticallyCentered:!1,isBottom:!0},7:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!1,isVerticallyCentered:!1,isBottom:!0},8:{isLeft:!0,isHorizontallyCentered:!1,isRight:!1,isTop:!1,isVerticallyCentered:!0,isBottom:!1}}})}(OpenSeadragon);!function(a){function b(b){b=a.getElement(b);return new a.Point(0===b.clientWidth?1:b.clientWidth,0===b.clientHeight?1:b.clientHeight)}function c(b,c,d,e){function f(a,b){if(a.ready)d(a);else{a.addHandler("ready",function(){d(a)});a.addHandler("open-failed",function(a){e({message:a.message,source:b})})}}var g=b;"string"==a.type(c)&&(c.match(/\s*<.*/)?c=a.parseXml(c):c.match(/\s*[\{\[].*/)&&(c=a.parseJSON(c)));setTimeout(function(){if("string"==a.type(c)){c=new a.TileSource({url:c,crossOriginPolicy:b.crossOriginPolicy,ajaxWithCredentials:b.ajaxWithCredentials,useCanvas:b.useCanvas,success:function(a){d(a.tileSource)}});c.addHandler("open-failed",function(a){e(a)})}else if(a.isPlainObject(c)||c.nodeType){!c.crossOriginPolicy&&b.crossOriginPolicy&&(c.crossOriginPolicy=b.crossOriginPolicy);void 0===c.ajaxWithCredentials&&(c.ajaxWithCredentials=b.ajaxWithCredentials);void 0===c.useCanvas&&(c.useCanvas=b.useCanvas);if(a.isFunction(c.getTileUrl)){var h=new a.TileSource(c);h.getTileUrl=c.getTileUrl;d(h)}else{var i=a.TileSource.determineType(g,c);if(!i){e({message:"Unable to load TileSource",source:c});return}var j=i.prototype.configure.apply(g,[c]);f(new i(j),c)}}else f(c,c)})}function d(b,c){if(c instanceof a.Overlay)return c;var d=null;if(c.element)d=a.getElement(c.element);else{var e=c.id?c.id:"openseadragon-overlay-"+Math.floor(1e7*Math.random());d=a.getElement(c.id);if(!d){d=document.createElement("a");d.href="#/overlay/"+e}d.id=e;a.addClass(d,c.className?c.className:"openseadragon-overlay")}var f=c.location;var g=c.width;var h=c.height;if(!f){var i=c.x;var j=c.y;if(void 0!==c.px){var k=b.viewport.imageToViewportRectangle(new a.Rect(c.px,c.py,g||0,h||0));i=k.x;j=k.y;g=void 0!==g?k.width:void 0;h=void 0!==h?k.height:void 0}f=new a.Point(i,j)}var l=c.placement;l&&"string"===a.type(l)&&(l=a.Placement[c.placement.toUpperCase()]);return new a.Overlay({element:d,location:f,placement:l,onDraw:c.onDraw,checkResize:c.checkResize,width:g,height:h,rotationMode:c.rotationMode})}function e(a,b){var c;for(c=a.length-1;c>=0;c--)if(a[c].element===b)return c;return-1}function f(b,c){return a.requestAnimationFrame(function(){c(b)})}function g(b){a.requestAnimationFrame(function(){i(b)})}function h(b){if(b.autoHideControls){b.controlsShouldFade=!0;b.controlsFadeBeginTime=a.now()+b.controlsFadeDelay;window.setTimeout(function(){g(b)},b.controlsFadeDelay)}}function i(b){var c,d,e,f;if(b.controlsShouldFade){c=a.now();d=c-b.controlsFadeBeginTime;e=1-d/b.controlsFadeLength;e=Math.min(1,e);e=Math.max(0,e);for(f=b.controls.length-1;f>=0;f--)b.controls[f].autoFade&&b.controls[f].setOpacity(e);e>0&&g(b)}}function j(a){var b;a.controlsShouldFade=!1;for(b=a.controls.length-1;b>=0;b--)a.controls[b].setOpacity(1)}function k(){j(this)}function l(){h(this)}function m(b){if(b.preventDefaultAction||b.ctrl||b.alt||b.meta)return!0;switch(b.keyCode){case 38:b.shift?this.viewport.zoomBy(1.1):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(0,-40)));this.viewport.applyConstraints();return!1;case 40:b.shift?this.viewport.zoomBy(.9):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(0,40)));this.viewport.applyConstraints();return!1;case 37:this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(-40,0)));this.viewport.applyConstraints();return!1;case 39:this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(40,0)));this.viewport.applyConstraints();return!1;default:return!0}}function n(b){if(b.preventDefaultAction||b.ctrl||b.alt||b.meta)return!0;switch(b.keyCode){case 43:case 61:this.viewport.zoomBy(1.1);this.viewport.applyConstraints();return!1;case 45:this.viewport.zoomBy(.9);this.viewport.applyConstraints();return!1;case 48:this.viewport.goHome();this.viewport.applyConstraints();return!1;case 119:case 87:b.shift?this.viewport.zoomBy(1.1):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(0,-40)));this.viewport.applyConstraints();return!1;case 115:case 83:b.shift?this.viewport.zoomBy(.9):this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(0,40)));this.viewport.applyConstraints();return!1;case 97:this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(-40,0)));this.viewport.applyConstraints();return!1;case 100:this.viewport.panBy(this.viewport.deltaPointsFromPixels(new a.Point(40,0)));this.viewport.applyConstraints();return!1;default:return!0}}function o(a){var b;var c=document.activeElement==this.canvas;c||this.canvas.focus();if(!a.preventDefaultAction&&this.viewport&&a.quick){b=this.gestureSettingsByDeviceType(a.pointerType);if(b.clickToZoom){this.viewport.zoomBy(a.shift?1/this.zoomPerClick:this.zoomPerClick,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 p(a){var b;if(!a.preventDefaultAction&&this.viewport){b=this.gestureSettingsByDeviceType(a.pointerType);if(b.dblClickToZoom){this.viewport.zoomBy(a.shift?1/this.zoomPerClick:this.zoomPerClick,this.viewport.pointFromPixel(a.position,!0));this.viewport.applyConstraints()}}this.raiseEvent("canvas-double-click",{tracker:a.eventSource,position:a.position,shift:a.shift,originalEvent:a.originalEvent})}function q(a){var b;if(!a.preventDefaultAction&&this.viewport){b=this.gestureSettingsByDeviceType(a.pointerType);this.panHorizontal||(a.delta.x=0);this.panVertical||(a.delta.y=0);this.viewport.panBy(this.viewport.deltaPointsFromPixels(a.delta.negate()),b.flickEnabled);this.constrainDuringPan&&this.viewport.applyConstraints()}this.raiseEvent("canvas-drag",{tracker:a.eventSource,position:a.position,delta:a.delta,speed:a.speed,direction:a.direction,shift:a.shift,originalEvent:a.originalEvent})}function r(b){if(!b.preventDefaultAction&&this.viewport){var c=this.gestureSettingsByDeviceType(b.pointerType);if(c.flickEnabled&&b.speed>=c.flickMinSpeed){var d=0;this.panHorizontal&&(d=c.flickMomentum*b.speed*Math.cos(b.direction));var e=0;this.panVertical&&(e=c.flickMomentum*b.speed*Math.sin(b.direction));var f=this.viewport.pixelFromPoint(this.viewport.getCenter(!0));var g=this.viewport.pointFromPixel(new a.Point(f.x-d,f.y-e));this.viewport.panTo(g,!1)}this.viewport.applyConstraints()}this.raiseEvent("canvas-drag-end",{tracker:b.eventSource,position:b.position,speed:b.speed,direction:b.direction,shift:b.shift,originalEvent:b.originalEvent})}function s(a){this.raiseEvent("canvas-enter",{tracker:a.eventSource,pointerType:a.pointerType,position:a.position,buttons:a.buttons,pointers:a.pointers,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function t(a){this.raiseEvent("canvas-exit",{tracker:a.eventSource,pointerType:a.pointerType,position:a.position,buttons:a.buttons,pointers:a.pointers,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function u(a){this.raiseEvent("canvas-press",{tracker:a.eventSource,pointerType:a.pointerType,position:a.position,insideElementPressed:a.insideElementPressed,insideElementReleased:a.insideElementReleased,originalEvent:a.originalEvent})}function v(a){this.raiseEvent("canvas-release",{tracker:a.eventSource,pointerType:a.pointerType,position:a.position,insideElementPressed:a.insideElementPressed,insideElementReleased:a.insideElementReleased,originalEvent:a.originalEvent})}function w(a){this.raiseEvent("canvas-nonprimary-press",{tracker:a.eventSource,position:a.position,pointerType:a.pointerType,button:a.button,buttons:a.buttons,originalEvent:a.originalEvent})}function x(a){this.raiseEvent("canvas-nonprimary-release",{tracker:a.eventSource,position:a.position,pointerType:a.pointerType,button:a.button,buttons:a.buttons,originalEvent:a.originalEvent})}function y(a){var b,c,d,e;if(!a.preventDefaultAction&&this.viewport){b=this.gestureSettingsByDeviceType(a.pointerType);
-if(b.pinchToZoom){c=this.viewport.pointFromPixel(a.center,!0);d=this.viewport.pointFromPixel(a.lastCenter,!0);e=d.minus(c);this.panHorizontal||(e.x=0);this.panVertical||(e.y=0);this.viewport.zoomBy(a.distance/a.lastDistance,c,!0);this.viewport.panBy(e,!0);this.viewport.applyConstraints()}if(b.pinchRotate){var f=Math.atan2(a.gesturePoints[0].currentPos.y-a.gesturePoints[1].currentPos.y,a.gesturePoints[0].currentPos.x-a.gesturePoints[1].currentPos.x);var g=Math.atan2(a.gesturePoints[0].lastPos.y-a.gesturePoints[1].lastPos.y,a.gesturePoints[0].lastPos.x-a.gesturePoints[1].lastPos.x);this.viewport.setRotation(this.viewport.getRotation()+(f-g)*(180/Math.PI))}}this.raiseEvent("canvas-pinch",{tracker:a.eventSource,gesturePoints:a.gesturePoints,lastCenter:a.lastCenter,center:a.center,lastDistance:a.lastDistance,distance:a.distance,shift:a.shift,originalEvent:a.originalEvent});return!1}function z(b){var c,d,e,f;e=a.now();f=e-this._lastScrollTime;if(f>this.minScrollDeltaTime){this._lastScrollTime=e;if(!b.preventDefaultAction&&this.viewport){c=this.gestureSettingsByDeviceType(b.pointerType);if(c.scrollToZoom){d=Math.pow(this.zoomPerScroll,b.scroll);this.viewport.zoomBy(d,this.viewport.pointFromPixel(b.position,!0));this.viewport.applyConstraints()}}this.raiseEvent("canvas-scroll",{tracker:b.eventSource,position:b.position,scroll:b.scroll,shift:b.shift,originalEvent:b.originalEvent});if(c&&c.scrollToZoom)return!1}else{c=this.gestureSettingsByDeviceType(b.pointerType);if(c&&c.scrollToZoom)return!1}}function A(a){U[this.hash].mouseInside=!0;j(this);this.raiseEvent("container-enter",{tracker:a.eventSource,position:a.position,buttons:a.buttons,pointers:a.pointers,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function B(a){if(a.pointers<1){U[this.hash].mouseInside=!1;U[this.hash].animating||h(this)}this.raiseEvent("container-exit",{tracker:a.eventSource,position:a.position,buttons:a.buttons,pointers:a.pointers,insideElementPressed:a.insideElementPressed,buttonDownAny:a.buttonDownAny,originalEvent:a.originalEvent})}function C(a){D(a);a.isOpen()?a._updateRequestId=f(a,C):a._updateRequestId=!1}function D(a){if(!a._opening){if(a.autoResize){var c=b(a.container);var d=U[a.hash].prevContainerSize;if(!c.equals(d)){var e=a.viewport;if(a.preserveImageSizeOnResize){var f=d.x/c.x;var g=e.getZoom()*f;var i=e.getCenter();e.resize(c,!1);e.zoomTo(g,null,!0);e.panTo(i,!0)}else{var k=e.getBounds();e.resize(c,!0);e.fitBoundsWithConstraints(k,!0)}U[a.hash].prevContainerSize=c;U[a.hash].forceRedraw=!0}}var l=a.viewport.update();var m=a.world.update()||l;l&&a.raiseEvent("viewport-change");a.referenceStrip&&(m=a.referenceStrip.update(a.viewport)||m);if(!U[a.hash].animating&&m){a.raiseEvent("animation-start");j(a)}if(m||U[a.hash].forceRedraw||a.world.needsDraw()){E(a);a._drawOverlays();a.navigator&&a.navigator.update(a.viewport);U[a.hash].forceRedraw=!1;m&&a.raiseEvent("animation")}if(U[a.hash].animating&&!m){a.raiseEvent("animation-finish");U[a.hash].mouseInside||h(a)}U[a.hash].animating=m}}function E(a){a.imageLoader.clear();a.drawer.clear();a.world.draw();a.raiseEvent("update-viewport",{})}function F(a,b){return a?a+b:b}function G(){U[this.hash].lastZoomTime=a.now();U[this.hash].zoomFactor=this.zoomPerSecond;U[this.hash].zooming=!0;J(this)}function H(){U[this.hash].lastZoomTime=a.now();U[this.hash].zoomFactor=1/this.zoomPerSecond;U[this.hash].zooming=!0;J(this)}function I(){U[this.hash].zooming=!1}function J(b){a.requestAnimationFrame(a.delegate(b,K))}function K(){var b,c,d;if(U[this.hash].zooming&&this.viewport){b=a.now();c=b-U[this.hash].lastZoomTime;d=Math.pow(U[this.hash].zoomFactor,c/1e3);this.viewport.zoomBy(d);this.viewport.applyConstraints();U[this.hash].lastZoomTime=b;J(this)}}function L(){if(this.viewport){U[this.hash].zooming=!1;this.viewport.zoomBy(this.zoomPerClick/1);this.viewport.applyConstraints()}}function M(){if(this.viewport){U[this.hash].zooming=!1;this.viewport.zoomBy(1/this.zoomPerClick);this.viewport.applyConstraints()}}function N(){this.buttons.emulateEnter();this.buttons.emulateExit()}function O(){this.viewport&&this.viewport.goHome()}function P(){this.isFullPage()&&!a.isFullScreen()?this.setFullPage(!1):this.setFullScreen(!this.isFullPage());this.buttons&&this.buttons.emulateExit();this.fullPageButton.element.focus();this.viewport&&this.viewport.applyConstraints()}function Q(){if(this.viewport){var a=this.viewport.getRotation();0===a?a=270:a-=90;this.viewport.setRotation(a)}}function R(){if(this.viewport){var a=this.viewport.getRotation();270===a?a=0:a+=90;this.viewport.setRotation(a)}}function S(){var a=this._sequenceIndex-1;this.navPrevNextWrap&&0>a&&(a+=this.tileSources.length);this.goToPage(a)}function T(){var a=this._sequenceIndex+1;this.navPrevNextWrap&&a>=this.tileSources.length&&(a=0);this.goToPage(a)}var U={};var V=1;a.Viewer=function(c){var d,e=arguments,g=this;a.isPlainObject(c)||(c={id:e[0],xmlPath:e.length>1?e[1]:void 0,prefixUrl:e.length>2?e[2]:void 0,controls:e.length>3?e[3]:void 0,overlays:e.length>4?e[4]:void 0});if(c.config){a.extend(!0,c,c.config);delete c.config}a.extend(!0,this,{id:c.id,hash:c.hash||V++,element:null,container:null,canvas:null,overlays:[],overlaysContainer:null,previousBody:[],customControls:[],source:null,drawer:null,world:null,viewport:null,navigator:null,collectionViewport:null,collectionDrawer:null,navImages:null,buttons:null,profiler:null},a.DEFAULT_SETTINGS,c);if("undefined"==typeof this.hash)throw new Error("A hash must be defined, either by specifying options.id or options.hash.");"undefined"!=typeof U[this.hash]&&a.console.warn("Hash "+this.hash+" has already been used.");U[this.hash]={fsBoundsDelta:new a.Point(1,1),prevContainerSize:null,animating:!1,forceRedraw:!1,mouseInside:!1,group:null,zooming:!1,zoomFactor:null,lastZoomTime:null,fullPage:!1,onfullscreenchange:null};this._sequenceIndex=0;this._firstOpen=!0;this._updateRequestId=null;this._loadQueue=[];this.currentOverlays=[];this._lastScrollTime=a.now();a.EventSource.call(this);this.addHandler("open-failed",function(b){var c=a.getString("Errors.OpenFailed",b.eventSource,b.message);g._showMessage(c)});a.ControlDock.call(this,c);this.xmlPath&&(this.tileSources=[this.xmlPath]);this.element=this.element||document.getElementById(this.id);this.canvas=a.makeNeutralElement("div");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);a.setElementTouchActionNone(this.canvas);""!==c.tabIndex&&(this.canvas.tabIndex=void 0===c.tabIndex?0:c.tabIndex);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.container.insertBefore(this.canvas,this.container.firstChild);this.element.appendChild(this.container);this.bodyWidth=document.body.style.width;this.bodyHeight=document.body.style.height;this.bodyOverflow=document.body.style.overflow;this.docOverflow=document.documentElement.style.overflow;this.innerTracker=new a.MouseTracker({element:this.canvas,startDisabled:this.mouseNavEnabled?!1:!0,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,dblClickTimeThreshold:this.dblClickTimeThreshold,dblClickDistThreshold:this.dblClickDistThreshold,keyDownHandler:a.delegate(this,m),keyHandler:a.delegate(this,n),clickHandler:a.delegate(this,o),dblClickHandler:a.delegate(this,p),dragHandler:a.delegate(this,q),dragEndHandler:a.delegate(this,r),enterHandler:a.delegate(this,s),exitHandler:a.delegate(this,t),pressHandler:a.delegate(this,u),releaseHandler:a.delegate(this,v),nonPrimaryPressHandler:a.delegate(this,w),nonPrimaryReleaseHandler:a.delegate(this,x),scrollHandler:a.delegate(this,z),pinchHandler:a.delegate(this,y)});this.outerTracker=new a.MouseTracker({element:this.container,startDisabled:this.mouseNavEnabled?!1:!0,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,dblClickTimeThreshold:this.dblClickTimeThreshold,dblClickDistThreshold:this.dblClickDistThreshold,enterHandler:a.delegate(this,A),exitHandler:a.delegate(this,B)});this.toolbar&&(this.toolbar=new a.ControlDock({element:this.toolbar}));this.bindStandardControls();U[this.hash].prevContainerSize=b(this.container);this.world=new a.World({viewer:this});this.world.addHandler("add-item",function(a){g.source=g.world.getItemAt(0).source;U[g.hash].forceRedraw=!0;g._updateRequestId||(g._updateRequestId=f(g,C))});this.world.addHandler("remove-item",function(a){g.world.getItemCount()?g.source=g.world.getItemAt(0).source:g.source=null;U[g.hash].forceRedraw=!0});this.world.addHandler("metrics-change",function(a){g.viewport&&g.viewport._setContentBounds(g.world.getHomeBounds(),g.world.getContentFactor())});this.world.addHandler("item-index-change",function(a){g.source=g.world.getItemAt(0).source});this.viewport=new a.Viewport({containerSize:U[this.hash].prevContainerSize,springStiffness:this.springStiffness,animationTime:this.animationTime,minZoomImageRatio:this.minZoomImageRatio,maxZoomPixelRatio:this.maxZoomPixelRatio,visibilityRatio:this.visibilityRatio,wrapHorizontal:this.wrapHorizontal,wrapVertical:this.wrapVertical,defaultZoomLevel:this.defaultZoomLevel,minZoomLevel:this.minZoomLevel,maxZoomLevel:this.maxZoomLevel,viewer:this,degrees:this.degrees,navigatorRotate:this.navigatorRotate,homeFillsViewer:this.homeFillsViewer,margins:this.viewportMargins});this.viewport._setContentBounds(this.world.getHomeBounds(),this.world.getContentFactor());this.imageLoader=new a.ImageLoader({jobLimit:this.imageLoaderLimit});this.tileCache=new a.TileCache({maxImageCacheCount:this.maxImageCacheCount});this.drawer=new a.Drawer({viewer:this,viewport:this.viewport,element:this.canvas,debugGridColor:this.debugGridColor});this.overlaysContainer=a.makeNeutralElement("div");this.canvas.appendChild(this.overlaysContainer);if(!this.drawer.canRotate()){if(this.rotateLeft){d=this.buttons.buttons.indexOf(this.rotateLeft);this.buttons.buttons.splice(d,1);this.buttons.element.removeChild(this.rotateLeft.element)}if(this.rotateRight){d=this.buttons.buttons.indexOf(this.rotateRight);this.buttons.buttons.splice(d,1);this.buttons.element.removeChild(this.rotateRight.element)}}this.showNavigator&&(this.navigator=new a.Navigator({id:this.navigatorId,position:this.navigatorPosition,sizeRatio:this.navigatorSizeRatio,maintainSizeRatio:this.navigatorMaintainSizeRatio,top:this.navigatorTop,left:this.navigatorLeft,width:this.navigatorWidth,height:this.navigatorHeight,autoResize:this.navigatorAutoResize,autoFade:this.navigatorAutoFade,prefixUrl:this.prefixUrl,viewer:this,navigatorRotate:this.navigatorRotate,crossOriginPolicy:this.crossOriginPolicy}));this.sequenceMode&&this.bindSequenceControls();this.tileSources&&this.open(this.tileSources);for(d=0;d<this.customControls.length;d++)this.addControl(this.customControls[d].id,{anchor:this.customControls[d].anchor});a.requestAnimationFrame(function(){h(g)})};a.extend(a.Viewer.prototype,a.EventSource.prototype,a.ControlDock.prototype,{isOpen:function(){return!!this.world.getItemCount()},openDzi:function(b){a.console.error("[Viewer.openDzi] this function is deprecated; use Viewer.open() instead.");return this.open(b)},openTileSource:function(b){a.console.error("[Viewer.openTileSource] this function is deprecated; use Viewer.open() instead.");return this.open(b)},open:function(b){var c=this;this.close();if(b)if(this.sequenceMode&&a.isArray(b)){if(this.referenceStrip){this.referenceStrip.destroy();this.referenceStrip=null}this.tileSources=b;this._sequenceIndex=Math.max(0,Math.min(this.tileSources.length-1,this.initialPage));if(this.tileSources.length){this.open(this.tileSources[this._sequenceIndex]);this.showReferenceStrip&&(this.referenceStrip=new a.ReferenceStrip({id:this.referenceStripElement,position:this.referenceStripPosition,sizeRatio:this.referenceStripSizeRatio,scroll:this.referenceStripScroll,height:this.referenceStripHeight,width:this.referenceStripWidth,tileSources:this.tileSources,prefixUrl:this.prefixUrl,viewer:this}))}this._updateSequenceButtons(this._sequenceIndex)}else{a.isArray(b)||(b=[b]);if(b.length){this._opening=!0;var e=b.length;var f=0;var g=0;var h;var i=function(){if(f+g===e)if(f){if(c._firstOpen||!c.preserveViewport){c.viewport.goHome(!0);c.viewport.update()}c._firstOpen=!1;var a=b[0];a.tileSource&&(a=a.tileSource);if(c.overlays&&!c.preserveOverlays)for(var i=0;i<c.overlays.length;i++)c.currentOverlays[i]=d(c,c.overlays[i]);c._drawOverlays();c._opening=!1;c.raiseEvent("open",{source:a})}else{c._opening=!1;c.raiseEvent("open-failed",h)}};var j=function(b){a.isPlainObject(b)&&b.tileSource||(b={tileSource:b});if(void 0!==b.index){a.console.error("[Viewer.open] setting indexes here is not supported; use addTiledImage instead");delete b.index}void 0===b.collectionImmediately&&(b.collectionImmediately=!0);var d=b.success;b.success=function(a){f++;if(b.tileSource.overlays)for(var e=0;e<b.tileSource.overlays.length;e++)c.addOverlay(b.tileSource.overlays[e]);d&&d(a);i()};var e=b.error;b.error=function(a){g++;h||(h=a);e&&e(a);i()};c.addTiledImage(b)};for(var k=0;k<b.length;k++)j(b[k]);return this}}},close:function(){if(!U[this.hash])return this;this._opening=!1;this.navigator&&this.navigator.close();if(!this.preserveOverlays){this.clearOverlays();this.overlaysContainer.innerHTML=""}U[this.hash].animating=!1;this.world.removeAll();this.imageLoader.clear();this.raiseEvent("close");return this},destroy:function(){if(U[this.hash]){this.close();this.clearOverlays();this.overlaysContainer.innerHTML="";if(this.referenceStrip){this.referenceStrip.destroy();this.referenceStrip=null}if(null!==this._updateRequestId){a.cancelAnimationFrame(this._updateRequestId);this._updateRequestId=null}this.drawer&&this.drawer.destroy();this.removeAllHandlers();if(this.element)for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);this.innerTracker&&this.innerTracker.destroy();this.outerTracker&&this.outerTracker.destroy();U[this.hash]=null;delete U[this.hash];this.canvas=null;this.container=null;this.element=null}},isMouseNavEnabled:function(){return this.innerTracker.isTracking()},setMouseNavEnabled:function(a){this.innerTracker.setTracking(a);this.outerTracker.setTracking(a);this.raiseEvent("mouse-enabled",{enabled:a});return 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){a?j(this):h(this);this.raiseEvent("controls-enabled",{enabled:a});return this},isFullPage:function(){return U[this.hash].fullPage},setFullPage:function(b){var c,d,e=document.body,f=e.style,g=document.documentElement.style,h=this;if(b==this.isFullPage())return this;var i={fullPage:b,preventDefaultAction:!1};this.raiseEvent("pre-full-page",i);if(i.preventDefaultAction)return this;if(b){this.elementSize=a.getElementSize(this.element);this.pageScroll=a.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=f.margin;this.docMargin=g.margin;f.margin="0";g.margin="0";this.bodyPadding=f.padding;this.docPadding=g.padding;f.padding="0";g.padding="0";this.bodyWidth=f.width;this.docWidth=g.width;f.width="100%";g.width="100%";this.bodyHeight=f.height;this.docHeight=g.height;f.height="100%";g.height="100%";this.previousBody=[];U[this.hash].prevElementParent=this.element.parentNode;U[this.hash].prevNextSibling=this.element.nextSibling;U[this.hash].prevElementWidth=this.element.style.width;U[this.hash].prevElementHeight=this.element.style.height;c=e.childNodes.length;for(d=0;c>d;d++){this.previousBody.push(e.childNodes[0]);e.removeChild(e.childNodes[0])}if(this.toolbar&&this.toolbar.element){this.toolbar.parentNode=this.toolbar.element.parentNode;this.toolbar.nextSibling=this.toolbar.element.nextSibling;e.appendChild(this.toolbar.element);a.addClass(this.toolbar.element,"fullpage")}a.addClass(this.element,"fullpage");e.appendChild(this.element);this.element.style.height=a.getWindowSize().y+"px";this.element.style.width=a.getWindowSize().x+"px";this.toolbar&&this.toolbar.element&&(this.element.style.height=a.getElementSize(this.element).y-a.getElementSize(this.toolbar.element).y+"px");U[this.hash].fullPage=!0;a.delegate(this,A)({})}else{this.element.style.margin=this.elementMargin;this.element.style.padding=this.elementPadding;f.margin=this.bodyMargin;g.margin=this.docMargin;f.padding=this.bodyPadding;g.padding=this.docPadding;f.width=this.bodyWidth;g.width=this.docWidth;f.height=this.bodyHeight;g.height=this.docHeight;e.removeChild(this.element);c=this.previousBody.length;for(d=0;c>d;d++)e.appendChild(this.previousBody.shift());a.removeClass(this.element,"fullpage");U[this.hash].prevElementParent.insertBefore(this.element,U[this.hash].prevNextSibling);if(this.toolbar&&this.toolbar.element){e.removeChild(this.toolbar.element);a.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=U[this.hash].prevElementWidth;this.element.style.height=U[this.hash].prevElementHeight;var j=0;var k=function(){a.setPageScroll(h.pageScroll);var b=a.getPageScroll();j++;(10>j&&b.x!==h.pageScroll.x||b.y!==h.pageScroll.y)&&a.requestAnimationFrame(k)};a.requestAnimationFrame(k);U[this.hash].fullPage=!1;a.delegate(this,B)({})}this.navigator&&this.viewport&&this.navigator.update(this.viewport);this.raiseEvent("full-page",{fullPage:b});return this},setFullScreen:function(b){var c=this;if(!a.supportsFullScreen)return this.setFullPage(b);if(a.isFullScreen()===b)return this;var d={fullScreen:b,preventDefaultAction:!1};this.raiseEvent("pre-full-screen",d);if(d.preventDefaultAction)return this;if(b){this.setFullPage(!0);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 e=function(){var b=a.isFullScreen();if(!b){a.removeEvent(document,a.fullScreenEventName,e);a.removeEvent(document,a.fullScreenErrorEventName,e);c.setFullPage(!1);if(c.isFullPage()){c.element.style.width=c.fullPageStyleWidth;c.element.style.height=c.fullPageStyleHeight}}c.navigator&&c.viewport&&c.navigator.update(c.viewport);c.raiseEvent("full-screen",{fullScreen:b})};a.addEvent(document,a.fullScreenEventName,e);a.addEvent(document,a.fullScreenErrorEventName,e);a.requestFullScreen(document.body)}else a.exitFullScreen();return this},isVisible:function(){return"hidden"!=this.container.style.visibility},setVisible:function(a){this.container.style.visibility=a?"":"hidden";this.raiseEvent("visible",{visible:a});return this},addTiledImage:function(b){function d(a){for(var c=0;c<f._loadQueue.length;c++)if(f._loadQueue[c]===g){f._loadQueue.splice(c,1);break}0===f._loadQueue.length&&e(g);f.raiseEvent("add-item-failed",a);b.error&&b.error(a)}function e(a){if(f.collectionMode){f.world.arrange({immediately:a.options.collectionImmediately,rows:f.collectionRows,columns:f.collectionColumns,layout:f.collectionLayout,tileSize:f.collectionTileSize,tileMargin:f.collectionTileMargin});f.world.setAutoRefigureSizes(!0)}}a.console.assert(b,"[Viewer.addTiledImage] options is required");a.console.assert(b.tileSource,"[Viewer.addTiledImage] options.tileSource is required");a.console.assert(!b.replace||b.index>-1&&b.index<this.world.getItemCount(),"[Viewer.addTiledImage] if options.replace is used, options.index must be a valid index in Viewer.world");var f=this;b.replace&&(b.replaceItem=f.world.getItemAt(b.index));this._hideMessage();void 0===b.placeholderFillStyle&&(b.placeholderFillStyle=this.placeholderFillStyle);void 0===b.opacity&&(b.opacity=this.opacity);void 0===b.compositeOperation&&(b.compositeOperation=this.compositeOperation);var g={options:b};if(a.isArray(b.tileSource))setTimeout(function(){d({message:"[Viewer.addTiledImage] Sequences can not be added; add them one at a time instead.",source:b.tileSource,options:b})});else{this._loadQueue.push(g);c(this,b.tileSource,function(b){g.tileSource=b;var c,d,h;for(;f._loadQueue.length;){c=f._loadQueue[0];if(!c.tileSource)break;f._loadQueue.splice(0,1);if(c.options.replace){var i=f.world.getIndexOfItem(c.options.replaceItem);-1!=i&&(c.options.index=i);f.world.removeItem(c.options.replaceItem)}d=new a.TiledImage({viewer:f,source:c.tileSource,viewport:f.viewport,drawer:f.drawer,tileCache:f.tileCache,imageLoader:f.imageLoader,x:c.options.x,y:c.options.y,width:c.options.width,height:c.options.height,fitBounds:c.options.fitBounds,fitBoundsPlacement:c.options.fitBoundsPlacement,clip:c.options.clip,placeholderFillStyle:c.options.placeholderFillStyle,opacity:c.options.opacity,compositeOperation:c.options.compositeOperation,springStiffness:f.springStiffness,animationTime:f.animationTime,minZoomImageRatio:f.minZoomImageRatio,wrapHorizontal:f.wrapHorizontal,wrapVertical:f.wrapVertical,immediateRender:f.immediateRender,blendTime:f.blendTime,alwaysBlend:f.alwaysBlend,minPixelRatio:f.minPixelRatio,smoothTileEdgesMinZoom:f.smoothTileEdgesMinZoom,iOSDevice:f.iOSDevice,crossOriginPolicy:f.crossOriginPolicy,debugMode:f.debugMode});f.collectionMode&&f.world.setAutoRefigureSizes(!1);f.world.addItem(d,{index:c.options.index});0===f._loadQueue.length&&e(c);1!==f.world.getItemCount()||f.preserveViewport||f.viewport.goHome(!0);if(f.navigator){h=a.extend({},c.options,{replace:!1,originalTiledImage:d,tileSource:c.tileSource});f.navigator.addTiledImage(h)}c.options.success&&c.options.success({item:d})}},function(a){a.options=b;d(a)})}},addSimpleImage:function(b){a.console.assert(b,"[Viewer.addSimpleImage] options is required");a.console.assert(b.url,"[Viewer.addSimpleImage] options.url is required");var c=a.extend({},b,{tileSource:{type:"image",url:b.url}});delete c.url;this.addTiledImage(c)},addLayer:function(b){var c=this;a.console.error("[Viewer.addLayer] this function is deprecated; use Viewer.addTiledImage() instead.");var d=a.extend({},b,{success:function(a){c.raiseEvent("add-layer",{options:b,drawer:a.item})},error:function(a){c.raiseEvent("add-layer-failed",a)}});this.addTiledImage(d);return this},getLayerAtLevel:function(b){a.console.error("[Viewer.getLayerAtLevel] this function is deprecated; use World.getItemAt() instead.");return this.world.getItemAt(b)},getLevelOfLayer:function(b){a.console.error("[Viewer.getLevelOfLayer] this function is deprecated; use World.getIndexOfItem() instead.");return this.world.getIndexOfItem(b)},getLayersCount:function(){a.console.error("[Viewer.getLayersCount] this function is deprecated; use World.getItemCount() instead.");return this.world.getItemCount()},setLayerLevel:function(b,c){a.console.error("[Viewer.setLayerLevel] this function is deprecated; use World.setItemIndex() instead.");return this.world.setItemIndex(b,c)},removeLayer:function(b){a.console.error("[Viewer.removeLayer] this function is deprecated; use World.removeItem() instead.");return this.world.removeItem(b)},forceRedraw:function(){U[this.hash].forceRedraw=!0;return this},bindSequenceControls:function(){var b=a.delegate(this,k),c=a.delegate(this,l),d=a.delegate(this,T),e=a.delegate(this,S),f=this.navImages,g=!0;if(this.showSequenceControl){(this.previousButton||this.nextButton)&&(g=!1);this.previousButton=new a.Button({element:this.previousButton?a.getElement(this.previousButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.PreviousPage"),srcRest:F(this.prefixUrl,f.previous.REST),srcGroup:F(this.prefixUrl,f.previous.GROUP),srcHover:F(this.prefixUrl,f.previous.HOVER),srcDown:F(this.prefixUrl,f.previous.DOWN),onRelease:e,onFocus:b,onBlur:c});this.nextButton=new a.Button({element:this.nextButton?a.getElement(this.nextButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.NextPage"),srcRest:F(this.prefixUrl,f.next.REST),srcGroup:F(this.prefixUrl,f.next.GROUP),srcHover:F(this.prefixUrl,f.next.HOVER),srcDown:F(this.prefixUrl,f.next.DOWN),onRelease:d,onFocus:b,onBlur:c});this.navPrevNextWrap||this.previousButton.disable();this.tileSources&&this.tileSources.length||this.nextButton.disable();if(g){this.paging=new a.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:a.ControlAnchor.BOTTOM_RIGHT}):this.addControl(this.pagingControl,{anchor:this.sequenceControlAnchor||a.ControlAnchor.TOP_LEFT})}}return this},bindStandardControls:function(){var b=a.delegate(this,G),c=a.delegate(this,I),d=a.delegate(this,L),e=a.delegate(this,H),f=a.delegate(this,M),g=a.delegate(this,O),h=a.delegate(this,P),i=a.delegate(this,Q),j=a.delegate(this,R),m=a.delegate(this,k),n=a.delegate(this,l),o=this.navImages,p=[],q=!0;if(this.showNavigationControl){(this.zoomInButton||this.zoomOutButton||this.homeButton||this.fullPageButton||this.rotateLeftButton||this.rotateRightButton)&&(q=!1);if(this.showZoomControl){p.push(this.zoomInButton=new a.Button({element:this.zoomInButton?a.getElement(this.zoomInButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.ZoomIn"),srcRest:F(this.prefixUrl,o.zoomIn.REST),srcGroup:F(this.prefixUrl,o.zoomIn.GROUP),srcHover:F(this.prefixUrl,o.zoomIn.HOVER),srcDown:F(this.prefixUrl,o.zoomIn.DOWN),onPress:b,onRelease:c,onClick:d,onEnter:b,onExit:c,onFocus:m,onBlur:n}));p.push(this.zoomOutButton=new a.Button({element:this.zoomOutButton?a.getElement(this.zoomOutButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.ZoomOut"),srcRest:F(this.prefixUrl,o.zoomOut.REST),srcGroup:F(this.prefixUrl,o.zoomOut.GROUP),srcHover:F(this.prefixUrl,o.zoomOut.HOVER),srcDown:F(this.prefixUrl,o.zoomOut.DOWN),onPress:e,onRelease:c,onClick:f,onEnter:e,onExit:c,onFocus:m,onBlur:n}))}this.showHomeControl&&p.push(this.homeButton=new a.Button({element:this.homeButton?a.getElement(this.homeButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.Home"),srcRest:F(this.prefixUrl,o.home.REST),srcGroup:F(this.prefixUrl,o.home.GROUP),srcHover:F(this.prefixUrl,o.home.HOVER),srcDown:F(this.prefixUrl,o.home.DOWN),onRelease:g,onFocus:m,onBlur:n}));this.showFullPageControl&&p.push(this.fullPageButton=new a.Button({element:this.fullPageButton?a.getElement(this.fullPageButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.FullPage"),srcRest:F(this.prefixUrl,o.fullpage.REST),srcGroup:F(this.prefixUrl,o.fullpage.GROUP),srcHover:F(this.prefixUrl,o.fullpage.HOVER),srcDown:F(this.prefixUrl,o.fullpage.DOWN),onRelease:h,onFocus:m,onBlur:n}));if(this.showRotationControl){p.push(this.rotateLeftButton=new a.Button({element:this.rotateLeftButton?a.getElement(this.rotateLeftButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.RotateLeft"),srcRest:F(this.prefixUrl,o.rotateleft.REST),srcGroup:F(this.prefixUrl,o.rotateleft.GROUP),srcHover:F(this.prefixUrl,o.rotateleft.HOVER),srcDown:F(this.prefixUrl,o.rotateleft.DOWN),onRelease:i,onFocus:m,onBlur:n}));p.push(this.rotateRightButton=new a.Button({element:this.rotateRightButton?a.getElement(this.rotateRightButton):null,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,tooltip:a.getString("Tooltips.RotateRight"),srcRest:F(this.prefixUrl,o.rotateright.REST),srcGroup:F(this.prefixUrl,o.rotateright.GROUP),srcHover:F(this.prefixUrl,o.rotateright.HOVER),srcDown:F(this.prefixUrl,o.rotateright.DOWN),onRelease:j,onFocus:m,onBlur:n}))}if(q){this.buttons=new a.ButtonGroup({buttons:p,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold});this.navControl=this.buttons.element;this.addHandler("open",a.delegate(this,N));this.toolbar?this.toolbar.addControl(this.navControl,{anchor:a.ControlAnchor.TOP_LEFT}):this.addControl(this.navControl,{anchor:this.navigationControlAnchor||a.ControlAnchor.TOP_LEFT})}}return this},currentPage:function(){return this._sequenceIndex},goToPage:function(a){if(this.tileSources&&a>=0&&a<this.tileSources.length){this.raiseEvent("page",{page:a});this._sequenceIndex=a;this._updateSequenceButtons(a);this.open(this.tileSources[a]);this.referenceStrip&&this.referenceStrip.setFocus(a)}return this},addOverlay:function(b,c,f,g){var h;h=a.isPlainObject(b)?b:{element:b,location:c,placement:f,onDraw:g};b=a.getElement(h.element);if(e(this.currentOverlays,b)>=0)return this;var i=d(this,h);this.currentOverlays.push(i);i.drawHTML(this.overlaysContainer,this.viewport);this.raiseEvent("add-overlay",{element:b,location:h.location,placement:h.placement});return this},updateOverlay:function(b,c,d){var f;b=a.getElement(b);f=e(this.currentOverlays,b);if(f>=0){this.currentOverlays[f].update(c,d);U[this.hash].forceRedraw=!0;this.raiseEvent("update-overlay",{element:b,location:c,placement:d})}return this},removeOverlay:function(b){var c;b=a.getElement(b);c=e(this.currentOverlays,b);if(c>=0){this.currentOverlays[c].destroy();this.currentOverlays.splice(c,1);U[this.hash].forceRedraw=!0;this.raiseEvent("remove-overlay",{element:b})}return this},clearOverlays:function(){for(;this.currentOverlays.length>0;)this.currentOverlays.pop().destroy();U[this.hash].forceRedraw=!0;this.raiseEvent("clear-overlay",{});return this},getOverlayById:function(b){var c;b=a.getElement(b);c=e(this.currentOverlays,b);return c>=0?this.currentOverlays[c]:null},_updateSequenceButtons:function(a){this.nextButton&&(this.tileSources&&this.tileSources.length-1!==a?this.nextButton.enable():this.navPrevNextWrap||this.nextButton.disable());this.previousButton&&(a>0?this.previousButton.enable():this.navPrevNextWrap||this.previousButton.disable())},_showMessage:function(b){this._hideMessage();var c=a.makeNeutralElement("div");c.appendChild(document.createTextNode(b));this.messageDiv=a.makeCenteredNode(c);a.addClass(this.messageDiv,"openseadragon-message");this.container.appendChild(this.messageDiv)},_hideMessage:function(){var a=this.messageDiv;if(a){a.parentNode.removeChild(a);delete this.messageDiv}},gestureSettingsByDeviceType:function(a){switch(a){case"mouse":return this.gestureSettingsMouse;case"touch":return this.gestureSettingsTouch;case"pen":return this.gestureSettingsPen;default:return this.gestureSettingsUnknown}},_drawOverlays:function(){var a,b=this.currentOverlays.length;for(a=0;b>a;a++)this.currentOverlays[a].drawHTML(this.overlaysContainer,this.viewport)},_cancelPendingImages:function(){this._loadQueue=[]}})}(OpenSeadragon);!function(a){function b(a){if(a.quick&&this.viewer.viewport){this.viewer.viewport.panTo(this.viewport.pointFromPixel(a.position));this.viewer.viewport.applyConstraints()}}function c(a){if(this.viewer.viewport){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){this.viewer.raiseEvent("navigator-scroll",{tracker:a.eventSource,position:a.position,scroll:a.scroll,shift:a.shift,originalEvent:a.originalEvent});return!1}function f(a,b){a.style.webkitTransform="rotate("+b+"deg)";a.style.mozTransform="rotate("+b+"deg)";a.style.msTransform="rotate("+b+"deg)";a.style.oTransform="rotate("+b+"deg)";a.style.transform="rotate("+b+"deg)"}a.Navigator=function(g){function h(a){f(l.displayRegionContainer,a);
-f(l.displayRegion,-a);l.viewport.setRotation(a)}var i,j,k=g.viewer,l=this;if(g.id){this.element=document.getElementById(g.id);g.controlOptions={anchor:a.ControlAnchor.NONE,attachToViewer:!1,autoFade:!1}}else{g.id="navigator-"+a.now();this.element=a.makeNeutralElement("div");g.controlOptions={anchor:a.ControlAnchor.TOP_RIGHT,attachToViewer:!0,autoFade:g.autoFade};if(g.position)if("BOTTOM_RIGHT"==g.position)g.controlOptions.anchor=a.ControlAnchor.BOTTOM_RIGHT;else if("BOTTOM_LEFT"==g.position)g.controlOptions.anchor=a.ControlAnchor.BOTTOM_LEFT;else if("TOP_RIGHT"==g.position)g.controlOptions.anchor=a.ControlAnchor.TOP_RIGHT;else if("TOP_LEFT"==g.position)g.controlOptions.anchor=a.ControlAnchor.TOP_LEFT;else if("ABSOLUTE"==g.position){g.controlOptions.anchor=a.ControlAnchor.ABSOLUTE;g.controlOptions.top=g.top;g.controlOptions.left=g.left;g.controlOptions.height=g.height;g.controlOptions.width=g.width}}this.element.id=g.id;this.element.className+=" navigator";g=a.extend(!0,{sizeRatio:a.DEFAULT_SETTINGS.navigatorSizeRatio},g,{element:this.element,tabIndex:-1,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1,immediateRender:!0,blendTime:0,animationTime:0,autoResize:g.autoResize,minZoomImageRatio:1});g.minPixelRatio=this.minPixelRatio=k.minPixelRatio;a.setElementTouchActionNone(this.element);this.borderWidth=2;this.fudge=new a.Point(1,1);this.totalBorderWidths=new a.Point(2*this.borderWidth,2*this.borderWidth).minus(this.fudge);g.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.displayRegionContainer=a.makeNeutralElement("div");this.displayRegionContainer.id=this.element.id+"-displayregioncontainer";this.displayRegionContainer.className="displayregioncontainer";this.displayRegionContainer.style.width="100%";this.displayRegionContainer.style.height="100%";k.addControl(this.element,g.controlOptions);this._resizeWithViewer=g.controlOptions.anchor!=a.ControlAnchor.ABSOLUTE&&g.controlOptions.anchor!=a.ControlAnchor.NONE;if(this._resizeWithViewer){if(g.width&&g.height){this.element.style.height="number"==typeof g.height?g.height+"px":g.height;this.element.style.width="number"==typeof g.width?g.width+"px":g.width}else{i=a.getElementSize(k.element);this.element.style.height=Math.round(i.y*g.sizeRatio)+"px";this.element.style.width=Math.round(i.x*g.sizeRatio)+"px";this.oldViewerSize=i}j=a.getElementSize(this.element);this.elementArea=j.x*j.y}this.oldContainerSize=new a.Point(0,0);a.Viewer.apply(this,[g]);this.displayRegionContainer.appendChild(this.displayRegion);this.element.getElementsByTagName("div")[0].appendChild(this.displayRegionContainer);if(g.navigatorRotate){var m=g.viewer.viewport?g.viewer.viewport.getRotation():g.viewer.degrees||0;h(m);g.viewer.addHandler("rotate",function(a){h(a.degrees)})}this.innerTracker.destroy();this.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)});this.addHandler("reset-size",function(){l.viewport&&l.viewport.goHome(!0)});k.world.addHandler("item-index-change",function(a){var b=l.world.getItemAt(a.previousIndex);l.world.setItemIndex(b,a.newIndex)});k.world.addHandler("remove-item",function(a){var b=a.item;var c=l._getMatchingItem(b);c&&l.world.removeItem(c)});this.update(k.viewport)};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)){this.viewport.resize(b,!0);this.viewport.goHome(!0);this.oldContainerSize=b;this.drawer.clear();this.world.draw()}}},update:function(b){var c,d,e,f,g,h;c=a.getElementSize(this.viewer.element);if(this._resizeWithViewer&&c.x&&c.y&&!c.equals(this.oldViewerSize)){this.oldViewerSize=c;if(this.maintainSizeRatio||!this.elementArea){d=c.x*this.sizeRatio;e=c.y*this.sizeRatio}else{d=Math.sqrt(this.elementArea*(c.x/c.y));e=this.elementArea/d}this.element.style.width=Math.round(d)+"px";this.element.style.height=Math.round(e)+"px";this.elementArea||(this.elementArea=d*e);this.updateSize()}if(b&&this.viewport){f=b.getBoundsNoRotate(!0);g=this.viewport.pixelFromPointNoRotate(f.getTopLeft(),!1);h=this.viewport.pixelFromPointNoRotate(f.getBottomRight(),!1).minus(this.totalBorderWidths);var i=this.displayRegion.style;i.display=this.world.getItemCount()?"block":"none";i.top=Math.round(g.y)+"px";i.left=Math.round(g.x)+"px";var j=Math.abs(g.x-h.x);var k=Math.abs(g.y-h.y);i.width=Math.round(Math.max(j,0))+"px";i.height=Math.round(Math.max(k,0))+"px"}},addTiledImage:function(b){var c=this;var d=b.originalTiledImage;delete b.original;var e=a.extend({},b,{success:function(a){var b=a.item;b._originalForNavigator=d;c._matchBounds(b,d,!0);d.addHandler("bounds-change",function(){c._matchBounds(b,d)})}});return a.Viewer.prototype.addTiledImage.apply(this,[e])},_getMatchingItem:function(a){var b=this.world.getItemCount();var c;for(var d=0;b>d;d++){c=this.world.getItemAt(d);if(c._originalForNavigator===a)return c}return null},_matchBounds:function(a,b,c){var d=b.getBounds();a.setPosition(d.getTopLeft(),c);a.setWidth(d.width,c)}})}(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]]||{};f=h[e[d]];if("string"!=typeof f){a.console.debug("Untranslated source string:",c);f=""}return 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={clone:function(){return new a.Point(this.x,this.y)},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){c=c||new a.Point(0,0);var d;var e;if(b%90===0){var f=b%360;0>f&&(f+=360);switch(f){case 0:d=1;e=0;break;case 90:d=0;e=1;break;case 180:d=-1;e=0;break;case 270:d=0;e=-1}}else{var g=b*Math.PI/180;d=Math.cos(g);e=Math.sin(g)}var h=d*(this.x-c.x)-e*(this.y-c.y)+c.x;var i=e*(this.x-c.x)+d*(this.y-c.y)+c.y;return new a.Point(h,i)},toString:function(){return"("+Math.round(100*this.x)/100+","+Math.round(100*this.y)/100+")"}}}(OpenSeadragon);!function(a){function b(b){var c,d,e=b.responseText,f=b.status;if(!b)throw new Error(a.getString("Errors.Security"));if(200!==b.status&&0!==b.status){f=b.status;c=404==f?"Not Found":b.statusText;throw new Error(a.getString("Errors.Status",f,c))}if(e.match(/\s*<.*/))try{d=b.responseXML&&b.responseXML.documentElement?b.responseXML:a.parseXml(e)}catch(g){d=b.responseText}else d=e.match(/\s*[\{\[].*/)?a.parseJSON(e):e;return d}a.TileSource=function(b,c,d,e,f,g){var h=this;var i,j,k=arguments;i=a.isPlainObject(b)?b:{width:k[0],height:k[1],tileSize:k[2],tileOverlap:k[3],minLevel:k[4],maxLevel:k[5]};a.EventSource.call(this);a.extend(!0,this,i);if(!this.success)for(j=0;j<arguments.length;j++)if(a.isFunction(arguments[j])){this.success=arguments[j];break}this.success&&this.addHandler("ready",function(a){h.success(a)});"string"==a.type(arguments[0])&&(this.url=arguments[0]);if(this.url){this.aspectRatio=1;this.dimensions=new a.Point(10,10);this._tileWidth=0;this._tileHeight=0;this.tileOverlap=0;this.minLevel=0;this.maxLevel=0;this.ready=!1;this.getImageInfo(this.url)}else{this.ready=!0;this.aspectRatio=i.width&&i.height?i.width/i.height:1;this.dimensions=new a.Point(i.width,i.height);if(this.tileSize){this._tileWidth=this._tileHeight=this.tileSize;delete this.tileSize}else{if(this.tileWidth){this._tileWidth=this.tileWidth;delete this.tileWidth}else this._tileWidth=0;if(this.tileHeight){this._tileHeight=this.tileHeight;delete this.tileHeight}else this._tileHeight=0}this.tileOverlap=i.tileOverlap?i.tileOverlap:0;this.minLevel=i.minLevel?i.minLevel:0;this.maxLevel=void 0!==i.maxLevel&&null!==i.maxLevel?i.maxLevel:i.width&&i.height?Math.ceil(Math.log(Math.max(i.width,i.height))/Math.log(2)):0;this.success&&a.isFunction(this.success)&&this.success(this)}};a.TileSource.prototype={getTileSize:function(b){a.console.error("[TileSource.getTileSize] is deprecated.Use TileSource.getTileWidth() and TileSource.getTileHeight() instead");return this._tileWidth},getTileWidth:function(a){return this._tileWidth?this._tileWidth:this.getTileSize(a)},getTileHeight:function(a){return this._tileHeight?this._tileHeight:this.getTileSize(a)},getLevelScale:function(a){var b,c={};for(b=0;b<=this.maxLevel;b++)c[b]=1/Math.pow(2,this.maxLevel-b);this.getLevelScale=function(a){return c[a]};return this.getLevelScale(a)},getNumTiles:function(b){var c=this.getLevelScale(b),d=Math.ceil(c*this.dimensions.x/this.getTileWidth(b)),e=Math.ceil(c*this.dimensions.y/this.getTileHeight(b));return new a.Point(d,e)},getPixelRatio:function(b){var c=this.dimensions.times(this.getLevelScale(b)),d=1/c.x,e=1/c.y;return new a.Point(d,e)},getClosestLevel:function(b){var c,d,e;for(c=this.minLevel;c<this.maxLevel;c++){e=this.getNumTiles(c);d=new a.Point(Math.floor(b.x/this.getTileWidth(c)),Math.floor(b.y/this.getTileHeight(c)));if(e.x+1>=d.x&&e.y+1>=d.y)break}return Math.max(0,c-1)},getTileAtPoint:function(b,c){var d=c.times(this.dimensions.x).times(this.getLevelScale(b)),e=Math.floor(d.x/this.getTileWidth(b)),f=Math.floor(d.y/this.getTileHeight(b));return new a.Point(e,f)},getTileBounds:function(b,c,d){var e=this.dimensions.times(this.getLevelScale(b)),f=this.getTileWidth(b),g=this.getTileHeight(b),h=0===c?0:f*c-this.tileOverlap,i=0===d?0:g*d-this.tileOverlap,j=f+(0===c?1:2)*this.tileOverlap,k=g+(0===d?1:2)*this.tileOverlap,l=1/e.x;j=Math.min(j,e.x-h);k=Math.min(k,e.y-i);return new a.Rect(h*l,i*l,j*l,k*l)},getImageInfo:function(c){var d,e,f,g,h,i,j,k=this;if(c){h=c.split("/");i=h[h.length-1];j=i.lastIndexOf(".");j>-1&&(h[h.length-1]=i.slice(0,j))}e=function(b){"string"==typeof b&&(b=a.parseXml(b));var d=a.TileSource.determineType(k,b,c);if(d){g=d.prototype.configure.apply(k,[b,c]);void 0===g.ajaxWithCredentials&&(g.ajaxWithCredentials=k.ajaxWithCredentials);f=new d(g);k.ready=!0;k.raiseEvent("ready",{tileSource:f})}else k.raiseEvent("open-failed",{message:"Unable to load TileSource",source:c})};if(c.match(/\.js$/)){d=c.split("/").pop().replace(".js","");a.jsonp({url:c,async:!1,callbackName:d,callback:e})}else a.makeAjaxRequest({url:c,withCredentials:this.ajaxWithCredentials,success:function(a){var c=b(a);e(c)},error:function(a,b){var d;try{d="HTTP "+a.status+" attempting to load TileSource"}catch(e){var f;f="undefined"!=typeof b&&b.toString?b.toString():"Unknown error";d=f+" attempting to load TileSource"}k.raiseEvent("open-failed",{message:d,source:c})}})},supports:function(a,b){return!1},configure:function(a,b){throw new Error("Method not implemented.")},getTileUrl:function(a,b,c){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}};a.extend(!0,a.TileSource.prototype,a.EventSource.prototype);a.TileSource.determineType=function(b,c,d){var e;for(e in OpenSeadragon)if(e.match(/.+TileSource$/)&&a.isFunction(OpenSeadragon[e])&&a.isFunction(OpenSeadragon[e].prototype.supports)&&OpenSeadragon[e].prototype.supports.call(b,c,d))return OpenSeadragon[e];a.console.error("No TileSource was able to open %s %s",d,c)}}(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.localName||j.tagName,l=d.documentElement.namespaceURI,m=null,n=[];if("Image"==k)try{h=j.getElementsByTagName("Size")[0];void 0===h&&(h=j.getElementsByTagNameNS(l,"Size")[0]);m={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)}}};if(!a.imageFormatSupported(m.Image.Format))throw new Error(a.getString("Errors.ImageFormat",m.Image.Format.toUpperCase()));e=j.getElementsByTagName("DisplayRect");void 0===e&&(e=j.getElementsByTagNameNS(l,"DisplayRect")[0]);for(i=0;i<e.length;i++){f=e[i];g=f.getElementsByTagName("Rect")[0];void 0===g&&(g=f.getElementsByTagNameNS(l,"Rect")[0]);n.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)}})}n.length&&(m.Image.DisplayRect=n);return c(b,m)}catch(o){throw o instanceof Error?o:new Error(a.getString("Errors.Dzi"))}else{if("Collection"==k)throw new Error(a.getString("Errors.Dzc"));if("Error"==k){var p=j.getElementsByTagName("Message")[0];var q=p.firstChild.nodeValue;throw new Error(q)}}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,c,d,e,f,g,h,i,j){var k,l,m,n;n=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=n.tilesUrl;this.fileFormat=n.fileFormat;this.displayRects=n.displayRects;if(this.displayRects)for(k=this.displayRects.length-1;k>=0;k--){l=this.displayRects[k];for(m=l.minLevel;m<=l.maxLevel;m++){this._levelRects[m]||(this._levelRects[m]=[]);this._levelRects[m].push(l)}}a.TileSource.apply(this,[n])};a.extend(a.DziTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){var c;a.Image?c=a.Image.xmlns:a.documentElement&&("Image"==a.documentElement.localName||"Image"==a.documentElement.tagName)&&(c=a.documentElement.namespaceURI);return"http://schemas.microsoft.com/deepzoom/2008"==c||"http://schemas.microsoft.com/deepzoom/2009"==c},configure:function(d,e){var f;f=a.isPlainObject(d)?c(this,d):b(this,d);if(e&&!f.tilesUrl){f.tilesUrl=e.replace(/([^\/]+?)(\.(dzi|xml|js))?\/?(\?.*)?$/,"$1_files/");-1!=e.search(/\.(dzi|xml|js)\?/)?f.queryParams=e.match(/\?.*/):f.queryParams=""}return f},getTileUrl:function(a,b,c){return[this.tilesUrl,a,"/",b,"_",c,".",this.fileFormat,this.queryParams].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--){d=k[j];if(!(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);if(b>=f&&h>b&&c>=g&&i>c)return!0}}return!1}})}(OpenSeadragon);!function(a){function b(a){var b=["http://library.stanford.edu/iiif/image-api/compliance.html#level0","http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0","http://iiif.io/api/image/2/level0.json"];var c=-1!=b.indexOf(a[0]);return!c||-1!=a.indexOf("sizeByW")}function c(a){var b=[];for(var c=0;c<a.sizes.length;c++)b.push({url:a["@id"]+"/full/"+a.sizes[c].width+",/0/default.jpg",width:a.sizes[c].width,height:a.sizes[c].height});return b.sort(function(a,b){return a.width-b.width})}function d(b){if(!b||!b.documentElement)throw new Error(a.getString("Errors.Xml"));var c=b.documentElement,d=c.tagName,f=null;if("info"==d)try{f={};e(c,f);return f}catch(g){throw g instanceof Error?g:new Error(a.getString("Errors.IIIF"))}throw new Error(a.getString("Errors.IIIF"))}function e(b,c,d){var f,g;if(3==b.nodeType&&d){g=b.nodeValue.trim();g.match(/^\d*$/)&&(g=Number(g));if(c[d]){a.isArray(c[d])||(c[d]=[c[d]]);c[d].push(g)}else c[d]=g}else if(1==b.nodeType)for(f=0;f<b.childNodes.length;f++)e(b.childNodes[f],c,b.nodeName)}a.IIIFTileSource=function(d){a.extend(!0,this,d);if(!(this.height&&this.width&&this["@id"]))throw new Error("IIIF required parameters not provided.");d.tileSizePerScaleFactor={};if(this.tile_width&&this.tile_height){d.tileWidth=this.tile_width;d.tileHeight=this.tile_height}else if(this.tile_width)d.tileSize=this.tile_width;else if(this.tile_height)d.tileSize=this.tile_height;else if(this.tiles)if(1==this.tiles.length){d.tileWidth=this.tiles[0].width;d.tileHeight=this.tiles[0].height||this.tiles[0].width;this.scale_factors=this.tiles[0].scaleFactors}else{this.scale_factors=[];for(var e=0;e<this.tiles.length;e++)for(var f=0;f<this.tiles[e].scaleFactors.length;f++){var g=this.tiles[e].scaleFactors[f];this.scale_factors.push(g);d.tileSizePerScaleFactor[g]={width:this.tiles[e].width,height:this.tiles[e].height||this.tiles[e].width}}}else if(b(d.profile)){var h=Math.min(this.height,this.width),i=[256,512,1024],j=[];for(var k=0;k<i.length;k++)i[k]<=h&&j.push(i[k]);j.length>0?d.tileSize=Math.max.apply(null,j):d.tileSize=h}else if(this.sizes&&this.sizes.length>0){this.emulateLegacyImagePyramid=!0;d.levels=c(this);a.extend(!0,d,{width:d.levels[d.levels.length-1].width,height:d.levels[d.levels.length-1].height,tileSize:Math.max(d.height,d.width),tileOverlap:0,minLevel:0,maxLevel:d.levels.length-1});this.levels=d.levels}else a.console.error("Nothing in the info.json to construct image pyramids from");d.maxLevel||this.emulateLegacyImagePyramid||(this.scale_factors?d.maxLevel=Math.floor(Math.pow(Math.max.apply(null,this.scale_factors),.5)):d.maxLevel=Number(Math.ceil(Math.log(Math.max(this.width,this.height),2))));a.TileSource.apply(this,[d])};a.extend(a.IIIFTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.protocol&&"http://iiif.io/api/image"==a.protocol?!0:!a["@context"]||"http://library.stanford.edu/iiif/image-api/1.1/context.json"!=a["@context"]&&"http://iiif.io/api/image/1/context.json"!=a["@context"]?a.profile&&0===a.profile.indexOf("http://library.stanford.edu/iiif/image-api/compliance.html")?!0:a.identifier&&a.width&&a.height?!0:a.documentElement&&"info"==a.documentElement.tagName&&"http://library.stanford.edu/iiif/image-api/ns/"==a.documentElement.namespaceURI?!0:!1:!0},configure:function(b,c){if(a.isPlainObject(b)){if(b["@context"])return b;b["@context"]="http://iiif.io/api/image/1.0/context.json";b["@id"]=c.replace("/info.json","");return b}var e=d(b);e["@context"]="http://iiif.io/api/image/1.0/context.json";e["@id"]=c.replace("/info.xml","");return e},getTileWidth:function(b){if(this.emulateLegacyImagePyramid)return a.TileSource.prototype.getTileWidth.call(this,b);var c=Math.pow(2,this.maxLevel-b);return this.tileSizePerScaleFactor&&this.tileSizePerScaleFactor[c]?this.tileSizePerScaleFactor[c].width:this._tileWidth},getTileHeight:function(b){if(this.emulateLegacyImagePyramid)return a.TileSource.prototype.getTileHeight.call(this,b);var c=Math.pow(2,this.maxLevel-b);return this.tileSizePerScaleFactor&&this.tileSizePerScaleFactor[c]?this.tileSizePerScaleFactor[c].height:this._tileHeight},getLevelScale:function(b){if(this.emulateLegacyImagePyramid){var c=NaN;this.levels.length>0&&b>=this.minLevel&&b<=this.maxLevel&&(c=this.levels[b].width/this.levels[this.maxLevel].width);return c}return a.TileSource.prototype.getLevelScale.call(this,b)},getNumTiles:function(b){if(this.emulateLegacyImagePyramid){var c=this.getLevelScale(b);return c?new a.Point(1,1):new a.Point(0,0)}return a.TileSource.prototype.getNumTiles.call(this,b)},getTileAtPoint:function(b,c){return this.emulateLegacyImagePyramid?new a.Point(0,0):a.TileSource.prototype.getTileAtPoint.call(this,b,c)},getTileUrl:function(a,b,c){if(this.emulateLegacyImagePyramid){var d=null;this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(d=this.levels[a].url);return d}var e,f,g,h,i,j,k,l,m,n,o,p,q="0",r=Math.pow(.5,this.maxLevel-a),s=Math.ceil(this.width*r),t=Math.ceil(this.height*r);e=this.getTileWidth(a);f=this.getTileHeight(a);g=Math.ceil(e/r);h=Math.ceil(f/r);o=this["@context"].indexOf("/1.0/context.json")>-1||this["@context"].indexOf("/1.1/context.json")>-1||this["@context"].indexOf("/1/context.json")>-1?"native.jpg":"default.jpg";if(e>s&&f>t){n=s+",";i="full"}else{j=b*g;k=c*h;l=Math.min(g,this.width-j);m=Math.min(h,this.height-k);n=Math.ceil(l*r)+",";i=[j,k,l,m].join(",")}p=[this["@id"],i,n,q,o].join("/");return p}})}(OpenSeadragon);!function(a){a.OsmTileSource=function(b,c,d,e,f){var g;g=a.isPlainObject(b)?b:{width:arguments[0],height:arguments[1],tileSize:arguments[2],tileOverlap:arguments[3],tilesUrl:arguments[4]};if(!g.width||!g.height){g.width=65572864;g.height=65572864}if(!g.tileSize){g.tileSize=256;g.tileOverlap=0}g.tilesUrl||(g.tilesUrl="http://tile.openstreetmap.org/");g.minLevel=8;a.TileSource.apply(this,[g])};a.extend(a.OsmTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.type&&"openstreetmaps"==a.type},configure:function(a,b){return a},getTileUrl:function(a,b,c){return this.tilesUrl+(a-8)+"/"+b+"/"+c+".png"}})}(OpenSeadragon);!function(a){a.TmsTileSource=function(b,c,d,e,f){var g;g=a.isPlainObject(b)?b:{width:arguments[0],height:arguments[1],tileSize:arguments[2],tileOverlap:arguments[3],tilesUrl:arguments[4]};var h,i=256*Math.ceil(g.width/256),j=256*Math.ceil(g.height/256);h=i>j?i/256:j/256;g.maxLevel=Math.ceil(Math.log(h)/Math.log(2))-1;g.tileSize=256;g.width=i;g.height=j;a.TileSource.apply(this,[g])};a.extend(a.TmsTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.type&&"tiledmapservice"==a.type},configure:function(a,b){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{i={type:g.getAttribute("type"),levels:[]};j=g.getElementsByTagName("level");for(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);if(d.levels.length>0){e=d.levels[d.levels.length-1].width;f=d.levels[d.levels.length-1].height}else{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,b){return a.type&&"legacy-image-pyramid"==a.type||a.documentElement&&"legacy-image-pyramid"==a.documentElement.getAttribute("type")},configure:function(b,e){var f;f=a.isPlainObject(b)?d(this,b):c(this,b);return f},getLevelScale:function(a){var b=NaN;this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(b=this.levels[a].width/this.levels[this.maxLevel].width);return b},getNumTiles:function(b){var c=this.getLevelScale(b);return c?new a.Point(1,1):new a.Point(0,0)},getTileAtPoint:function(b,c){return new a.Point(0,0)},getTileUrl:function(a,b,c){var d=null;this.levels.length>0&&a>=this.minLevel&&a<=this.maxLevel&&(d=this.levels[a].url);return d}})}(OpenSeadragon);!function(a){a.ImageTileSource=function(b){b=a.extend({buildPyramid:!0,crossOriginPolicy:!1,ajaxWithCredentials:!1,useCanvas:!0},b);a.TileSource.apply(this,[b])};a.extend(a.ImageTileSource.prototype,a.TileSource.prototype,{supports:function(a,b){return a.type&&"image"===a.type},configure:function(a,b){return a},getImageInfo:function(b){var c=this._image=new Image;var d=this;this.crossOriginPolicy&&(c.crossOrigin=this.crossOriginPolicy);this.ajaxWithCredentials&&(c.useCredentials=this.ajaxWithCredentials);a.addEvent(c,"load",function(){d.width=c.naturalWidth;d.height=c.naturalHeight;d.aspectRatio=d.width/d.height;d.dimensions=new a.Point(d.width,d.height);d._tileWidth=d.width;d._tileHeight=d.height;d.tileOverlap=0;d.minLevel=0;d.levels=d._buildLevels();d.maxLevel=d.levels.length-1;d.ready=!0;d.raiseEvent("ready",{tileSource:d})});a.addEvent(c,"error",function(){d.raiseEvent("open-failed",{message:"Error loading image at "+b,source:b})});c.src=b},getLevelScale:function(a){var b=NaN;a>=this.minLevel&&a<=this.maxLevel&&(b=this.levels[a].width/this.levels[this.maxLevel].width);return b},getNumTiles:function(b){var c=this.getLevelScale(b);return c?new a.Point(1,1):new a.Point(0,0)},getTileAtPoint:function(b,c){return new a.Point(0,0)},getTileUrl:function(a,b,c){var d=null;a>=this.minLevel&&a<=this.maxLevel&&(d=this.levels[a].url);return d},getContext2D:function(a,b,c){var d=null;a>=this.minLevel&&a<=this.maxLevel&&(d=this.levels[a].context2D);return d},_buildLevels:function(){var b=[{url:this._image.src,width:this._image.naturalWidth,height:this._image.naturalHeight}];if(!this.buildPyramid||!a.supportsCanvas||!this.useCanvas){delete this._image;return b}var c=this._image.naturalWidth;var d=this._image.naturalHeight;var e=document.createElement("canvas");var f=e.getContext("2d");e.width=c;e.height=d;f.drawImage(this._image,0,0,c,d);b[0].context2D=f;delete this._image;if(a.isCanvasTainted(e))return b;for(;c>=2&&d>=2;){c=Math.floor(c/2);d=Math.floor(d/2);var g=document.createElement("canvas");var h=g.getContext("2d");g.width=c;g.height=d;h.drawImage(e,0,0,c,d);b.splice(0,0,{context2D:h,width:c,height:d});e=g;f=h}return b}})}(OpenSeadragon);!function(a){a.TileSourceCollection=function(b,c,d,e){a.console.error("TileSourceCollection is deprecated; use World instead")}}(OpenSeadragon);!function(a){function b(b){a.requestAnimationFrame(function(){c(b)})}function c(c){var d,e,f;if(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){if(!b.element.disabled){if(c>=a.ButtonState.GROUP&&b.currentState==a.ButtonState.REST){e(b);b.currentState=a.ButtonState.GROUP}if(c>=a.ButtonState.HOVER&&b.currentState==a.ButtonState.GROUP){b.imgHover&&(b.imgHover.style.visibility="");b.currentState=a.ButtonState.HOVER}if(c>=a.ButtonState.DOWN&&b.currentState==a.ButtonState.HOVER){b.imgDown&&(b.imgDown.style.visibility="");b.currentState=a.ButtonState.DOWN}}}function g(b,c){if(!b.element.disabled){if(c<=a.ButtonState.HOVER&&b.currentState==a.ButtonState.DOWN){b.imgDown&&(b.imgDown.style.visibility="hidden");b.currentState=a.ButtonState.HOVER}if(c<=a.ButtonState.GROUP&&b.currentState==a.ButtonState.HOVER){b.imgHover&&(b.imgHover.style.visibility="hidden");b.currentState=a.ButtonState.GROUP}if(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("div");if(!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.imgRest.alt=this.imgGroup.alt=this.imgHover.alt=this.imgDown.alt=this.tooltip;this.element.style.position="relative";a.setElementTouchActionNone(this.element);this.imgGroup.style.position=this.imgHover.style.position=this.imgDown.style.position="absolute";this.imgGroup.style.top=this.imgHover.style.top=this.imgDown.style.top="0px";this.imgGroup.style.left=this.imgHover.style.left=this.imgDown.style.left="0px";this.imgHover.style.visibility=this.imgDown.style.visibility="hidden";a.Browser.vendor==a.BROWSERS.FIREFOX&&a.Browser.version<3&&(this.imgGroup.style.top=this.imgHover.style.top=this.imgDown.style.top="");this.element.appendChild(this.imgRest);this.element.appendChild(this.imgGroup);this.element.appendChild(this.imgHover);this.element.appendChild(this.imgDown)}this.addHandler("press",this.onPress);this.addHandler("release",this.onRelease);this.addHandler("click",this.onClick);this.addHandler("enter",this.onEnter);this.addHandler("exit",this.onExit);this.addHandler("focus",this.onFocus);this.addHandler("blur",this.onBlur);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){if(b.insideElementPressed){f(c,a.ButtonState.DOWN);c.raiseEvent("enter",{originalEvent:b.originalEvent})}else 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){if(b.insideElementPressed&&b.insideElementReleased){g(c,a.ButtonState.HOVER);c.raiseEvent("release",{originalEvent:b.originalEvent})}else 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){if(13===a.keyCode){c.raiseEvent("click",{originalEvent:a.originalEvent});c.raiseEvent("release",{originalEvent:a.originalEvent});return!1}return!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;this.element=b.element||a.makeNeutralElement("div");if(!b.group){this.label=a.makeNeutralElement("label");this.element.style.display="inline-block";this.element.appendChild(this.label);for(c=0;c<d.length;c++)this.element.appendChild(d[c].element)}a.setElementTouchActionNone(this.element);this.tracker=new a.MouseTracker({element:this.element,clickTimeThreshold:this.clickTimeThreshold,clickDistThreshold:this.clickDistThreshold,enterHandler:function(a){var b;for(b=0;b<e.buttons.length;b++)e.buttons[b].notifyGroupEnter()},exitHandler:function(a){var b;if(!a.insideElementPressed)for(b=0;b<e.buttons.length;b++)e.buttons[b].notifyGroupExit()}})};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,e){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;this.degrees="number"==typeof e?e:0;this.degrees=this.degrees%360;this.degrees<0&&(this.degrees+=360);var f,g;if(this.degrees>=270){f=this.getTopRight();this.x=f.x;this.y=f.y;g=this.height;this.height=this.width;this.width=g;this.degrees-=270}else if(this.degrees>=180){f=this.getBottomRight();this.x=f.x;this.y=f.y;this.degrees-=180}else if(this.degrees>=90){f=this.getBottomLeft();this.x=f.x;this.y=f.y;g=this.height;this.height=this.width;this.width=g;this.degrees-=90}};a.Rect.fromSummits=function(b,c,d){var e=b.distanceTo(c);var f=b.distanceTo(d);var g=c.minus(b);var h=Math.atan(g.y/g.x);g.x<0?h+=Math.PI:g.y<0&&(h+=2*Math.PI);return new a.Rect(b.x,b.y,e,f,h/Math.PI*180)};a.Rect.prototype={clone:function(){return new a.Rect(this.x,this.y,this.width,this.height,this.degrees)},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).rotate(this.degrees,this.getTopLeft())},getTopRight:function(){return new a.Point(this.x+this.width,this.y).rotate(this.degrees,this.getTopLeft())},getBottomLeft:function(){return new a.Point(this.x,this.y+this.height).rotate(this.degrees,this.getTopLeft())},getCenter:function(){return new a.Point(this.x+this.width/2,this.y+this.height/2).rotate(this.degrees,this.getTopLeft())},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&&this.degrees===b.degrees},times:function(b){return new a.Rect(this.x*b,this.y*b,this.width*b,this.height*b,this.degrees)},translate:function(b){return new a.Rect(this.x+b.x,this.y+b.y,this.width,this.height,this.degrees)},union:function(b){var c=this.getBoundingBox();var d=b.getBoundingBox();var e=Math.min(c.x,d.x);var f=Math.min(c.y,d.y);var g=Math.max(c.x+c.width,d.x+d.width);var h=Math.max(c.y+c.height,d.y+d.height);return new a.Rect(e,f,g-e,h-f)},intersection:function(b){function c(b,c,e,f){var g=c.minus(b);var h=f.minus(e);var i=-h.x*g.y+g.x*h.y;if(0===i)return null;var j=(g.x*(b.y-e.y)-g.y*(b.x-e.x))/i;var k=(h.x*(b.y-e.y)-h.y*(b.x-e.x))/i;return j>=-d&&1-d>=j&&k>=-d&&1-d>=k?new a.Point(b.x+k*g.x,b.y+k*g.y):null}var d=1e-10;var e=[];var f=this.getTopLeft();b.containsPoint(f,d)&&e.push(f);var g=this.getTopRight();b.containsPoint(g,d)&&e.push(g);var h=this.getBottomLeft();b.containsPoint(h,d)&&e.push(h);var i=this.getBottomRight();b.containsPoint(i,d)&&e.push(i);var j=b.getTopLeft();this.containsPoint(j,d)&&e.push(j);var k=b.getTopRight();this.containsPoint(k,d)&&e.push(k);var l=b.getBottomLeft();this.containsPoint(l,d)&&e.push(l);var m=b.getBottomRight();this.containsPoint(m,d)&&e.push(m);var n=this._getSegments();var o=b._getSegments();for(var p=0;p<n.length;p++){var q=n[p];for(var r=0;r<o.length;r++){var s=o[r];var t=c(q[0],q[1],s[0],s[1]);t&&e.push(t)}}if(0===e.length)return null;var u=e[0].x;var v=e[0].x;var w=e[0].y;var x=e[0].y;for(var y=1;y<e.length;y++){var z=e[y];z.x<u&&(u=z.x);z.x>v&&(v=z.x);z.y<w&&(w=z.y);z.y>x&&(x=z.y)}return new a.Rect(u,w,v-u,x-w)},_getSegments:function(){var a=this.getTopLeft();var b=this.getTopRight();var c=this.getBottomLeft();var d=this.getBottomRight();return[[a,b],[b,d],[d,c],[c,a]]},rotate:function(b,c){b%=360;if(0===b)return this.clone();0>b&&(b+=360);c=c||this.getCenter();var d=this.getTopLeft().rotate(b,c);var e=this.getTopRight().rotate(b,c);var f=e.minus(d);var g=Math.atan(f.y/f.x);f.x<0?g+=Math.PI:f.y<0&&(g+=2*Math.PI);return new a.Rect(d.x,d.y,this.width,this.height,g/Math.PI*180)},getBoundingBox:function(){if(0===this.degrees)return this.clone();var b=this.getTopLeft();var c=this.getTopRight();var d=this.getBottomLeft();var e=this.getBottomRight();var f=Math.min(b.x,c.x,d.x,e.x);var g=Math.max(b.x,c.x,d.x,e.x);var h=Math.min(b.y,c.y,d.y,e.y);var i=Math.max(b.y,c.y,d.y,e.y);return new a.Rect(f,h,g-f,i-h)},getIntegerBoundingBox:function(){var b=this.getBoundingBox();var c=Math.floor(b.x);var d=Math.floor(b.y);var e=Math.ceil(b.width+b.x-c);var f=Math.ceil(b.height+b.y-d);return new a.Rect(c,d,e,f)},containsPoint:function(a,b){b=b||0;var c=this.getTopLeft();var d=this.getTopRight();var e=this.getBottomLeft();var f=d.minus(c);var g=e.minus(c);return(a.x-c.x)*f.x+(a.y-c.y)*f.y>=-b&&(a.x-d.x)*f.x+(a.y-d.y)*f.y<=b&&(a.x-c.x)*g.x+(a.y-c.y)*g.y>=-b&&(a.x-e.x)*g.x+(a.y-e.y)*g.y<=b},toString:function(){return"["+Math.round(100*this.x)/100+", "+Math.round(100*this.y)/100+", "+Math.round(100*this.width)/100+"x"+Math.round(100*this.height)/100+", "+Math.round(100*this.degrees)/100+"deg]"}}}(OpenSeadragon);!function(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);this.dragging=!0;if(this.element)if("horizontal"==this.scroll){if(-b.delta.x>0){if(c>-(f-h.x)){this.element.style.marginLeft=c+2*b.delta.x+"px";d(this,h.x,c+2*b.delta.x)}}else if(-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)}}else if(-b.delta.y>0){if(e>-(g-h.y)){this.element.style.marginTop=e+2*b.delta.y+"px";d(this,h.y,e+2*b.delta.y)}}else if(-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)}return!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);if(this.element)if("horizontal"==this.scroll){if(b.scroll>0){if(c>-(f-h.x)){this.element.style.marginLeft=c-60*b.scroll+"px";d(this,h.x,c-60*b.scroll)}}else if(b.scroll<0&&0>c){this.element.style.marginLeft=c-60*b.scroll+"px";d(this,h.x,c-60*b.scroll)}}else if(b.scroll<0){if(e>h.y-g){this.element.style.marginTop=e+60*b.scroll+"px";d(this,h.y,e+60*b.scroll)}}else if(b.scroll>0&&0>e){this.element.style.marginTop=e+60*b.scroll+"px";d(this,h.y,e+60*b.scroll)}return!1}function d(b,c,d){var e,f,g,h,i,j,k;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;for(j=f;g>j&&j<b.panels.length;j++){k=b.panels[j];if(!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("div");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,startDisabled:!0});k.getElementsByTagName("div")[0].appendChild(h.displayRegion);k.activePanel=!0}}}function e(a){var b=a.eventSource.element;"horizontal"==this.scroll?b.style.marginBottom="0px":b.style.marginLeft="0px";return!1}function f(b){var c=b.eventSource.element;"horizontal"==this.scroll?c.style.marginBottom="-"+a.getElementSize(c).y/2+"px":c.style.marginLeft="-"+a.getElementSize(c).x/2+"px";return!1}function g(a){if(a.preventDefaultAction||a.ctrl||a.alt||a.meta)return!0;switch(a.keyCode){case 38:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 40:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 37:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 39:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;default:return!0}}function h(a){if(a.preventDefaultAction||a.ctrl||a.alt||a.meta)return!0;switch(a.keyCode){case 61:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 45:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 48:case 119:case 87:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;case 115:case 83:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 97:c.call(this,{eventSource:this.tracker,position:null,scroll:-1,shift:null});return!1;case 100:c.call(this,{eventSource:this.tracker,position:null,scroll:1,shift:null});return!1;default:return!0}}var i={};a.ReferenceStrip=function(j){var k,l,m,n=this,o=j.viewer,p=a.getElementSize(o.element);if(!j.id){j.id="referencestrip-"+a.now();this.element=a.makeNeutralElement("div");this.element.id=j.id;this.element.className="referencestrip"}j=a.extend(!0,{sizeRatio:a.DEFAULT_SETTINGS.referenceStripSizeRatio,position:a.DEFAULT_SETTINGS.referenceStripPosition,scroll:a.DEFAULT_SETTINGS.referenceStripScroll,clickTimeThreshold:a.DEFAULT_SETTINGS.clickTimeThreshold},j,{element:this.element,showNavigator:!1,mouseNavEnabled:!1,showNavigationControl:!1,showSequenceControl:!1});a.extend(this,j);i[this.id]={animating:!1};this.minPixelRatio=this.viewer.minPixelRatio;l=this.element.style;l.marginTop="0px";l.marginRight="0px";l.marginBottom="0px";l.marginLeft="0px";l.left="0px";l.bottom="0px";l.border="0px";l.background="#000";l.position="relative";a.setElementTouchActionNone(this.element);a.setElementOpacity(this.element,.8);this.viewer=o;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),keyDownHandler:a.delegate(this,g),keyHandler:a.delegate(this,h)});if(j.width&&j.height){this.element.style.width=j.width+"px";this.element.style.height=j.height+"px";o.addControl(this.element,{anchor:a.ControlAnchor.BOTTOM_LEFT})}else if("horizontal"==j.scroll){this.element.style.width=p.x*j.sizeRatio*o.tileSources.length+12*o.tileSources.length+"px";this.element.style.height=p.y*j.sizeRatio+"px";o.addControl(this.element,{anchor:a.ControlAnchor.BOTTOM_LEFT})}else{this.element.style.height=p.y*j.sizeRatio*o.tileSources.length+12*o.tileSources.length+"px";this.element.style.width=p.x*j.sizeRatio+"px";o.addControl(this.element,{anchor:a.ControlAnchor.TOP_LEFT})}this.panelWidth=p.x*this.sizeRatio+8;this.panelHeight=p.y*this.sizeRatio+8;this.panels=[];for(m=0;m<o.tileSources.length;m++){k=a.makeNeutralElement("div");k.id=this.element.id+"-"+m;k.style.width=n.panelWidth+"px";k.style.height=n.panelHeight+"px";k.style.display="inline";k.style["float"]="left";k.style.cssFloat="left";k.style.styleFloat="left";k.style.padding="2px";a.setElementTouchActionNone(k);k.innerTracker=new a.MouseTracker({element:k,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();if(b.insideElementPressed&&b.insideElementReleased&&c.dragging&&f-c.dragging<c.clickTimeThreshold){c.dragging=null;o.goToPage(e)}}});this.element.appendChild(k);k.activePanel=!1;this.panels.push(k)}d(this,"vertical"==this.scroll?p.y:p.x,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",""));if(this.currentSelected!==f){this.currentSelected&&(this.currentSelected.style.background="#000");this.currentSelected=f;this.currentSelected.style.background="#999";if("horizontal"==this.scroll){c=Number(b)*(this.panelWidth+3);if(c>j+g.x-this.panelWidth){c=Math.min(c,h-g.x);this.element.style.marginLeft=-c+"px";d(this,g.x,-c)}else if(j>c){c=Math.max(0,c-g.x/2);this.element.style.marginLeft=-c+"px";d(this,g.x,-c)}}else{c=Number(b)*(this.panelHeight+3);if(c>k+g.y-this.panelHeight){c=Math.min(c,i-g.y);this.element.style.marginTop=-c+"px";d(this,g.y,-c)}else if(k>c){c=Math.max(0,c-g.y/2);this.element.style.marginTop=-c+"px";d(this,g.y,-c)}}this.currentPage=b;e.call(this,{eventSource:this.innerTracker})}},update:function(){if(i[this.id].animating){a.console.log("image reference strip update");return!0}return!1},destroy:function(){this.element&&this.element.parentNode.removeChild(this.element)}})}(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]:void 0,springStiffness:c.length>1?c[1].springStiffness:5,animationTime:c.length>1?c[1].animationTime:1.5});a.console.assert("number"==typeof b.springStiffness&&0!==b.springStiffness,"[OpenSeadragon.Spring] options.springStiffness must be a non-zero number");a.console.assert("number"==typeof b.animationTime&&b.animationTime>=0,"[OpenSeadragon.Spring] options.animationTime must be a number greater than or equal to 0");if(b.exponential){this._exponential=!0;delete b.exponential}a.extend(!0,this,b);this.current={value:"number"==typeof this.initial?this.initial:this._exponential?0:1,time:a.now()};a.console.assert(!this._exponential||0!==this.current.value,"[OpenSeadragon.Spring] value must be non-zero for exponential springs");this.start={value:this.current.value,time:this.current.time};this.target={value:this.current.value,time:this.current.time};if(this._exponential){this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value);this.current._logValue=Math.log(this.current.value)}};a.Spring.prototype={resetTo:function(b){a.console.assert(!this._exponential||0!==b,"[OpenSeadragon.Spring.resetTo] target must be non-zero for exponential springs");this.start.value=this.target.value=this.current.value=b;this.start.time=this.target.time=this.current.time=a.now();if(this._exponential){this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value);this.current._logValue=Math.log(this.current.value)}},springTo:function(b){a.console.assert(!this._exponential||0!==b,"[OpenSeadragon.Spring.springTo] target must be non-zero for exponential springs");this.start.value=this.current.value;this.start.time=this.current.time;this.target.value=b;this.target.time=this.start.time+1e3*this.animationTime;if(this._exponential){this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value)}},shiftBy:function(b){this.start.value+=b;this.target.value+=b;if(this._exponential){a.console.assert(0!==this.target.value&&0!==this.start.value,"[OpenSeadragon.Spring.shiftBy] spring value must be non-zero for exponential springs");this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value)}},setExponential:function(b){this._exponential=b;if(this._exponential){a.console.assert(0!==this.current.value&&0!==this.target.value&&0!==this.start.value,"[OpenSeadragon.Spring.setExponential] spring value must be non-zero for exponential springs");this.start._logValue=Math.log(this.start.value);this.target._logValue=Math.log(this.target.value);this.current._logValue=Math.log(this.current.value)}},update:function(){this.current.time=a.now();var c,d;if(this._exponential){c=this.start._logValue;d=this.target._logValue}else{c=this.start.value;d=this.target.value}var e=this.current.time>=this.target.time?d:c+(d-c)*b(this.springStiffness,(this.current.time-this.start.time)/(this.target.time-this.start.time));this._exponential?this.current.value=Math.exp(e):this.current.value=e},isAtTargetValue:function(){return this.current.value===this.target.value}}}(OpenSeadragon);!function(a){function b(b){a.extend(!0,this,{timeout:a.DEFAULT_SETTINGS.timeout,jobId:null},b);this.image=null}function c(a,b,c){var d;a.jobsInProgress--;if((!a.jobLimit||a.jobsInProgress<a.jobLimit)&&a.jobQueue.length>0){d=a.jobQueue.shift();d.start();a.jobsInProgress++}c(b.image,b.errorMsg)}b.prototype={errorMsg:null,start:function(){var a=this;this.image=new Image;this.crossOriginPolicy!==!1&&(this.image.crossOrigin=this.crossOriginPolicy);this.image.onload=function(){a.finish(!0)};this.image.onabort=this.image.onerror=function(){a.errorMsg="Image load aborted";a.finish(!1)};this.jobId=window.setTimeout(function(){a.errorMsg="Image load exceeded timeout";a.finish(!1)},this.timeout);this.image.src=this.src},finish:function(a){this.image.onload=this.image.onerror=this.image.onabort=null;a||(this.image=null);this.jobId&&window.clearTimeout(this.jobId);this.callback(this)}};a.ImageLoader=function(b){a.extend(!0,this,{jobLimit:a.DEFAULT_SETTINGS.imageLoaderLimit,jobQueue:[],jobsInProgress:0},b)};a.ImageLoader.prototype={addJob:function(a){var d=this,e=function(b){c(d,b,a.callback)},f={src:a.src,crossOriginPolicy:a.crossOriginPolicy,callback:e,abort:a.abort},g=new b(f);if(!this.jobLimit||this.jobsInProgress<this.jobLimit){g.start();this.jobsInProgress++}else this.jobQueue.push(g)},clear:function(){for(var a=0;a<this.jobQueue.length;a++){var b=this.jobQueue[a];"function"==typeof b.abort&&b.abort()}this.jobQueue=[]}}}(OpenSeadragon);!function(a){a.Tile=function(a,b,c,d,e,f,g){this.level=a;this.x=b;this.y=c;this.bounds=d;this.exists=e;this.url=f;this.context2D=g;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},_hasTransparencyChannel:function(){return!!this.context2D||this.url.match(".png")},drawHTML:function(b){if(this.cacheImageRecord)if(this.loaded){if(!this.element){this.element=a.makeNeutralElement("div");this.imgElement=this.cacheImageRecord.getImage().cloneNode();this.imgElement.style.msInterpolationMode="nearest-neighbor";this.imgElement.style.width="100%";this.imgElement.style.height="100%";this.style=this.element.style;this.style.position="absolute"}this.element.parentNode!=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";a.setElementOpacity(this.element,this.opacity)}else a.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString());else a.console.warn("[Tile.drawHTML] attempting to draw tile %s when it's not cached",this.toString())},drawCanvas:function(b,c,d,e){var f,g=this.position.times(a.pixelDensityRatio),h=this.size.times(a.pixelDensityRatio);if(this.context2D||this.cacheImageRecord){f=this.context2D||this.cacheImageRecord.getRenderedContext();if(this.loaded&&f){b.save();b.globalAlpha=this.opacity;if("number"==typeof d&&1!==d){g=g.times(d);h=h.times(d)}e instanceof a.Point&&(g=g.plus(e));1===b.globalAlpha&&this._hasTransparencyChannel()&&b.clearRect(g.x+1,g.y+1,h.x-2,h.y-2);c({context:b,tile:this,rendered:f});b.drawImage(f.canvas,0,0,f.canvas.width,f.canvas.height,g.x,g.y,h.x,h.y);b.restore()}else a.console.warn("Attempting to draw tile %s when it's not yet loaded.",this.toString())}else a.console.warn("[Tile.drawCanvas] attempting to draw tile %s when it's not cached",this.toString())},getScaleForEdgeSmoothing:function(){var b;if(this.cacheImageRecord)b=this.cacheImageRecord.getRenderedContext();else{if(!this.context2D){a.console.warn("[Tile.drawCanvas] attempting to get tile scale %s when tile's not cached",this.toString());return 1}b=this.context2D}return b.canvas.width/(this.size.x*a.pixelDensityRatio)},getTranslationForEdgeSmoothing:function(b,c,d){var e=Math.max(1,Math.ceil((d.x-c.x)/2));var f=Math.max(1,Math.ceil((d.y-c.y)/2));return new a.Point(e,f).minus(this.position.times(a.pixelDensityRatio).times(b||1).apply(function(a){return a%1}))},unload:function(){this.imgElement&&this.imgElement.parentNode&&this.imgElement.parentNode.removeChild(this.imgElement);this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element);this.element=null;this.imgElement=null;this.loaded=!1;this.loading=!1}}}(OpenSeadragon);!function(a){a.OverlayPlacement=a.Placement;a.OverlayRotationMode=a.freezeObject({NO_ROTATION:1,EXACT:2,BOUNDING_BOX:3});a.Overlay=function(b,c,d){var e;e=a.isPlainObject(b)?b:{element:b,location:c,placement:d};this.element=e.element;this.style=e.element.style;this._init(e)};a.Overlay.prototype={_init:function(b){this.location=b.location;this.placement=void 0===b.placement?a.Placement.TOP_LEFT:b.placement;this.onDraw=b.onDraw;this.checkResize=void 0===b.checkResize?!0:b.checkResize;this.width=void 0===b.width?null:b.width;this.height=void 0===b.height?null:b.height;this.rotationMode=b.rotationMode||a.OverlayRotationMode.EXACT;if(this.location instanceof a.Rect){this.width=this.location.width;this.height=this.location.height;this.location=this.location.getTopLeft();this.placement=a.Placement.TOP_LEFT}this.scales=null!==this.width&&null!==this.height;this.bounds=new a.Rect(this.location.x,this.location.y,this.width,this.height);this.position=this.location},adjust:function(b,c){var d=a.Placement.properties[this.placement];if(d){d.isHorizontallyCentered?b.x-=c.x/2:d.isRight&&(b.x-=c.x);d.isVerticallyCentered?b.y-=c.y/2:d.isBottom&&(b.y-=c.y)}},destroy:function(){var b=this.element;var c=this.style;if(b.parentNode){b.parentNode.removeChild(b);if(b.prevElementParent){c.display="none";document.body.appendChild(b)}}this.onDraw=null;c.top="";c.left="";c.position="";null!==this.width&&(c.width="");null!==this.height&&(c.height="");var d=a.getCssPropertyWithVendorPrefix("transformOrigin");var e=a.getCssPropertyWithVendorPrefix("transform");if(d&&e){c[d]="";c[e]=""}},drawHTML:function(b,c){var d=this.element;if(d.parentNode!==b){d.prevElementParent=d.parentNode;d.prevNextSibling=d.nextSibling;b.appendChild(d);this.size=a.getElementSize(d)}var e=this._getOverlayPositionAndSize(c);var f=e.position;var g=this.size=e.size;var h=e.rotate;if(this.onDraw)this.onDraw(f,g,this.element);else{var i=this.style;i.left=f.x+"px";i.top=f.y+"px";null!==this.width&&(i.width=g.x+"px");null!==this.height&&(i.height=g.y+"px");var j=a.getCssPropertyWithVendorPrefix("transformOrigin");var k=a.getCssPropertyWithVendorPrefix("transform");if(j&&k)if(h){i[j]=this._getTransformOrigin();i[k]="rotate("+h+"deg)"}else{i[j]="";i[k]=""}i.position="absolute";"none"!==i.display&&(i.display="block")}},_getOverlayPositionAndSize:function(b){var c=b.pixelFromPoint(this.location,!0);var d=this._getSizeInPixels(b);this.adjust(c,d);var e=0;if(b.degrees&&this.rotationMode!==a.OverlayRotationMode.NO_ROTATION)if(this.rotationMode===a.OverlayRotationMode.BOUNDING_BOX&&null!==this.width&&null!==this.height){var f=new a.Rect(c.x,c.y,d.x,d.y);var g=this._getBoundingBox(f,b.degrees);c=g.getTopLeft();d=g.getSize()}else e=b.degrees;return{position:c,size:d,rotate:e}},_getSizeInPixels:function(b){var c=this.size.x;var d=this.size.y;if(null!==this.width||null!==this.height){var e=b.deltaPixelsFromPointsNoRotate(new a.Point(this.width||0,this.height||0),!0);null!==this.width&&(c=e.x);null!==this.height&&(d=e.y)}if(this.checkResize&&(null===this.width||null===this.height)){var f=this.size=a.getElementSize(this.element);null===this.width&&(c=f.x);null===this.height&&(d=f.y)}return new a.Point(c,d)},_getBoundingBox:function(a,b){var c=this._getPlacementPoint(a);return a.rotate(b,c).getBoundingBox()},_getPlacementPoint:function(b){var c=new a.Point(b.x,b.y);var d=a.Placement.properties[this.placement];if(d){d.isHorizontallyCentered?c.x+=b.width/2:d.isRight&&(c.x+=b.width);d.isVerticallyCentered?c.y+=b.height/2:d.isBottom&&(c.y+=b.height)}return c},_getTransformOrigin:function(){var b="";var c=a.Placement.properties[this.placement];if(!c)return b;c.isLeft?b="left":c.isRight&&(b="right");c.isTop?b+=" top":c.isBottom&&(b+=" bottom");return b},update:function(b,c){var d=a.isPlainObject(b)?b:{location:b,placement:c};this._init({location:d.location||this.location,placement:void 0!==d.placement?d.placement:this.placement,onDraw:d.onDraw||this.onDraw,checkResize:d.checkResize||this.checkResize,width:void 0!==d.width?d.width:this.width,height:void 0!==d.height?d.height:this.height,rotationMode:d.rotationMode||this.rotationMode})},getBounds:function(b){a.console.assert(b,"A viewport must now be passed to Overlay.getBounds.");var c=this.width;var d=this.height;if(null===c||null===d){var e=b.deltaPointsFromPixelsNoRotate(this.size,!0);null===c&&(c=e.x);null===d&&(d=e.y)}var f=this.location.clone();this.adjust(f,new a.Point(c,d));return this._adjustBoundsForRotation(b,new a.Rect(f.x,f.y,c,d))},_adjustBoundsForRotation:function(b,c){if(!b||0===b.degrees||this.rotationMode===a.OverlayRotationMode.EXACT)return c;if(this.rotationMode===a.OverlayRotationMode.BOUNDING_BOX){if(null===this.width||null===this.height)return c;var d=this._getOverlayPositionAndSize(b);return b.viewerElementToViewportRectangle(new a.Rect(d.position.x,d.position.y,d.size.x,d.size.y))}return c.rotate(-b.degrees,this._getPlacementPoint(c))}}}(OpenSeadragon);!function(a){a.Drawer=function(b){a.console.assert(b.viewer,"[Drawer] options.viewer is required");var c=arguments;a.isPlainObject(b)||(b={source:c[0],viewport:c[1],element:c[2]});a.console.assert(b.viewport,"[Drawer] options.viewport is required");a.console.assert(b.element,"[Drawer] options.element is required");b.source&&a.console.error("[Drawer] options.source is no longer accepted; use TiledImage instead");this.viewer=b.viewer;this.viewport=b.viewport;this.debugGridColor=b.debugGridColor||a.DEFAULT_SETTINGS.debugGridColor;b.opacity&&a.console.error("[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead");this.useCanvas=a.supportsCanvas&&(this.viewer?this.viewer.useCanvas:!0);this.container=a.getElement(b.element);this.canvas=a.makeNeutralElement(this.useCanvas?"canvas":"div");this.context=this.useCanvas?this.canvas.getContext("2d"):null;this.sketchCanvas=null;this.sketchContext=null;this.element=this.container;this.container.dir="ltr";if(this.useCanvas){var d=this._calculateCanvasSize();this.canvas.width=d.x;this.canvas.height=d.y}this.canvas.style.width="100%";this.canvas.style.height="100%";this.canvas.style.position="absolute";a.setElementOpacity(this.canvas,this.opacity,!0);this.container.style.textAlign="left";this.container.appendChild(this.canvas)};a.Drawer.prototype={addOverlay:function(b,c,d,e){a.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead.");this.viewer.addOverlay(b,c,d,e);return this},updateOverlay:function(b,c,d){a.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.");this.viewer.updateOverlay(b,c,d);return this},removeOverlay:function(b){a.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.");this.viewer.removeOverlay(b);return this},clearOverlays:function(){a.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.");this.viewer.clearOverlays();return this},setOpacity:function(b){a.console.error("drawer.setOpacity is deprecated. Use tiledImage.setOpacity instead.");var c=this.viewer.world;for(var d=0;d<c.getItemCount();d++)c.getItemAt(d).setOpacity(b);return this},getOpacity:function(){a.console.error("drawer.getOpacity is deprecated. Use tiledImage.getOpacity instead.");var b=this.viewer.world;var c=0;for(var d=0;d<b.getItemCount();d++){var e=b.getItemAt(d).getOpacity();e>c&&(c=e)}return c},needsUpdate:function(){a.console.error("[Drawer.needsUpdate] this function is deprecated. Use World.needsDraw instead.");return this.viewer.world.needsDraw()},numTilesLoaded:function(){a.console.error("[Drawer.numTilesLoaded] this function is deprecated. Use TileCache.numTilesLoaded instead.");return this.viewer.tileCache.numTilesLoaded()},reset:function(){a.console.error("[Drawer.reset] this function is deprecated. Use World.resetItems instead.");this.viewer.world.resetItems();return this},update:function(){a.console.error("[Drawer.update] this function is deprecated. Use Drawer.clear and World.draw instead.");this.clear();this.viewer.world.draw();return this},canRotate:function(){return this.useCanvas},destroy:function(){this.canvas.width=1;this.canvas.height=1;this.sketchCanvas=null;this.sketchContext=null},clear:function(){this.canvas.innerHTML="";if(this.useCanvas){var a=this._calculateCanvasSize();if(this.canvas.width!=a.x||this.canvas.height!=a.y){this.canvas.width=a.x;this.canvas.height=a.y;if(null!==this.sketchCanvas){var b=this._calculateSketchCanvasSize();this.sketchCanvas.width=b.x;this.sketchCanvas.height=b.y}}this._clear()}},_clear:function(a,b){if(this.useCanvas){var c=this._getContext(a);if(b)c.clearRect(b.x,b.y,b.width,b.height);else{var d=c.canvas;c.clearRect(0,0,d.width,d.height);
-}}},viewportToDrawerRectangle:function(b){var c=this.viewport.pixelFromPointNoRotate(b.getTopLeft(),!0);var d=this.viewport.deltaPixelsFromPointsNoRotate(b.getSize(),!0);return new a.Rect(c.x*a.pixelDensityRatio,c.y*a.pixelDensityRatio,d.x*a.pixelDensityRatio,d.y*a.pixelDensityRatio)},drawTile:function(b,c,d,e,f){a.console.assert(b,"[Drawer.drawTile] tile is required");a.console.assert(c,"[Drawer.drawTile] drawingHandler is required");if(this.useCanvas){var g=this._getContext(d);e=e||1;b.drawCanvas(g,c,e,f)}else b.drawHTML(this.canvas)},_getContext:function(a){var b=this.context;if(a){if(null===this.sketchCanvas){this.sketchCanvas=document.createElement("canvas");var c=this._calculateSketchCanvasSize();this.sketchCanvas.width=c.x;this.sketchCanvas.height=c.y;this.sketchContext=this.sketchCanvas.getContext("2d");if(0===this.viewport.getRotation()){var d=this;this.viewer.addHandler("rotate",function e(){d.viewer.removeHandler("rotate",e);var a=d._calculateSketchCanvasSize();d.sketchCanvas.width=a.x;d.sketchCanvas.height=a.y})}}b=this.sketchContext}return b},saveContext:function(a){this.useCanvas&&this._getContext(a).save()},restoreContext:function(a){this.useCanvas&&this._getContext(a).restore()},setClip:function(a,b){if(this.useCanvas){var c=this._getContext(b);c.beginPath();c.rect(a.x,a.y,a.width,a.height);c.clip()}},drawRectangle:function(a,b,c){if(this.useCanvas){var d=this._getContext(c);d.save();d.fillStyle=b;d.fillRect(a.x,a.y,a.width,a.height);d.restore()}},blendSketch:function(b,c,d,e){var f=b;a.isPlainObject(f)||(f={opacity:b,scale:c,translate:d,compositeOperation:e});if(this.useCanvas&&this.sketchCanvas){b=f.opacity;e=f.compositeOperation;var g=f.bounds;this.context.save();this.context.globalAlpha=b;e&&(this.context.globalCompositeOperation=e);if(g)this.context.drawImage(this.sketchCanvas,g.x,g.y,g.width,g.height,g.x,g.y,g.width,g.height);else{c=f.scale||1;d=f.translate;var h=d instanceof a.Point?d:new a.Point(0,0);var i=0;var j=0;if(d){var k=this.sketchCanvas.width-this.canvas.width;var l=this.sketchCanvas.height-this.canvas.height;i=Math.round(k/2);j=Math.round(l/2)}this.context.drawImage(this.sketchCanvas,h.x-i*c,h.y-j*c,(this.canvas.width+2*i)*c,(this.canvas.height+2*j)*c,-i,-j,this.canvas.width+2*i,this.canvas.height+2*j)}this.context.restore()}},drawDebugInfo:function(b,c,d){if(this.useCanvas){var e=this.context;e.save();e.lineWidth=2*a.pixelDensityRatio;e.font="small-caps bold "+13*a.pixelDensityRatio+"px arial";e.strokeStyle=this.debugGridColor;e.fillStyle=this.debugGridColor;0!==this.viewport.degrees&&this._offsetForRotation(this.viewport.degrees);e.strokeRect(b.position.x*a.pixelDensityRatio,b.position.y*a.pixelDensityRatio,b.size.x*a.pixelDensityRatio,b.size.y*a.pixelDensityRatio);var f=(b.position.x+b.size.x/2)*a.pixelDensityRatio;var g=(b.position.y+b.size.y/2)*a.pixelDensityRatio;e.translate(f,g);e.rotate(Math.PI/180*-this.viewport.degrees);e.translate(-f,-g);if(0===b.x&&0===b.y){e.fillText("Zoom: "+this.viewport.getZoom(),b.position.x*a.pixelDensityRatio,(b.position.y-30)*a.pixelDensityRatio);e.fillText("Pan: "+this.viewport.getBounds().toString(),b.position.x*a.pixelDensityRatio,(b.position.y-20)*a.pixelDensityRatio)}e.fillText("Level: "+b.level,(b.position.x+10)*a.pixelDensityRatio,(b.position.y+20)*a.pixelDensityRatio);e.fillText("Column: "+b.x,(b.position.x+10)*a.pixelDensityRatio,(b.position.y+30)*a.pixelDensityRatio);e.fillText("Row: "+b.y,(b.position.x+10)*a.pixelDensityRatio,(b.position.y+40)*a.pixelDensityRatio);e.fillText("Order: "+d+" of "+c,(b.position.x+10)*a.pixelDensityRatio,(b.position.y+50)*a.pixelDensityRatio);e.fillText("Size: "+b.size.toString(),(b.position.x+10)*a.pixelDensityRatio,(b.position.y+60)*a.pixelDensityRatio);e.fillText("Position: "+b.position.toString(),(b.position.x+10)*a.pixelDensityRatio,(b.position.y+70)*a.pixelDensityRatio);0!==this.viewport.degrees&&this._restoreRotationChanges();e.restore()}},debugRect:function(b){if(this.useCanvas){var c=this.context;c.save();c.lineWidth=2*a.pixelDensityRatio;c.strokeStyle=this.debugGridColor;c.fillStyle=this.debugGridColor;c.strokeRect(b.x*a.pixelDensityRatio,b.y*a.pixelDensityRatio,b.width*a.pixelDensityRatio,b.height*a.pixelDensityRatio);c.restore()}},getCanvasSize:function(b){var c=this._getContext(b).canvas;return new a.Point(c.width,c.height)},_offsetForRotation:function(a,b){var c=this.canvas.width/2;var d=this.canvas.height/2;var e=this._getContext(b);e.save();e.translate(c,d);e.rotate(Math.PI/180*a);e.translate(-c,-d)},_restoreRotationChanges:function(a){var b=this._getContext(a);b.restore()},_calculateCanvasSize:function(){var b=a.pixelDensityRatio;var c=this.viewport.getContainerSize();return{x:c.x*b,y:c.y*b}},_calculateSketchCanvasSize:function(){var a=this._calculateCanvasSize();if(0===this.viewport.getRotation())return a;var b=Math.ceil(Math.sqrt(a.x*a.x+a.y*a.y));return{x:b,y:b}}}}(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]});if(b.config){a.extend(!0,b,b.config);delete b.config}this._margins=a.extend({left:0,top:0,right:0,bottom:0},b.margins||{});delete b.margins;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,homeFillsViewer:a.DEFAULT_SETTINGS.homeFillsViewer},b);this._updateContainerInnerSize();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({exponential:!0,initial:1,springStiffness:this.springStiffness,animationTime:this.animationTime});this._oldCenterX=this.centerSpringX.current.value;this._oldCenterY=this.centerSpringY.current.value;this._oldZoom=this.zoomSpring.current.value;this._setContentBounds(new a.Rect(0,0,1,1),1);this.goHome(!0);this.update()};a.Viewport.prototype={resetContentSize:function(b){a.console.assert(b,"[Viewport.resetContentSize] contentSize is required");a.console.assert(b instanceof a.Point,"[Viewport.resetContentSize] contentSize must be an OpenSeadragon.Point");a.console.assert(b.x>0,"[Viewport.resetContentSize] contentSize.x must be greater than 0");a.console.assert(b.y>0,"[Viewport.resetContentSize] contentSize.y must be greater than 0");this._setContentBounds(new a.Rect(0,0,1,b.y/b.x),b.x);return this},setHomeBounds:function(b,c){a.console.error("[Viewport.setHomeBounds] this function is deprecated; The content bounds should not be set manually.");this._setContentBounds(b,c)},_setContentBounds:function(b,c){a.console.assert(b,"[Viewport._setContentBounds] bounds is required");a.console.assert(b instanceof a.Rect,"[Viewport._setContentBounds] bounds must be an OpenSeadragon.Rect");a.console.assert(b.width>0,"[Viewport._setContentBounds] bounds.width must be greater than 0");a.console.assert(b.height>0,"[Viewport._setContentBounds] bounds.height must be greater than 0");this._contentBoundsNoRotate=b.clone();this._contentSizeNoRotate=this._contentBoundsNoRotate.getSize().times(c);this._contentBounds=b.rotate(this.degrees).getBoundingBox();this._contentSize=this._contentBounds.getSize().times(c);this._contentAspectRatio=this._contentSize.x/this._contentSize.y;this.viewer&&this.viewer.raiseEvent("reset-size",{contentSize:this._contentSizeNoRotate.clone(),contentFactor:c,homeBounds:this._contentBoundsNoRotate.clone(),contentBounds:this._contentBounds.clone()})},getHomeZoom:function(){if(this.defaultZoomLevel)return this.defaultZoomLevel;var a=this._contentAspectRatio/this.getAspectRatio();var b;b=this.homeFillsViewer?a>=1?a:1:a>=1?1:a;return b/this._contentBounds.width},getHomeBounds:function(){return this.getHomeBoundsNoRotate().rotate(-this.getRotation())},getHomeBoundsNoRotate:function(){var b=this._contentBounds.getCenter();var c=1/this.getHomeZoom();var d=c/this.getAspectRatio();return new a.Rect(b.x-c/2,b.y-d/2,c,d)},goHome:function(a){this.viewer&&this.viewer.raiseEvent("home",{immediately:a});return this.fitBounds(this.getHomeBounds(),a)},getMinZoom:function(){var a=this.getHomeZoom(),b=this.minZoomLevel?this.minZoomLevel:this.minZoomImageRatio*a;return b},getMaxZoom:function(){var a=this.maxZoomLevel;if(!a){a=this._contentSize.x*this.maxZoomPixelRatio/this._containerInnerSize.x;a/=this._contentBounds.width}return Math.max(a,this.getHomeZoom())},getAspectRatio:function(){return this._containerInnerSize.x/this._containerInnerSize.y},getContainerSize:function(){return new a.Point(this.containerSize.x,this.containerSize.y)},getMargins:function(){return a.extend({},this._margins)},setMargins:function(b){a.console.assert("object"===a.type(b),"[Viewport.setMargins] margins must be an object");this._margins=a.extend({left:0,top:0,right:0,bottom:0},b);this._updateContainerInnerSize();this.viewer&&this.viewer.forceRedraw()},getBounds:function(a){return this.getBoundsNoRotate(a).rotate(-this.getRotation())},getBoundsNoRotate:function(b){var c=this.getCenter(b);var d=1/this.getZoom(b);var e=d/this.getAspectRatio();return new a.Rect(c.x-d/2,c.y-e/2,d,e)},getBoundsWithMargins:function(a){return this.getBoundsNoRotateWithMargins(a).rotate(-this.getRotation(),this.getCenter(a))},getBoundsNoRotateWithMargins:function(a){var b=this.getBoundsNoRotate(a);var c=this._containerInnerSize.x*this.getZoom(a);b.x-=this._margins.left/c;b.y-=this._margins.top/c;b.width+=(this._margins.left+this._margins.right)/c;b.height+=(this._margins.top+this._margins.bottom)/c;return b},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);if(b)return k;if(!this.zoomPoint)return l;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._pixelFromPoint(this.zoomPoint,g);i=h.minus(c);j=i.divide(this._containerInnerSize.x*d);return l.plus(j)},getZoom:function(a){return a?this.zoomSpring.current.value:this.zoomSpring.target.value},_applyZoomConstraints:function(a){return Math.max(Math.min(a,this.getMaxZoom()),this.getMinZoom())},_applyBoundaryConstraints:function(b,c){var d=new a.Rect(b.x,b.y,b.width,b.height);if(this.wrapHorizontal);else{var e=this.visibilityRatio*d.width;var f=d.x+d.width;var g=this._contentBoundsNoRotate.x+this._contentBoundsNoRotate.width;var h=this._contentBoundsNoRotate.x-f+e;var i=g-d.x-e;e>this._contentBoundsNoRotate.width?d.x+=(h+i)/2:0>i?d.x+=i:h>0&&(d.x+=h)}if(this.wrapVertical);else{var j=this.visibilityRatio*d.height;var k=d.y+d.height;var l=this._contentBoundsNoRotate.y+this._contentBoundsNoRotate.height;var m=this._contentBoundsNoRotate.y-k+j;var n=l-d.y-j;j>this._contentBoundsNoRotate.height?d.y+=(m+n)/2:0>n?d.y+=n:m>0&&(d.y+=m)}this.viewer&&this.viewer.raiseEvent("constrain",{immediately:c});return d},applyConstraints:function(a){var b=this.getZoom();var c=this._applyZoomConstraints(b);b!==c&&this.zoomTo(c,this.zoomPoint,a);var d=this.getBoundsNoRotate();var e=this._applyBoundaryConstraints(d,a);(d.x!==e.x||d.y!==e.y||a)&&this.fitBounds(e.rotate(-this.getRotation()),a);return this},ensureVisible:function(a){return this.applyConstraints(a)},_fitBounds:function(b,c){c=c||{};var d=c.immediately||!1;var e=c.constraints||!1;var f=this.getAspectRatio();var g=b.getCenter();var h=new a.Rect(b.x,b.y,b.width,b.height,b.degrees+this.getRotation()).getBoundingBox();h.getAspectRatio()>=f?h.height=h.width/f:h.width=h.height*f;h.x=g.x-h.width/2;h.y=g.y-h.height/2;var i=1/h.width;if(e){var j=h.getAspectRatio();var k=this._applyZoomConstraints(i);if(i!==k){i=k;h.width=1/i;h.x=g.x-h.width/2;h.height=h.width/j;h.y=g.y-h.height/2}h=this._applyBoundaryConstraints(h,d);g=h.getCenter()}if(d){this.panTo(g,!0);return this.zoomTo(i,null,!0)}this.panTo(this.getCenter(!0),!0);this.zoomTo(this.getZoom(!0),null,!0);var l=this.getBounds();var m=this.getZoom();if(0===m||Math.abs(i/m-1)<1e-8){this.zoomTo(i,!0);return this.panTo(g,d)}h=h.rotate(-this.getRotation());var n=h.getTopLeft().times(i).minus(l.getTopLeft().times(m)).divide(i-m);return this.zoomTo(i,n,d)},fitBounds:function(a,b){return this._fitBounds(a,{immediately:b,constraints:!1})},fitBoundsWithConstraints:function(a,b){return this._fitBounds(a,{immediately:b,constraints:!0})},fitVertically:function(b){var c=new a.Rect(this._contentBounds.x+this._contentBounds.width/2,this._contentBounds.y,0,this._contentBounds.height);return this.fitBounds(c,b)},fitHorizontally:function(b){var c=new a.Rect(this._contentBounds.x,this._contentBounds.y+this._contentBounds.height/2,this._contentBounds.width,0);return this.fitBounds(c,b)},panBy:function(b,c){var d=new a.Point(this.centerSpringX.target.value,this.centerSpringY.target.value);return this.panTo(d.plus(b),c)},panTo:function(a,b){if(b){this.centerSpringX.resetTo(a.x);this.centerSpringY.resetTo(a.y)}else{this.centerSpringX.springTo(a.x);this.centerSpringY.springTo(a.y)}this.viewer&&this.viewer.raiseEvent("pan",{center:a,immediately:b});return this},zoomBy:function(a,b,c){return this.zoomTo(this.zoomSpring.target.value*a,b,c)},zoomTo:function(b,c,d){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});return this},setRotation:function(a){if(!this.viewer||!this.viewer.drawer.canRotate())return this;a%=360;0>a&&(a+=360);this.degrees=a;this._setContentBounds(this.viewer.world.getHomeBounds(),this.viewer.world.getContentFactor());this.viewer.forceRedraw();this.viewer.raiseEvent("rotate",{degrees:a});return this},getRotation:function(){return this.degrees},resize:function(a,b){var c,d=this.getBoundsNoRotate(),e=d;this.containerSize.x=a.x;this.containerSize.y=a.y;this._updateContainerInnerSize();if(b){c=a.x/this.containerSize.x;e.width=d.width*c;e.height=e.width/this.getAspectRatio()}this.viewer&&this.viewer.raiseEvent("resize",{newContainerSize:a,maintain:b});return this.fitBounds(e,!0)},_updateContainerInnerSize:function(){this._containerInnerSize=new a.Point(Math.max(1,this.containerSize.x-(this._margins.left+this._margins.right)),Math.max(1,this.containerSize.y-(this._margins.top+this._margins.bottom)))},update:function(){if(this.zoomPoint){var a=this.pixelFromPoint(this.zoomPoint,!0);this.zoomSpring.update();var b=this.pixelFromPoint(this.zoomPoint,!0);var c=b.minus(a);var d=this.deltaPointsFromPixels(c,!0);this.centerSpringX.shiftBy(d.x);this.centerSpringY.shiftBy(d.y);this.zoomSpring.isAtTargetValue()&&(this.zoomPoint=null)}else this.zoomSpring.update();this.centerSpringX.update();this.centerSpringY.update();var e=this.centerSpringX.current.value!==this._oldCenterX||this.centerSpringY.current.value!==this._oldCenterY||this.zoomSpring.current.value!==this._oldZoom;this._oldCenterX=this.centerSpringX.current.value;this._oldCenterY=this.centerSpringY.current.value;this._oldZoom=this.zoomSpring.current.value;return e},deltaPixelsFromPointsNoRotate:function(a,b){return a.times(this._containerInnerSize.x*this.getZoom(b))},deltaPixelsFromPoints:function(a,b){return this.deltaPixelsFromPointsNoRotate(a.rotate(this.getRotation()),b)},deltaPointsFromPixelsNoRotate:function(a,b){return a.divide(this._containerInnerSize.x*this.getZoom(b))},deltaPointsFromPixels:function(a,b){return this.deltaPointsFromPixelsNoRotate(a,b).rotate(-this.getRotation())},pixelFromPointNoRotate:function(a,b){return this._pixelFromPointNoRotate(a,this.getBoundsNoRotate(b))},pixelFromPoint:function(a,b){return this._pixelFromPoint(a,this.getBoundsNoRotate(b))},_pixelFromPointNoRotate:function(b,c){return b.minus(c.getTopLeft()).times(this._containerInnerSize.x/c.width).plus(new a.Point(this._margins.left,this._margins.top))},_pixelFromPoint:function(a,b){return this._pixelFromPointNoRotate(a.rotate(this.getRotation(),this.getCenter(!0)),b)},pointFromPixelNoRotate:function(b,c){var d=this.getBoundsNoRotate(c);return b.minus(new a.Point(this._margins.left,this._margins.top)).divide(this._containerInnerSize.x/d.width).plus(d.getTopLeft())},pointFromPixel:function(a,b){return this.pointFromPixelNoRotate(a,b).rotate(-this.getRotation(),this.getCenter(!0))},_viewportToImageDelta:function(b,c){var d=this._contentBoundsNoRotate.width;return new a.Point(b*this._contentSizeNoRotate.x/d,c*this._contentSizeNoRotate.x/d)},viewportToImageCoordinates:function(b,c){if(b instanceof a.Point)return this.viewportToImageCoordinates(b.x,b.y);if(this.viewer){var d=this.viewer.world.getItemCount();if(d>1)a.console.error("[Viewport.viewportToImageCoordinates] is not accurate with multi-image; use TiledImage.viewportToImageCoordinates instead.");else if(1===d){var e=this.viewer.world.getItemAt(0);return e.viewportToImageCoordinates(b,c,!0)}}return this._viewportToImageDelta(b-this._contentBoundsNoRotate.x,c-this._contentBoundsNoRotate.y)},_imageToViewportDelta:function(b,c){var d=this._contentBoundsNoRotate.width;return new a.Point(b/this._contentSizeNoRotate.x*d,c/this._contentSizeNoRotate.x*d)},imageToViewportCoordinates:function(b,c){if(b instanceof a.Point)return this.imageToViewportCoordinates(b.x,b.y);if(this.viewer){var d=this.viewer.world.getItemCount();if(d>1)a.console.error("[Viewport.imageToViewportCoordinates] is not accurate with multi-image; use TiledImage.imageToViewportCoordinates instead.");else if(1===d){var e=this.viewer.world.getItemAt(0);return e.imageToViewportCoordinates(b,c,!0)}}var f=this._imageToViewportDelta(b,c);f.x+=this._contentBoundsNoRotate.x;f.y+=this._contentBoundsNoRotate.y;return f},imageToViewportRectangle:function(b,c,d,e){var f=b;f instanceof a.Rect||(f=new a.Rect(b,c,d,e));if(this.viewer){var g=this.viewer.world.getItemCount();if(g>1)a.console.error("[Viewport.imageToViewportRectangle] is not accurate with multi-image; use TiledImage.imageToViewportRectangle instead.");else if(1===g){var h=this.viewer.world.getItemAt(0);return h.imageToViewportRectangle(b,c,d,e,!0)}}var i=this.imageToViewportCoordinates(f.x,f.y);var j=this._imageToViewportDelta(f.width,f.height);return new a.Rect(i.x,i.y,j.x,j.y,f.degrees)},viewportToImageRectangle:function(b,c,d,e){var f=b;f instanceof a.Rect||(f=new a.Rect(b,c,d,e));if(this.viewer){var g=this.viewer.world.getItemCount();if(g>1)a.console.error("[Viewport.viewportToImageRectangle] is not accurate with multi-image; use TiledImage.viewportToImageRectangle instead.");else if(1===g){var h=this.viewer.world.getItemAt(0);return h.viewportToImageRectangle(b,c,d,e,!0)}}var i=this.viewportToImageCoordinates(f.x,f.y);var j=this._viewportToImageDelta(f.width,f.height);return new a.Rect(i.x,i.y,j.x,j.y,f.degrees)},viewerElementToImageCoordinates:function(a){var b=this.pointFromPixel(a,!0);return this.viewportToImageCoordinates(b)},imageToViewerElementCoordinates:function(a){var b=this.imageToViewportCoordinates(a);return this.pixelFromPoint(b,!0)},windowToImageCoordinates:function(b){a.console.assert(this.viewer,"[Viewport.windowToImageCoordinates] the viewport must have a viewer.");var c=b.minus(a.getElementPosition(this.viewer.element));return this.viewerElementToImageCoordinates(c)},imageToWindowCoordinates:function(b){a.console.assert(this.viewer,"[Viewport.imageToWindowCoordinates] the viewport must have a viewer.");var c=this.imageToViewerElementCoordinates(b);return c.plus(a.getElementPosition(this.viewer.element))},viewerElementToViewportCoordinates:function(a){return this.pointFromPixel(a,!0)},viewportToViewerElementCoordinates:function(a){return this.pixelFromPoint(a,!0)},viewerElementToViewportRectangle:function(b){return a.Rect.fromSummits(this.pointFromPixel(b.getTopLeft(),!0),this.pointFromPixel(b.getTopRight(),!0),this.pointFromPixel(b.getBottomLeft(),!0))},viewportToViewerElementRectangle:function(b){return a.Rect.fromSummits(this.pixelFromPoint(b.getTopLeft(),!0),this.pixelFromPoint(b.getTopRight(),!0),this.pixelFromPoint(b.getBottomLeft(),!0))},windowToViewportCoordinates:function(b){a.console.assert(this.viewer,"[Viewport.windowToViewportCoordinates] the viewport must have a viewer.");var c=b.minus(a.getElementPosition(this.viewer.element));return this.viewerElementToViewportCoordinates(c)},viewportToWindowCoordinates:function(b){a.console.assert(this.viewer,"[Viewport.viewportToWindowCoordinates] the viewport must have a viewer.");var c=this.viewportToViewerElementCoordinates(b);return c.plus(a.getElementPosition(this.viewer.element))},viewportToImageZoom:function(b){if(this.viewer){var c=this.viewer.world.getItemCount();if(c>1)a.console.error("[Viewport.viewportToImageZoom] is not accurate with multi-image.");else if(1===c){var d=this.viewer.world.getItemAt(0);return d.viewportToImageZoom(b)}}var e=this._contentSizeNoRotate.x;var f=this._containerInnerSize.x;var g=this._contentBoundsNoRotate.width;var h=f/e*g;return b*h},imageToViewportZoom:function(b){if(this.viewer){var c=this.viewer.world.getItemCount();if(c>1)a.console.error("[Viewport.imageToViewportZoom] is not accurate with multi-image.");else if(1===c){var d=this.viewer.world.getItemAt(0);return d.imageToViewportZoom(b)}}var e=this._contentSizeNoRotate.x;var f=this._containerInnerSize.x;var g=this._contentBoundsNoRotate.width;var h=e/f/g;return b*h}}}(OpenSeadragon);!function(a){function b(b){b._needsDraw=!1;var d,e,g,h,i,j,l,m,n=null,o=!1,q=a.now(),r=b.viewport.getBoundsWithMargins(!0),s=b.viewport.deltaPixelsFromPointsNoRotate(b.source.getPixelRatio(0),!0).x*b._scaleSpring.current.value,t=Math.max(b.source.minLevel,Math.floor(Math.log(b.minZoomImageRatio)/Math.log(2))),u=Math.min(Math.abs(b.source.maxLevel),Math.abs(Math.floor(Math.log(s/b.minPixelRatio)/Math.log(2))));for(;b.lastDrawn.length>0;){d=b.lastDrawn.pop();d.beingDrawn=!1}if(!b.wrapHorizontal&&!b.wrapVertical){var v=b.getClippedBounds(!0);var w=r.intersection(v);if(null===w)return;r=w}r=r.getBoundingBox();r.x-=b._xSpring.current.value;r.y-=b._ySpring.current.value;var x=r.getTopLeft();var y=r.getBottomRight();if((b.wrapHorizontal||!(y.x<0||x.x>b._worldWidthCurrent))&&(b.wrapVertical||!(y.y<0||x.y>b._worldHeightCurrent))){if(!b.wrapHorizontal){x.x=Math.max(x.x,0);y.x=Math.min(y.x,b._worldWidthCurrent)}if(!b.wrapVertical){x.y=Math.max(x.y,0);y.y=Math.min(y.y,b._worldHeightCurrent)}t=Math.min(t,u);var z;for(e=u;e>=t;e--){z=!1;g=b.viewport.deltaPixelsFromPointsNoRotate(b.source.getPixelRatio(e),!0).x*b._scaleSpring.current.value;if(!o&&g>=b.minPixelRatio||e==t){z=!0;o=!0}else if(!o)continue;h=b.viewport.deltaPixelsFromPointsNoRotate(b.source.getPixelRatio(e),!1).x*b._scaleSpring.current.value;i=b.viewport.deltaPixelsFromPointsNoRotate(b.source.getPixelRatio(Math.max(b.source.getClosestLevel(b.viewport.containerSize)-1,0)),!1).x*b._scaleSpring.current.value;j=b.immediateRender?1:i;l=Math.min(1,(g-.5)/.5);m=j/Math.abs(j-h);n=c(b,o,z,e,l,m,x,y,q,n);if(k(b.coverage,e))break}p(b,b.lastDrawn);n&&!n.context2D&&f(b,n,q)}}function c(a,b,c,e,f,g,h,i,j,k){var l,m,o,p,q,r=a.viewport.pixelFromPoint(a.viewport.getCenter());a.viewer&&a.viewer.raiseEvent("update-level",{tiledImage:a,havedrawn:b,level:e,opacity:f,visibility:g,topleft:h,bottomright:i,currenttime:j,best:k});o=a.source.getTileAtPoint(e,h.divide(a._scaleSpring.current.value));p=a.source.getTileAtPoint(e,i.divide(a._scaleSpring.current.value));q=a.source.getNumTiles(e);n(a.coverage,e);a.wrapHorizontal||(p.x=Math.min(p.x,q.x-1));a.wrapVertical||(p.y=Math.min(p.y,q.y-1));for(l=o.x;l<=p.x;l++)for(m=o.y;m<=p.y;m++)k=d(a,c,b,l,m,e,f,g,r,q,j,k);return k}function d(a,b,c,d,f,g,k,n,p,q,r,s){var t=e(d,f,g,a.source,a.tilesMatrix,r,q,a._worldWidthCurrent,a._worldHeightCurrent),u=b;a.viewer&&a.viewer.raiseEvent("update-tile",{tiledImage:a,tile:t});m(a.coverage,g,d,f,!1);if(!t.exists)return s;c&&!u&&(l(a.coverage,g,d,f)?m(a.coverage,g,d,f,!0):u=!0);if(!u)return s;i(t,a.source.tileOverlap,a.viewport,p,n,a);if(!t.loaded)if(t.context2D)h(a,t);else{var v=a._tileCache.getImageRecord(t.url);if(v){var w=v.getImage();h(a,t,w)}}if(t.loaded){var x=j(a,t,d,f,g,k,r);x&&(a._needsDraw=!0)}else t.loading||(s=o(s,t));return s}function e(b,c,d,e,f,g,h,i,j){var k,l,m,n,o,p,q;f[d]||(f[d]={});f[d][b]||(f[d][b]={});if(!f[d][b][c]){k=(h.x+b%h.x)%h.x;l=(h.y+c%h.y)%h.y;m=e.getTileBounds(d,k,l);n=e.tileExists(d,k,l);o=e.getTileUrl(d,k,l);p=e.getContext2D?e.getContext2D(d,k,l):void 0;m.x+=(b-k)/h.x;m.y+=j/i*((c-l)/h.y);f[d][b][c]=new a.Tile(d,b,c,m,n,o,p)}q=f[d][b][c];q.lastTouchTime=g;return q}function f(a,b,c){b.loading=!0;a._imageLoader.addJob({src:b.url,crossOriginPolicy:a.crossOriginPolicy,callback:function(d,e){g(a,b,c,d,e)},abort:function(){b.loading=!1}})}function g(b,c,d,e,f){if(e)if(d<b.lastResetTime){a.console.log("Ignoring tile %s loaded before reset: %s",c,c.url);c.loading=!1}else{var g=function(){var a=Math.ceil(Math.log(b.source.getTileWidth(c.level))/Math.log(2));h(b,c,e,a)};b._midDraw?window.setTimeout(g,1):g()}else{a.console.log("Tile %s failed to load: %s - error: %s",c,c.url,f);b.viewer.raiseEvent("tile-load-failed",{tile:c,tiledImage:b,time:d,message:f});c.loading=!1;c.exists=!1}}function h(a,b,c,d){function e(){g++;return f}function f(){g--;if(0===g){b.loading=!1;b.loaded=!0;b.context2D||a._tileCache.cacheTile({image:c,tile:b,cutoff:d,tiledImage:a});a._needsDraw=!0}}var g=0;a.viewer.raiseEvent("tile-loaded",{tile:b,tiledImage:a,image:c,getCompletionCallback:e});e()()}function i(b,c,d,e,f,g){var h=b.bounds.getTopLeft();h.x*=g._scaleSpring.current.value;h.y*=g._scaleSpring.current.value;h.x+=g._xSpring.current.value;h.y+=g._ySpring.current.value;var i=b.bounds.getSize();i.x*=g._scaleSpring.current.value;i.y*=g._scaleSpring.current.value;var j=d.pixelFromPointNoRotate(h,!0),k=d.pixelFromPointNoRotate(h,!1),l=d.deltaPixelsFromPointsNoRotate(i,!0),m=d.deltaPixelsFromPointsNoRotate(i,!1),n=k.plus(m.divide(2)),o=e.distanceTo(n);c||(l=l.plus(new a.Point(1,1)));b.position=j;b.size=l;b.distance=o;b.visibility=f}function j(a,b,c,d,e,f,g){var h,i,j=1e3*a.blendTime;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);if(1==i){m(a.coverage,e,c,d,!0);a._hasOpaqueTile=!0}else if(j>h)return!0;return!1}function k(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 l(a,b,c,d){return void 0===c||void 0===d?k(a,b+1):k(a,b+1,2*c,2*d)&&k(a,b+1,2*c,2*d+1)&&k(a,b+1,2*c+1,2*d)&&k(a,b+1,2*c+1,2*d+1)}function m(b,c,d,e,f){if(b[c]){b[c][d]||(b[c][d]={});b[c][d][e]=f}else a.console.warn("Setting coverage for a tile before its level's coverage has been reset: %s",c)}function n(a,b){a[b]={}}function o(a,b){return a?b.visibility>a.visibility?b:b.visibility==a.visibility&&b.distance<a.distance?b:a:b}function p(b,c){if(0!==c.length){var d=c[0];var e=b.opacity<1||b.compositeOperation&&"source-over"!==b.compositeOperation||!b._isBottomItem()&&d._hasTransparencyChannel();var f;var g;var h=b.viewport.getZoom(!0);var i=b.viewportToImageZoom(h);if(i>b.smoothTileEdgesMinZoom&&!b.iOSDevice){e=!0;f=d.getScaleForEdgeSmoothing();g=d.getTranslationForEdgeSmoothing(f,b._drawer.getCanvasSize(!1),b._drawer.getCanvasSize(!0))}var j;if(e){f||(j=b.viewport.viewportToViewerElementRectangle(b.getClippedBounds(!0)).getIntegerBoundingBox().times(a.pixelDensityRatio));b._drawer._clear(!0,j)}0===b.viewport.degrees||f||b._drawer._offsetForRotation(b.viewport.degrees,e);var k=!1;if(b._clip){b._drawer.saveContext(e);var l=b.imageToViewportRectangle(b._clip,!0);var m=b._drawer.viewportToDrawerRectangle(l);f&&(m=m.times(f));g&&(m=m.translate(g));b._drawer.setClip(m,e);k=!0}if(b.placeholderFillStyle&&b._hasOpaqueTile===!1){var n=b._drawer.viewportToDrawerRectangle(b.getBounds(!0));f&&(n=n.times(f));g&&(n=n.translate(g));var o=null;o="function"==typeof b.placeholderFillStyle?b.placeholderFillStyle(b,b._drawer.context):b.placeholderFillStyle;b._drawer.drawRectangle(n,o,e)}for(var p=c.length-1;p>=0;p--){d=c[p];b._drawer.drawTile(d,b._drawingHandler,e,f,g);d.beingDrawn=!0;b.viewer&&b.viewer.raiseEvent("tile-drawn",{tiledImage:b,tile:d})}k&&b._drawer.restoreContext(e);0===b.viewport.degrees||f||b._drawer._restoreRotationChanges(e);if(e){var r=0!==b.viewport.degrees&&f;r&&b._drawer._offsetForRotation(b.viewport.degrees,!1);b._drawer.blendSketch({opacity:b.opacity,scale:f,translate:g,compositeOperation:b.compositeOperation,bounds:j});r&&b._drawer._restoreRotationChanges(!1)}q(b,c)}}function q(b,c){if(b.debugMode)for(var d=c.length-1;d>=0;d--){var e=c[d];try{b._drawer.drawDebugInfo(e,c.length,d)}catch(f){a.console.error(f)}}}a.TiledImage=function(b){var c=this;a.console.assert(b.tileCache,"[TiledImage] options.tileCache is required");a.console.assert(b.drawer,"[TiledImage] options.drawer is required");a.console.assert(b.viewer,"[TiledImage] options.viewer is required");a.console.assert(b.imageLoader,"[TiledImage] options.imageLoader is required");a.console.assert(b.source,"[TiledImage] options.source is required");a.console.assert(!b.clip||b.clip instanceof a.Rect,"[TiledImage] options.clip must be an OpenSeadragon.Rect if present");a.EventSource.call(this);this._tileCache=b.tileCache;delete b.tileCache;this._drawer=b.drawer;delete b.drawer;this._imageLoader=b.imageLoader;delete b.imageLoader;b.clip instanceof a.Rect&&(this._clip=b.clip.clone());delete b.clip;var d=b.x||0;delete b.x;var e=b.y||0;delete b.y;this.normHeight=b.source.dimensions.y/b.source.dimensions.x;this.contentAspectX=b.source.dimensions.x/b.source.dimensions.y;var f=1;if(b.width){f=b.width;delete b.width;if(b.height){a.console.error("specifying both width and height to a tiledImage is not supported");delete b.height}}else if(b.height){f=b.height/this.normHeight;delete b.height}var g=b.fitBounds;delete b.fitBounds;var h=b.fitBoundsPlacement||OpenSeadragon.Placement.CENTER;delete b.fitBoundsPlacement;a.extend(!0,this,{viewer:null,tilesMatrix:{},coverage:{},lastDrawn:[],lastResetTime:0,_midDraw:!1,_needsDraw:!0,_hasOpaqueTile:!1,springStiffness:a.DEFAULT_SETTINGS.springStiffness,animationTime:a.DEFAULT_SETTINGS.animationTime,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,smoothTileEdgesMinZoom:a.DEFAULT_SETTINGS.smoothTileEdgesMinZoom,iOSDevice:a.DEFAULT_SETTINGS.iOSDevice,debugMode:a.DEFAULT_SETTINGS.debugMode,crossOriginPolicy:a.DEFAULT_SETTINGS.crossOriginPolicy,placeholderFillStyle:a.DEFAULT_SETTINGS.placeholderFillStyle,opacity:a.DEFAULT_SETTINGS.opacity,compositeOperation:a.DEFAULT_SETTINGS.compositeOperation},b);this._xSpring=new a.Spring({initial:d,springStiffness:this.springStiffness,animationTime:this.animationTime});this._ySpring=new a.Spring({initial:e,springStiffness:this.springStiffness,animationTime:this.animationTime});this._scaleSpring=new a.Spring({initial:f,springStiffness:this.springStiffness,animationTime:this.animationTime});this._updateForScale();g&&this.fitBounds(g,h,!0);this._drawingHandler=function(b){c.viewer.raiseEvent("tile-drawing",a.extend({tiledImage:c},b))}};a.extend(a.TiledImage.prototype,a.EventSource.prototype,{needsDraw:function(){return this._needsDraw},reset:function(){this._tileCache.clearTilesFor(this);this.lastResetTime=a.now();
-this._needsDraw=!0},update:function(){var a=this._xSpring.current.value;var b=this._ySpring.current.value;var c=this._scaleSpring.current.value;this._xSpring.update();this._ySpring.update();this._scaleSpring.update();if(this._xSpring.current.value!==a||this._ySpring.current.value!==b||this._scaleSpring.current.value!==c){this._updateForScale();this._needsDraw=!0;return!0}return!1},draw:function(){if(0!==this.opacity){this._midDraw=!0;b(this);this._midDraw=!1}},destroy:function(){this.reset()},getBounds:function(b){return b?new a.Rect(this._xSpring.current.value,this._ySpring.current.value,this._worldWidthCurrent,this._worldHeightCurrent):new a.Rect(this._xSpring.target.value,this._ySpring.target.value,this._worldWidthTarget,this._worldHeightTarget)},getWorldBounds:function(){a.console.error("[TiledImage.getWorldBounds] is deprecated; use TiledImage.getBounds instead");return this.getBounds()},getClippedBounds:function(b){var c=this.getBounds(b);if(this._clip){var d=this._worldWidthCurrent/this.source.dimensions.x;var e=this._clip.times(d);c=new a.Rect(c.x+e.x,c.y+e.y,e.width,e.height)}return c},getContentSize:function(){return new a.Point(this.source.dimensions.x,this.source.dimensions.y)},_viewportToImageDelta:function(b,c,d){var e=d?this._scaleSpring.current.value:this._scaleSpring.target.value;return new a.Point(b*(this.source.dimensions.x/e),c*(this.source.dimensions.y*this.contentAspectX/e))},viewportToImageCoordinates:function(b,c,d){if(b instanceof a.Point){d=c;c=b.y;b=b.x}return d?this._viewportToImageDelta(b-this._xSpring.current.value,c-this._ySpring.current.value):this._viewportToImageDelta(b-this._xSpring.target.value,c-this._ySpring.target.value)},_imageToViewportDelta:function(b,c,d){var e=d?this._scaleSpring.current.value:this._scaleSpring.target.value;return new a.Point(b/this.source.dimensions.x*e,c/this.source.dimensions.y/this.contentAspectX*e)},imageToViewportCoordinates:function(b,c,d){if(b instanceof a.Point){d=c;c=b.y;b=b.x}var e=this._imageToViewportDelta(b,c);if(d){e.x+=this._xSpring.current.value;e.y+=this._ySpring.current.value}else{e.x+=this._xSpring.target.value;e.y+=this._ySpring.target.value}return e},imageToViewportRectangle:function(b,c,d,e,f){var g=b;g instanceof a.Rect?f=c:g=new a.Rect(b,c,d,e);var h=this.imageToViewportCoordinates(g.getTopLeft(),f);var i=this._imageToViewportDelta(g.width,g.height,f);return new a.Rect(h.x,h.y,i.x,i.y,g.degrees)},viewportToImageRectangle:function(b,c,d,e,f){var g=b;b instanceof a.Rect?f=c:g=new a.Rect(b,c,d,e);var h=this.viewportToImageCoordinates(g.getTopLeft(),f);var i=this._viewportToImageDelta(g.width,g.height,f);return new a.Rect(h.x,h.y,i.x,i.y,g.degrees)},viewerElementToImageCoordinates:function(a){var b=this.viewport.pointFromPixel(a,!0);return this.viewportToImageCoordinates(b)},imageToViewerElementCoordinates:function(a){var b=this.imageToViewportCoordinates(a);return this.viewport.pixelFromPoint(b,!0)},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))},viewportToImageZoom:function(a){var b=this._scaleSpring.current.value*this.viewport._containerInnerSize.x/this.source.dimensions.x;return b*a},imageToViewportZoom:function(a){var b=this._scaleSpring.current.value*this.viewport._containerInnerSize.x/this.source.dimensions.x;return a/b},setPosition:function(a,b){var c=this._xSpring.target.value===a.x&&this._ySpring.target.value===a.y;if(b){if(c&&this._xSpring.current.value===a.x&&this._ySpring.current.value===a.y)return;this._xSpring.resetTo(a.x);this._ySpring.resetTo(a.y);this._needsDraw=!0}else{if(c)return;this._xSpring.springTo(a.x);this._ySpring.springTo(a.y);this._needsDraw=!0}c||this._raiseBoundsChange()},setWidth:function(a,b){this._setScale(a,b)},setHeight:function(a,b){this._setScale(a/this.normHeight,b)},fitBounds:function(b,c,d){c=c||a.Placement.CENTER;var e=a.Placement.properties[c];var f=this.contentAspectX;var g=0;var h=0;var i=1;var j=1;if(this._clip){f=this._clip.getAspectRatio();i=this._clip.width/this.source.dimensions.x;j=this._clip.height/this.source.dimensions.y;if(b.getAspectRatio()>f){g=this._clip.x/this._clip.height*b.height;h=this._clip.y/this._clip.height*b.height}else{g=this._clip.x/this._clip.width*b.width;h=this._clip.y/this._clip.width*b.width}}if(b.getAspectRatio()>f){var k=b.height/j;var l=0;e.isHorizontallyCentered?l=(b.width-b.height*f)/2:e.isRight&&(l=b.width-b.height*f);this.setPosition(new a.Point(b.x-g+l,b.y-h),d);this.setHeight(k,d)}else{var m=b.width/i;var n=0;e.isVerticallyCentered?n=(b.height-b.width/f)/2:e.isBottom&&(n=b.height-b.width/f);this.setPosition(new a.Point(b.x-g,b.y-h+n),d);this.setWidth(m,d)}},getClip:function(){return this._clip?this._clip.clone():null},setClip:function(b){a.console.assert(!b||b instanceof a.Rect,"[TiledImage.setClip] newClip must be an OpenSeadragon.Rect or null");b instanceof a.Rect?this._clip=b.clone():this._clip=null;this._needsDraw=!0},getOpacity:function(){return this.opacity},setOpacity:function(a){this.opacity=a;this._needsDraw=!0},getCompositeOperation:function(){return this.compositeOperation},setCompositeOperation:function(a){this.compositeOperation=a;this._needsDraw=!0},_setScale:function(a,b){var c=this._scaleSpring.target.value===a;if(b){if(c&&this._scaleSpring.current.value===a)return;this._scaleSpring.resetTo(a);this._updateForScale();this._needsDraw=!0}else{if(c)return;this._scaleSpring.springTo(a);this._updateForScale();this._needsDraw=!0}c||this._raiseBoundsChange()},_updateForScale:function(){this._worldWidthTarget=this._scaleSpring.target.value;this._worldHeightTarget=this.normHeight*this._scaleSpring.target.value;this._worldWidthCurrent=this._scaleSpring.current.value;this._worldHeightCurrent=this.normHeight*this._scaleSpring.current.value},_raiseBoundsChange:function(){this.raiseEvent("bounds-change")},_isBottomItem:function(){return this.viewer.world.getItemAt(0)===this}})}(OpenSeadragon);!function(a){var b=function(b){a.console.assert(b,"[TileCache.cacheTile] options is required");a.console.assert(b.tile,"[TileCache.cacheTile] options.tile is required");a.console.assert(b.tiledImage,"[TileCache.cacheTile] options.tiledImage is required");this.tile=b.tile;this.tiledImage=b.tiledImage};var c=function(b){a.console.assert(b,"[ImageRecord] options is required");a.console.assert(b.image,"[ImageRecord] options.image is required");this._image=b.image;this._tiles=[]};c.prototype={destroy:function(){this._image=null;this._renderedContext=null;this._tiles=null},getImage:function(){return this._image},getRenderedContext:function(){if(!this._renderedContext){var a=document.createElement("canvas");a.width=this._image.width;a.height=this._image.height;this._renderedContext=a.getContext("2d");this._renderedContext.drawImage(this._image,0,0);this._image=null}return this._renderedContext},setRenderedContext:function(b){a.console.error("ImageRecord.setRenderedContext is deprecated. The rendered context should be created by the ImageRecord itself when calling ImageRecord.getRenderedContext.");this._renderedContext=b},addTile:function(b){a.console.assert(b,"[ImageRecord.addTile] tile is required");this._tiles.push(b)},removeTile:function(b){for(var c=0;c<this._tiles.length;c++)if(this._tiles[c]===b){this._tiles.splice(c,1);return}a.console.warn("[ImageRecord.removeTile] trying to remove unknown tile",b)},getTileCount:function(){return this._tiles.length}};a.TileCache=function(b){b=b||{};this._maxImageCacheCount=b.maxImageCacheCount||a.DEFAULT_SETTINGS.maxImageCacheCount;this._tilesLoaded=[];this._imagesLoaded=[];this._imagesLoadedCount=0};a.TileCache.prototype={numTilesLoaded:function(){return this._tilesLoaded.length},cacheTile:function(d){a.console.assert(d,"[TileCache.cacheTile] options is required");a.console.assert(d.tile,"[TileCache.cacheTile] options.tile is required");a.console.assert(d.tile.url,"[TileCache.cacheTile] options.tile.url is required");a.console.assert(d.tiledImage,"[TileCache.cacheTile] options.tiledImage is required");var e=d.cutoff||0;var f=this._tilesLoaded.length;var g=this._imagesLoaded[d.tile.url];if(!g){a.console.assert(d.image,"[TileCache.cacheTile] options.image is required to create an ImageRecord");g=this._imagesLoaded[d.tile.url]=new c({image:d.image});this._imagesLoadedCount++}g.addTile(d.tile);d.tile.cacheImageRecord=g;if(this._imagesLoadedCount>this._maxImageCacheCount){var h=null;var i=-1;var j=null;var k,l,m,n,o,p;for(var q=this._tilesLoaded.length-1;q>=0;q--){p=this._tilesLoaded[q];k=p.tile;if(!(k.level<=e||k.beingDrawn))if(h){n=k.lastTouchTime;l=h.lastTouchTime;o=k.level;m=h.level;if(l>n||n==l&&o>m){h=k;i=q;j=p}}else{h=k;i=q;j=p}}if(h&&i>=0){this._unloadTile(j);f=i}}this._tilesLoaded[f]=new b({tile:d.tile,tiledImage:d.tiledImage})},clearTilesFor:function(b){a.console.assert(b,"[TileCache.clearTilesFor] tiledImage is required");var c;for(var d=0;d<this._tilesLoaded.length;++d){c=this._tilesLoaded[d];if(c.tiledImage===b){this._unloadTile(c);this._tilesLoaded.splice(d,1);d--}}},getImageRecord:function(b){a.console.assert(b,"[TileCache.getImageRecord] url is required");return this._imagesLoaded[b]},_unloadTile:function(b){a.console.assert(b,"[TileCache._unloadTile] tileRecord is required");var c=b.tile;var d=b.tiledImage;c.unload();c.cacheImageRecord=null;var e=this._imagesLoaded[c.url];e.removeTile(c);if(!e.getTileCount()){e.destroy();delete this._imagesLoaded[c.url];this._imagesLoadedCount--}d.viewer.raiseEvent("tile-unloaded",{tile:c,tiledImage:d})}}}(OpenSeadragon);!function(a){a.World=function(b){var c=this;a.console.assert(b.viewer,"[World] options.viewer is required");a.EventSource.call(this);this.viewer=b.viewer;this._items=[];this._needsDraw=!1;this._autoRefigureSizes=!0;this._needsSizesFigured=!1;this._delegatedFigureSizes=function(a){c._autoRefigureSizes?c._figureSizes():c._needsSizesFigured=!0};this._figureSizes()};a.extend(a.World.prototype,a.EventSource.prototype,{addItem:function(b,c){a.console.assert(b,"[World.addItem] item is required");a.console.assert(b instanceof a.TiledImage,"[World.addItem] only TiledImages supported at this time");c=c||{};if(void 0!==c.index){var d=Math.max(0,Math.min(this._items.length,c.index));this._items.splice(d,0,b)}else this._items.push(b);this._autoRefigureSizes?this._figureSizes():this._needsSizesFigured=!0;this._needsDraw=!0;b.addHandler("bounds-change",this._delegatedFigureSizes);this.raiseEvent("add-item",{item:b})},getItemAt:function(b){a.console.assert(void 0!==b,"[World.getItemAt] index is required");return this._items[b]},getIndexOfItem:function(b){a.console.assert(b,"[World.getIndexOfItem] item is required");return a.indexOf(this._items,b)},getItemCount:function(){return this._items.length},setItemIndex:function(b,c){a.console.assert(b,"[World.setItemIndex] item is required");a.console.assert(void 0!==c,"[World.setItemIndex] index is required");var d=this.getIndexOfItem(b);if(c>=this._items.length)throw new Error("Index bigger than number of layers.");if(c!==d&&-1!==d){this._items.splice(d,1);this._items.splice(c,0,b);this._needsDraw=!0;this.raiseEvent("item-index-change",{item:b,previousIndex:d,newIndex:c})}},removeItem:function(b){a.console.assert(b,"[World.removeItem] item is required");var c=a.indexOf(this._items,b);if(-1!==c){b.removeHandler("bounds-change",this._delegatedFigureSizes);b.destroy();this._items.splice(c,1);this._figureSizes();this._needsDraw=!0;this._raiseRemoveItem(b)}},removeAll:function(){this.viewer._cancelPendingImages();var a;for(var b=0;b<this._items.length;b++){a=this._items[b];a.removeHandler("bounds-change",this._delegatedFigureSizes);a.destroy()}var c=this._items;this._items=[];this._figureSizes();this._needsDraw=!0;for(b=0;b<c.length;b++){a=c[b];this._raiseRemoveItem(a)}},resetItems:function(){for(var a=0;a<this._items.length;a++)this._items[a].reset()},update:function(){var a=!1;for(var b=0;b<this._items.length;b++)a=this._items[b].update()||a;return a},draw:function(){for(var a=0;a<this._items.length;a++)this._items[a].draw();this._needsDraw=!1},needsDraw:function(){for(var a=0;a<this._items.length;a++)if(this._items[a].needsDraw())return!0;return this._needsDraw},getHomeBounds:function(){return this._homeBounds.clone()},getContentFactor:function(){return this._contentFactor},setAutoRefigureSizes:function(a){this._autoRefigureSizes=a;if(a&this._needsSizesFigured){this._figureSizes();this._needsSizesFigured=!1}},arrange:function(b){b=b||{};var c=b.immediately||!1;var d=b.layout||a.DEFAULT_SETTINGS.collectionLayout;var e=b.rows||a.DEFAULT_SETTINGS.collectionRows;var f=b.columns||a.DEFAULT_SETTINGS.collectionColumns;var g=b.tileSize||a.DEFAULT_SETTINGS.collectionTileSize;var h=b.tileMargin||a.DEFAULT_SETTINGS.collectionTileMargin;var i=g+h;var j;j=!b.rows&&f?f:Math.ceil(this._items.length/e);var k=0;var l=0;var m,n,o,p,q;this.setAutoRefigureSizes(!1);for(var r=0;r<this._items.length;r++){if(r&&r%j===0)if("horizontal"===d){l+=i;k=0}else{k+=i;l=0}m=this._items[r];n=m.getBounds();o=n.width>n.height?g:g*(n.width/n.height);p=o*(n.height/n.width);q=new a.Point(k+(g-o)/2,l+(g-p)/2);m.setPosition(q,c);m.setWidth(o,c);"horizontal"===d?k+=i:l+=i}this.setAutoRefigureSizes(!0)},_figureSizes:function(){var b=this._homeBounds?this._homeBounds.clone():null;var c=this._contentSize?this._contentSize.clone():null;var d=this._contentFactor||0;if(this._items.length){var e=this._items[0];var f=e.getBounds();this._contentFactor=e.getContentSize().x/f.width;var g=e.getClippedBounds();var h=g.x;var i=g.y;var j=g.x+g.width;var k=g.y+g.height;for(var l=1;l<this._items.length;l++){e=this._items[l];f=e.getBounds();this._contentFactor=Math.max(this._contentFactor,e.getContentSize().x/f.width);g=e.getClippedBounds();h=Math.min(h,g.x);i=Math.min(i,g.y);j=Math.max(j,g.x+g.width);k=Math.max(k,g.y+g.height)}this._homeBounds=new a.Rect(h,i,j-h,k-i);this._contentSize=new a.Point(this._homeBounds.width*this._contentFactor,this._homeBounds.height*this._contentFactor)}else{this._homeBounds=new a.Rect(0,0,1,1);this._contentSize=new a.Point(1,1);this._contentFactor=1}this._contentFactor===d&&this._homeBounds.equals(b)&&this._contentSize.equals(c)||this.raiseEvent("metrics-change",{})},_raiseRemoveItem:function(a){this.raiseEvent("remove-item",{item:a})}})}(OpenSeadragon);
-//# sourceMappingURL=openseadragon.min.js.map
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.min.js.map b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.min.js.map
deleted file mode 100755
index c4b8750..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/openseadragon-bin-2.2.1/openseadragon.min.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../../src/openseadragon.js","../../src/fullscreen.js","../../src/eventsource.js","../../src/mousetracker.js","../../src/control.js","../../src/controldock.js","../../src/placement.js","../../src/viewer.js","../../src/navigator.js","../../src/strings.js","../../src/point.js","../../src/tilesource.js","../../src/dzitilesource.js","../../src/iiiftilesource.js","../../src/osmtilesource.js","../../src/tmstilesource.js","../../src/legacytilesource.js","../../src/imagetilesource.js","../../src/tilesourcecollection.js","../../src/button.js","../../src/buttongroup.js","../../src/rectangle.js","../../src/referencestrip.js","../../src/displayrectangle.js","../../src/spring.js","../../src/imageloader.js","../../src/tile.js","../../src/overlay.js","../../src/drawer.js","../../src/viewport.js","../../src/tiledimage.js","../../src/tilecache.js","../../src/world.js"],"names":["window","OpenSeadragon","options","Viewer","define","amd","$","version","versionStr","major","parseInt","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","lastKey","key","isEmptyObject","name","freezeObject","freeze","supportsCanvas","canvasElement","document","createElement","getContext","isCanvasTainted","canvas","isTainted","getImageData","e","pixelDensityRatio","context","devicePixelRatio","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","getOffsetParent","element","isFixed","body","offsetParent","extend","src","copy","copyIsArray","clone","target","arguments","length","deep","i","this","isIOSDevice","navigator","userAgent","indexOf","DEFAULT_SETTINGS","xmlPath","tileSources","tileHost","initialPage","crossOriginPolicy","ajaxWithCredentials","panHorizontal","panVertical","constrainDuringPan","wrapHorizontal","wrapVertical","visibilityRatio","minPixelRatio","defaultZoomLevel","minZoomLevel","maxZoomLevel","homeFillsViewer","clickTimeThreshold","clickDistThreshold","dblClickTimeThreshold","dblClickDistThreshold","springStiffness","animationTime","gestureSettingsMouse","scrollToZoom","clickToZoom","dblClickToZoom","pinchToZoom","flickEnabled","flickMinSpeed","flickMomentum","pinchRotate","gestureSettingsTouch","gestureSettingsPen","gestureSettingsUnknown","zoomPerClick","zoomPerScroll","zoomPerSecond","blendTime","alwaysBlend","autoHideControls","immediateRender","minZoomImageRatio","maxZoomPixelRatio","smoothTileEdgesMinZoom","iOSDevice","pixelsPerWheelLine","autoResize","preserveImageSizeOnResize","minScrollDeltaTime","showSequenceControl","sequenceControlAnchor","preserveViewport","preserveOverlays","navPrevNextWrap","showNavigationControl","navigationControlAnchor","showZoomControl","showHomeControl","showFullPageControl","showRotationControl","controlsFadeDelay","controlsFadeLength","mouseNavEnabled","showNavigator","navigatorId","navigatorPosition","navigatorSizeRatio","navigatorMaintainSizeRatio","navigatorTop","navigatorLeft","navigatorHeight","navigatorWidth","navigatorAutoResize","navigatorAutoFade","navigatorRotate","degrees","opacity","compositeOperation","placeholderFillStyle","showReferenceStrip","referenceStripScroll","referenceStripElement","referenceStripHeight","referenceStripWidth","referenceStripPosition","referenceStripSizeRatio","collectionRows","collectionColumns","collectionLayout","collectionMode","collectionTileSize","collectionTileMargin","imageLoaderLimit","maxImageCacheCount","timeout","useCanvas","prefixUrl","navImages","zoomIn","REST","GROUP","HOVER","DOWN","zoomOut","home","fullpage","rotateleft","rotateright","previous","next","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","getCssPropertyWithVendorPrefix","property","memo","style","prefixes","suffix","capitalizeFirstLetter","prop","string","charAt","toUpperCase","slice","pointInElement","point","offset","size","getEvent","event","getMousePosition","pageX","pageY","Error","clientX","clientY","setPageScroll","scroll","scrollTo","originalScroll","currentScroll","getWindowSize","innerWidth","innerHeight","makeCenteredNode","wrappers","makeNeutralElement","display","height","width","verticalAlign","textAlign","appendChild","tagName","background","border","margin","padding","now","Date","getTime","makeTransparentImage","img","Browser","vendor","onload","filter","setElementOpacity","usesAlpha","ieOpacity","ieFilter","alpha","Math","round","setElementTouchActionNone","touchAction","msTouchAction","addClass","className","array","searchElement","fromIndex","pivot","TypeError","abs","removeClass","oldClasses","newClasses","split","push","join","addEvent","addEventListener","eventName","handler","useCapture","attachEvent","removeEvent","removeEventListener","detachEvent","cancelEvent","preventDefault","cancel","returnValue","stopEvent","stopPropagation","cancelBubble","createCallback","initialArgs","concat","getUrlParameter","value","URLPARAMS","getUrlProtocol","url","match","location","protocol","toLowerCase","createAjaxRequest","local","supportActiveX","ActiveXObject","XMLHttpRequest","makeAjaxRequest","onSuccess","onError","withCredentials","success","error","request","onreadystatechange","readyState","status","console","log","open","send","msg","message","oldIE","number","XDomainRequest","xdr","responseText","statusText","onerror","e2","jsonp","script","head","getElementsByTagName","jsonpCallback","callbackName","replace","callbackParam","param","callback","test","response","async","scriptCharset","charset","_","isAbort","parentNode","removeChild","insertBefore","firstChild","createFromDZI","parseXml","DOMParser","parser","xmlDoc","parseFromString","loadXML","parseJSON","JSON","parse","eval","imageFormatSupported","extension","FILEFORMATS","bmp","jpeg","jpg","png","tif","wdp","regex","ver","appName","appVersion","ua","parseFloat","substring","lastIndexOf","RegExp","exec","$1","part","sep","query","search","parts","decodeURIComponent","nullfunction","debug","info","warn","assert","w","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","msCancelAnimationFrame","iIntervalId","aAnimQueue","processing","iRequestId","setInterval","time","temp","shift","clearInterval","requestId","j","splice","fullScreenApi","supportsFullScreen","isFullScreen","getFullScreenElement","requestFullScreen","exitFullScreen","cancelFullScreen","fullScreenEventName","fullScreenErrorEventName","exitFullscreen","fullscreenElement","requestFullscreen","msExitFullscreen","msFullscreenElement","msRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitRequestFullscreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozRequestFullScreen","EventSource","events","addOnceHandler","userData","times","self","count","onceHandler","removeHandler","addHandler","handlers","removeAllHandlers","eventType","getHandler","source","eventSource","raiseEvent","eventArgs","clearTrackedPointers","tracker","THIS","hash","pointerListCount","activePointersLists","captureCount","MouseTracker","captureElement","mousemovecaptured","mouseupcaptured","unprefixedPointerEvents","pointermovecaptured","pointerupcaptured","touchmovecaptured","touchendcaptured","pop","startTracking","tracking","subscribeEvents","stopTracking","getCaptureEventParams","pointerType","upName","upHandler","moveName","moveHandler","capturePointer","pointerCount","eventParams","pointsList","getActivePointersListByType","setCapture","havePointerEvents","isInIframe","canAccessEvents","releasePointer","releaseCapture","getPointerType","pointerTypeStr","getMouseAbsolute","getMouseRelative","getPointRelativeToAbsolute","minus","getCenterPoint","point1","point2","onClick","clickHandler","onDblClick","dblClickHandler","onKeyDown","propagate","keyDownHandler","keyCode","charCode","ctrl","ctrlKey","shiftKey","alt","altKey","meta","metaKey","originalEvent","preventDefaultAction","onKeyUp","keyUpHandler","onKeyPress","keyHandler","onFocus","focusHandler","onBlur","blurHandler","onWheel","handleWheelEvent","onMouseWheel","simulatedEvent","srcElement","deltaMode","deltaX","deltaZ","wheelEventName","deltaY","wheelDelta","detail","nDelta","scrollHandler","isTouchEvent","isParentChild","parent","child","onMouseEnter","handleMouseEnter","onMouseOver","currentTarget","relatedTarget","gPoint","id","mousePointerId","isPrimary","currentPos","currentTime","updatePointersEnter","onMouseLeave","handleMouseExit","onMouseOut","updatePointersExit","getStandardizedButton","button","onMouseDown","updatePointersDown","pressHandler","dragHandler","dragEndHandler","onMouseUp","handleMouseUp","onMouseUpCaptured","updatePointersUp","onMouseMove","handleMouseMove","onMouseMoveCaptured","updatePointersMove","abortTouchContacts","gPointCount","getLength","abortGPoints","getByIndex","onTouchStart","parentGPoints","touchCount","changedTouches","gPoints","touches","identifier","MOUSETRACKERS","isTracking","onTouchEnd","handleTouchEnd","onTouchEndCaptured","onTouchMove","handleTouchMove","onTouchMoveCaptured","onTouchCancel","onGestureStart","onGestureChange","onPointerOver","pointerId","onPointerOut","onPointerDown","pinchHandler","onPointerUp","handlePointerUp","onPointerUpCaptured","getById","onPointerMove","handlePointerMove","onPointerMoveCaptured","onPointerCancel","updatePointersCancel","startTrackingPointer","speed","direction","contactPos","contactTime","lastPos","lastTime","add","stopTrackingPointer","listLength","primaryPoint","removeById","getPrimary","curGPoint","updateGPoint","insideElement","captured","insideElementPressed","enterHandler","buttons","pointers","getActivePointerCount","buttonDownAny","exitHandler","buttonChanged","nonPrimaryPressHandler","contacts","gesturePointVelocityTracker","addPoint","pinchGPoints","asArray","lastPinchDist","currentPinchDist","distanceTo","lastPinchCenter","currentPinchCenter","releasePoint","releaseTime","quick","wasCaptured","nonPrimaryReleaseHandler","removePoint","releaseHandler","insideElementReleased","equals","clicks","lastClickPos","dblClickTimeOut","setTimeout","clearTimeout","gPointArray","delta","stopHandler","stopTimeOut","handlePointerStop","stopDelay","gesturePoints","lastCenter","center","lastDistance","distance","originalMoveEvent","random","_this","click","dblclick","keydown","keyup","keypress","focus","blur","wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll","mouseenter","mouseleave","mouseover","mouseout","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","touchcancel","gesturestart","gesturechange","pointerover","MSPointerOver","pointerout","MSPointerOut","pointerdown","MSPointerDown","pointerup","MSPointerUp","pointermove","MSPointerMove","pointercancel","MSPointerCancel","startDisabled","setTracking","destroy","track","list","len","GesturePointList","trackerPoints","intervalId","_generateGuid","_doTracking","trackPoint","elapsedTime","atan2","guid","onmousewheel","supportsMouseCapture","divElement","PointerEvent","pointerEnabled","maxTouchPoints","haveMouseEnter","MSPointerEvent","msPointerEnabled","msMaxTouchPoints","_gPoints","gp","index","ControlAnchor","NONE","TOP_LEFT","TOP_RIGHT","BOTTOM_RIGHT","BOTTOM_LEFT","ABSOLUTE","Control","container","anchor","attachToViewer","autoFade","wrapper","isVisible","setVisible","visible","setOpacity","getControlIndex","dock","controls","ControlDock","layout","layouts","floor","onsubmit","right","bottom","topleft","topright","bottomright","bottomleft","addControl","controlOptions","div","paddingRight","paddingTop","paddingBottom","paddingLeft","removeControl","clearControls","areControlsEnabled","setControlsEnabled","enabled","Placement","CENTER","TOP","RIGHT","BOTTOM","LEFT","properties",0,"isLeft","isHorizontallyCentered","isRight","isTop","isVerticallyCentered","isBottom",1,2,3,4,5,6,7,8,"_getSafeElemSize","oElement","getTileSourceImplementation","viewer","tileSource","successCallback","failCallback","waitUntilReady","originalTileSource","ready","TileSource","getTileUrl","customTileSource","$TileSource","determineType","configure","getOverlayObject","overlay","Overlay","href","px","rect","viewport","imageToViewportRectangle","Rect","py","placement","onDraw","checkResize","rotationMode","getOverlayIndex","overlays","scheduleUpdate","updateFunc","scheduleControlsFade","updateControlsFade","beginControlsAutoHide","controlsShouldFade","controlsFadeBeginTime","deltaTime","min","max","abortControlsAutoHide","onCanvasKeyDown","zoomBy","panBy","deltaPointsFromPixels","applyConstraints","onCanvasKeyPress","goHome","onCanvasClick","gestureSettings","haveKeyboardFocus","activeElement","gestureSettingsByDeviceType","pointFromPixel","onCanvasDblClick","onCanvasDrag","negate","onCanvasDragEnd","amplitudeX","cos","amplitudeY","sin","pixelFromPoint","getCenter","panTo","onCanvasEnter","onCanvasExit","onCanvasPress","onCanvasRelease","onCanvasNonPrimaryPress","onCanvasNonPrimaryRelease","onCanvasPinch","centerPt","lastCenterPt","panByPt","angle1","angle2","setRotation","getRotation","PI","onCanvasScroll","factor","thisScrollTime","deltaScrollTime","_lastScrollTime","pow","onContainerEnter","mouseInside","onContainerExit","animating","updateMulti","updateOnce","isOpen","_updateRequestId","_opening","containerSize","prevContainerSize","resizeRatio","zoom","getZoom","resize","zoomTo","oldBounds","getBounds","fitBoundsWithConstraints","forceRedraw","viewportChange","update","animated","world","referenceStrip","needsDraw","drawWorld","_drawOverlays","imageLoader","clear","drawer","draw","resolveUrl","prefix","beginZoomingIn","lastZoomTime","zoomFactor","zooming","scheduleZoom","beginZoomingOut","endZooming","doZoom","adjustedFactor","doSingleZoomIn","doSingleZoomOut","lightUp","emulateEnter","emulateExit","onHome","onFullScreen","isFullPage","setFullPage","setFullScreen","fullPageButton","onRotateLeft","currRotation","onRotateRight","onPrevious","_sequenceIndex","goToPage","onNext","nextHash","config","overlaysContainer","previousBody","customControls","collectionViewport","collectionDrawer","profiler","fsBoundsDelta","group","fullPage","onfullscreenchange","_firstOpen","_loadQueue","currentOverlays","getString","_showMessage","overflow","tabIndex","bodyWidth","bodyHeight","bodyOverflow","docOverflow","innerTracker","outerTracker","toolbar","bindStandardControls","World","getItemAt","getItemCount","_setContentBounds","getHomeBounds","getContentFactor","Viewport","margins","viewportMargins","ImageLoader","jobLimit","tileCache","TileCache","Drawer","canRotate","rotateLeft","rotateRight","Navigator","sizeRatio","maintainSizeRatio","sequenceMode","bindSequenceControls","openDzi","dzi","openTileSource","close","ReferenceStrip","_updateSequenceButtons","expected","successes","failures","failEvent","checkCompletion","doOne","collectionImmediately","originalSuccess","addOverlay","originalError","addTiledImage","clearOverlays","innerHTML","removeAll","isMouseNavEnabled","setMouseNavEnabled","isVisibile","nodes","bodyStyle","docStyle","fullPageEventArgs","elementSize","pageScroll","elementMargin","elementPadding","bodyMargin","docMargin","bodyPadding","docPadding","docWidth","docHeight","prevElementParent","prevNextSibling","nextSibling","prevElementWidth","prevElementHeight","childNodes","restoreScrollCounter","restoreScroll","fullScreen","fullScreeEventArgs","fullPageStyleWidth","fullPageStyleHeight","onFullScreenChange","visibility","raiseAddItemFailed","myQueueItem","refreshWorld","theItem","arrange","immediately","rows","columns","tileSize","tileMargin","setAutoRefigureSizes","replaceItem","_hideMessage","queueItem","tiledImage","optionsClone","newIndex","getIndexOfItem","removeItem","TiledImage","fitBounds","fitBoundsPlacement","clip","addItem","originalTiledImage","item","addSimpleImage","opts","addLayer","getLayerAtLevel","level","getLevelOfLayer","getLayersCount","setLayerLevel","setItemIndex","removeLayer","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","rotateLeftButton","rotateRightButton","onPress","onEnter","onExit","navControl","currentPage","page","setFocus","drawHTML","updateOverlay","removeOverlay","getOverlayById","enable","createTextNode","messageDiv","_cancelPendingImages","_setTransformRotate","webkitTransform","mozTransform","msTransform","oTransform","transform","rotate","displayRegionContainer","displayRegion","viewerSize","navigatorSize","borderWidth","fudge","totalBorderWidths","fontSize","cssFloat","styleFloat","zIndex","cursor","_resizeWithViewer","oldViewerSize","elementArea","oldContainerSize","previousIndex","theirItem","myItem","_getMatchingItem","updateSize","newWidth","newHeight","bounds","sqrt","getBoundsNoRotate","pixelFromPointNoRotate","getTopLeft","getBottomRight","original","_originalForNavigator","_matchBounds","setPosition","setWidth","I18N","Errors","Dzc","Dzi","Xml","ImageFormat","Security","Status","OpenFailed","Tooltips","FullPage","Home","ZoomIn","ZoomOut","NextPage","PreviousPage","RotateLeft","RotateRight","props","capture","setString","divide","func","d","angle","processResponse","xhr","data","responseXML","tileOverlap","minLevel","maxLevel","aspectRatio","dimensions","_tileWidth","_tileHeight","getImageInfo","tileWidth","tileHeight","ceil","getTileSize","getTileWidth","getTileHeight","getLevelScale","levelScaleCache","_level","getNumTiles","scale","getPixelRatio","imageSizeScaled","rx","ry","getClosestLevel","tilesPerSide","tiles","getTileAtPoint","pixel","tx","ty","getTileBounds","dimensionsScaled","sx","sy","readySource","urlParts","filename","lastDot","exc","formattedExc","supports","tileExists","numTiles","configureFromXML","dispRectNodes","dispRectNode","rectNode","sizeNode","root","rootName","localName","ns","namespaceURI","configuration","displayRects","getElementsByTagNameNS","Image","xmlns","Url","getAttribute","Format","DisplayRect","Overlap","TileSize","Size","Height","Width","X","Y","MinLevel","MaxLevel","configureFromObject","messageNode","nodeValue","rectData","imageData","tilesUrl","fileFormat","sizeData","dispRectData","DziTileSource","_levelRects","queryParams","xMin","yMin","xMax","yMax","rects","canBeTiled","profile","level0Profiles","isLevel0","constructLevels","levels","sizes","sort","a","b","configureFromXml10","parseXML10","node","trim","Number","nodeName","IIIFTileSource","tileSizePerScaleFactor","tile_width","tile_height","scale_factors","scaleFactors","t","sf","scaleFactor","shortDim","tileOptions","smallerTiles","c","emulateLegacyImagePyramid","levelScale","NaN","iiifTileSizeWidth","iiifTileSizeHeight","iiifRegion","iiifTileX","iiifTileY","iiifTileW","iiifTileH","iiifSize","iiifQuality","uri","IIIF_ROTATION","levelWidth","levelHeight","OsmTileSource","TmsTileSource","bufferedWidth","bufferedHeight","yTiles","filterFiles","files","file","filtered","mimetype","conf","LegacyTileSource","dataUrl","ImageTileSource","buildPyramid","image","_image","crossOrigin","useCredentials","naturalWidth","naturalHeight","_buildLevels","getContext2D","context2D","currentWidth","currentHeight","bigCanvas","bigContext","drawImage","smallCanvas","smallContext","TileSourceCollection","scheduleFade","updateFade","shouldFade","fadeBeginTime","fadeLength","imgGroup","beginFading","fadeDelay","stopFading","inTo","newState","disabled","ButtonState","currentState","imgHover","imgDown","outTo","imgRest","title","notifyGroupEnter","notifyGroupExit","labelText","label","newTopLeft","getTopRight","getBottomLeft","fromSummits","topLeft","topRight","bottomLeft","diff","radians","atan","getAspectRatio","getSize","other","translate","union","thisBoundingBox","getBoundingBox","otherBoundingBox","intersection","getIntersection","abVector","cdVector","denom","s","EPSILON","intersectionPoints","thisTopLeft","containsPoint","thisTopRight","thisBottomLeft","thisBottomRight","rectTopLeft","rectTopRight","rectBottomLeft","rectBottomRight","thisSegments","_getSegments","rectSegments","thisSegment","rectSegment","intersect","minX","maxX","minY","maxY","k","bottomRight","newTopRight","getIntegerBoundingBox","boundingBox","epsilon","topDiff","leftDiff","onStripDrag","marginLeft","marginTop","scrollWidth","scrollHeight","dragging","loadPanels","onStripScroll","strip","panelSize","activePanelsStart","activePanelsEnd","miniViewer","panelWidth","panelHeight","panels","activePanel","onStripEnter","marginBottom","onStripExit","marginRight","currentSelected","stiffness","exp","Spring","initial","exponential","_exponential","current","start","_logValue","resetTo","springTo","shiftBy","setExponential","startValue","targetValue","currentValue","isAtTargetValue","ImageJob","jobId","completeJob","loader","job","nextJob","jobsInProgress","jobQueue","errorMsg","finish","onabort","successful","addJob","complete","jobOptions","abort","newJob","Tile","exists","loaded","loading","imgElement","blendStart","beingDrawn","lastTouchTime","_hasTransparencyChannel","cacheImageRecord","getImage","cloneNode","msInterpolationMode","drawCanvas","drawingHandler","rendered","getRenderedContext","save","globalAlpha","clearRect","tile","restore","getScaleForEdgeSmoothing","getTranslationForEdgeSmoothing","canvasSize","sketchCanvasSize","unload","OverlayPlacement","OverlayRotationMode","NO_ROTATION","EXACT","BOUNDING_BOX","_init","scales","adjust","transformOriginProp","transformProp","positionAndSize","_getOverlayPositionAndSize","_getTransformOrigin","_getSizeInPixels","_getBoundingBox","scaledSize","deltaPixelsFromPointsNoRotate","eltSize","refPoint","_getPlacementPoint","deltaPointsFromPixelsNoRotate","_adjustBoundsForRotation","viewerElementToViewportRectangle","sketchCanvas","sketchContext","dir","viewportSize","_calculateCanvasSize","getOpacity","maxOpacity","needsUpdate","numTilesLoaded","reset","resetItems","_calculateSketchCanvasSize","_clear","useSketch","_getContext","viewportToDrawerRectangle","rectangle","drawTile","resizeSketchCanvas","saveContext","restoreContext","setClip","beginPath","drawRectangle","fillStyle","fillRect","blendSketch","globalCompositeOperation","widthExt","heightExt","widthDiff","heightDiff","drawDebugInfo","lineWidth","font","strokeStyle","_offsetForRotation","strokeRect","tileCenterX","tileCenterY","fillText","_restoreRotationChanges","debugRect","getCanvasSize","sketch","cx","cy","getContainerSize","contentSize","_margins","zoomPoint","_updateContainerInnerSize","centerSpringX","centerSpringY","zoomSpring","_oldCenterX","_oldCenterY","_oldZoom","resetContentSize","setHomeBounds","contentFactor","_contentBoundsNoRotate","_contentSizeNoRotate","_contentBounds","_contentSize","_contentAspectRatio","homeBounds","contentBounds","getHomeZoom","aspectFactor","output","getHomeBoundsNoRotate","getMinZoom","homeZoom","getMaxZoom","_containerInnerSize","getMargins","setMargins","getBoundsWithMargins","getBoundsNoRotateWithMargins","oldZoomPixel","newZoomPixel","deltaZoomPixels","deltaZoomPoints","centerCurrent","centerTarget","_pixelFromPoint","_applyZoomConstraints","_applyBoundaryConstraints","newBounds","horizontalThreshold","boundsRight","contentRight","leftDx","rightDx","verticalThreshold","boundsBottom","contentBottom","topDy","bottomDy","actualZoom","constrainedZoom","constrainedBounds","ensureVisible","_fitBounds","constraints","aspect","newZoom","newBoundsAspectRatio","newConstrainedZoom","oldZoom","referencePoint","fitVertically","box","fitHorizontally","isNaN","newContainerSize","maintain","widthDeltaFactor","changed","deltaPoints","deltaPixelsFromPoints","deltaPixels","_pixelFromPointNoRotate","pointFromPixelNoRotate","_viewportToImageDelta","viewerX","viewerY","viewportToImageCoordinates","_imageToViewportDelta","imageX","imageY","imageToViewportCoordinates","pixelWidth","pixelHeight","coordA","coordB","viewportToImageRectangle","pointWidth","pointHeight","viewerElementToImageCoordinates","imageToViewerElementCoordinates","windowToImageCoordinates","viewerCoordinates","imageToWindowCoordinates","viewerElementToViewportCoordinates","viewportToViewerElementCoordinates","viewportToViewerElementRectangle","windowToViewportCoordinates","viewportToWindowCoordinates","viewportToImageZoom","viewportZoom","imageWidth","containerWidth","viewportToImageZoomRatio","imageToViewportZoom","imageZoom","updateViewport","_needsDraw","renderPixelRatioC","renderPixelRatioT","zeroRatioT","optimalRatio","levelOpacity","levelVisibility","best","haveDrawn","viewportBounds","zeroRatioC","_scaleSpring","lowestLevel","highestLevel","lastDrawn","tiledImageBounds","getClippedBounds","_xSpring","_ySpring","viewportTL","viewportBR","_worldWidthCurrent","_worldHeightCurrent","drawLevel","updateLevel","providesCoverage","coverage","drawTiles","loadTile","tileTL","tileBR","numberOfTiles","viewportCenter","havedrawn","currenttime","resetCoverage","updateTile","getTile","tilesMatrix","setCoverage","isCovered","positionTile","setTileLoaded","imageRecord","_tileCache","getImageRecord","blendTile","compareTiles","worldWidth","worldHeight","xMod","yMod","_imageLoader","onTileLoad","lastResetTime","cutoff","_midDraw","getCompletionCallback","increment","completionCallback","cacheTile","overlap","boundsTL","boundsSize","positionC","positionT","sizeC","sizeT","tileCenter","tileDistance","blendTimeMillis","_hasOpaqueTile","cols","covers","previousBest","_isBottomItem","sketchScale","sketchTranslate","_drawer","usedClip","_clip","clipRect","placeholderRect","_drawingHandler","offsetForRotation","normHeight","contentAspectX","_updateForScale","clearTilesFor","oldX","oldY","oldScale","_worldWidthTarget","_worldHeightTarget","getWorldBounds","ratio","getContentSize","sameTarget","_raiseBoundsChange","_setScale","setHeight","anchorProperties","xOffset","yOffset","displayedWidthRatio","displayedHeightRatio","getClip","newClip","getCompositeOperation","setCompositeOperation","TileRecord","ImageRecord","_tiles","_renderedContext","setRenderedContext","renderedContext","addTile","removeTile","getTileCount","_maxImageCacheCount","_tilesLoaded","_imagesLoaded","_imagesLoadedCount","insertionIndex","worstTile","worstTileIndex","worstTileRecord","prevTile","worstTime","worstLevel","prevTime","prevLevel","prevTileRecord","_unloadTile","tileRecord","_items","_autoRefigureSizes","_needsSizesFigured","_delegatedFigureSizes","_figureSizes","oldIndex","_raiseRemoveItem","removedItems","_homeBounds","_contentFactor","wrap","oldHomeBounds","oldContentSize","oldContentFactor","clippedBounds"],"mappings":"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","file":"openseadragon.min.js"}
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/palette.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/palette.js
deleted file mode 100755
index bffb4d8..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/palette.js
+++ /dev/null
@@ -1,1474 +0,0 @@
-/** @license
- *
- * Colour Palette Generator script.
- * Copyright (c) 2014 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License. You may
- * obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- *
- * Furthermore, ColorBrewer colour schemes are covered by the following:
- *
- * Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and
- * The Pennsylvania State University.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License. You may obtain
- * a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * permissions and limitations under the License.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * 1. Redistributions as source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. The end-user documentation included with the redistribution, if any,
- * must include the following acknowledgment: "This product includes color
- * specifications and designs developed by Cynthia Brewer
- * (http://colorbrewer.org/)." Alternately, this acknowledgment may appear
- * in the software itself, if and wherever such third-party
- * acknowledgments normally appear.
- *
- * 4. The name "ColorBrewer" must not be used to endorse or promote products
- * derived from this software without prior written permission. For written
- * permission, please contact Cynthia Brewer at cbrewer@psu.edu.
- *
- * 5. Products derived from this software may not be called "ColorBrewer",
- * nor may "ColorBrewer" appear in their name, without prior written
- * permission of Cynthia Brewer.
- *
- * Furthermore, Solarized colour schemes are covered by the following:
- *
- * Copyright (c) 2011 Ethan Schoonover
- *
- * 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.
- */
-
-'use strict';
-
-var palette = (function() {
-
- var proto = Array.prototype;
- var slice = function(arr, opt_begin, opt_end) {
- return proto.slice.apply(arr, proto.slice.call(arguments, 1));
- };
-
- var extend = function(arr, arr2) {
- return proto.push.apply(arr, arr2);
- };
-
- var function_type = typeof function() {};
-
- var INF = 1000000000; // As far as we're concerned, that's infinity. ;)
-
-
- /**
- * Generate a colour palette from given scheme.
- *
- * If scheme argument is not a function it is passed to palettes.listSchemes
- * function (along with the number argument). This may result in an array
- * of more than one available scheme. If that is the case, scheme at
- * opt_index position is taken.
- *
- * This allows using different palettes for different data without having to
- * name the schemes specifically, for example:
- *
- * palette_for_foo = palette('sequential', 10, 0);
- * palette_for_bar = palette('sequential', 10, 1);
- * palette_for_baz = palette('sequential', 10, 2);
- *
- * @param {!palette.SchemeType|string|palette.Palette} scheme Scheme to
- * generate palette for. Either a function constructed with
- * palette.Scheme object, or anything that palette.listSchemes accepts
- * as name argument.
- * @param {number} number Number of colours to return. If negative, absolute
- * value is taken and colours will be returned in reverse order.
- * @param {number=} opt_index If scheme is a name of a group or an array and
- * results in more than one scheme, index of the scheme to use. The
- * index wraps around.
- * @param {...*} varargs Additional arguments to pass to palette or colour
- * generator (if the chosen scheme uses those).
- * @return {Array<string>} Array of abs(number) 'RRGGBB' strings or null if
- * no matching scheme was found.
- */
- var palette = function(scheme, number, opt_index, varargs) {
- number |= 0;
- if (number == 0) {
- return [];
- }
-
- if (typeof scheme !== function_type) {
- var arr = palette.listSchemes(
- /** @type {string|palette.Palette} */ (scheme), number);
- if (!arr.length) {
- return null;
- }
- scheme = arr[(opt_index || 0) % arr.length];
- }
-
- var args = slice(arguments, 2);
- args[0] = number;
- return scheme.apply(scheme, args);
- };
-
-
- /**
- * Returns a callable colour scheme object.
- *
- * Just after being created, the scheme has no colour palettes and no way of
- * generating any, thus generate method will return null. To turn scheme
- * into a useful object, addPalette, addPalettes or setColorFunction methods
- * need to be used.
- *
- * To generate a colour palette with given number colours using function
- * returned by this method, just call it with desired number of colours.
- *
- * Since this function *returns* a callable object, it must *not* be used
- * with the new operator.
- *
- * @param {string} name Name of the scheme.
- * @param {string|!Array<string>=} opt_groups A group name or list of
- * groups the scheme should be categorised under. Three typical groups
- * to use are 'qualitative', 'sequential' and 'diverging', but any
- * groups may be created.
- * @return {!palette.SchemeType} A colour palette generator function, which
- * in addition has methods and properties like a regular object. Think
- * of it as a callable object.
- */
- palette.Scheme = function(name, opt_groups) {
- /**
- * A map from a number to a colour palettes with given number of colours.
- * @type {!Object<number, palette.Palette>}
- */
- var palettes = {};
-
- /**
- * The biggest palette in palettes map.
- * @type {number}
- */
- var palettes_max = 0;
-
- /**
- * The smallest palette in palettes map.
- * @type {number}
- */
- var palettes_min = INF;
-
- var makeGenerator = function() {
- if (arguments.length <= 1) {
- return self.color_func.bind(self);
- } else {
- var args = slice(arguments);
- return function(x) {
- args[0] = x;
- return self.color_func.apply(self, args);
- };
- }
- };
-
- /**
- * Generate a colour palette from the scheme.
- *
- * If there was a palette added with addPalette (or addPalettes) with
- * enough colours, that palette will be used. Otherwise, if colour
- * function has been set using setColorFunction method, that function will
- * be used to generate the palette. Otherwise null is returned.
- *
- * @param {number} number Number of colours to return. If negative,
- * absolute value is taken and colours will be returned in reverse
- * order.
- * @param {...*} varargs Additional arguments to pass to palette or colour
- * generator (if the chosen scheme uses those).
- */
- var self = function(number, varargs) {
- number |= 0;
- if (!number) {
- return [];
- }
-
- var _number = number;
- number = Math.abs(number);
-
- if (number <= palettes_max) {
- for (var i = Math.max(number, palettes_min); !(i in palettes); ++i) {
- /* nop */
- }
- var colors = palettes[i];
- if (i > number) {
- var take_head =
- 'shrinking_takes_head' in colors ?
- colors.shrinking_takes_head : self.shrinking_takes_head;
- if (take_head) {
- colors = colors.slice(0, number);
- i = number;
- } else {
- return palette.generate(
- function(x) { return colors[Math.round(x)]; },
- _number, 0, colors.length - 1);
- }
- }
- colors = colors.slice();
- if (_number < 0) {
- colors.reverse();
- }
- return colors;
-
- } else if (self.color_func) {
- return palette.generate(makeGenerator.apply(self, arguments),
- _number, 0, 1, self.color_func_cyclic);
-
- } else {
- return null;
- }
- };
-
- /**
- * The name of the palette.
- * @type {string}
- */
- self.scheme_name = name;
-
- /**
- * A list of groups the palette belongs to.
- * @type {!Array<string>}
- */
- self.groups = opt_groups ?
- typeof opt_groups === 'string' ? [opt_groups] : opt_groups : [];
-
- /**
- * The biggest palette this scheme can generate.
- * @type {number}
- */
- self.max = 0;
-
- /**
- * The biggest palette this scheme can generate that is colour-blind
- * friendly.
- * @type {number}
- */
- self.cbf_max = INF;
-
-
- /**
- * Adds a colour palette to the colour scheme.
- *
- * @param {palette.Palette} palette An array of 'RRGGBB' strings
- * representing the palette to add.
- * @param {boolean=} opt_is_cbf Whether the palette is colourblind friendly.
- */
- self.addPalette = function(palette, opt_is_cbf) {
- var len = palette.length;
- if (len) {
- palettes[len] = palette;
- palettes_min = Math.min(palettes_min, len);
- palettes_max = Math.max(palettes_max, len);
- self.max = Math.max(self.max, len);
- if (!opt_is_cbf && len != 1) {
- self.cbf_max = Math.min(self.cbf_max, len - 1);
- }
- }
- };
-
- /**
- * Adds number of colour palettes to the colour scheme.
- *
- * @param {palette.PalettesList} palettes A map or an array of colour
- * palettes to add. If map, i.e. object, is used, properties should
- * use integer property names.
- * @param {number=} opt_max Size of the biggest palette in palettes set.
- * If not set, palettes must have a length property which will be used.
- * @param {number=} opt_cbf_max Size of the biggest palette which is still
- * colourblind friendly. 1 by default.
- */
- self.addPalettes = function(palettes, opt_max, opt_cbf_max) {
- opt_max = opt_max || palettes.length;
- for (var i = 0; i < opt_max; ++i) {
- if (i in palettes) {
- self.addPalette(palettes[i], true);
- }
- }
- self.cbf_max = Math.min(self.cbf_max, opt_cbf_max || 1);
- };
-
- /**
- * Enable shrinking palettes taking head of the list of colours.
- *
- * When user requests n-colour palette but the smallest palette added with
- * addPalette (or addPalettes) is m-colour one (where n < m), n colours
- * across the palette will be returned. For example:
- * var ex = palette.Scheme('ex');
- * ex.addPalette(['000000', 'bcbcbc', 'ffffff']);
- * var pal = ex(2);
- * // pal == ['000000', 'ffffff']
- *
- * This works for palettes where the distance between colours is
- * correlated to distance in the palette array, which is true in gradients
- * such as the one above.
- *
- * To turn this feature off shrinkByTakingHead can be set to true either
- * for all palettes in the scheme (if opt_idx is not given) or for palette
- * with given number of colours only. In general, setting the option for
- * given palette overwrites whatever has been set for the scheme. The
- * default, as described above, is false.
- *
- * Alternatively, the feature can be enabled by setting shrinking_takes_head
- * property for the palette Array or the scheme object.
- *
- * For example, all of the below give equivalent results:
- * var pal = ['ff0000', '00ff00', '0000ff'];
- *
- * var ex = palette.Scheme('ex');
- * ex.addPalette(pal); // ex(2) == ['ff0000', '0000ff']
- * ex.shrinkByTakingHead(true); // ex(2) == ['ff0000', '00ff00']
- *
- * ex = palette.Scheme('ex');
- * ex.addPalette(pal); // ex(2) == ['ff0000', '0000ff']
- * ex.shrinkByTakingHead(true, 3); // ex(2) == ['ff0000', '00ff00']
- *
- * ex = palette.Scheme('ex');
- * ex.addPalette(pal);
- * ex.addPalette(pal); // ex(2) == ['ff0000', '0000ff']
- * pal.shrinking_takes_head = true; // ex(2) == ['ff0000', '00ff00']
- *
- * @param {boolean} enabled Whether to enable or disable the “shrinking
- * takes head” feature. It is disabled by default.
- * @param {number=} opt_idx If given, the “shrinking takes head” option
- * for palette with given number of colours is set. If such palette
- * does not exist, nothing happens.
- */
- self.shrinkByTakingHead = function(enabled, opt_idx) {
- if (opt_idx !== void(0)) {
- if (opt_idx in palettes) {
- palettes[opt_idx].shrinking_takes_head = !!enabled;
- }
- } else {
- self.shrinking_takes_head = !!enabled;
- }
- };
-
- /**
- * Sets a colour generation function of the colour scheme.
- *
- * The function must accept a singe number argument whose value can be from
- * 0.0 to 1.0, and return a colour as an 'RRGGBB' string. This function
- * will be used when generating palettes, i.e. if 11-colour palette is
- * requested, this function will be called with arguments 0.0, 0.1, …, 1.0.
- *
- * If the palette generated by the function is colourblind friendly,
- * opt_is_cbf should be set to true.
- *
- * In some cases, it is not desirable to reach 1.0 when generating
- * a palette. This happens for hue-rainbows where the 0–1 range corresponds
- * to a 0°–360° range in hues, and since hue at 0° is the same as at 360°,
- * it's desired to stop short the end of the range when generating
- * a palette. To accomplish this, opt_cyclic should be set to true.
- *
- * @param {palette.ColorFunction} func A colour generator function.
- * @param {boolean=} opt_is_cbf Whether palette generate with the function
- * is colour-blind friendly.
- * @param {boolean=} opt_cyclic Whether colour at 0.0 is the same as the
- * one at 1.0.
- */
- self.setColorFunction = function(func, opt_is_cbf, opt_cyclic) {
- self.color_func = func;
- self.color_func_cyclic = !!opt_cyclic;
- self.max = INF;
- if (!opt_is_cbf && self.cbf_max === INF) {
- self.cbf_max = 1;
- }
- };
-
- self.color = function(x, varargs) {
- if (self.color_func) {
- return self.color_func.apply(this, arguments);
- } else {
- return null;
- }
- };
-
- return self;
- };
-
-
- /**
- * Creates a new palette.Scheme and initialises it by calling addPalettes
- * method with the rest of the arguments.
- *
- * @param {string} name Name of the scheme.
- * @param {string|!Array<string>} groups A group name or list of group
- * names the scheme belongs to.
- * @param {!Object<number, palette.Palette>|!Array<palette.Palette>}
- * palettes A map or an array of colour palettes to add. If map, i.e.
- * object, is used, properties should use integer property names.
- * @param {number=} opt_max Size of the biggest palette in palettes set.
- * If not set, palettes must have a length property which will be used.
- * @param {number=} opt_cbf_max Size of the biggest palette which is still
- * colourblind friendly. 1 by default.
- * @return {!palette.SchemeType} A colour palette generator function, which
- * in addition has methods and properties like a regular object. Think
- * of it as a callable object.
- */
- palette.Scheme.fromPalettes = function(name, groups,
- palettes, opt_max, opt_cbf_max) {
- var scheme = palette.Scheme(name, groups);
- scheme.addPalettes.apply(scheme, slice(arguments, 2));
- return scheme;
- };
-
-
- /**
- * Creates a new palette.Scheme and initialises it by calling
- * setColorFunction method with the rest of the arguments.
- *
- * @param {string} name Name of the scheme.
- * @param {string|!Array<string>} groups A group name or list of group
- * names the scheme belongs to.
- * @param {palette.ColorFunction} func A colour generator function.
- * @param {boolean=} opt_is_cbf Whether palette generate with the function
- * is colour-blind friendly.
- * @param {boolean=} opt_cyclic Whether colour at 0.0 is the same as the
- * one at 1.0.
- * @return {!palette.SchemeType} A colour palette generator function, which
- * in addition has methods and properties like a regular object. Think
- * of it as a callable object.
- */
- palette.Scheme.withColorFunction = function(name, groups,
- func, opt_is_cbf, opt_cyclic) {
- var scheme = palette.Scheme(name, groups);
- scheme.setColorFunction.apply(scheme, slice(arguments, 2));
- return scheme;
- };
-
-
- /**
- * A map of registered schemes. Maps a scheme or group name to a list of
- * scheme objects. Property name is either 'n-<name>' for single scheme
- * names or 'g-<name>' for scheme group names.
- *
- * @type {!Object<string, !Array<!Object>>}
- */
- var registered_schemes = {};
-
-
- /**
- * Registers a new colour scheme.
- *
- * @param {!palette.SchemeType} scheme The scheme to add.
- */
- palette.register = function(scheme) {
- registered_schemes['n-' + scheme.scheme_name] = [scheme];
- scheme.groups.forEach(function(g) {
- (registered_schemes['g-' + g] =
- registered_schemes['g-' + g] || []).push(scheme);
- });
- (registered_schemes['g-all'] =
- registered_schemes['g-all'] || []).push(scheme);
- };
-
-
- /**
- * List all schemes that match given name and number of colours.
- *
- * name argument can be either a string or an array of strings. In the
- * former case, the function acts as if the argument was an array with name
- * as a single argument (i.e. “palette.listSchemes('foo')” is exactly the same
- * as “palette.listSchemes(['foo'])”).
- *
- * Each name can be either name of a palette (e.g. 'tol-sq' for Paul Tol's
- * sequential palette), or a name of a group (e.g. 'sequential' for all
- * sequential palettes). Name can therefore map to a single scheme or
- * several schemes.
- *
- * Furthermore, name can be suffixed with '-cbf' to indicate that only
- * schemes that are colourblind friendly should be returned. For example,
- * 'rainbow' returns a HSV rainbow scheme, but because it is not colourblind
- * friendly, 'rainbow-cbf' returns no schemes.
- *
- * Some schemes may produce colourblind friendly palettes for some number of
- * colours. For example ColorBrewer's Dark2 scheme is colourblind friendly
- * if no more than 3 colours are generated. If opt_number is not specified,
- * 'qualitative-cbf' will include 'cb-Dark2' but if opt_number is given as,
- * say, 5 it won't.
- *
- * Name can also be 'all' which will return all registered schemes.
- * Naturally, 'all-cbf' will return all colourblind friendly schemes.
- *
- * Schemes are added to the library using palette.register. Schemes are
- * created using palette.Scheme function. By default, the following schemes
- * are available:
- *
- * Name Description
- * -------------- -----------------------------------------------------
- * tol Paul Tol's qualitative scheme, cbf, max 12 colours.
- * tol-dv Paul Tol's diverging scheme, cbf.
- * tol-sq Paul Tol's sequential scheme, cbf.
- * tol-rainbow Paul Tol's qualitative scheme, cbf.
- *
- * rainbow A rainbow palette.
- *
- * cb-YlGn ColorBrewer sequential schemes.
- * cb-YlGnBu
- * cb-GnBu
- * cb-BuGn
- * cb-PuBuGn
- * cb-PuBu
- * cb-BuPu
- * cb-RdPu
- * cb-PuRd
- * cb-OrRd
- * cb-YlOrRd
- * cb-YlOrBr
- * cb-Purples
- * cb-Blues
- * cb-Greens
- * cb-Oranges
- * cb-Reds
- * cb-Greys
- *
- * cb-PuOr ColorBrewer diverging schemes.
- * cb-BrBG
- * cb-PRGn
- * cb-PiYG
- * cb-RdBu
- * cb-RdGy
- * cb-RdYlBu
- * cb-Spectral
- * cb-RdYlGn
- *
- * cb-Accent ColorBrewer qualitative schemes.
- * cb-Dark2
- * cb-Paired
- * cb-Pastel1
- * cb-Pastel2
- * cb-Set1
- * cb-Set2
- * cb-Set3
- *
- * sol-base Solarized base colours.
- * sol-accent Solarized accent colours.
- *
- * The following groups are also available by default:
- *
- * Name Description
- * -------------- -----------------------------------------------------
- * all All registered schemes.
- * sequential All sequential schemes.
- * diverging All diverging schemes.
- * qualitative All qualitative schemes.
- * cb-sequential All ColorBrewer sequential schemes.
- * cb-diverging All ColorBrewer diverging schemes.
- * cb-qualitative All ColorBrewer qualitative schemes.
- *
- * You can read more about Paul Tol's palettes at http://www.sron.nl/~pault/.
- * You can read more about ColorBrewer at http://colorbrewer2.org.
- *
- * @param {string|!Array<string>} name A name of a colour scheme, of
- * a group of colour schemes, or an array of any of those.
- * @param {number=} opt_number When requesting only colourblind friendly
- * schemes, number of colours the scheme must provide generating such
- * that the palette is still colourblind friendly. 2 by default.
- * @return {!Array<!palette.SchemeType>} An array of colour scheme objects
- * matching the criteria. Sorted by scheme name.
- */
- palette.listSchemes = function(name, opt_number) {
- if (!opt_number) {
- opt_number = 2;
- } else if (opt_number < 0) {
- opt_number = -opt_number;
- }
-
- var ret = [];
- (typeof name === 'string' ? [name] : name).forEach(function(n) {
- var cbf = n.substring(n.length - 4) === '-cbf';
- if (cbf) {
- n = n.substring(0, n.length - 4);
- }
- var schemes =
- registered_schemes['g-' + n] ||
- registered_schemes['n-' + n] ||
- [];
- for (var i = 0, scheme; (scheme = schemes[i]); ++i) {
- if ((cbf ? scheme.cbf : scheme.max) >= opt_number) {
- ret.push(scheme);
- }
- }
- });
-
- ret.sort(function(a, b) {
- return a.scheme_name >= b.scheme_name ?
- a.scheme_name > b.scheme_name ? 1 : 0 : -1;
- });
- return ret;
- };
-
-
- /**
- * Generates a palette using given colour generating function.
- *
- * The color_func callback must accept a singe number argument whose value
- * can vary from 0.0 to 1.0 (or in general from opt_start to opt_end), and
- * return a colour as an 'RRGGBB' string. This function will be used when
- * generating palettes, i.e. if 11-colour palette is requested, this
- * function will be called with arguments 0.0, 0.1, …, 1.0.
- *
- * In some cases, it is not desirable to reach 1.0 when generating
- * a palette. This happens for hue-rainbows where the 0–1 range corresponds
- * to a 0°–360° range in hues, and since hue at 0° is the same as at 360°,
- * it's desired to stop short the end of the range when generating
- * a palette. To accomplish this, opt_cyclic should be set to true.
- *
- * opt_start and opt_end may be used to change the range the colour
- * generation function is called with. opt_end may be less than opt_start
- * which will case to traverse the range in reverse. Another way to reverse
- * the palette is requesting negative number of colours. The two methods do
- * not always lead to the same results (especially if opt_cyclic is set).
- *
- * @param {palette.ColorFunction} color_func A colours generating callback
- * function.
- * @param {number} number Number of colours to generate in the palette. If
- * number is negative, colours in the palette will be reversed. If only
- * one colour is requested, colour at opt_start will be returned.
- * @param {number=} opt_start Optional starting point for the palette
- * generation function. Zero by default.
- * @param {number=} opt_end Optional ending point for the palette generation
- * function. One by default.
- * @param {boolean=} opt_cyclic If true, function will assume colour at
- * point opt_start is the same as one at opt_end.
- * @return {palette.Palette} An array of 'RRGGBB' colours.
- */
- palette.generate = function(color_func, number, opt_start, opt_end,
- opt_cyclic) {
- if (Math.abs(number) < 1) {
- return [];
- }
-
- opt_start = opt_start === void(0) ? 0 : opt_start;
- opt_end = opt_end === void(0) ? 1 : opt_end;
-
- if (Math.abs(number) < 2) {
- return [color_func(opt_start)];
- }
-
- var i = Math.abs(number);
- var x = opt_start;
- var ret = [];
- var step = (opt_end - opt_start) / (opt_cyclic ? i : (i - 1));
-
- for (; --i >= 0; x += step) {
- ret.push(color_func(x));
- }
- if (number < 0) {
- ret.reverse();
- }
- return ret;
- };
-
-
- /**
- * Clamps value to [0, 1] range.
- * @param {number} v Number to limit value of.
- * @return {number} If v is inside of [0, 1] range returns v, otherwise
- * returns 0 or 1 depending which side of the range v is closer to.
- */
- var clamp = function(v) {
- return v > 0 ? (v < 1 ? v : 1) : 0;
- };
-
- /**
- * Converts r, g, b triple into RRGGBB hex representation.
- * @param {number} r Red value of the colour in the range [0, 1].
- * @param {number} g Green value of the colour in the range [0, 1].
- * @param {number} b Blue value of the colour in the range [0, 1].
- * @return {string} A lower-case RRGGBB representation of the colour.
- */
- palette.rgbColor = function(r, g, b) {
- return [r, g, b].map(function(v) {
- v = Number(Math.round(clamp(v) * 255)).toString(16);
- return v.length == 1 ? '0' + v : v;
- }).join('');
- };
-
- /**
- * Converts a linear r, g, b triple into RRGGBB hex representation.
- * @param {number} r Linear red value of the colour in the range [0, 1].
- * @param {number} g Linear green value of the colour in the range [0, 1].
- * @param {number} b Linear blue value of the colour in the range [0, 1].
- * @return {string} A lower-case RRGGBB representation of the colour.
- */
- palette.linearRgbColor = function(r, g, b) {
- // http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_RGB.html
- return [r, g, b].map(function(v) {
- v = clamp(v);
- if (v <= 0.0031308) {
- v = 12.92 * v;
- } else {
- v = 1.055 * Math.pow(v, 1 / 2.4) - 0.055;
- }
- v = Number(Math.round(v * 255)).toString(16);
- return v.length == 1 ? '0' + v : v;
- }).join('');
- };
-
- /**
- * Converts an HSV colours to RRGGBB hex representation.
- * @param {number} h Hue in the range [0, 1].
- * @param {number=} opt_s Saturation in the range [0, 1]. One by default.
- * @param {number=} opt_v Value in the range [0, 1]. One by default.
- * @return {string} An RRGGBB representation of the colour.
- */
- palette.hsvColor = function(h, opt_s, opt_v) {
- h *= 6;
- var s = opt_s === void(0) ? 1 : clamp(opt_s);
- var v = opt_v === void(0) ? 1 : clamp(opt_v);
- var x = v * (1 - s * Math.abs(h % 2 - 1));
- var m = v * (1 - s);
- switch (Math.floor(h) % 6) {
- case 0: return palette.rgbColor(v, x, m);
- case 1: return palette.rgbColor(x, v, m);
- case 2: return palette.rgbColor(m, v, x);
- case 3: return palette.rgbColor(m, x, v);
- case 4: return palette.rgbColor(x, m, v);
- default: return palette.rgbColor(v, m, x);
- }
- };
-
- palette.register(palette.Scheme.withColorFunction(
- 'rainbow', 'qualitative', palette.hsvColor, false, true));
-
- return palette;
-})();
-
-
-/** @typedef {function(number): string} */
-palette.ColorFunction;
-
-/** @typedef {!Array<string>} */
-palette.Palette;
-
-/** @typedef {!Object<number, palette.Palette>|!Array<palette.Palette>} */
-palette.PalettesList;
-
-/**
- * @typedef {
- * function(number, ...?): Array<string>|
- * {
- * scheme_name: string,
- * groups: !Array<string>,
- * max: number,
- * cbf_max: number,
- * addPalette: function(!Array<string>, boolean=),
- * addPalettes: function(palette.PalettesList, number=, number=),
- * shrinkByTakingHead: function(boolean, number=),
- * setColorFunction: function(palette.ColorFunction, boolean=, boolean=),
- * color: function(number, ...?): ?string}}
- */
-palette.SchemeType;
-
-
-/* Paul Tol's schemes start here. *******************************************/
-/* See http://www.sron.nl/~pault/ */
-
-(function() {
- var rgb = palette.rgbColor;
-
- /**
- * Calculates value of a polynomial at given point.
- * For example, poly(x, 1, 2, 3) calculates value of “1 + 2*x + 2*X^2”.
- * @param {number} x Value to calculate polynomial for.
- * @param {...number} varargs Coefficients of the polynomial specified in
- * the order of rising powers of x including constant as the first
- * variable argument.
- */
- var poly = function(x, varargs) {
- var i = arguments.length - 1, n = arguments[i];
- while (i > 1) {
- n = n * x + arguments[--i];
- }
- return n;
- };
-
- /**
- * Calculate approximate value of error function with maximum error of 0.0005.
- * See <https://en.wikipedia.org/wiki/Error_function>.
- * @param {number} x Argument of the error function.
- * @return {number} Value of error function for x.
- */
- var erf = function(x) {
- // https://en.wikipedia.org/wiki/Error_function#Approximation_with_elementary_functions
- // This produces a maximum error of 0.0005 which is more then we need. In
- // the worst case, that error is multiplied by four and then divided by two
- // before being multiplied by 255, so in the end, the error is multiplied by
- // 510 which produces 0.255 which is less than a single colour step.
- var y = poly(Math.abs(x), 1, 0.278393, 0.230389, 0.000972, 0.078108);
- y *= y; // y^2
- y *= y; // y^4
- y = 1 - 1 / y;
- return x < 0 ? -y : y;
- };
-
- palette.register(palette.Scheme.fromPalettes('tol', 'qualitative', [
- ['4477aa'],
- ['4477aa', 'cc6677'],
- ['4477aa', 'ddcc77', 'cc6677'],
- ['4477aa', '117733', 'ddcc77', 'cc6677'],
- ['332288', '88ccee', '117733', 'ddcc77', 'cc6677'],
- ['332288', '88ccee', '117733', 'ddcc77', 'cc6677', 'aa4499'],
- ['332288', '88ccee', '44aa99', '117733', 'ddcc77', 'cc6677', 'aa4499'],
- ['332288', '88ccee', '44aa99', '117733', '999933', 'ddcc77', 'cc6677',
- 'aa4499'],
- ['332288', '88ccee', '44aa99', '117733', '999933', 'ddcc77', 'cc6677',
- '882255', 'aa4499'],
- ['332288', '88ccee', '44aa99', '117733', '999933', 'ddcc77', '661100',
- 'cc6677', '882255', 'aa4499'],
- ['332288', '6699cc', '88ccee', '44aa99', '117733', '999933', 'ddcc77',
- '661100', 'cc6677', '882255', 'aa4499'],
- ['332288', '6699cc', '88ccee', '44aa99', '117733', '999933', 'ddcc77',
- '661100', 'cc6677', 'aa4466', '882255', 'aa4499']
- ], 12, 12));
-
- /**
- * Calculates a colour along Paul Tol's sequential colours axis.
- * See <http://www.sron.nl/~pault/colourschemes.pdf> figure 7 and equation 1.
- * @param {number} x Position of the colour on the axis in the [0, 1] range.
- * @return {string} An RRGGBB representation of the colour.
- */
- palette.tolSequentialColor = function(x) {
- return rgb(1 - 0.392 * (1 + erf((x - 0.869) / 0.255)),
- 1.021 - 0.456 * (1 + erf((x - 0.527) / 0.376)),
- 1 - 0.493 * (1 + erf((x - 0.272) / 0.309)));
- };
-
- palette.register(palette.Scheme.withColorFunction(
- 'tol-sq', 'sequential', palette.tolSequentialColor, true));
-
- /**
- * Calculates a colour along Paul Tol's diverging colours axis.
- * See <http://www.sron.nl/~pault/colourschemes.pdf> figure 8 and equation 2.
- * @param {number} x Position of the colour on the axis in the [0, 1] range.
- * @return {string} An RRGGBB representation of the colour.
- */
- palette.tolDivergingColor = function(x) {
- var g = poly(x, 0.572, 1.524, -1.811) / poly(x, 1, -0.291, 0.1574);
- return rgb(poly(x, 0.235, -2.13, 26.92, -65.5, 63.5, -22.36),
- g * g,
- 1 / poly(x, 1.579, -4.03, 12.92, -31.4, 48.6, -23.36));
- };
-
- palette.register(palette.Scheme.withColorFunction(
- 'tol-dv', 'diverging', palette.tolDivergingColor, true));
-
- /**
- * Calculates a colour along Paul Tol's rainbow colours axis.
- * See <http://www.sron.nl/~pault/colourschemes.pdf> figure 13 and equation 3.
- * @param {number} x Position of the colour on the axis in the [0, 1] range.
- * @return {string} An RRGGBB representation of the colour.
- */
- palette.tolRainbowColor = function(x) {
- return rgb(poly(x, 0.472, -0.567, 4.05) / poly(x, 1, 8.72, -19.17, 14.1),
- poly(x, 0.108932, -1.22635, 27.284, -98.577, 163.3, -131.395,
- 40.634),
- 1 / poly(x, 1.97, 3.54, -68.5, 243, -297, 125));
- };
-
- palette.register(palette.Scheme.withColorFunction(
- 'tol-rainbow', 'qualitative', palette.tolRainbowColor, true));
-})();
-
-
-/* Solarized colour schemes start here. *************************************/
-/* See http://ethanschoonover.com/solarized */
-
-(function() {
- /*
- * Those are not really designed to be used in graphs, but we're keeping
- * them here in case someone cares.
- */
- palette.register(palette.Scheme.fromPalettes('sol-base', 'sequential', [
- ['002b36', '073642', '586e75', '657b83', '839496', '93a1a1', 'eee8d5',
- 'fdf6e3']
- ], 1, 8));
- palette.register(palette.Scheme.fromPalettes('sol-accent', 'qualitative', [
- ['b58900', 'cb4b16', 'dc322f', 'd33682', '6c71c4', '268bd2', '2aa198',
- '859900']
- ]));
-})();
-
-
-/* ColorBrewer colour schemes start here. ***********************************/
-/* See http://colorbrewer2.org/ */
-
-(function() {
- var schemes = {
- YlGn: {
- type: 'sequential',
- cbf: 42,
- 3: ['f7fcb9', 'addd8e', '31a354'],
- 4: ['ffffcc', 'c2e699', '78c679', '238443'],
- 5: ['ffffcc', 'c2e699', '78c679', '31a354', '006837'],
- 6: ['ffffcc', 'd9f0a3', 'addd8e', '78c679', '31a354', '006837'],
- 7: ['ffffcc', 'd9f0a3', 'addd8e', '78c679', '41ab5d', '238443',
- '005a32'],
- 8: ['ffffe5', 'f7fcb9', 'd9f0a3', 'addd8e', '78c679', '41ab5d',
- '238443', '005a32'],
- 9: ['ffffe5', 'f7fcb9', 'd9f0a3', 'addd8e', '78c679', '41ab5d',
- '238443', '006837', '004529']
- },
- YlGnBu: {
- type: 'sequential',
- cbf: 42,
- 3: ['edf8b1', '7fcdbb', '2c7fb8'],
- 4: ['ffffcc', 'a1dab4', '41b6c4', '225ea8'],
- 5: ['ffffcc', 'a1dab4', '41b6c4', '2c7fb8', '253494'],
- 6: ['ffffcc', 'c7e9b4', '7fcdbb', '41b6c4', '2c7fb8', '253494'],
- 7: ['ffffcc', 'c7e9b4', '7fcdbb', '41b6c4', '1d91c0', '225ea8',
- '0c2c84'],
- 8: ['ffffd9', 'edf8b1', 'c7e9b4', '7fcdbb', '41b6c4', '1d91c0',
- '225ea8', '0c2c84'],
- 9: ['ffffd9', 'edf8b1', 'c7e9b4', '7fcdbb', '41b6c4', '1d91c0',
- '225ea8', '253494', '081d58']
- },
- GnBu: {
- type: 'sequential',
- cbf: 42,
- 3: ['e0f3db', 'a8ddb5', '43a2ca'],
- 4: ['f0f9e8', 'bae4bc', '7bccc4', '2b8cbe'],
- 5: ['f0f9e8', 'bae4bc', '7bccc4', '43a2ca', '0868ac'],
- 6: ['f0f9e8', 'ccebc5', 'a8ddb5', '7bccc4', '43a2ca', '0868ac'],
- 7: ['f0f9e8', 'ccebc5', 'a8ddb5', '7bccc4', '4eb3d3', '2b8cbe',
- '08589e'],
- 8: ['f7fcf0', 'e0f3db', 'ccebc5', 'a8ddb5', '7bccc4', '4eb3d3',
- '2b8cbe', '08589e'],
- 9: ['f7fcf0', 'e0f3db', 'ccebc5', 'a8ddb5', '7bccc4', '4eb3d3',
- '2b8cbe', '0868ac', '084081']
- },
- BuGn: {
- type: 'sequential',
- cbf: 42,
- 3: ['e5f5f9', '99d8c9', '2ca25f'],
- 4: ['edf8fb', 'b2e2e2', '66c2a4', '238b45'],
- 5: ['edf8fb', 'b2e2e2', '66c2a4', '2ca25f', '006d2c'],
- 6: ['edf8fb', 'ccece6', '99d8c9', '66c2a4', '2ca25f', '006d2c'],
- 7: ['edf8fb', 'ccece6', '99d8c9', '66c2a4', '41ae76', '238b45',
- '005824'],
- 8: ['f7fcfd', 'e5f5f9', 'ccece6', '99d8c9', '66c2a4', '41ae76',
- '238b45', '005824'],
- 9: ['f7fcfd', 'e5f5f9', 'ccece6', '99d8c9', '66c2a4', '41ae76',
- '238b45', '006d2c', '00441b']
- },
- PuBuGn: {
- type: 'sequential',
- cbf: 42,
- 3: ['ece2f0', 'a6bddb', '1c9099'],
- 4: ['f6eff7', 'bdc9e1', '67a9cf', '02818a'],
- 5: ['f6eff7', 'bdc9e1', '67a9cf', '1c9099', '016c59'],
- 6: ['f6eff7', 'd0d1e6', 'a6bddb', '67a9cf', '1c9099', '016c59'],
- 7: ['f6eff7', 'd0d1e6', 'a6bddb', '67a9cf', '3690c0', '02818a',
- '016450'],
- 8: ['fff7fb', 'ece2f0', 'd0d1e6', 'a6bddb', '67a9cf', '3690c0',
- '02818a', '016450'],
- 9: ['fff7fb', 'ece2f0', 'd0d1e6', 'a6bddb', '67a9cf', '3690c0',
- '02818a', '016c59', '014636']
- },
- PuBu: {
- type: 'sequential',
- cbf: 42,
- 3: ['ece7f2', 'a6bddb', '2b8cbe'],
- 4: ['f1eef6', 'bdc9e1', '74a9cf', '0570b0'],
- 5: ['f1eef6', 'bdc9e1', '74a9cf', '2b8cbe', '045a8d'],
- 6: ['f1eef6', 'd0d1e6', 'a6bddb', '74a9cf', '2b8cbe', '045a8d'],
- 7: ['f1eef6', 'd0d1e6', 'a6bddb', '74a9cf', '3690c0', '0570b0',
- '034e7b'],
- 8: ['fff7fb', 'ece7f2', 'd0d1e6', 'a6bddb', '74a9cf', '3690c0',
- '0570b0', '034e7b'],
- 9: ['fff7fb', 'ece7f2', 'd0d1e6', 'a6bddb', '74a9cf', '3690c0',
- '0570b0', '045a8d', '023858']
- },
- BuPu: {
- type: 'sequential',
- cbf: 42,
- 3: ['e0ecf4', '9ebcda', '8856a7'],
- 4: ['edf8fb', 'b3cde3', '8c96c6', '88419d'],
- 5: ['edf8fb', 'b3cde3', '8c96c6', '8856a7', '810f7c'],
- 6: ['edf8fb', 'bfd3e6', '9ebcda', '8c96c6', '8856a7', '810f7c'],
- 7: ['edf8fb', 'bfd3e6', '9ebcda', '8c96c6', '8c6bb1', '88419d',
- '6e016b'],
- 8: ['f7fcfd', 'e0ecf4', 'bfd3e6', '9ebcda', '8c96c6', '8c6bb1',
- '88419d', '6e016b'],
- 9: ['f7fcfd', 'e0ecf4', 'bfd3e6', '9ebcda', '8c96c6', '8c6bb1',
- '88419d', '810f7c', '4d004b']
- },
- RdPu: {
- type: 'sequential',
- cbf: 42,
- 3: ['fde0dd', 'fa9fb5', 'c51b8a'],
- 4: ['feebe2', 'fbb4b9', 'f768a1', 'ae017e'],
- 5: ['feebe2', 'fbb4b9', 'f768a1', 'c51b8a', '7a0177'],
- 6: ['feebe2', 'fcc5c0', 'fa9fb5', 'f768a1', 'c51b8a', '7a0177'],
- 7: ['feebe2', 'fcc5c0', 'fa9fb5', 'f768a1', 'dd3497', 'ae017e',
- '7a0177'],
- 8: ['fff7f3', 'fde0dd', 'fcc5c0', 'fa9fb5', 'f768a1', 'dd3497',
- 'ae017e', '7a0177'],
- 9: ['fff7f3', 'fde0dd', 'fcc5c0', 'fa9fb5', 'f768a1', 'dd3497',
- 'ae017e', '7a0177', '49006a']
- },
- PuRd: {
- type: 'sequential',
- cbf: 42,
- 3: ['e7e1ef', 'c994c7', 'dd1c77'],
- 4: ['f1eef6', 'd7b5d8', 'df65b0', 'ce1256'],
- 5: ['f1eef6', 'd7b5d8', 'df65b0', 'dd1c77', '980043'],
- 6: ['f1eef6', 'd4b9da', 'c994c7', 'df65b0', 'dd1c77', '980043'],
- 7: ['f1eef6', 'd4b9da', 'c994c7', 'df65b0', 'e7298a', 'ce1256',
- '91003f'],
- 8: ['f7f4f9', 'e7e1ef', 'd4b9da', 'c994c7', 'df65b0', 'e7298a',
- 'ce1256', '91003f'],
- 9: ['f7f4f9', 'e7e1ef', 'd4b9da', 'c994c7', 'df65b0', 'e7298a',
- 'ce1256', '980043', '67001f']
- },
- OrRd: {
- type: 'sequential',
- cbf: 42,
- 3: ['fee8c8', 'fdbb84', 'e34a33'],
- 4: ['fef0d9', 'fdcc8a', 'fc8d59', 'd7301f'],
- 5: ['fef0d9', 'fdcc8a', 'fc8d59', 'e34a33', 'b30000'],
- 6: ['fef0d9', 'fdd49e', 'fdbb84', 'fc8d59', 'e34a33', 'b30000'],
- 7: ['fef0d9', 'fdd49e', 'fdbb84', 'fc8d59', 'ef6548', 'd7301f',
- '990000'],
- 8: ['fff7ec', 'fee8c8', 'fdd49e', 'fdbb84', 'fc8d59', 'ef6548',
- 'd7301f', '990000'],
- 9: ['fff7ec', 'fee8c8', 'fdd49e', 'fdbb84', 'fc8d59', 'ef6548',
- 'd7301f', 'b30000', '7f0000']
- },
- YlOrRd: {
- type: 'sequential',
- cbf: 42,
- 3: ['ffeda0', 'feb24c', 'f03b20'],
- 4: ['ffffb2', 'fecc5c', 'fd8d3c', 'e31a1c'],
- 5: ['ffffb2', 'fecc5c', 'fd8d3c', 'f03b20', 'bd0026'],
- 6: ['ffffb2', 'fed976', 'feb24c', 'fd8d3c', 'f03b20', 'bd0026'],
- 7: ['ffffb2', 'fed976', 'feb24c', 'fd8d3c', 'fc4e2a', 'e31a1c',
- 'b10026'],
- 8: ['ffffcc', 'ffeda0', 'fed976', 'feb24c', 'fd8d3c', 'fc4e2a',
- 'e31a1c', 'b10026'],
- 9: ['ffffcc', 'ffeda0', 'fed976', 'feb24c', 'fd8d3c', 'fc4e2a',
- 'e31a1c', 'bd0026', '800026']
- },
- YlOrBr: {
- type: 'sequential',
- cbf: 42,
- 3: ['fff7bc', 'fec44f', 'd95f0e'],
- 4: ['ffffd4', 'fed98e', 'fe9929', 'cc4c02'],
- 5: ['ffffd4', 'fed98e', 'fe9929', 'd95f0e', '993404'],
- 6: ['ffffd4', 'fee391', 'fec44f', 'fe9929', 'd95f0e', '993404'],
- 7: ['ffffd4', 'fee391', 'fec44f', 'fe9929', 'ec7014', 'cc4c02',
- '8c2d04'],
- 8: ['ffffe5', 'fff7bc', 'fee391', 'fec44f', 'fe9929', 'ec7014',
- 'cc4c02', '8c2d04'],
- 9: ['ffffe5', 'fff7bc', 'fee391', 'fec44f', 'fe9929', 'ec7014',
- 'cc4c02', '993404', '662506']
- },
- Purples: {
- type: 'sequential',
- cbf: 42,
- 3: ['efedf5', 'bcbddc', '756bb1'],
- 4: ['f2f0f7', 'cbc9e2', '9e9ac8', '6a51a3'],
- 5: ['f2f0f7', 'cbc9e2', '9e9ac8', '756bb1', '54278f'],
- 6: ['f2f0f7', 'dadaeb', 'bcbddc', '9e9ac8', '756bb1', '54278f'],
- 7: ['f2f0f7', 'dadaeb', 'bcbddc', '9e9ac8', '807dba', '6a51a3',
- '4a1486'],
- 8: ['fcfbfd', 'efedf5', 'dadaeb', 'bcbddc', '9e9ac8', '807dba',
- '6a51a3', '4a1486'],
- 9: ['fcfbfd', 'efedf5', 'dadaeb', 'bcbddc', '9e9ac8', '807dba',
- '6a51a3', '54278f', '3f007d']
- },
- Blues: {
- type: 'sequential',
- cbf: 42,
- 3: ['deebf7', '9ecae1', '3182bd'],
- 4: ['eff3ff', 'bdd7e7', '6baed6', '2171b5'],
- 5: ['eff3ff', 'bdd7e7', '6baed6', '3182bd', '08519c'],
- 6: ['eff3ff', 'c6dbef', '9ecae1', '6baed6', '3182bd', '08519c'],
- 7: ['eff3ff', 'c6dbef', '9ecae1', '6baed6', '4292c6', '2171b5',
- '084594'],
- 8: ['f7fbff', 'deebf7', 'c6dbef', '9ecae1', '6baed6', '4292c6',
- '2171b5', '084594'],
- 9: ['f7fbff', 'deebf7', 'c6dbef', '9ecae1', '6baed6', '4292c6',
- '2171b5', '08519c', '08306b']
- },
- Greens: {
- type: 'sequential',
- cbf: 42,
- 3: ['e5f5e0', 'a1d99b', '31a354'],
- 4: ['edf8e9', 'bae4b3', '74c476', '238b45'],
- 5: ['edf8e9', 'bae4b3', '74c476', '31a354', '006d2c'],
- 6: ['edf8e9', 'c7e9c0', 'a1d99b', '74c476', '31a354', '006d2c'],
- 7: ['edf8e9', 'c7e9c0', 'a1d99b', '74c476', '41ab5d', '238b45',
- '005a32'],
- 8: ['f7fcf5', 'e5f5e0', 'c7e9c0', 'a1d99b', '74c476', '41ab5d',
- '238b45', '005a32'],
- 9: ['f7fcf5', 'e5f5e0', 'c7e9c0', 'a1d99b', '74c476', '41ab5d',
- '238b45', '006d2c', '00441b']
- },
- Oranges: {
- type: 'sequential',
- cbf: 42,
- 3: ['fee6ce', 'fdae6b', 'e6550d'],
- 4: ['feedde', 'fdbe85', 'fd8d3c', 'd94701'],
- 5: ['feedde', 'fdbe85', 'fd8d3c', 'e6550d', 'a63603'],
- 6: ['feedde', 'fdd0a2', 'fdae6b', 'fd8d3c', 'e6550d', 'a63603'],
- 7: ['feedde', 'fdd0a2', 'fdae6b', 'fd8d3c', 'f16913', 'd94801',
- '8c2d04'],
- 8: ['fff5eb', 'fee6ce', 'fdd0a2', 'fdae6b', 'fd8d3c', 'f16913',
- 'd94801', '8c2d04'],
- 9: ['fff5eb', 'fee6ce', 'fdd0a2', 'fdae6b', 'fd8d3c', 'f16913',
- 'd94801', 'a63603', '7f2704']
- },
- Reds: {
- type: 'sequential',
- cbf: 42,
- 3: ['fee0d2', 'fc9272', 'de2d26'],
- 4: ['fee5d9', 'fcae91', 'fb6a4a', 'cb181d'],
- 5: ['fee5d9', 'fcae91', 'fb6a4a', 'de2d26', 'a50f15'],
- 6: ['fee5d9', 'fcbba1', 'fc9272', 'fb6a4a', 'de2d26', 'a50f15'],
- 7: ['fee5d9', 'fcbba1', 'fc9272', 'fb6a4a', 'ef3b2c', 'cb181d',
- '99000d'],
- 8: ['fff5f0', 'fee0d2', 'fcbba1', 'fc9272', 'fb6a4a', 'ef3b2c',
- 'cb181d', '99000d'],
- 9: ['fff5f0', 'fee0d2', 'fcbba1', 'fc9272', 'fb6a4a', 'ef3b2c',
- 'cb181d', 'a50f15', '67000d']
- },
- Greys: {
- type: 'sequential',
- cbf: 42,
- 3: ['f0f0f0', 'bdbdbd', '636363'],
- 4: ['f7f7f7', 'cccccc', '969696', '525252'],
- 5: ['f7f7f7', 'cccccc', '969696', '636363', '252525'],
- 6: ['f7f7f7', 'd9d9d9', 'bdbdbd', '969696', '636363', '252525'],
- 7: ['f7f7f7', 'd9d9d9', 'bdbdbd', '969696', '737373', '525252',
- '252525'],
- 8: ['ffffff', 'f0f0f0', 'd9d9d9', 'bdbdbd', '969696', '737373',
- '525252', '252525'],
- 9: ['ffffff', 'f0f0f0', 'd9d9d9', 'bdbdbd', '969696', '737373',
- '525252', '252525', '000000']
- },
- PuOr: {
- type: 'diverging',
- cbf: 42,
- 3: ['f1a340', 'f7f7f7', '998ec3'],
- 4: ['e66101', 'fdb863', 'b2abd2', '5e3c99'],
- 5: ['e66101', 'fdb863', 'f7f7f7', 'b2abd2', '5e3c99'],
- 6: ['b35806', 'f1a340', 'fee0b6', 'd8daeb', '998ec3', '542788'],
- 7: ['b35806', 'f1a340', 'fee0b6', 'f7f7f7', 'd8daeb', '998ec3',
- '542788'],
- 8: ['b35806', 'e08214', 'fdb863', 'fee0b6', 'd8daeb', 'b2abd2',
- '8073ac', '542788'],
- 9: ['b35806', 'e08214', 'fdb863', 'fee0b6', 'f7f7f7', 'd8daeb',
- 'b2abd2', '8073ac', '542788'],
- 10: ['7f3b08', 'b35806', 'e08214', 'fdb863', 'fee0b6', 'd8daeb',
- 'b2abd2', '8073ac', '542788', '2d004b'],
- 11: ['7f3b08', 'b35806', 'e08214', 'fdb863', 'fee0b6', 'f7f7f7',
- 'd8daeb', 'b2abd2', '8073ac', '542788', '2d004b']
- },
- BrBG: {
- type: 'diverging',
- cbf: 42,
- 3: ['d8b365', 'f5f5f5', '5ab4ac'],
- 4: ['a6611a', 'dfc27d', '80cdc1', '018571'],
- 5: ['a6611a', 'dfc27d', 'f5f5f5', '80cdc1', '018571'],
- 6: ['8c510a', 'd8b365', 'f6e8c3', 'c7eae5', '5ab4ac', '01665e'],
- 7: ['8c510a', 'd8b365', 'f6e8c3', 'f5f5f5', 'c7eae5', '5ab4ac',
- '01665e'],
- 8: ['8c510a', 'bf812d', 'dfc27d', 'f6e8c3', 'c7eae5', '80cdc1',
- '35978f', '01665e'],
- 9: ['8c510a', 'bf812d', 'dfc27d', 'f6e8c3', 'f5f5f5', 'c7eae5',
- '80cdc1', '35978f', '01665e'],
- 10: ['543005', '8c510a', 'bf812d', 'dfc27d', 'f6e8c3', 'c7eae5',
- '80cdc1', '35978f', '01665e', '003c30'],
- 11: ['543005', '8c510a', 'bf812d', 'dfc27d', 'f6e8c3', 'f5f5f5',
- 'c7eae5', '80cdc1', '35978f', '01665e', '003c30']
- },
- PRGn: {
- type: 'diverging',
- cbf: 42,
- 3: ['af8dc3', 'f7f7f7', '7fbf7b'],
- 4: ['7b3294', 'c2a5cf', 'a6dba0', '008837'],
- 5: ['7b3294', 'c2a5cf', 'f7f7f7', 'a6dba0', '008837'],
- 6: ['762a83', 'af8dc3', 'e7d4e8', 'd9f0d3', '7fbf7b', '1b7837'],
- 7: ['762a83', 'af8dc3', 'e7d4e8', 'f7f7f7', 'd9f0d3', '7fbf7b',
- '1b7837'],
- 8: ['762a83', '9970ab', 'c2a5cf', 'e7d4e8', 'd9f0d3', 'a6dba0',
- '5aae61', '1b7837'],
- 9: ['762a83', '9970ab', 'c2a5cf', 'e7d4e8', 'f7f7f7', 'd9f0d3',
- 'a6dba0', '5aae61', '1b7837'],
- 10: ['40004b', '762a83', '9970ab', 'c2a5cf', 'e7d4e8', 'd9f0d3',
- 'a6dba0', '5aae61', '1b7837', '00441b'],
- 11: ['40004b', '762a83', '9970ab', 'c2a5cf', 'e7d4e8', 'f7f7f7',
- 'd9f0d3', 'a6dba0', '5aae61', '1b7837', '00441b']
- },
- PiYG: {
- type: 'diverging',
- cbf: 42,
- 3: ['e9a3c9', 'f7f7f7', 'a1d76a'],
- 4: ['d01c8b', 'f1b6da', 'b8e186', '4dac26'],
- 5: ['d01c8b', 'f1b6da', 'f7f7f7', 'b8e186', '4dac26'],
- 6: ['c51b7d', 'e9a3c9', 'fde0ef', 'e6f5d0', 'a1d76a', '4d9221'],
- 7: ['c51b7d', 'e9a3c9', 'fde0ef', 'f7f7f7', 'e6f5d0', 'a1d76a',
- '4d9221'],
- 8: ['c51b7d', 'de77ae', 'f1b6da', 'fde0ef', 'e6f5d0', 'b8e186',
- '7fbc41', '4d9221'],
- 9: ['c51b7d', 'de77ae', 'f1b6da', 'fde0ef', 'f7f7f7', 'e6f5d0',
- 'b8e186', '7fbc41', '4d9221'],
- 10: ['8e0152', 'c51b7d', 'de77ae', 'f1b6da', 'fde0ef', 'e6f5d0',
- 'b8e186', '7fbc41', '4d9221', '276419'],
- 11: ['8e0152', 'c51b7d', 'de77ae', 'f1b6da', 'fde0ef', 'f7f7f7',
- 'e6f5d0', 'b8e186', '7fbc41', '4d9221', '276419']
- },
- RdBu: {
- type: 'diverging',
- cbf: 42,
- 3: ['ef8a62', 'f7f7f7', '67a9cf'],
- 4: ['ca0020', 'f4a582', '92c5de', '0571b0'],
- 5: ['ca0020', 'f4a582', 'f7f7f7', '92c5de', '0571b0'],
- 6: ['b2182b', 'ef8a62', 'fddbc7', 'd1e5f0', '67a9cf', '2166ac'],
- 7: ['b2182b', 'ef8a62', 'fddbc7', 'f7f7f7', 'd1e5f0', '67a9cf',
- '2166ac'],
- 8: ['b2182b', 'd6604d', 'f4a582', 'fddbc7', 'd1e5f0', '92c5de',
- '4393c3', '2166ac'],
- 9: ['b2182b', 'd6604d', 'f4a582', 'fddbc7', 'f7f7f7', 'd1e5f0',
- '92c5de', '4393c3', '2166ac'],
- 10: ['67001f', 'b2182b', 'd6604d', 'f4a582', 'fddbc7', 'd1e5f0',
- '92c5de', '4393c3', '2166ac', '053061'],
- 11: ['67001f', 'b2182b', 'd6604d', 'f4a582', 'fddbc7', 'f7f7f7',
- 'd1e5f0', '92c5de', '4393c3', '2166ac', '053061']
- },
- RdGy: {
- type: 'diverging',
- cbf: 42,
- 3: ['ef8a62', 'ffffff', '999999'],
- 4: ['ca0020', 'f4a582', 'bababa', '404040'],
- 5: ['ca0020', 'f4a582', 'ffffff', 'bababa', '404040'],
- 6: ['b2182b', 'ef8a62', 'fddbc7', 'e0e0e0', '999999', '4d4d4d'],
- 7: ['b2182b', 'ef8a62', 'fddbc7', 'ffffff', 'e0e0e0', '999999',
- '4d4d4d'],
- 8: ['b2182b', 'd6604d', 'f4a582', 'fddbc7', 'e0e0e0', 'bababa',
- '878787', '4d4d4d'],
- 9: ['b2182b', 'd6604d', 'f4a582', 'fddbc7', 'ffffff', 'e0e0e0',
- 'bababa', '878787', '4d4d4d'],
- 10: ['67001f', 'b2182b', 'd6604d', 'f4a582', 'fddbc7', 'e0e0e0',
- 'bababa', '878787', '4d4d4d', '1a1a1a'],
- 11: ['67001f', 'b2182b', 'd6604d', 'f4a582', 'fddbc7', 'ffffff',
- 'e0e0e0', 'bababa', '878787', '4d4d4d', '1a1a1a']
- },
- RdYlBu: {
- type: 'diverging',
- cbf: 42,
- 3: ['fc8d59', 'ffffbf', '91bfdb'],
- 4: ['d7191c', 'fdae61', 'abd9e9', '2c7bb6'],
- 5: ['d7191c', 'fdae61', 'ffffbf', 'abd9e9', '2c7bb6'],
- 6: ['d73027', 'fc8d59', 'fee090', 'e0f3f8', '91bfdb', '4575b4'],
- 7: ['d73027', 'fc8d59', 'fee090', 'ffffbf', 'e0f3f8', '91bfdb',
- '4575b4'],
- 8: ['d73027', 'f46d43', 'fdae61', 'fee090', 'e0f3f8', 'abd9e9',
- '74add1', '4575b4'],
- 9: ['d73027', 'f46d43', 'fdae61', 'fee090', 'ffffbf', 'e0f3f8',
- 'abd9e9', '74add1', '4575b4'],
- 10: ['a50026', 'd73027', 'f46d43', 'fdae61', 'fee090', 'e0f3f8',
- 'abd9e9', '74add1', '4575b4', '313695'],
- 11: ['a50026', 'd73027', 'f46d43', 'fdae61', 'fee090', 'ffffbf',
- 'e0f3f8', 'abd9e9', '74add1', '4575b4', '313695']
- },
- Spectral: {
- type: 'diverging',
- cbf: 0,
- 3: ['fc8d59', 'ffffbf', '99d594'],
- 4: ['d7191c', 'fdae61', 'abdda4', '2b83ba'],
- 5: ['d7191c', 'fdae61', 'ffffbf', 'abdda4', '2b83ba'],
- 6: ['d53e4f', 'fc8d59', 'fee08b', 'e6f598', '99d594', '3288bd'],
- 7: ['d53e4f', 'fc8d59', 'fee08b', 'ffffbf', 'e6f598', '99d594',
- '3288bd'],
- 8: ['d53e4f', 'f46d43', 'fdae61', 'fee08b', 'e6f598', 'abdda4',
- '66c2a5', '3288bd'],
- 9: ['d53e4f', 'f46d43', 'fdae61', 'fee08b', 'ffffbf', 'e6f598',
- 'abdda4', '66c2a5', '3288bd'],
- 10: ['9e0142', 'd53e4f', 'f46d43', 'fdae61', 'fee08b', 'e6f598',
- 'abdda4', '66c2a5', '3288bd', '5e4fa2'],
- 11: ['9e0142', 'd53e4f', 'f46d43', 'fdae61', 'fee08b', 'ffffbf',
- 'e6f598', 'abdda4', '66c2a5', '3288bd', '5e4fa2']
- },
- RdYlGn: {
- type: 'diverging',
- cbf: 0,
- 3: ['fc8d59', 'ffffbf', '91cf60'],
- 4: ['d7191c', 'fdae61', 'a6d96a', '1a9641'],
- 5: ['d7191c', 'fdae61', 'ffffbf', 'a6d96a', '1a9641'],
- 6: ['d73027', 'fc8d59', 'fee08b', 'd9ef8b', '91cf60', '1a9850'],
- 7: ['d73027', 'fc8d59', 'fee08b', 'ffffbf', 'd9ef8b', '91cf60',
- '1a9850'],
- 8: ['d73027', 'f46d43', 'fdae61', 'fee08b', 'd9ef8b', 'a6d96a',
- '66bd63', '1a9850'],
- 9: ['d73027', 'f46d43', 'fdae61', 'fee08b', 'ffffbf', 'd9ef8b',
- 'a6d96a', '66bd63', '1a9850'],
- 10: ['a50026', 'd73027', 'f46d43', 'fdae61', 'fee08b', 'd9ef8b',
- 'a6d96a', '66bd63', '1a9850', '006837'],
- 11: ['a50026', 'd73027', 'f46d43', 'fdae61', 'fee08b', 'ffffbf',
- 'd9ef8b', 'a6d96a', '66bd63', '1a9850', '006837']
- },
- Accent: {
- type: 'qualitative',
- cbf: 0,
- 3: ['7fc97f', 'beaed4', 'fdc086'],
- 4: ['7fc97f', 'beaed4', 'fdc086', 'ffff99'],
- 5: ['7fc97f', 'beaed4', 'fdc086', 'ffff99', '386cb0'],
- 6: ['7fc97f', 'beaed4', 'fdc086', 'ffff99', '386cb0', 'f0027f'],
- 7: ['7fc97f', 'beaed4', 'fdc086', 'ffff99', '386cb0', 'f0027f',
- 'bf5b17'],
- 8: ['7fc97f', 'beaed4', 'fdc086', 'ffff99', '386cb0', 'f0027f',
- 'bf5b17', '666666']
- },
- Dark2: {
- type: 'qualitative',
- cbf: 3,
- 3: ['1b9e77', 'd95f02', '7570b3'],
- 4: ['1b9e77', 'd95f02', '7570b3', 'e7298a'],
- 5: ['1b9e77', 'd95f02', '7570b3', 'e7298a', '66a61e'],
- 6: ['1b9e77', 'd95f02', '7570b3', 'e7298a', '66a61e', 'e6ab02'],
- 7: ['1b9e77', 'd95f02', '7570b3', 'e7298a', '66a61e', 'e6ab02',
- 'a6761d'],
- 8: ['1b9e77', 'd95f02', '7570b3', 'e7298a', '66a61e', 'e6ab02',
- 'a6761d', '666666']
- },
- Paired: {
- type: 'qualitative',
- cbf: 4,
- 3: ['a6cee3', '1f78b4', 'b2df8a'],
- 4: ['a6cee3', '1f78b4', 'b2df8a', '33a02c'],
- 5: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99'],
- 6: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c'],
- 7: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c',
- 'fdbf6f'],
- 8: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c',
- 'fdbf6f', 'ff7f00'],
- 9: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c',
- 'fdbf6f', 'ff7f00', 'cab2d6'],
- 10: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c',
- 'fdbf6f', 'ff7f00', 'cab2d6', '6a3d9a'],
- 11: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c',
- 'fdbf6f', 'ff7f00', 'cab2d6', '6a3d9a', 'ffff99'],
- 12: ['a6cee3', '1f78b4', 'b2df8a', '33a02c', 'fb9a99', 'e31a1c',
- 'fdbf6f', 'ff7f00', 'cab2d6', '6a3d9a', 'ffff99', 'b15928']
- },
- Pastel1: {
- type: 'qualitative',
- cbf: 0,
- 3: ['fbb4ae', 'b3cde3', 'ccebc5'],
- 4: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4'],
- 5: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6'],
- 6: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6', 'ffffcc'],
- 7: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6', 'ffffcc',
- 'e5d8bd'],
- 8: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6', 'ffffcc',
- 'e5d8bd', 'fddaec'],
- 9: ['fbb4ae', 'b3cde3', 'ccebc5', 'decbe4', 'fed9a6', 'ffffcc',
- 'e5d8bd', 'fddaec', 'f2f2f2']
- },
- Pastel2: {
- type: 'qualitative',
- cbf: 0,
- 3: ['b3e2cd', 'fdcdac', 'cbd5e8'],
- 4: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4'],
- 5: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4', 'e6f5c9'],
- 6: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4', 'e6f5c9', 'fff2ae'],
- 7: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4', 'e6f5c9', 'fff2ae',
- 'f1e2cc'],
- 8: ['b3e2cd', 'fdcdac', 'cbd5e8', 'f4cae4', 'e6f5c9', 'fff2ae',
- 'f1e2cc', 'cccccc']
- },
- Set1: {
- type: 'qualitative',
- cbf: 0,
- 3: ['e41a1c', '377eb8', '4daf4a'],
- 4: ['e41a1c', '377eb8', '4daf4a', '984ea3'],
- 5: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00'],
- 6: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00', 'ffff33'],
- 7: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00', 'ffff33',
- 'a65628'],
- 8: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00', 'ffff33',
- 'a65628', 'f781bf'],
- 9: ['e41a1c', '377eb8', '4daf4a', '984ea3', 'ff7f00', 'ffff33',
- 'a65628', 'f781bf', '999999']
- },
- Set2: {
- type: 'qualitative',
- cbf: 3,
- 3: ['66c2a5', 'fc8d62', '8da0cb'],
- 4: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3'],
- 5: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3', 'a6d854'],
- 6: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3', 'a6d854', 'ffd92f'],
- 7: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3', 'a6d854', 'ffd92f',
- 'e5c494'],
- 8: ['66c2a5', 'fc8d62', '8da0cb', 'e78ac3', 'a6d854', 'ffd92f',
- 'e5c494', 'b3b3b3']
- },
- Set3: {
- type: 'qualitative',
- cbf: 0,
- 3: ['8dd3c7', 'ffffb3', 'bebada'],
- 4: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072'],
- 5: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3'],
- 6: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462'],
- 7: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462',
- 'b3de69'],
- 8: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462',
- 'b3de69', 'fccde5'],
- 9: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462',
- 'b3de69', 'fccde5', 'd9d9d9'],
- 10: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462',
- 'b3de69', 'fccde5', 'd9d9d9', 'bc80bd'],
- 11: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462',
- 'b3de69', 'fccde5', 'd9d9d9', 'bc80bd', 'ccebc5'],
- 12: ['8dd3c7', 'ffffb3', 'bebada', 'fb8072', '80b1d3', 'fdb462',
- 'b3de69', 'fccde5', 'd9d9d9', 'bc80bd', 'ccebc5', 'ffed6f']
- }
- };
-
- for (var name in schemes) {
- var scheme = schemes[name];
- scheme = palette.Scheme.fromPalettes(
- 'cb-' + name, [scheme.type, 'cb-' + scheme.type], scheme, 12, scheme.cbf);
- palette.register(scheme);
- }
-})();
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/underscore-min.js b/desuto-retrieval/Desuto-retrievalinterface/js/vendor/underscore-min.js
deleted file mode 100755
index 3533323..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/vendor/underscore-min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// Underscore.js 1.5.2
-// http://underscorejs.org
-// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-// Underscore may be freely distributed under the MIT license.
-(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?(this._wrapped=n,void 0):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.5.2";var A=j.each=j.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var E="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(E);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(E);return r},j.find=j.detect=function(n,t,r){var e;return O(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var O=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:O(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,function(n){return n[t]})},j.where=function(n,t,r){return j.isEmpty(t)?r?void 0:[]:j[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},j.findWhere=function(n,t){return j.where(n,t,!0)},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);if(!t&&j.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>e.computed&&(e={value:n,computed:a})}),e.value},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);if(!t&&j.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a<e.computed&&(e={value:n,computed:a})}),e.value},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return arguments.length<2||r?n[j.random(n.length-1)]:j.shuffle(n).slice(0,Math.max(0,t))};var k=function(n){return j.isFunction(n)?n:function(t){return t[n]}};j.sortBy=function(n,t,r){var e=k(t);return j.pluck(j.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={},i=null==r?j.identity:k(r);return A(t,function(r,a){var o=i.call(e,r,a,t);n(u,o,r)}),u}};j.groupBy=F(function(n,t,r){(j.has(n,t)?n[t]:n[t]=[]).push(r)}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=null==r?j.identity:k(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.indexOf(t,n)>=0})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:new Date,a=null,i=n.apply(e,u)};return function(){var l=new Date;o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u)):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o;return function(){i=this,u=arguments,a=new Date;var c=function(){var l=new Date-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u)))},l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u)),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=w||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var I={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"}};I.unescape=j.invert(I.escape);var T={escape:new RegExp("["+j.keys(I.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(I.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(T[n],function(t){return I[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);
\ No newline at end of file
diff --git a/desuto-retrieval/Desuto-retrievalinterface/js/viewer/viewer.js b/desuto-retrieval/Desuto-retrievalinterface/js/viewer/viewer.js
deleted file mode 100755
index c99f45b..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/js/viewer/viewer.js
+++ /dev/null
@@ -1,161 +0,0 @@
-// IIP settings
-var iipDeepZoomBaseURL = config.iipRootURL + "?DeepZoom=";
-var iipFeatureImageExtension = ".tif";
-var iipBaseDir = config.iipBaseDir;
-var iipUploadedDir = iipBaseDir + "uploaded/";
-var iipImageDir = iipBaseDir + "converted/";
-var iipOverlaysDir = iipBaseDir + "overlays/";
-var iipSuffix = ".dzi";
-var iipPatchSize = 400;
-var refMag = 40;
-
-// Annotator Settings
-var annotationToolURL = config.webviewerRootURL;
-
-// Slide info URLs
-var slideMagURL = config.slidePropertiesRootURL + 'slide_properties/magnification/';
-
-var imageURL = getParameterByName("id");
-var dataset = getParameterByName("dataset");
-
-$(function () {
-
- /* Define OpenSeadragon options */
- var options = {
- id: "openseadragon",
- prefixUrl: "js/vendor/openseadragon-bin-2.2.1/images/",
- showNavigator: true,
- zoomInButton: "zoom-in",
- zoomOutButton: "zoom-out",
- homeButton: "home",
- fullPageButton: "fullscreen",
- minZoomImageRatio: 1,
- maxZoomPixelRatio: 1
- };
-
- // Set right image
- setImage(imageURL, options);
-
- // Activate viewer
- viewer = new OpenSeadragon(options);
-
- // Create SVG overlay
- overlay = viewer.svgOverlay();
-
- // When viewer is opened
- viewer.addHandler('open', function() {
-
- // Get slide magnification (objective-power)
- $.get(slideMagURL + iipUploadedDir + encodeURIComponent(dataset + '/' + simplifyURL(imageURL)), function (data) {
- if(data) {
-
- var magnification;
- if(data !== "None"){
- magnification = parseInt(data);
- refMag = magnification;
- }else{
- magnification = refMag;
- }
-
-
- var xInPixels = parseInt(getCoordinate("x", imageURL));
- var yInPixels = parseInt(getCoordinate("y", imageURL));
- var sizeInPixels = parseInt(getPatchSize(imageURL));
-
- $("#gotoviewer").attr("href", annotationToolURL
- + "?image=" + dataset + "/" + simplifyURL(imageURL)
- + "&x=" + xInPixels
- + "&y=" + yInPixels
- + "&size=" + sizeInPixels);
-
- var upperLeft = new OpenSeadragon.Point(xInPixels, yInPixels);
-
- var viewerPoint = viewer.viewport.imageToViewportCoordinates(upperLeft);
- var viewerSize = viewer.viewport.imageToViewportCoordinates(new OpenSeadragon.Point(sizeInPixels, sizeInPixels));
-
- var d3Rect = d3.select(overlay.node()).append("rect")
- .style('fill', '#9cf')
- .style('opacity', .5)
- .attr("vector-effect", "non-scaling-stroke")
- .attr("stroke-width", '5')
- .attr("stroke", '#0af')
- .attr("x", viewerPoint.y)
- .attr("width", viewerSize.y)
- .attr("y", viewerPoint.x)
- .attr("height", viewerSize.x);
-
- viewer.viewport.fitBoundsWithConstraints(new OpenSeadragon.Rect(viewerPoint.y, viewerPoint.x, viewerSize.x, viewerSize.y));
- }
- });
- });
-
-});
-
-/* Set Image for viewer */
-function setImage(image, options) {
- image = simplifyURL(image);
- options.tileSources = iipDeepZoomBaseURL + iipImageDir + dataset + '/' + image + iipSuffix;
-}
-
-// Get URL parameter
-function getParameterByName(name) {
- name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
- var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
- results = regex.exec(location.search);
- return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
-}
-
-function getPatchSize(url) {
- var patchSize = 224;
-
- // Figure out magnification adjustment
- re = new RegExp("/([0-9]+)X/", "g");
- matches = re.exec(url);
-
- var patchMagnification = parseInt(matches[1]);
-
- if(patchMagnification < refMag)
- patchSize = patchSize * (refMag / patchMagnification);
-
- return patchSize;
-}
-
-function getCoordinate(dimension, url){
-
- // Figure out coord
- var re = new RegExp("_" + dimension + "([0-9]+)", "g");
- var matches = re.exec(url);
-
- var coord = matches[1];
-
- // Figure out magnification adjustment
- re = new RegExp("/([0-9]+)X/", "g");
- matches = re.exec(url);
-
- var patchMagnification = parseInt(matches[1]);
-
- if(patchMagnification < refMag)
- coord = coord * (refMag / patchMagnification);
-
- return coord;
-}
-
-
-function simplifyURL(url, extension){
- var url = url.substr(url.lastIndexOf('/') + 1);
- url = url.replace(/_[a-z]+_x[0-9]+_y[0-9]+/g, '');
- if(url.indexOf('&') !== -1)
- url = url.substr(0, url.indexOf('&'));
- if(url.indexOf('_idx') !== -1)
- url = url.substr(0, url.indexOf('_idx'));
- /*if(!extension)
- if(url.indexOf("." !== -1))
- url = url.substr(0, url.indexOf("."));*/
- url = decodeURIComponent(url);
-
- return url;
-}
-
-function count(s1, letter) {
- return ( s1.match( RegExp(letter,'g') ) || [] ).length;
-}
diff --git a/desuto-retrieval/Desuto-retrievalinterface/robots.txt b/desuto-retrieval/Desuto-retrievalinterface/robots.txt
deleted file mode 100755
index ee2cc21..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/robots.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# robotstxt.org/
-
-User-agent: *
diff --git a/desuto-retrieval/Desuto-retrievalinterface/viewer.html b/desuto-retrieval/Desuto-retrievalinterface/viewer.html
deleted file mode 100755
index 0b89375..0000000
--- a/desuto-retrieval/Desuto-retrievalinterface/viewer.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!--
-Page to view a patch within a WSI
--->
-<!DOCTYPE html>
-<html>
-<head>
- <base href="/retrieval/">
- <title></title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link rel="stylesheet" href="css/viewer-sober.css"/>
-
- <link href='//fonts.googleapis.com/css?family=Rancho' rel='stylesheet' type='text/css'>
- <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet">
-
- <!-- Configuration -->
- <script src="js/config/config.js"></script>
-
- <!-- d3 -->
- <script src="//cdnjs.cloudflare.com/ajax/libs/d3/4.8.0/d3.js"></script>
-
- <!-- jQuery (local) -->
- <script src="js/vendor/jquery-1.10.2.min.js"></script>
- <script src="js/vendor/underscore-min.js"></script>
- <script src="js/viewer/viewer.js"></script>
-
- <!-- OpenSeaDragon -->
- <script src="js/vendor/openseadragon-bin-2.2.1/openseadragon.js"></script>
- <script src="js/vendor/openseadragon-bin-2.2.1/openseadragon-svg-overlay.js"></script>
-
- <script>
- //Actions to do when the page is loading
- $(function () {
-
- var imageID = getParameterByName("id");
- imageID = imageID.substring(imageID.lastIndexOf("/") + 1, imageID.lastIndexOf("."));
-
- //get article url (if available)
- $.getJSON(config.getArticleForImageURL, {
- "imageID": imageID,
- "indexID": config.articlesLuceneIndexID,
- }, function (data) {
- if (Object.keys(data).length !== 0 && data.hasOwnProperty("url") && data.url !== "") {
- var linkElement = $("<a><i class='fa fa-file-text-o'></i> &nbsp;Go To Article</a>").attr("href", data.url).attr("target", "_blank");
- $("#gotoArticle").append(linkElement);
- }
- });
-
- });
- </script>
-</head>
-<body id="bodyEdition">
-<!-- Div with the content -->
-<div id="content">
- <div id="tools">
- <a id="zoom-in" href="#zoom-in" title="Zoom In" class="toolbar-button">
- <i class="fa fa-search-plus"></i>
- </a>
- <a id="zoom-out" href="#zoom-out" title="Zoom Out" class="toolbar-button">
- <i class="fa fa-search-minus"></i>
- </a>
- <a id="home" href="#home" title="Home" class="toolbar-button">
- <i class="fa fa-home"></i>
- </a>
- <a id="fullscreen" href="#fullscreen" title="Fullscreen" class="toolbar-button">
- <i class="fa fa-arrows-alt"></i>
- </a>
- <a id="gotoviewer" target="_blank" href="javascript:void(0)" title="Go To Annotation Tool" class="text-link">
- <i class="fa fa-pencil-square-o"></i>
- </a>
- </div>
-
- <!-- Div with the OpenSeaDragon viewer-->
- <div id="openseadragon">
-
- </div>
-</div>
-</body>
-</html>
diff --git a/desuto-retrieval/Dockerfile b/desuto-retrieval/Dockerfile
deleted file mode 100755
index 1f39402..0000000
--- a/desuto-retrieval/Dockerfile
+++ /dev/null
@@ -1,33 +0,0 @@
-FROM httpd:alpine
-ARG PARADISE_ROOT_URL
-ARG IIP_ROOT_URL
-ARG VIEWER_ROOT_URL
-ARG SLIDEPROPS_ROOT_URL
-
-# Inform about used servers
-RUN echo "Used servers : ${PARADISE_ROOT_URL},${IIP_ROOT_URL},${VIEWER_ROOT_URL},${SLIDEPROPS_ROOT_URL}"
-
-# Copy custom config
-COPY httpd.conf /usr/local/apache2/conf/httpd.conf
-
-# Copy source code
-COPY ./Desuto-retrievalinterface /usr/local/apache2/htdocs/
-WORKDIR /usr/local/apache2/htdocs/
-
-# Replace references to servers with the current hostname
-RUN sed -i "s_paradiseRootURL\s*:\s*'.*'_paradiseRootURL: '${PARADISE_ROOT_URL}'_g" js/config/config.js
-RUN sed -i "s_iipRootURL\s*:\s*'.*'_iipRootURL: '${IIP_ROOT_URL}'_g" js/config/config.js
-RUN sed -i "s_webviewerRootURL\s*:\s*'.*'_webviewerRootURL: '${VIEWER_ROOT_URL}'_g" js/config/config.js
-RUN sed -i "s_slidePropertiesRootURL\s*:\s*'.*'_slidePropertiesRootURL: '${SLIDEPROPS_ROOT_URL}'_g" js/config/config.js
-
-# Replace paths with dockerized paths
-RUN sed -i "s_iipBaseDir\s*:\s*'.*'_iipBaseDir: '/slideviewerdata/'_g" js/config/config.js
-
-# Check URLs
-RUN cat js/config/config.js
-
-# Chown the whole folder to www-data
-RUN chown -R www-data:www-data /usr/local/apache2
-
-# Expose the app's port
-EXPOSE 80
diff --git a/desuto-retrieval/httpd.conf b/desuto-retrieval/httpd.conf
deleted file mode 100755
index 4b8bbaf..0000000
--- a/desuto-retrieval/httpd.conf
+++ /dev/null
@@ -1,546 +0,0 @@
-#
-# This is the main Apache HTTP server configuration file. It contains the
-# configuration directives that give the server its instructions.
-# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
-# In particular, see
-# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
-# for a discussion of each configuration directive.
-#
-# Do NOT simply read the instructions in here without understanding
-# what they do. They're here only as hints or reminders. If you are unsure
-# consult the online docs. You have been warned.
-#
-# Configuration and logfile names: If the filenames you specify for many
-# of the server's control files begin with "/" (or "drive:/" for Win32), the
-# server will use that explicit path. If the filenames do *not* begin
-# with "/", the value of ServerRoot is prepended -- so "logs/access_log"
-# with ServerRoot set to "/usr/local/apache2" will be interpreted by the
-# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log"
-# will be interpreted as '/logs/access_log'.
-
-#
-# ServerRoot: The top of the directory tree under which the server's
-# configuration, error, and log files are kept.
-#
-# Do not add a slash at the end of the directory path. If you point
-# ServerRoot at a non-local disk, be sure to specify a local disk on the
-# Mutex directive, if file-based mutexes are used. If you wish to share the
-# same ServerRoot for multiple httpd daemons, you will need to change at
-# least PidFile.
-#
-ServerRoot "/usr/local/apache2"
-
-#
-# Mutex: Allows you to set the mutex mechanism and mutex file directory
-# for individual mutexes, or change the global defaults
-#
-# Uncomment and change the directory if mutexes are file-based and the default
-# mutex file directory is not on a local disk or is not appropriate for some
-# other reason.
-#
-# Mutex default:logs
-
-#
-# Listen: Allows you to bind Apache to specific IP addresses and/or
-# ports, instead of the default. See also the <VirtualHost>
-# directive.
-#
-# Change this to Listen on specific IP addresses as shown below to
-# prevent Apache from glomming onto all bound IP addresses.
-#
-#Listen 12.34.56.78:80
-Listen 80
-
-#
-# Dynamic Shared Object (DSO) Support
-#
-# To be able to use the functionality of a module which was built as a DSO you
-# have to place corresponding `LoadModule' lines at this location so the
-# directives contained in it are actually available _before_ they are used.
-# Statically compiled modules (those listed by `httpd -l') do not need
-# to be loaded here.
-#
-# Example:
-# LoadModule foo_module modules/mod_foo.so
-#
-LoadModule mpm_event_module modules/mod_mpm_event.so
-#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
-#LoadModule mpm_worker_module modules/mod_mpm_worker.so
-LoadModule authn_file_module modules/mod_authn_file.so
-#LoadModule authn_dbm_module modules/mod_authn_dbm.so
-#LoadModule authn_anon_module modules/mod_authn_anon.so
-#LoadModule authn_dbd_module modules/mod_authn_dbd.so
-#LoadModule authn_socache_module modules/mod_authn_socache.so
-LoadModule authn_core_module modules/mod_authn_core.so
-LoadModule authz_host_module modules/mod_authz_host.so
-LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
-LoadModule authz_user_module modules/mod_authz_user.so
-#LoadModule authz_dbm_module modules/mod_authz_dbm.so
-#LoadModule authz_owner_module modules/mod_authz_owner.so
-#LoadModule authz_dbd_module modules/mod_authz_dbd.so
-LoadModule authz_core_module modules/mod_authz_core.so
-#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
-#LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so
-LoadModule access_compat_module modules/mod_access_compat.so
-LoadModule auth_basic_module modules/mod_auth_basic.so
-#LoadModule auth_form_module modules/mod_auth_form.so
-#LoadModule auth_digest_module modules/mod_auth_digest.so
-#LoadModule allowmethods_module modules/mod_allowmethods.so
-#LoadModule isapi_module modules/mod_isapi.so
-#LoadModule file_cache_module modules/mod_file_cache.so
-#LoadModule cache_module modules/mod_cache.so
-#LoadModule cache_disk_module modules/mod_cache_disk.so
-#LoadModule cache_socache_module modules/mod_cache_socache.so
-#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
-#LoadModule socache_dbm_module modules/mod_socache_dbm.so
-#LoadModule socache_memcache_module modules/mod_socache_memcache.so
-#LoadModule watchdog_module modules/mod_watchdog.so
-#LoadModule macro_module modules/mod_macro.so
-#LoadModule dbd_module modules/mod_dbd.so
-#LoadModule bucketeer_module modules/mod_bucketeer.so
-#LoadModule dumpio_module modules/mod_dumpio.so
-#LoadModule echo_module modules/mod_echo.so
-#LoadModule example_hooks_module modules/mod_example_hooks.so
-#LoadModule case_filter_module modules/mod_case_filter.so
-#LoadModule case_filter_in_module modules/mod_case_filter_in.so
-#LoadModule example_ipc_module modules/mod_example_ipc.so
-#LoadModule buffer_module modules/mod_buffer.so
-#LoadModule data_module modules/mod_data.so
-#LoadModule ratelimit_module modules/mod_ratelimit.so
-LoadModule reqtimeout_module modules/mod_reqtimeout.so
-#LoadModule ext_filter_module modules/mod_ext_filter.so
-#LoadModule request_module modules/mod_request.so
-#LoadModule include_module modules/mod_include.so
-LoadModule filter_module modules/mod_filter.so
-#LoadModule reflector_module modules/mod_reflector.so
-#LoadModule substitute_module modules/mod_substitute.so
-#LoadModule sed_module modules/mod_sed.so
-#LoadModule charset_lite_module modules/mod_charset_lite.so
-#LoadModule deflate_module modules/mod_deflate.so
-#LoadModule xml2enc_module modules/mod_xml2enc.so
-#LoadModule proxy_html_module modules/mod_proxy_html.so
-LoadModule mime_module modules/mod_mime.so
-#LoadModule ldap_module modules/mod_ldap.so
-LoadModule log_config_module modules/mod_log_config.so
-#LoadModule log_debug_module modules/mod_log_debug.so
-#LoadModule log_forensic_module modules/mod_log_forensic.so
-#LoadModule logio_module modules/mod_logio.so
-#LoadModule lua_module modules/mod_lua.so
-LoadModule env_module modules/mod_env.so
-#LoadModule mime_magic_module modules/mod_mime_magic.so
-#LoadModule cern_meta_module modules/mod_cern_meta.so
-#LoadModule expires_module modules/mod_expires.so
-LoadModule headers_module modules/mod_headers.so
-#LoadModule ident_module modules/mod_ident.so
-#LoadModule usertrack_module modules/mod_usertrack.so
-#LoadModule unique_id_module modules/mod_unique_id.so
-LoadModule setenvif_module modules/mod_setenvif.so
-LoadModule version_module modules/mod_version.so
-#LoadModule remoteip_module modules/mod_remoteip.so
-#LoadModule proxy_module modules/mod_proxy.so
-#LoadModule proxy_connect_module modules/mod_proxy_connect.so
-#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
-#LoadModule proxy_http_module modules/mod_proxy_http.so
-#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
-#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
-#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
-#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
-#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
-#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
-#LoadModule proxy_express_module modules/mod_proxy_express.so
-#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
-#LoadModule session_module modules/mod_session.so
-#LoadModule session_cookie_module modules/mod_session_cookie.so
-#LoadModule session_crypto_module modules/mod_session_crypto.so
-#LoadModule session_dbd_module modules/mod_session_dbd.so
-#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
-#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
-#LoadModule ssl_module modules/mod_ssl.so
-#LoadModule optional_hook_export_module modules/mod_optional_hook_export.so
-#LoadModule optional_hook_import_module modules/mod_optional_hook_import.so
-#LoadModule optional_fn_import_module modules/mod_optional_fn_import.so
-#LoadModule optional_fn_export_module modules/mod_optional_fn_export.so
-#LoadModule dialup_module modules/mod_dialup.so
-#LoadModule http2_module modules/mod_http2.so
-#LoadModule proxy_http2_module modules/mod_proxy_http2.so
-#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
-#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
-#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
-#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
-LoadModule unixd_module modules/mod_unixd.so
-#LoadModule heartbeat_module modules/mod_heartbeat.so
-#LoadModule heartmonitor_module modules/mod_heartmonitor.so
-#LoadModule dav_module modules/mod_dav.so
-LoadModule status_module modules/mod_status.so
-LoadModule autoindex_module modules/mod_autoindex.so
-#LoadModule asis_module modules/mod_asis.so
-#LoadModule info_module modules/mod_info.so
-#LoadModule suexec_module modules/mod_suexec.so
-<IfModule !mpm_prefork_module>
- #LoadModule cgid_module modules/mod_cgid.so
-</IfModule>
-<IfModule mpm_prefork_module>
- #LoadModule cgi_module modules/mod_cgi.so
-</IfModule>
-#LoadModule dav_fs_module modules/mod_dav_fs.so
-#LoadModule dav_lock_module modules/mod_dav_lock.so
-#LoadModule vhost_alias_module modules/mod_vhost_alias.so
-#LoadModule negotiation_module modules/mod_negotiation.so
-LoadModule dir_module modules/mod_dir.so
-#LoadModule imagemap_module modules/mod_imagemap.so
-#LoadModule actions_module modules/mod_actions.so
-#LoadModule speling_module modules/mod_speling.so
-#LoadModule userdir_module modules/mod_userdir.so
-LoadModule alias_module modules/mod_alias.so
-LoadModule rewrite_module modules/mod_rewrite.so
-
-<IfModule unixd_module>
-#
-# If you wish httpd to run as a different user or group, you must run
-# httpd as root initially and it will switch.
-#
-# User/Group: The name (or #number) of the user/group to run httpd as.
-# It is usually good practice to create a dedicated user and group for
-# running httpd, as with most system services.
-#
-User www-data
-Group www-data
-
-</IfModule>
-
-# 'Main' server configuration
-#
-# The directives in this section set up the values used by the 'main'
-# server, which responds to any requests that aren't handled by a
-# <VirtualHost> definition. These values also provide defaults for
-# any <VirtualHost> containers you may define later in the file.
-#
-# All of these directives may appear inside <VirtualHost> containers,
-# in which case these default settings will be overridden for the
-# virtual host being defined.
-#
-
-#
-# ServerAdmin: Your address, where problems with the server should be
-# e-mailed. This address appears on some server-generated pages, such
-# as error documents. e.g. admin@your-domain.com
-#
-ServerAdmin you@example.com
-
-#
-# ServerName gives the name and port that the server uses to identify itself.
-# This can often be determined automatically, but we recommend you specify
-# it explicitly to prevent problems during startup.
-#
-# If your host doesn't have a registered DNS name, enter its IP address here.
-#
-#ServerName www.example.com:80
-
-#
-# Deny access to the entirety of your server's filesystem. You must
-# explicitly permit access to web content directories in other
-# <Directory> blocks below.
-#
-<Directory />
- AllowOverride none
- Require all denied
-</Directory>
-
-#
-# Note that from this point forward you must specifically allow
-# particular features to be enabled - so if something's not working as
-# you might expect, make sure that you have specifically enabled it
-# below.
-#
-
-#
-# DocumentRoot: The directory out of which you will serve your
-# documents. By default, all requests are taken from this directory, but
-# symbolic links and aliases may be used to point to other locations.
-#
-DocumentRoot "/usr/local/apache2/htdocs"
-<Directory "/usr/local/apache2/htdocs">
- #
- # Possible values for the Options directive are "None", "All",
- # or any combination of:
- # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
- #
- # Note that "MultiViews" must be named *explicitly* --- "Options All"
- # doesn't give it to you.
- #
- # The Options directive is both complicated and important. Please see
- # http://httpd.apache.org/docs/2.4/mod/core.html#options
- # for more information.
- #
- Options Indexes FollowSymLinks
-
- #
- # AllowOverride controls what directives may be placed in .htaccess files.
- # It can be "All", "None", or any combination of the keywords:
- # AllowOverride FileInfo AuthConfig Limit
- #
- AllowOverride All
-
- #
- # Controls who can get stuff from this server.
- #
- Require all granted
-</Directory>
-
-#
-# DirectoryIndex: sets the file that Apache will serve if a directory
-# is requested.
-#
-<IfModule dir_module>
- DirectoryIndex index.html
-</IfModule>
-
-#
-# The following lines prevent .htaccess and .htpasswd files from being
-# viewed by Web clients.
-#
-<Files ".ht*">
- Require all denied
-</Files>
-
-#
-# ErrorLog: The location of the error log file.
-# If you do not specify an ErrorLog directive within a <VirtualHost>
-# container, error messages relating to that virtual host will be
-# logged here. If you *do* define an error logfile for a <VirtualHost>
-# container, that host's errors will be logged there and not here.
-#
-ErrorLog /proc/self/fd/2
-
-#
-# LogLevel: Control the number of messages logged to the error_log.
-# Possible values include: debug, info, notice, warn, error, crit,
-# alert, emerg.
-#
-LogLevel warn
-
-<IfModule log_config_module>
- #
- # The following directives define some format nicknames for use with
- # a CustomLog directive (see below).
- #
- LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
- LogFormat "%h %l %u %t \"%r\" %>s %b" common
-
- <IfModule logio_module>
- # You need to enable mod_logio.c to use %I and %O
- LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
- </IfModule>
-
- #
- # The location and format of the access logfile (Common Logfile Format).
- # If you do not define any access logfiles within a <VirtualHost>
- # container, they will be logged here. Contrariwise, if you *do*
- # define per-<VirtualHost> access logfiles, transactions will be
- # logged therein and *not* in this file.
- #
- CustomLog /proc/self/fd/1 common
-
- #
- # If you prefer a logfile with access, agent, and referer information
- # (Combined Logfile Format) you can use the following directive.
- #
- #CustomLog "logs/access_log" combined
-</IfModule>
-
-<IfModule alias_module>
- #
- # Redirect: Allows you to tell clients about documents that used to
- # exist in your server's namespace, but do not anymore. The client
- # will make a new request for the document at its new location.
- # Example:
- # Redirect permanent /foo http://www.example.com/bar
-
- #
- # Alias: Maps web paths into filesystem paths and is used to
- # access content that does not live under the DocumentRoot.
- # Example:
- # Alias /webpath /full/filesystem/path
- #
- # If you include a trailing / on /webpath then the server will
- # require it to be present in the URL. You will also likely
- # need to provide a <Directory> section to allow access to
- # the filesystem path.
-
- #
- # ScriptAlias: This controls which directories contain server scripts.
- # ScriptAliases are essentially the same as Aliases, except that
- # documents in the target directory are treated as applications and
- # run by the server when requested rather than as documents sent to the
- # client. The same rules about trailing "/" apply to ScriptAlias
- # directives as to Alias.
- #
- ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
-
-</IfModule>
-
-<IfModule cgid_module>
- #
- # ScriptSock: On threaded servers, designate the path to the UNIX
- # socket used to communicate with the CGI daemon of mod_cgid.
- #
- #Scriptsock cgisock
-</IfModule>
-
-#
-# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased
-# CGI directory exists, if you have that configured.
-#
-<Directory "/usr/local/apache2/cgi-bin">
- AllowOverride None
- Options None
- Require all granted
-</Directory>
-
-<IfModule headers_module>
- #
- # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied
- # backend servers which have lingering "httpoxy" defects.
- # 'Proxy' request header is undefined by the IETF, not listed by IANA
- #
- RequestHeader unset Proxy early
-</IfModule>
-
-<IfModule mime_module>
- #
- # TypesConfig points to the file containing the list of mappings from
- # filename extension to MIME-type.
- #
- TypesConfig conf/mime.types
-
- #
- # AddType allows you to add to or override the MIME configuration
- # file specified in TypesConfig for specific file types.
- #
- #AddType application/x-gzip .tgz
- #
- # AddEncoding allows you to have certain browsers uncompress
- # information on the fly. Note: Not all browsers support this.
- #
- #AddEncoding x-compress .Z
- #AddEncoding x-gzip .gz .tgz
- #
- # If the AddEncoding directives above are commented-out, then you
- # probably should define those extensions to indicate media types:
- #
- AddType application/x-compress .Z
- AddType application/x-gzip .gz .tgz
-
- #
- # AddHandler allows you to map certain file extensions to "handlers":
- # actions unrelated to filetype. These can be either built into the server
- # or added with the Action directive (see below)
- #
- # To use CGI scripts outside of ScriptAliased directories:
- # (You will also need to add "ExecCGI" to the "Options" directive.)
- #
- #AddHandler cgi-script .cgi
-
- # For type maps (negotiated resources):
- #AddHandler type-map var
-
- #
- # Filters allow you to process content before it is sent to the client.
- #
- # To parse .shtml files for server-side includes (SSI):
- # (You will also need to add "Includes" to the "Options" directive.)
- #
- #AddType text/html .shtml
- #AddOutputFilter INCLUDES .shtml
-</IfModule>
-
-#
-# The mod_mime_magic module allows the server to use various hints from the
-# contents of the file itself to determine its type. The MIMEMagicFile
-# directive tells the module where the hint definitions are located.
-#
-#MIMEMagicFile conf/magic
-
-#
-# Customizable error responses come in three flavors:
-# 1) plain text 2) local redirects 3) external redirects
-#
-# Some examples:
-#ErrorDocument 500 "The server made a boo boo."
-#ErrorDocument 404 /missing.html
-#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
-#ErrorDocument 402 http://www.example.com/subscription_info.html
-#
-
-#
-# MaxRanges: Maximum number of Ranges in a request before
-# returning the entire resource, or one of the special
-# values 'default', 'none' or 'unlimited'.
-# Default setting is to accept 200 Ranges.
-#MaxRanges unlimited
-
-#
-# EnableMMAP and EnableSendfile: On systems that support it,
-# memory-mapping or the sendfile syscall may be used to deliver
-# files. This usually improves server performance, but must
-# be turned off when serving from networked-mounted
-# filesystems or if support for these functions is otherwise
-# broken on your system.
-# Defaults: EnableMMAP On, EnableSendfile Off
-#
-#EnableMMAP off
-#EnableSendfile on
-
-# Supplemental configuration
-#
-# The configuration files in the conf/extra/ directory can be
-# included to add extra features or to modify the default configuration of
-# the server, or you may simply copy their contents here and change as
-# necessary.
-
-# Server-pool management (MPM specific)
-#Include conf/extra/httpd-mpm.conf
-
-# Multi-language error messages
-#Include conf/extra/httpd-multilang-errordoc.conf
-
-# Fancy directory listings
-#Include conf/extra/httpd-autoindex.conf
-
-# Language settings
-#Include conf/extra/httpd-languages.conf
-
-# User home directories
-#Include conf/extra/httpd-userdir.conf
-
-# Real-time info on requests and configuration
-#Include conf/extra/httpd-info.conf
-
-# Virtual hosts
-#Include conf/extra/httpd-vhosts.conf
-
-# Local access to the Apache HTTP Server Manual
-#Include conf/extra/httpd-manual.conf
-
-# Distributed authoring and versioning (WebDAV)
-#Include conf/extra/httpd-dav.conf
-
-# Various default settings
-#Include conf/extra/httpd-default.conf
-
-# Configure mod_proxy_html to understand HTML4/XHTML1
-<IfModule proxy_html_module>
-Include conf/extra/proxy-html.conf
-</IfModule>
-
-# Secure (SSL/TLS) connections
-#Include conf/extra/httpd-ssl.conf
-#
-# Note: The following must must be present to support
-# starting without SSL on platforms with no /dev/random equivalent
-# but a statically compiled-in mod_ssl.
-#
-<IfModule ssl_module>
-SSLRandomSeed startup builtin
-SSLRandomSeed connect builtin
-</IfModule>
diff --git a/paradise-gf/Dockerfile b/paradise-gf/Dockerfile
deleted file mode 100755
index 6c15a04..0000000
--- a/paradise-gf/Dockerfile
+++ /dev/null
@@ -1,51 +0,0 @@
-FROM ubuntu:18.04
-MAINTAINER Roger Schaer <roger.schaer@hevs.ch>
-
-# Set environment variables
-
-ENV GLASSFISH_PKG=latest-glassfish.zip \
- GLASSFISH_URL=http://download.oracle.com/glassfish/5.0.1/nightly/latest-glassfish.zip \
- MYSQL_CONNECTORJ_VER=mysql-connector-java-5.1.45
-
-ENV MYSQL_CONNECTORJ_URL=https://dev.mysql.com/get/Downloads/Connector-J/$MYSQL_CONNECTORJ_VER.tar.gz \
- GLASSFISH_HOME=/glassfish5 \
- MD5=c87ad9b589db15973f5c80773171b5b4 \
- PATH=$PATH:/glassfish5/bin \
- JAVA_HOME=/usr/lib/jvm/default-java/
-
-# Install packages, download and extract GlassFish
-# Setup password file
-# Enable DAS
-
-RUN echo "--- Download and install Glassfish" && \
- apt update && \
- apt install -y curl unzip openjdk-8-jdk && \
- curl -O $GLASSFISH_URL && \
- unzip -o $GLASSFISH_PKG && \
- rm -f $GLASSFISH_PKG
-
-# Install MySQL Connector
-
-RUN echo "--- Download and install MySQL Connector/J" && \
- apt install -y wget && \
- wget --no-check-certificate $MYSQL_CONNECTORJ_URL && \
- tar -zxf $MYSQL_CONNECTORJ_VER.tar.gz && \
- cp $MYSQL_CONNECTORJ_VER/$MYSQL_CONNECTORJ_VER-bin.jar $GLASSFISH_HOME/glassfish/domains/domain1/lib && \
- rm $MYSQL_CONNECTORJ_VER.tar.gz && \
- rm -r $MYSQL_CONNECTORJ_VER
-
-# Copy necessary files
-COPY core.custom.properties /etc/paradise/
-COPY wskhresmoi.custom.properties /etc/paradise/
-COPY wscaption.custom.properties /etc/paradise/
-COPY wsfulltext.custom.properties /etc/paradise/
-COPY ParaDISEWSKhresmoi.war /
-COPY KhresmoiWSFullText.war /
-COPY docker-entrypoint.sh /entrypoint.sh
-ENTRYPOINT ["/entrypoint.sh"]
-
-# Ports being exposed
-EXPOSE 4848 8080 8181 9009
-
-# Start asadmin console and the domain
-CMD ["asadmin", "start-domain", "-v", "--debug=false"]
diff --git a/paradise-gf/KhresmoiWSFullText.war b/paradise-gf/KhresmoiWSFullText.war
deleted file mode 100755
index 95a0259..0000000
Binary files a/paradise-gf/KhresmoiWSFullText.war and /dev/null differ
diff --git a/paradise-gf/ParaDISEWSKhresmoi.war b/paradise-gf/ParaDISEWSKhresmoi.war
deleted file mode 100644
index 2657973..0000000
Binary files a/paradise-gf/ParaDISEWSKhresmoi.war and /dev/null differ
diff --git a/paradise-gf/core.custom.properties b/paradise-gf/core.custom.properties
deleted file mode 100755
index 5137505..0000000
--- a/paradise-gf/core.custom.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-# Base path
-PARADISE_BASE_PATH = /data/paradise/
-
-# MySQL
-SQL_HOST = mysql
-SQL_DATABASE = paradise
-SQL_USER = paradise
-SQL_PASSWORD = $PWDforParaD1SE!
diff --git a/paradise-gf/docker-entrypoint.sh b/paradise-gf/docker-entrypoint.sh
deleted file mode 100755
index c842be8..0000000
--- a/paradise-gf/docker-entrypoint.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-#
-# Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
-if [[ -z $ADMIN_PASSWORD ]]; then
- ADMIN_PASSWORD=$(date| md5sum | fold -w 8 | head -n 1)
- echo "##########GENERATED ADMIN PASSWORD: $ADMIN_PASSWORD ##########"
-fi
-echo "AS_ADMIN_PASSWORD=" > /tmp/glassfishpwd
-echo "AS_ADMIN_NEWPASSWORD=${ADMIN_PASSWORD}" >> /tmp/glassfishpwd
-echo "Changing admin password with the password file"
-asadmin --user=admin --passwordfile=/tmp/glassfishpwd change-admin-password --domain_name domain1
-echo "Starting the domain to deploy the applications"
-asadmin --user=admin --passwordfile=/tmp/glassfishpwd start-domain
-echo "Output the correct password to the password file"
-echo "AS_ADMIN_PASSWORD=${ADMIN_PASSWORD}" > /tmp/glassfishpwd
-echo "Deploying ParaDISE"
-asadmin --user admin --passwordfile /tmp/glassfishpwd deploy --force /ParaDISEWSKhresmoi.war
-echo "Deploying Khresmoi Fulltext Search"
-asadmin --user admin --passwordfile /tmp/glassfishpwd deploy --force /KhresmoiWSFullText.war
-echo "Removing JVM option about max memory (if set)"
-asadmin --user admin --passwordfile /tmp/glassfishpwd delete-jvm-options "-Xmx512m"
-echo "Setting new JVM memory quota"
-asadmin --user admin --passwordfile /tmp/glassfishpwd create-jvm-options "-Xmx10g"
-echo "Enabling secure admin console (HTTPS)"
-asadmin --user=admin --passwordfile /tmp/glassfishpwd enable-secure-admin
-echo "Stopping the domain for letting Docker take control of the process"
-asadmin --user=admin stop-domain
-echo "Deleting password"
-rm /tmp/glassfishpwd
-echo "Starting domain again"
-exec "$@"
diff --git a/paradise-gf/wscaption.custom.properties b/paradise-gf/wscaption.custom.properties
deleted file mode 100755
index e46b54f..0000000
--- a/paradise-gf/wscaption.custom.properties
+++ /dev/null
@@ -1 +0,0 @@
-lucene-index-base-dir-path = /data/paradise/lucene/
diff --git a/paradise-gf/wsfulltext.custom.properties b/paradise-gf/wsfulltext.custom.properties
deleted file mode 100755
index 048d960..0000000
--- a/paradise-gf/wsfulltext.custom.properties
+++ /dev/null
@@ -1 +0,0 @@
-lucene-index-base-dir-path = /data/paradise/lucene
diff --git a/paradise-gf/wskhresmoi.custom.properties b/paradise-gf/wskhresmoi.custom.properties
deleted file mode 100755
index e03b91a..0000000
--- a/paradise-gf/wskhresmoi.custom.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-GROUND_TRUTH_CSV = /data/paradise/gt/train2013GT.csv
-UPLOAD_DIR = /uploads/
-UPLOAD_URL = /uploads/
-IMAGES_BASE_URL = http://images
-UPLOADS_BASE_URL = http://uploads
-IIPSRV_HOST=iipsrv

Event Timeline